Commit 01fbc8c4 authored by Milad Fa's avatar Milad Fa Committed by Commit Bot

PPC/s390: [compiler] Fix pushing of arguments

Port 8798b3ef
Port 1d3c80d3

Original Commit Message:

    - Fixes some incorrect assumptions about padding in the
      code generation. Slots may have apparent extra padding
      when allocation fragments go unused.
    - Reworks 32 bit push code to simplify skipping slot gaps
      when 'push' instructions are used.
    - Adds a ElementSizeInPointers function on machine
      representations.

R=bbudge@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com
BUG=
LOG=N

Change-Id: I076ae8396434610c52fed040ace5e0f49ea3ef88
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2673142
Commit-Queue: Milad Fa <mfarazma@redhat.com>
Reviewed-by: 's avatarJunliang Yan <junyan@redhat.com>
Cr-Commit-Position: refs/heads/master@{#72516}
parent 1d3c80d3
...@@ -1712,52 +1712,37 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1712,52 +1712,37 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} }
case kPPC_Push: { case kPPC_Push: {
int stack_decrement = i.InputInt32(0); int stack_decrement = i.InputInt32(0);
if (instr->InputAt(1)->IsFPRegister()) { int slots = stack_decrement / kSystemPointerSize;
LocationOperand* op = LocationOperand::cast(instr->InputAt(1)); LocationOperand* op = LocationOperand::cast(instr->InputAt(1));
switch (op->representation()) { MachineRepresentation rep = op->representation();
case MachineRepresentation::kFloat32: int pushed_slots = ElementSizeInPointers(rep);
// 1 slot values are never padded. // Slot-sized arguments are never padded but there may be a gap if
DCHECK_EQ(stack_decrement, kSystemPointerSize); // the slot allocator reclaimed other padding slots. Adjust the stack
__ StoreSingleU(i.InputDoubleRegister(1), // here to skip any gap.
MemOperand(sp, -kSystemPointerSize), r0); if (slots > pushed_slots) {
frame_access_state()->IncreaseSPDelta(1); __ addi(sp, sp,
break; Operand(-((slots - pushed_slots) * kSystemPointerSize)));
case MachineRepresentation::kFloat64: }
// 2 slot values have up to 1 slot of padding. switch (rep) {
DCHECK_GE(stack_decrement, kDoubleSize); case MachineRepresentation::kFloat32:
if (stack_decrement > kDoubleSize) { __ StoreSingleU(i.InputDoubleRegister(1),
DCHECK_EQ(stack_decrement, kDoubleSize + kSystemPointerSize); MemOperand(sp, -kSystemPointerSize), r0);
__ addi(sp, sp, Operand(-kSystemPointerSize)); break;
} case MachineRepresentation::kFloat64:
__ StoreDoubleU(i.InputDoubleRegister(1), __ StoreDoubleU(i.InputDoubleRegister(1),
MemOperand(sp, -kDoubleSize), r0); MemOperand(sp, -kDoubleSize), r0);
frame_access_state()->IncreaseSPDelta(stack_decrement / break;
kSystemPointerSize); case MachineRepresentation::kSimd128:
break; __ addi(sp, sp, Operand(-kSimd128Size));
case MachineRepresentation::kSimd128: { __ StoreSimd128(i.InputSimd128Register(1), MemOperand(r0, sp), r0,
// 4 slot values have up to 3 slots of padding. kScratchSimd128Reg);
DCHECK_GE(stack_decrement, kSimd128Size); break;
if (stack_decrement > kSimd128Size) { default:
int padding = stack_decrement - kSimd128Size; __ StorePU(i.InputRegister(1), MemOperand(sp, -kSystemPointerSize),
DCHECK_LT(padding, kSimd128Size); r0);
__ addi(sp, sp, Operand(-padding)); break;
}
__ addi(sp, sp, Operand(-kSimd128Size));
__ StoreSimd128(i.InputSimd128Register(1), MemOperand(r0, sp), r0,
kScratchSimd128Reg);
frame_access_state()->IncreaseSPDelta(stack_decrement /
kSystemPointerSize);
break;
}
default:
UNREACHABLE();
break;
}
} else {
DCHECK_EQ(stack_decrement, kSystemPointerSize);
__ StorePU(i.InputRegister(1), MemOperand(sp, -kSystemPointerSize), r0);
frame_access_state()->IncreaseSPDelta(1);
} }
frame_access_state()->IncreaseSPDelta(slots);
DCHECK_EQ(LeaveRC, i.OutputRCBit()); DCHECK_EQ(LeaveRC, i.OutputRCBit());
break; break;
} }
......
...@@ -1962,52 +1962,37 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1962,52 +1962,37 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} }
case kS390_Push: { case kS390_Push: {
int stack_decrement = i.InputInt32(0); int stack_decrement = i.InputInt32(0);
if (instr->InputAt(1)->IsFPRegister()) { int slots = stack_decrement / kSystemPointerSize;
LocationOperand* op = LocationOperand::cast(instr->InputAt(1)); LocationOperand* op = LocationOperand::cast(instr->InputAt(1));
switch (op->representation()) { MachineRepresentation rep = op->representation();
case MachineRepresentation::kFloat32: int pushed_slots = ElementSizeInPointers(rep);
// 1 slot values are never padded. // Slot-sized arguments are never padded but there may be a gap if
DCHECK_EQ(stack_decrement, kSystemPointerSize); // the slot allocator reclaimed other padding slots. Adjust the stack
__ lay(sp, MemOperand(sp, -kSystemPointerSize)); // here to skip any gap.
__ StoreF32(i.InputDoubleRegister(1), MemOperand(sp)); if (slots > pushed_slots) {
frame_access_state()->IncreaseSPDelta(1); __ lay(sp,
break; MemOperand(sp, -((slots - pushed_slots) * kSystemPointerSize)));
case MachineRepresentation::kFloat64: }
// 2 slot values have up to 1 slot of padding. switch (rep) {
DCHECK_GE(stack_decrement, kDoubleSize); case MachineRepresentation::kFloat32:
if (stack_decrement > kDoubleSize) { __ lay(sp, MemOperand(sp, -kSystemPointerSize));
DCHECK_EQ(stack_decrement, kDoubleSize + kSystemPointerSize); __ StoreF32(i.InputDoubleRegister(1), MemOperand(sp));
__ lay(sp, MemOperand(sp, -kSystemPointerSize)); break;
} case MachineRepresentation::kFloat64:
__ lay(sp, MemOperand(sp, -kDoubleSize)); __ lay(sp, MemOperand(sp, -kDoubleSize));
__ StoreF64(i.InputDoubleRegister(1), MemOperand(sp)); __ StoreF64(i.InputDoubleRegister(1), MemOperand(sp));
frame_access_state()->IncreaseSPDelta(stack_decrement / break;
kSystemPointerSize); case MachineRepresentation::kSimd128:
break; __ lay(sp, MemOperand(sp, -kSimd128Size));
case MachineRepresentation::kSimd128: { __ StoreV128(i.InputDoubleRegister(1), MemOperand(sp), kScratchReg);
// 4 slot values have up to 3 slots of padding. break;
DCHECK_GE(stack_decrement, kSimd128Size); default:
if (stack_decrement > kSimd128Size) { __ Push(i.InputRegister(1));
int padding = stack_decrement - kSimd128Size; break;
DCHECK_LT(padding, kSimd128Size);
__ lay(sp, MemOperand(sp, -padding));
}
__ lay(sp, MemOperand(sp, -kSimd128Size));
__ StoreV128(i.InputDoubleRegister(1), MemOperand(sp), kScratchReg);
frame_access_state()->IncreaseSPDelta(stack_decrement /
kSystemPointerSize);
break;
}
default:
UNREACHABLE();
break;
}
} else {
DCHECK_EQ(stack_decrement, kSystemPointerSize);
__ Push(i.InputRegister(1));
frame_access_state()->IncreaseSPDelta(1);
} }
} break; frame_access_state()->IncreaseSPDelta(slots);
break;
}
case kS390_PushFrame: { case kS390_PushFrame: {
int num_slots = i.InputInt32(1); int num_slots = i.InputInt32(1);
__ lay(sp, MemOperand(sp, -num_slots * kSystemPointerSize)); __ lay(sp, MemOperand(sp, -num_slots * kSystemPointerSize));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment