small arm fixes etc

This commit is contained in:
Torsten Ruger
2018-06-06 00:53:41 +03:00
parent d7b3368b28
commit 4ab6d62acf
8 changed files with 79 additions and 11 deletions

View File

@ -91,10 +91,10 @@ 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
left = @left.address 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)
right = Risc::Position.get(left) - Risc::Position.get(self) - 8
right = Risc::Position.get(left) - 8
right -= Risc::Position.get(self).at
if( (right < 0) && ((opcode == :add) || (opcode == :sub)) )
right *= -1 # this works as we never issue sub only add
set_opcode :sub # so (as we can't change the sign permanently) we can change the opcode

View File

@ -46,6 +46,11 @@ module Parfait
end
end
def ensure_next
extend_one unless @next
@next
end
def each_block( &block )
block.call( self )
@next.each_block( &block ) if @next

View File

@ -39,9 +39,33 @@ module Risc
end
def position_changed(position)
fix_binary
my_pos = Position.get(@instruction)
my_pos.set(position.at + position.object.byte_length)
end
# check that the binary we use is the one where the current position falls
# if not move up and register/unregister (soon)
def fix_binary
return if Position.get(@instruction).at == -1
count = 0
org_pos = Position.get(@binary)
return if org_pos.at == -1
while( !pos_in_binary)
@binary = @binary.ensure_next
count += 1
raise "Positions messed #{Position.get(@instruction)}:#{org_pos}"
end
end
def pos_in_binary
me = Position.get(@instruction)
bin = Position.get(@binary)
return false if me < bin
return false if me > (bin + @binary.padded_length)
return true
end
# initialize the dependency graph for instructions
#
# starting from the given instruction, create Positions

View File

@ -73,6 +73,17 @@ module Risc
offset = offset.at if offset.is_a?(Position)
@at - offset
end
def <(right)
right = right.at if right.is_a?(Position)
@at < right
end
def >(right)
right = right.at if right.is_a?(Position)
@at > right
end
def to_s
"0x#{@at.to_s(16)}"
end
@ -129,7 +140,7 @@ module Risc
@reverse_cache.delete(position.at) unless position.object.is_a?(Label)
testing = self.at( position.at ) unless position.at < 0
if testing and testing.object.class != position.object.class
raise "Mismatch (at #{pos.to_s(16)}) was:#{position} #{position.class} #{position.object} , should #{testing}#{testing.class}"
raise "Mismatch (at #{to.to_s(16)}) was:#{position} #{position.class} #{position.object} , should #{testing}#{testing.class}"
end
self.positions[position.object] = position
@reverse_cache[to] = position unless position.object.is_a?(Label)