diff --git a/lib/cretonne/src/isa/intel/mod.rs b/lib/cretonne/src/isa/intel/mod.rs index a8b6314521..48106cce20 100644 --- a/lib/cretonne/src/isa/intel/mod.rs +++ b/lib/cretonne/src/isa/intel/mod.rs @@ -10,9 +10,14 @@ use binemit::{CodeSink, MemoryCodeSink, emit_function}; use super::super::settings as shared_settings; use isa::enc_tables::{self as shared_enc_tables, lookup_enclist, Encodings}; use isa::Builder as IsaBuilder; -use isa::{TargetIsa, RegInfo, RegClass, EncInfo}; +use isa::{TargetIsa, RegInfo, RegClass, EncInfo, RegUnit}; +use self::registers::RU; use ir; use regalloc; +use result; +use ir::InstBuilder; +use legalizer; + #[allow(dead_code)] struct Isa { @@ -111,4 +116,44 @@ impl TargetIsa for Isa { fn reloc_names(&self) -> &'static [&'static str] { &binemit::RELOC_NAMES } + + fn prologue_epilogue(&self, func: &mut ir::Function) -> result::CtonResult { + use stack_layout::layout_stack; + use cursor::{Cursor, EncCursor}; + + let word_size = if self.flags().is_64bit() { 8 } else { 4 }; + let stack_size = layout_stack(&mut func.stack_slots, word_size)?; + + // Append frame pointer to function signature + let rbp_arg = ir::AbiParam::special_reg( + ir::types::I64, + ir::ArgumentPurpose::FramePointer, + RU::rbp as RegUnit, + ); + func.signature.params.push(rbp_arg); + + // Append param to entry EBB + let entry_ebb = func.layout.entry_block().expect("missing entry block"); + func.dfg.append_ebb_param(entry_ebb, ir::types::I64); + + // Find our frame pointer parameter Value + let fp = func.special_param(ir::ArgumentPurpose::FramePointer) + .expect("missing frame pointer"); + + // Assign it a location + func.locations[fp] = ir::ValueLoc::Reg(RU::rbp as RegUnit); + + // Insert prologue + let mut pos = EncCursor::new(func, self).at_first_insertion_point(entry_ebb); + pos.ins().x86_push(fp); + pos.ins().copy_special( + RU::rbp as RegUnit, + RU::rsp as RegUnit, + ); + pos.ins().adjust_sp_imm(-(stack_size as i32)); + + //legalizer::legalize_function(func, &mut func.cfg, self); + + Ok(()) + } }