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_attributes [:register] 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