add register names to allocator
make platform instantiate it basic plumbing
This commit is contained in:
parent
500df01425
commit
8df1b8126f
@ -151,7 +151,8 @@ module Risc
|
|||||||
# The Platform specifies how many registers there are, and the
|
# The Platform specifies how many registers there are, and the
|
||||||
# Allocator changes SSA names to allocated names
|
# Allocator changes SSA names to allocated names
|
||||||
def allocate_regs(platform)
|
def allocate_regs(platform)
|
||||||
allocator = Allocator.new(self , platform)
|
allocator = platform.allocator(self)
|
||||||
|
allocator.allocate_regs
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -8,14 +8,26 @@ module Risc
|
|||||||
# return the translator instance that traslates risc intructions into
|
# return the translator instance that traslates risc intructions into
|
||||||
# platform specific ones
|
# platform specific ones
|
||||||
def translator
|
def translator
|
||||||
|
raise "not implemented"
|
||||||
end
|
end
|
||||||
|
|
||||||
# return an integer where the binary is loaded
|
# return an integer where the binary is loaded
|
||||||
def loaded_at
|
def loaded_at
|
||||||
|
raise "not implemented"
|
||||||
end
|
end
|
||||||
|
|
||||||
# return the number of registers the platform supports
|
# return the number of registers the platform supports
|
||||||
def num_registers
|
def num_registers
|
||||||
|
raise "not implemented"
|
||||||
|
end
|
||||||
|
|
||||||
|
# return the Allocator for the platform
|
||||||
|
# stanrard implementation return StandardAllocator, which uses
|
||||||
|
# num_registers and assumes rXX naming (ie arm + interpreter)
|
||||||
|
#
|
||||||
|
# Possibility to override and implemented different schemes
|
||||||
|
def allocator(compiler)
|
||||||
|
StandardAllocator.new(compiler , self )
|
||||||
end
|
end
|
||||||
|
|
||||||
# Factory method to create a Platform object according to the platform
|
# Factory method to create a Platform object according to the platform
|
||||||
|
@ -13,9 +13,18 @@ module Risc
|
|||||||
@compiler = compiler
|
@compiler = compiler
|
||||||
@platform = platform
|
@platform = platform
|
||||||
@used_regs = {}
|
@used_regs = {}
|
||||||
reset_used_regs
|
@reg_names = (0 ... platform.num_registers).collect{|i| "r#{i-1}".to_sym }
|
||||||
|
end
|
||||||
|
attr_reader :used_regs , :compiler , :platform , :reg_names
|
||||||
|
|
||||||
|
# main entry point and the whole reason for the class.
|
||||||
|
# Allocate regs by changing the names of compiler instructions to
|
||||||
|
# register names according to platform.
|
||||||
|
# Ie on arm register names are r0 .. . r15 , so it keeps a list of unused
|
||||||
|
# regs and frees regs according to live ranges
|
||||||
|
def allocate_regs
|
||||||
|
|
||||||
end
|
end
|
||||||
attr_reader :used_regs , :compiler , :platform
|
|
||||||
|
|
||||||
def used_regs_empty?
|
def used_regs_empty?
|
||||||
@used_regs.empty?
|
@used_regs.empty?
|
||||||
@ -43,12 +52,6 @@ module Risc
|
|||||||
RegisterValue.new( sym , type, extra)
|
RegisterValue.new( sym , type, extra)
|
||||||
end
|
end
|
||||||
|
|
||||||
def copy( reg , source )
|
|
||||||
copied = use_reg reg.type
|
|
||||||
add_code Register.transfer( source , reg , copied )
|
|
||||||
copied
|
|
||||||
end
|
|
||||||
|
|
||||||
# releasing a register (accuired by use_reg) makes it available for use again
|
# releasing a register (accuired by use_reg) makes it available for use again
|
||||||
# thus avoiding possibly using too many registers
|
# thus avoiding possibly using too many registers
|
||||||
def release_reg( reg )
|
def release_reg( reg )
|
||||||
@ -57,12 +60,5 @@ module Risc
|
|||||||
@used_regs.delete(reg)
|
@used_regs.delete(reg)
|
||||||
end
|
end
|
||||||
|
|
||||||
# reset the registers to be used. Start at r4 for next usage.
|
|
||||||
# Every statement starts with this, meaning each statement may use all registers, but none
|
|
||||||
# get saved. Statements have affect on objects.
|
|
||||||
def reset_used_regs
|
|
||||||
@used_regs.clear
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -12,5 +12,9 @@ module Risc
|
|||||||
def test_factory_raise
|
def test_factory_raise
|
||||||
assert_raises{ Platform.for("NotArm")}
|
assert_raises{ Platform.for("NotArm")}
|
||||||
end
|
end
|
||||||
|
def test_allocate
|
||||||
|
allocator = Platform.new.allocator(FakeCompiler.new)
|
||||||
|
assert_equal FakeCompiler , allocator.compiler.class
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,6 +16,9 @@ module Risc
|
|||||||
def test_empty
|
def test_empty
|
||||||
assert @allocator.used_regs_empty?
|
assert @allocator.used_regs_empty?
|
||||||
end
|
end
|
||||||
|
def test_reg_names
|
||||||
|
assert_equal 16 , @allocator.reg_names.length
|
||||||
|
end
|
||||||
def test_compiler
|
def test_compiler
|
||||||
assert_equal CallableCompiler , @allocator.compiler.class
|
assert_equal CallableCompiler , @allocator.compiler.class
|
||||||
assert_equal :fake_name , @allocator.compiler.callable.name
|
assert_equal :fake_name , @allocator.compiler.callable.name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user