1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00
guile/check/qalu.inc
pcpa d91b25d1be Implement the qmul and qdiv instructions.
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.
2013-02-04 18:54:37 -02:00

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)