xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision 73be64b3fc882a759f70d0852ba42d09c2a44af6)
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() {
99675acc68SYinan Xu    val func = Input(UInt(6.W))
100675acc68SYinan 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
105675acc68SYinan Xu  val logicRes = VecInit(Seq(
106675acc68SYinan Xu    io.and,
107675acc68SYinan Xu    io.or,
108675acc68SYinan Xu    io.xor,
109675acc68SYinan Xu    io.orcb
110675acc68SYinan Xu  ))(io.func(2, 1))
111675acc68SYinan Xu  val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0))
112675acc68SYinan Xu  val logicBase = Mux(io.func(3), miscRes, logicRes)
11388825c5cSYinan Xu
114675acc68SYinan Xu  val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0))
115675acc68SYinan Xu  val customRes = VecInit(Seq(
116675acc68SYinan Xu    Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)),
117675acc68SYinan Xu    Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)),
118675acc68SYinan Xu    Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)),
119675acc68SYinan Xu    Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0))
120675acc68SYinan Xu  val logicAdv = Mux(io.func(3), customRes, revRes)
121ee8ff153Szfw
122675acc68SYinan Xu  val mask = Cat(Fill(15, io.func(0)), 1.U(1.W))
123675acc68SYinan Xu  val maskedLogicRes = mask & logicRes
124675acc68SYinan Xu
125675acc68SYinan 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() {
130675acc68SYinan 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
135675acc68SYinan Xu  // val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
136675acc68SYinan Xu  // val leftRes  = Mux(io.func(2), leftBit, io.sll)
137675acc68SYinan Xu  // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl))
138675acc68SYinan Xu  val resultSource = VecInit(Seq(
139675acc68SYinan Xu    io.sll,
140675acc68SYinan Xu    io.sll,
141675acc68SYinan Xu    io.bclr,
142675acc68SYinan Xu    io.bset,
143675acc68SYinan Xu    io.binv,
144675acc68SYinan Xu    io.srl,
145675acc68SYinan Xu    io.bext,
146675acc68SYinan Xu    io.sra
147675acc68SYinan Xu  ))
148675acc68SYinan Xu  val simple = resultSource(io.func(2, 0))
149ee8ff153Szfw
1507b441e5eSYinan Xu  io.shiftRes := Mux(io.func(3), Mux(io.func(1), 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
160675acc68SYinan Xu  val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw)
161675acc68SYinan Xu  val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw),
162675acc68SYinan Xu                  Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw)))
163675acc68SYinan 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() {
170675acc68SYinan 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
175675acc68SYinan Xu  val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes),
176675acc68SYinan 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
190675acc68SYinan Xu  val shamt = src2(5, 0)
191675acc68SYinan Xu  val revShamt = ~src2(5,0) + 1.U
192675acc68SYinan Xu
193675acc68SYinan Xu  // slliuw, sll
194675acc68SYinan Xu  val leftShiftModule = Module(new LeftShiftModule)
195675acc68SYinan Xu  val sll = leftShiftModule.io.sll
196675acc68SYinan Xu  val revSll = leftShiftModule.io.revSll
197675acc68SYinan Xu  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
198675acc68SYinan Xu  leftShiftModule.io.shamt := shamt
199675acc68SYinan Xu  leftShiftModule.io.revShamt := revShamt
200675acc68SYinan Xu
201675acc68SYinan Xu  // bclr, bset, binv
202675acc68SYinan Xu  val bitShift = 1.U << src2(5, 0)
203675acc68SYinan Xu  val bclr = src1 & ~bitShift
204675acc68SYinan Xu  val bset = src1 | bitShift
205675acc68SYinan Xu  val binv = src1 ^ bitShift
206675acc68SYinan Xu
207675acc68SYinan Xu  // srl, sra, bext
208675acc68SYinan Xu  val rightShiftModule = Module(new RightShiftModule)
209675acc68SYinan Xu  val srl = rightShiftModule.io.srl
210675acc68SYinan Xu  val revSrl = rightShiftModule.io.revSrl
211675acc68SYinan Xu  val sra = rightShiftModule.io.sra
212675acc68SYinan Xu  rightShiftModule.io.shamt := shamt
213675acc68SYinan Xu  rightShiftModule.io.revShamt := revShamt
214675acc68SYinan Xu  rightShiftModule.io.srlSrc := src1
215675acc68SYinan Xu  rightShiftModule.io.sraSrc := src1
216675acc68SYinan Xu  val bext = srl(0)
217675acc68SYinan Xu
218675acc68SYinan Xu  val rol = revSrl | sll
219675acc68SYinan Xu  val ror = srl | revSll
220675acc68SYinan Xu
221675acc68SYinan Xu  // addw
222184a1958Szfw  val addModule = Module(new AddModule)
223675acc68SYinan Xu  addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0))
224675acc68SYinan Xu  val addwResultAll = VecInit(Seq(
225675acc68SYinan Xu    ZeroExt(addModule.io.addw(0), XLEN),
226675acc68SYinan Xu    ZeroExt(addModule.io.addw(7, 0), XLEN),
227675acc68SYinan Xu    ZeroExt(addModule.io.addw(15, 0), XLEN),
228675acc68SYinan Xu    SignExt(addModule.io.addw(15, 0), XLEN)
229675acc68SYinan Xu  ))
230675acc68SYinan Xu  val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw)
231675acc68SYinan Xu
232675acc68SYinan Xu  // subw
233675acc68SYinan Xu  val subModule = Module(new SubModule)
234675acc68SYinan Xu  val subw = subModule.io.sub
235675acc68SYinan Xu
236675acc68SYinan Xu  // sllw
237675acc68SYinan Xu  val leftShiftWordModule = Module(new LeftShiftWordModule)
238675acc68SYinan Xu  val sllw = leftShiftWordModule.io.sllw
239675acc68SYinan Xu  val revSllw = leftShiftWordModule.io.revSllw
240675acc68SYinan Xu  leftShiftWordModule.io.sllSrc := src1
241675acc68SYinan Xu  leftShiftWordModule.io.shamt := shamt
242675acc68SYinan Xu  leftShiftWordModule.io.revShamt := revShamt
243675acc68SYinan Xu
244675acc68SYinan Xu  val rightShiftWordModule = Module(new RightShiftWordModule)
245675acc68SYinan Xu  val srlw = rightShiftWordModule.io.srlw
246675acc68SYinan Xu  val revSrlw = rightShiftWordModule.io.revSrlw
247675acc68SYinan Xu  val sraw = rightShiftWordModule.io.sraw
248675acc68SYinan Xu  rightShiftWordModule.io.shamt := shamt
249675acc68SYinan Xu  rightShiftWordModule.io.revShamt := revShamt
250675acc68SYinan Xu  rightShiftWordModule.io.srlSrc := src1
251675acc68SYinan Xu  rightShiftWordModule.io.sraSrc := src1
252675acc68SYinan Xu
253675acc68SYinan Xu  val rolw = revSrlw | sllw
254675acc68SYinan Xu  val rorw = srlw | revSllw
255675acc68SYinan Xu
256675acc68SYinan 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.
272675acc68SYinan Xu  addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)),
273675acc68SYinan Xu    Mux(func(2), sraddSource(func(1, 0)),
274675acc68SYinan 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
279675acc68SYinan Xu  // sub
280184a1958Szfw  val sub  = subModule.io.sub
2812bd5334dSYinan Xu  subModule.io.src(0) := src1
2822bd5334dSYinan Xu  subModule.io.src(1) := src2
2837b441e5eSYinan Xu  val sltu    = !sub(XLEN)
284675acc68SYinan Xu  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
285ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
2867b441e5eSYinan Xu  val maxMinU = Mux(sltu ^ func(0), src2, src1)
287675acc68SYinan Xu  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
288ee8ff153Szfw
289675acc68SYinan Xu  // logic
290675acc68SYinan Xu  val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2)
291675acc68SYinan Xu  val and     = src1 & logicSrc2
292675acc68SYinan Xu  val or      = src1 | logicSrc2
293675acc68SYinan Xu  val xor     = src1 ^ logicSrc2
294*73be64b3SJiawei Lin  val orcb    = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse)
295675acc68SYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
296675acc68SYinan Xu
297675acc68SYinan Xu  val sextb = SignExt(src1(7, 0), XLEN)
298675acc68SYinan Xu  val packh = Cat(src2(7,0), src1(7,0))
299675acc68SYinan Xu  val sexth = SignExt(src1(15, 0), XLEN)
300675acc68SYinan Xu  val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN)
301675acc68SYinan Xu
302*73be64b3SJiawei Lin  val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse)
303675acc68SYinan Xu  val pack = Cat(src2(31, 0), src1(31, 0))
304675acc68SYinan Xu  val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i)))
305675acc68SYinan Xu
306675acc68SYinan Xu  // branch
307ee8ff153Szfw  val branchOpTable = List(
308ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.beq)  -> !xor.orR,
309ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.blt)  -> slt,
310ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.bltu) -> sltu
311ee8ff153Szfw  )
312ee8ff153Szfw  val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func)
313ee8ff153Szfw
314184a1958Szfw  // Result Select
315184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
316675acc68SYinan Xu  shiftResSel.io.func := func(3, 0)
317184a1958Szfw  shiftResSel.io.sll  := sll
318184a1958Szfw  shiftResSel.io.srl  := srl
319184a1958Szfw  shiftResSel.io.sra  := sra
32028c18878Szfw  shiftResSel.io.rol  := rol
32128c18878Szfw  shiftResSel.io.ror  := ror
322184a1958Szfw  shiftResSel.io.bclr := bclr
323184a1958Szfw  shiftResSel.io.binv := binv
324184a1958Szfw  shiftResSel.io.bset := bset
325184a1958Szfw  shiftResSel.io.bext := bext
326184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
32731ea8750SLinJiawei
32831ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
329675acc68SYinan Xu  miscResSel.io.func    := func(5, 0)
330ee8ff153Szfw  miscResSel.io.and     := and
331ee8ff153Szfw  miscResSel.io.or      := or
332ee8ff153Szfw  miscResSel.io.xor     := xor
333675acc68SYinan Xu  miscResSel.io.orcb    := orcb
33488825c5cSYinan Xu  miscResSel.io.orh48   := orh48
335ee8ff153Szfw  miscResSel.io.sextb   := sextb
336675acc68SYinan Xu  miscResSel.io.packh   := packh
337ee8ff153Szfw  miscResSel.io.sexth   := sexth
338675acc68SYinan Xu  miscResSel.io.packw   := packw
339675acc68SYinan Xu  miscResSel.io.revb    := revb
340ee8ff153Szfw  miscResSel.io.rev8    := rev8
341675acc68SYinan Xu  miscResSel.io.pack    := pack
34288825c5cSYinan Xu  miscResSel.io.src     := src1
34331ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
34431ea8750SLinJiawei
345184a1958Szfw  val wordResSel = Module(new WordResultSelect)
346184a1958Szfw  wordResSel.io.func := func
347184a1958Szfw  wordResSel.io.addw := addw
348184a1958Szfw  wordResSel.io.subw := subw
349184a1958Szfw  wordResSel.io.sllw := sllw
350184a1958Szfw  wordResSel.io.srlw := srlw
351184a1958Szfw  wordResSel.io.sraw := sraw
35228c18878Szfw  wordResSel.io.rolw := rolw
35328c18878Szfw  wordResSel.io.rorw := rorw
354184a1958Szfw  val wordRes = wordResSel.io.wordRes
355ee8ff153Szfw
35631ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
357675acc68SYinan Xu  aluResSel.io.func := func(6, 4)
358184a1958Szfw  aluResSel.io.addRes := add
359184a1958Szfw  aluResSel.io.compareRes := compareRes
360ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
36131ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
362184a1958Szfw  aluResSel.io.wordRes := wordRes
36331ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
364e18c367fSLinJiawei
365e2203130SLinJiawei  io.result := aluRes
366e2203130SLinJiawei  io.taken := taken
367e2203130SLinJiawei  io.mispredict := (io.pred_taken ^ taken) && io.isBranch
368e2203130SLinJiawei}
369e2203130SLinJiawei
370adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect {
371e2203130SLinJiawei
372675acc68SYinan Xu  val uop = io.in.bits.uop
373e2203130SLinJiawei
374675acc68SYinan Xu  val isBranch = ALUOpType.isBranch(io.in.bits.uop.ctrl.fuOpType)
375e2203130SLinJiawei  val dataModule = Module(new AluDataModule)
376e2203130SLinJiawei
377675acc68SYinan Xu  dataModule.io.src := io.in.bits.src.take(2)
378675acc68SYinan Xu  dataModule.io.func := io.in.bits.uop.ctrl.fuOpType
379e2203130SLinJiawei  dataModule.io.pred_taken := uop.cf.pred_taken
380e2203130SLinJiawei  dataModule.io.isBranch := isBranch
381e2203130SLinJiawei
382e18c367fSLinJiawei  redirectOutValid := io.out.valid && isBranch
383151e3043SLinJiawei  redirectOut := DontCare
384bfb958a3SYinan Xu  redirectOut.level := RedirectLevel.flushAfter
3859aca92b9SYinan Xu  redirectOut.robIdx := uop.robIdx
386cde9280dSLinJiawei  redirectOut.ftqIdx := uop.cf.ftqPtr
387cde9280dSLinJiawei  redirectOut.ftqOffset := uop.cf.ftqOffset
388e2203130SLinJiawei  redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict
389e2203130SLinJiawei  redirectOut.cfiUpdate.taken := dataModule.io.taken
390cde9280dSLinJiawei  redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken
39120edb3f7SWilliam Wang  redirectOut.debug_runahead_checkpoint_id := uop.debugInfo.runahead_checkpoint_id
392151e3043SLinJiawei
393e18c367fSLinJiawei  io.in.ready := io.out.ready
394675acc68SYinan 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