893df4b79b
This provides adi, sbi, mli, dvi, rmi, ngi, dvu, rmu 8, but is missing shifts and rotates. It is also missing conversions between 8-byte integers and other sizes of integers or floats. The code might not be all correct, but works at least some of the time. I adapted this from how ncg i86 does 4-byte integers, but I use a different algorithm when dividing by a large value: i86 avoids the div instruction and uses a shift-and-subtract loop; but I use the div instruction to estimate a quotient, which is more like how big integer libraries do division. My .dvi8 and .dvu8 also set ecx:ebx to the remainder; this might be a bad idea, because it requires .dvi8 and .dvu8 to always calculate the remainder, even when the caller only wants the quotient. To play with 8-byte integers, I wrote EM procedures like mes 2, 4, 4 exp $ngi pro $ngi,0 ldl 4 ngi 8 lol 0 sti 8 lol 0 ret 4 end exp $adi pro $adi,0 ldl 4 ldl 12 adi 8 lol 0 sti 8 lol 0 ret 4 end and called them from C like typedef struct { int l; int h; } q; q ngi(q); q adi(q, q); |
||
---|---|---|
.. | ||
adi.s | ||
and.s | ||
blm.s | ||
build.lua | ||
cii.s | ||
cms.s | ||
com.s | ||
csa4.s | ||
csb4.s | ||
cuu.s | ||
dup.s | ||
dvi.s | ||
dvi8.s | ||
dvu.s | ||
error.s | ||
exg.s | ||
fat.s | ||
fp8087.s | ||
gto.s | ||
iaar.s | ||
ilar.s | ||
inn.s | ||
ior.s | ||
isar.s | ||
lar4.s | ||
LIST | ||
loi.s | ||
mli.s | ||
mli8.s | ||
mon.s | ||
ngi.s | ||
nop.s | ||
print.s | ||
rck.s | ||
rmi.s | ||
rmu.s | ||
rol.s | ||
ror.s | ||
sar4.s | ||
sbi.s | ||
set.s | ||
sli.s | ||
sri.s | ||
sti.s | ||
strhp.s | ||
trp.s | ||
unknown.s | ||
xor.s |