diff --git a/src/s390/macro-assembler-s390.cc b/src/s390/macro-assembler-s390.cc index a38fdc54ad..de68c35273 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(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(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(bit_cast(value)) + << 32; + LoadDoubleLiteral(result, int_val, scratch); } void MacroAssembler::CmpSmiLiteral(Register src1, Smi* smi, Register scratch) {