From be86842ce31cb380270de6a81e770d1c1c72f393 Mon Sep 17 00:00:00 2001 From: inglorion Date: Wed, 6 Feb 2013 01:59:06 -0800 Subject: [PATCH] made save-frame only save registers not yet saved in the frame --- lib/voodoo/generators/amd64_nasm_generator.rb | 24 +++++++++++------------- lib/voodoo/generators/arm_gas_generator.rb | 8 +++++--- lib/voodoo/generators/common_code_generator.rb | 4 +++- lib/voodoo/generators/i386_nasm_generator.rb | 12 +++++++----- lib/voodoo/generators/nasm_generator.rb | 4 ---- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lib/voodoo/generators/amd64_nasm_generator.rb b/lib/voodoo/generators/amd64_nasm_generator.rb index 568d894..9e9ff3d 100644 --- a/lib/voodoo/generators/amd64_nasm_generator.rb +++ b/lib/voodoo/generators/amd64_nasm_generator.rb @@ -83,9 +83,9 @@ module Voodoo @ARG_REGS = [:rdi, :rsi, :rdx, :rcx, :r8, :r9] @NREG_ARGS = @ARG_REGS.length # Registers used to store locals - @LOCAL_REGS = [:r12, :r13, :r14, :r15] - @NLOCAL_REGS = @LOCAL_REGS.length - @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGS + @LOCAL_REGISTERS = [:r12, :r13, :r14, :r15] + @NLOCAL_REGISTERS = @LOCAL_REGISTERS.length + @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGISTERS # Accumulator index @AX = :rax # Base index @@ -98,11 +98,9 @@ module Voodoo @BP = :rbp # Stack pointer @SP = :rsp - @SAVED_FRAME_LAYOUT = { - :rbx => 0, :r12 => 1, :r13 => 2, :r14 => 3, :r15 => 4, - :rsp => 5, :rbp => 6, - } - @SAVE_FRAME_REGISTERS = @SAVED_FRAME_LAYOUT.keys + @SAVE_FRAME_REGISTERS = [:rbx, :r12, :r13, :r14, :r15, :rsp, :rbp] + @SAVED_FRAME_LAYOUT = {} + @SAVE_FRAME_REGISTERS.each_with_index { |r,i| @SAVED_FRAME_LAYOUT[r] = i } super params @features.merge! \ :'bits-per-word' => '64', @@ -138,7 +136,7 @@ module Voodoo end emit "sub #{@SP}, #{nlocals * @WORDSIZE}\n" number_of_register_locals(nlocals).times do |i| - register = @LOCAL_REGS[i] + register = @LOCAL_REGISTERS[i] ref = offset_reference saved_local_offset(i) emit "mov #{ref}, #{register}\n" @saved_registers << register @@ -312,8 +310,8 @@ module Voodoo # If the nth local is stored in a register, returns that register. # Otherwise, returns the offset from the frame pointer. def local_offset_or_register n - if n < @NLOCAL_REGS - @LOCAL_REGS[n] + if n < @NLOCAL_REGISTERS + @LOCAL_REGISTERS[n] else (n + number_of_register_arguments + 1) * -@WORDSIZE end @@ -335,7 +333,7 @@ module Voodoo # Calculates the number of locals that are stored in registers. def number_of_register_locals n = @environment.locals - n < @NLOCAL_REGS ? n : @NLOCAL_REGS + n < @NLOCAL_REGISTERS ? n : @NLOCAL_REGISTERS end # Calculates the number of stack arguments, @@ -347,7 +345,7 @@ module Voodoo # Calculates the number of locals that are stored on the stack. def number_of_stack_locals n = @environment.locals - x = n - @NLOCAL_REGS + x = n - @NLOCAL_REGISTERS x < 0 ? 0 : x end diff --git a/lib/voodoo/generators/arm_gas_generator.rb b/lib/voodoo/generators/arm_gas_generator.rb index 4a7fa72..4518850 100644 --- a/lib/voodoo/generators/arm_gas_generator.rb +++ b/lib/voodoo/generators/arm_gas_generator.rb @@ -72,10 +72,12 @@ module Voodoo @LOCAL_REGISTERS = [:r4, :r5, :r6, :r7, :r8, :r10] # Set of registers used for storing local variables. @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGISTERS + # Registers to be saved by save-frame. + @SAVE_FRAME_REGISTERS = [:r4, :r5, :r6, :r7, :r8, + :r9, :r10, :r11, :r13, :r14] # Hash from register names to offsets in saved frame. - @SAVED_FRAME_LAYOUT = { :r4 => 0, :r5 => 1, :r6 => 2, :r7 => 3, :r8 => 4, - :r9 => 5, :r10 => 6, :r11 => 7, :r13 => 8, :r14 => 9 } - @SAVE_FRAME_REGISTERS = @SAVED_FRAME_LAYOUT.keys + @SAVED_FRAME_LAYOUT = {} + @SAVE_FRAME_REGISTERS.each_with_index { |r,i| @SAVED_FRAME_LAYOUT[r] = i } @INITIAL_FRAME_SIZE = 2 * @WORDSIZE @NREGISTER_ARGS = 4 @NREGISTER_LOCALS = @LOCAL_REGISTERS.length diff --git a/lib/voodoo/generators/common_code_generator.rb b/lib/voodoo/generators/common_code_generator.rb index f5a5adc..d1ff548 100644 --- a/lib/voodoo/generators/common_code_generator.rb +++ b/lib/voodoo/generators/common_code_generator.rb @@ -393,7 +393,9 @@ module Voodoo # Saves the current frame to the given location. def save_frame frame - save_registers_to_frame frame, @SAVE_FRAME_REGISTERS + registers_to_save = @SAVE_FRAME_REGISTERS - + (@saved_registers & @LOCAL_REGISTERS) + save_registers_to_frame frame, registers_to_save end # Saves local variables to the given frame. diff --git a/lib/voodoo/generators/i386_nasm_generator.rb b/lib/voodoo/generators/i386_nasm_generator.rb index 6701794..57c8bfe 100644 --- a/lib/voodoo/generators/i386_nasm_generator.rb +++ b/lib/voodoo/generators/i386_nasm_generator.rb @@ -70,13 +70,15 @@ module Voodoo # Stack pointer @SP = :esp # Registers used to store locals - @LOCAL_REGS = [] - @NLOCAL_REGS = @LOCAL_REGS.length - @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGS - @SAVED_FRAME_LAYOUT = { :ebx => 0, :edi => 1, :esi => 2, :esp => 3, :ebp => 4 } - @SAVE_FRAME_REGISTERS = @SAVED_FRAME_LAYOUT.keys + @LOCAL_REGISTERS = [] + @NLOCAL_REGISTERS = @LOCAL_REGISTERS.length + @LOCAL_REGISTERS_SET = Set.new @LOCAL_REGISTERS + @SAVE_FRAME_REGISTERS = [:ebx, :edi, :esi, :esp, :ebp] + @SAVED_FRAME_LAYOUT = {} + @SAVE_FRAME_REGISTERS.each_with_index { |r,i| @SAVED_FRAME_LAYOUT[r] = i } @TEMPORARIES = [:ebx] super params + @saved_registers = [] @features.merge! \ :'bits-per-word' => '32', :'byte-order' => 'little-endian', diff --git a/lib/voodoo/generators/nasm_generator.rb b/lib/voodoo/generators/nasm_generator.rb index 0c39737..f86644b 100644 --- a/lib/voodoo/generators/nasm_generator.rb +++ b/lib/voodoo/generators/nasm_generator.rb @@ -220,10 +220,6 @@ module Voodoo end # - # Saving and restoring frames. - # - - # # == Variables # -- 2.11.4.GIT