fixing register order in some instructions

and their use
Arm is confusing as it has result as first arg
we use forward logic, i.e. from -> to
This commit is contained in:
Torsten Ruger 2015-06-27 20:09:21 +03:00
parent add79e5157
commit 97b4c469f8
6 changed files with 18 additions and 6 deletions

View File

@ -4,7 +4,9 @@ module Arm
def run block def run block
block.codes.dup.each do |code| block.codes.dup.each do |code|
next unless code.is_a? Register::GetSlot next unless code.is_a? Register::GetSlot
load = ArmMachine.ldr( code.register , code.array , code.index ) # times 4 because arm works in bytes, but vm in words
# + 1 because of the type word
load = ArmMachine.ldr( code.register , code.array , 4 * (code.index + 1) )
block.replace(code , load ) block.replace(code , load )
end end
end end

View File

@ -4,7 +4,9 @@ module Arm
def run block def run block
block.codes.dup.each do |code| block.codes.dup.each do |code|
next unless code.is_a? Register::SetSlot next unless code.is_a? Register::SetSlot
store = ArmMachine.str( code.register , code.array , code.index ) # times 4 because arm works in bytes, but vm in words
# + 1 because of the type word
store = ArmMachine.str( code.register , code.array , 4 * (code.index + 1) )
block.replace(code , store ) block.replace(code , store )
end end
end end

View File

@ -4,7 +4,9 @@ module Arm
def run block def run block
block.codes.dup.each do |code| block.codes.dup.each do |code|
next unless code.is_a? Register::RegisterTransfer next unless code.is_a? Register::RegisterTransfer
move = ArmMachine.mov( code.from , code.to ) # Register machine convention is from => to
# But arm has the receiver/result as the first
move = ArmMachine.mov( code.to , code.from)
block.replace(code , move ) block.replace(code , move )
end end
end end

View File

@ -62,7 +62,7 @@ module Builtin
# get the sys return out of the way # get the sys return out of the way
return_tmp = Register::RegisterReference.tmp_reg return_tmp = Register::RegisterReference.tmp_reg
# load the space into the base register # load the space into the base register
function.info.add_code Register::RegisterTransfer.new( Virtual::Slot::MESSAGE_REGISTER , return_tmp ) function.info.add_code Register::RegisterTransfer.new( return_tmp , Virtual::Slot::MESSAGE_REGISTER )
slot = Virtual::Slot slot = Virtual::Slot
# find the stored message # find the stored message
ind = Parfait::Space.object_space.get_layout().index_of( :syscall_message ) ind = Parfait::Space.object_space.get_layout().index_of( :syscall_message )

View File

@ -8,8 +8,14 @@ module Register
# Get/Set Slot move data around in vm objects, but transfer moves the objects (in the machine) # Get/Set Slot move data around in vm objects, but transfer moves the objects (in the machine)
# #
# Also it is used for moving temorary data # Also it is used for moving temorary data
#
class RegisterTransfer < Instruction class RegisterTransfer < Instruction
# initialize with from and to registers.
# First argument from
# second arguemnt to
#
# Note: this may be reversed from some assembler notations (also arm)
def initialize from , to def initialize from , to
@from = wrap_register(from) @from = wrap_register(from)
@to = wrap_register(to) @to = wrap_register(to)

View File

@ -41,7 +41,7 @@ module Register
# load the frame/message from space by index # load the frame/message from space by index
new_codes << GetSlot.new( space_tmp , 5 , frame_tmp ) new_codes << GetSlot.new( space_tmp , 5 , frame_tmp )
# save the frame in real frame register # save the frame in real frame register
new_codes << RegisterTransfer.new( RegisterReference.frame_reg , frame_tmp ) new_codes << RegisterTransfer.new( frame_tmp , RegisterReference.frame_reg )
# get the next_frame # get the next_frame
new_codes << GetSlot.new( frame_tmp , 2 , frame_tmp) # 2 index of next_frame new_codes << GetSlot.new( frame_tmp , 2 , frame_tmp) # 2 index of next_frame
# save next frame into space # save next frame into space