rubyx/lib/soml/parfait/integer.soml
Torsten Ruger 4a8bb32039 serious bit fiddling, div10 using shift magic
forgot that arm has no division (or respectively only later models have)
many magic formulae out there, none seem to work 1000% on the
interpreter. some big 0 ending numbers are 1 off.
2015-11-13 20:46:27 +02:00

122 lines
1.9 KiB
Plaintext

class Integer < Value
int as_char()
if_plus( self - 9)
return 32
else
return 48 + self
end
end
int high_times( int by_high , int by_low)
int num_high = self >> 16
int num_low = self & 65535
int res_high = by_high * num_high
num_low = by_high * num_low
num_high = num_high * by_low
num_high = num_low + num_high
num_high = num_high >> 16
res_high = res_high + num_high
return res_high
end
int low_times( int by_high , int by_low)
int num_high = self >> 16
int num_low = self & 65535
int res_low = by_low * num_low
num_low = by_high * num_low
num_high = num_high * by_low
num_low = num_low + num_high
num_low = num_low << 16
res_low = res_low + num_low
return res_low
end
int div10()
int minus_10 = self - 10
int me = self
int tmp = me >> 2
me = me - tmp
tmp = me >> 4
me = me + tmp
tmp = me >> 8
me = me + tmp
tmp = me >> 16
me = me + tmp
me = me >> 3
int tmp2 = me << 2
tmp2 = me + tmp2
tmp2 = tmp2 << 1
minus_10 = tmp2 - minus_10
if_minus(minus_10)
me = me + 1
end
return me
end
int div10_almost()
int me = self
if_zero( me >> 26 )
me = me + 1
end
int res_high = me.high_times( 26214 , 26215 )
int res_low = self >> 31
res_high = res_high >> 2
return res_high + res_low
end
Word as_string(Word str)
if_minus( self - 10 )
int num = as_char()
str = str.push_char( num )
else
int rest = self.div10()
str = rest.as_string( str )
rest = rest * 10
rest = self - rest
str = rest.as_string(str)
end
return str
end
Word to_s()
Word start = " "
return as_string( start )
end
int puti()
Word str = self.to_s()
str.putstring()
return self
end
int mod4()
return self & 3
end
end