37 lines
1.2 KiB
Ruby
37 lines
1.2 KiB
Ruby
module Risc
|
|
# load raw data into a register
|
|
#
|
|
# This is not really used by the compiler, or to be more precise: not used during the
|
|
# compilation of ruby code. Ruby code works on Objects only
|
|
#
|
|
# But for Builtin methods, methods that are created programatically and form the runtime,
|
|
# it can be handy to load an integer directly without the object overhead.
|
|
#
|
|
class LoadData < Instruction
|
|
def initialize( source , constant , register)
|
|
super(source)
|
|
@register = register
|
|
@constant = constant
|
|
raise "Not Integer #{constant}" unless constant.is_a?(Integer)
|
|
raise "Not register #{register}" unless RegisterValue.look_like_reg(register)
|
|
end
|
|
attr_accessor :register , :constant
|
|
|
|
# return an array of names of registers that is used by the instruction
|
|
def register_names
|
|
[register.symbol]
|
|
end
|
|
|
|
def to_s
|
|
class_source "#{register} <- #{constant}"
|
|
end
|
|
|
|
end
|
|
def self.load_data( source , value , register = nil )
|
|
raise "can only load integers, not #{value}" unless value.is_a?(Integer)
|
|
type = Parfait.object_space.get_type_by_class_name(:Integer)
|
|
register = RegisterValue.new( "fix_#{value}".to_sym , type ) unless register
|
|
LoadData.new( source , value , register)
|
|
end
|
|
end
|