Chromium Code Reviews| Index: src/mips64/macro-assembler-mips64.cc |
| diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc |
| index fcc602bbffd4a816b61cefd53e276090814b6e7c..6e832e7fed5d0546a982e107784720245dea6080 100644 |
| --- a/src/mips64/macro-assembler-mips64.cc |
| +++ b/src/mips64/macro-assembler-mips64.cc |
| @@ -1358,6 +1358,27 @@ void MacroAssembler::li(Register dst, Handle<Object> value, LiFlags mode) { |
| } |
| } |
| +static inline int64_t shiftAndFixSignExtension(int64_t imm, int bitnum) { |
|
balazs.kilvady
2016/02/25 14:14:03
Name should be ShiftAndFixSignExtension().
Alan Li
2016/02/25 14:48:12
Done.
|
| + if ((imm >> (bitnum - 1)) & 0x1) { |
| + imm = (imm >> bitnum) + 1; |
| + } else { |
| + imm = imm >> bitnum; |
| + } |
| + return imm; |
| +} |
| + |
| +inline void MacroAssembler::liLower32BitHelper(Register rd, Operand j) { |
| + if (is_int16(j.imm64_)) { |
| + daddiu(rd, zero_reg, (j.imm64_ & kImm16Mask)); |
| + } else if (!(j.imm64_ & kHiMask)) { |
| + ori(rd, zero_reg, (j.imm64_ & kImm16Mask)); |
| + } else if (!(j.imm64_ & kImm16Mask)) { |
| + lui(rd, (j.imm64_ >> kLuiShift) & kImm16Mask); |
| + } else { |
| + lui(rd, (j.imm64_ >> kLuiShift) & kImm16Mask); |
| + ori(rd, rd, (j.imm64_ & kImm16Mask)); |
| + } |
| +} |
| void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
| DCHECK(!j.is_reg()); |
| @@ -1365,43 +1386,17 @@ void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
| if (!MustUseReg(j.rmode_) && mode == OPTIMIZE_SIZE) { |
| // Normal load of an immediate value which does not need Relocation Info. |
| if (is_int32(j.imm64_)) { |
| - if (is_int16(j.imm64_)) { |
| - daddiu(rd, zero_reg, (j.imm64_ & kImm16Mask)); |
| - } else if (!(j.imm64_ & kHiMask)) { |
| - ori(rd, zero_reg, (j.imm64_ & kImm16Mask)); |
| - } else if (!(j.imm64_ & kImm16Mask)) { |
| - lui(rd, (j.imm64_ >> kLuiShift) & kImm16Mask); |
| - } else { |
| - lui(rd, (j.imm64_ >> kLuiShift) & kImm16Mask); |
| - ori(rd, rd, (j.imm64_ & kImm16Mask)); |
| - } |
| + liLower32BitHelper(rd, j); |
| } else { |
| if (kArchVariant == kMips64r6) { |
| int64_t imm = j.imm64_; |
| - bool lui_emited = false; |
| - if (((imm >> kLuiShift) & kImm16Mask) != 0) { |
| - lui(rd, (imm >> kLuiShift) & kImm16Mask); |
| - lui_emited = true; |
| - } |
| - if ((imm & kImm16Mask) != 0) { |
| - ori(rd, rd, (imm & kImm16Mask)); |
| - } else if (!lui_emited) { |
| - or_(rd, zero_reg, zero_reg); |
| - } |
| - if ((imm >> 31) & 0x1) { |
| - imm = (imm >> 32) + 1; |
| - } else { |
| - imm = imm >> 32; |
| - } |
| + liLower32BitHelper(rd, j); |
| + imm = shiftAndFixSignExtension(imm, 32); |
| if (imm & kImm16Mask) { |
| dahi(rd, imm & kImm16Mask); |
| } |
| if (!is_int48(j.imm64_)) { |
| - if ((imm >> 15) & 0x1) { |
| - imm = (imm >> 16) + 1; |
| - } else { |
| - imm = imm >> 16; |
| - } |
| + imm = shiftAndFixSignExtension(imm, 16); |
| if (imm & kImm16Mask) { |
| dati(rd, imm & kImm16Mask); |
| } |