aboutsummaryrefslogtreecommitdiff
path: root/pk/fp.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>2010-11-09 15:31:00 -0800
committerAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>2010-11-21 16:54:35 -0800
commit63729473a588960ade22d42b94bcd1fa7fb11e71 (patch)
tree6a7f836c0ca09b8806e057e92590c3924fbc13ea /pk/fp.c
parent3f0c7368c8fdc805bb1819c86128e46e9b18a200 (diff)
downloadpk-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.c42
1 files changed, 9 insertions, 33 deletions
diff --git a/pk/fp.c b/pk/fp.c
index a034c5a..7e83967 100644
--- a/pk/fp.c
+++ b/pk/fp.c
@@ -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;