xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision a792bcf1a0e095a9bceade5a3f5b481df101a247)
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() {
9988825c5cSYinan Xu    val func = Input(UInt(5.W))
10088825c5cSYinan Xu    val andn, orn, xnor, and, or, xor, orh48, sextb, sexth, zexth, rev8, orcb = Input(UInt(XLEN.W))
10188825c5cSYinan Xu    val src = Input(UInt(XLEN.W))
10231ea8750SLinJiawei    val miscRes = Output(UInt(XLEN.W))
10331ea8750SLinJiawei  })
104ee8ff153Szfw
10588825c5cSYinan Xu  val logicResSel = ParallelMux(List(
106184a1958Szfw    ALUOpType.andn  -> io.andn,
107184a1958Szfw    ALUOpType.and   -> io.and,
108184a1958Szfw    ALUOpType.orn   -> io.orn,
109184a1958Szfw    ALUOpType.or    -> io.or,
110184a1958Szfw    ALUOpType.xnor  -> io.xnor,
111184a1958Szfw    ALUOpType.xor   -> io.xor,
112*a792bcf1SYinan Xu    ALUOpType.orh48 -> io.orh48,
113*a792bcf1SYinan Xu    ALUOpType.orc_b -> io.orcb
11488825c5cSYinan Xu  ).map(x => (x._1(2, 0) === io.func(2, 0), x._2)))
11588825c5cSYinan Xu  val maskedLogicRes = Cat(Fill(63, ~io.func(3)), 1.U(1.W)) & logicResSel
11688825c5cSYinan Xu
11788825c5cSYinan Xu  val miscRes = ParallelMux(List(
118184a1958Szfw    ALUOpType.sext_b -> io.sextb,
119184a1958Szfw    ALUOpType.sext_h -> io.sexth,
120184a1958Szfw    ALUOpType.zext_h -> io.zexth,
12188825c5cSYinan Xu    ALUOpType.rev8   -> io.rev8,
12288825c5cSYinan Xu    ALUOpType.szewl1 -> Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)),
12388825c5cSYinan Xu    ALUOpType.szewl2 -> Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)),
124*a792bcf1SYinan Xu    ALUOpType.szewl3 -> Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)),
12588825c5cSYinan Xu    ALUOpType.byte2  -> Cat(0.U(56.W), io.src(15, 8))
12688825c5cSYinan Xu  ).map(x => (x._1(2, 0) === io.func(2, 0), x._2)))
127ee8ff153Szfw
12888825c5cSYinan Xu  io.miscRes := Mux(io.func(3) && !io.func(4), miscRes, maskedLogicRes)
12931ea8750SLinJiawei}
13031ea8750SLinJiawei
131ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule {
132ee8ff153Szfw  val io = IO(new Bundle() {
133ee8ff153Szfw    val func = Input(UInt())
13428c18878Szfw    val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W))
135ee8ff153Szfw    val shiftRes = Output(UInt(XLEN.W))
136ee8ff153Szfw  })
137ee8ff153Szfw
138184a1958Szfw  val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
139184a1958Szfw  val leftRes  = Mux(io.func(2), leftBit, io.sll)
140184a1958Szfw  val rightRes = Mux(io.func(2), io.sra, Mux(io.func(1), io.bext, io.srl))
141ee8ff153Szfw
14228c18878Szfw  io.shiftRes := Mux(io.func(4), Mux(io.func(3), io.ror, io.rol), Mux(io.func(3), rightRes, leftRes))
143184a1958Szfw}
144ee8ff153Szfw
145184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule {
146184a1958Szfw  val io = IO(new Bundle() {
147184a1958Szfw    val func = Input(UInt())
14828c18878Szfw    val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W))
149184a1958Szfw    val wordRes = Output(UInt(XLEN.W))
150184a1958Szfw  })
151ee8ff153Szfw
152184a1958Szfw  val addsubRes = Mux(io.func(6), io.subw, io.addw)
15328c18878Szfw  val shiftRes = Mux(io.func(4),
15428c18878Szfw                  Mux(io.func(3), io.rorw, io.rolw),
155184a1958Szfw                  Mux(io.func(3),
156184a1958Szfw                    Mux(io.func(2), io.sraw, io.srlw),
157184a1958Szfw                    io.sllw))
158184a1958Szfw  val wordRes = Mux(io.func(6,5) === 2.U, shiftRes, addsubRes)
159184a1958Szfw  io.wordRes := SignExt(wordRes, XLEN)
160ee8ff153Szfw}
161ee8ff153Szfw
162ee8ff153Szfw
1632225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule {
16431ea8750SLinJiawei  val io = IO(new Bundle() {
16531ea8750SLinJiawei    val func = Input(UInt())
166184a1958Szfw    val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W))
16731ea8750SLinJiawei    val aluRes = Output(UInt(XLEN.W))
16831ea8750SLinJiawei  })
169ee8ff153Szfw
170184a1958Szfw  val res = Mux(io.func(7), io.wordRes, Mux(io.func(6),
171184a1958Szfw    Mux(io.func(5), io.compareRes, io.shiftRes),
172184a1958Szfw    Mux(io.func(5), io.addRes, io.miscRes)
173184a1958Szfw  ))
174184a1958Szfw  io.aluRes := res
17531ea8750SLinJiawei}
17631ea8750SLinJiawei
1772225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule {
178e2203130SLinJiawei  val io = IO(new Bundle() {
1792bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
180e2203130SLinJiawei    val func = Input(FuOpType())
181e2203130SLinJiawei    val pred_taken, isBranch = Input(Bool())
182e2203130SLinJiawei    val result = Output(UInt(XLEN.W))
183e2203130SLinJiawei    val taken, mispredict = Output(Bool())
184e2203130SLinJiawei  })
1852bd5334dSYinan Xu  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
186e18c367fSLinJiawei
187184a1958Szfw  val addModule = Module(new AddModule)
18888825c5cSYinan Xu  // For 64-bit adder:
18988825c5cSYinan Xu  // BITS(2, 1): shamt (0, 1, 2, 3)
19088825c5cSYinan Xu  // BITS(3   ): different fused cases
191*a792bcf1SYinan Xu  val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
192*a792bcf1SYinan Xu  val shaddSource = VecInit(Seq(
193*a792bcf1SYinan Xu    Cat(wordMaskAddSource(62, 0), 0.U(1.W)),
194*a792bcf1SYinan Xu    Cat(wordMaskAddSource(61, 0), 0.U(2.W)),
195*a792bcf1SYinan Xu    Cat(wordMaskAddSource(60, 0), 0.U(3.W)),
196*a792bcf1SYinan Xu    Cat(wordMaskAddSource(59, 0), 0.U(4.W))
197*a792bcf1SYinan Xu  ))
198*a792bcf1SYinan Xu  val sraddSource = VecInit(Seq(
199*a792bcf1SYinan Xu    ZeroExt(src1(63, 29), XLEN),
20088825c5cSYinan Xu    ZeroExt(src1(63, 30), XLEN),
20188825c5cSYinan Xu    ZeroExt(src1(63, 31), XLEN),
20288825c5cSYinan Xu    ZeroExt(src1(63, 32), XLEN)
20388825c5cSYinan Xu  ))
204*a792bcf1SYinan Xu  // TODO: use decoder or other libraries to optimize timing
205*a792bcf1SYinan Xu  // Now we assume shadd has the worst timing.
206*a792bcf1SYinan Xu  addModule.io.src(0) := Mux(ALUOpType.isShAdd(func), shaddSource(func(2, 1)),
207*a792bcf1SYinan Xu    Mux(ALUOpType.isSrAdd(func), sraddSource(func(2, 1)),
208*a792bcf1SYinan Xu    Mux(ALUOpType.isAddOddBit(func), ZeroExt(src1(0), XLEN), wordMaskAddSource))
209*a792bcf1SYinan Xu  )
210*a792bcf1SYinan Xu  addModule.io.src(1) := src2
21188825c5cSYinan Xu  val add = addModule.io.add
212*a792bcf1SYinan Xu  // For 32-bit adder: its source comes from lower 32bits or lowest bit.
213*a792bcf1SYinan Xu  addModule.io.srcw := Mux(ALUOpType.isAddOddBit(func), ZeroExt(src1(0), XLEN), src1(31,0))
21488825c5cSYinan Xu  val byteMask = Cat(Fill(56, ~func(1)), 0xff.U(8.W))
21588825c5cSYinan Xu  val bitMask = Cat(Fill(63, ~func(2)), 0x1.U(1.W))
21688825c5cSYinan Xu  val addw = addModule.io.addw & byteMask & bitMask
217ee8ff153Szfw
21831ea8750SLinJiawei  val subModule = Module(new SubModule)
219184a1958Szfw  val sub  = subModule.io.sub
220184a1958Szfw  val subw = subModule.io.sub
2212bd5334dSYinan Xu  subModule.io.src(0) := src1
2222bd5334dSYinan Xu  subModule.io.src(1) := src2
223e18c367fSLinJiawei
224184a1958Szfw  val shamt = src2(5, 0)
225184a1958Szfw  val revShamt = ~src2(5,0) + 1.U
226ee8ff153Szfw
227184a1958Szfw  val leftShiftModule = Module(new LeftShiftModule)
228184a1958Szfw  val sll = leftShiftModule.io.sll
22928c18878Szfw  val revSll = leftShiftModule.io.revSll
23028c18878Szfw  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32,1.U)) & src1
23128c18878Szfw  leftShiftModule.io.shamt := shamt
23228c18878Szfw  leftShiftModule.io.revShamt := revShamt
233184a1958Szfw
234184a1958Szfw  val leftShiftWordModule = Module(new LeftShiftWordModule)
235184a1958Szfw  val sllw = leftShiftWordModule.io.sllw
23628c18878Szfw  val revSllw = leftShiftWordModule.io.revSllw
237184a1958Szfw  leftShiftWordModule.io.sllSrc := src1
23828c18878Szfw  leftShiftWordModule.io.shamt := shamt
23928c18878Szfw  leftShiftWordModule.io.revShamt := revShamt
240184a1958Szfw
241184a1958Szfw  val rightShiftModule = Module(new RightShiftModule)
242184a1958Szfw  val srl = rightShiftModule.io.srl
24328c18878Szfw  val revSrl = rightShiftModule.io.revSrl
244184a1958Szfw  val sra = rightShiftModule.io.sra
24528c18878Szfw  rightShiftModule.io.shamt := shamt
24628c18878Szfw  rightShiftModule.io.revShamt := revShamt
247184a1958Szfw  rightShiftModule.io.srlSrc := src1
24828c18878Szfw  rightShiftModule.io.sraSrc := src1
249184a1958Szfw
250184a1958Szfw  val rightShiftWordModule = Module(new RightShiftWordModule)
251184a1958Szfw  val srlw = rightShiftWordModule.io.srlw
25228c18878Szfw  val revSrlw = rightShiftWordModule.io.revSrlw
253184a1958Szfw  val sraw = rightShiftWordModule.io.sraw
25428c18878Szfw  rightShiftWordModule.io.shamt := shamt
25528c18878Szfw  rightShiftWordModule.io.revShamt := revShamt
256184a1958Szfw  rightShiftWordModule.io.srlSrc := src1
257184a1958Szfw  rightShiftWordModule.io.sraSrc := src1
258184a1958Szfw
25928c18878Szfw  val rol = revSrl | sll
26028c18878Szfw  val ror = srl | revSll
26128c18878Szfw  val rolw = revSrlw | sllw
26228c18878Szfw  val rorw = srlw | revSllw
263184a1958Szfw
264184a1958Szfw  val bitShift = 1.U << src2(5, 0)
265184a1958Szfw  val bset = src1 | bitShift
266184a1958Szfw  val bclr = src1 & ~bitShift
267184a1958Szfw  val binv = src1 ^ bitShift
268184a1958Szfw  val bext = srl(0)
269184a1958Szfw
2700a6fa50eSzfw  val andn    = src1 & ~src2
2710a6fa50eSzfw  val orn     = src1 | ~src2
2720a6fa50eSzfw  val xnor    = src1 ^ ~src2
2730a6fa50eSzfw  val and     = src1 & src2
2740a6fa50eSzfw  val or      = src1 | src2
2750a6fa50eSzfw  val xor     = src1 ^ src2
27688825c5cSYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
277184a1958Szfw  val sgtu    = sub(XLEN)
278184a1958Szfw  val sltu    = !sgtu
279ee8ff153Szfw  val slt     = xor(XLEN-1) ^ sltu
28028c18878Szfw  // val maxMin  = Mux(slt ^ func(0), src2, src1)
28128c18878Szfw  // val maxMinU = Mux(sltu^ func(0), src2, src1)
282ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
28328c18878Szfw  val maxMinU = Mux((sgtu && func(0)) || ~(sgtu && func(0)), src2, src1)
284ee8ff153Szfw  val sextb   = SignExt(src1(7, 0), XLEN)
285ee8ff153Szfw  val sexth   = SignExt(src1(15, 0), XLEN)
286ee8ff153Szfw  val zexth   = ZeroExt(src1(15, 0), XLEN)
287ee8ff153Szfw  val rev8    = Cat(src1(7,0), src1(15,8), src1(23,16), src1(31,24),
288ee8ff153Szfw                    src1(39,32), src1(47,40), src1(55,48), src1(63,56))
289ee8ff153Szfw  val orcb    = Cat(Reverse(src1(63,56)), Reverse(src1(55,48)), Reverse(src1(47,40)), Reverse(src1(39,32)),
290ee8ff153Szfw                    Reverse(src1(31,24)), Reverse(src1(23,16)), Reverse(src1(15,8)), Reverse(src1(7,0)))
291ee8ff153Szfw
292ee8ff153Szfw  val branchOpTable = List(
293ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.beq)  -> !xor.orR,
294ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.blt)  -> slt,
295ee8ff153Szfw    ALUOpType.getBranchType(ALUOpType.bltu) -> sltu
296ee8ff153Szfw  )
297ee8ff153Szfw  val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func)
298ee8ff153Szfw
299ee8ff153Szfw
300184a1958Szfw  // Result Select
3013ef996e9SLinJiawei
302184a1958Szfw  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
303ee8ff153Szfw
304184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
305184a1958Szfw  shiftResSel.io.func := func(4,0)
306184a1958Szfw  shiftResSel.io.sll  := sll
307184a1958Szfw  shiftResSel.io.srl  := srl
308184a1958Szfw  shiftResSel.io.sra  := sra
30928c18878Szfw  shiftResSel.io.rol  := rol
31028c18878Szfw  shiftResSel.io.ror  := ror
311184a1958Szfw  shiftResSel.io.bclr := bclr
312184a1958Szfw  shiftResSel.io.binv := binv
313184a1958Szfw  shiftResSel.io.bset := bset
314184a1958Szfw  shiftResSel.io.bext := bext
315184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
31631ea8750SLinJiawei
31731ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
31888825c5cSYinan Xu  miscResSel.io.func    := func(4, 0)
319ee8ff153Szfw  miscResSel.io.andn    := andn
320ee8ff153Szfw  miscResSel.io.orn     := orn
321ee8ff153Szfw  miscResSel.io.xnor    := xnor
322ee8ff153Szfw  miscResSel.io.and     := and
323ee8ff153Szfw  miscResSel.io.or      := or
324ee8ff153Szfw  miscResSel.io.xor     := xor
32588825c5cSYinan Xu  miscResSel.io.orh48   := orh48
326ee8ff153Szfw  miscResSel.io.sextb   := sextb
327ee8ff153Szfw  miscResSel.io.sexth   := sexth
328ee8ff153Szfw  miscResSel.io.zexth   := zexth
329ee8ff153Szfw  miscResSel.io.rev8    := rev8
330ee8ff153Szfw  miscResSel.io.orcb    := orcb
33188825c5cSYinan Xu  miscResSel.io.src     := src1
33231ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
33331ea8750SLinJiawei
334184a1958Szfw  val wordResSel = Module(new WordResultSelect)
335184a1958Szfw  wordResSel.io.func := func
336184a1958Szfw  wordResSel.io.addw := addw
337184a1958Szfw  wordResSel.io.subw := subw
338184a1958Szfw  wordResSel.io.sllw := sllw
339184a1958Szfw  wordResSel.io.srlw := srlw
340184a1958Szfw  wordResSel.io.sraw := sraw
34128c18878Szfw  wordResSel.io.rolw := rolw
34228c18878Szfw  wordResSel.io.rorw := rorw
343184a1958Szfw  val wordRes = wordResSel.io.wordRes
344ee8ff153Szfw
34531ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
34631ea8750SLinJiawei  aluResSel.io.func := func
347184a1958Szfw  aluResSel.io.addRes := add
348184a1958Szfw  aluResSel.io.compareRes := compareRes
349ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
35031ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
351184a1958Szfw  aluResSel.io.wordRes := wordRes
35231ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
353e18c367fSLinJiawei
354e2203130SLinJiawei  io.result := aluRes
355e2203130SLinJiawei  io.taken := taken
356e2203130SLinJiawei  io.mispredict := (io.pred_taken ^ taken) && io.isBranch
357e2203130SLinJiawei}
358e2203130SLinJiawei
359adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect {
360e2203130SLinJiawei
361e2203130SLinJiawei  val (src1, src2, func, pc, uop) = (
362e2203130SLinJiawei    io.in.bits.src(0),
363e2203130SLinJiawei    io.in.bits.src(1),
364e2203130SLinJiawei    io.in.bits.uop.ctrl.fuOpType,
365e2203130SLinJiawei    SignExt(io.in.bits.uop.cf.pc, AddrBits),
366e2203130SLinJiawei    io.in.bits.uop
367e2203130SLinJiawei  )
368e2203130SLinJiawei
369e2203130SLinJiawei  val valid = io.in.valid
370e2203130SLinJiawei  val isBranch = ALUOpType.isBranch(func)
371e2203130SLinJiawei  val dataModule = Module(new AluDataModule)
372e2203130SLinJiawei
3732bd5334dSYinan Xu  dataModule.io.src(0) := src1
3742bd5334dSYinan Xu  dataModule.io.src(1) := src2
375e2203130SLinJiawei  dataModule.io.func := func
376e2203130SLinJiawei  dataModule.io.pred_taken := uop.cf.pred_taken
377e2203130SLinJiawei  dataModule.io.isBranch := isBranch
378e2203130SLinJiawei
379e18c367fSLinJiawei  redirectOutValid := io.out.valid && isBranch
380151e3043SLinJiawei  redirectOut := DontCare
381bfb958a3SYinan Xu  redirectOut.level := RedirectLevel.flushAfter
382e18c367fSLinJiawei  redirectOut.roqIdx := uop.roqIdx
383cde9280dSLinJiawei  redirectOut.ftqIdx := uop.cf.ftqPtr
384cde9280dSLinJiawei  redirectOut.ftqOffset := uop.cf.ftqOffset
385e2203130SLinJiawei  redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict
386e2203130SLinJiawei  redirectOut.cfiUpdate.taken := dataModule.io.taken
387cde9280dSLinJiawei  redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken
388151e3043SLinJiawei
389e18c367fSLinJiawei  io.in.ready := io.out.ready
390e18c367fSLinJiawei  io.out.valid := valid
391e18c367fSLinJiawei  io.out.bits.uop <> io.in.bits.uop
392e2203130SLinJiawei  io.out.bits.data := dataModule.io.result
393e18c367fSLinJiawei}
394