1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-21 11:10:21 +02:00

Correct implementation problems on ix86.

* check/all.tst, check/lightning.c: Only declare or use 64 bit
	interfaces on 64 bit builds.

	* check/fib.tst: Use simpler logic to not need preprocessor
	conditionals for 32 or 64 bit.

	* include/lightning.h: Only declare 64 bit macros on a 64 bit
	build. Code using lightning must know about wordsize and the
	jit generation limitations, also, this way it generates a
	compile time failure, not a runtime assertion.

	* include/lightning/jit_x86.h: Correct typo in macro name.

	* lib/jit_arm.c, lib/jit_arm-cpu.c, lib/jit_mips.c,
	lib/jit_mips-cpu.c, lib/jit_ppc.c, lib/jit_ppc-cpu.c,
	lib/jit_x86.c, lib/jit_x86-cpu.c: Correct wrong code to get
	current jit function pointer.

	* lib/lightning.c: Move call to the simplify() optimization
	to after register liveness is known. Previous code did work
	by accident but now with proper test cases the problem was
	noticed.

	* lib/jit_disasm.c: Always cast bfd_vma to long long when
	passing it as printf argument.
This commit is contained in:
pcpa 2012-12-03 09:40:08 -02:00
parent e6f1df7124
commit 712877a5a4
16 changed files with 229 additions and 182 deletions

View file

@ -1,3 +1,31 @@
2012-12-03 Paulo Andrade <pcpa@gnu.org>
* check/all.tst, check/lightning.c: Only declare or use 64 bit
interfaces on 64 bit builds.
* check/fib.tst: Use simpler logic to not need preprocessor
conditionals for 32 or 64 bit.
* include/lightning.h: Only declare 64 bit macros on a 64 bit
build. Code using lightning must know about wordsize and the
jit generation limitations, also, this way it generates a
compile time failure, not a runtime assertion.
* include/lightning/jit_x86.h: Correct typo in macro name.
* lib/jit_arm.c, lib/jit_arm-cpu.c, lib/jit_mips.c,
lib/jit_mips-cpu.c, lib/jit_ppc.c, lib/jit_ppc-cpu.c,
lib/jit_x86.c, lib/jit_x86-cpu.c: Correct wrong code to get
current jit function pointer.
* lib/lightning.c: Move call to the simplify() optimization
to after register liveness is known. Previous code did work
by accident but now with proper test cases the problem was
noticed.
* lib/jit_disasm.c: Always cast bfd_vma to long long when
passing it as printf argument.
2012-12-03 Paulo Andrade <pcpa@gnu.org> 2012-12-03 Paulo Andrade <pcpa@gnu.org>
* configure.ac, check/Makefile.am, check/check.sh, * configure.ac, check/Makefile.am, check/check.sh,

View file

@ -7,15 +7,19 @@
arg $s arg $s
arg $us arg $us
arg $i arg $i
#if __WORDSIZE == 64
arg $ui arg $ui
arg $l arg $l
#endif
getarg_c %r0 $c getarg_c %r0 $c
getarg_uc %r0 $uc getarg_uc %r0 $uc
getarg_s %r0 $s getarg_s %r0 $s
getarg_us %r0 $us getarg_us %r0 $us
getarg_i %r0 $i getarg_i %r0 $i
#if __WORDSIZE == 64
getarg_ui %r0 $ui getarg_ui %r0 $ui
getarg_l %r0 $l getarg_l %r0 $l
#endif
addr %r0 %r1 %r2 addr %r0 %r1 %r2
addi %r0 %r1 2 addi %r0 %r1 2
addxr %r0 %r1 %r2 addxr %r0 %r1 %r2
@ -78,8 +82,10 @@
extr_uc %r0 %r1 extr_uc %r0 %r1
extr_s %r0 %r1 extr_s %r0 %r1
extr_us %r0 %r1 extr_us %r0 %r1
#if __WORDSIZE == 64
extr_i %r0 %r1 extr_i %r0 %r1
extr_ui %r0 %r1 extr_ui %r0 %r1
#endif
htonr %r0 %r1 htonr %r0 %r1
ntohr %r0 %r1 ntohr %r0 %r1
ldr_c %r0 %r1 ldr_c %r0 %r1
@ -92,10 +98,12 @@
ldi_us %r0 0x80000000 ldi_us %r0 0x80000000
ldr_i %r0 %r1 ldr_i %r0 %r1
ldi_i %r0 0x80000000 ldi_i %r0 0x80000000
#if __WORDSIZE == 64
ldr_ui %r0 %r1 ldr_ui %r0 %r1
ldi_ui %r0 0x80000000 ldi_ui %r0 0x80000000
ldr_l %r0 %r1 ldr_l %r0 %r1
ldi_l %r0 0x80000000 ldi_l %r0 0x80000000
#endif
ldxr_c %r0 %r1 %r2 ldxr_c %r0 %r1 %r2
ldxi_c %r0 %r1 1 ldxi_c %r0 %r1 1
ldxr_uc %r0 %r1 %r2 ldxr_uc %r0 %r1 %r2
@ -106,26 +114,32 @@
ldxi_us %r0 %r1 2 ldxi_us %r0 %r1 2
ldxr_i %r0 %r1 %r2 ldxr_i %r0 %r1 %r2
ldxi_i %r0 %r1 4 ldxi_i %r0 %r1 4
#if __WORDSIZE == 64
ldxr_ui %r0 %r1 %r2 ldxr_ui %r0 %r1 %r2
ldxi_ui %r0 %r1 4 ldxi_ui %r0 %r1 4
ldxr_l %r0 %r1 %r2 ldxr_l %r0 %r1 %r2
ldxi_l %r0 %r1 8 ldxi_l %r0 %r1 8
#endif
str_c %r1 %r0 str_c %r1 %r0
sti_c 0x80000000 %r1 sti_c 0x80000000 %r1
str_s %r1 %r0 str_s %r1 %r0
sti_s 0x80000000 %r1 sti_s 0x80000000 %r1
str_i %r1 %r0 str_i %r1 %r0
sti_i 0x80000000 %r1 sti_i 0x80000000 %r1
#if __WORDSIZE == 64
str_l %r1 %r0 str_l %r1 %r0
sti_l 0x80000000 %r1 sti_l 0x80000000 %r1
#endif
stxr_c %r2 %r1 %r0 stxr_c %r2 %r1 %r0
stxi_c 1 %r1 %r0 stxi_c 1 %r1 %r0
stxr_s %r2 %r1 %r0 stxr_s %r2 %r1 %r0
stxi_s 2 %r1 %r0 stxi_s 2 %r1 %r0
stxr_i %r2 %r1 %r0 stxr_i %r2 %r1 %r0
stxi_i 4 %r1 %r0 stxi_i 4 %r1 %r0
#if __WORDSIZE == 64
stxr_l %r2 %r1 %r0 stxr_l %r2 %r1 %r0
stxi_l 8 %r1 %r0 stxi_l 8 %r1 %r0
#endif
cond: cond:
bltr cond %r0 %r1 bltr cond %r0 %r1
condi: condi:
@ -196,8 +210,10 @@ label:
retval_s %r1 retval_s %r1
retval_us %r1 retval_us %r1
retval_i %r1 retval_i %r1
#if __WORDSIZE == 64
retval_ui %r1 retval_ui %r1
retval_l %r1 retval_l %r1
#endif
arg_f $f arg_f $f
getarg_f %f1 $f getarg_f %f1 $f
addr_f %f0 %f1 %f2 addr_f %f0 %f1 %f2
@ -240,7 +256,9 @@ label:
unordr_f %r0 %f0 %f1 unordr_f %r0 %f0 %f1
unordi_f %r0 %f0 0.5 unordi_f %r0 %f0 0.5
truncr_f_i %r0 %f0 truncr_f_i %r0 %f0
#if __WORDSIZE == 64
truncr_f_l %r0 %f0 truncr_f_l %r0 %f0
#endif
extr_f %f0 %r0 extr_f %f0 %r0
extr_d_f %f0 %f1 extr_d_f %f0 %f1
movr_f %f0 %f1 movr_f %f0 %f1
@ -334,7 +352,9 @@ unordi:
unordr_d %r0 %f0 %f1 unordr_d %r0 %f0 %f1
unordi_d %r0 %f0 0.5 unordi_d %r0 %f0 0.5
truncr_d_i %r0 %f0 truncr_d_i %r0 %f0
#if __WORDSIZE == 64
truncr_d_l %r0 %f0 truncr_d_l %r0 %f0
#endif
extr_d %f0 %r0 extr_d %f0 %r0
extr_f_d %f0 %f1 extr_f_d %f0 %f1
movr_d %f0 %f1 movr_d %f0 %f1

View file

@ -8,7 +8,7 @@ format:
nfibs: nfibs:
prolog prolog
arg $in arg $in
getarg_ui %r2 $in // R2 = n getarg %r2 $in // R2 = n
movi %r1 1 movi %r1 1
blti_u ref %r2 2 blti_u ref %r2 2
subi %r2 %r2 1 subi %r2 %r2 1

View file

@ -247,8 +247,10 @@ static void allocai(void);
static void arg(void); static void arg(void);
static void getarg_c(void); static void getarg_uc(void); static void getarg_c(void); static void getarg_uc(void);
static void getarg_s(void); static void getarg_us(void); static void getarg_s(void); static void getarg_us(void);
static void getarg_i(void); static void getarg_ui(void); static void getarg_i(void);
static void getarg_l(void); #if __WORDSIZE == 64
static void getarg_ui(void); static void getarg_l(void);
#endif
static void getarg(void); static void getarg(void);
static void addr(void); static void addi(void); static void addr(void); static void addi(void);
static void addxr(void); static void addxi(void); static void addxr(void); static void addxi(void);
@ -281,33 +283,43 @@ static void ner(void); static void nei(void);
static void movr(void); static void movi(void); static void movr(void); static void movi(void);
static void extr_c(void); static void extr_uc(void); static void extr_c(void); static void extr_uc(void);
static void extr_s(void); static void extr_us(void); static void extr_s(void); static void extr_us(void);
#if __WORDSIZE == 64
static void extr_i(void); static void extr_ui(void); static void extr_i(void); static void extr_ui(void);
#endif
static void htonr(void); static void ntohr(void); static void htonr(void); static void ntohr(void);
static void ldr_c(void); static void ldi_c(void); static void ldr_c(void); static void ldi_c(void);
static void ldr_uc(void); static void ldi_uc(void); static void ldr_uc(void); static void ldi_uc(void);
static void ldr_s(void); static void ldi_s(void); static void ldr_s(void); static void ldi_s(void);
static void ldr_us(void); static void ldi_us(void); static void ldr_us(void); static void ldi_us(void);
static void ldr_i(void); static void ldi_i(void); static void ldr_i(void); static void ldi_i(void);
#if __WORDSIZE == 64
static void ldr_ui(void); static void ldi_ui(void); static void ldr_ui(void); static void ldi_ui(void);
static void ldr_l(void); static void ldi_l(void); static void ldr_l(void); static void ldi_l(void);
#endif
static void ldr(void); static void ldi(void); static void ldr(void); static void ldi(void);
static void ldxr_c(void); static void ldxi_c(void); static void ldxr_c(void); static void ldxi_c(void);
static void ldxr_uc(void); static void ldxi_uc(void); static void ldxr_uc(void); static void ldxi_uc(void);
static void ldxr_s(void); static void ldxi_s(void); static void ldxr_s(void); static void ldxi_s(void);
static void ldxr_us(void); static void ldxi_us(void); static void ldxr_us(void); static void ldxi_us(void);
static void ldxr_i(void); static void ldxi_i(void); static void ldxr_i(void); static void ldxi_i(void);
#if __WORDSIZE == 64
static void ldxr_ui(void); static void ldxi_ui(void); static void ldxr_ui(void); static void ldxi_ui(void);
static void ldxr_l(void); static void ldxi_l(void); static void ldxr_l(void); static void ldxi_l(void);
#endif
static void ldxr(void); static void ldxi(void); static void ldxr(void); static void ldxi(void);
static void str_c(void); static void sti_c(void); static void str_c(void); static void sti_c(void);
static void str_s(void); static void sti_s(void); static void str_s(void); static void sti_s(void);
static void str_i(void); static void sti_i(void); static void str_i(void); static void sti_i(void);
#if __WORDSIZE == 64
static void str_l(void); static void sti_l(void); static void str_l(void); static void sti_l(void);
#endif
static void str(void); static void sti(void); static void str(void); static void sti(void);
static void stxr_c(void); static void stxi_c(void); static void stxr_c(void); static void stxi_c(void);
static void stxr_s(void); static void stxi_s(void); static void stxr_s(void); static void stxi_s(void);
static void stxr_i(void); static void stxi_i(void); static void stxr_i(void); static void stxi_i(void);
#if __WORDSIZE == 64
static void stxr_l(void); static void stxi_l(void); static void stxr_l(void); static void stxi_l(void);
#endif
static void stxr(void); static void stxi(void); static void stxr(void); static void stxi(void);
static void bltr(void); static void blti(void); static void bltr(void); static void blti(void);
static void bltr_u(void); static void blti_u(void); static void bltr_u(void); static void blti_u(void);
@ -338,8 +350,10 @@ static void ret(void);
static void retr(void); static void reti(void); static void retr(void); static void reti(void);
static void retval_c(void); static void retval_uc(void); static void retval_c(void); static void retval_uc(void);
static void retval_s(void); static void retval_us(void); static void retval_s(void); static void retval_us(void);
static void retval_i(void); static void retval_ui(void); static void retval_i(void);
static void retval_l(void); #if __WORDSIZE == 64
static void retval_ui(void); static void retval_l(void);
#endif
static void retval(void); static void retval(void);
static void epilog(void); static void epilog(void);
static void arg_f(void); static void arg_f(void);
@ -516,8 +530,10 @@ static instr_t instr_vector[] = {
entry(arg), entry(arg),
entry(getarg_c), entry(getarg_uc), entry(getarg_c), entry(getarg_uc),
entry(getarg_s), entry(getarg_us), entry(getarg_s), entry(getarg_us),
entry(getarg_i), entry(getarg_ui), entry(getarg_i),
entry(getarg_l), #if __WORDSIZE == 64
entry(getarg_ui), entry(getarg_l),
#endif
entry(getarg), entry(getarg),
entry(addr), entry(addi), entry(addr), entry(addi),
entry(addxr), entry(addxi), entry(addxr), entry(addxi),
@ -550,33 +566,43 @@ static instr_t instr_vector[] = {
entry(movr), entry(movi), entry(movr), entry(movi),
entry(extr_c), entry(extr_uc), entry(extr_c), entry(extr_uc),
entry(extr_s), entry(extr_us), entry(extr_s), entry(extr_us),
#if __WORDSIZE == 64
entry(extr_i), entry(extr_ui), entry(extr_i), entry(extr_ui),
#endif
entry(htonr), entry(ntohr), entry(htonr), entry(ntohr),
entry(ldr_c), entry(ldi_c), entry(ldr_c), entry(ldi_c),
entry(ldr_uc), entry(ldi_uc), entry(ldr_uc), entry(ldi_uc),
entry(ldr_s), entry(ldi_s), entry(ldr_s), entry(ldi_s),
entry(ldr_us), entry(ldi_us), entry(ldr_us), entry(ldi_us),
entry(ldr_i), entry(ldi_i), entry(ldr_i), entry(ldi_i),
#if __WORDSIZE == 64
entry(ldr_ui), entry(ldi_ui), entry(ldr_ui), entry(ldi_ui),
entry(ldr_l), entry(ldi_l), entry(ldr_l), entry(ldi_l),
#endif
entry(ldr), entry(ldi), entry(ldr), entry(ldi),
entry(ldxr_c), entry(ldxi_c), entry(ldxr_c), entry(ldxi_c),
entry(ldxr_uc), entry(ldxi_uc), entry(ldxr_uc), entry(ldxi_uc),
entry(ldxr_s), entry(ldxi_s), entry(ldxr_s), entry(ldxi_s),
entry(ldxr_us), entry(ldxi_us), entry(ldxr_us), entry(ldxi_us),
entry(ldxr_i), entry(ldxi_i), entry(ldxr_i), entry(ldxi_i),
#if __WORDSIZE == 64
entry(ldxr_ui), entry(ldxi_ui), entry(ldxr_ui), entry(ldxi_ui),
entry(ldxr_l), entry(ldxi_l), entry(ldxr_l), entry(ldxi_l),
#endif
entry(ldxr), entry(ldxi), entry(ldxr), entry(ldxi),
entry(str_c), entry(sti_c), entry(str_c), entry(sti_c),
entry(str_s), entry(sti_s), entry(str_s), entry(sti_s),
entry(str_i), entry(sti_i), entry(str_i), entry(sti_i),
#if __WORDSIZE == 64
entry(str_l), entry(sti_l), entry(str_l), entry(sti_l),
#endif
entry(str), entry(sti), entry(str), entry(sti),
entry(stxr_c), entry(stxi_c), entry(stxr_c), entry(stxi_c),
entry(stxr_s), entry(stxi_s), entry(stxr_s), entry(stxi_s),
entry(stxr_i), entry(stxi_i), entry(stxr_i), entry(stxi_i),
#if __WORDSIZE == 64
entry(stxr_l), entry(stxi_l), entry(stxr_l), entry(stxi_l),
#endif
entry(stxr), entry(stxi), entry(stxr), entry(stxi),
entry(bltr), entry(blti), entry(bltr), entry(blti),
entry(bltr_u), entry(blti_u), entry(bltr_u), entry(blti_u),
@ -607,8 +633,10 @@ static instr_t instr_vector[] = {
entry(retr), entry(reti), entry(retr), entry(reti),
entry(retval_c), entry(retval_uc), entry(retval_c), entry(retval_uc),
entry(retval_s), entry(retval_us), entry(retval_s), entry(retval_us),
entry(retval_i), entry(retval_ui), entry(retval_i),
entry(retval_l), #if __WORDSIZE == 64
entry(retval_ui), entry(retval_l),
#endif
entry(retval), entry(retval),
entry(epilog), entry(epilog),
entry(arg_f), entry(arg_f),
@ -1180,8 +1208,10 @@ allocai(void) {
entry_ca(arg) entry_ca(arg)
entry_ia(getarg_c) entry_ia(getarg_uc) entry_ia(getarg_c) entry_ia(getarg_uc)
entry_ia(getarg_s) entry_ia(getarg_us) entry_ia(getarg_s) entry_ia(getarg_us)
entry_ia(getarg_i) entry_ia(getarg_ui) entry_ia(getarg_i)
entry_ia(getarg_l) #if __WORDSIZE == 64
entry_ia(getarg_ui) entry_ia(getarg_l)
#endif
entry_ia(getarg) entry_ia(getarg)
entry_ir_ir_ir(addr) entry_ir_ir_im(addi) entry_ir_ir_ir(addr) entry_ir_ir_im(addi)
entry_ir_ir_ir(addxr) entry_ir_ir_im(addxi) entry_ir_ir_ir(addxr) entry_ir_ir_im(addxi)
@ -1253,33 +1283,43 @@ movi(void)
} }
entry_ir_ir(extr_c) entry_ir_ir(extr_uc) entry_ir_ir(extr_c) entry_ir_ir(extr_uc)
entry_ir_ir(extr_s) entry_ir_ir(extr_us) entry_ir_ir(extr_s) entry_ir_ir(extr_us)
#if __WORDSIZE == 64
entry_ir_ir(extr_i) entry_ir_ir(extr_ui) entry_ir_ir(extr_i) entry_ir_ir(extr_ui)
#endif
entry_ir_ir(htonr) entry_ir_ir(ntohr) entry_ir_ir(htonr) entry_ir_ir(ntohr)
entry_ir_ir(ldr_c) entry_ir_pm(ldi_c) entry_ir_ir(ldr_c) entry_ir_pm(ldi_c)
entry_ir_ir(ldr_uc) entry_ir_pm(ldi_uc) entry_ir_ir(ldr_uc) entry_ir_pm(ldi_uc)
entry_ir_ir(ldr_s) entry_ir_pm(ldi_s) entry_ir_ir(ldr_s) entry_ir_pm(ldi_s)
entry_ir_ir(ldr_us) entry_ir_pm(ldi_us) entry_ir_ir(ldr_us) entry_ir_pm(ldi_us)
entry_ir_ir(ldr_i) entry_ir_pm(ldi_i) entry_ir_ir(ldr_i) entry_ir_pm(ldi_i)
#if __WORDSIZE == 64
entry_ir_ir(ldr_ui) entry_ir_pm(ldi_ui) entry_ir_ir(ldr_ui) entry_ir_pm(ldi_ui)
entry_ir_ir(ldr_l) entry_ir_pm(ldi_l) entry_ir_ir(ldr_l) entry_ir_pm(ldi_l)
#endif
entry_ir_ir(ldr) entry_ir_pm(ldi) entry_ir_ir(ldr) entry_ir_pm(ldi)
entry_ir_ir_ir(ldxr_c) entry_ir_ir_im(ldxi_c) entry_ir_ir_ir(ldxr_c) entry_ir_ir_im(ldxi_c)
entry_ir_ir_ir(ldxr_uc) entry_ir_ir_im(ldxi_uc) entry_ir_ir_ir(ldxr_uc) entry_ir_ir_im(ldxi_uc)
entry_ir_ir_ir(ldxr_s) entry_ir_ir_im(ldxi_s) entry_ir_ir_ir(ldxr_s) entry_ir_ir_im(ldxi_s)
entry_ir_ir_ir(ldxr_us) entry_ir_ir_im(ldxi_us) entry_ir_ir_ir(ldxr_us) entry_ir_ir_im(ldxi_us)
entry_ir_ir_ir(ldxr_i) entry_ir_ir_im(ldxi_i) entry_ir_ir_ir(ldxr_i) entry_ir_ir_im(ldxi_i)
#if __WORDSIZE == 64
entry_ir_ir_ir(ldxr_ui) entry_ir_ir_im(ldxi_ui) entry_ir_ir_ir(ldxr_ui) entry_ir_ir_im(ldxi_ui)
entry_ir_ir_ir(ldxr_l) entry_ir_ir_im(ldxi_l) entry_ir_ir_ir(ldxr_l) entry_ir_ir_im(ldxi_l)
#endif
entry_ir_ir_ir(ldxr) entry_ir_ir_im(ldxi) entry_ir_ir_ir(ldxr) entry_ir_ir_im(ldxi)
entry_ir_ir(str_c) entry_pm_ir(sti_c) entry_ir_ir(str_c) entry_pm_ir(sti_c)
entry_ir_ir(str_s) entry_pm_ir(sti_s) entry_ir_ir(str_s) entry_pm_ir(sti_s)
entry_ir_ir(str_i) entry_pm_ir(sti_i) entry_ir_ir(str_i) entry_pm_ir(sti_i)
#if __WORDSIZE == 64
entry_ir_ir(str_l) entry_pm_ir(sti_l) entry_ir_ir(str_l) entry_pm_ir(sti_l)
#endif
entry_ir_ir(str) entry_pm_ir(sti) entry_ir_ir(str) entry_pm_ir(sti)
entry_ir_ir_ir(stxr_c) entry_im_ir_ir(stxi_c) entry_ir_ir_ir(stxr_c) entry_im_ir_ir(stxi_c)
entry_ir_ir_ir(stxr_s) entry_im_ir_ir(stxi_s) entry_ir_ir_ir(stxr_s) entry_im_ir_ir(stxi_s)
entry_ir_ir_ir(stxr_i) entry_im_ir_ir(stxi_i) entry_ir_ir_ir(stxr_i) entry_im_ir_ir(stxi_i)
#if __WORDSIZE == 64
entry_ir_ir_ir(stxr_l) entry_im_ir_ir(stxi_l) entry_ir_ir_ir(stxr_l) entry_im_ir_ir(stxi_l)
#endif
entry_ir_ir_ir(stxr) entry_im_ir_ir(stxi) entry_ir_ir_ir(stxr) entry_im_ir_ir(stxi)
entry_lb_ir_ir(bltr) entry_lb_ir_im(blti) entry_lb_ir_ir(bltr) entry_lb_ir_im(blti)
entry_lb_ir_ir(bltr_u) entry_lb_ir_im(blti_u) entry_lb_ir_ir(bltr_u) entry_lb_ir_im(blti_u)
@ -1310,8 +1350,10 @@ entry(ret)
entry_ir(retr) entry_im(reti) entry_ir(retr) entry_im(reti)
entry_ir(retval_c) entry_ir(retval_uc) entry_ir(retval_c) entry_ir(retval_uc)
entry_ir(retval_s) entry_ir(retval_us) entry_ir(retval_s) entry_ir(retval_us)
entry_ir(retval_i) entry_ir(retval_ui) entry_ir(retval_i)
entry_ir(retval_l) #if __WORDSIZE == 64
entry_ir(retval_ui) entry_ir(retval_l)
#endif
entry_ir(retval) entry_ir(retval)
entry(epilog) entry(epilog)
entry_ca(arg_f) entry_ca(arg_f)

View file

@ -122,14 +122,12 @@ typedef enum {
#define jit_getarg_s(u,v) _jit_getarg_s(_jit,u,v) #define jit_getarg_s(u,v) _jit_getarg_s(_jit,u,v)
#define jit_getarg_us(u,v) _jit_getarg_us(_jit,u,v) #define jit_getarg_us(u,v) _jit_getarg_us(_jit,u,v)
#define jit_getarg_i(u,v) _jit_getarg_i(_jit,u,v) #define jit_getarg_i(u,v) _jit_getarg_i(_jit,u,v)
/* >> 64 bit */
#define jit_getarg_ui(u,v) _jit_getarg_ui(_jit,u,v)
#define jit_getarg_l(u,v) _jit_getarg_l(_jit,u,v)
/* << 64 bit */
#if __WORDSIZE == 32 #if __WORDSIZE == 32
# define jit_getarg(u,v) jit_getarg_i(u,v) # define jit_getarg(u,v) jit_getarg_i(u,v)
#else #else
# define jit_getarg(u,v) jit_getarg_l(u,v) # define jit_getarg(u,v) jit_getarg_l(u,v)
# define jit_getarg_ui(u,v) _jit_getarg_ui(_jit,u,v)
# define jit_getarg_l(u,v) _jit_getarg_l(_jit,u,v)
#endif #endif
#define jit_addr(u,v,w) jit_new_node_www(jit_code_addr,u,v,w) #define jit_addr(u,v,w) jit_new_node_www(jit_code_addr,u,v,w)
@ -231,11 +229,11 @@ typedef enum {
#define jit_extr_s(u,v) jit_new_node_ww(jit_code_extr_s,u,v) #define jit_extr_s(u,v) jit_new_node_ww(jit_code_extr_s,u,v)
#define jit_extr_us(u,v) jit_new_node_ww(jit_code_extr_us,u,v) #define jit_extr_us(u,v) jit_new_node_ww(jit_code_extr_us,u,v)
jit_code_extr_s, jit_code_extr_us, jit_code_extr_s, jit_code_extr_us,
/* >> 64 bit */ #if __WORDSIZE == 64
# define jit_extr_i(u,v) jit_new_node_ww(jit_code_extr_i,u,v) # define jit_extr_i(u,v) jit_new_node_ww(jit_code_extr_i,u,v)
# define jit_extr_ui(u,v) jit_new_node_ww(jit_code_extr_ui,u,v) # define jit_extr_ui(u,v) jit_new_node_ww(jit_code_extr_ui,u,v)
#endif
jit_code_extr_i, jit_code_extr_ui, jit_code_extr_i, jit_code_extr_ui,
/* << 64 bit */
#define jit_htonr(u,v) jit_new_node_ww(jit_code_htonr,u,v) #define jit_htonr(u,v) jit_new_node_ww(jit_code_htonr,u,v)
#define jit_ntohr(u,v) jit_new_node_ww(jit_code_htonr,u,v) #define jit_ntohr(u,v) jit_new_node_ww(jit_code_htonr,u,v)
jit_code_htonr, jit_code_htonr,
@ -261,15 +259,13 @@ typedef enum {
#else #else
# define jit_ldr(u,v) jit_ldr_l(u,v) # define jit_ldr(u,v) jit_ldr_l(u,v)
# define jit_ldi(u,v) jit_ldi_l(u,v) # define jit_ldi(u,v) jit_ldi_l(u,v)
#endif
/* >> 64 bit */
# define jit_ldr_ui(u,v) jit_new_node_ww(jit_code_ldr_ui,u,v) # define jit_ldr_ui(u,v) jit_new_node_ww(jit_code_ldr_ui,u,v)
# define jit_ldi_ui(u,v) jit_new_node_ww(jit_code_ldi_ui,u,v) # define jit_ldi_ui(u,v) jit_new_node_ww(jit_code_ldi_ui,u,v)
jit_code_ldr_ui, jit_code_ldi_ui,
#define jit_ldr_l(u,v) jit_new_node_ww(jit_code_ldr_l,u,v) #define jit_ldr_l(u,v) jit_new_node_ww(jit_code_ldr_l,u,v)
#define jit_ldi_l(u,v) jit_new_node_ww(jit_code_ldi_l,u,v) #define jit_ldi_l(u,v) jit_new_node_ww(jit_code_ldi_l,u,v)
#endif
jit_code_ldr_ui, jit_code_ldi_ui,
jit_code_ldr_l, jit_code_ldi_l, jit_code_ldr_l, jit_code_ldi_l,
/* << 64 bit */
#define jit_ldxr_c(u,v,w) jit_new_node_www(jit_code_ldxr_c,u,v,w) #define jit_ldxr_c(u,v,w) jit_new_node_www(jit_code_ldxr_c,u,v,w)
#define jit_ldxi_c(u,v,w) jit_new_node_www(jit_code_ldxi_c,u,v,w) #define jit_ldxi_c(u,v,w) jit_new_node_www(jit_code_ldxi_c,u,v,w)
@ -315,12 +311,10 @@ typedef enum {
#else #else
# define jit_str(u,v) jit_str_l(u,v) # define jit_str(u,v) jit_str_l(u,v)
# define jit_sti(u,v) jit_sti_l(u,v) # define jit_sti(u,v) jit_sti_l(u,v)
#endif
/* >> 64 bit */
# define jit_str_l(u,v) jit_new_node_ww(jit_code_str_l,u,v) # define jit_str_l(u,v) jit_new_node_ww(jit_code_str_l,u,v)
# define jit_sti_l(u,v) jit_new_node_ww(jit_code_sti_l,u,v) # define jit_sti_l(u,v) jit_new_node_ww(jit_code_sti_l,u,v)
#endif
jit_code_str_l, jit_code_sti_l, jit_code_str_l, jit_code_sti_l,
/* << 64 bit */
#define jit_stxr_c(u,v,w) jit_new_node_www(jit_code_stxr_c,u,v,w) #define jit_stxr_c(u,v,w) jit_new_node_www(jit_code_stxr_c,u,v,w)
#define jit_stxi_c(u,v,w) jit_new_node_www(jit_code_stxi_c,u,v,w) #define jit_stxi_c(u,v,w) jit_new_node_www(jit_code_stxi_c,u,v,w)
@ -335,14 +329,12 @@ typedef enum {
# define jit_stxr(u,v,w) jit_stxr_i(u,v,w) # define jit_stxr(u,v,w) jit_stxr_i(u,v,w)
# define jit_stxi(u,v,w) jit_stxi_i(u,v,w) # define jit_stxi(u,v,w) jit_stxi_i(u,v,w)
#else #else
# define jit_stxr(u,v,w) jit_stxr_l(u,v,w)
# define jit_stxi(u,v,w) jit_stxi_l(u,v,w)
# define jit_stxr_l(u,v,w) jit_new_node_www(jit_code_stxr_l,u,v,w) # define jit_stxr_l(u,v,w) jit_new_node_www(jit_code_stxr_l,u,v,w)
# define jit_stxi_l(u,v,w) jit_new_node_www(jit_code_stxi_l,u,v,w) # define jit_stxi_l(u,v,w) jit_new_node_www(jit_code_stxi_l,u,v,w)
#endif #endif
/* >> 64 bit */
#define jit_stxr(u,v,w) jit_stxr_l(u,v,w)
#define jit_stxi(u,v,w) jit_stxi_l(u,v,w)
jit_code_stxr_l, jit_code_stxi_l, jit_code_stxr_l, jit_code_stxi_l,
/* << 64 bit */
#define jit_bltr(v,w) jit_new_node_pww(jit_code_bltr,NULL,v,w) #define jit_bltr(v,w) jit_new_node_pww(jit_code_bltr,NULL,v,w)
#define jit_blti(v,w) jit_new_node_pww(jit_code_blti,NULL,v,w) #define jit_blti(v,w) jit_new_node_pww(jit_code_blti,NULL,v,w)
@ -427,14 +419,12 @@ typedef enum {
#define jit_retval_s(u) _jit_retval_s(_jit,u) #define jit_retval_s(u) _jit_retval_s(_jit,u)
#define jit_retval_us(u) _jit_retval_us(_jit,u) #define jit_retval_us(u) _jit_retval_us(_jit,u)
#define jit_retval_i(u) _jit_retval_i(_jit,u) #define jit_retval_i(u) _jit_retval_i(_jit,u)
/* >> 64 bit */
#define jit_retval_ui(u) _jit_retval_ui(_jit,u)
#define jit_retval_l(u) _jit_retval_l(_jit,u)
/* << 64 bit */
#if __WORDSIZE == 32 #if __WORDSIZE == 32
# define jit_retval(u) jit_retval_i(u) # define jit_retval(u) jit_retval_i(u)
#else #else
# define jit_retval(u) jit_retval_l(u) # define jit_retval(u) jit_retval_l(u)
# define jit_retval_ui(u) _jit_retval_ui(_jit,u)
# define jit_retval_l(u) _jit_retval_l(_jit,u)
#endif #endif
/* Usually should not need to call directly, but useful if need /* Usually should not need to call directly, but useful if need
* to get a label just before a jit_prolog() call */ * to get a label just before a jit_prolog() call */
@ -510,11 +500,9 @@ typedef enum {
# define jit_truncr_f(u,v) jit_truncr_f_i(u,v) # define jit_truncr_f(u,v) jit_truncr_f_i(u,v)
#else #else
# define jit_truncr_f(u,v) jit_truncr_f_l(u,v) # define jit_truncr_f(u,v) jit_truncr_f_l(u,v)
#endif
/* >> 64 bit */
# define jit_truncr_f_l(u,v) jit_new_node_ww(jit_code_truncr_f_l,u,v) # define jit_truncr_f_l(u,v) jit_new_node_ww(jit_code_truncr_f_l,u,v)
#endif
jit_code_truncr_f_l, jit_code_truncr_f_l,
/* << 64 bit */
#define jit_extr_f(u,v) jit_new_node_ww(jit_code_extr_f,u,v) #define jit_extr_f(u,v) jit_new_node_ww(jit_code_extr_f,u,v)
#define jit_extr_d_f(u,v) jit_new_node_ww(jit_code_extr_d_f,u,v) #define jit_extr_d_f(u,v) jit_new_node_ww(jit_code_extr_d_f,u,v)
jit_code_extr_f, jit_code_extr_d_f, jit_code_extr_f, jit_code_extr_d_f,
@ -655,11 +643,9 @@ typedef enum {
# define jit_truncr_d(u,v) jit_truncr_d_i(u,v) # define jit_truncr_d(u,v) jit_truncr_d_i(u,v)
#else #else
# define jit_truncr_d(u,v) jit_truncr_d_l(u,v) # define jit_truncr_d(u,v) jit_truncr_d_l(u,v)
#endif
/* >> 64 bit */
# define jit_truncr_d_l(u,v) jit_new_node_ww(jit_code_truncr_d_l,u,v) # define jit_truncr_d_l(u,v) jit_new_node_ww(jit_code_truncr_d_l,u,v)
#endif
jit_code_truncr_d_l, jit_code_truncr_d_l,
/* << 64 bit */
#define jit_extr_d(u,v) jit_new_node_ww(jit_code_extr_f,u,v) #define jit_extr_d(u,v) jit_new_node_ww(jit_code_extr_f,u,v)
#define jit_extr_f_d(u,v) jit_new_node_ww(jit_code_extr_f_d,u,v) #define jit_extr_f_d(u,v) jit_new_node_ww(jit_code_extr_f_d,u,v)
jit_code_extr_d, jit_code_extr_f_d, jit_code_extr_d, jit_code_extr_f_d,

View file

@ -37,7 +37,7 @@ typedef enum {
# define jit_r_num() 3 # define jit_r_num() 3
# define jit_v(i) (_RBX + (i)) # define jit_v(i) (_RBX + (i))
# define jit_v_num() 3 # define jit_v_num() 3
# define jit_arg_reg_p(i) 0 # define jit_arg_f_reg_p(i) 0
# define jit_f(i) (jit_cpu.sse2 ? _XMM0 + (i) : _ST0 + (i)) # define jit_f(i) (jit_cpu.sse2 ? _XMM0 + (i) : _ST0 + (i))
# define jit_f_num() (jit_cpu.sse2 ? 8 : 6) # define jit_f_num() (jit_cpu.sse2 ? 8 : 6)
# define JIT_FRET _ST0 # define JIT_FRET _ST0

View file

@ -3562,11 +3562,6 @@ _calli_p(jit_state_t *_jit, jit_word_t i0)
static void static void
_prolog(jit_state_t *_jit, jit_node_t *node) _prolog(jit_state_t *_jit, jit_node_t *node)
{ {
jit_function_t *function;
jit_pointer_t *functions;
functions = _jit->functions->v.obj;
function = functions[node->u.w];
if (jit_thumb_p()) { if (jit_thumb_p()) {
/* switch to thumb mode (better approach would be to /* switch to thumb mode (better approach would be to
* ORR 1 address being called, but no clear distinction * ORR 1 address being called, but no clear distinction
@ -3592,7 +3587,7 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
PUSH(0x3ff|(1<<_FP_REGNO)|(1<<_LR_REGNO)); PUSH(0x3ff|(1<<_FP_REGNO)|(1<<_LR_REGNO));
} }
movr(_FP_REGNO, _SP_REGNO); movr(_FP_REGNO, _SP_REGNO);
subi(_SP_REGNO, _SP_REGNO, function->stack); subi(_SP_REGNO, _SP_REGNO, _jit->function->stack);
} }
static void static void

View file

@ -1340,7 +1340,7 @@ _jit_emit(jit_state_t *_jit)
calli(node->u.w); calli(node->u.w);
break; break;
case jit_code_prolog: case jit_code_prolog:
_jit->function = _jit->functions.ptr + node->u.w; _jit->function = _jit->functions.ptr + node->w.w;
undo.node = node; undo.node = node;
undo.word = _jit->pc.w; undo.word = _jit->pc.w;
undo.data = _jit->consts.data; undo.data = _jit->consts.data;
@ -1353,6 +1353,7 @@ _jit_emit(jit_state_t *_jit)
prolog(node); prolog(node);
break; break;
case jit_code_epilog: case jit_code_epilog:
assert(_jit->function == _jit->functions.ptr + node->w.w);
if (_jit->again) { if (_jit->again) {
for (temp = undo.node->next; for (temp = undo.node->next;
temp != node; temp = temp->next) { temp != node; temp = temp->next) {

View file

@ -194,7 +194,7 @@ disasm_print_address(bfd_vma addr, struct disassemble_info *info)
{ {
char buffer[address_buffer_length]; char buffer[address_buffer_length];
sprintf(buffer, address_buffer_format, (jit_word_t)addr); sprintf(buffer, address_buffer_format, (long long)addr);
(*info->fprintf_func)(info->stream, "0x%s", buffer); (*info->fprintf_func)(info->stream, "0x%s", buffer);
if (disasm_num_symbols) { if (disasm_num_symbols) {
@ -287,7 +287,7 @@ disassemble(jit_pointer_t code, jit_int32_t length)
} }
} }
#endif #endif
bytes = sprintf(buffer, address_buffer_format, (jit_word_t)pc); bytes = sprintf(buffer, address_buffer_format, (long long)pc);
(*disasm_info.fprintf_func)(disasm_stream, "%*c0x%s\t", (*disasm_info.fprintf_func)(disasm_stream, "%*c0x%s\t",
16 - bytes, ' ', buffer); 16 - bytes, ' ', buffer);
pc += (*disasm_print)(pc, &disasm_info); pc += (*disasm_print)(pc, &disasm_info);

View file

@ -2697,80 +2697,74 @@ _calli(jit_state_t *_jit, jit_word_t i0)
static void static void
_prolog(jit_state_t *_jit, jit_node_t *node) _prolog(jit_state_t *_jit, jit_node_t *node)
{ {
jit_function_t *function;
jit_pointer_t *functions;
functions = _jit->functions->v.obj;
function = functions[node->u.w];
/* callee save registers */ /* callee save registers */
subi(_SP_REGNO, _SP_REGNO, stack_framesize); subi(_SP_REGNO, _SP_REGNO, stack_framesize);
#if __WORDSIZE == 32 #if __WORDSIZE == 32
if (jit_regset_tstbit(function->regset, _F30)) if (jit_regset_tstbit(_jit->function->regset, _F30))
stxi_d(96, _SP_REGNO, _F30_REGNO); stxi_d(96, _SP_REGNO, _F30_REGNO);
if (jit_regset_tstbit(function->regset, _F28)) if (jit_regset_tstbit(_jit->function->regset, _F28))
stxi_d(88, _SP_REGNO, _F28_REGNO); stxi_d(88, _SP_REGNO, _F28_REGNO);
if (jit_regset_tstbit(function->regset, _F26)) if (jit_regset_tstbit(_jit->function->regset, _F26))
stxi_d(80, _SP_REGNO, _F26_REGNO); stxi_d(80, _SP_REGNO, _F26_REGNO);
if (jit_regset_tstbit(function->regset, _F24)) if (jit_regset_tstbit(_jit->function->regset, _F24))
stxi_d(72, _SP_REGNO, _F24_REGNO); stxi_d(72, _SP_REGNO, _F24_REGNO);
if (jit_regset_tstbit(function->regset, _F22)) if (jit_regset_tstbit(_jit->function->regset, _F22))
stxi_d(64, _SP_REGNO, _F22_REGNO); stxi_d(64, _SP_REGNO, _F22_REGNO);
if (jit_regset_tstbit(function->regset, _F20)) if (jit_regset_tstbit(_jit->function->regset, _F20))
stxi_d(56, _SP_REGNO, _F20_REGNO); stxi_d(56, _SP_REGNO, _F20_REGNO);
if (jit_regset_tstbit(function->regset, _F18)) if (jit_regset_tstbit(_jit->function->regset, _F18))
stxi_d(48, _SP_REGNO, _F18_REGNO); stxi_d(48, _SP_REGNO, _F18_REGNO);
if (jit_regset_tstbit(function->regset, _F16)) if (jit_regset_tstbit(_jit->function->regset, _F16))
stxi_d(40, _SP_REGNO, _F16_REGNO); stxi_d(40, _SP_REGNO, _F16_REGNO);
if (jit_regset_tstbit(function->regset, _S7)) if (jit_regset_tstbit(_jit->function->regset, _S7))
stxi(36, _SP_REGNO, _S7_REGNO); stxi(36, _SP_REGNO, _S7_REGNO);
if (jit_regset_tstbit(function->regset, _S6)) if (jit_regset_tstbit(_jit->function->regset, _S6))
stxi(32, _SP_REGNO, _S6_REGNO); stxi(32, _SP_REGNO, _S6_REGNO);
if (jit_regset_tstbit(function->regset, _S5)) if (jit_regset_tstbit(_jit->function->regset, _S5))
stxi(28, _SP_REGNO, _S5_REGNO); stxi(28, _SP_REGNO, _S5_REGNO);
if (jit_regset_tstbit(function->regset, _S4)) if (jit_regset_tstbit(_jit->function->regset, _S4))
stxi(24, _SP_REGNO, _S4_REGNO); stxi(24, _SP_REGNO, _S4_REGNO);
if (jit_regset_tstbit(function->regset, _S3)) if (jit_regset_tstbit(_jit->function->regset, _S3))
stxi(20, _SP_REGNO, _S3_REGNO); stxi(20, _SP_REGNO, _S3_REGNO);
if (jit_regset_tstbit(function->regset, _S2)) if (jit_regset_tstbit(_jit->function->regset, _S2))
stxi(16, _SP_REGNO, _S2_REGNO); stxi(16, _SP_REGNO, _S2_REGNO);
if (jit_regset_tstbit(function->regset, _S1)) if (jit_regset_tstbit(_jit->function->regset, _S1))
stxi(12, _SP_REGNO, _S1_REGNO); stxi(12, _SP_REGNO, _S1_REGNO);
if (jit_regset_tstbit(function->regset, _S0)) if (jit_regset_tstbit(_jit->function->regset, _S0))
stxi( 8, _SP_REGNO, _S0_REGNO); stxi( 8, _SP_REGNO, _S0_REGNO);
stxi( 4, _SP_REGNO, _RA_REGNO); stxi( 4, _SP_REGNO, _RA_REGNO);
#else #else
if (jit_regset_tstbit(function->regset, _F30)) if (jit_regset_tstbit(_jit->function->regset, _F30))
stxi_d(136, _SP_REGNO, _F30_REGNO); stxi_d(136, _SP_REGNO, _F30_REGNO);
if (jit_regset_tstbit(function->regset, _F28)) if (jit_regset_tstbit(_jit->function->regset, _F28))
stxi_d(128, _SP_REGNO, _F28_REGNO); stxi_d(128, _SP_REGNO, _F28_REGNO);
if (jit_regset_tstbit(function->regset, _F26)) if (jit_regset_tstbit(_jit->function->regset, _F26))
stxi_d(120, _SP_REGNO, _F26_REGNO); stxi_d(120, _SP_REGNO, _F26_REGNO);
if (jit_regset_tstbit(function->regset, _F24)) if (jit_regset_tstbit(_jit->function->regset, _F24))
stxi_d(112, _SP_REGNO, _F24_REGNO); stxi_d(112, _SP_REGNO, _F24_REGNO);
if (jit_regset_tstbit(function->regset, _F22)) if (jit_regset_tstbit(_jit->function->regset, _F22))
stxi_d(104, _SP_REGNO, _F22_REGNO); stxi_d(104, _SP_REGNO, _F22_REGNO);
if (jit_regset_tstbit(function->regset, _F20)) if (jit_regset_tstbit(_jit->function->regset, _F20))
stxi_d(96, _SP_REGNO, _F20_REGNO); stxi_d(96, _SP_REGNO, _F20_REGNO);
if (jit_regset_tstbit(function->regset, _F18)) if (jit_regset_tstbit(_jit->function->regset, _F18))
stxi_d(88, _SP_REGNO, _F18_REGNO); stxi_d(88, _SP_REGNO, _F18_REGNO);
if (jit_regset_tstbit(function->regset, _F16)) if (jit_regset_tstbit(_jit->function->regset, _F16))
stxi_d(80, _SP_REGNO, _F16_REGNO); stxi_d(80, _SP_REGNO, _F16_REGNO);
if (jit_regset_tstbit(function->regset, _S7)) if (jit_regset_tstbit(_jit->function->regset, _S7))
stxi(72, _SP_REGNO, _S7_REGNO); stxi(72, _SP_REGNO, _S7_REGNO);
if (jit_regset_tstbit(function->regset, _S6)) if (jit_regset_tstbit(_jit->function->regset, _S6))
stxi(64, _SP_REGNO, _S6_REGNO); stxi(64, _SP_REGNO, _S6_REGNO);
if (jit_regset_tstbit(function->regset, _S5)) if (jit_regset_tstbit(_jit->function->regset, _S5))
stxi(56, _SP_REGNO, _S5_REGNO); stxi(56, _SP_REGNO, _S5_REGNO);
if (jit_regset_tstbit(function->regset, _S4)) if (jit_regset_tstbit(_jit->function->regset, _S4))
stxi(48, _SP_REGNO, _S4_REGNO); stxi(48, _SP_REGNO, _S4_REGNO);
if (jit_regset_tstbit(function->regset, _S3)) if (jit_regset_tstbit(_jit->function->regset, _S3))
stxi(40, _SP_REGNO, _S3_REGNO); stxi(40, _SP_REGNO, _S3_REGNO);
if (jit_regset_tstbit(function->regset, _S2)) if (jit_regset_tstbit(_jit->function->regset, _S2))
stxi(32, _SP_REGNO, _S2_REGNO); stxi(32, _SP_REGNO, _S2_REGNO);
if (jit_regset_tstbit(function->regset, _S1)) if (jit_regset_tstbit(_jit->function->regset, _S1))
stxi(24, _SP_REGNO, _S1_REGNO); stxi(24, _SP_REGNO, _S1_REGNO);
if (jit_regset_tstbit(function->regset, _S0)) if (jit_regset_tstbit(_jit->function->regset, _S0))
stxi(16, _SP_REGNO, _S0_REGNO); stxi(16, _SP_REGNO, _S0_REGNO);
stxi( 8, _SP_REGNO, _RA_REGNO); stxi( 8, _SP_REGNO, _RA_REGNO);
#endif #endif
@ -2778,86 +2772,80 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
movr(_BP_REGNO, _SP_REGNO); movr(_BP_REGNO, _SP_REGNO);
/* alloca */ /* alloca */
subi(_SP_REGNO, _SP_REGNO, function->stack); subi(_SP_REGNO, _SP_REGNO, _jit->function->stack);
} }
static void static void
_epilog(jit_state_t *_jit, jit_node_t *node) _epilog(jit_state_t *_jit, jit_node_t *node)
{ {
jit_function_t *function;
jit_pointer_t *functions;
functions = _jit->functions->v.obj;
function = functions[node->w.w];
/* callee save registers */ /* callee save registers */
movr(_SP_REGNO, _BP_REGNO); movr(_SP_REGNO, _BP_REGNO);
#if __WORDSIZE == 32 #if __WORDSIZE == 32
if (jit_regset_tstbit(function->regset, _F30)) if (jit_regset_tstbit(_jit->function->regset, _F30))
ldxi_d(_F30_REGNO, _SP_REGNO, 96); ldxi_d(_F30_REGNO, _SP_REGNO, 96);
if (jit_regset_tstbit(function->regset, _F28)) if (jit_regset_tstbit(_jit->function->regset, _F28))
ldxi_d(_F28_REGNO, _SP_REGNO, 88); ldxi_d(_F28_REGNO, _SP_REGNO, 88);
if (jit_regset_tstbit(function->regset, _F26)) if (jit_regset_tstbit(_jit->function->regset, _F26))
ldxi_d(_F26_REGNO, _SP_REGNO, 80); ldxi_d(_F26_REGNO, _SP_REGNO, 80);
if (jit_regset_tstbit(function->regset, _F24)) if (jit_regset_tstbit(_jit->function->regset, _F24))
ldxi_d(_F24_REGNO, _SP_REGNO, 72); ldxi_d(_F24_REGNO, _SP_REGNO, 72);
if (jit_regset_tstbit(function->regset, _F22)) if (jit_regset_tstbit(_jit->function->regset, _F22))
ldxi_d(_F22_REGNO, _SP_REGNO, 64); ldxi_d(_F22_REGNO, _SP_REGNO, 64);
if (jit_regset_tstbit(function->regset, _F20)) if (jit_regset_tstbit(_jit->function->regset, _F20))
ldxi_d(_F20_REGNO, _SP_REGNO, 56); ldxi_d(_F20_REGNO, _SP_REGNO, 56);
if (jit_regset_tstbit(function->regset, _F18)) if (jit_regset_tstbit(_jit->function->regset, _F18))
ldxi_d(_F18_REGNO, _SP_REGNO, 48); ldxi_d(_F18_REGNO, _SP_REGNO, 48);
if (jit_regset_tstbit(function->regset, _F16)) if (jit_regset_tstbit(_jit->function->regset, _F16))
ldxi_d(_F16_REGNO, _SP_REGNO, 40); ldxi_d(_F16_REGNO, _SP_REGNO, 40);
if (jit_regset_tstbit(function->regset, _S7)) if (jit_regset_tstbit(_jit->function->regset, _S7))
ldxi(_S7_REGNO, _SP_REGNO, 36); ldxi(_S7_REGNO, _SP_REGNO, 36);
if (jit_regset_tstbit(function->regset, _S6)) if (jit_regset_tstbit(_jit->function->regset, _S6))
ldxi(_S6_REGNO, _SP_REGNO, 32); ldxi(_S6_REGNO, _SP_REGNO, 32);
if (jit_regset_tstbit(function->regset, _S5)) if (jit_regset_tstbit(_jit->function->regset, _S5))
ldxi(_S5_REGNO, _SP_REGNO, 28); ldxi(_S5_REGNO, _SP_REGNO, 28);
if (jit_regset_tstbit(function->regset, _S4)) if (jit_regset_tstbit(_jit->function->regset, _S4))
ldxi(_S4_REGNO, _SP_REGNO, 24); ldxi(_S4_REGNO, _SP_REGNO, 24);
if (jit_regset_tstbit(function->regset, _S3)) if (jit_regset_tstbit(_jit->function->regset, _S3))
ldxi(_S3_REGNO, _SP_REGNO, 20); ldxi(_S3_REGNO, _SP_REGNO, 20);
if (jit_regset_tstbit(function->regset, _S2)) if (jit_regset_tstbit(_jit->function->regset, _S2))
ldxi(_S2_REGNO, _SP_REGNO, 16); ldxi(_S2_REGNO, _SP_REGNO, 16);
if (jit_regset_tstbit(function->regset, _S1)) if (jit_regset_tstbit(_jit->function->regset, _S1))
ldxi(_S1_REGNO, _SP_REGNO, 12); ldxi(_S1_REGNO, _SP_REGNO, 12);
if (jit_regset_tstbit(function->regset, _S0)) if (jit_regset_tstbit(_jit->function->regset, _S0))
ldxi(_S0_REGNO, _SP_REGNO, 8); ldxi(_S0_REGNO, _SP_REGNO, 8);
ldxi(_RA_REGNO, _SP_REGNO, 4); ldxi(_RA_REGNO, _SP_REGNO, 4);
#else #else
if (jit_regset_tstbit(function->regset, _F30)) if (jit_regset_tstbit(_jit->function->regset, _F30))
ldxi_d(_F30_REGNO, _SP_REGNO, 136); ldxi_d(_F30_REGNO, _SP_REGNO, 136);
if (jit_regset_tstbit(function->regset, _F28)) if (jit_regset_tstbit(_jit->function->regset, _F28))
ldxi_d(_F28_REGNO, _SP_REGNO, 128); ldxi_d(_F28_REGNO, _SP_REGNO, 128);
if (jit_regset_tstbit(function->regset, _F26)) if (jit_regset_tstbit(_jit->function->regset, _F26))
ldxi_d(_F26_REGNO, _SP_REGNO, 120); ldxi_d(_F26_REGNO, _SP_REGNO, 120);
if (jit_regset_tstbit(function->regset, _F24)) if (jit_regset_tstbit(_jit->function->regset, _F24))
ldxi_d(_F24_REGNO, _SP_REGNO, 112); ldxi_d(_F24_REGNO, _SP_REGNO, 112);
if (jit_regset_tstbit(function->regset, _F22)) if (jit_regset_tstbit(_jit->function->regset, _F22))
ldxi_d(_F22_REGNO, _SP_REGNO, 104); ldxi_d(_F22_REGNO, _SP_REGNO, 104);
if (jit_regset_tstbit(function->regset, _F20)) if (jit_regset_tstbit(_jit->function->regset, _F20))
ldxi_d(_F20_REGNO, _SP_REGNO, 96); ldxi_d(_F20_REGNO, _SP_REGNO, 96);
if (jit_regset_tstbit(function->regset, _F18)) if (jit_regset_tstbit(_jit->function->regset, _F18))
ldxi_d(_F18_REGNO, _SP_REGNO, 88); ldxi_d(_F18_REGNO, _SP_REGNO, 88);
if (jit_regset_tstbit(function->regset, _F16)) if (jit_regset_tstbit(_jit->function->regset, _F16))
ldxi_d(_F16_REGNO, _SP_REGNO, 80); ldxi_d(_F16_REGNO, _SP_REGNO, 80);
if (jit_regset_tstbit(function->regset, _S7)) if (jit_regset_tstbit(_jit->function->regset, _S7))
ldxi(_S7_REGNO, _SP_REGNO, 72); ldxi(_S7_REGNO, _SP_REGNO, 72);
if (jit_regset_tstbit(function->regset, _S6)) if (jit_regset_tstbit(_jit->function->regset, _S6))
ldxi(_S6_REGNO, _SP_REGNO, 64); ldxi(_S6_REGNO, _SP_REGNO, 64);
if (jit_regset_tstbit(function->regset, _S5)) if (jit_regset_tstbit(_jit->function->regset, _S5))
ldxi(_S5_REGNO, _SP_REGNO, 56); ldxi(_S5_REGNO, _SP_REGNO, 56);
if (jit_regset_tstbit(function->regset, _S4)) if (jit_regset_tstbit(_jit->function->regset, _S4))
ldxi(_S4_REGNO, _SP_REGNO, 48); ldxi(_S4_REGNO, _SP_REGNO, 48);
if (jit_regset_tstbit(function->regset, _S3)) if (jit_regset_tstbit(_jit->function->regset, _S3))
ldxi(_S3_REGNO, _SP_REGNO, 40); ldxi(_S3_REGNO, _SP_REGNO, 40);
if (jit_regset_tstbit(function->regset, _S2)) if (jit_regset_tstbit(_jit->function->regset, _S2))
ldxi(_S2_REGNO, _SP_REGNO, 32); ldxi(_S2_REGNO, _SP_REGNO, 32);
if (jit_regset_tstbit(function->regset, _S1)) if (jit_regset_tstbit(_jit->function->regset, _S1))
ldxi(_S1_REGNO, _SP_REGNO, 24); ldxi(_S1_REGNO, _SP_REGNO, 24);
if (jit_regset_tstbit(function->regset, _S0)) if (jit_regset_tstbit(_jit->function->regset, _S0))
ldxi(_S0_REGNO, _SP_REGNO, 16); ldxi(_S0_REGNO, _SP_REGNO, 16);
ldxi(_RA_REGNO, _SP_REGNO, 8); ldxi(_RA_REGNO, _SP_REGNO, 8);
#endif #endif

View file

@ -1092,7 +1092,7 @@ _jit_emit(jit_state_t *_jit)
calli(node->u.w); calli(node->u.w);
break; break;
case jit_code_prolog: case jit_code_prolog:
_jit->function = _jit->functions.ptr[node->u.w]; _jit->function = _jit->functions.ptr + node->w.w;
undo.node = node; undo.node = node;
undo.word = _jit->pc.w; undo.word = _jit->pc.w;
undo.patch_offset = _jit->patches.offset; undo.patch_offset = _jit->patches.offset;
@ -1101,6 +1101,7 @@ _jit_emit(jit_state_t *_jit)
prolog(node); prolog(node);
break; break;
case jit_code_epilog: case jit_code_epilog:
assert(_jit->function == _jit->functions.ptr + node->w.w);
if (_jit->again) { if (_jit->again) {
for (temp = undo.node->next; for (temp = undo.node->next;
temp != node; temp = temp->next) { temp != node; temp = temp->next) {

View file

@ -2210,11 +2210,7 @@ static void
_prolog(jit_state_t *_jit, jit_node_t *node) _prolog(jit_state_t *_jit, jit_node_t *node)
{ {
unsigned long regno; unsigned long regno;
jit_function_t *function;
jit_pointer_t *functions;
functions = _jit->functions->v.obj;
function = functions[node->u.w];
subi(_SP_REGNO, _SP_REGNO, stack_framesize); subi(_SP_REGNO, _SP_REGNO, stack_framesize);
/* return address */ /* return address */
MFLR(_R0_REGNO); MFLR(_R0_REGNO);
@ -2223,34 +2219,30 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
/* save any clobbered callee save fpr register */ /* save any clobbered callee save fpr register */
/* FIXME actually, no "clean" interface to use these registers */ /* FIXME actually, no "clean" interface to use these registers */
for (regno = _F31; regno >= _F14; regno--) { for (regno = _F31; regno >= _F14; regno--) {
if (jit_regset_tstbit(function->regset, regno)) if (jit_regset_tstbit(_jit->function->regset, regno))
stxi_d(stack_framesize - rn(regno) * 8, _SP_REGNO, regno); stxi_d(stack_framesize - rn(regno) * 8, _SP_REGNO, regno);
} }
/* save any clobbered callee save gpr register */ /* save any clobbered callee save gpr register */
regno = jit_regset_scan1(function->regset, _R14); regno = jit_regset_scan1(_jit->function->regset, _R14);
if (regno == ULONG_MAX || regno > _R31) if (regno == ULONG_MAX || regno > _R31)
regno = _R31; /* aka _FP_REGNO */ regno = _R31; /* aka _FP_REGNO */
STMW(regno, _SP_REGNO, rn(regno) * 4 + 8); STMW(regno, _SP_REGNO, rn(regno) * 4 + 8);
movr(_FP_REGNO, _SP_REGNO); movr(_FP_REGNO, _SP_REGNO);
/* alloca and/or space for excess parameters */ /* alloca and/or space for excess parameters */
subi(_SP_REGNO, _SP_REGNO, function->stack); subi(_SP_REGNO, _SP_REGNO, _jit->function->stack);
} }
static void static void
_epilog(jit_state_t *_jit, jit_node_t *node) _epilog(jit_state_t *_jit, jit_node_t *node)
{ {
unsigned long regno; unsigned long regno;
jit_function_t *function;
jit_pointer_t *functions;
functions = _jit->functions->v.obj;
function = functions[node->w.w];
movr(_SP_REGNO, _FP_REGNO); movr(_SP_REGNO, _FP_REGNO);
for (regno = _F31; regno >= _F14; regno--) { for (regno = _F31; regno >= _F14; regno--) {
if (jit_regset_tstbit(function->regset, regno)) if (jit_regset_tstbit(_jit->function->regset, regno))
ldxi_d(regno, _SP_REGNO, stack_framesize - rn(regno) * 8); ldxi_d(regno, _SP_REGNO, stack_framesize - rn(regno) * 8);
} }
regno = jit_regset_scan1(function->regset, _R14); regno = jit_regset_scan1(_jit->function->regset, _R14);
if (regno == ULONG_MAX || regno > _R31) if (regno == ULONG_MAX || regno > _R31)
regno = _R31; /* aka _FP_REGNO */ regno = _R31; /* aka _FP_REGNO */
LMW(rn(regno), _SP_REGNO, regno * 4 + 8); LMW(rn(regno), _SP_REGNO, regno * 4 + 8);

View file

@ -1011,7 +1011,7 @@ _jit_emit(jit_state_t *_jit)
calli(node->u.w); calli(node->u.w);
break; break;
case jit_code_prolog: case jit_code_prolog:
_jit->function = _jit->functions.ptr + node->u.w; _jit->function = _jit->functions.ptr + node->w.w;
undo.node = node; undo.node = node;
undo.word = _jit->pc.w; undo.word = _jit->pc.w;
undo.patch_offset = _jit->patches.offset; undo.patch_offset = _jit->patches.offset;
@ -1020,6 +1020,7 @@ _jit_emit(jit_state_t *_jit)
prolog(node); prolog(node);
break; break;
case jit_code_epilog: case jit_code_epilog:
assert(_jit->function == _jit->functions.ptr + node->w.w);
if (_jit->again) { if (_jit->again) {
for (temp = undo.node->next; for (temp = undo.node->next;
temp != node; temp = temp->next) { temp != node; temp = temp->next) {

View file

@ -26,9 +26,9 @@
# define ldxi(u, v, w) ldxi_i(u, v, w) # define ldxi(u, v, w) ldxi_i(u, v, w)
# define sti(u, v) sti_i(u, v) # define sti(u, v) sti_i(u, v)
# define stxi(u, v, w) stxi_i(u, v, w) # define stxi(u, v, w) stxi_i(u, v, w)
# define can_sign_extend_int_p(im) true # define can_sign_extend_int_p(im) 1
# define can_zero_extend_int_p(im) true # define can_zero_extend_int_p(im) 1
# define fits_uint32_p(im) true # define fits_uint32_p(im) 1
# define reg8_p(rn) \ # define reg8_p(rn) \
((rn) >= _RAX_REGNO && (rn) <= _RBX_REGNO) ((rn) >= _RAX_REGNO && (rn) <= _RBX_REGNO)
# else # else
@ -3033,64 +3033,56 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
static void static void
_prolog(jit_state_t *_jit, jit_node_t *node) _prolog(jit_state_t *_jit, jit_node_t *node)
{ {
jit_function_t *function;
function = _jit->functions.ptr + node->u.w;
/* callee save registers */ /* callee save registers */
subi(_RSP_REGNO, _RSP_REGNO, stack_framesize - sizeof(jit_word_t)); subi(_RSP_REGNO, _RSP_REGNO, stack_framesize - sizeof(jit_word_t));
#if __WORDSIZE == 32 #if __WORDSIZE == 32
if (jit_regset_tstbit(function->regset, _RDI)) if (jit_regset_tstbit(_jit->function->regset, _RDI))
stxi(12, _RSP_REGNO, _RDI_REGNO); stxi(12, _RSP_REGNO, _RDI_REGNO);
if (jit_regset_tstbit(function->regset, _RSI)) if (jit_regset_tstbit(_jit->function->regset, _RSI))
stxi( 8, _RSP_REGNO, _RSI_REGNO); stxi( 8, _RSP_REGNO, _RSI_REGNO);
if (jit_regset_tstbit(function->regset, _RBX)) if (jit_regset_tstbit(_jit->function->regset, _RBX))
stxi( 4, _RSP_REGNO, _RBX_REGNO); stxi( 4, _RSP_REGNO, _RBX_REGNO);
#else #else
if (jit_regset_tstbit(function->regset, _RBX)) if (jit_regset_tstbit(_jit->function->regset, _RBX))
stxi(40, _RSP_REGNO, _RBX_REGNO); stxi(40, _RSP_REGNO, _RBX_REGNO);
if (jit_regset_tstbit(function->regset, _R12)) if (jit_regset_tstbit(_jit->function->regset, _R12))
stxi(32, _RSP_REGNO, _R12_REGNO); stxi(32, _RSP_REGNO, _R12_REGNO);
if (jit_regset_tstbit(function->regset, _R13)) if (jit_regset_tstbit(_jit->function->regset, _R13))
stxi(24, _RSP_REGNO, _R13_REGNO); stxi(24, _RSP_REGNO, _R13_REGNO);
if (jit_regset_tstbit(function->regset, _R14)) if (jit_regset_tstbit(_jit->function->regset, _R14))
stxi(16, _RSP_REGNO, _R14_REGNO); stxi(16, _RSP_REGNO, _R14_REGNO);
if (jit_regset_tstbit(function->regset, _R15)) if (jit_regset_tstbit(_jit->function->regset, _R15))
stxi( 8, _RSP_REGNO, _R15_REGNO); stxi( 8, _RSP_REGNO, _R15_REGNO);
#endif #endif
stxi(0, _RSP_REGNO, _RBP_REGNO); stxi(0, _RSP_REGNO, _RBP_REGNO);
movr(_RBP_REGNO, _RSP_REGNO); movr(_RBP_REGNO, _RSP_REGNO);
/* alloca */ /* alloca */
subi(_RSP_REGNO, _RSP_REGNO, function->stack); subi(_RSP_REGNO, _RSP_REGNO, _jit->function->stack);
} }
static void static void
_epilog(jit_state_t *_jit, jit_node_t *node) _epilog(jit_state_t *_jit, jit_node_t *node)
{ {
jit_function_t *function;
function = _jit->functions.ptr + node->w.w;
/* callee save registers */ /* callee save registers */
movr(_RSP_REGNO, _RBP_REGNO); movr(_RSP_REGNO, _RBP_REGNO);
#if __WORDSIZE == 32 #if __WORDSIZE == 32
if (jit_regset_tstbit(function->regset, _RDI)) if (jit_regset_tstbit(_jit->function->regset, _RDI))
ldxi(_RDI_REGNO, _RSP_REGNO, 12); ldxi(_RDI_REGNO, _RSP_REGNO, 12);
if (jit_regset_tstbit(function->regset, _RSI)) if (jit_regset_tstbit(_jit->function->regset, _RSI))
ldxi(_RSI_REGNO, _RSP_REGNO, 8); ldxi(_RSI_REGNO, _RSP_REGNO, 8);
if (jit_regset_tstbit(function->regset, _RBX)) if (jit_regset_tstbit(_jit->function->regset, _RBX))
ldxi(_RBX_REGNO, _RSP_REGNO, 4); ldxi(_RBX_REGNO, _RSP_REGNO, 4);
#else #else
if (jit_regset_tstbit(function->regset, _RBX)) if (jit_regset_tstbit(_jit->function->regset, _RBX))
ldxi(_RBX_REGNO, _RSP_REGNO, 40); ldxi(_RBX_REGNO, _RSP_REGNO, 40);
if (jit_regset_tstbit(function->regset, _R12)) if (jit_regset_tstbit(_jit->function->regset, _R12))
ldxi(_R12_REGNO, _RSP_REGNO, 32); ldxi(_R12_REGNO, _RSP_REGNO, 32);
if (jit_regset_tstbit(function->regset, _R13)) if (jit_regset_tstbit(_jit->function->regset, _R13))
ldxi(_R13_REGNO, _RSP_REGNO, 24); ldxi(_R13_REGNO, _RSP_REGNO, 24);
if (jit_regset_tstbit(function->regset, _R14)) if (jit_regset_tstbit(_jit->function->regset, _R14))
ldxi(_R14_REGNO, _RSP_REGNO, 16); ldxi(_R14_REGNO, _RSP_REGNO, 16);
if (jit_regset_tstbit(function->regset, _R15)) if (jit_regset_tstbit(_jit->function->regset, _R15))
ldxi(_R15_REGNO, _RSP_REGNO, 8); ldxi(_R15_REGNO, _RSP_REGNO, 8);
#endif #endif
ldxi(_RBP_REGNO, _RSP_REGNO, 0); ldxi(_RBP_REGNO, _RSP_REGNO, 0);

View file

@ -418,7 +418,7 @@ _jit_arg(jit_state_t *_jit)
return (_jit->function->self.argi++); return (_jit->function->self.argi++);
#endif #endif
offset = _jit->function->self.size; offset = _jit->function->self.size;
_jit->function->self.size += stack_alignment; _jit->function->self.size += sizeof(jit_word_t);
return (offset); return (offset);
} }
@ -443,7 +443,7 @@ _jit_arg_f(jit_state_t *_jit)
return (_jit->function->self.argf++); return (_jit->function->self.argf++);
#endif #endif
offset = _jit->function->self.size; offset = _jit->function->self.size;
_jit->function->self.size += stack_alignment; _jit->function->self.size += sizeof(jit_float32_t);
return (offset); return (offset);
} }
@ -467,7 +467,7 @@ _jit_arg_d(jit_state_t *_jit)
assert(_jit->function); assert(_jit->function);
offset = _jit->function->self.size; offset = _jit->function->self.size;
_jit->function->self.size += 8; _jit->function->self.size += sizeof(jit_float64_t);
return (offset); return (offset);
#endif #endif
} }
@ -1527,7 +1527,7 @@ _jit_emit(jit_state_t *_jit)
calli(node->u.w); calli(node->u.w);
break; break;
case jit_code_prolog: case jit_code_prolog:
_jit->function = _jit->functions.ptr + node->u.w; _jit->function = _jit->functions.ptr + node->w.w;
undo.node = node; undo.node = node;
undo.word = _jit->pc.w; undo.word = _jit->pc.w;
undo.patch_offset = _jit->patches.offset; undo.patch_offset = _jit->patches.offset;
@ -1536,6 +1536,7 @@ _jit_emit(jit_state_t *_jit)
prolog(node); prolog(node);
break; break;
case jit_code_epilog: case jit_code_epilog:
assert(_jit->function == _jit->functions.ptr + node->w.w);
if (_jit->again) { if (_jit->again) {
for (temp = undo.node->next; for (temp = undo.node->next;
temp != node; temp = temp->next) { temp != node; temp = temp->next) {

View file

@ -978,7 +978,6 @@ _jit_optimize(jit_state_t *_jit)
thread_jumps(); thread_jumps();
sequential_labels(); sequential_labels();
simplify();
/* create initial mapping of live register values /* create initial mapping of live register values
* at the start of a basic block */ * at the start of a basic block */
@ -1003,6 +1002,7 @@ _jit_optimize(jit_state_t *_jit)
} }
patch_registers(); patch_registers();
simplify();
/* figure out labels that are only reached with a jump /* figure out labels that are only reached with a jump
* and is required to do a simple redundant_store removal * and is required to do a simple redundant_store removal