diff --git a/ChangeLog b/ChangeLog index 35e26a1da..cba892204 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2014-10-14 Paulo Andrade + + * 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 * include/lightning.h, lib/jit_size.c, size.c: Use a diff --git a/check/Makefile.am b/check/Makefile.am index c65622bd7..5e0b21b3b 100644 --- a/check/Makefile.am +++ b/check/Makefile.am @@ -39,6 +39,7 @@ $(top_builddir)/lib/liblightning.la: EXTRA_DIST = \ 3to2.tst 3to2.ok \ add.tst add.ok \ + align.tst align.ok \ allocai.tst allocai.ok \ bp.tst bp.ok \ divi.tst divi.ok \ @@ -91,7 +92,7 @@ EXTRA_DIST = \ run-test all.tst base_TESTS = \ - 3to2 add allocai \ + 3to2 add align allocai \ bp divi fib rpn \ ldstr ldsti \ ldstxr ldstxi \ @@ -164,7 +165,7 @@ endif if test_arm_arm #arm_TESTS = $(addsuffix .arm, $(base_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 \ ldstr.arm ldsti.arm \ ldstxr.arm ldstxi.arm \ diff --git a/check/lightning.c b/check/lightning.c index 60b75bcf0..cf08dea7c 100644 --- a/check/lightning.c +++ b/check/lightning.c @@ -267,7 +267,7 @@ static void call_forward(void *value, label_t *label); static void make_arg(void *value); static jit_pointer_t get_arg(void); static long get_imm(void); -static void name(void); +static void align(void); static void name(void); static void prolog(void); static void frame(void); static void tramp(void); static void ellipsis(void); @@ -567,7 +567,7 @@ static char *data; static size_t data_offset, data_length; static instr_t instr_vector[] = { #define entry(value) { NULL, #value, value } - entry(name), + entry(align), entry(name), entry(prolog), entry(frame), entry(tramp), entry(ellipsis), @@ -1324,6 +1324,7 @@ name(void) { (void)identifier(ch); jit_name(parser.string); } +entry_im(align) entry(prolog) entry_im(frame) entry_im(tramp) entry(ellipsis) diff --git a/include/lightning.h b/include/lightning.h index 0179919e3..2e87905be 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -177,7 +177,8 @@ typedef enum { #define jit_data(u,v,w) _jit_data(_jit,u,v,w) jit_code_data, #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, #define jit_name(u) _jit_name(_jit,u) jit_code_name, diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c index a2d2ce060..fd25f7f30 100644 --- a/lib/jit_aarch64-cpu.c +++ b/lib/jit_aarch64-cpu.c @@ -467,6 +467,7 @@ typedef union { # define B_C(Cc,Simm19) oc19(A64_B_C,Cc,Simm19) # define CBZ(Rd,Simm19) ox19(A64_CBZ|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); # 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); @@ -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) static void _oxxx7(jit_state_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 addi(r0,r1,i0) _addi(_jit,r0,r1,i0) 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); } +static void +_nop(jit_state_t *_jit, jit_int32_t i0) +{ + for (; i0 > 0; i0 -= 4) + NOP(); + assert(i0 == 0); +} + static void _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c index 58efa4e0b..01b18f2c4 100644 --- a/lib/jit_aarch64-sz.c +++ b/lib/jit_aarch64-sz.c @@ -8,6 +8,7 @@ 0, 0, 0, + 0, 64, 0, 4, diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c index 94c52b73b..6de141c2b 100644 --- a/lib/jit_aarch64.c +++ b/lib/jit_aarch64.c @@ -717,6 +717,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; diff --git a/lib/jit_alpha-cpu.c b/lib/jit_alpha-cpu.c index 8fe43381d..8787b0ffd 100644 --- a/lib/jit_alpha-cpu.c +++ b/lib/jit_alpha-cpu.c @@ -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 NEGQ(ra,rc) SUBQ(_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) static void _movr(jit_state_t*,jit_int32_t,jit_int32_t); # 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); } +static void +_nop(jit_state_t *_jit, jit_int32_t i0) +{ + for (; i0 > 0; i0 -= 4) + NOP(); + assert(i0 == 0); +} + static void _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { diff --git a/lib/jit_alpha-sz.c b/lib/jit_alpha-sz.c index b2544fe07..bf914d034 100644 --- a/lib/jit_alpha-sz.c +++ b/lib/jit_alpha-sz.c @@ -8,6 +8,7 @@ 0, 0, 0, + 0, 76, 0, 4, diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c index 84b055cec..6d78c70d4 100644 --- a/lib/jit_alpha.c +++ b/lib/jit_alpha.c @@ -744,6 +744,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c index 02edeed21..3f7db0559 100644 --- a/lib/jit_arm-cpu.c +++ b/lib/jit_arm-cpu.c @@ -833,7 +833,7 @@ static void _torl(jit_state_t*,int,int,int) maybe_unused; jit_unget_reg(_R0); \ } while (0) # 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) static void _movr(jit_state_t*,jit_int32_t,jit_int32_t); # 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 -_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()) { for (; i0 > 0; i0 -= 2) T1_NOP(); @@ -1509,6 +1508,7 @@ _nop(jit_state_t *_jit, jit_word_t i0) for (; i0 > 0; i0 -= 4) NOP(); } + assert(i0 == 0); } static void diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c index db7751e5d..a9f217b66 100644 --- a/lib/jit_arm-sz.c +++ b/lib/jit_arm-sz.c @@ -9,6 +9,7 @@ 0, 0, 0, + 0, 26, 0, 4, @@ -361,6 +362,7 @@ 0, 0, 0, + 0, 18, 0, 4, diff --git a/lib/jit_arm.c b/lib/jit_arm.c index 7dbf78aa4..179bf68f6 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -1043,6 +1043,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: if (must_align_p(node->next)) nop(2); diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c index 479d6cf34..3fec62310 100644 --- a/lib/jit_hppa-cpu.c +++ b/lib/jit_hppa-cpu.c @@ -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 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 nop(c) _nop(_jit,c) +static void _nop(jit_state_t*,jit_int32_t); #define movr(r0,r1) _movr(_jit,r0,r1) static void _movr(jit_state_t*,jit_int32_t,jit_int32_t); #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)); } +static void +_nop(jit_state_t *_jit, jit_int32_t i0) +{ + for (; i0 > 0; i0 -= 4) + NOP(); + assert(i0 == 0); +} + static void _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c index ab8c77d31..f2b191832 100644 --- a/lib/jit_hppa-sz.c +++ b/lib/jit_hppa-sz.c @@ -8,6 +8,7 @@ 0, 0, 0, + 0, 64, 0, 4, diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c index 289542fad..636f36403 100644 --- a/lib/jit_hppa.c +++ b/lib/jit_hppa.c @@ -722,6 +722,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; diff --git a/lib/jit_ia64-sz.c b/lib/jit_ia64-sz.c index 1185ada80..5d8850099 100644 --- a/lib/jit_ia64-sz.c +++ b/lib/jit_ia64-sz.c @@ -5,6 +5,7 @@ 0, 0, 0, + 0, 16, 16, 48, diff --git a/lib/jit_ia64.c b/lib/jit_ia64.c index 0a9eccd84..e8eee8a03 100644 --- a/lib/jit_ia64.c +++ b/lib/jit_ia64.c @@ -859,6 +859,11 @@ _emit_code(jit_state_t *_jit) #endif jit_regarg_set(node, value); 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: sync(); node->u.w = _jit->pc.w; diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c index 8976b314b..9e9778fc7 100644 --- a/lib/jit_mips-cpu.c +++ b/lib/jit_mips-cpu.c @@ -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); # define hi(hc,im) _hi(_jit,hc,im) 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); # 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) @@ -769,8 +770,9 @@ _hi(jit_state_t *_jit, jit_int32_t hc, jit_int32_t im) static void _nop(jit_state_t *_jit, jit_int32_t i0) { - while (i0--) - ii(0); + for (; i0 > 0; i0 -= 4) + NOP(); + assert(i0 == 0); } static void diff --git a/lib/jit_mips-sz.c b/lib/jit_mips-sz.c index 69f6dcf26..9b5b57b29 100644 --- a/lib/jit_mips-sz.c +++ b/lib/jit_mips-sz.c @@ -9,6 +9,7 @@ 0, 0, 0, + 0, 44, 0, 4, @@ -361,6 +362,7 @@ 0, 0, 0, + 0, 96, 0, 4, @@ -712,6 +714,7 @@ 0, 0, 0, + 0, 44, 0, 4, diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 3eec489cb..c31d43bfa 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -978,6 +978,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c index ed9306557..844c8b132 100644 --- a/lib/jit_ppc-cpu.c +++ b/lib/jit_ppc-cpu.c @@ -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 XORI(s,a,u) FDu(26,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) static void _movr(jit_state_t*,jit_int32_t,jit_int32_t); # 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 +static void +_nop(jit_state_t *_jit, jit_int32_t i0) +{ + for (; i0 > 0; i0 -= 4) + NOP(); + assert(i0 == 0); +} + static void _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c index e0c53b9e1..6025ffcfd 100644 --- a/lib/jit_ppc-sz.c +++ b/lib/jit_ppc-sz.c @@ -9,6 +9,7 @@ 0, 0, 0, + 0, 44, 0, 4, @@ -361,6 +362,7 @@ 0, 0, 0, + 0, 72, 0, 4, @@ -713,6 +715,7 @@ 0, 0, 0, + 0, 72, 0, 4, diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index 08da19f51..88488f091 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -875,6 +875,13 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; diff --git a/lib/jit_print.c b/lib/jit_print.c index 17d2559cd..49a553685 100644 --- a/lib/jit_print.c +++ b/lib/jit_print.c @@ -38,7 +38,7 @@ */ static char *code_name[] = { "data", - "live", + "live", "align", "save", "load", "#name", "#note", "label", diff --git a/lib/jit_s390x-sz.c b/lib/jit_s390x-sz.c index e7b8ea290..d3df0c64f 100644 --- a/lib/jit_s390x-sz.c +++ b/lib/jit_s390x-sz.c @@ -7,6 +7,7 @@ 0, 0, 0, + 0, 2, 38, 0, diff --git a/lib/jit_s390x.c b/lib/jit_s390x.c index 99802a584..4c45db0b0 100644 --- a/lib/jit_s390x.c +++ b/lib/jit_s390x.c @@ -697,11 +697,19 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; 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); /* remember label is defined */ node->flag |= jit_flag_patch; diff --git a/lib/jit_sparc-cpu.c b/lib/jit_sparc-cpu.c index ba56c6159..095c36466 100644 --- a/lib/jit_sparc-cpu.c +++ b/lib/jit_sparc-cpu.c @@ -809,8 +809,9 @@ _f1(jit_state_t *_jit, jit_int32_t op, jit_int32_t disp30) static void _nop(jit_state_t *_jit, jit_int32_t i0) { - while (i0--) + for (; i0 > 0; i0 -= 4) NOP(); + assert(i0 == 0); } static void diff --git a/lib/jit_sparc-sz.c b/lib/jit_sparc-sz.c index 6056af221..730a16aa1 100644 --- a/lib/jit_sparc-sz.c +++ b/lib/jit_sparc-sz.c @@ -8,6 +8,7 @@ 0, 0, 0, + 0, 16, 0, 4, diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c index 81a9f5c23..a8488e2c5 100644 --- a/lib/jit_sparc.c +++ b/lib/jit_sparc.c @@ -715,11 +715,18 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; case jit_code_label: - if (node->link && + if ((node->link || (node->flag & jit_flag_use)) && (word = _jit->pc.w & (sizeof(jit_word_t) - 1))) nop(sizeof(jit_word_t) - word); /* remember label is defined */ diff --git a/lib/jit_x86-sz.c b/lib/jit_x86-sz.c index b8c9af374..52101e4a3 100644 --- a/lib/jit_x86-sz.c +++ b/lib/jit_x86-sz.c @@ -7,6 +7,7 @@ 0, 0, 0, + 0, 3, 26, 0, @@ -707,6 +708,7 @@ 0, 0, 0, + 0, 7, 43, 0, diff --git a/lib/jit_x86.c b/lib/jit_x86.c index 747741d5b..20dcc211d 100644 --- a/lib/jit_x86.c +++ b/lib/jit_x86.c @@ -1268,11 +1268,17 @@ _emit_code(jit_state_t *_jit) value = jit_classify(node->code); jit_regarg_set(node, value); 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: node->u.w = _jit->pc.w; break; case jit_code_label: - if (node->link && + if ((node->link || (node->flag & jit_flag_use)) && (word = _jit->pc.w & (sizeof(jit_word_t) - 1))) nop(sizeof(jit_word_t) - word); /* remember label is defined */ diff --git a/lib/lightning.c b/lib/lightning.c index 42c3a45f7..9ee261d79 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -1177,9 +1177,9 @@ _jit_classify(jit_state_t *_jit, jit_code_t code) jit_int32_t mask; switch (code) { - case jit_code_data: case jit_code_save: case jit_code_load: - case jit_code_name: case jit_code_label: case jit_code_note: - case jit_code_prolog: case jit_code_epilog: + case jit_code_data: case jit_code_align: case jit_code_save: + case jit_code_load: case jit_code_name: case jit_code_label: + case jit_code_note: case jit_code_prolog: case jit_code_epilog: mask = 0; break; case jit_code_live: @@ -2395,7 +2395,8 @@ _redundant_jump(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node) return (1); } break; - case jit_code_note: + case jit_code_name: case jit_code_note: + case jit_code_align: break; default: return (0);