* gencode.c (process_instructions): Call build_endian_shift when
authorIan Lance Taylor <ian@airs.com>
Fri, 20 Sep 1996 19:49:49 +0000 (19:49 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 20 Sep 1996 19:49:49 +0000 (19:49 +0000)
expanding STORE RIGHT, to fix swr.
* support.h (SIGNEXTEND): If the sign bit is not set, explicitly
clear the high bits.
* interp.c (Convert): Fix fmt_single to fmt_long to not truncate.
Fix float to int conversions to produce signed values.

sim/mips/gencode.c
sim/mips/support.h

index ff27ef6b53134087d8627f828879c7fad603e6df..dce648ae93ebdbf9b0d414c6c772aee28cb3e630 100644 (file)
@@ -1530,6 +1530,7 @@ process_instructions(doarch,features)
                       printf("     GPR[destreg] = SIGNEXTEND(GPR[destreg],32);\n");
                    } else { /* store */
                      printf("     memval = (op2 << (byte * 8));\n");
+                    build_endian_shift(proc64,datalen,2,s_left,32);
                      printf("     StoreMemory(uncached,(%s - byte),memval,paddr,vaddr,isREAL);\n",accesslength);
                    }
                  }
index b9bf0dd8f55c3c6dff9772562660d2531a5928e3..11f285c3724e8bee41bd6c5b6af9c1d04be773c9 100644 (file)
@@ -48,7 +48,10 @@ typedef unsigned long long uword64;
 /* Sign-extend the given value (e) as a value (b) bits long. We cannot
    assume the HI32bits of the operand are zero, so we must perform a
    mask to ensure we can use the simple subtraction to sign-extend. */
-#define SIGNEXTEND(e,b) (((e) & ((uword64)1 << ((b) - 1))) ? (((e) & (((uword64)1 << (b)) - 1)) - ((uword64)1 << (b))) : (e))
+#define SIGNEXTEND(e,b) \
+  (((e) & ((uword64) 1 << ((b) - 1))) \
+   ? (((e) & (((uword64) 1 << (b)) - 1)) - ((uword64)1 << (b))) \
+   : ((e) & (((((uword64) 1 << ((b) - 1)) - 1) << 1) | 1)))
 
 /* Check if a value will fit within a word (unsigned int): */
 #define NOTWORDVALUE(v) ((((((uword64)(v)>>32) == 0) && !((v) & ((unsigned)1 << 31))) || ((((uword64)(v)>>32) == 0xFFFFFFFF) && ((v) & ((unsigned)1 << 31)))) ? (1 == 0) : (1 == 1))