Commit 0ac77409 authored by bjaideep's avatar bjaideep Committed by Commit bot

PPC/s390: [builtins] Construct builtin frame in String/Number ctors

Port d49d3864

R=jgruber@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, mbrandy@us.ibm.com

BUG=v8:5173
LOG=N

Review-Url: https://codereview.chromium.org/2141723003
Cr-Commit-Position: refs/heads/master@{#37659}
parent 1d26ed29
This diff is collapsed.
...@@ -1072,6 +1072,49 @@ int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) { ...@@ -1072,6 +1072,49 @@ int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) {
return frame_ends; return frame_ends;
} }
void MacroAssembler::EnterBuiltinFrame(Register context, Register target,
Register argc) {
int fp_delta = 0;
mflr(r0);
if (FLAG_enable_embedded_constant_pool) {
if (target.is_valid()) {
Push(r0, fp, kConstantPoolRegister, context, target);
fp_delta = 3;
} else {
Push(r0, fp, kConstantPoolRegister, context);
fp_delta = 2;
}
} else {
if (target.is_valid()) {
Push(r0, fp, context, target);
fp_delta = 2;
} else {
Push(r0, fp, context);
fp_delta = 1;
}
}
addi(fp, sp, Operand(fp_delta * kPointerSize));
Push(argc);
}
void MacroAssembler::LeaveBuiltinFrame(Register context, Register target,
Register argc) {
Pop(argc);
if (FLAG_enable_embedded_constant_pool) {
if (target.is_valid()) {
Pop(r0, fp, kConstantPoolRegister, context, target);
} else {
Pop(r0, fp, kConstantPoolRegister, context);
}
} else {
if (target.is_valid()) {
Pop(r0, fp, context, target);
} else {
Pop(r0, fp, context);
}
}
mtlr(r0);
}
// ExitFrame layout (probably wrongish.. needs updating) // ExitFrame layout (probably wrongish.. needs updating)
// //
......
...@@ -1526,6 +1526,9 @@ class MacroAssembler : public Assembler { ...@@ -1526,6 +1526,9 @@ class MacroAssembler : public Assembler {
// Returns the pc offset at which the frame ends. // Returns the pc offset at which the frame ends.
int LeaveFrame(StackFrame::Type type, int stack_adjustment = 0); int LeaveFrame(StackFrame::Type type, int stack_adjustment = 0);
void EnterBuiltinFrame(Register context, Register target, Register argc);
void LeaveBuiltinFrame(Register context, Register target, Register argc);
// Expects object in r3 and returns map with validated enum cache // Expects object in r3 and returns map with validated enum cache
// in r3. Assumes that any other register can be used as a scratch. // in r3. Assumes that any other register can be used as a scratch.
void CheckEnumCache(Label* call_runtime); void CheckEnumCache(Label* call_runtime);
......
This diff is collapsed.
...@@ -1000,6 +1000,20 @@ int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) { ...@@ -1000,6 +1000,20 @@ int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) {
return frame_ends; return frame_ends;
} }
void MacroAssembler::EnterBuiltinFrame(Register context, Register target,
Register argc) {
CleanseP(r14);
Push(r14, fp, context, target);
la(fp, MemOperand(sp, 2 * kPointerSize));
Push(argc);
}
void MacroAssembler::LeaveBuiltinFrame(Register context, Register target,
Register argc) {
Pop(argc);
Pop(r14, fp, context, target);
}
// ExitFrame layout (probably wrongish.. needs updating) // ExitFrame layout (probably wrongish.. needs updating)
// //
// SP -> previousSP // SP -> previousSP
......
...@@ -1792,6 +1792,9 @@ class MacroAssembler : public Assembler { ...@@ -1792,6 +1792,9 @@ class MacroAssembler : public Assembler {
// Returns the pc offset at which the frame ends. // Returns the pc offset at which the frame ends.
int LeaveFrame(StackFrame::Type type, int stack_adjustment = 0); int LeaveFrame(StackFrame::Type type, int stack_adjustment = 0);
void EnterBuiltinFrame(Register context, Register target, Register argc);
void LeaveBuiltinFrame(Register context, Register target, Register argc);
// Expects object in r2 and returns map with validated enum cache // Expects object in r2 and returns map with validated enum cache
// in r2. Assumes that any other register can be used as a scratch. // in r2. Assumes that any other register can be used as a scratch.
void CheckEnumCache(Label* call_runtime); void CheckEnumCache(Label* call_runtime);
......
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