Index: src/s390/macro-assembler-s390.cc |
diff --git a/src/s390/macro-assembler-s390.cc b/src/s390/macro-assembler-s390.cc |
index a38fdc54adfaf2b05bc796d869a412680f1ca10a..de68c352734828d7e24557bded9ab39f51e38736 100644 |
--- a/src/s390/macro-assembler-s390.cc |
+++ b/src/s390/macro-assembler-s390.cc |
@@ -4334,9 +4334,16 @@ void MacroAssembler::LoadDoubleLiteral(DoubleRegister result, uint64_t value, |
uint32_t lo_32 = static_cast<uint32_t>(value); |
// Load the 64-bit value into a GPR, then transfer it to FPR via LDGR |
- iihf(scratch, Operand(hi_32)); |
- iilf(scratch, Operand(lo_32)); |
- ldgr(result, scratch); |
+ if (value == 0) { |
+ lzdr(result); |
+ } else if (lo_32 == 0) { |
+ llihf(scratch, Operand(hi_32)); |
+ ldgr(result, scratch); |
+ } else { |
+ iihf(scratch, Operand(hi_32)); |
+ iilf(scratch, Operand(lo_32)); |
+ ldgr(result, scratch); |
+ } |
} |
void MacroAssembler::LoadDoubleLiteral(DoubleRegister result, double value, |
@@ -4347,13 +4354,9 @@ void MacroAssembler::LoadDoubleLiteral(DoubleRegister result, double value, |
void MacroAssembler::LoadFloat32Literal(DoubleRegister result, float value, |
Register scratch) { |
- uint32_t hi_32 = bit_cast<uint32_t>(value); |
- uint32_t lo_32 = 0; |
- |
- // Load the 64-bit value into a GPR, then transfer it to FPR via LDGR |
- iihf(scratch, Operand(hi_32)); |
- iilf(scratch, Operand(lo_32)); |
- ldgr(result, scratch); |
+ uint64_t int_val = static_cast<uint64_t>(bit_cast<uint32_t, float>(value)) |
+ << 32; |
+ LoadDoubleLiteral(result, int_val, scratch); |
} |
void MacroAssembler::CmpSmiLiteral(Register src1, Smi* smi, Register scratch) { |