mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-04-20 14:03:26 +00:00
Compare commits
4 Commits
1542a80d22
...
17e7d7b095
Author | SHA1 | Date | |
---|---|---|---|
![]() |
17e7d7b095 | ||
![]() |
84cb21ffaf | ||
![]() |
4f2bb199fe | ||
![]() |
1dab08b1ab |
@ -886,32 +886,38 @@ static void asm_conv(ASMState *as, IRIns *ir)
|
|||||||
asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));
|
asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));
|
||||||
} else {
|
} else {
|
||||||
Reg dest = ra_dest(as, ir, RSET_GPR);
|
Reg dest = ra_dest(as, ir, RSET_GPR);
|
||||||
x86Op op = st == IRT_NUM ? XO_CVTTSD2SI : XO_CVTTSS2SI;
|
|
||||||
if (LJ_64 ? irt_isu64(ir->t) : irt_isu32(ir->t)) {
|
|
||||||
/* LJ_64: For inputs >= 2^63 add -2^64, convert again. */
|
|
||||||
/* LJ_32: For inputs >= 2^31 add -2^31, convert again and add 2^31. */
|
|
||||||
Reg tmp = ra_noreg(IR(lref)->r) ? ra_alloc1(as, lref, RSET_FPR) :
|
Reg tmp = ra_noreg(IR(lref)->r) ? ra_alloc1(as, lref, RSET_FPR) :
|
||||||
ra_scratch(as, RSET_FPR);
|
ra_scratch(as, RSET_FPR);
|
||||||
MCLabel l_end = emit_label(as);
|
x86Op op = st == IRT_NUM ? XO_CVTTSD2SI : XO_CVTTSS2SI;
|
||||||
if (LJ_32)
|
Reg r64 = (LJ_64 && irt_is64 (ir->t)) ? REX_64 : 0;
|
||||||
emit_gri(as, XG_ARITHi(XOg_ADD), dest, (int32_t)0x80000000);
|
if (LJ_64 && (irt_isu32(ir->t) || irt_isint(ir->t)))
|
||||||
emit_rr(as, op, dest|REX_64, tmp);
|
|
||||||
if (st == IRT_NUM)
|
|
||||||
emit_rma(as, XO_ADDSD, tmp, &as->J->k64[LJ_K64_M2P64_31]);
|
|
||||||
else
|
|
||||||
emit_rma(as, XO_ADDSS, tmp, &as->J->k32[LJ_K32_M2P64_31]);
|
|
||||||
emit_sjcc(as, CC_NS, l_end);
|
|
||||||
emit_rr(as, XO_TEST, dest|REX_64, dest); /* Check if dest negative. */
|
|
||||||
emit_rr(as, op, dest|REX_64, tmp);
|
|
||||||
ra_left(as, tmp, lref);
|
|
||||||
} else {
|
|
||||||
if (LJ_64 && irt_isu32(ir->t))
|
|
||||||
emit_rr(as, XO_MOV, dest, dest); /* Zero hiword. */
|
emit_rr(as, XO_MOV, dest, dest); /* Zero hiword. */
|
||||||
emit_mrm(as, op,
|
if (irt_isu64(ir->t) || irt_isu32(ir->t)) {
|
||||||
dest|((LJ_64 &&
|
/* The cvtsd2si family of instructions operates on the signed integers,
|
||||||
(irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0),
|
producing INT_MIN on error. However we're converting to an unsigned
|
||||||
asm_fuseload(as, lref, RSET_FPR));
|
integer, so we want to accept the whole unsigned integer range.
|
||||||
|
Convert both the number and the number minus INT_MIN, choosing the
|
||||||
|
first result if successful and the second otherwise. */
|
||||||
|
Reg dest2 = ra_scratch(as, rset_exclude(RSET_GPR, dest));
|
||||||
|
Reg tmp2 = ra_scratch(as, rset_exclude(RSET_FPR, tmp));
|
||||||
|
x86Op sub_op;
|
||||||
|
void *krange;
|
||||||
|
if (st == IRT_NUM) {
|
||||||
|
sub_op = XO_SUBSD;
|
||||||
|
krange = &as->J->k64[irt_isu64(ir->t) ? LJ_K64_2P64 : LJ_K64_2P32];
|
||||||
|
} else {
|
||||||
|
sub_op = XO_SUBSS;
|
||||||
|
krange = &as->J->k32[irt_isu64(ir->t) ? LJ_K32_2P64 : LJ_K32_2P32];
|
||||||
}
|
}
|
||||||
|
emit_rr(as, XO_CMOV + (CC_O<<24), dest|r64, dest2|r64);
|
||||||
|
emit_i8(as, 1);
|
||||||
|
emit_rr(as, XO_ARITHi8, XOg_CMP|r64, dest);
|
||||||
|
emit_rr(as, op, dest2|r64, tmp2);
|
||||||
|
emit_rma(as, sub_op, tmp2, krange);
|
||||||
|
emit_rr(as, XO_MOVAPS, tmp2, tmp);
|
||||||
|
}
|
||||||
|
emit_rr(as, op, dest|r64, tmp);
|
||||||
|
ra_left(as, tmp, lref);
|
||||||
}
|
}
|
||||||
} else if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */
|
} else if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */
|
||||||
Reg left, dest = ra_dest(as, ir, RSET_GPR);
|
Reg left, dest = ra_dest(as, ir, RSET_GPR);
|
||||||
|
@ -179,7 +179,7 @@ static const void *bcread_varinfo(GCproto *pt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read a single constant key/value of a template table. */
|
/* Read a single constant key/value of a template table. */
|
||||||
static void bcread_ktabk(LexState *ls, TValue *o, GCtab *t)
|
static void bcread_ktabk(LexState *ls, TValue *o)
|
||||||
{
|
{
|
||||||
MSize tp = bcread_uleb128(ls);
|
MSize tp = bcread_uleb128(ls);
|
||||||
if (tp >= BCDUMP_KTAB_STR) {
|
if (tp >= BCDUMP_KTAB_STR) {
|
||||||
@ -191,8 +191,6 @@ static void bcread_ktabk(LexState *ls, TValue *o, GCtab *t)
|
|||||||
} else if (tp == BCDUMP_KTAB_NUM) {
|
} else if (tp == BCDUMP_KTAB_NUM) {
|
||||||
o->u32.lo = bcread_uleb128(ls);
|
o->u32.lo = bcread_uleb128(ls);
|
||||||
o->u32.hi = bcread_uleb128(ls);
|
o->u32.hi = bcread_uleb128(ls);
|
||||||
} else if (tp == BCDUMP_KTAB_NIL) { /* Restore nil value marker. */
|
|
||||||
settabV(ls->L, o, t);
|
|
||||||
} else {
|
} else {
|
||||||
lj_assertLS(tp <= BCDUMP_KTAB_TRUE, "bad constant type %d", tp);
|
lj_assertLS(tp <= BCDUMP_KTAB_TRUE, "bad constant type %d", tp);
|
||||||
setpriV(o, ~tp);
|
setpriV(o, ~tp);
|
||||||
@ -209,15 +207,15 @@ static GCtab *bcread_ktab(LexState *ls)
|
|||||||
MSize i;
|
MSize i;
|
||||||
TValue *o = tvref(t->array);
|
TValue *o = tvref(t->array);
|
||||||
for (i = 0; i < narray; i++, o++)
|
for (i = 0; i < narray; i++, o++)
|
||||||
bcread_ktabk(ls, o, t);
|
bcread_ktabk(ls, o);
|
||||||
}
|
}
|
||||||
if (nhash) { /* Read hash entries. */
|
if (nhash) { /* Read hash entries. */
|
||||||
MSize i;
|
MSize i;
|
||||||
for (i = 0; i < nhash; i++) {
|
for (i = 0; i < nhash; i++) {
|
||||||
TValue key;
|
TValue key;
|
||||||
bcread_ktabk(ls, &key, t);
|
bcread_ktabk(ls, &key);
|
||||||
lj_assertLS(!tvisnil(&key), "nil key");
|
lj_assertLS(!tvisnil(&key), "nil key");
|
||||||
bcread_ktabk(ls, lj_tab_set(ls->L, t, &key), t);
|
bcread_ktabk(ls, lj_tab_set(ls->L, t, &key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return t;
|
return t;
|
||||||
|
@ -71,8 +71,6 @@ static void bcwrite_ktabk(BCWriteCtx *ctx, cTValue *o, int narrow)
|
|||||||
*p++ = BCDUMP_KTAB_NUM;
|
*p++ = BCDUMP_KTAB_NUM;
|
||||||
p = lj_strfmt_wuleb128(p, o->u32.lo);
|
p = lj_strfmt_wuleb128(p, o->u32.lo);
|
||||||
p = lj_strfmt_wuleb128(p, o->u32.hi);
|
p = lj_strfmt_wuleb128(p, o->u32.hi);
|
||||||
} else if (tvistab(o)) { /* Write the nil value marker as a nil. */
|
|
||||||
*p++ = BCDUMP_KTAB_NIL;
|
|
||||||
} else {
|
} else {
|
||||||
lj_assertBCW(tvispri(o), "unhandled type %d", itype(o));
|
lj_assertBCW(tvispri(o), "unhandled type %d", itype(o));
|
||||||
*p++ = BCDUMP_KTAB_NIL+~itype(o);
|
*p++ = BCDUMP_KTAB_NIL+~itype(o);
|
||||||
@ -135,7 +133,7 @@ static void bcwrite_ktab_sorted_hash(BCWriteCtx *ctx, Node *node, MSize nhash)
|
|||||||
TValue **heap = ctx->heap;
|
TValue **heap = ctx->heap;
|
||||||
MSize i = nhash;
|
MSize i = nhash;
|
||||||
for (;; node--) { /* Build heap. */
|
for (;; node--) { /* Build heap. */
|
||||||
if (!tvisnil(&node->val)) {
|
if (!tvisnil(&node->key)) {
|
||||||
bcwrite_ktabk_heap_insert(heap, --i, nhash, &node->key);
|
bcwrite_ktabk_heap_insert(heap, --i, nhash, &node->key);
|
||||||
if (i == 0) break;
|
if (i == 0) break;
|
||||||
}
|
}
|
||||||
@ -165,7 +163,7 @@ static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)
|
|||||||
MSize i, hmask = t->hmask;
|
MSize i, hmask = t->hmask;
|
||||||
Node *node = noderef(t->node);
|
Node *node = noderef(t->node);
|
||||||
for (i = 0; i <= hmask; i++)
|
for (i = 0; i <= hmask; i++)
|
||||||
nhash += !tvisnil(&node[i].val);
|
nhash += !tvisnil(&node[i].key);
|
||||||
}
|
}
|
||||||
/* Write number of array slots and hash slots. */
|
/* Write number of array slots and hash slots. */
|
||||||
p = lj_strfmt_wuleb128(p, narray);
|
p = lj_strfmt_wuleb128(p, narray);
|
||||||
@ -186,7 +184,7 @@ static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)
|
|||||||
} else {
|
} else {
|
||||||
MSize i = nhash;
|
MSize i = nhash;
|
||||||
for (;; node--)
|
for (;; node--)
|
||||||
if (!tvisnil(&node->val)) {
|
if (!tvisnil(&node->key)) {
|
||||||
bcwrite_ktabk(ctx, &node->key, 0);
|
bcwrite_ktabk(ctx, &node->key, 0);
|
||||||
bcwrite_ktabk(ctx, &node->val, 1);
|
bcwrite_ktabk(ctx, &node->val, 1);
|
||||||
if (--i == 0) break;
|
if (--i == 0) break;
|
||||||
|
@ -263,7 +263,7 @@ static void *callback_mcode_init(global_State *g, uint32_t *page)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Check for macOS hardened runtime. */
|
/* Check for macOS hardened runtime. */
|
||||||
#if LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
|
#if defined(LUAJIT_ENABLE_OSX_HRT) && LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#define CCMAP_CREATE MAP_JIT
|
#define CCMAP_CREATE MAP_JIT
|
||||||
#else
|
#else
|
||||||
|
@ -359,14 +359,10 @@ enum {
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
#if LJ_TARGET_X86ORX64
|
#if LJ_TARGET_X86ORX64
|
||||||
|
LJ_K64_2P32, /* 2^32 */
|
||||||
LJ_K64_TOBIT, /* 2^52 + 2^51 */
|
LJ_K64_TOBIT, /* 2^52 + 2^51 */
|
||||||
LJ_K64_2P64, /* 2^64 */
|
LJ_K64_2P64, /* 2^64 */
|
||||||
LJ_K64_M2P64, /* -2^64 */
|
LJ_K64_M2P64, /* -2^64 */
|
||||||
#if LJ_32
|
|
||||||
LJ_K64_M2P64_31, /* -2^64 or -2^31 */
|
|
||||||
#else
|
|
||||||
LJ_K64_M2P64_31 = LJ_K64_M2P64,
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
#if LJ_TARGET_MIPS
|
#if LJ_TARGET_MIPS
|
||||||
LJ_K64_2P31, /* 2^31 */
|
LJ_K64_2P31, /* 2^31 */
|
||||||
@ -381,7 +377,8 @@ enum {
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
#if LJ_TARGET_X86ORX64
|
#if LJ_TARGET_X86ORX64
|
||||||
LJ_K32_M2P64_31, /* -2^64 or -2^31 */
|
LJ_K32_2P32, /* 2^32 */
|
||||||
|
LJ_K32_2P64, /* 2^64 */
|
||||||
#endif
|
#endif
|
||||||
#if LJ_TARGET_PPC
|
#if LJ_TARGET_PPC
|
||||||
LJ_K32_2P52_2P31, /* 2^52 + 2^31 */
|
LJ_K32_2P52_2P31, /* 2^52 + 2^31 */
|
||||||
|
@ -99,7 +99,7 @@ static int mcode_setprot(void *p, size_t sz, DWORD prot)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Check for macOS hardened runtime. */
|
/* Check for macOS hardened runtime. */
|
||||||
#if LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
|
#if defined(LUAJIT_ENABLE_OSX_HRT) && LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#define MCMAP_CREATE MAP_JIT
|
#define MCMAP_CREATE MAP_JIT
|
||||||
#else
|
#else
|
||||||
@ -111,6 +111,8 @@ static int mcode_setprot(void *p, size_t sz, DWORD prot)
|
|||||||
#define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
|
#define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
|
||||||
#ifdef PROT_MPROTECT
|
#ifdef PROT_MPROTECT
|
||||||
#define MCPROT_CREATE (PROT_MPROTECT(MCPROT_RWX))
|
#define MCPROT_CREATE (PROT_MPROTECT(MCPROT_RWX))
|
||||||
|
#elif MCMAP_CREATE
|
||||||
|
#define MCPROT_CREATE PROT_EXEC
|
||||||
#else
|
#else
|
||||||
#define MCPROT_CREATE 0
|
#define MCPROT_CREATE 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -2217,11 +2217,9 @@ LJFOLD(HREF TDUP KNUM)
|
|||||||
LJFOLDF(fwd_href_tdup)
|
LJFOLDF(fwd_href_tdup)
|
||||||
{
|
{
|
||||||
TValue keyv;
|
TValue keyv;
|
||||||
cTValue *val;
|
|
||||||
lj_ir_kvalue(J->L, &keyv, fright);
|
lj_ir_kvalue(J->L, &keyv, fright);
|
||||||
val = lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv);
|
if (lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv) == niltvg(J2G(J)) &&
|
||||||
/* Check for either nil or the nil value marker in the template table. */
|
lj_opt_fwd_href_nokey(J))
|
||||||
if ((tvisnil(val) || tvistab(val)) && lj_opt_fwd_href_nokey(J))
|
|
||||||
return lj_ir_kkptr(J, niltvg(J2G(J)));
|
return lj_ir_kkptr(J, niltvg(J2G(J)));
|
||||||
return NEXTFOLD;
|
return NEXTFOLD;
|
||||||
}
|
}
|
||||||
|
@ -233,9 +233,7 @@ static TRef fwd_ahload(jit_State *J, IRRef xref)
|
|||||||
return lj_ir_knum_u64(J, tv->u64);
|
return lj_ir_knum_u64(J, tv->u64);
|
||||||
else if (tvisint(tv))
|
else if (tvisint(tv))
|
||||||
return lj_ir_kint(J, intV(tv));
|
return lj_ir_kint(J, intV(tv));
|
||||||
else if (tvistab(tv)) /* Template table nil value marker. */
|
else if (tvisgcv(tv))
|
||||||
return TREF_NIL;
|
|
||||||
else if (tvisstr(tv))
|
|
||||||
return lj_ir_kstr(J, strV(tv));
|
return lj_ir_kstr(J, strV(tv));
|
||||||
}
|
}
|
||||||
/* Othwerwise: don't intern as a constant. */
|
/* Othwerwise: don't intern as a constant. */
|
||||||
|
@ -1725,7 +1725,7 @@ static void expr_table(LexState *ls, ExpDesc *e)
|
|||||||
FuncState *fs = ls->fs;
|
FuncState *fs = ls->fs;
|
||||||
BCLine line = ls->linenumber;
|
BCLine line = ls->linenumber;
|
||||||
GCtab *t = NULL;
|
GCtab *t = NULL;
|
||||||
int vcall = 0, needarr = 0;
|
int vcall = 0, needarr = 0, fixt = 0;
|
||||||
uint32_t narr = 1; /* First array index. */
|
uint32_t narr = 1; /* First array index. */
|
||||||
uint32_t nhash = 0; /* Number of hash entries. */
|
uint32_t nhash = 0; /* Number of hash entries. */
|
||||||
BCReg freg = fs->freereg;
|
BCReg freg = fs->freereg;
|
||||||
@ -1769,10 +1769,9 @@ static void expr_table(LexState *ls, ExpDesc *e)
|
|||||||
lj_gc_anybarriert(fs->L, t);
|
lj_gc_anybarriert(fs->L, t);
|
||||||
if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */
|
if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */
|
||||||
expr_kvalue(fs, v, &val);
|
expr_kvalue(fs, v, &val);
|
||||||
/* Mark nil value with table value itself to preserve the key. */
|
} else { /* Otherwise create dummy string key (avoids lj_tab_newkey). */
|
||||||
if (key.k == VKSTR && tvisnil(v)) settabV(fs->L, v, t);
|
settabV(fs->L, v, t); /* Preserve key with table itself as value. */
|
||||||
} else { /* Preserve the key for the following non-const store. */
|
fixt = 1; /* Fix this later, after all resizes. */
|
||||||
settabV(fs->L, v, t);
|
|
||||||
goto nonconst;
|
goto nonconst;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1814,6 +1813,17 @@ static void expr_table(LexState *ls, ExpDesc *e)
|
|||||||
} else {
|
} else {
|
||||||
if (needarr && t->asize < narr)
|
if (needarr && t->asize < narr)
|
||||||
lj_tab_reasize(fs->L, t, narr-1);
|
lj_tab_reasize(fs->L, t, narr-1);
|
||||||
|
if (fixt) { /* Fix value for dummy keys in template table. */
|
||||||
|
Node *node = noderef(t->node);
|
||||||
|
uint32_t i, hmask = t->hmask;
|
||||||
|
for (i = 0; i <= hmask; i++) {
|
||||||
|
Node *n = &node[i];
|
||||||
|
if (tvistab(&n->val)) {
|
||||||
|
lj_assertFS(tabV(&n->val) == t, "bad dummy key in template table");
|
||||||
|
setnilV(&n->val); /* Turn value into nil. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
lj_gc_check(fs->L);
|
lj_gc_check(fs->L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,6 @@ GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt)
|
|||||||
Node *next = nextnode(kn);
|
Node *next = nextnode(kn);
|
||||||
/* Don't use copyTV here, since it asserts on a copy of a dead key. */
|
/* Don't use copyTV here, since it asserts on a copy of a dead key. */
|
||||||
n->val = kn->val; n->key = kn->key;
|
n->val = kn->val; n->key = kn->key;
|
||||||
if (tvistab(&n->val)) setnilV(&n->val); /* Replace nil value marker. */
|
|
||||||
setmref(n->next, next == NULL? next : (Node *)((char *)next + d));
|
setmref(n->next, next == NULL? next : (Node *)((char *)next + d));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -300,6 +300,7 @@ typedef enum {
|
|||||||
XO_CVTSS2SD = XO_f30f(5a),
|
XO_CVTSS2SD = XO_f30f(5a),
|
||||||
XO_CVTSD2SS = XO_f20f(5a),
|
XO_CVTSD2SS = XO_f20f(5a),
|
||||||
XO_ADDSS = XO_f30f(58),
|
XO_ADDSS = XO_f30f(58),
|
||||||
|
XO_SUBSS = XO_f30f(5c),
|
||||||
XO_MOVD = XO_660f(6e),
|
XO_MOVD = XO_660f(6e),
|
||||||
XO_MOVDto = XO_660f(7e),
|
XO_MOVDto = XO_660f(7e),
|
||||||
|
|
||||||
|
@ -318,12 +318,11 @@ void lj_trace_initstate(global_State *g)
|
|||||||
|
|
||||||
/* Initialize 32/64 bit constants. */
|
/* Initialize 32/64 bit constants. */
|
||||||
#if LJ_TARGET_X86ORX64
|
#if LJ_TARGET_X86ORX64
|
||||||
|
J->k64[LJ_K64_2P32].u64 = U64x(41f00000,00000000);
|
||||||
J->k64[LJ_K64_TOBIT].u64 = U64x(43380000,00000000);
|
J->k64[LJ_K64_TOBIT].u64 = U64x(43380000,00000000);
|
||||||
#if LJ_32
|
|
||||||
J->k64[LJ_K64_M2P64_31].u64 = U64x(c1e00000,00000000);
|
|
||||||
#endif
|
|
||||||
J->k64[LJ_K64_2P64].u64 = U64x(43f00000,00000000);
|
J->k64[LJ_K64_2P64].u64 = U64x(43f00000,00000000);
|
||||||
J->k32[LJ_K32_M2P64_31] = LJ_64 ? 0xdf800000 : 0xcf000000;
|
J->k32[LJ_K32_2P64] = 0x5f800000;
|
||||||
|
J->k32[LJ_K32_2P32] = 0x4f800000;
|
||||||
#endif
|
#endif
|
||||||
#if LJ_TARGET_X86ORX64 || LJ_TARGET_MIPS64
|
#if LJ_TARGET_X86ORX64 || LJ_TARGET_MIPS64
|
||||||
J->k64[LJ_K64_M2P64].u64 = U64x(c3f00000,00000000);
|
J->k64[LJ_K64_M2P64].u64 = U64x(c3f00000,00000000);
|
||||||
|
Loading…
Reference in New Issue
Block a user