xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 4d24c305ffe6afbc18f58fbbb7e92f28aaef1365)
1be25371aSYikeZhoupackage xiangshan.backend.decode
2be25371aSYikeZhou
3be25371aSYikeZhouimport chisel3._
4be25371aSYikeZhouimport chisel3.util._
5be25371aSYikeZhou
6*4d24c305SYikeZhouimport freechips.rocketchip.config.Parameters
7*4d24c305SYikeZhouimport freechips.rocketchip.rocket.{RVCDecoder, ExpandedInstruction}
8*4d24c305SYikeZhouimport freechips.rocketchip.rocket.{CSR,Causes}
9*4d24c305SYikeZhouimport freechips.rocketchip.util.{uintToBitPat,UIntIsOneOf}
10*4d24c305SYikeZhou
11be25371aSYikeZhouimport xiangshan._
12be25371aSYikeZhouimport utils._
13be25371aSYikeZhouimport xiangshan.backend._
14*4d24c305SYikeZhouimport xiangshan.backend.decode.AltInstructions._
15*4d24c305SYikeZhouimport xiangshan.backend.fu.fpu.FPUOpType
16*4d24c305SYikeZhouimport freechips.rocketchip.tile.RocketTile
17be25371aSYikeZhou
18be25371aSYikeZhou/**
19be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
20be25371aSYikeZhou */
21be25371aSYikeZhouabstract trait DecodeConstants {
22*4d24c305SYikeZhou  // TODO move these constants to somewhere else?
23*4d24c305SYikeZhou  def X = BitPat("b?")
24*4d24c305SYikeZhou  def N = BitPat("b0")
25*4d24c305SYikeZhou  def Y = BitPat("b1")
26*4d24c305SYikeZhou
27be25371aSYikeZhou  def decodeDefault: List[BitPat] =
28*4d24c305SYikeZhou    //   src1Type     src2Type     src3Type     fuType      fuOpType       rfWen
29*4d24c305SYikeZhou    //   |            |            |            |           |              |  fpWen
30*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  isXSTrap
31*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  |  noSpecExec
32*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  |  |  blockBackward
33*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  |  |  |  flushPipe
34*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  |  |  |  |  isRVF
35*4d24c305SYikeZhou    //   |            |            |            |           |              |  |  |  |  |  |  |
36*4d24c305SYikeZhou    List(SrcType.reg, SrcType.reg, SrcType.reg, FuType.alu, ALUOpType.sll, N, N, N, N, N, N, N)
37*4d24c305SYikeZhou
38be25371aSYikeZhou    val table: Array[(BitPat, List[BitPat])]
39be25371aSYikeZhou}
40be25371aSYikeZhou
41*4d24c305SYikeZhoutrait RISCVConstants
42*4d24c305SYikeZhou{
43*4d24c305SYikeZhou  // abstract out instruction decode magic numbers
44*4d24c305SYikeZhou  val RD_MSB  = 11
45*4d24c305SYikeZhou  val RD_LSB  = 7
46*4d24c305SYikeZhou  val RS1_MSB = 19
47*4d24c305SYikeZhou  val RS1_LSB = 15
48*4d24c305SYikeZhou  val RS2_MSB = 24
49*4d24c305SYikeZhou  val RS2_LSB = 20
50*4d24c305SYikeZhou  val RS3_MSB = 31
51*4d24c305SYikeZhou  val RS3_LSB = 27
52*4d24c305SYikeZhou
53*4d24c305SYikeZhou  // TODO move constants above to somewhere better and remove useless constants below
54*4d24c305SYikeZhou
55*4d24c305SYikeZhou  val CSR_ADDR_MSB = 31
56*4d24c305SYikeZhou  val CSR_ADDR_LSB = 20
57*4d24c305SYikeZhou  val CSR_ADDR_SZ = 12
58*4d24c305SYikeZhou
59*4d24c305SYikeZhou  // location of the fifth bit in the shamt (for checking for illegal ops for SRAIW,etc.)
60*4d24c305SYikeZhou  val SHAMT_5_BIT = 25
61*4d24c305SYikeZhou  val LONGEST_IMM_SZ = 20
62*4d24c305SYikeZhou  val X0 = 0.U
63*4d24c305SYikeZhou  val RA = 1.U // return address register
64*4d24c305SYikeZhou
65*4d24c305SYikeZhou  // memory consistency model
66*4d24c305SYikeZhou  // The C/C++ atomics MCM requires that two loads to the same address maintain program order.
67*4d24c305SYikeZhou  // The Cortex A9 does NOT enforce load/load ordering (which leads to buggy behavior).
68*4d24c305SYikeZhou  val MCM_ORDER_DEPENDENT_LOADS = true
69*4d24c305SYikeZhou
70*4d24c305SYikeZhou  val jal_opc = (0x6f).U
71*4d24c305SYikeZhou  val jalr_opc = (0x67).U
72*4d24c305SYikeZhou
73*4d24c305SYikeZhou  def GetUop(inst: UInt): UInt = inst(6,0)
74*4d24c305SYikeZhou  def GetRd (inst: UInt): UInt = inst(RD_MSB,RD_LSB)
75*4d24c305SYikeZhou  def GetRs1(inst: UInt): UInt = inst(RS1_MSB,RS1_LSB)
76*4d24c305SYikeZhou
77*4d24c305SYikeZhou  // Note: Accepts only EXPANDED rvc instructions
78*4d24c305SYikeZhou  def ComputeBranchTarget(pc: UInt, inst: UInt, xlen: Int)(implicit p: Parameters): UInt = {
79*4d24c305SYikeZhou    val b_imm32 = Cat(Fill(20,inst(31)), inst(7), inst(30,25), inst(11,8), 0.U(1.W))
80*4d24c305SYikeZhou    ((pc.asSInt + b_imm32.asSInt).asSInt & (-2).S).asUInt
81*4d24c305SYikeZhou  }
82*4d24c305SYikeZhou
83*4d24c305SYikeZhou  // Note: Accepts only EXPANDED rvc instructions
84*4d24c305SYikeZhou  def ComputeJALTarget(pc: UInt, inst: UInt, xlen: Int)(implicit p: Parameters): UInt = {
85*4d24c305SYikeZhou    val j_imm32 = Cat(Fill(12,inst(31)), inst(19,12), inst(20), inst(30,25), inst(24,21), 0.U(1.W))
86*4d24c305SYikeZhou    ((pc.asSInt + j_imm32.asSInt).asSInt & (-2).S).asUInt
87*4d24c305SYikeZhou  }
88*4d24c305SYikeZhou}
89*4d24c305SYikeZhou
90be25371aSYikeZhou/**
91be25371aSYikeZhou * Decoded control signals
92*4d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
93be25371aSYikeZhou */
94*4d24c305SYikeZhou// FIXME Check sig from isXSTrap to isRVF
95be25371aSYikeZhou/**
96be25371aSYikeZhou * Decode constants for RV64
97be25371aSYikeZhou */
98be25371aSYikeZhouobject X64Decode extends DecodeConstants {
99*4d24c305SYikeZhou  val table: Array[(BitPat, List[BitPat])] = Array(
100*4d24c305SYikeZhou    LD      -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.ld, Y, N, N, N, N, N, N),
101*4d24c305SYikeZhou    LWU     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lwu, Y, N, N, N, N, N, N),
102*4d24c305SYikeZhou    SD      -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sd, N, N, N, N, N, N, N),
103*4d24c305SYikeZhou
104*4d24c305SYikeZhou    SLLI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sll, Y, N, N, N, N, N, N),
105*4d24c305SYikeZhou    SRLI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.srl, Y, N, N, N, N, N, N),
106*4d24c305SYikeZhou    SRAI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sra, Y, N, N, N, N, N, N),
107*4d24c305SYikeZhou
108*4d24c305SYikeZhou    ADDIW   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.addw, Y, N, N, N, N, N, N),
109*4d24c305SYikeZhou    SLLIW   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sllw, Y, N, N, N, N, N, N),
110*4d24c305SYikeZhou    SRAIW   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sraw, Y, N, N, N, N, N, N),
111*4d24c305SYikeZhou    SRLIW   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.srlw, Y, N, N, N, N, N, N),
112*4d24c305SYikeZhou
113*4d24c305SYikeZhou    ADDW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.addw, Y, N, N, N, N, N, N),
114*4d24c305SYikeZhou    SUBW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.subw, Y, N, N, N, N, N, N),
115*4d24c305SYikeZhou    SLLW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sllw, Y, N, N, N, N, N, N),
116*4d24c305SYikeZhou    SRAW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sraw, Y, N, N, N, N, N, N),
117*4d24c305SYikeZhou    SRLW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.srlw, Y, N, N, N, N, N, N)
118*4d24c305SYikeZhou  )
119be25371aSYikeZhou}
120be25371aSYikeZhou
121be25371aSYikeZhou/**
122be25371aSYikeZhou * Overall Decode constants
123be25371aSYikeZhou */
124be25371aSYikeZhouobject XDecode extends DecodeConstants {
125*4d24c305SYikeZhou  val table: Array[(BitPat, List[BitPat])] = Array(
126*4d24c305SYikeZhou    LW      -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lw, Y, N, N, N, N, N, N),
127*4d24c305SYikeZhou    LH      -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lh, Y, N, N, N, N, N, N),
128*4d24c305SYikeZhou    LHU     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lhu, Y, N, N, N, N, N, N),
129*4d24c305SYikeZhou    LB      -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lb, Y, N, N, N, N, N, N),
130*4d24c305SYikeZhou    LBU     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lbu, Y, N, N, N, N, N, N),
131*4d24c305SYikeZhou
132*4d24c305SYikeZhou    SW      -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sw, N, N, N, N, N, N, N),
133*4d24c305SYikeZhou    SH      -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sh, N, N, N, N, N, N, N),
134*4d24c305SYikeZhou    SB      -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sb, N, N, N, N, N, N, N),
135*4d24c305SYikeZhou
136*4d24c305SYikeZhou    LUI     -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N),
137*4d24c305SYikeZhou
138*4d24c305SYikeZhou    ADDI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N),
139*4d24c305SYikeZhou    ANDI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.and, Y, N, N, N, N, N, N),
140*4d24c305SYikeZhou    ORI     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.or, Y, N, N, N, N, N, N),
141*4d24c305SYikeZhou    XORI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.xor, Y, N, N, N, N, N, N),
142*4d24c305SYikeZhou    SLTI    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.slt, Y, N, N, N, N, N, N),
143*4d24c305SYikeZhou    SLTIU   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sltu, Y, N, N, N, N, N, N),
144*4d24c305SYikeZhou
145*4d24c305SYikeZhou    SLL     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sll, Y, N, N, N, N, N, N),
146*4d24c305SYikeZhou    ADD     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N),
147*4d24c305SYikeZhou    SUB     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sub, Y, N, N, N, N, N, N),
148*4d24c305SYikeZhou    SLT     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.slt, Y, N, N, N, N, N, N),
149*4d24c305SYikeZhou    SLTU    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sltu, Y, N, N, N, N, N, N),
150*4d24c305SYikeZhou    AND     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.and, Y, N, N, N, N, N, N),
151*4d24c305SYikeZhou    OR      -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.or, Y, N, N, N, N, N, N),
152*4d24c305SYikeZhou    XOR     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.xor, Y, N, N, N, N, N, N),
153*4d24c305SYikeZhou    SRA     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sra, Y, N, N, N, N, N, N),
154*4d24c305SYikeZhou    SRL     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.srl, Y, N, N, N, N, N, N),
155*4d24c305SYikeZhou
156*4d24c305SYikeZhou    MUL     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mul, Y, N, N, N, N, N, N),
157*4d24c305SYikeZhou    MULH    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulh, Y, N, N, N, N, N, N),
158*4d24c305SYikeZhou    MULHU   -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulhu, Y, N, N, N, N, N, N),
159*4d24c305SYikeZhou    MULHSU  -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulhsu, Y, N, N, N, N, N, N),
160*4d24c305SYikeZhou    MULW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulw, Y, N, N, N, N, N, N),
161*4d24c305SYikeZhou
162*4d24c305SYikeZhou    DIV     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.div, Y, N, N, N, N, N, N),
163*4d24c305SYikeZhou    DIVU    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divu, Y, N, N, N, N, N, N),
164*4d24c305SYikeZhou    REM     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.rem, Y, N, N, N, N, N, N),
165*4d24c305SYikeZhou    REMU    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remu, Y, N, N, N, N, N, N),
166*4d24c305SYikeZhou    DIVW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divw, Y, N, N, N, N, N, N),
167*4d24c305SYikeZhou    DIVUW   -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divuw, Y, N, N, N, N, N, N),
168*4d24c305SYikeZhou    REMW    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remw, Y, N, N, N, N, N, N),
169*4d24c305SYikeZhou    REMUW   -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remuw, Y, N, N, N, N, N, N),
170*4d24c305SYikeZhou
171*4d24c305SYikeZhou    AUIPC   -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N),
172*4d24c305SYikeZhou    JAL     -> List(SrcType.pc , SrcType.imm, SrcType.DC, FuType.jmp, JumpOpType.jal, Y, N, N, N, N, N, N),
173*4d24c305SYikeZhou    JALR    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.jmp, JumpOpType.jalr, Y, N, N, N, N, N, N),
174*4d24c305SYikeZhou    BEQ     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.beq, N, N, N, N, N, N, N),
175*4d24c305SYikeZhou    BNE     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bne, N, N, N, N, N, N, N),
176*4d24c305SYikeZhou    BGE     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bge, N, N, N, N, N, N, N),
177*4d24c305SYikeZhou    BGEU    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bgeu, N, N, N, N, N, N, N),
178*4d24c305SYikeZhou    BLT     -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.blt, N, N, N, N, N, N, N),
179*4d24c305SYikeZhou    BLTU    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bltu, N, N, N, N, N, N, N),
180*4d24c305SYikeZhou
181*4d24c305SYikeZhou    // I-type, the immediate12 holds the CSR register.
182*4d24c305SYikeZhou    CSRRW   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.wrt, N, N, N, N, N, N, N),
183*4d24c305SYikeZhou    CSRRS   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.set, N, N, N, N, N, N, N),
184*4d24c305SYikeZhou    CSRRC   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.clr, N, N, N, N, N, N, N),
185*4d24c305SYikeZhou
186*4d24c305SYikeZhou    CSRRWI  -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.wrti, N, N, N, N, N, N, N),
187*4d24c305SYikeZhou    CSRRSI  -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.seti, N, N, N, N, N, N, N),
188*4d24c305SYikeZhou    CSRRCI  -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.clri, N, N, N, N, N, N, N),
189*4d24c305SYikeZhou
190*4d24c305SYikeZhou    SFENCE_VMA->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.sfence, N, N, N, N, N, N, N),
191*4d24c305SYikeZhou    SCALL   -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N), // same as ECALL
192*4d24c305SYikeZhou    SRET    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N),
193*4d24c305SYikeZhou    MRET    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N),
194*4d24c305SYikeZhou
195*4d24c305SYikeZhou    WFI     -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sll, N, N, N, N, N, N, N),
196*4d24c305SYikeZhou
197*4d24c305SYikeZhou    FENCE_I -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.fencei, N, N, N, N, N, N, N),
198*4d24c305SYikeZhou    FENCE   -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.fence, N, N, N, N, N, N, N),
199*4d24c305SYikeZhou
200*4d24c305SYikeZhou    // A-type
201*4d24c305SYikeZhou    AMOADD_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoadd_w, N, N, N, N, N, N, N),
202*4d24c305SYikeZhou    AMOXOR_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoxor_w, N, N, N, N, N, N, N),
203*4d24c305SYikeZhou    AMOSWAP_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoswap_w, N, N, N, N, N, N, N),
204*4d24c305SYikeZhou    AMOAND_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoand_w, N, N, N, N, N, N, N),
205*4d24c305SYikeZhou    AMOOR_W -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoor_w, N, N, N, N, N, N, N),
206*4d24c305SYikeZhou    AMOMIN_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomin_w, N, N, N, N, N, N, N),
207*4d24c305SYikeZhou    AMOMINU_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amominu_w, N, N, N, N, N, N, N),
208*4d24c305SYikeZhou    AMOMAX_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomax_w, N, N, N, N, N, N, N),
209*4d24c305SYikeZhou    AMOMAXU_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomaxu_w, N, N, N, N, N, N, N),
210*4d24c305SYikeZhou
211*4d24c305SYikeZhou    AMOADD_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoadd_d, N, N, N, N, N, N, N),
212*4d24c305SYikeZhou    AMOXOR_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoxor_d, N, N, N, N, N, N, N),
213*4d24c305SYikeZhou    AMOSWAP_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoswap_d, N, N, N, N, N, N, N),
214*4d24c305SYikeZhou    AMOAND_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoand_d, N, N, N, N, N, N, N),
215*4d24c305SYikeZhou    AMOOR_D -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoor_d, N, N, N, N, N, N, N),
216*4d24c305SYikeZhou    AMOMIN_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomin_d, N, N, N, N, N, N, N),
217*4d24c305SYikeZhou    AMOMINU_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amominu_d, N, N, N, N, N, N, N),
218*4d24c305SYikeZhou    AMOMAX_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomax_d, N, N, N, N, N, N, N),
219*4d24c305SYikeZhou    AMOMAXU_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomaxu_d, N, N, N, N, N, N, N),
220*4d24c305SYikeZhou
221*4d24c305SYikeZhou    LR_W    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.mou, LSUOpType.lr_w, N, N, N, N, N, N, N),
222*4d24c305SYikeZhou    LR_D    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.mou, LSUOpType.lr_d, N, N, N, N, N, N, N),
223*4d24c305SYikeZhou    SC_W    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.sc_w, N, N, N, N, N, N, N),
224*4d24c305SYikeZhou    SC_D    -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.sc_d, N, N, N, N, N, N, N)
225*4d24c305SYikeZhou  )
226be25371aSYikeZhou}
227be25371aSYikeZhou
228be25371aSYikeZhou/**
229be25371aSYikeZhou * FP Decode constants
230be25371aSYikeZhou */
231be25371aSYikeZhouobject FDecode extends DecodeConstants{
232*4d24c305SYikeZhou  val table: Array[(BitPat, List[BitPat])] = Array(
233*4d24c305SYikeZhou    // FIXME check Src3type below
234*4d24c305SYikeZhou  FLW     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.flw, N, N, N, N, N, N, N),
235*4d24c305SYikeZhou  FLD     -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.ld, N, N, N, N, N, N, N),
236*4d24c305SYikeZhou  FSW     -> List(SrcType.reg, SrcType.fp, SrcType.DC, FuType.stu, LSUOpType.sw, N, N, N, N, N, N, N), // sort of a lie; broken into two micro-ops
237*4d24c305SYikeZhou  FSD     -> List(SrcType.reg, SrcType.fp, SrcType.DC, FuType.stu, LSUOpType.sd, N, N, N, N, N, N, N),
238*4d24c305SYikeZhou
239*4d24c305SYikeZhou  FCLASS_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fclass, N, N, N, N, N, N, N),
240*4d24c305SYikeZhou  FCLASS_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fclass, N, N, N, N, N, N, N),
241*4d24c305SYikeZhou
242*4d24c305SYikeZhou  FMV_D_X -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.fmv_i2f, N, N, N, N, N, N, N),
243*4d24c305SYikeZhou  FMV_X_D -> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmv_f2i, N, N, N, N, N, N, N),
244*4d24c305SYikeZhou  FMV_X_W -> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmv_f2i, N, N, N, N, N, N, N),
245*4d24c305SYikeZhou  FMV_W_X -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.fmv_i2f, N, N, N, N, N, N, N),
246*4d24c305SYikeZhou
247*4d24c305SYikeZhou  FSGNJ_S -> List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnj, N, N, N, N, N, N, N),
248*4d24c305SYikeZhou  FSGNJ_D -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnj, N, N, N, N, N, N, N),
249*4d24c305SYikeZhou  FSGNJX_S-> List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjx, N, N, N, N, N, N, N),
250*4d24c305SYikeZhou  FSGNJX_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjx, N, N, N, N, N, N, N),
251*4d24c305SYikeZhou  FSGNJN_S-> List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjn, N, N, N, N, N, N, N),
252*4d24c305SYikeZhou  FSGNJN_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjn, N, N, N, N, N, N, N),
253*4d24c305SYikeZhou
254*4d24c305SYikeZhou  // FP to FP
255*4d24c305SYikeZhou  FCVT_S_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.d2s, N, N, N, N, N, N, N),
256*4d24c305SYikeZhou  FCVT_D_S-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.s2d, N, N, N, N, N, N, N),
257*4d24c305SYikeZhou
258*4d24c305SYikeZhou  // Int to FP
259*4d24c305SYikeZhou  FCVT_S_W-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.w2f, N, N, N, N, N, N, N),
260*4d24c305SYikeZhou  FCVT_S_WU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.wu2f, N, N, N, N, N, N, N),
261*4d24c305SYikeZhou  FCVT_S_L-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.l2f, N, N, N, N, N, N, N),
262*4d24c305SYikeZhou  FCVT_S_LU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.lu2f, N, N, N, N, N, N, N),
263*4d24c305SYikeZhou
264*4d24c305SYikeZhou  FCVT_D_W-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.w2f, N, N, N, N, N, N, N),
265*4d24c305SYikeZhou  FCVT_D_WU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.wu2f, N, N, N, N, N, N, N),
266*4d24c305SYikeZhou  FCVT_D_L-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.l2f, N, N, N, N, N, N, N),
267*4d24c305SYikeZhou  FCVT_D_LU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.lu2f, N, N, N, N, N, N, N),
268*4d24c305SYikeZhou
269*4d24c305SYikeZhou  // FP to Int
270*4d24c305SYikeZhou  FCVT_W_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2w, N, N, N, N, N, N, N),
271*4d24c305SYikeZhou  FCVT_WU_S->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2wu, N, N, N, N, N, N, N),
272*4d24c305SYikeZhou  FCVT_L_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2l, N, N, N, N, N, N, N),
273*4d24c305SYikeZhou  FCVT_LU_S->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2lu, N, N, N, N, N, N, N),
274*4d24c305SYikeZhou
275*4d24c305SYikeZhou  FCVT_W_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2w, N, N, N, N, N, N, N),
276*4d24c305SYikeZhou  FCVT_WU_D->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2wu, N, N, N, N, N, N, N),
277*4d24c305SYikeZhou  FCVT_L_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2l, N, N, N, N, N, N, N),
278*4d24c305SYikeZhou  FCVT_LU_D->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2lu, N, N, N, N, N, N, N),
279*4d24c305SYikeZhou
280*4d24c305SYikeZhou  // "fp_single" is used for wb_data formatting (and debugging)
281*4d24c305SYikeZhou  FEQ_S    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.feq, N, N, N, N, N, N, N),
282*4d24c305SYikeZhou  FLT_S    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.flt, N, N, N, N, N, N, N),
283*4d24c305SYikeZhou  FLE_S    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fle, N, N, N, N, N, N, N),
284*4d24c305SYikeZhou
285*4d24c305SYikeZhou  FEQ_D    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.feq, N, N, N, N, N, N, N),
286*4d24c305SYikeZhou  FLT_D    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.flt, N, N, N, N, N, N, N),
287*4d24c305SYikeZhou  FLE_D    ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fle, N, N, N, N, N, N, N),
288*4d24c305SYikeZhou
289*4d24c305SYikeZhou  FMIN_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmin, N, N, N, N, N, N, N),
290*4d24c305SYikeZhou  FMAX_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmax, N, N, N, N, N, N, N),
291*4d24c305SYikeZhou  FMIN_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fmin, N, N, N, N, N, N, N),
292*4d24c305SYikeZhou  FMAX_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fmax, N, N, N, N, N, N, N),
293*4d24c305SYikeZhou
294*4d24c305SYikeZhou  FADD_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fadd, N, N, N, N, N, N, N),
295*4d24c305SYikeZhou  FSUB_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fsub, N, N, N, N, N, N, N),
296*4d24c305SYikeZhou  FMUL_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmul, N, N, N, N, N, N, N),
297*4d24c305SYikeZhou  FADD_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fadd, N, N, N, N, N, N, N),
298*4d24c305SYikeZhou  FSUB_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fsub, N, N, N, N, N, N, N),
299*4d24c305SYikeZhou  FMUL_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmul, N, N, N, N, N, N, N),
300*4d24c305SYikeZhou
301*4d24c305SYikeZhou  FMADD_S  ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmadd, N, N, N, N, N, N, N),
302*4d24c305SYikeZhou  FMSUB_S  ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmsub, N, N, N, N, N, N, N),
303*4d24c305SYikeZhou  FNMADD_S ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fnmadd, N, N, N, N, N, N, N),
304*4d24c305SYikeZhou  FNMSUB_S ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fnmsub, N, N, N, N, N, N, N),
305*4d24c305SYikeZhou  FMADD_D  ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmadd, N, N, N, N, N, N, N),
306*4d24c305SYikeZhou  FMSUB_D  ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmsub, N, N, N, N, N, N, N),
307*4d24c305SYikeZhou  FNMADD_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fnmadd, N, N, N, N, N, N, N),
308*4d24c305SYikeZhou  FNMSUB_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fnmsub, N, N, N, N, N, N, N)
309*4d24c305SYikeZhou
310*4d24c305SYikeZhou  )
311be25371aSYikeZhou}
312be25371aSYikeZhou
313be25371aSYikeZhou/**
314be25371aSYikeZhou * FP Divide SquareRoot Constants
315be25371aSYikeZhou */
316be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
317*4d24c305SYikeZhou  val table: Array[(BitPat, List[BitPat])] = Array(
318*4d24c305SYikeZhou  FDIV_S    ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fdiv, N, N, N, N, N, N, N),
319*4d24c305SYikeZhou  FDIV_D    ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fdiv, N, N, N, N, N, N, N),
320*4d24c305SYikeZhou  FSQRT_S   ->List(SrcType.fp,  SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsqrt, N, N, N, N, N, N, N),
321*4d24c305SYikeZhou  FSQRT_D   ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsqrt, N, N, N, N, N, N, N)
322*4d24c305SYikeZhou
323*4d24c305SYikeZhou  )
324be25371aSYikeZhou}
325be25371aSYikeZhou
326*4d24c305SYikeZhou/**
327*4d24c305SYikeZhou * XiangShan Trap Decode constants
328*4d24c305SYikeZhou */
329*4d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
330*4d24c305SYikeZhou  // calculate as ADDI => addi zero, a0, 0
331*4d24c305SYikeZhou  // replace rs '?????' with '01010'(a0) in decode stage
332*4d24c305SYikeZhou  def lsrc1 = "b01010".U // $a0
333*4d24c305SYikeZhou  val table: Array[(BitPat, List[BitPat])] = Array(
334*4d24c305SYikeZhou    TRAP    -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, N, N, N, N, N, N, N)
335*4d24c305SYikeZhou  )
336*4d24c305SYikeZhou}
337be25371aSYikeZhou
338*4d24c305SYikeZhouclass RVCExpander extends XSModule {
339*4d24c305SYikeZhou  val io = IO(new Bundle {
340*4d24c305SYikeZhou    val in = Input(UInt(32.W))
341*4d24c305SYikeZhou    val out = Output(new ExpandedInstruction)
342*4d24c305SYikeZhou    val rvc = Output(Bool())
343*4d24c305SYikeZhou  })
344be25371aSYikeZhou
345*4d24c305SYikeZhou  if (HasCExtension) {
346*4d24c305SYikeZhou    io.rvc := io.in(1,0) =/= 3.U
347*4d24c305SYikeZhou    io.out := new RVCDecoder(io.in, XLEN).decode
348*4d24c305SYikeZhou  } else {
349*4d24c305SYikeZhou    io.rvc := false.B
350*4d24c305SYikeZhou    io.out := new RVCDecoder(io.in, XLEN).passthrough
351*4d24c305SYikeZhou  }
352*4d24c305SYikeZhou}
353be25371aSYikeZhou
354be25371aSYikeZhou/**
355be25371aSYikeZhou * IO bundle for the Decode unit
356be25371aSYikeZhou */
357be25371aSYikeZhouclass DecodeUnitIO extends XSBundle {
358be25371aSYikeZhou  val enq = new Bundle { val ctrl_flow = Input(new CtrlFlow) }
359be25371aSYikeZhou  val deq = new Bundle { val cf_ctrl = Output(new CfCtrl) }
360be25371aSYikeZhou}
361be25371aSYikeZhou
362be25371aSYikeZhou/**
363be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
364be25371aSYikeZhou */
365*4d24c305SYikeZhouclass DecodeUnit extends XSModule with RISCVConstants {
366be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
367be25371aSYikeZhou
368*4d24c305SYikeZhou  val ctrl_flow = Wire(new CtrlFlow) // input with RVC Expanded
369*4d24c305SYikeZhou  val cf_ctrl = Wire(new CfCtrl)
370*4d24c305SYikeZhou
371*4d24c305SYikeZhou  // FIXME add expander
372*4d24c305SYikeZhou  val exp = Module(new RVCExpander()) // FIXME Is empty really worked here?
373*4d24c305SYikeZhou  exp.io.in := io.enq.ctrl_flow.instr
374be25371aSYikeZhou  ctrl_flow := io.enq.ctrl_flow
375*4d24c305SYikeZhou  when (exp.io.rvc) {
376*4d24c305SYikeZhou    ctrl_flow.instr := exp.io.out.bits
377*4d24c305SYikeZhou  }
378be25371aSYikeZhou
379*4d24c305SYikeZhou  // save rvc decode info
380*4d24c305SYikeZhou  val rvc_info = Wire(new ExpandedInstruction())
381*4d24c305SYikeZhou  val is_rvc = Wire(Bool())
382*4d24c305SYikeZhou  rvc_info := exp.io.out
383*4d24c305SYikeZhou  is_rvc := exp.io.rvc
384be25371aSYikeZhou
385*4d24c305SYikeZhou  var decode_table = XDecode.table ++ FDecode.table ++ FDivSqrtDecode.table ++ X64Decode.table ++ XSTrapDecode.table
386be25371aSYikeZhou
387*4d24c305SYikeZhou  // output
388*4d24c305SYikeZhou  cf_ctrl.cf := ctrl_flow
389*4d24c305SYikeZhou  cf_ctrl.brTag := DontCare
390*4d24c305SYikeZhou  val cs = Wire(new CtrlSignals()).decode(ctrl_flow.instr, decode_table)
391be25371aSYikeZhou
392*4d24c305SYikeZhou  when (is_rvc) {
393*4d24c305SYikeZhou    cs.lsrc1 := rvc_info.rs1
394*4d24c305SYikeZhou    cs.lsrc2 := rvc_info.rs2
395*4d24c305SYikeZhou    cs.lsrc3 := rvc_info.rs3
396be25371aSYikeZhou
397*4d24c305SYikeZhou    cs.ldest := rvc_info.rd
398*4d24c305SYikeZhou
399*4d24c305SYikeZhou  } .otherwise {
400*4d24c305SYikeZhou    cs.lsrc1 := ctrl_flow.instr(RS1_MSB,RS1_LSB)
401*4d24c305SYikeZhou    cs.lsrc2 := ctrl_flow.instr(RS2_MSB,RS2_LSB)
402*4d24c305SYikeZhou    cs.lsrc3 := ctrl_flow.instr(RS3_MSB,RS3_LSB)
403*4d24c305SYikeZhou
404*4d24c305SYikeZhou    cs.ldest := ctrl_flow.instr(RD_MSB,RD_LSB)
405*4d24c305SYikeZhou  }
406*4d24c305SYikeZhou
407*4d24c305SYikeZhou  // TODO fill exp, intr Vec in CtrlFlow
408*4d24c305SYikeZhou  io.deq.cf_ctrl.cf.exceptionVec := io.enq.ctrl_flow.exceptionVec
409*4d24c305SYikeZhou  io.deq.cf_ctrl.cf.intrVec := io.enq.ctrl_flow.intrVec
410*4d24c305SYikeZhou
411*4d24c305SYikeZhou  // TODO fill imm
412*4d24c305SYikeZhou  cs.imm := DontCare
413*4d24c305SYikeZhou
414*4d24c305SYikeZhou  cf_ctrl.ctrl := cs
415*4d24c305SYikeZhou  io.deq.cf_ctrl := cf_ctrl
416be25371aSYikeZhou
417be25371aSYikeZhou  //-------------------------------------------------------------
418be25371aSYikeZhou  // Debug Info
419*4d24c305SYikeZhou  XSDebug("in:  instr=%x pc=%x excepVec=%b intrVec=%b crossPageIPFFix=%d\n",
420*4d24c305SYikeZhou    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
421*4d24c305SYikeZhou    io.enq.ctrl_flow.intrVec.asUInt, io.enq.ctrl_flow.crossPageIPFFix)
422*4d24c305SYikeZhou  XSDebug("out: src1Type=%b src2Type=%b src3Type=%b lsrc1=%d lsrc2=%d lsrc3=%d ldest=%d fuType=%b fuOpType=%b\n",
423*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.src1Type, io.deq.cf_ctrl.ctrl.src2Type, io.deq.cf_ctrl.ctrl.src3Type,
424*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.lsrc1, io.deq.cf_ctrl.ctrl.lsrc2, io.deq.cf_ctrl.ctrl.lsrc3,
425*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
426*4d24c305SYikeZhou  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d isRVF=%d imm=%x\n",
427*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
428*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
429*4d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.isRVF, io.deq.cf_ctrl.ctrl.imm)
430be25371aSYikeZhou}
431