1987-01-29 22:10:18 +00:00
|
|
|
.define .cii
|
|
|
|
.sect .text
|
|
|
|
.sect .rom
|
|
|
|
.sect .data
|
|
|
|
.sect .bss
|
|
|
|
|
|
|
|
.sect .text
|
|
|
|
.cii:
|
|
|
|
move.l (sp)+, a0 ! return address
|
|
|
|
move.l (sp)+, d0 ! destination size
|
|
|
|
sub.l (sp)+, d0 ! destination - source size
|
|
|
|
bgt 1f
|
|
|
|
sub.l d0, sp ! pop extra bytes
|
|
|
|
jmp (a0)
|
|
|
|
1:
|
Add 8-byte long long for linux68k.
Add rules for 8-byte integers to m68020 ncg. Add 8-byte long long to
ACK C on linux68k. Enable long-long tests for linux68k. The tests
pass in our emulator using musahi; I don't have a real 68k processor
and haven't tried other emulators.
Still missing are conversions between 8-byte integers and any size of
floats. The long-long tests don't cover these conversions, and our
emulator can't do floating-point.
Our build always enables TBL68020 and uses word size 4. Without
TBL68020, 8-byte multiply and divide are missing. With word size 2,
some conversions between 2-byte and 8-byte integers are missing.
Fix .cii in libem, which didn't work when converting from 1-byte or
2-byte integers. Now .cii and .cuu work, but also add some rules to
skip .cii and .cuu when converting 8-byte integers. The new rule for
loc 4 loc 8 cii `with test_set4` exposes a bug: the table may believe
that the condition codes test a 4-byte register when they only test a
word or byte, and this incorrect test may describe an unsigned word or
byte as negative. Another rule `with exact test_set1+test_set2` works
around the bug by ignoring the negative flag, because a zero-extended
word or byte is never negative.
The old rules for comparison and logic do work with 8-byte integers
and bitsets, but add some specific 8-byte rules to skip libem calls or
loops. There were no rules for 8-byte arithmetic, shift, or rotate;
so add some. There is a register shortage, because the table requires
preserving d3 to d7, leaving only 3 data registers (d0, d1, d2) for
8-byte operations. Because of the shortage, the code may move data to
an address register, or read a memory location more than once.
The multiplication and division code are translations of the i386
code. They pass the tests, but might not give the best performance on
a real 68k processor.
2019-09-24 17:32:17 +00:00
|
|
|
move.l (sp), d1
|
|
|
|
lsr.l #1, d0
|
|
|
|
bcs 1f ! branch if source size == 1
|
|
|
|
lsr.l #1, d0
|
|
|
|
bcs 2f ! branch if source size == 2
|
|
|
|
tst.l d1
|
|
|
|
bra 4f
|
|
|
|
1: lsr.l #1, d0 ! size difference / 4
|
|
|
|
ext.w d1
|
|
|
|
2: ext.l d1
|
|
|
|
move.l d1, (sp)
|
|
|
|
4: slt d1
|
|
|
|
extb.l d1 ! d1 contains sign of source
|
1987-01-29 22:10:18 +00:00
|
|
|
sub.l #1, d0
|
|
|
|
2:
|
|
|
|
move.l d1, -(sp)
|
|
|
|
dbf d0, 2b
|
|
|
|
jmp (a0)
|
|
|
|
.align 2
|