diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_parse.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c index 9ddf60ed..64ae2c16 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c | |||
@@ -964,22 +964,22 @@ static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e) | |||
964 | #if LJ_HASFFI | 964 | #if LJ_HASFFI |
965 | if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */ | 965 | if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */ |
966 | GCcdata *cd = cdataV(&e->u.nval); | 966 | GCcdata *cd = cdataV(&e->u.nval); |
967 | int64_t *p = (int64_t *)cdataptr(cd); | 967 | uint64_t *p = (uint64_t *)cdataptr(cd); |
968 | if (cd->ctypeid == CTID_COMPLEX_DOUBLE) | 968 | if (cd->ctypeid == CTID_COMPLEX_DOUBLE) |
969 | p[1] ^= (int64_t)U64x(80000000,00000000); | 969 | p[1] ^= U64x(80000000,00000000); |
970 | else | 970 | else |
971 | *p = -*p; | 971 | *p = ~*p+1u; |
972 | return; | 972 | return; |
973 | } else | 973 | } else |
974 | #endif | 974 | #endif |
975 | if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */ | 975 | if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */ |
976 | TValue *o = expr_numtv(e); | 976 | TValue *o = expr_numtv(e); |
977 | if (tvisint(o)) { | 977 | if (tvisint(o)) { |
978 | int32_t k = intV(o); | 978 | int32_t k = intV(o), negk = (int32_t)(~(uint32_t)k+1u); |
979 | if (k == -k) | 979 | if (k == negk) |
980 | setnumV(o, -(lua_Number)k); | 980 | setnumV(o, -(lua_Number)k); |
981 | else | 981 | else |
982 | setintV(o, -k); | 982 | setintV(o, negk); |
983 | return; | 983 | return; |
984 | } else { | 984 | } else { |
985 | o->u64 ^= U64x(80000000,00000000); | 985 | o->u64 ^= U64x(80000000,00000000); |