diff --git a/lib/risc/register_value.rb b/lib/risc/register_value.rb index 8fe6954c..2db3cdc9 100644 --- a/lib/risc/register_value.rb +++ b/lib/risc/register_value.rb @@ -52,6 +52,13 @@ module Risc return index end + # reduce integer to fixnum and add instruction if builder is used + def reduce_int + reduce = Risc.slot_to_reg( "int -> fix" , self , Parfait::Integer.integer_index , self) + builder.add_code(reduce) if builder + reduce + end + # when following variables in resolve_and_add, get a new RegisterValue # that represents the new value. # Ie in "normal case" a the same register, with the type of the slot @@ -151,7 +158,7 @@ module Risc # create operator instruction for self and add # doesn't read quite as smoothly as one would like, but better than the compiler version def op( operator , right) - ret = Risc.op( "operator #{operator}" , :>> , self , right) + ret = Risc.op( "operator #{operator}" , operator , self , right) builder.add_code(ret) if builder ret end diff --git a/test/risc/test_register_value.rb b/test/risc/test_register_value.rb index 77c5a523..f9fe3ec1 100644 --- a/test/risc/test_register_value.rb +++ b/test/risc/test_register_value.rb @@ -57,6 +57,7 @@ module Risc assert_equal OperatorInstruction , ret.class assert_equal @r0 , ret.left assert_equal @r1 , ret.right + assert_equal :<< , ret.operator end def test_slot_to_reg instr = @r0 << @r1[:next_message] diff --git a/test/risc/test_register_value1.rb b/test/risc/test_register_value1.rb index 4857cec9..b863692e 100644 --- a/test/risc/test_register_value1.rb +++ b/test/risc/test_register_value1.rb @@ -16,6 +16,11 @@ module Risc def test_resolves_index_fail assert_raises {@r0.resolve_index(:something)} end + def test_reduce_int + ins = @r0.reduce_int + assert_equal SlotToReg , ins.class + assert_equal Parfait::Integer.integer_index , ins.index + end def test_get_new_left_0 assert_equal RegisterValue , @r0.get_new_left(:caller , @compiler).class end