diff --git a/lib/risc/instructions/instruction.rb b/lib/risc/instructions/instruction.rb index f0986260..23164d51 100644 --- a/lib/risc/instructions/instruction.rb +++ b/lib/risc/instructions/instruction.rb @@ -60,12 +60,13 @@ module Risc # set all registers that has the name "name" # going through the register_names and setting all where the # get_register would return name - # Set to the value given as second arg. + # Create new RegisterValue with new name and swap the variable out def set_registers(name , value) register_attributes.each do |attr| reg = instance_variable_get("@#{attr}".to_sym) next unless reg.symbol == name - reg.set_name(value) + new_reg = reg.dup(value) + instance_variable_set("@#{attr}".to_sym , new_reg) end end diff --git a/lib/risc/register_value.rb b/lib/risc/register_value.rb index ea45dc43..c4d1eab3 100644 --- a/lib/risc/register_value.rb +++ b/lib/risc/register_value.rb @@ -23,13 +23,14 @@ module Risc # A third value may give extra information. This is a hash, where keys may # be :value, or :value_XX or :type_XX to indicate value or type information # for an XX instance - def initialize( reg , type , extra = {}) + def initialize( reg , type , extra = {} , ssa = nil) extra = {} unless extra - @extra = extra - @symbol = reg - raise "not Symbol #{symbol}:#{symbol.class}" unless symbol.is_a?(Symbol) raise "Not Hash #{extra}" unless extra.is_a?(Hash) + @extra = extra + raise "not Symbol #{reg}:#{reg.class}" unless reg.is_a?(Symbol) + @symbol = reg known_type(type) + @ssa = ssa end def class_name @@ -37,17 +38,13 @@ module Risc @type.class_name end - # During initial creation ssa-like names are given to the registers. - # Later the name is changed, with set_name. When that happens - # the original is retained as ssa attttribute for debugging. - def set_name( symbol ) - raise "not Symbol #{symbol}:#{symbol.class}" unless symbol.is_a?(Symbol) - old = @symbol - @ssa = @symbol - @symbol = symbol - old + # make a copy with a new register name (given arg) + # the copy will have the ssa set to the old name + def dup( reg ) + RegisterValue.new(reg , @type , @extra , @symbol) end + # allows to set the compiler, which is mainly done by the compiler # but sometimes, eg in exit, one nneds to create the reg by hand and set # return the RegisterValue for chaining in assignment diff --git a/test/risc/test_register_value.rb b/test/risc/test_register_value.rb index f5ea672a..13d27623 100644 --- a/test/risc/test_register_value.rb +++ b/test/risc/test_register_value.rb @@ -24,6 +24,11 @@ module Risc def test_r0 assert_equal :message , @r0.symbol end + def test_dup + copy = @r0.dup( :r0 ) + assert_equal :r0 , copy.symbol + assert_equal :message , copy.ssa + end def test_load_label label = Risc::Label.new("HI","ho" , FakeAddress.new(0)) move = @r1 << label diff --git a/test/risc/test_register_value1.rb b/test/risc/test_register_value1.rb index b7282625..0cc9d0e2 100644 --- a/test/risc/test_register_value1.rb +++ b/test/risc/test_register_value1.rb @@ -53,12 +53,5 @@ module Risc def test_has_ssa assert_nil @r0.ssa end - def test_set_name - assert_equal :message , @r0.set_name(:r0) - end - def test_set_ssa - @r0.set_name(:r0) - assert_equal :message , @r0.ssa - end end end diff --git a/test/risc/test_standard_allocator1.rb b/test/risc/test_standard_allocator1.rb index 652d145c..ab6f8b01 100644 --- a/test/risc/test_standard_allocator1.rb +++ b/test/risc/test_standard_allocator1.rb @@ -13,7 +13,7 @@ module Risc end def test_allocate_runs assert_nil @allocator.allocate_regs - #assert_equal 0 , @allocator.used_regs.length + assert_equal 0 , @allocator.used_regs.length end def test_live_length live = @allocator.walk_and_mark(@compiler.risc_instructions)