redid div10 with builder

div10 is right at the edge of what can be understood
no matter the (assmbler) syntax
This commit is contained in:
Torsten Ruger 2018-08-15 19:30:40 +03:00
parent 252ae6de72
commit 43fa7ccbcc
2 changed files with 50 additions and 53 deletions

View File

@ -41,6 +41,7 @@ module Risc
else else
raise "Must create (with !) before using #{name}" unless name[-1] == "!" raise "Must create (with !) before using #{name}" unless name[-1] == "!"
name = name[0 ... -1] name = name[0 ... -1]
#raise "name exists before being created #{name}" if @names.has_key?(name)
type = infer_type(name ) type = infer_type(name )
reg = @compiler.use_reg( type.object_class.name ).set_builder(self) reg = @compiler.use_reg( type.object_class.name ).set_builder(self)
end end
@ -131,8 +132,8 @@ module Risc
build do build do
space! << Parfait.object_space space! << Parfait.object_space
to << space[:next_integer] to << space[:next_integer]
integer_tmp! << to[:next_integer] integer_2! << to[:next_integer]
space[:next_integer] << integer_tmp space[:next_integer] << integer_2
to[Parfait::Integer.integer_index] << from to[Parfait::Integer.integer_index] << from
end end
end end

View File

@ -119,58 +119,54 @@ module Risc
integer_self.reduce_int integer_self.reduce_int
integer_tmp! << integer_self integer_tmp! << integer_self
integer_reg! << integer_self integer_reg! << integer_self
end
me = builder.integer_self
tmp = builder.integer_tmp
q = builder.integer_reg
const = compiler.use_reg :fixnum , value: 1
builder.add_load_data( s , 1 , const )
# int tmp = self >> 1
builder.add_code Risc.op( s , :>> , tmp , const)
# int q = self >> 2
builder.add_load_data( s , 2 , const)
builder.add_code Risc.op( s , :>> , q , const)
# q = q + tmp
builder.add_code Risc.op( s , :+ , q , tmp )
# tmp = q >> 4
builder.add_load_data( s , 4 , const)
builder.add_transfer( s, q , tmp)
builder.add_code Risc.op( s , :>> , tmp , const)
# q = q + tmp
builder.add_code Risc.op( s , :+ , q , tmp )
# tmp = q >> 8
builder.add_load_data( s , 8 , const)
builder.add_transfer( s, q , tmp)
builder.add_code Risc.op( s , :>> , tmp , const)
# q = q + tmp
builder.add_code Risc.op( s , :+ , q , tmp )
# tmp = q >> 16
builder.add_load_data( s , 16 , const)
builder.add_transfer( s, q , tmp)
builder.add_code Risc.op( s , :>> , tmp , const)
# q = q + tmp
builder.add_code Risc.op( s , :+ , q , tmp )
# q = q >> 3
builder.add_load_data( s , 3 , const)
builder.add_code Risc.op( s , :>> , q , const)
# tmp = q * 10
builder.add_load_data( s , 10 , const)
builder.add_transfer( s, q , tmp)
builder.add_code Risc.op( s , :* , tmp , const)
# tmp = self - tmp
builder.add_code Risc.op( s , :- , me , tmp )
builder.add_transfer( s , me , tmp)
# tmp = tmp + 6
builder.add_load_data( s , 6 , const)
builder.add_code Risc.op( s , :+ , tmp , const )
# tmp = tmp >> 4
builder.add_load_data( s , 4 , const)
builder.add_code Risc.op( s , :>> , tmp , const )
# return q + tmp
builder.add_code Risc.op( s , :+ , q , tmp )
builder.add_new_int(s,q , tmp) integer_const! << 1
builder.build{ message[:return_value] << tmp } integer_tmp.op :>> , integer_const
integer_const << 2
integer_reg.op :>> , integer_const
integer_reg.op :+ , integer_tmp
integer_const << 4
integer_tmp << integer_reg
integer_reg.op :>> , integer_tmp
integer_reg.op :+ , integer_tmp
integer_const << 8
integer_tmp << integer_reg
integer_tmp.op :>> , integer_const
integer_reg.op :+ , integer_tmp
integer_const << 16
integer_tmp << integer_reg
integer_tmp.op :>> , integer_const
integer_reg.op :+ , integer_tmp
integer_const << 3
integer_reg.op :>> , integer_const
integer_const << 10
integer_tmp << integer_reg
integer_tmp.op :* , integer_const
integer_self.op :- , integer_tmp
integer_tmp << integer_self
integer_const << 6
integer_tmp.op :+ , integer_const
integer_const << 4
integer_tmp.op :>> , integer_const
integer_reg.op :+ , integer_tmp
add_new_int(s,integer_reg , integer_tmp)
message[:return_value] << integer_tmp
end
compiler.add_mom( Mom::ReturnSequence.new) compiler.add_mom( Mom::ReturnSequence.new)
return compiler return compiler