much ripples from changing the calling convention

See previous commit
Now args and locals are arrays in the Message
This commit is contained in:
Torsten Ruger
2016-12-27 20:39:39 +02:00
parent f1cfd3c379
commit 903fc3e4cf
5 changed files with 37 additions and 46 deletions

View File

@ -16,19 +16,14 @@ module Register
end
def self.issue_call( compiler , callee )
source = "_issue_call(#{callee.name})"
return_label = Label.new("_return_label" , "#{compiler.type.object_class.name}.#{compiler.method.name}" )
return_label = Label.new("_return_label #{callee.name}" , "#{compiler.type.object_class.name}.#{compiler.method.name}" )
ret_tmp = compiler.use_reg(:Label)
compiler.add_code Register::LoadConstant.new(source, return_label , ret_tmp)
compiler.add_code Register.reg_to_slot(source, ret_tmp , :new_message , :return_address)
# move the current new_message to message
compiler.add_code RegisterTransfer.new(source, Register.new_message_reg , Register.message_reg )
# do the register call
compiler.add_code FunctionCall.new( source , callee )
compiler.add_code Register::LoadConstant.new("#{callee.name} load ret", return_label , ret_tmp)
compiler.add_code Register.reg_to_slot("#{callee.name} store ret", ret_tmp , :new_message , :return_address)
compiler.add_code RegisterTransfer.new("#{callee.name} move new message", Register.new_message_reg , Register.message_reg )
compiler.add_code FunctionCall.new( "#{callee.name} call" , callee )
compiler.add_code return_label
# move the current message to new_message
compiler.add_code Register::RegisterTransfer.new(source, Register.message_reg , Register.new_message_reg )
# and restore the message from saved value in new_message
compiler.add_code Register.slot_to_reg(source , :new_message , :caller , :message )
compiler.add_code Register::RegisterTransfer.new("#{callee.name} remove new message", Register.message_reg , Register.new_message_reg )
compiler.add_code Register.slot_to_reg("#{callee.name} restore message" , :new_message , :caller , :message )
end
end