Index: src/mips64/macro-assembler-mips64.cc |
diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc |
index e60ba6a7c92a4f0a270de5de9b38828029803cfd..632a484a7634b73336778e061823bed44be8e3bb 100644 |
--- a/src/mips64/macro-assembler-mips64.cc |
+++ b/src/mips64/macro-assembler-mips64.cc |
@@ -1320,39 +1320,71 @@ void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
ori(rd, rd, (j.imm64_ & kImm16Mask)); |
} |
} else { |
- if (is_int48(j.imm64_)) { |
- if ((j.imm64_ >> 32) & kImm16Mask) { |
- lui(rd, (j.imm64_ >> 32) & kImm16Mask); |
- if ((j.imm64_ >> 16) & kImm16Mask) { |
- ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
- } |
+ 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 { |
- ori(rd, zero_reg, (j.imm64_ >> 16) & kImm16Mask); |
+ imm = imm >> 32; |
} |
- dsll(rd, rd, 16); |
- if (j.imm64_ & kImm16Mask) { |
- ori(rd, rd, j.imm64_ & kImm16Mask); |
+ if (imm & kImm16Mask) { |
+ dahi(rd, imm & kImm16Mask); |
} |
- } else { |
- lui(rd, (j.imm64_ >> 48) & kImm16Mask); |
- if ((j.imm64_ >> 32) & kImm16Mask) { |
- ori(rd, rd, (j.imm64_ >> 32) & kImm16Mask); |
+ if (!is_int48(j.imm64_)) { |
+ if ((imm >> 15) & 0x1) { |
+ imm = (imm >> 16) + 1; |
+ } else { |
+ imm = imm >> 16; |
+ } |
+ if (imm & kImm16Mask) { |
+ dati(rd, imm & kImm16Mask); |
+ } |
} |
- if ((j.imm64_ >> 16) & kImm16Mask) { |
+ } else { |
+ if (is_int48(j.imm64_)) { |
+ if ((j.imm64_ >> 32) & kImm16Mask) { |
+ lui(rd, (j.imm64_ >> 32) & kImm16Mask); |
+ if ((j.imm64_ >> 16) & kImm16Mask) { |
+ ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
+ } |
+ } else { |
+ ori(rd, zero_reg, (j.imm64_ >> 16) & kImm16Mask); |
+ } |
dsll(rd, rd, 16); |
- ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
if (j.imm64_ & kImm16Mask) { |
- dsll(rd, rd, 16); |
ori(rd, rd, j.imm64_ & kImm16Mask); |
- } else { |
- dsll(rd, rd, 16); |
} |
} else { |
- if (j.imm64_ & kImm16Mask) { |
- dsll32(rd, rd, 0); |
- ori(rd, rd, j.imm64_ & kImm16Mask); |
+ lui(rd, (j.imm64_ >> 48) & kImm16Mask); |
+ if ((j.imm64_ >> 32) & kImm16Mask) { |
+ ori(rd, rd, (j.imm64_ >> 32) & kImm16Mask); |
+ } |
+ if ((j.imm64_ >> 16) & kImm16Mask) { |
+ dsll(rd, rd, 16); |
+ ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
+ if (j.imm64_ & kImm16Mask) { |
+ dsll(rd, rd, 16); |
+ ori(rd, rd, j.imm64_ & kImm16Mask); |
+ } else { |
+ dsll(rd, rd, 16); |
+ } |
} else { |
- dsll32(rd, rd, 0); |
+ if (j.imm64_ & kImm16Mask) { |
+ dsll32(rd, rd, 0); |
+ ori(rd, rd, j.imm64_ & kImm16Mask); |
+ } else { |
+ dsll32(rd, rd, 0); |
+ } |
} |
} |
} |
@@ -1371,12 +1403,32 @@ void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
dsll(rd, rd, 16); |
ori(rd, rd, j.imm64_ & kImm16Mask); |
} else { |
- lui(rd, (j.imm64_ >> 48) & kImm16Mask); |
- ori(rd, rd, (j.imm64_ >> 32) & kImm16Mask); |
- dsll(rd, rd, 16); |
- ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
- dsll(rd, rd, 16); |
- ori(rd, rd, j.imm64_ & kImm16Mask); |
+ if (kArchVariant == kMips64r6) { |
+ int64_t imm = j.imm64_; |
+ lui(rd, (imm >> kLuiShift) & kImm16Mask); |
+ if (imm & kImm16Mask) { |
+ ori(rd, rd, (imm & kImm16Mask)); |
+ } |
+ if ((imm >> 31) & 0x1) { |
+ imm = (imm >> 32) + 1; |
+ } else { |
+ imm = imm >> 32; |
+ } |
+ dahi(rd, imm & kImm16Mask); |
+ if ((imm >> 15) & 0x1) { |
+ imm = (imm >> 16) + 1; |
+ } else { |
+ imm = imm >> 16; |
+ } |
+ dati(rd, imm & kImm16Mask); |
+ } else { |
+ lui(rd, (j.imm64_ >> 48) & kImm16Mask); |
+ ori(rd, rd, (j.imm64_ >> 32) & kImm16Mask); |
+ dsll(rd, rd, 16); |
+ ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |
+ dsll(rd, rd, 16); |
+ ori(rd, rd, j.imm64_ & kImm16Mask); |
+ } |
} |
} |