mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 04:10:18 +02:00
2013-02-04 Paulo Andrade <pcpa@gnu.org> * include/lightning.h, include/lightning/jit_private.h, lib/jit_arm-cpu.c, lib/jit_arm.c, lib/jit_mips-cpu.c, lib/jit_mips.c, lib/jit_ppc-cpu.c, lib/jit_ppc.c, lib/jit_x86-cpu.c, lib/jit_x86.c, lib/lightning.c: Implement the new qmul and qdiv instructions that return signed and unsigned lo/hi multiplication result and div/rem division result. These should be useful for jit translation of code that needs to know if a multiplication overflows (no branch opcode added) or if a division is exact (easy check if remainder is zero). * check/lightning.c, lib/jit_print.c, check/Makefile.am, check/all.tst: Update for the new qmul and qdiv instructions. * check/qalu.inc, check/qalu_div.ok, check/qalu_div.tst, check/qalu_mul.ok, check/qalu_mul.tst: New files implementing simple test cases for qmul and qdiv.
97 lines
3 KiB
PHP
97 lines
3 KiB
PHP
.data 8
|
|
ok:
|
|
.c "ok\n"
|
|
|
|
/* r0,r1 = r2 op r3 */
|
|
#define QALUR(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R2 I0 \
|
|
movi %R3 I1 \
|
|
OP##r##T %R0 %R1 %R2 %R3 \
|
|
bnei OP##T##N##rlo##R0##R1##R2##R3 %R0 LO \
|
|
beqi OP##T##N##rhi##R0##R1##R2##R3 %R1 HI \
|
|
OP##T##N##rlo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##rhi##R0##R1##R2##R3:
|
|
|
|
/* r0,r1 = r2 op i0 */
|
|
#define QALUI(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R2 I0 \
|
|
movi %R3 HI \
|
|
OP##i##T %R0 %R1 %R2 I1 \
|
|
bnei OP##T##N##ilo##R0##R1##R2##R3 %R0 LO \
|
|
beqr OP##T##N##ihi##R0##R1##R2##R3 %R1 %R3 \
|
|
OP##T##N##ilo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##ihi##R0##R1##R2##R3:
|
|
|
|
/* r0,r1 = r0 op r1 */
|
|
#define QALUX(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R0 I0 \
|
|
movi %R1 I1 \
|
|
movi %R2 LO \
|
|
movi %R3 HI \
|
|
OP##r##T %R0 %R1 %R0 %R1 \
|
|
bner OP##T##N##0lo##R0##R1##R2##R3 %R0 %R2 \
|
|
beqr OP##T##N##0hi##R0##R1##R2##R3 %R1 %R3 \
|
|
OP##T##N##0lo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##0hi##R0##R1##R2##R3:
|
|
|
|
/* r0,r1 = r1 op r0 */
|
|
#define QALUY(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R1 I0 \
|
|
movi %R0 I1 \
|
|
movi %R2 LO \
|
|
movi %R3 HI \
|
|
OP##r##T %R0 %R1 %R1 %R0 \
|
|
bner OP##T##N##1lo##R0##R1##R2##R3 %R0 %R2 \
|
|
beqr OP##T##N##1hi##R0##R1##R2##R3 %R1 %R3 \
|
|
OP##T##N##1lo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##1hi##R0##R1##R2##R3:
|
|
|
|
/* r0,r1 = r0 op r3 */
|
|
#define QALUZ(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R0 I0 \
|
|
movi %R3 I1 \
|
|
movi %R2 LO \
|
|
OP##r##T %R0 %R1 %R0 %R3 \
|
|
bner OP##T##N##2lo##R0##R1##R2##R3 %R0 %R2 \
|
|
beqi OP##T##N##2hi##R0##R1##R2##R3 %R1 HI \
|
|
OP##T##N##2lo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##2hi##R0##R1##R2##R3:
|
|
|
|
/* r0,r1 = r2 op r1 */
|
|
#define QALUW(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
movi %R2 I0 \
|
|
movi %R1 I1 \
|
|
movi %R3 LO \
|
|
OP##r##T %R0 %R1 %R2 %R1 \
|
|
bner OP##T##N##3lo##R0##R1##R2##R3 %R0 %R3 \
|
|
beqi OP##T##N##3hi##R0##R1##R2##R3 %R1 HI \
|
|
OP##T##N##3lo##R0##R1##R2##R3: \
|
|
calli @abort \
|
|
OP##T##N##3hi##R0##R1##R2##R3:
|
|
|
|
#define QALU2(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUR(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUI(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUX(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUY(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUZ(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALUW(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3)
|
|
|
|
#define QALU1(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALU2(N, T, OP, I0, I1, LO, HI, R0, R1, R2, R3) \
|
|
QALU2(N, T, OP, I0, I1, LO, HI, R1, R2, R3, R0) \
|
|
QALU2(N, T, OP, I0, I1, LO, HI, R2, R3, R0, R1) \
|
|
QALU2(N, T, OP, I0, I1, LO, HI, R3, R0, R1, R2)
|
|
|
|
#define QALU(N, T, OP, I0, I1, LO, HI) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v0, v1, v2, r0) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v0, v1, v2, r1) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v0, v1, v2, r2) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v1, v2, r0, r1) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v1, v2, r0, r2) \
|
|
QALU1(N, T, OP, I0, I1, LO, HI, v2, r0, r1, r2)
|