implement the div10 as assembler

easy after the some version worked
because it’s not arm it probably twice as long as need be
better (any?) optimisation would take care of that
still, nice to see it works
This commit is contained in:
Torsten Ruger 2015-11-21 14:20:25 +02:00
parent ffc69fd2a5
commit d0b655d05f
2 changed files with 55 additions and 1 deletions

View File

@ -156,7 +156,7 @@ module Register
end
obj = @space.get_class_by_name(:Integer)
[ :putint, :mod4].each do |f| #mod4 is just a forward declaration
[ :putint, :mod4, :div10].each do |f| #mod4 is just a forward declaration
obj.add_instance_method Builtin::Integer.send(f , nil)
end
end

View File

@ -14,6 +14,60 @@ module Register
return compiler.method
end
def div10 context
s = "div_10"
compiler = Soml::Compiler.new.create_method(:Integer,:div10 ).init_method
me = compiler.process( s(:name , :self) )
tmp = compiler.process( s(:name , :self) )
q = compiler.process( s(:name , :self) )
const = compiler.process( s(:int , 1) )
# int tmp = self >> 1
compiler.add_code Register.op( s , ">>" , tmp , const)
# int q = self >> 2
compiler.add_code Register.load_constant( s , 2 , const)
compiler.add_code Register.op( s , ">>" , q , const)
# q = q + tmp
compiler.add_code Register.op( s , "+" , q , tmp )
# tmp = q >> 4
compiler.add_code Register.load_constant( s , 4 , const)
compiler.add_code Register.transfer( s, q , tmp)
compiler.add_code Register.op( s , ">>" , tmp , const)
# q = q + tmp
compiler.add_code Register.op( s , "+" , q , tmp )
# tmp = q >> 8
compiler.add_code Register.load_constant( s , 8 , const)
compiler.add_code Register.transfer( s, q , tmp)
compiler.add_code Register.op( s , ">>" , tmp , const)
# q = q + tmp
compiler.add_code Register.op( s , "+" , q , tmp )
# tmp = q >> 16
compiler.add_code Register.load_constant( s , 16 , const)
compiler.add_code Register.transfer( s, q , tmp)
compiler.add_code Register.op( s , ">>" , tmp , const)
# q = q + tmp
compiler.add_code Register.op( s , "+" , q , tmp )
# q = q >> 3
compiler.add_code Register.load_constant( s , 3 , const)
compiler.add_code Register.op( s , ">>" , q , const)
# tmp = q * 10
compiler.add_code Register.load_constant( s , 10 , const)
compiler.add_code Register.transfer( s, q , tmp)
compiler.add_code Register.op( s , "*" , tmp , const)
# tmp = self - tmp
compiler.add_code Register.op( s , "-" , me , tmp )
compiler.add_code Register.transfer( s , me , tmp)
# tmp = tmp + 6
compiler.add_code Register.load_constant( s , 6 , const)
compiler.add_code Register.op( s , "+" , tmp , const )
# tmp = tmp >> 4
compiler.add_code Register.load_constant( s , 4 , const)
compiler.add_code Register.op( s , ">>" , tmp , const )
# return q + tmp
compiler.add_code Register.op( s , "+" , q , tmp )
compiler.add_code Register.set_slot( s , q , :message , :return_value)
return compiler.method
end
end
extend ClassMethods
end