adding sources to register instructions

This commit is contained in:
Torsten Ruger
2015-07-27 12:13:39 +03:00
parent f91c9fabe8
commit 36f635f7c1
16 changed files with 55 additions and 47 deletions

View File

@ -13,11 +13,11 @@ module Register
next unless code.is_a? Virtual::MethodCall
new_codes = []
# move the current new_message to message
new_codes << RegisterTransfer.new( Register.new_message_reg , Register.message_reg )
new_codes << RegisterTransfer.new(code, Register.new_message_reg , Register.message_reg )
# "roll out" self into its register
new_codes << Register.get_slot( :message , :receiver, :self )
new_codes << Register.get_slot( code , :message , :receiver, :self )
# do the register call
new_codes << FunctionCall.new( code.method )
new_codes << FunctionCall.new( code , code.method )
block.replace(code , new_codes )
end
end

View File

@ -13,7 +13,7 @@ module Register
block.codes.dup.each do |code|
next unless code.is_a?(Virtual::NewFrame)
# load the frame from message by index, simple get_slot
new_codes = [ Register.get_slot( :message , :frame , Register.resolve_to_register(:frame))]
new_codes = [ Register.get_slot( code, :message , :frame , Register.resolve_to_register(:frame))]
block.replace(code , new_codes )
end
end

View File

@ -23,7 +23,7 @@ module Register
block.codes.dup.each do |code|
next unless code.is_a?(Virtual::NewMessage)
# load the new_message from message by index, simple get_slot
new_codes = [ Register.get_slot( :message , :next_message , Register.resolve_to_register(:new_message))]
new_codes = [ Register.get_slot(code, :message , :next_message , Register.resolve_to_register(:new_message))]
block.replace(code , new_codes )
end
end

View File

@ -5,14 +5,14 @@ module Register
next unless code.is_a? Virtual::MethodReturn
new_codes = []
# move the current message to new_message
new_codes << RegisterTransfer.new( Register.message_reg , Register.new_message_reg )
new_codes << RegisterTransfer.new(code, Register.message_reg , Register.new_message_reg )
# and restore the message from saved value in new_message
new_codes << Register.get_slot(:new_message , :caller , :message )
new_codes << Register.get_slot(code,:new_message , :caller , :message )
# "roll out" self and frame into their registers
new_codes << Register.get_slot( :message , :receiver , :self )
new_codes << Register.get_slot( :message , :frame , :frame )
new_codes << Register.get_slot(code, :message , :receiver , :self )
new_codes << Register.get_slot(code, :message , :frame , :frame )
#load the return address into pc, affecting return. (other cpus have commands for this, but not arm)
new_codes << FunctionReturn.new( Register.message_reg , Register.resolve_index(:message , :return_address) )
new_codes << FunctionReturn.new( code , Register.message_reg , Register.resolve_index(:message , :return_address) )
block.replace(code , new_codes )
end
end

View File

@ -11,11 +11,11 @@ module Register
tmp = Register.tmp_reg
# for constants we have to "move" the constants value
if( code.from.is_a?(Parfait::Value) or code.from.is_a?(Symbol))
move1 = LoadConstant.new( code.from , tmp )
move1 = LoadConstant.new(code, code.from , tmp )
else # while otherwise we "load"
move1 = Register.get_slot( code.from.object_name , get_index(code.from) , tmp )
move1 = Register.get_slot(code, code.from.object_name , get_index(code.from) , tmp )
end
move2 = Register.set_slot( tmp , code.to.object_name , get_index(code.to) )
move2 = Register.set_slot( code , tmp , code.to.object_name , get_index(code.to) )
block.replace(code , [move1,move2] )
end
end