From 9fdd68972e7eeb0e4945b36b5f2364453fca35bf Mon Sep 17 00:00:00 2001 From: inglorion Date: Wed, 14 Apr 2010 08:00:44 +0200 Subject: [PATCH] AMD64NASMGenerator: fixed bugs uncovered by many-vars tests. --- lib/voodoo/generators/amd64_nasm_generator.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/voodoo/generators/amd64_nasm_generator.rb b/lib/voodoo/generators/amd64_nasm_generator.rb index b4c802b..0c521dc 100644 --- a/lib/voodoo/generators/amd64_nasm_generator.rb +++ b/lib/voodoo/generators/amd64_nasm_generator.rb @@ -96,7 +96,7 @@ module Voodoo def call func, *args emit "; call #{func} #{args.join ' '}\n" # First couple of arguments go in registers - register_args = args[0..number_of_register_arguments] || [] + register_args = args[0..(number_of_register_arguments - 1)] || [] # Rest of arguments go on the stack stack_args = args[number_of_register_arguments..-1] || [] emit "; register_args: #{register_args.inspect}\n" @@ -175,24 +175,23 @@ module Voodoo # Set stack arguments if args.length > number_of_register_arguments - (args.length - 1 .. number_of_register_arguments).each do |i| + (args.length - 1).downto(number_of_register_arguments).each do |i| arg = args[i] value_ref = load_value arg, @SCRATCH_REG newarg_ref = load_arg i # Elide code if source is same as destination unless value_ref == newarg_ref - emit "mov #{@WORD_NAME} #{newarg_ref}, #{value_ref}\n" + emit "mov #{@SCRATCH_REG}, #{value_ref}\n" + emit "mov #{newarg_ref}, #{@SCRATCH_REG}\n" end end end # Set register arguments - if args.length > 0 - number_of_register_arguments(args.length).times do |i| - register = @ARG_REGS[i] - load_value_into_register args[i], register - end + number_of_register_arguments(args.length).times do |i| + register = @ARG_REGS[i] + load_value_into_register args[i], register end # Tail call @@ -219,8 +218,8 @@ module Voodoo "[rbp - #{(n + 1) * @WORDSIZE}]" else # Arguments that were originally passed on the stack - # are now above rbp - "[rbp + #{(n + 1 - number_of_register_arguments) * @WORDSIZE}]" + # are now above rbp, starting 2 words above it + "[rbp + #{(n + 2 - number_of_register_arguments) * @WORDSIZE}]" end end -- 2.11.4.GIT