static void _movsr(jit_state_t*,jit_int32_t,jit_int32_t);
# define movsr_u(r0, r1) _movsr_u(_jit, r0, r1)
static void _movsr_u(jit_state_t*,jit_int32_t,jit_int32_t);
+#define movnr(r0, r1, r2) _movnr(_jit, r0, r1, r2)
+static void _movnr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
+#define movzr(r0, r1, r2) _movzr(_jit, r0, r1, r2)
+static void _movzr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# if __X64 && !__X64_32
# define movir(r0, r1) _movir(_jit, r0, r1)
static void _movir(jit_state_t*,jit_int32_t,jit_int32_t);
static void _callr(jit_state_t*, jit_int32_t);
# define calli(i0) _calli(_jit, i0)
static jit_word_t _calli(jit_state_t*, jit_word_t);
+# if __X64
+# define calli_p(i0) _calli_p(_jit, i0)
+static jit_word_t _calli_p(jit_state_t*, jit_word_t);
+# else
+# define calli_p(i0) calli(i0)
+# endif
# define jmpr(r0) _jmpr(_jit, r0)
static void _jmpr(jit_state_t*, jit_int32_t);
# define jmpi(i0) _jmpi(_jit, i0)
static jit_word_t _jmpi(jit_state_t*, jit_word_t);
+# if __X64
+# define jmpi_p(i0) _jmpi_p(_jit, i0)
+static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
+# else
+# define jmpi_p(i0) jmpi(i0)
+# endif
# define jmpsi(i0) _jmpsi(_jit, i0)
static void _jmpsi(jit_state_t*, jit_uint8_t);
# define prolog(node) _prolog(_jit, node)
# define ffsl(l) __builtin_ffsl(l)
# endif
# endif
+# define jit_cmov_p() jit_cpu.cmov
#endif
#if CODE
mrm(0x03, r7(r0), r7(r1));
}
+static void
+_movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ assert(jit_cmov_p());
+
+ testr(r2, r2);
+
+ rex(0, WIDE, r0, _NOREG, r1);
+ ic(0x0f);
+ ic(0x45);
+ mrm(0x03, r7(r0), r7(r1));
+}
+
+static void
+_movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ assert(jit_cmov_p());
+
+ testr(r2, r2);
+
+ rex(0, WIDE, r0, _NOREG, r1);
+ ic(0x0f);
+ ic(0x44);
+ mrm(0x03, r7(r0), r7(r1));
+}
+
#if __X64
static void
_movir(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
_calli(jit_state_t *_jit, jit_word_t i0)
{
jit_word_t word;
+ jit_word_t w;
#if __X64
- jit_int32_t reg;
+ w = i0 - (_jit->pc.w + 5);
+ if ((jit_int32_t)w == w) {
+#endif
+ ic(0xe8);
+ w = i0 - (_jit->pc.w + 4);
+ ii(w);
+ word = _jit->pc.w;
+#if __X64
+ }
+ else
+ word = calli_p(i0);
+#endif
+ return (word);
+}
+#if __X64
+static jit_word_t
+_calli_p(jit_state_t *_jit, jit_word_t i0)
+{
+ jit_word_t word;
+ jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
word = movi_p(rn(reg), i0);
callr(rn(reg));
jit_unget_reg(reg);
-#else
- jit_word_t w;
- ic(0xe8);
- w = i0 - (_jit->pc.w + 4);
- ii(w);
- word = _jit->pc.w;
-#endif
return (word);
}
+#endif
static void
_jmpr(jit_state_t *_jit, jit_int32_t r0)
{
- rex(0, WIDE, _NOREG, _NOREG, r0);
+ rex(0, 0, _NOREG, _NOREG, r0);
ic(0xff);
mrm(0x03, 0x04, r7(r0));
}
static jit_word_t
_jmpi(jit_state_t *_jit, jit_word_t i0)
{
+ jit_word_t word;
jit_word_t w;
- ic(0xe9);
- w = i0 - (_jit->pc.w + 4);
- ii(w);
- return (_jit->pc.w);
+#if __X64
+ w = i0 - (_jit->pc.w + 5);
+ if ((jit_int32_t)w == w) {
+#endif
+ ic(0xe9);
+ w = i0 - (_jit->pc.w + 4);
+ ii(w);
+ word = _jit->pc.w;
+#if __X64
+ }
+ else
+ word = jmpi_p(i0);
+#endif
+ return (word);
}
+#if __X64
+static jit_word_t
+_jmpi_p(jit_state_t *_jit, jit_word_t i0)
+{
+ jit_word_t word;
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
+ word = movi_p(rn(reg), i0);
+ jmpr(rn(reg));
+ jit_unget_reg(reg);
+ return (word);
+}
+#endif
+
static void
_jmpsi(jit_state_t *_jit, jit_uint8_t i0)
{
switch (node->code) {
# if __X64
case jit_code_calli:
+ case jit_code_jmpi:
# endif
case jit_code_movi:
patch_abs(instr, label);