Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: src/compiler/arm64/code-generator-arm64.cc

Issue 1494123002: [turbofan, arm64] Fix native stack parameters on arm64. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/arm64/code-generator-arm64.cc
diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc
index 928b2c6dbb93dfd7658334eeed810a72a2d161cf..6e90c0529e6c4a3b7fb8530eb4d3d1f06850e727 100644
--- a/src/compiler/arm64/code-generator-arm64.cc
+++ b/src/compiler/arm64/code-generator-arm64.cc
@@ -877,12 +877,22 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
}
case kArm64Poke: {
Operand operand(i.InputInt32(1) * kPointerSize);
- __ Poke(i.InputRegister(0), operand);
+ if (instr->InputAt(0)->IsDoubleRegister()) {
+ __ Poke(i.InputFloat64Register(0), operand);
+ } else {
+ __ Poke(i.InputRegister(0), operand);
+ }
break;
}
case kArm64PokePair: {
int slot = i.InputInt32(2) - 1;
- __ PokePair(i.InputRegister(1), i.InputRegister(0), slot * kPointerSize);
+ if (instr->InputAt(0)->IsDoubleRegister()) {
+ __ PokePair(i.InputFloat64Register(1), i.InputFloat64Register(0),
jbramley 2015/12/03 11:22:34 Consider: DCHECK(instr->InputAt(1)->IsDoubleRegist
ahaas 2015/12/03 15:25:06 I didn't add this DCHECK because i.InputFloat64Reg
+ slot * kPointerSize);
+ } else {
+ __ PokePair(i.InputRegister(1), i.InputRegister(0),
+ slot * kPointerSize);
+ }
break;
}
case kArm64Clz:
@@ -1292,9 +1302,16 @@ void CodeGenerator::AssemblePrologue() {
__ SetStackPointer(jssp);
__ Prologue(info->IsCodePreAgingActive());
} else if (frame()->needs_frame()) {
- __ SetStackPointer(jssp);
+ if (descriptor->UseNativeStack()) {
+ __ SetStackPointer(csp);
+ } else {
+ __ SetStackPointer(jssp);
+ }
__ StubPrologue();
} else {
+ if (descriptor->UseNativeStack()) {
+ __ SetStackPointer(csp);
jbramley 2015/12/03 11:22:34 Is it jssp by default? (I can't remember.) If it i
titzer 2015/12/03 11:31:59 Actually, I think it's best to be explicit in both
ahaas 2015/12/03 15:25:06 Done, I made it explicit in both cases.
+ }
frame()->SetElidedFrameSizeInSlots(0);
}
frame_access_state()->SetFrameAccessToDefault();
@@ -1315,9 +1332,10 @@ void CodeGenerator::AssemblePrologue() {
stack_shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots();
}
- if (csp.Is(masm()->StackPointer())) {
+ if (csp.Is(masm()->StackPointer()) && !descriptor->UseNativeStack()) {
jbramley 2015/12/03 11:22:34 Why not for the UseNativeStack() case? In particu
ahaas 2015/12/03 15:25:06 The additional condition is required because Align
// The system stack pointer requires 16-byte alignment at function call
// boundaries.
+
stack_shrink_slots += frame()->AlignSavedCalleeRegisterSlots();
}
__ Claim(stack_shrink_slots);
@@ -1374,9 +1392,18 @@ void CodeGenerator::AssembleReturn() {
return;
} else {
__ Bind(&return_label_);
- __ Mov(jssp, fp);
+ if (descriptor->UseNativeStack()) {
+ __ Mov(csp, fp);
+ } else {
+ __ Mov(jssp, fp);
+ }
__ Pop(fp, lr);
}
+ } else if (descriptor->UseNativeStack()) {
+ bool pop_count_uneven = pop_count & 1;
+ if (pop_count_uneven) {
+ pop_count++;
+ }
jbramley 2015/12/03 11:22:34 Why not just "pop_count += (pop_count & 1)"?
ahaas 2015/12/03 15:25:06 Done.
}
__ Drop(pop_count);
__ Ret();

Powered by Google App Engine
This is Rietveld 408576698