1package xiangshan.backend.fu.fpu 2 3import chisel3._ 4import hardfloat.INToRecFN 5import utils.{SignExt, ZeroExt} 6 7class IntToFP extends FPUSubModule { 8 9 val ctrl = io.in.bits.uop.ctrl.fpu 10 val tag = ctrl.typeTagIn 11 val typ = ctrl.typ 12 val wflags = ctrl.wflags 13 val src1 = io.in.bits.src(0)(XLEN-1, 0) 14 15 val mux = Wire(new Bundle() { 16 val data = UInt(XLEN.W) 17 val exc = UInt(5.W) 18 }) 19 mux.data := recode(src1, tag) 20 mux.exc := 0.U 21 22 val intValue = Mux(typ(1), 23 Mux(typ(0), ZeroExt(src1, XLEN), SignExt(src1, XLEN)), 24 Mux(typ(0), ZeroExt(src1(31, 0), XLEN), SignExt(src1(31, 0), XLEN)) 25 ) 26 27 when(wflags){ 28 val i2fResults = for(t <- floatTypes) yield { 29 val i2f = Module(new INToRecFN(XLEN, t.exp, t.sig)) 30 i2f.io.signedIn := ~typ(0) 31 i2f.io.in := intValue 32 i2f.io.roundingMode := rm 33 i2f.io.detectTininess := hardfloat.consts.tininess_afterRounding 34 (sanitizeNaN(i2f.io.out, t), i2f.io.exceptionFlags) 35 } 36 val (data, exc) = i2fResults.unzip 37 mux.data := VecInit(data)(tag) 38 mux.exc := VecInit(exc)(tag) 39 } 40 41 fflags := mux.exc 42 io.out.bits.uop := io.in.bits.uop 43 io.out.bits.data := mux.data 44 io.out.valid := io.in.valid 45 io.in.ready := io.out.ready 46} 47