| Index: src/compiler/s390/code-generator-s390.cc
|
| diff --git a/src/compiler/s390/code-generator-s390.cc b/src/compiler/s390/code-generator-s390.cc
|
| index 68c1d9d587a4837e4ae022afd1224b3929688e30..1d9685668ed735171083f6bbc573fd5ee4493cf1 100644
|
| --- a/src/compiler/s390/code-generator-s390.cc
|
| +++ b/src/compiler/s390/code-generator-s390.cc
|
| @@ -1307,8 +1307,8 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| #endif
|
| case kS390_Push:
|
| if (instr->InputAt(0)->IsDoubleRegister()) {
|
| - __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
|
| __ lay(sp, MemOperand(sp, -kDoubleSize));
|
| + __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp));
|
| frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize);
|
| } else {
|
| __ Push(i.InputRegister(0));
|
| @@ -1317,14 +1317,14 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| break;
|
| case kS390_PushFrame: {
|
| int num_slots = i.InputInt32(1);
|
| + __ lay(sp, MemOperand(sp, -num_slots * kPointerSize));
|
| if (instr->InputAt(0)->IsDoubleRegister()) {
|
| __ StoreDouble(i.InputDoubleRegister(0),
|
| - MemOperand(sp, -num_slots * kPointerSize));
|
| + MemOperand(sp));
|
| } else {
|
| __ StoreP(i.InputRegister(0),
|
| - MemOperand(sp, -num_slots * kPointerSize));
|
| + MemOperand(sp));
|
| }
|
| - __ lay(sp, MemOperand(sp, -num_slots * kPointerSize));
|
| break;
|
| }
|
| case kS390_StoreToStackSlot: {
|
| @@ -1499,36 +1499,30 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
|
| break;
|
| case kS390_DoubleExtractLowWord32:
|
| - // TODO(john.yan): this can cause problem when interrupting,
|
| - // use freg->greg instruction
|
| - __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
|
| - __ LoadlW(i.OutputRegister(),
|
| - MemOperand(sp, -kDoubleSize + Register::kMantissaOffset));
|
| + __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0));
|
| + __ llgfr(i.OutputRegister(), i.OutputRegister());
|
| break;
|
| case kS390_DoubleExtractHighWord32:
|
| - // TODO(john.yan): this can cause problem when interrupting,
|
| - // use freg->greg instruction
|
| - __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
|
| - __ LoadlW(i.OutputRegister(),
|
| - MemOperand(sp, -kDoubleSize + Register::kExponentOffset));
|
| + __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0));
|
| + __ srlg(i.OutputRegister(), i.OutputRegister(), Operand(32));
|
| break;
|
| case kS390_DoubleInsertLowWord32:
|
| - __ InsertDoubleLow(i.OutputDoubleRegister(), i.InputRegister(1));
|
| + __ lgdr(kScratchReg, i.OutputDoubleRegister());
|
| + __ lr(kScratchReg, i.InputRegister(1));
|
| + __ ldgr(i.OutputDoubleRegister(), kScratchReg);
|
| break;
|
| case kS390_DoubleInsertHighWord32:
|
| - __ InsertDoubleHigh(i.OutputDoubleRegister(), i.InputRegister(1));
|
| + __ sllg(kScratchReg, i.InputRegister(1), Operand(32));
|
| + __ lgdr(r0, i.OutputDoubleRegister());
|
| + __ lr(kScratchReg, r0);
|
| + __ ldgr(i.OutputDoubleRegister(), kScratchReg);
|
| break;
|
| case kS390_DoubleConstruct:
|
| -// TODO(john.yan): this can cause problem when interrupting,
|
| -// use greg->freg instruction
|
| -#if V8_TARGET_LITTLE_ENDIAN
|
| - __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize / 2));
|
| - __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize));
|
| -#else
|
| - __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize / 2));
|
| - __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize));
|
| -#endif
|
| - __ ldy(i.OutputDoubleRegister(), MemOperand(sp, -kDoubleSize));
|
| + __ sllg(kScratchReg, i.InputRegister(0), Operand(32));
|
| + __ lr(kScratchReg, i.InputRegister(1));
|
| +
|
| + // Bitwise convert from GPR to FPR
|
| + __ ldgr(i.OutputDoubleRegister(), kScratchReg);
|
| break;
|
| case kS390_LoadWordS8:
|
| ASSEMBLE_LOAD_INTEGER(LoadlB);
|
|
|