Revision: 10644
Author:   [email protected]
Date:     Wed Feb  8 06:41:10 2012
Log:      MIPS: Don't allow large immediates for certain instructions.

Some instructions can use >16 bit immediates if they represent a <=16 bit signed value. However some logical instructions (andi, xori, ori, lui) should always treat the immediate value as unsigned. This patch adds an ASSERT to these places and a minor change to MacroAssembler::li to satisfy this.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/9309077
Patch from Daniel Kalmar <[email protected]>.
http://code.google.com/p/v8/source/detail?r=10644

Modified:
 /branches/bleeding_edge/src/mips/assembler-mips.cc
 /branches/bleeding_edge/src/mips/macro-assembler-mips.cc

=======================================
--- /branches/bleeding_edge/src/mips/assembler-mips.cc Fri Jan 13 05:09:52 2012 +++ /branches/bleeding_edge/src/mips/assembler-mips.cc Wed Feb 8 06:41:10 2012
@@ -1245,6 +1245,7 @@


 void Assembler::andi(Register rt, Register rs, int32_t j) {
+  ASSERT(is_uint16(j));
   GenInstrImmediate(ANDI, rs, rt, j);
 }

@@ -1255,6 +1256,7 @@


 void Assembler::ori(Register rt, Register rs, int32_t j) {
+  ASSERT(is_uint16(j));
   GenInstrImmediate(ORI, rs, rt, j);
 }

@@ -1265,6 +1267,7 @@


 void Assembler::xori(Register rt, Register rs, int32_t j) {
+  ASSERT(is_uint16(j));
   GenInstrImmediate(XORI, rs, rt, j);
 }

@@ -1445,6 +1448,7 @@


 void Assembler::lui(Register rd, int32_t j) {
+  ASSERT(is_uint16(j));
   GenInstrImmediate(LUI, zero_reg, rd, j);
 }

=======================================
--- /branches/bleeding_edge/src/mips/macro-assembler-mips.cc Tue Jan 31 04:45:27 2012 +++ /branches/bleeding_edge/src/mips/macro-assembler-mips.cc Wed Feb 8 06:41:10 2012
@@ -771,18 +771,18 @@
     } else if (!(j.imm32_ & kHiMask)) {
       ori(rd, zero_reg, j.imm32_);
     } else if (!(j.imm32_ & kImm16Mask)) {
-      lui(rd, (j.imm32_ & kHiMask) >> kLuiShift);
+      lui(rd, (j.imm32_ >> kLuiShift) & kImm16Mask);
     } else {
-      lui(rd, (j.imm32_ & kHiMask) >> kLuiShift);
+      lui(rd, (j.imm32_ >> kLuiShift) & kImm16Mask);
       ori(rd, rd, (j.imm32_ & kImm16Mask));
     }
   } else if (MustUseReg(j.rmode_) || gen2instr) {
     if (MustUseReg(j.rmode_)) {
       RecordRelocInfo(j.rmode_, j.imm32_);
     }
- // We need always the same number of instructions as we may need to patch + // We always need the same number of instructions as we may need to patch // this code to load another value which may need 2 instructions to load.
-    lui(rd, (j.imm32_ & kHiMask) >> kLuiShift);
+    lui(rd, (j.imm32_ >> kLuiShift) & kImm16Mask);
     ori(rd, rd, (j.imm32_ & kImm16Mask));
   }
 }

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to