diff options
author | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2010-11-09 15:31:00 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2010-11-21 16:54:35 -0800 |
commit | 63729473a588960ade22d42b94bcd1fa7fb11e71 (patch) | |
tree | 6a7f836c0ca09b8806e057e92590c3924fbc13ea /pk/fp.c | |
parent | 3f0c7368c8fdc805bb1819c86128e46e9b18a200 (diff) | |
download | pk-63729473a588960ade22d42b94bcd1fa7fb11e71.zip pk-63729473a588960ade22d42b94bcd1fa7fb11e71.tar.gz pk-63729473a588960ade22d42b94bcd1fa7fb11e71.tar.bz2 |
[opcodes, pk, sim, xcc] Tweaked FP encoding
Diffstat (limited to 'pk/fp.c')
-rw-r--r-- | pk/fp.c | 42 |
1 files changed, 9 insertions, 33 deletions
@@ -54,7 +54,7 @@ int emulate_fp(trapframe_t* tf) uint64_t effective_address_store = XRS1 + bimm; softfloat_exceptionFlags = 0; - softfloat_roundingMode = (fp_state.fsr >> 5) & 3; + softfloat_roundingMode = (RM & 4) ? (RM & 3) : ((fp_state.fsr >> 5) & 3); #define IS_INSN(x) ((tf->insn & MASK_ ## x) == MATCH_ ## x) @@ -172,46 +172,22 @@ int emulate_fp(trapframe_t* tf) set_fp_reg(RRD, 0, f32_sqrt(frs1s)); else if(IS_INSN(SQRT_D)) set_fp_reg(RRD, 1, f64_sqrt(frs1d)); - else if(IS_INSN(CVT_W_S_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVT_W_S)) XRDR = f32_to_i32_r_minMag(frs1s,true); - } - else if(IS_INSN(CVT_W_D_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVT_W_D)) XRDR = f64_to_i32_r_minMag(frs1d,true); - } - else if(IS_INSN(CVT_L_S_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVT_L_S)) XRDR = f32_to_i64_r_minMag(frs1s,true); - } - else if(IS_INSN(CVT_L_D_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVT_L_D)) XRDR = f64_to_i64_r_minMag(frs1d,true); - } - else if(IS_INSN(CVTU_W_S_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVTU_W_S)) XRDR = f32_to_ui32_r_minMag(frs1s,true); - } - else if(IS_INSN(CVTU_W_D_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVTU_W_D)) XRDR = f64_to_ui32_r_minMag(frs1d,true); - } - else if(IS_INSN(CVTU_L_S_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVTU_L_S)) XRDR = f32_to_ui64_r_minMag(frs1s,true); - } - else if(IS_INSN(CVTU_L_D_RM)) - { - softfloat_roundingMode = RM; + else if(IS_INSN(CVTU_L_D)) XRDR = f64_to_ui64_r_minMag(frs1d,true); - } else return -1; |