xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision 675acc6894dd86f75adfa0d6a7c1182a0e48de99)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17e18c367fSLinJiaweipackage xiangshan.backend.fu
18e18c367fSLinJiawei
192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
20e18c367fSLinJiaweiimport chisel3._
21e18c367fSLinJiaweiimport chisel3.util._
2288825c5cSYinan Xuimport utils.{LookupTree, LookupTreeDefault, ParallelMux, SignExt, ZeroExt}
23e18c367fSLinJiaweiimport xiangshan._
24e18c367fSLinJiawei
252225d46eSJiawei Linclass AddModule(implicit p: Parameters) extends XSModule {
2631ea8750SLinJiawei  val io = IO(new Bundle() {
272bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
2828c18878Szfw    val srcw = Input(UInt((XLEN/2).W))
2928c18878Szfw    val add = Output(UInt(XLEN.W))
3028c18878Szfw    val addw = Output(UInt((XLEN/2).W))
3131ea8750SLinJiawei  })
3228c18878Szfw  io.add := io.src(0) + io.src(1)
3388825c5cSYinan Xu  // TODO: why this extra adder?
3428c18878Szfw  io.addw := io.srcw + io.src(1)(31,0)
3531ea8750SLinJiawei}
3631ea8750SLinJiawei
372225d46eSJiawei Linclass SubModule(implicit p: Parameters) extends XSModule {
3831ea8750SLinJiawei  val io = IO(new Bundle() {
392bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
40184a1958Szfw    val sub = Output(UInt((XLEN+1).W))
4131ea8750SLinJiawei  })
42184a1958Szfw  io.sub := (io.src(0) +& (~io.src(1)).asUInt()) + 1.U
4331ea8750SLinJiawei}
4431ea8750SLinJiawei
452225d46eSJiawei Linclass LeftShiftModule(implicit p: Parameters) extends XSModule {
4631ea8750SLinJiawei  val io = IO(new Bundle() {
4731ea8750SLinJiawei    val shamt = Input(UInt(6.W))
4828c18878Szfw    val revShamt = Input(UInt(6.W))
4931ea8750SLinJiawei    val sllSrc = Input(UInt(XLEN.W))
5031ea8750SLinJiawei    val sll = Output(UInt(XLEN.W))
5128c18878Szfw    val revSll = Output(UInt(XLEN.W))
5231ea8750SLinJiawei  })
53184a1958Szfw  io.sll := io.sllSrc << io.shamt
5428c18878Szfw  io.revSll := io.sllSrc << io.revShamt
55184a1958Szfw}
56184a1958Szfw
57184a1958Szfwclass LeftShiftWordModule(implicit p: Parameters) extends XSModule {
58184a1958Szfw  val io = IO(new Bundle() {
59184a1958Szfw    val shamt = Input(UInt(5.W))
6028c18878Szfw    val revShamt = Input(UInt(5.W))
61184a1958Szfw    val sllSrc = Input(UInt((XLEN/2).W))
62184a1958Szfw    val sllw = Output(UInt((XLEN/2).W))
6328c18878Szfw    val revSllw = Output(UInt((XLEN/2).W))
64184a1958Szfw  })
65184a1958Szfw  io.sllw := io.sllSrc << io.shamt
6628c18878Szfw  io.revSllw := io.sllSrc << io.revShamt
6731ea8750SLinJiawei}
6831ea8750SLinJiawei
692225d46eSJiawei Linclass RightShiftModule(implicit p: Parameters) extends XSModule {
7031ea8750SLinJiawei  val io = IO(new Bundle() {
7131ea8750SLinJiawei    val shamt = Input(UInt(6.W))
7228c18878Szfw    val revShamt = Input(UInt(6.W))
7331ea8750SLinJiawei    val srlSrc, sraSrc = Input(UInt(XLEN.W))
74184a1958Szfw    val srl, sra = Output(UInt(XLEN.W))
7528c18878Szfw    val revSrl = Output(UInt(XLEN.W))
7631ea8750SLinJiawei  })
77184a1958Szfw  io.srl  := io.srlSrc >> io.shamt
78184a1958Szfw  io.sra  := (io.sraSrc.asSInt() >> io.shamt).asUInt()
7928c18878Szfw  io.revSrl  := io.srlSrc >> io.revShamt
8031ea8750SLinJiawei}
8131ea8750SLinJiawei
82184a1958Szfwclass RightShiftWordModule(implicit p: Parameters) extends XSModule {
83ee8ff153Szfw  val io = IO(new Bundle() {
84184a1958Szfw    val shamt = Input(UInt(5.W))
8528c18878Szfw    val revShamt = Input(UInt(5.W))
86184a1958Szfw    val srlSrc, sraSrc = Input(UInt((XLEN/2).W))
87184a1958Szfw    val srlw, sraw = Output(UInt((XLEN/2).W))
8828c18878Szfw    val revSrlw = Output(UInt((XLEN/2).W))
89ee8ff153Szfw  })
90184a1958Szfw
91184a1958Szfw  io.srlw := io.srlSrc >> io.shamt
92184a1958Szfw  io.sraw := (io.sraSrc.asSInt() >> io.shamt).asUInt()
9328c18878Szfw  io.revSrlw := io.srlSrc >> io.revShamt
94ee8ff153Szfw}
95ee8ff153Szfw
96184a1958Szfw
972225d46eSJiawei Linclass MiscResultSelect(implicit p: Parameters) extends XSModule {
9831ea8750SLinJiawei  val io = IO(new Bundle() {
99*675acc68SYinan Xu    val func = Input(UInt(6.W))
100*675acc68SYinan Xu    val and, or, xor, orcb, orh48, sextb, packh, sexth, packw, revb, rev8, pack = Input(UInt(XLEN.W))
10188825c5cSYinan Xu    val src = Input(UInt(XLEN.W))
10231ea8750SLinJiawei    val miscRes = Output(UInt(XLEN.W))
10331ea8750SLinJiawei  })
104ee8ff153Szfw
105*675acc68SYinan Xu  val logicRes = VecInit(Seq(
106*675acc68SYinan Xu    io.and,
107*675acc68SYinan Xu    io.or,
108*675acc68SYinan Xu    io.xor,
109*675acc68SYinan Xu    io.orcb
110*675acc68SYinan Xu  ))(io.func(2, 1))
111*675acc68SYinan Xu  val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0))
112*675acc68SYinan Xu  val logicBase = Mux(io.func(3), miscRes, logicRes)
11388825c5cSYinan Xu
114*675acc68SYinan Xu  val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0))
115*675acc68SYinan Xu  val customRes = VecInit(Seq(
116*675acc68SYinan Xu    Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)),
117*675acc68SYinan Xu    Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)),
118*675acc68SYinan Xu    Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)),
119*675acc68SYinan Xu    Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0))
120*675acc68SYinan Xu  val logicAdv = Mux(io.func(3), customRes, revRes)
121ee8ff153Szfw
122*675acc68SYinan Xu  val mask = Cat(Fill(15, io.func(0)), 1.U(1.W))
123*675acc68SYinan Xu  val maskedLogicRes = mask & logicRes
124*675acc68SYinan Xu
125*675acc68SYinan Xu  io.miscRes := Mux(io.func(5), maskedLogicRes, Mux(io.func(4), logicAdv, logicBase))
12631ea8750SLinJiawei}
12731ea8750SLinJiawei
128ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule {
129ee8ff153Szfw  val io = IO(new Bundle() {
130*675acc68SYinan Xu    val func = Input(UInt(4.W))
13128c18878Szfw    val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W))
132ee8ff153Szfw    val shiftRes = Output(UInt(XLEN.W))
133ee8ff153Szfw  })
134ee8ff153Szfw
135*675acc68SYinan Xu  // val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
136*675acc68SYinan Xu  // val leftRes  = Mux(io.func(2), leftBit, io.sll)
137*675acc68SYinan Xu  // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl))
138*675acc68SYinan Xu  val resultSource = VecInit(Seq(
139*675acc68SYinan Xu    io.sll,
140*675acc68SYinan Xu    io.sll,
141*675acc68SYinan Xu    io.bclr,
142*675acc68SYinan Xu    io.bset,
143*675acc68SYinan Xu    io.binv,
144*675acc68SYinan Xu    io.srl,
145*675acc68SYinan Xu    io.bext,
146*675acc68SYinan Xu    io.sra
147*675acc68SYinan Xu  ))
148*675acc68SYinan Xu  val simple = resultSource(io.func(2, 0))
149ee8ff153Szfw
150*675acc68SYinan Xu  io.shiftRes := Mux(io.func(3), Mux(io.func(0), io.ror, io.rol), simple)
151184a1958Szfw}
152ee8ff153Szfw
153184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule {
154184a1958Szfw  val io = IO(new Bundle() {
155184a1958Szfw    val func = Input(UInt())
15628c18878Szfw    val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W))
157184a1958Szfw    val wordRes = Output(UInt(XLEN.W))
158184a1958Szfw  })
159ee8ff153Szfw
160*675acc68SYinan Xu  val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw)
161*675acc68SYinan Xu  val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw),
162*675acc68SYinan Xu                  Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw)))
163*675acc68SYinan Xu  val wordRes = Mux(io.func(3), shiftRes, addsubRes)
164184a1958Szfw  io.wordRes := SignExt(wordRes, XLEN)
165ee8ff153Szfw}
166ee8ff153Szfw
167ee8ff153Szfw
1682225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule {
16931ea8750SLinJiawei  val io = IO(new Bundle() {
170*675acc68SYinan Xu    val func = Input(UInt(3.W))
171184a1958Szfw    val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W))
17231ea8750SLinJiawei    val aluRes = Output(UInt(XLEN.W))
17331ea8750SLinJiawei  })
174ee8ff153Szfw
175*675acc68SYinan Xu  val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes),
176*675acc68SYinan Xu            Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes))
177184a1958Szfw  io.aluRes := res
17831ea8750SLinJiawei}
17931ea8750SLinJiawei
1802225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule {
181e2203130SLinJiawei  val io = IO(new Bundle() {
1822bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
183e2203130SLinJiawei    val func = Input(FuOpType())
184e2203130SLinJiawei    val pred_taken, isBranch = Input(Bool())
185e2203130SLinJiawei    val result = Output(UInt(XLEN.W))
186e2203130SLinJiawei    val taken, mispredict = Output(Bool())
187e2203130SLinJiawei  })
1882bd5334dSYinan Xu  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
189e18c367fSLinJiawei
190*675acc68SYinan Xu  val shamt = src2(5, 0)
191*675acc68SYinan Xu  val revShamt = ~src2(5,0) + 1.U
192*675acc68SYinan Xu
193*675acc68SYinan Xu  // slliuw, sll
194*675acc68SYinan Xu  val leftShiftModule = Module(new LeftShiftModule)
195*675acc68SYinan Xu  val sll = leftShiftModule.io.sll
196*675acc68SYinan Xu  val revSll = leftShiftModule.io.revSll
197*675acc68SYinan Xu  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
198*675acc68SYinan Xu  leftShiftModule.io.shamt := shamt
199*675acc68SYinan Xu  leftShiftModule.io.revShamt := revShamt
200*675acc68SYinan Xu
201*675acc68SYinan Xu  // bclr, bset, binv
202*675acc68SYinan Xu  val bitShift = 1.U << src2(5, 0)
203*675acc68SYinan Xu  val bclr = src1 & ~bitShift
204*675acc68SYinan Xu  val bset = src1 | bitShift
205*675acc68SYinan Xu  val binv = src1 ^ bitShift
206*675acc68SYinan Xu
207*675acc68SYinan Xu  // srl, sra, bext
208*675acc68SYinan Xu  val rightShiftModule = Module(new RightShiftModule)
209*675acc68SYinan Xu  val srl = rightShiftModule.io.srl
210*675acc68SYinan Xu  val revSrl = rightShiftModule.io.revSrl
211*675acc68SYinan Xu  val sra = rightShiftModule.io.sra
212*675acc68SYinan Xu  rightShiftModule.io.shamt := shamt
213*675acc68SYinan Xu  rightShiftModule.io.revShamt := revShamt
214*675acc68SYinan Xu  rightShiftModule.io.srlSrc := src1
215*675acc68SYinan Xu  rightShiftModule.io.sraSrc := src1
216*675acc68SYinan Xu  val bext = srl(0)
217*675acc68SYinan Xu
218*675acc68SYinan Xu  val rol = revSrl | sll
219*675acc68SYinan Xu  val ror = srl | revSll
220*675acc68SYinan Xu
221*675acc68SYinan Xu  // addw
222184a1958Szfw  val addModule = Module(new AddModule)
223*675acc68SYinan Xu  addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0))
224*675acc68SYinan Xu  val addwResultAll = VecInit(Seq(
225*675acc68SYinan Xu    ZeroExt(addModule.io.addw(0), XLEN),
226*675acc68SYinan Xu    ZeroExt(addModule.io.addw(7, 0), XLEN),
227*675acc68SYinan Xu    ZeroExt(addModule.io.addw(15, 0), XLEN),
228*675acc68SYinan Xu    SignExt(addModule.io.addw(15, 0), XLEN)
229*675acc68SYinan Xu  ))
230*675acc68SYinan Xu  val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw)
231*675acc68SYinan Xu
232*675acc68SYinan Xu  // subw
233*675acc68SYinan Xu  val subModule = Module(new SubModule)
234*675acc68SYinan Xu  val subw = subModule.io.sub
235*675acc68SYinan Xu
236*675acc68SYinan Xu  // sllw
237*675acc68SYinan Xu  val leftShiftWordModule = Module(new LeftShiftWordModule)
238*675acc68SYinan Xu  val sllw = leftShiftWordModule.io.sllw
239*675acc68SYinan Xu  val revSllw = leftShiftWordModule.io.revSllw
240*675acc68SYinan Xu  leftShiftWordModule.io.sllSrc := src1
241*675acc68SYinan Xu  leftShiftWordModule.io.shamt := shamt
242*675acc68SYinan Xu  leftShiftWordModule.io.revShamt := revShamt
243*675acc68SYinan Xu
244*675acc68SYinan Xu  val rightShiftWordModule = Module(new RightShiftWordModule)
245*675acc68SYinan Xu  val srlw = rightShiftWordModule.io.srlw
246*675acc68SYinan Xu  val revSrlw = rightShiftWordModule.io.revSrlw
247*675acc68SYinan Xu  val sraw = rightShiftWordModule.io.sraw
248*675acc68SYinan Xu  rightShiftWordModule.io.shamt := shamt
249*675acc68SYinan Xu  rightShiftWordModule.io.revShamt := revShamt
250*675acc68SYinan Xu  rightShiftWordModule.io.srlSrc := src1
251*675acc68SYinan Xu  rightShiftWordModule.io.sraSrc := src1
252*675acc68SYinan Xu
253*675acc68SYinan Xu  val rolw = revSrlw | sllw
254*675acc68SYinan Xu  val rorw = srlw | revSllw
255*675acc68SYinan Xu
256*675acc68SYinan Xu  // add
257a792bcf1SYinan Xu  val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
258a792bcf1SYinan Xu  val shaddSource = VecInit(Seq(
259a792bcf1SYinan Xu    Cat(wordMaskAddSource(62, 0), 0.U(1.W)),
260a792bcf1SYinan Xu    Cat(wordMaskAddSource(61, 0), 0.U(2.W)),
261a792bcf1SYinan Xu    Cat(wordMaskAddSource(60, 0), 0.U(3.W)),
262a792bcf1SYinan Xu    Cat(wordMaskAddSource(59, 0), 0.U(4.W))
263a792bcf1SYinan Xu  ))
264a792bcf1SYinan Xu  val sraddSource = VecInit(Seq(
265a792bcf1SYinan Xu    ZeroExt(src1(63, 29), XLEN),
26688825c5cSYinan Xu    ZeroExt(src1(63, 30), XLEN),
26788825c5cSYinan Xu    ZeroExt(src1(63, 31), XLEN),
26888825c5cSYinan Xu    ZeroExt(src1(63, 32), XLEN)
26988825c5cSYinan Xu  ))
270a792bcf1SYinan Xu  // TODO: use decoder or other libraries to optimize timing
271a792bcf1SYinan Xu  // Now we assume shadd has the worst timing.
272*675acc68SYinan Xu  addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)),
273*675acc68SYinan Xu    Mux(func(2), sraddSource(func(1, 0)),
274*675acc68SYinan Xu    Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource))
275a792bcf1SYinan Xu  )
276a792bcf1SYinan Xu  addModule.io.src(1) := src2
27788825c5cSYinan Xu  val add = addModule.io.add
278ee8ff153Szfw
279*675acc68SYinan Xu  // sub
280184a1958Szfw  val sub  = subModule.io.sub
2812bd5334dSYinan Xu  subModule.io.src(0) := src1
2822bd5334dSYinan Xu  subModule.io.src(1) := src2
283184a1958Szfw  val sgtu    = sub(XLEN)
284184a1958Szfw  val sltu    = !sgtu
285*675acc68SYinan Xu  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
286ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
28728c18878Szfw  val maxMinU = Mux((sgtu && func(0)) || ~(sgtu && func(0)), src2, src1)
288*675acc68SYinan Xu  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
289ee8ff153Szfw
290*675acc68SYinan Xu  // logic
291*675acc68SYinan Xu  val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2)
292*675acc68SYinan Xu  val and     = src1 & logicSrc2
293*675acc68SYinan Xu  val or      = src1 | logicSrc2
294*675acc68SYinan Xu  val xor     = src1 ^ logicSrc2
295*675acc68SYinan Xu  val orcb    = Cat((7 to 0).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)))
296*675acc68SYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
297*675acc68SYinan Xu
298*675acc68SYinan Xu  val sextb = SignExt(src1(7, 0), XLEN)
299*675acc68SYinan Xu  val packh = Cat(src2(7,0), src1(7,0))
300*675acc68SYinan Xu  val sexth = SignExt(src1(15, 0), XLEN)
301*675acc68SYinan Xu  val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN)
302*675acc68SYinan Xu
303*675acc68SYinan Xu  val revb = Cat((7 to 0).map(i => Reverse(src1(8 * i + 7, 8 * i))))
304*675acc68SYinan Xu  val pack = Cat(src2(31, 0), src1(31, 0))
305*675acc68SYinan Xu  val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i)))
306*675acc68SYinan Xu
307*675acc68SYinan Xu  // branch
308ee8ff153Szfw  val branchOpTable = List(
309ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.beq)  -> !xor.orR,
310ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.blt)  -> slt,
311ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.bltu) -> sltu
312ee8ff153Szfw  )
313ee8ff153Szfw  val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func)
314ee8ff153Szfw
315184a1958Szfw  // Result Select
316184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
317*675acc68SYinan Xu  shiftResSel.io.func := func(3, 0)
318184a1958Szfw  shiftResSel.io.sll  := sll
319184a1958Szfw  shiftResSel.io.srl  := srl
320184a1958Szfw  shiftResSel.io.sra  := sra
32128c18878Szfw  shiftResSel.io.rol  := rol
32228c18878Szfw  shiftResSel.io.ror  := ror
323184a1958Szfw  shiftResSel.io.bclr := bclr
324184a1958Szfw  shiftResSel.io.binv := binv
325184a1958Szfw  shiftResSel.io.bset := bset
326184a1958Szfw  shiftResSel.io.bext := bext
327184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
32831ea8750SLinJiawei
32931ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
330*675acc68SYinan Xu  miscResSel.io.func    := func(5, 0)
331ee8ff153Szfw  miscResSel.io.and     := and
332ee8ff153Szfw  miscResSel.io.or      := or
333ee8ff153Szfw  miscResSel.io.xor     := xor
334*675acc68SYinan Xu  miscResSel.io.orcb    := orcb
33588825c5cSYinan Xu  miscResSel.io.orh48   := orh48
336ee8ff153Szfw  miscResSel.io.sextb   := sextb
337*675acc68SYinan Xu  miscResSel.io.packh   := packh
338ee8ff153Szfw  miscResSel.io.sexth   := sexth
339*675acc68SYinan Xu  miscResSel.io.packw   := packw
340*675acc68SYinan Xu  miscResSel.io.revb    := revb
341ee8ff153Szfw  miscResSel.io.rev8    := rev8
342*675acc68SYinan Xu  miscResSel.io.pack    := pack
34388825c5cSYinan Xu  miscResSel.io.src     := src1
34431ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
34531ea8750SLinJiawei
346184a1958Szfw  val wordResSel = Module(new WordResultSelect)
347184a1958Szfw  wordResSel.io.func := func
348184a1958Szfw  wordResSel.io.addw := addw
349184a1958Szfw  wordResSel.io.subw := subw
350184a1958Szfw  wordResSel.io.sllw := sllw
351184a1958Szfw  wordResSel.io.srlw := srlw
352184a1958Szfw  wordResSel.io.sraw := sraw
35328c18878Szfw  wordResSel.io.rolw := rolw
35428c18878Szfw  wordResSel.io.rorw := rorw
355184a1958Szfw  val wordRes = wordResSel.io.wordRes
356ee8ff153Szfw
35731ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
358*675acc68SYinan Xu  aluResSel.io.func := func(6, 4)
359184a1958Szfw  aluResSel.io.addRes := add
360184a1958Szfw  aluResSel.io.compareRes := compareRes
361ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
36231ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
363184a1958Szfw  aluResSel.io.wordRes := wordRes
36431ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
365e18c367fSLinJiawei
366e2203130SLinJiawei  io.result := aluRes
367e2203130SLinJiawei  io.taken := taken
368e2203130SLinJiawei  io.mispredict := (io.pred_taken ^ taken) && io.isBranch
369e2203130SLinJiawei}
370e2203130SLinJiawei
371adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect {
372e2203130SLinJiawei
373*675acc68SYinan Xu  val uop = io.in.bits.uop
374e2203130SLinJiawei
375*675acc68SYinan Xu  val isBranch = ALUOpType.isBranch(io.in.bits.uop.ctrl.fuOpType)
376e2203130SLinJiawei  val dataModule = Module(new AluDataModule)
377e2203130SLinJiawei
378*675acc68SYinan Xu  dataModule.io.src := io.in.bits.src.take(2)
379*675acc68SYinan Xu  dataModule.io.func := io.in.bits.uop.ctrl.fuOpType
380e2203130SLinJiawei  dataModule.io.pred_taken := uop.cf.pred_taken
381e2203130SLinJiawei  dataModule.io.isBranch := isBranch
382e2203130SLinJiawei
383e18c367fSLinJiawei  redirectOutValid := io.out.valid && isBranch
384151e3043SLinJiawei  redirectOut := DontCare
385bfb958a3SYinan Xu  redirectOut.level := RedirectLevel.flushAfter
386e18c367fSLinJiawei  redirectOut.roqIdx := uop.roqIdx
387cde9280dSLinJiawei  redirectOut.ftqIdx := uop.cf.ftqPtr
388cde9280dSLinJiawei  redirectOut.ftqOffset := uop.cf.ftqOffset
389e2203130SLinJiawei  redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict
390e2203130SLinJiawei  redirectOut.cfiUpdate.taken := dataModule.io.taken
391cde9280dSLinJiawei  redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken
392151e3043SLinJiawei
393e18c367fSLinJiawei  io.in.ready := io.out.ready
394*675acc68SYinan Xu  io.out.valid := io.in.valid
395e18c367fSLinJiawei  io.out.bits.uop <> io.in.bits.uop
396e2203130SLinJiawei  io.out.bits.data := dataModule.io.result
397e18c367fSLinJiawei}
398