diff --git a/lib/arm/instructions/logic_instruction.rb b/lib/arm/instructions/logic_instruction.rb index 6fe3e816..19c7a6f8 100644 --- a/lib/arm/instructions/logic_instruction.rb +++ b/lib/arm/instructions/logic_instruction.rb @@ -91,7 +91,6 @@ module Arm if( @left.is_a?(Parfait::Object) or @left.is_a?(Risc::Label) or (@left.is_a?(Symbol) and !Risc::RiscValue.look_like_reg(@left))) left = @left - puts "Label #{@left.integer.inspect}" if left.is_a?(Risc::Label) left = @left.integer if left.is_a?(Risc::Label) # do pc relative addressing with the difference to the instuction # 8 is for the funny pipeline adjustment (ie pointing to fetch and not execute) diff --git a/lib/mom/instruction/label.rb b/lib/mom/instruction/label.rb index 78762853..3770f29d 100644 --- a/lib/mom/instruction/label.rb +++ b/lib/mom/instruction/label.rb @@ -31,10 +31,7 @@ module Mom # Off course some specific place still has to be responsible for actually # adding the label to the instruction list (usually an if/while) def to_risc(compiler) - int = Parfait.object_space.get_integer - puts "ADDING int #{int}" - compiler.add_constant(int) - @risc_label ||= Risc.label(self,name , int , nil) + @risc_label ||= Risc.label(self,name) end end end diff --git a/lib/risc/collector.rb b/lib/risc/collector.rb index 832fdbc9..15d1efcc 100644 --- a/lib/risc/collector.rb +++ b/lib/risc/collector.rb @@ -5,7 +5,6 @@ module Risc def self.collect_space @objects = {} keep Parfait.object_space , 0 - puts "CONST #{Risc.machine.constants}" Risc.machine.constants.each {|obj| keep(obj,0)} @objects end diff --git a/lib/risc/instructions/label.rb b/lib/risc/instructions/label.rb index cd1686ae..4d76781e 100644 --- a/lib/risc/instructions/label.rb +++ b/lib/risc/instructions/label.rb @@ -1,18 +1,25 @@ module Risc # A label is a placeholder for it's next Instruction - # It's function is not to turn into code, but to be a valid brnch target + # It's function is not to turn into code, but to be a valid branch target + # Labels have the same position as their next instruction (See positioning code) # # So branches and Labels are pairs, fan out, fan in # - # + # For a return, the address (position) of the label has to be loaded. + # So a Label carries the Integer constant that holds the address (it's own + # position, again see positioning code). + # But currently the label is used in the Risc abstraction layer, and in the + # arm/interpreter layer. The integer is only used in the lower layer, but needs + # to be created (and positioned) class Label < Instruction + # See class description. also factory method Risc.label below def initialize( source , name , int , nekst = nil) super(source , nekst) @name = name @integer = int - raise "Not int #{int}" if int and !int.is_a?(Parfait::Integer) + raise "Not int #{int}" unless int.is_a?(Parfait::Integer) end attr_reader :name , :integer @@ -53,8 +60,15 @@ module Risc alias :padded_length :byte_length end + # Labels carry what is esentially an integer constant + # The int holds the labels position for use at runtime (return address) + # An integer is plucked from object_space abd added to the machine constant pool + # if none was given def self.label( source , name , position = nil , nekst = nil) - position ||= Parfait.object_space.get_integer + unless position + position = Parfait.object_space.get_integer + Risc.machine.add_constant(position) + end Label.new( source , name , position, nekst ) end end diff --git a/test/arm/helper.rb b/test/arm/helper.rb index fe06892b..ca21628e 100644 --- a/test/arm/helper.rb +++ b/test/arm/helper.rb @@ -13,21 +13,6 @@ module Arm true end end - class FakeInt - attr_reader :value - def initialize(val) - set_value(val) - end - def is_a?(clazz) - clazz == Parfait::Integer - end - def byte_length - 4 - end - def set_value(val) - @value = val - end - end module ArmHelper def setup @machine = Arm::ArmMachine diff --git a/test/risc/test_instructions.rb b/test/risc/test_instructions.rb index 86b13430..4bbe7827 100644 --- a/test/risc/test_instructions.rb +++ b/test/risc/test_instructions.rb @@ -3,7 +3,7 @@ require_relative "../helper" module Risc class TestInstructions < MiniTest::Test def setup - @label = Label.new("test" , "test",nil) + @label = Label.new("test" , "test",FakeInt.new(5)) @branch = Branch.new("test" , @label) @instruction = Instruction.new("test") end @@ -19,7 +19,7 @@ module Risc assert @label.to_s.include?("Label") end def test_label_tos2 - assert Label.new(nil,nil,nil).to_s.include?("Label") + assert Label.new("nil",nil,FakeInt.new(2)).to_s.include?("Label") end def test_last_empty assert_equal @instruction, @instruction.last @@ -55,7 +55,7 @@ module Risc assert_nil @instruction.next(2) end def test_label_is_method - label = Label.new("test" , "Object.test" , nil) + label = Label.new("test" , "Object.test" , FakeInt.new(5)) assert label.is_method end def test_label_is_not_method diff --git a/test/risc/test_interpreter.rb b/test/risc/test_interpreter.rb index 60772675..596e84f1 100644 --- a/test/risc/test_interpreter.rb +++ b/test/risc/test_interpreter.rb @@ -52,7 +52,7 @@ module Risc end def test_pc1 @interpreter.tick - assert_equal 17952 , @interpreter.pc + assert_equal 18392 , @interpreter.pc end def test_tick2 @interpreter.tick @@ -66,7 +66,7 @@ module Risc def test_pc2 @interpreter.tick @interpreter.tick - assert_equal 17956 , @interpreter.pc + assert_equal 18396 , @interpreter.pc end def test_tick_14_jump 14.times {@interpreter.tick} diff --git a/test/risc/test_machine.rb b/test/risc/test_machine.rb index fc8176d8..b5d31418 100644 --- a/test/risc/test_machine.rb +++ b/test/risc/test_machine.rb @@ -29,10 +29,10 @@ module Risc assert_equal 0 , Position.get(@machine.cpu_init).at end def test_cpu_at - assert_equal "0x555c" , Position.get(@machine.cpu_init.first).to_s + assert_equal "0x5714" , Position.get(@machine.cpu_init.first).to_s end def test_cpu_bin - assert_equal "0x5554" , Position.get(Position.get(@machine.cpu_init.first).binary).to_s + assert_equal "0x570c" , Position.get(Position.get(@machine.cpu_init.first).binary).to_s end def test_cpu_label assert_equal Position::InstructionPosition , Position.get(@machine.cpu_init.first).class diff --git a/test/support/fake_int.rb b/test/support/fake_int.rb new file mode 100644 index 00000000..33153d38 --- /dev/null +++ b/test/support/fake_int.rb @@ -0,0 +1,15 @@ +class FakeInt + attr_reader :value + def initialize(val) + set_value(val) + end + def is_a?(clazz) + clazz == Parfait::Integer + end + def byte_length + 4 + end + def set_value(val) + @value = val + end +end