Fixed signed integer comparisons
PATCH 1/1 Fixed signed integer comparisons
Hi all,
One more patch for MIPS64 support. It fixes signed integer comparison. The compared value should be casted to target_long (ie int32_t on MIPS32 and int64_t on MIPS64) in order for the comparisons to work in all cases.
With this patch I am able to get my o32 system working with a 64-bit kernel. I have seen no problem so far.
n32 binaries also works correctly, though I haven't done extensive tests. I have only built small C/C++ softwares and tested them.
64-bit binaries are not working correctly. I get a "Bus error" within ld-2.5.so, so I guess there is still some parts to fix in the MMU emulation.
Cheers,
Aurelien
Index: target-mips/op.c
===================================================================
RCS file: /sources/qemu/qemu/target-mips/op.c,v
retrieving revision 1.57
op.c +6 -6
@@ -928,14 +928,14 @@ void glue(op_, name) (void) \OP_COND (eq,T0 ==T1 );OP_COND (ne,T0 !=T1 ); -OP_COND (ge, (int32_t )T0 >= (int32_t )T1 ); +OP_COND (ge, (target_long )T0 >= (target_long )T1 );OP_COND (geu,T0 >=T1 ); -OP_COND (lt, (int32_t )T0 < (int32_t )T1 ); +OP_COND (lt, (target_long )T0 < (target_long )T1 );OP_COND (ltu,T0 <T1 ); -OP_COND (gez, (int32_t )T0 >=0 ); -OP_COND (gtz, (int32_t )T0 >0 ); -OP_COND (lez, (int32_t )T0 <=0 ); -OP_COND (ltz, (int32_t )T0 <0 ); +OP_COND (gez, (target_long )T0 >=0 ); +OP_COND (gtz, (target_long )T0 >0 ); +OP_COND (lez, (target_long )T0 <=0 ); +OP_COND (ltz, (target_long )T0 <0 );/* Branches */ void OPPROTO op_goto_tb0(void)
Index: target-mips/translate.c
===================================================================
RCS file: /sources/qemu/qemu/target-mips/translate.c,v retrieving revision 1.80
translate.c +2 -2
@@ -919,7 +921,7 @@ static void gen_flt_ldst (DisasContext *static void gen_arith_imm (DisasContext *ctx,uint32_t opc,int rt,int rs,int16_t imm) { -uint32_t uimm; +target_ulong uimm;const char *opn ="imm arith" ;if (rt ==0 && opc !=OPC_ADDI && opc !=OPC_DADDI ) {
@@ -939,7 +941,7 @@ static void gen_arith_imm (DisasContext#endif case OPC_SLTI :case OPC_SLTIU : - uimm = (int32_t )imm;/* Sign extend to 32 bits */ + uimm = (target_long )imm;/* Sign extend to 32/64 bits */ /* Fall through. */ case OPC_ANDI :case OPC_ORI :
Signature · 4 lines
.''`. Aurelien Jarno | GPG: 1024D/F1BCDB73 : :' : Debian developer | Electrical Engineer `. `' [email protected] | [email protected] `- people.debian.org/~aurel32 | www.aurel32.net