module Risc def self.operators [:+, :-, :>>, :<<, :*, :&, :|] end # Destructive operator instructions on the two registers given # # left = left OP right # # With OP being the normal logical and mathematical operations provided by # cpus. Ie "+" , "-", ">>", "<<", "*", "&", "|" # class OperatorInstruction < Instruction def initialize( source , operator , left , right ) super(source) operator = operator.value if operator.is_a?(Vool::Constant) @operator = operator raise "unsuported operator :#{operator}:#{operator.class}:" unless Risc.operators.include?(operator) @left = left @right = right raise "Not register #{left}" unless RegisterValue.look_like_reg(left) raise "Not register #{right}" unless RegisterValue.look_like_reg(right) end attr_reader :operator, :left , :right def to_s class_source "#{left} #{operator} #{right}" end end def self.op( source , operator , left , right ) OperatorInstruction.new( source , operator , left , right ) end end