diff --git a/lib/arm/translator.rb b/lib/arm/translator.rb index 9f3540a8..a558738e 100644 --- a/lib/arm/translator.rb +++ b/lib/arm/translator.rb @@ -146,15 +146,16 @@ module Arm end def exit( int_code ) - codes = ArmMachine.ldr( :r0 , :r0 , arm_index(Risc.resolve_to_index(:Message , :return_value)) ) - syscall int_code , codes + codes = ArmMachine.mov( :r7 , int_code ) + codes.append ArmMachine.swi( 0 ) + codes end private # syscall is always triggered by swi(0) # The actual code (ie the index of the kernel function) is in r7 - def syscall int_code , codes + def syscall( int_code , codes) codes.append ArmMachine.mov( :r7 , int_code ) codes.append ArmMachine.swi( 0 ) codes diff --git a/lib/risc/builtin/object.rb b/lib/risc/builtin/object.rb index 8a8ac27f..185c14c4 100644 --- a/lib/risc/builtin/object.rb +++ b/lib/risc/builtin/object.rb @@ -78,10 +78,10 @@ module Risc # a sort of inline version of exit method. # Used by exit and __init__ (so it doesn't have to call it) def exit_sequence(builder) - r1 = RiscValue.new( :r1 , :Integer ) - builder.add_slot_to_reg "get return" , :message , :return_value , r1 - builder.reduce_int( "reduce return" , r1) - emit_syscall( builder , :exit ) + save_message( builder ) + builder.add_slot_to_reg "get return" , :message , :return_value , :message + builder.reduce_int( "reduce return" , :message) + builder.add_code Syscall.new("emit_syscall(exit)", :exit ) end def exit( context ) diff --git a/test/risc/interpreter/assign/test_assign_local.rb b/test/risc/interpreter/assign/test_assign_local.rb index 330b7b4f..d0f3a80b 100644 --- a/test/risc/interpreter/assign/test_assign_local.rb +++ b/test/risc/interpreter/assign/test_assign_local.rb @@ -13,8 +13,8 @@ module Risc #show_main_ticks # get output of what is check_main_chain [LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, SlotToReg, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 15 , get_return end @@ -36,7 +36,7 @@ module Risc assert_equal Fixnum , link.class end def test_transfer - transfer = main_ticks(17) + transfer = main_ticks(14) assert_equal Transfer , transfer.class end def test_sys diff --git a/test/risc/interpreter/assign/test_assign_return.rb b/test/risc/interpreter/assign/test_assign_return.rb index 925dd9d0..d8e81d3d 100644 --- a/test/risc/interpreter/assign/test_assign_return.rb +++ b/test/risc/interpreter/assign/test_assign_return.rb @@ -23,8 +23,8 @@ module Risc SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - SlotToReg, Branch, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, Branch, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 10 , get_return end end diff --git a/test/risc/interpreter/assign/test_assign_thrice.rb b/test/risc/interpreter/assign/test_assign_thrice.rb index 754b5c6c..7094f166 100644 --- a/test/risc/interpreter/assign/test_assign_thrice.rb +++ b/test/risc/interpreter/assign/test_assign_thrice.rb @@ -35,7 +35,7 @@ module Risc FunctionReturn, SlotToReg, SlotToReg, RegToSlot, Branch, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, - SlotToReg, SlotToReg, Branch, Transfer, Syscall, + Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal 15 , get_return end diff --git a/test/risc/interpreter/assign/test_assign_twice.rb b/test/risc/interpreter/assign/test_assign_twice.rb index c2520f73..074c9ba0 100644 --- a/test/risc/interpreter/assign/test_assign_twice.rb +++ b/test/risc/interpreter/assign/test_assign_twice.rb @@ -24,8 +24,8 @@ module Risc SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, Branch, RegToSlot, SlotToReg, SlotToReg, - SlotToReg, FunctionReturn, SlotToReg, SlotToReg, Branch, - Transfer, Syscall, NilClass] + SlotToReg, FunctionReturn, Transfer, SlotToReg, Branch, + SlotToReg, Syscall, NilClass] assert_equal 10 , get_return end end diff --git a/test/risc/interpreter/calling/test_div10.rb b/test/risc/interpreter/calling/test_div10.rb index 3b7794b1..da3cb9c4 100644 --- a/test/risc/interpreter/calling/test_div10.rb +++ b/test/risc/interpreter/calling/test_div10.rb @@ -28,8 +28,8 @@ module Risc RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, Branch, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, - SlotToReg, Branch, Transfer, Syscall, NilClass] + SlotToReg, SlotToReg, SlotToReg, FunctionReturn, Transfer, + SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal 2 , get_return end diff --git a/test/risc/interpreter/calling/test_get_byte.rb b/test/risc/interpreter/calling/test_get_byte.rb index d084cb80..027ce5f3 100644 --- a/test/risc/interpreter/calling/test_get_byte.rb +++ b/test/risc/interpreter/calling/test_get_byte.rb @@ -22,8 +22,8 @@ module Risc SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, - Branch, FunctionReturn, SlotToReg, SlotToReg, Branch, - Transfer, Syscall, NilClass] + Branch, FunctionReturn, Transfer, SlotToReg, Branch, + SlotToReg, Syscall, NilClass] assert_equal "H".ord , get_return end def test_byte_to_reg diff --git a/test/risc/interpreter/calling/test_minus.rb b/test/risc/interpreter/calling/test_minus.rb index 40db8e2b..d62c1383 100644 --- a/test/risc/interpreter/calling/test_minus.rb +++ b/test/risc/interpreter/calling/test_minus.rb @@ -23,8 +23,8 @@ module Risc SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - SlotToReg, Branch, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, Branch, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 1 , get_return end def test_load_5 diff --git a/test/risc/interpreter/calling/test_mod.rb b/test/risc/interpreter/calling/test_mod.rb index a9aa7939..5d9a9916 100644 --- a/test/risc/interpreter/calling/test_mod.rb +++ b/test/risc/interpreter/calling/test_mod.rb @@ -22,7 +22,7 @@ module Risc SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, Branch, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, - FunctionReturn, SlotToReg, SlotToReg, Branch, Transfer, + FunctionReturn, Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal 2 , get_return end diff --git a/test/risc/interpreter/calling/test_mult.rb b/test/risc/interpreter/calling/test_mult.rb index 7906ebfd..ceed2288 100644 --- a/test/risc/interpreter/calling/test_mult.rb +++ b/test/risc/interpreter/calling/test_mult.rb @@ -23,8 +23,8 @@ module Risc SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - SlotToReg, Branch, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, Branch, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 0 , get_return end def test_zero diff --git a/test/risc/interpreter/calling/test_plus.rb b/test/risc/interpreter/calling/test_plus.rb index 2027d5fa..39050334 100644 --- a/test/risc/interpreter/calling/test_plus.rb +++ b/test/risc/interpreter/calling/test_plus.rb @@ -23,8 +23,8 @@ module Risc SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, - SlotToReg, Branch, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, Branch, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 10 , get_return end def test_load_5 diff --git a/test/risc/interpreter/calling/test_puts.rb b/test/risc/interpreter/calling/test_puts.rb index 28e5019b..2c6e9e69 100644 --- a/test/risc/interpreter/calling/test_puts.rb +++ b/test/risc/interpreter/calling/test_puts.rb @@ -22,10 +22,9 @@ module Risc SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, Branch, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] + SlotToReg, SlotToReg, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal "Hello again" , @interpreter.stdout - assert_equal Fixnum , get_return.class assert_equal 11 , get_return #bytes written end def test_call diff --git a/test/risc/interpreter/calling/test_set_byte.rb b/test/risc/interpreter/calling/test_set_byte.rb index c4aef7e0..fd82d4cd 100644 --- a/test/risc/interpreter/calling/test_set_byte.rb +++ b/test/risc/interpreter/calling/test_set_byte.rb @@ -24,9 +24,8 @@ module Risc SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, Branch, RegToSlot, SlotToReg, SlotToReg, SlotToReg, - FunctionReturn, SlotToReg, SlotToReg, Branch, Transfer, + FunctionReturn, Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] - assert_equal Fixnum , get_return.class assert_equal "K".ord , get_return end def test_reg_to_byte diff --git a/test/risc/interpreter/conditional/test_if_constant.rb b/test/risc/interpreter/conditional/test_if_constant.rb index 2f77b7fc..b53b2ec3 100644 --- a/test/risc/interpreter/conditional/test_if_constant.rb +++ b/test/risc/interpreter/conditional/test_if_constant.rb @@ -14,9 +14,8 @@ module Risc check_main_chain [LoadConstant, LoadConstant, OperatorInstruction, IsZero, LoadConstant, OperatorInstruction, IsZero, LoadConstant, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, Branch, SlotToReg, - SlotToReg, FunctionReturn, SlotToReg, SlotToReg, Branch, - Transfer, Syscall, NilClass] - assert_equal Fixnum , get_return.class + SlotToReg, FunctionReturn, Transfer, SlotToReg, Branch, + SlotToReg, Syscall, NilClass] assert_equal 1 , get_return end def test_load_10 diff --git a/test/risc/interpreter/conditional/test_if_greater.rb b/test/risc/interpreter/conditional/test_if_greater.rb index 55f018a3..edbd829c 100644 --- a/test/risc/interpreter/conditional/test_if_greater.rb +++ b/test/risc/interpreter/conditional/test_if_greater.rb @@ -24,9 +24,8 @@ module Risc SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, LoadConstant, RegToSlot, SlotToReg, SlotToReg, Branch, RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, - SlotToReg, SlotToReg, Branch, Transfer, Syscall, + Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] - assert_equal Fixnum , get_return.class assert_equal 2 , get_return end def test_exit diff --git a/test/risc/interpreter/conditional/test_if_greater_or.rb b/test/risc/interpreter/conditional/test_if_greater_or.rb index c5c134bb..9b91554b 100644 --- a/test/risc/interpreter/conditional/test_if_greater_or.rb +++ b/test/risc/interpreter/conditional/test_if_greater_or.rb @@ -24,9 +24,8 @@ module Risc SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, LoadConstant, OperatorInstruction, IsZero, LoadConstant, Branch, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] - assert_equal Fixnum , get_return.class + SlotToReg, SlotToReg, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 1 , get_return end def test_exit diff --git a/test/risc/interpreter/conditional/test_if_smaller.rb b/test/risc/interpreter/conditional/test_if_smaller.rb index 52d8f1e9..03540047 100644 --- a/test/risc/interpreter/conditional/test_if_smaller.rb +++ b/test/risc/interpreter/conditional/test_if_smaller.rb @@ -24,9 +24,8 @@ module Risc SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, LoadConstant, RegToSlot, SlotToReg, SlotToReg, Branch, RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, - SlotToReg, SlotToReg, Branch, Transfer, Syscall, + Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] - assert_equal Fixnum , get_return.class assert_equal 2 , get_return end def test_exit diff --git a/test/risc/interpreter/conditional/test_if_smaller_or.rb b/test/risc/interpreter/conditional/test_if_smaller_or.rb index 2d723319..2947b324 100644 --- a/test/risc/interpreter/conditional/test_if_smaller_or.rb +++ b/test/risc/interpreter/conditional/test_if_smaller_or.rb @@ -24,9 +24,8 @@ module Risc SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, LoadConstant, OperatorInstruction, IsZero, LoadConstant, Branch, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] - assert_equal Fixnum , get_return.class + SlotToReg, SlotToReg, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 1 , get_return end def test_exit diff --git a/test/risc/interpreter/test_dynamic_call.rb b/test/risc/interpreter/test_dynamic_call.rb index ff2bc88c..5d545d89 100644 --- a/test/risc/interpreter/test_dynamic_call.rb +++ b/test/risc/interpreter/test_dynamic_call.rb @@ -39,7 +39,7 @@ module Risc FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, Branch, FunctionReturn, - SlotToReg, SlotToReg, Branch, Transfer, Syscall, + Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal Fixnum , get_return.class assert_equal 1 , get_return diff --git a/test/risc/interpreter/test_events.rb b/test/risc/interpreter/test_events.rb index 7f11e3f1..0e5250d6 100644 --- a/test/risc/interpreter/test_events.rb +++ b/test/risc/interpreter/test_events.rb @@ -56,8 +56,8 @@ module Risc RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, Branch, FunctionReturn, SlotToReg, - SlotToReg, Branch, Transfer, Syscall, NilClass] + SlotToReg, SlotToReg, Branch, FunctionReturn, Transfer, + SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal Fixnum , get_return.class assert_equal 12 , get_return end diff --git a/test/risc/interpreter/test_return.rb b/test/risc/interpreter/test_return.rb index b8d07243..d80144ca 100644 --- a/test/risc/interpreter/test_return.rb +++ b/test/risc/interpreter/test_return.rb @@ -12,8 +12,8 @@ module Risc def test_chain #show_main_ticks # get output of what is check_main_chain [LoadConstant, RegToSlot, SlotToReg, SlotToReg, RegToSlot, - SlotToReg, SlotToReg, SlotToReg, FunctionReturn, SlotToReg, - SlotToReg, Branch, Transfer, Syscall, NilClass] + SlotToReg, SlotToReg, SlotToReg, FunctionReturn, Transfer, + SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_equal 5 , get_return end @@ -33,22 +33,22 @@ module Risc link = @interpreter.get_register( ret.register ) assert_equal Fixnum , link.class end + def test_transfer + transfer = main_ticks(10) + assert_equal Transfer , transfer.class + end def test_return_save - save = main_ticks(10) + save = main_ticks(11) assert_equal SlotToReg , save.class - assert_equal :r1 , save.register.symbol + assert_equal :r0 , save.register.symbol assert_equal 5 , save.index end def test_return_reduce - save = main_ticks(11) + save = main_ticks(13) assert_equal SlotToReg , save.class - assert_equal :r1 , save.register.symbol + assert_equal :r0 , save.register.symbol assert_equal 2 , save.index end - def test_transfer - transfer = main_ticks(13) - assert_equal Transfer , transfer.class - end def test_sys sys = main_ticks(14) assert_equal Syscall , sys.class diff --git a/test/risc/interpreter/while/test_while_cmp.rb b/test/risc/interpreter/while/test_while_cmp.rb index 3e0ca8d9..2ddcc8d8 100644 --- a/test/risc/interpreter/while/test_while_cmp.rb +++ b/test/risc/interpreter/while/test_while_cmp.rb @@ -47,9 +47,8 @@ module Risc SlotToReg, RegToSlot, SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, SlotToReg, SlotToReg, RegToSlot, SlotToReg, Branch, SlotToReg, RegToSlot, SlotToReg, - SlotToReg, SlotToReg, FunctionReturn, SlotToReg, SlotToReg, - Branch, Transfer, Syscall, NilClass] - assert_kind_of Fixnum , get_return + SlotToReg, SlotToReg, FunctionReturn, Transfer, SlotToReg, + Branch, SlotToReg, Syscall, NilClass] assert_equal 1 , get_return end def test_exit diff --git a/test/risc/interpreter/while/test_while_count.rb b/test/risc/interpreter/while/test_while_count.rb index 12314ea2..0403cb24 100644 --- a/test/risc/interpreter/while/test_while_count.rb +++ b/test/risc/interpreter/while/test_while_count.rb @@ -48,9 +48,8 @@ module Risc SlotToReg, LoadConstant, OperatorInstruction, IsZero, SlotToReg, SlotToReg, RegToSlot, SlotToReg, Branch, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, FunctionReturn, - SlotToReg, SlotToReg, Branch, Transfer, Syscall, + Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] - assert_kind_of Fixnum , get_return assert_equal 0 , get_return end def test_exit diff --git a/test/risc/interpreter/while/test_while_simple.rb b/test/risc/interpreter/while/test_while_simple.rb index eb66fd7a..61dac379 100644 --- a/test/risc/interpreter/while/test_while_simple.rb +++ b/test/risc/interpreter/while/test_while_simple.rb @@ -17,7 +17,7 @@ module Risc Branch, SlotToReg, SlotToReg, LoadConstant, OperatorInstruction, IsZero, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, SlotToReg, - FunctionReturn, SlotToReg, SlotToReg, Branch, Transfer, + FunctionReturn, Transfer, SlotToReg, Branch, SlotToReg, Syscall, NilClass] assert_kind_of Parfait::NilClass , get_return end diff --git a/test/support/risc_interpreter.rb b/test/support/risc_interpreter.rb index 32588383..e01cb877 100644 --- a/test/support/risc_interpreter.rb +++ b/test/support/risc_interpreter.rb @@ -35,8 +35,8 @@ module Risc end def get_return - assert_equal Parfait::Message , @interpreter.get_register(:r0).class - @interpreter.get_register(:r1) + assert_equal Parfait::Message , @interpreter.get_register(:r8).class + @interpreter.get_register(:r0) end # do as many as given ticks in the main, ie main_at more