mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-20 18:50:21 +02:00
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.
This commit is contained in:
parent
708cca9465
commit
d91b25d1be
22 changed files with 1073 additions and 95 deletions
|
@ -48,8 +48,12 @@ static char *code_name[] = {
|
|||
"subcr", "subci",
|
||||
"subxr", "subxi",
|
||||
"mulr", "muli",
|
||||
"qmulr", "qmuli",
|
||||
"qmulr_u", "qmuli_u",
|
||||
"divr", "divi",
|
||||
"divr_u", "divi_u",
|
||||
"qdivr", "qdivi",
|
||||
"qdivr_u", "qdivi_u",
|
||||
"remr", "remi",
|
||||
"remr_u", "remi_u",
|
||||
"andr", "andi",
|
||||
|
@ -248,7 +252,7 @@ _jit_print(jit_state_t *_jit)
|
|||
continue;
|
||||
}
|
||||
value = jit_classify(node->code) &
|
||||
(jit_cc_a0_int|jit_cc_a0_jmp|jit_cc_a0_reg|
|
||||
(jit_cc_a0_int|jit_cc_a0_jmp|jit_cc_a0_reg|jit_cc_a0_rlh|
|
||||
jit_cc_a1_reg|jit_cc_a1_int|jit_cc_a1_flt|jit_cc_a1_dbl|
|
||||
jit_cc_a2_reg|jit_cc_a2_int|jit_cc_a2_flt|jit_cc_a2_dbl);
|
||||
if (value & jit_cc_a0_jmp)
|
||||
|
@ -303,6 +307,16 @@ _jit_print(jit_state_t *_jit)
|
|||
print_chr(' '); print_reg(node->u.w);
|
||||
print_chr(' '); print_reg(node->v.w);
|
||||
print_chr(' '); print_hex(node->w.w); continue;
|
||||
q_r_r:
|
||||
print_str(" ("); print_reg(node->u.q.l);
|
||||
print_chr(' '); print_reg(node->u.q.h);
|
||||
print_str(") "); print_reg(node->v.w);
|
||||
print_chr(' '); print_reg(node->w.w); continue;
|
||||
q_r_w:
|
||||
print_str(" ("); print_reg(node->u.q.l);
|
||||
print_chr(' '); print_reg(node->u.q.h);
|
||||
print_str(") "); print_reg(node->v.w);
|
||||
print_chr(' '); print_hex(node->w.w); continue;
|
||||
r_r_f:
|
||||
print_chr(' '); print_reg(node->u.w);
|
||||
print_chr(' '); print_reg(node->v.w);
|
||||
|
@ -419,6 +433,12 @@ _jit_print(jit_state_t *_jit)
|
|||
goto r_r_r;
|
||||
case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_int:
|
||||
goto r_r_w;
|
||||
case jit_cc_a0_reg|jit_cc_a0_rlh|
|
||||
jit_cc_a1_reg|jit_cc_a2_reg:
|
||||
goto q_r_r;
|
||||
case jit_cc_a0_reg|jit_cc_a0_rlh|
|
||||
jit_cc_a1_reg|jit_cc_a2_int:
|
||||
goto q_r_w;
|
||||
case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_flt:
|
||||
goto r_r_f;
|
||||
case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_dbl:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue