From a75248d2cfe77f64b72e893e2d9a242acbaaf75b Mon Sep 17 00:00:00 2001 From: Tyler McMullen Date: Mon, 4 Dec 2017 16:03:04 -0800 Subject: [PATCH] Move the initial stack pointer adjustment to after the CSR pushes. --- cranelift/filetests/isa/intel/prologue-epilogue.cton | 6 +++++- lib/cretonne/src/isa/intel/abi.rs | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cranelift/filetests/isa/intel/prologue-epilogue.cton b/cranelift/filetests/isa/intel/prologue-epilogue.cton index edbe90cbc5..df0bf28ff0 100644 --- a/cranelift/filetests/isa/intel/prologue-epilogue.cton +++ b/cranelift/filetests/isa/intel/prologue-epilogue.cton @@ -4,12 +4,14 @@ set is_compressed isa intel haswell function %foo() { + ss0 = local 168 ebb0: return } ; check: function %foo(i64 fp [%rbp], i64 csr [%rbx], i64 csr [%r12], i64 csr [%r13], i64 csr [%r14], i64 csr [%r15]) -> i64 fp [%rbp], i64 csr [%rbx], i64 csr [%r12], i64 csr [%r13], i64 csr [%r14], i64 csr [%r15] native { -; nextln: ss0 = incoming_arg 48, offset -48 +; nextln: ss0 = local 168, offset -216 +; nextln: ss1 = incoming_arg 48, offset -48 ; check: ebb0(v0: i64 [%rbp], v1: i64 [%rbx], v2: i64 [%r12], v3: i64 [%r13], v4: i64 [%r14], v5: i64 [%r15]): ; nextln: x86_push v0 ; nextln: copy_special %rsp -> %rbp @@ -18,6 +20,8 @@ ebb0: ; nextln: x86_push v3 ; nextln: x86_push v4 ; nextln: x86_push v5 +; nextln: adjust_sp_imm -168 +; nextln: adjust_sp_imm 168 ; nextln: v11 = x86_pop.i64 ; nextln: v10 = x86_pop.i64 ; nextln: v9 = x86_pop.i64 diff --git a/lib/cretonne/src/isa/intel/abi.rs b/lib/cretonne/src/isa/intel/abi.rs index 89c24787f6..ad85a8e0af 100644 --- a/lib/cretonne/src/isa/intel/abi.rs +++ b/lib/cretonne/src/isa/intel/abi.rs @@ -234,10 +234,6 @@ fn insert_prologue( RU::rbp as RegUnit, ); - if stack_size > 0 { - pos.ins().adjust_sp_imm(Imm64::new(-stack_size)); - } - for reg in csrs.iter() { // Append param to entry EBB let csr_arg = pos.func.dfg.append_ebb_param(ebb, csr_type); @@ -248,6 +244,10 @@ fn insert_prologue( // Remember it so we can push it momentarily pos.ins().x86_push(csr_arg); } + + if stack_size > 0 { + pos.ins().adjust_sp_imm(Imm64::new(-stack_size)); + } } /// Find all `return` instructions and insert epilogues before them.