Implement the jit_align interface - lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2014年10月14日 17:05:25 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2014年10月14日 17:05:25 -0300
commitafae5407f67646254c868a9fde6da97609d5f69d (patch)
treef50e3a56cb2acfde87ad64cb1441b38cdec3cabb /lib
parentdbb1bb24099caad8e106a1b80f831b131b3d8e87 (diff)
downloadlightning-afae5407f67646254c868a9fde6da97609d5f69d.tar.gz
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_aarch64-cpu.c 11
-rw-r--r--lib/jit_aarch64-sz.c 1
-rw-r--r--lib/jit_aarch64.c 7
-rw-r--r--lib/jit_alpha-cpu.c 10
-rw-r--r--lib/jit_alpha-sz.c 1
-rw-r--r--lib/jit_alpha.c 7
-rw-r--r--lib/jit_arm-cpu.c 6
-rw-r--r--lib/jit_arm-sz.c 2
-rw-r--r--lib/jit_arm.c 7
-rw-r--r--lib/jit_hppa-cpu.c 10
-rw-r--r--lib/jit_hppa-sz.c 1
-rw-r--r--lib/jit_hppa.c 7
-rw-r--r--lib/jit_ia64-sz.c 1
-rw-r--r--lib/jit_ia64.c 5
-rw-r--r--lib/jit_mips-cpu.c 8
-rw-r--r--lib/jit_mips-sz.c 3
-rw-r--r--lib/jit_mips.c 7
-rw-r--r--lib/jit_ppc-cpu.c 10
-rw-r--r--lib/jit_ppc-sz.c 3
-rw-r--r--lib/jit_ppc.c 7
-rw-r--r--lib/jit_print.c 2
-rw-r--r--lib/jit_s390x-sz.c 1
-rw-r--r--lib/jit_s390x.c 10
-rw-r--r--lib/jit_sparc-cpu.c 3
-rw-r--r--lib/jit_sparc-sz.c 1
-rw-r--r--lib/jit_sparc.c 9
-rw-r--r--lib/jit_x86-sz.c 2
-rw-r--r--lib/jit_x86.c 8
-rw-r--r--lib/lightning.c 9
29 files changed, 144 insertions, 15 deletions
diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c
index a2d2ce0..fd25f7f 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);
@@ -1011,6 +1014,14 @@ _oxxx7(jit_state_t *_jit, jit_int32_t Op,
}
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)
{
jit_int32_t reg;
diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c
index 58efa4e..01b18f2 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 94c52b7..6de141c 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 8fe4338..8787b0f 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)
@@ -704,6 +706,14 @@ _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int 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)
{
if (r0 != r1)
diff --git a/lib/jit_alpha-sz.c b/lib/jit_alpha-sz.c
index b2544fe..bf914d0 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 84b055c..6d78c70 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 02edeed..3f7db05 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 db7751e..a9f217b 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 7dbf78a..179bf68 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 479d6cf..3fec623 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)
@@ -1586,6 +1588,14 @@ _f38(jit_state_t *_jit, jit_int32_t o,
}
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)
{
if (r0 != r1)
diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c
index ab8c77d..f2b1918 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 289542f..636f364 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 1185ada..5d88500 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 0a9eccd..e8eee8a 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 8976b31..9e9778f 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 69f6dcf..9b5b57b 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 3eec489..c31d43b 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 ed93065..844c8b1 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)
@@ -977,6 +979,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)
{
if (r0 != r1)
diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c
index e0c53b9..6025ffc 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 08da19f..88488f0 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 17d2559..49a5536 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 e7b8ea2..d3df0c6 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 99802a5..4c45db0 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 ba56c61..095c364 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 6056af2..730a16a 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 81a9f5c..a8488e2 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 b8c9af3..52101e4 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 747741d..20dcc21 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 42c3a45..9ee261d 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);
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月18日 17:12:58 +0000

AltStyle によって変換されたページ (->オリジナル) /