35 lines
1.1 KiB
Ruby
35 lines
1.1 KiB
Ruby
|
module Mom
|
||
|
module Builtin
|
||
|
class Comparison < ::Mom::Instruction
|
||
|
attr_reader :operator
|
||
|
def initialize(name , operator)
|
||
|
super(name)
|
||
|
@operator = operator
|
||
|
end
|
||
|
def to_risc(compiler)
|
||
|
builder = compiler.builder(compiler.source)
|
||
|
operator = @operator # make accessible in block
|
||
|
builder.build do
|
||
|
integer! << message[:receiver]
|
||
|
integer.reduce_int
|
||
|
integer_reg! << message[:arguments]
|
||
|
integer_reg << integer_reg[Parfait::NamedList.type_length + 0] #"other" is at index 0
|
||
|
integer_reg.reduce_int
|
||
|
swap_names(:integer , :integer_reg) if(operator.to_s.start_with?('<') )
|
||
|
integer.op :- , integer_reg
|
||
|
if_minus false_label
|
||
|
if_zero( false_label ) if operator.to_s.length == 1
|
||
|
object! << Parfait.object_space.true_object
|
||
|
branch merge_label
|
||
|
add_code false_label
|
||
|
object << Parfait.object_space.false_object
|
||
|
add_code merge_label
|
||
|
message[:return_value] << object
|
||
|
end
|
||
|
return compiler
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|