]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fixed sign-extend bug for compares (just putting imm in a reg, for now) - test_bzip...
authorCerion Armour-Brown <cerion@valgrind.org>
Thu, 3 Mar 2005 02:21:22 +0000 (02:21 +0000)
committerCerion Armour-Brown <cerion@valgrind.org>
Thu, 3 Mar 2005 02:21:22 +0000 (02:21 +0000)
Load small imm's more simply in mk_iMOVds_RRI (move RI to R).

git-svn-id: svn://svn.valgrind.org/vex/trunk@996

VEX/priv/host-ppc32/isel.c

index 309a563617174700d99c635353194b5c652f1da6..fca71c412020cca09c3636b0918bb250bd5ea68e 100644 (file)
@@ -334,18 +334,22 @@ static PPC32Instr* mk_iMOVds_RRI ( ISelEnv* env, HReg dst, PPC32RI* src )
    // Note: In this context, GPR0 is NOT read -> just gives _value_ 0
    HReg zero = hregPPC32_GPR0();
 
-   if (src->tag == Pri_Imm &&
-       src->Pri.Imm.imm32 > 0xFFFF) {
+   if (src->tag == Pri_Imm) {
       UInt imm = src->Pri.Imm.imm32;
-      // CAB: addis (aka lis) would be good...
-      addInstr(env, PPC32Instr_Alu32(Palu_ADD, dst, zero, PPC32RI_Imm(imm>>16)));
-      addInstr(env, mk_sh32(env, Psh_SHL, dst, dst, PPC32RI_Imm(16)));
-      return PPC32Instr_Alu32(Palu_OR, dst, dst, PPC32RI_Imm(imm & 0xFFFF));
-   } else {
-      // Load immediate _without_ sign extend
-      addInstr(env, PPC32Instr_Alu32(Palu_ADD, dst, zero, PPC32RI_Imm(0)));
-      return PPC32Instr_Alu32(Palu_OR, dst, dst, src);
+      if (imm >= 0xFFFF8000 || imm <= 0x7FFF) { // sign-extendable from 16 bits?
+         return PPC32Instr_Alu32(Palu_ADD, dst, zero, PPC32RI_Imm(imm & 0xFFFF));
+      }
+      if (imm > 0xFFFF) {
+         // CAB: addis (aka lis) would be good...
+         addInstr(env, PPC32Instr_Alu32(Palu_ADD, dst, zero, PPC32RI_Imm(imm>>16)));
+         addInstr(env, mk_sh32(env, Psh_SHL, dst, dst, PPC32RI_Imm(16)));
+         return PPC32Instr_Alu32(Palu_OR, dst, dst, PPC32RI_Imm(imm & 0xFFFF));
+      }
    }
+
+   // Load immediate _without_ sign extend
+   addInstr(env, PPC32Instr_Alu32(Palu_ADD, dst, zero, PPC32RI_Imm(0)));
+   return PPC32Instr_Alu32(Palu_OR, dst, dst, src);
 }
 
 /* If imm > 0xffff, mov to reg first */
@@ -1580,7 +1584,9 @@ static PPC32CondCode iselCondCode_wrk ( ISelEnv* env, IRExpr* e )
            || e->Iex.Binop.op == Iop_CmpLE32S
            || e->Iex.Binop.op == Iop_CmpLE32U)) {
       HReg     r1  = iselIntExpr_R(env, e->Iex.Binop.arg1);
-      PPC32RI* ri2 = iselIntExpr_RI(env, e->Iex.Binop.arg2);
+      PPC32RI* ri2 = PPC32RI_Reg(
+         mk_RItoR(env, iselIntExpr_RI(env, e->Iex.Binop.arg2)));
+
       PPC32CmpOp cmp_op = Pcmp_U;
       if (e->Iex.Binop.op == Iop_CmpLT32S ||
           e->Iex.Binop.op == Iop_CmpLE32S) {