Add fclass.{s|d} instructions
This commit is contained in:
		| @@ -232,6 +232,8 @@ object FDecode extends DecodeConstants | ||||
|     FNMADD_D->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,N,CSR.N,N,N,N,N,N,N), | ||||
|     FNMSUB_S->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,N,CSR.N,N,N,N,N,N,N), | ||||
|     FNMSUB_D->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,N,CSR.N,N,N,N,N,N,N), | ||||
|     FCLASS_S->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,Y,CSR.N,N,N,N,N,N,N), | ||||
|     FCLASS_D->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,Y,CSR.N,N,N,N,N,N,N), | ||||
|     FMV_X_S->   List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,Y,CSR.N,N,N,N,N,N,N), | ||||
|     FMV_X_D->   List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,Y,CSR.N,N,N,N,N,N,N), | ||||
|     FCVT_W_S->  List(Y,    Y,N,BR_N,  N,N,N,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,      MT_X, N,N,Y,CSR.N,N,N,N,N,N,N), | ||||
|   | ||||
| @@ -34,6 +34,7 @@ object FPConstants | ||||
|   val FCMD_MIN =        Bits("b011000") | ||||
|   val FCMD_MAX =        Bits("b011001") | ||||
|   val FCMD_MFTX =       Bits("b011100") | ||||
|   val FCMD_CLASS =      Bits("b011101") | ||||
|   val FCMD_MXTF =       Bits("b011110") | ||||
|   val FCMD_MADD =       Bits("b100100") | ||||
|   val FCMD_MSUB =       Bits("b100101") | ||||
| @@ -91,6 +92,8 @@ class FPUDecoder extends Module | ||||
|           FCVT_D_LU-> List(FCMD_CVT_FMT_LU,Y,N,N,N,N,Y,N,N,N,Y), | ||||
|           FMV_X_S  -> List(FCMD_MFTX,      N,Y,N,N,Y,N,Y,N,N,Y), | ||||
|           FMV_X_D  -> List(FCMD_MFTX,      N,Y,N,N,N,N,Y,N,N,Y), | ||||
|           FCLASS_S -> List(FCMD_CLASS,     N,Y,N,N,Y,N,Y,N,N,Y), | ||||
|           FCLASS_D -> List(FCMD_CLASS,     N,Y,N,N,N,N,Y,N,N,Y), | ||||
|           FCVT_W_S -> List(FCMD_CVT_W_FMT, N,Y,N,N,Y,N,Y,N,N,Y), | ||||
|           FCVT_WU_S-> List(FCMD_CVT_WU_FMT,N,Y,N,N,Y,N,Y,N,N,Y), | ||||
|           FCVT_L_S -> List(FCMD_CVT_L_FMT, N,Y,N,N,Y,N,Y,N,N,Y), | ||||
| @@ -203,7 +206,7 @@ class FPToInt extends Module | ||||
|     when (io.in.bits.cmd === FCMD_STORE) { | ||||
|       in.in1 := io.in.bits.in2 | ||||
|     }.otherwise { | ||||
|       val doUpconvert = io.in.bits.single && io.in.bits.cmd != FCMD_MFTX | ||||
|       val doUpconvert = io.in.bits.single && io.in.bits.cmd != FCMD_MFTX && io.in.bits.cmd != FCMD_CLASS | ||||
|       in.in1 := Mux(doUpconvert, upconvert(io.in.bits.in1), io.in.bits.in1) | ||||
|       in.in2 := Mux(doUpconvert, upconvert(io.in.bits.in2), io.in.bits.in2) | ||||
|     } | ||||
| @@ -236,6 +239,11 @@ class FPToInt extends Module | ||||
|     io.out.bits.toint := d2i._1 | ||||
|     io.out.bits.exc := d2i._2 | ||||
|   } | ||||
|   when (in.cmd === FCMD_CLASS) { | ||||
|     val classify_s = hardfloat.recodedFloatNClassify(in.in1, 23, 9) | ||||
|     val classify_d = hardfloat.recodedFloatNClassify(in.in1, 52, 12) | ||||
|     io.out.bits.toint := Mux(in.single, classify_s, classify_d) | ||||
|   } | ||||
|   when (in.cmd === FCMD_EQ || in.cmd === FCMD_LT || in.cmd === FCMD_LE) { | ||||
|     io.out.bits.toint := dcmp_out | ||||
|     io.out.bits.exc := dcmp_exc | ||||
|   | ||||
| @@ -146,6 +146,8 @@ object Instructions { | ||||
|   def FMAX_D             = Bits("b1100101??????????000?????1010011") | ||||
|   def FMV_X_S            = Bits("b111000000000?????000?????1010011") | ||||
|   def FMV_X_D            = Bits("b111000100000?????000?????1010011") | ||||
|   def FCLASS_S           = Bits("b111010000000?????000?????1010011") | ||||
|   def FCLASS_D           = Bits("b111010100000?????000?????1010011") | ||||
|   def FMV_S_X            = Bits("b111100000000?????000?????1010011") | ||||
|   def FMV_D_X            = Bits("b111100100000?????000?????1010011") | ||||
|   def FLW                = Bits("b?????????????????010?????0000111") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user