mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 23:00:22 +02:00
Implement the jit_align interface
* lib/jit_aarch64-cpu.c, lib/jit_alpha-cpu.c, lib/jit_arm-cpu.c, lib/jit_hppa-cpu.c, lib/jit_mips-cpu.c, lib/jit_ppc-cpu.c, lib/jit_sparc-cpu.c: Implement or correct the internal nop(count) call that receives an argument that tells the modulo bytes to align the code for the next instruction. * include/lightning.h, lib/lightning.c, lib/jit_aarch64.c, lib/jit_alpha.c, lib/jit_arm.c, lib/jit_hppa.c, lib/jit_ia64.c, lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c, lib/jit_sparc.c, lib/jit_x86.c: Implement the new jit_align() call that receive an argument, that tells the modulo, in bytes, to align the next instruction. In most backends the only value that makes a difference is a value that matches sizeof(void*), as all other values usually are already automatically aligned in labels, but not guaranteed to be aligned at word size bytes. * check/align.ok, check/align.tst: New files, implementing a simple test for the new jit_align() interface. * check/Makefile.am, check/lightning.c, lib/jit_aarch64-sz.c, lib/jit_alpha-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c, lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c, lib/jit_print.c, lib/jit_s390x-sz.c, lib/jit_sparc-sz.c, lib/jit_x86-sz.c: Update for the new jit_code_align code and the jit_align() interface.
This commit is contained in:
parent
dbb1bb2409
commit
afae5407f6
33 changed files with 180 additions and 20 deletions
28
ChangeLog
28
ChangeLog
|
@ -1,3 +1,31 @@
|
||||||
|
2014-10-14 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
|
* lib/jit_aarch64-cpu.c, lib/jit_alpha-cpu.c, lib/jit_arm-cpu.c,
|
||||||
|
lib/jit_hppa-cpu.c, lib/jit_mips-cpu.c, lib/jit_ppc-cpu.c,
|
||||||
|
lib/jit_sparc-cpu.c: Implement or correct the internal
|
||||||
|
nop(count) call that receives an argument that tells the
|
||||||
|
modulo bytes to align the code for the next instruction.
|
||||||
|
|
||||||
|
* include/lightning.h, lib/lightning.c, lib/jit_aarch64.c,
|
||||||
|
lib/jit_alpha.c, lib/jit_arm.c, lib/jit_hppa.c, lib/jit_ia64.c,
|
||||||
|
lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c, lib/jit_sparc.c,
|
||||||
|
lib/jit_x86.c: Implement the new jit_align() call that receive
|
||||||
|
an argument, that tells the modulo, in bytes, to align the
|
||||||
|
next instruction. In most backends the only value that makes
|
||||||
|
a difference is a value that matches sizeof(void*), as all
|
||||||
|
other values usually are already automatically aligned in
|
||||||
|
labels, but not guaranteed to be aligned at word size bytes.
|
||||||
|
|
||||||
|
* check/align.ok, check/align.tst: New files, implementing
|
||||||
|
a simple test for the new jit_align() interface.
|
||||||
|
|
||||||
|
* check/Makefile.am, check/lightning.c, lib/jit_aarch64-sz.c,
|
||||||
|
lib/jit_alpha-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c,
|
||||||
|
lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c,
|
||||||
|
lib/jit_print.c, lib/jit_s390x-sz.c, lib/jit_sparc-sz.c,
|
||||||
|
lib/jit_x86-sz.c: Update for the new jit_code_align code and
|
||||||
|
the jit_align() interface.
|
||||||
|
|
||||||
2014-10-13 Paulo Andrade <pcpa@gnu.org>
|
2014-10-13 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
* include/lightning.h, lib/jit_size.c, size.c: Use a
|
* include/lightning.h, lib/jit_size.c, size.c: Use a
|
||||||
|
|
|
@ -39,6 +39,7 @@ $(top_builddir)/lib/liblightning.la:
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
3to2.tst 3to2.ok \
|
3to2.tst 3to2.ok \
|
||||||
add.tst add.ok \
|
add.tst add.ok \
|
||||||
|
align.tst align.ok \
|
||||||
allocai.tst allocai.ok \
|
allocai.tst allocai.ok \
|
||||||
bp.tst bp.ok \
|
bp.tst bp.ok \
|
||||||
divi.tst divi.ok \
|
divi.tst divi.ok \
|
||||||
|
@ -91,7 +92,7 @@ EXTRA_DIST = \
|
||||||
run-test all.tst
|
run-test all.tst
|
||||||
|
|
||||||
base_TESTS = \
|
base_TESTS = \
|
||||||
3to2 add allocai \
|
3to2 add align allocai \
|
||||||
bp divi fib rpn \
|
bp divi fib rpn \
|
||||||
ldstr ldsti \
|
ldstr ldsti \
|
||||||
ldstxr ldstxi \
|
ldstxr ldstxi \
|
||||||
|
@ -164,7 +165,7 @@ endif
|
||||||
if test_arm_arm
|
if test_arm_arm
|
||||||
#arm_TESTS = $(addsuffix .arm, $(base_TESTS))
|
#arm_TESTS = $(addsuffix .arm, $(base_TESTS))
|
||||||
arm_TESTS = \
|
arm_TESTS = \
|
||||||
3to2.arm add.arm allocai.arm \
|
3to2.arm add.arm align.arm allocai.arm \
|
||||||
bp.arm divi.arm fib.arm rpn.arm \
|
bp.arm divi.arm fib.arm rpn.arm \
|
||||||
ldstr.arm ldsti.arm \
|
ldstr.arm ldsti.arm \
|
||||||
ldstxr.arm ldstxi.arm \
|
ldstxr.arm ldstxi.arm \
|
||||||
|
|
|
@ -267,7 +267,7 @@ static void call_forward(void *value, label_t *label);
|
||||||
static void make_arg(void *value);
|
static void make_arg(void *value);
|
||||||
static jit_pointer_t get_arg(void);
|
static jit_pointer_t get_arg(void);
|
||||||
static long get_imm(void);
|
static long get_imm(void);
|
||||||
static void name(void);
|
static void align(void); static void name(void);
|
||||||
static void prolog(void);
|
static void prolog(void);
|
||||||
static void frame(void); static void tramp(void);
|
static void frame(void); static void tramp(void);
|
||||||
static void ellipsis(void);
|
static void ellipsis(void);
|
||||||
|
@ -567,7 +567,7 @@ static char *data;
|
||||||
static size_t data_offset, data_length;
|
static size_t data_offset, data_length;
|
||||||
static instr_t instr_vector[] = {
|
static instr_t instr_vector[] = {
|
||||||
#define entry(value) { NULL, #value, value }
|
#define entry(value) { NULL, #value, value }
|
||||||
entry(name),
|
entry(align), entry(name),
|
||||||
entry(prolog),
|
entry(prolog),
|
||||||
entry(frame), entry(tramp),
|
entry(frame), entry(tramp),
|
||||||
entry(ellipsis),
|
entry(ellipsis),
|
||||||
|
@ -1324,6 +1324,7 @@ name(void) {
|
||||||
(void)identifier(ch);
|
(void)identifier(ch);
|
||||||
jit_name(parser.string);
|
jit_name(parser.string);
|
||||||
}
|
}
|
||||||
|
entry_im(align)
|
||||||
entry(prolog)
|
entry(prolog)
|
||||||
entry_im(frame) entry_im(tramp)
|
entry_im(frame) entry_im(tramp)
|
||||||
entry(ellipsis)
|
entry(ellipsis)
|
||||||
|
|
|
@ -177,7 +177,8 @@ typedef enum {
|
||||||
#define jit_data(u,v,w) _jit_data(_jit,u,v,w)
|
#define jit_data(u,v,w) _jit_data(_jit,u,v,w)
|
||||||
jit_code_data,
|
jit_code_data,
|
||||||
#define jit_live(u) jit_new_node_w(jit_code_live, u)
|
#define jit_live(u) jit_new_node_w(jit_code_live, u)
|
||||||
jit_code_live,
|
#define jit_align(u) jit_new_node_w(jit_code_align, u)
|
||||||
|
jit_code_live, jit_code_align,
|
||||||
jit_code_save, jit_code_load,
|
jit_code_save, jit_code_load,
|
||||||
#define jit_name(u) _jit_name(_jit,u)
|
#define jit_name(u) _jit_name(_jit,u)
|
||||||
jit_code_name,
|
jit_code_name,
|
||||||
|
|
|
@ -467,6 +467,7 @@ typedef union {
|
||||||
# define B_C(Cc,Simm19) oc19(A64_B_C,Cc,Simm19)
|
# define B_C(Cc,Simm19) oc19(A64_B_C,Cc,Simm19)
|
||||||
# define CBZ(Rd,Simm19) ox19(A64_CBZ|XS,Rd,Simm19)
|
# define CBZ(Rd,Simm19) ox19(A64_CBZ|XS,Rd,Simm19)
|
||||||
# define CBNZ(Rd,Simm19) ox19(A64_CBNZ|XS,Rd,Simm19)
|
# define CBNZ(Rd,Simm19) ox19(A64_CBNZ|XS,Rd,Simm19)
|
||||||
|
# define NOP() ii(0xd503201f)
|
||||||
static jit_int32_t logical_immediate(jit_word_t);
|
static jit_int32_t logical_immediate(jit_word_t);
|
||||||
# define oxxx(Op,Rd,Rn,Rm) _oxxx(_jit,Op,Rd,Rn,Rm)
|
# define oxxx(Op,Rd,Rn,Rm) _oxxx(_jit,Op,Rd,Rn,Rm)
|
||||||
static void _oxxx(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
static void _oxxx(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
||||||
|
@ -499,6 +500,8 @@ static void _oxxxc(jit_state_t*,jit_int32_t,jit_int32_t,
|
||||||
# define oxxx7(Op,Rt,Rt2,Rn,Simm7) _oxxx7(_jit,Op,Rt,Rt2,Rn,Simm7)
|
# define oxxx7(Op,Rt,Rt2,Rn,Simm7) _oxxx7(_jit,Op,Rt,Rt2,Rn,Simm7)
|
||||||
static void _oxxx7(jit_state_t*,jit_int32_t,
|
static void _oxxx7(jit_state_t*,jit_int32_t,
|
||||||
jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
||||||
|
# define nop(i0) _nop(_jit,i0)
|
||||||
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
# define addr(r0,r1,r2) ADD(r0,r1,r2)
|
# define addr(r0,r1,r2) ADD(r0,r1,r2)
|
||||||
# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
|
# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
|
||||||
static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
|
static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
|
||||||
|
@ -1010,6 +1013,14 @@ _oxxx7(jit_state_t *_jit, jit_int32_t Op,
|
||||||
ii(i.w);
|
ii(i.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
|
{
|
||||||
|
for (; i0 > 0; i0 -= 4)
|
||||||
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
|
_addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
64,
|
64,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -717,6 +717,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -303,6 +303,8 @@ static void _Opi(jit_state_t*,int,int,unsigned int,unsigned int,int);
|
||||||
# define NEGL(ra,rc) SUBL(_R31_REGNO,ra,rc)
|
# define NEGL(ra,rc) SUBL(_R31_REGNO,ra,rc)
|
||||||
# define NEGQ(ra,rc) SUBQ(_R31_REGNO,ra,rc)
|
# define NEGQ(ra,rc) SUBQ(_R31_REGNO,ra,rc)
|
||||||
# define NOT(ra,rc) ORNOT(_R31_REGNO,ra,rc)
|
# define NOT(ra,rc) ORNOT(_R31_REGNO,ra,rc)
|
||||||
|
# define nop(i0) _nop(_jit,i0)
|
||||||
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
# define movr(r0,r1) _movr(_jit,r0,r1)
|
# define movr(r0,r1) _movr(_jit,r0,r1)
|
||||||
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||||
# define movi(r0,i0) _movi(_jit,r0,i0)
|
# define movi(r0,i0) _movi(_jit,r0,i0)
|
||||||
|
@ -703,6 +705,14 @@ _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc)
|
||||||
ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
|
ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
|
{
|
||||||
|
for (; i0 > 0; i0 -= 4)
|
||||||
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
76,
|
76,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -744,6 +744,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -833,7 +833,7 @@ static void _torl(jit_state_t*,int,int,int) maybe_unused;
|
||||||
jit_unget_reg(_R0); \
|
jit_unget_reg(_R0); \
|
||||||
} while (0)
|
} while (0)
|
||||||
# define nop(i0) _nop(_jit,i0)
|
# define nop(i0) _nop(_jit,i0)
|
||||||
static void _nop(jit_state_t*,jit_word_t) maybe_unused;
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
# define movr(r0,r1) _movr(_jit,r0,r1)
|
# define movr(r0,r1) _movr(_jit,r0,r1)
|
||||||
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||||
# define movi(r0,i0) _movi(_jit,r0,i0)
|
# define movi(r0,i0) _movi(_jit,r0,i0)
|
||||||
|
@ -1498,9 +1498,8 @@ _torl(jit_state_t *_jit, int o, int rn, int im)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_nop(jit_state_t *_jit, jit_word_t i0)
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
{
|
{
|
||||||
assert(i0 >= 0);
|
|
||||||
if (jit_thumb_p()) {
|
if (jit_thumb_p()) {
|
||||||
for (; i0 > 0; i0 -= 2)
|
for (; i0 > 0; i0 -= 2)
|
||||||
T1_NOP();
|
T1_NOP();
|
||||||
|
@ -1509,6 +1508,7 @@ _nop(jit_state_t *_jit, jit_word_t i0)
|
||||||
for (; i0 > 0; i0 -= 4)
|
for (; i0 > 0; i0 -= 4)
|
||||||
NOP();
|
NOP();
|
||||||
}
|
}
|
||||||
|
assert(i0 == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
26,
|
26,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
@ -361,6 +362,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
18,
|
18,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -1043,6 +1043,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
if (must_align_p(node->next))
|
if (must_align_p(node->next))
|
||||||
nop(2);
|
nop(2);
|
||||||
|
|
|
@ -640,6 +640,8 @@ static void _f38(jit_state_t*,jit_int32_t,
|
||||||
#define UADDCM(r1,r2,t) f8(0x2,r2,r1,ADD_CF_NV,2,0,1,2,0,t)
|
#define UADDCM(r1,r2,t) f8(0x2,r2,r1,ADD_CF_NV,2,0,1,2,0,t)
|
||||||
#define UXOR(r1,r2,t) f8(0x2,r2,r1,LOG_CC_NV,0,1,1,2,0,t)
|
#define UXOR(r1,r2,t) f8(0x2,r2,r1,LOG_CC_NV,0,1,1,2,0,t)
|
||||||
#define XOR(r1,r2,t) f8(0x2,r2,r1,LOG_CC_NV,0,1,0,2,0,t)
|
#define XOR(r1,r2,t) f8(0x2,r2,r1,LOG_CC_NV,0,1,0,2,0,t)
|
||||||
|
# define nop(c) _nop(_jit,c)
|
||||||
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
#define movr(r0,r1) _movr(_jit,r0,r1)
|
#define movr(r0,r1) _movr(_jit,r0,r1)
|
||||||
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||||
#define movi(r0,i0) _movi(_jit,r0,i0)
|
#define movi(r0,i0) _movi(_jit,r0,i0)
|
||||||
|
@ -1585,6 +1587,14 @@ _f38(jit_state_t *_jit, jit_int32_t o,
|
||||||
ii((o<<26)|((s>>5)<<9)|(u<<6)|(n<<1)|(s&0x1f));
|
ii((o<<26)|((s>>5)<<9)|(u<<6)|(n<<1)|(s&0x1f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
|
{
|
||||||
|
for (; i0 > 0; i0 -= 4)
|
||||||
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
64,
|
64,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -722,6 +722,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
16,
|
16,
|
||||||
16,
|
16,
|
||||||
48,
|
48,
|
||||||
|
|
|
@ -859,6 +859,11 @@ _emit_code(jit_state_t *_jit)
|
||||||
#endif
|
#endif
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
/* nothing done */
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
sync();
|
sync();
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
|
|
|
@ -303,7 +303,8 @@ _hrrrit(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
|
||||||
static void _hrri(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
static void _hrri(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
|
||||||
# define hi(hc,im) _hi(_jit,hc,im)
|
# define hi(hc,im) _hi(_jit,hc,im)
|
||||||
static void _hi(jit_state_t*,jit_int32_t,jit_int32_t);
|
static void _hi(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||||
# define NOP(i0) _nop(_jit,i0)
|
# define NOP(i0) ii(0)
|
||||||
|
# define nop(i0) _nop(_jit,i0)
|
||||||
static void _nop(jit_state_t*,jit_int32_t);
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
# define h_ri(hc,rt,im) _hrri(_jit,hc,0,rt,im)
|
# define h_ri(hc,rt,im) _hrri(_jit,hc,0,rt,im)
|
||||||
# define rrit(rt,rd,im,tc) _hrrrit(_jit,0,0,rt,rd,im,tc)
|
# define rrit(rt,rd,im,tc) _hrrrit(_jit,0,0,rt,rd,im,tc)
|
||||||
|
@ -769,8 +770,9 @@ _hi(jit_state_t *_jit, jit_int32_t hc, jit_int32_t im)
|
||||||
static void
|
static void
|
||||||
_nop(jit_state_t *_jit, jit_int32_t i0)
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
{
|
{
|
||||||
while (i0--)
|
for (; i0 > 0; i0 -= 4)
|
||||||
ii(0);
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
44,
|
44,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
@ -361,6 +362,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
96,
|
96,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
@ -712,6 +714,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
44,
|
44,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -978,6 +978,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -451,6 +451,8 @@ static void _FXS(jit_state_t*,int,int,int,int,int,int,int);
|
||||||
# define XOR_(d,a,b) FXO_(31,a,d,b,0,316)
|
# define XOR_(d,a,b) FXO_(31,a,d,b,0,316)
|
||||||
# define XORI(s,a,u) FDu(26,s,a,u)
|
# define XORI(s,a,u) FDu(26,s,a,u)
|
||||||
# define XORIS(s,a,u) FDu(27,s,a,u)
|
# define XORIS(s,a,u) FDu(27,s,a,u)
|
||||||
|
# define nop(c) _nop(_jit,c)
|
||||||
|
static void _nop(jit_state_t*,jit_int32_t);
|
||||||
# define movr(r0,r1) _movr(_jit,r0,r1)
|
# define movr(r0,r1) _movr(_jit,r0,r1)
|
||||||
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||||
# define movi(r0,i0) _movi(_jit,r0,i0)
|
# define movi(r0,i0) _movi(_jit,r0,i0)
|
||||||
|
@ -976,6 +978,14 @@ _FXS(jit_state_t *_jit, int o, int s, int a, int h, int x, int i, int r)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
|
{
|
||||||
|
for (; i0 > 0; i0 -= 4)
|
||||||
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
44,
|
44,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
@ -361,6 +362,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
72,
|
72,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
@ -713,6 +715,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
72,
|
72,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -875,6 +875,13 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
*/
|
*/
|
||||||
static char *code_name[] = {
|
static char *code_name[] = {
|
||||||
"data",
|
"data",
|
||||||
"live",
|
"live", "align",
|
||||||
"save", "load",
|
"save", "load",
|
||||||
"#name", "#note",
|
"#name", "#note",
|
||||||
"label",
|
"label",
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
2,
|
2,
|
||||||
38,
|
38,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -697,11 +697,19 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
case jit_code_label:
|
case jit_code_label:
|
||||||
if (node->link && (word = _jit->pc.w & 3))
|
if ((node->link || (node->flag & jit_flag_use)) &&
|
||||||
|
(word = _jit->pc.w & 3))
|
||||||
nop(4 - word);
|
nop(4 - word);
|
||||||
/* remember label is defined */
|
/* remember label is defined */
|
||||||
node->flag |= jit_flag_patch;
|
node->flag |= jit_flag_patch;
|
||||||
|
|
|
@ -809,8 +809,9 @@ _f1(jit_state_t *_jit, jit_int32_t op, jit_int32_t disp30)
|
||||||
static void
|
static void
|
||||||
_nop(jit_state_t *_jit, jit_int32_t i0)
|
_nop(jit_state_t *_jit, jit_int32_t i0)
|
||||||
{
|
{
|
||||||
while (i0--)
|
for (; i0 > 0; i0 -= 4)
|
||||||
NOP();
|
NOP();
|
||||||
|
assert(i0 == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
16,
|
16,
|
||||||
0,
|
0,
|
||||||
4,
|
4,
|
||||||
|
|
|
@ -715,11 +715,18 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if (node->u.w == sizeof(jit_word_t) &&
|
||||||
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
|
nop(sizeof(jit_word_t) - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
case jit_code_label:
|
case jit_code_label:
|
||||||
if (node->link &&
|
if ((node->link || (node->flag & jit_flag_use)) &&
|
||||||
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
nop(sizeof(jit_word_t) - word);
|
nop(sizeof(jit_word_t) - word);
|
||||||
/* remember label is defined */
|
/* remember label is defined */
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
3,
|
3,
|
||||||
26,
|
26,
|
||||||
0,
|
0,
|
||||||
|
@ -707,6 +708,7 @@
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
7,
|
7,
|
||||||
43,
|
43,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -1268,11 +1268,17 @@ _emit_code(jit_state_t *_jit)
|
||||||
value = jit_classify(node->code);
|
value = jit_classify(node->code);
|
||||||
jit_regarg_set(node, value);
|
jit_regarg_set(node, value);
|
||||||
switch (node->code) {
|
switch (node->code) {
|
||||||
|
case jit_code_align:
|
||||||
|
assert(!(node->u.w & (node->u.w - 1)) &&
|
||||||
|
node->u.w <= sizeof(jit_word_t));
|
||||||
|
if ((word = _jit->pc.w & (node->u.w - 1)))
|
||||||
|
nop(node->u.w - word);
|
||||||
|
break;
|
||||||
case jit_code_note: case jit_code_name:
|
case jit_code_note: case jit_code_name:
|
||||||
node->u.w = _jit->pc.w;
|
node->u.w = _jit->pc.w;
|
||||||
break;
|
break;
|
||||||
case jit_code_label:
|
case jit_code_label:
|
||||||
if (node->link &&
|
if ((node->link || (node->flag & jit_flag_use)) &&
|
||||||
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
(word = _jit->pc.w & (sizeof(jit_word_t) - 1)))
|
||||||
nop(sizeof(jit_word_t) - word);
|
nop(sizeof(jit_word_t) - word);
|
||||||
/* remember label is defined */
|
/* remember label is defined */
|
||||||
|
|
|
@ -1177,9 +1177,9 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
|
||||||
jit_int32_t mask;
|
jit_int32_t mask;
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case jit_code_data: case jit_code_save: case jit_code_load:
|
case jit_code_data: case jit_code_align: case jit_code_save:
|
||||||
case jit_code_name: case jit_code_label: case jit_code_note:
|
case jit_code_load: case jit_code_name: case jit_code_label:
|
||||||
case jit_code_prolog: case jit_code_epilog:
|
case jit_code_note: case jit_code_prolog: case jit_code_epilog:
|
||||||
mask = 0;
|
mask = 0;
|
||||||
break;
|
break;
|
||||||
case jit_code_live:
|
case jit_code_live:
|
||||||
|
@ -2395,7 +2395,8 @@ _redundant_jump(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case jit_code_note:
|
case jit_code_name: case jit_code_note:
|
||||||
|
case jit_code_align:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return (0);
|
return (0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue