LJLIB_ASM(bit_band) LJLIB_REC(bit_nary IR_BAND) { #if LJ_HASFFI CTypeID id = 0; TValue *o = L->base, *top = L->top; int i = 0; do { lj_carith_check64(L, ++i, &id); } while (++o < top); if (id) { CTState *cts = ctype_cts(L); CType *ct = ctype_get(cts, id); int op = curr_func(L)->c.ffid - (int)FF_bit_bor; uint64_t x, y = op >= 0 ? 0 : ~(uint64_t)0; o = L->base; do { lj_cconv_ct_tv(cts, ct, (uint8_t *)&x, o, 0); if (op < 0) y &= x; else if (op == 0) y |= x; else y ^= x; } while (++o < top); return bit_result64(L, id, y); } return FFH_RETRY; #else int i = 0; do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top); return FFH_RETRY; #endif }
LJLIB_ASM(bit_band) LJLIB_REC(bit_nary IR_BAND) { int i = 0; do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top); return FFH_RETRY; }
LJLIB_ASM(bit_bswap) LJLIB_REC(bit_unary IR_BSWAP) { #if LJ_HASFFI CTypeID id = 0; uint64_t x = lj_carith_check64(L, 1, &id); return id ? bit_result64(L, id, lj_bswap64(x)) : FFH_RETRY; #else lj_lib_checknumber(L, 1); return FFH_RETRY; #endif }
LJLIB_ASM(bit_lshift) LJLIB_REC(bit_shift IR_BSHL) { #if LJ_HASFFI CTypeID id = 0, id2 = 0; uint64_t x = lj_carith_check64(L, 1, &id); int32_t sh = (int32_t)lj_carith_check64(L, 2, &id2); if (id) { x = lj_carith_shift64(x, sh, curr_func(L)->c.ffid - (int)FF_bit_lshift); return bit_result64(L, id, x); } if (id2) setintV(L->base+1, sh); return FFH_RETRY; #else lj_lib_checknumber(L, 1); bit_checkbit(L, 2); return FFH_RETRY; #endif }
LJLIB_ASM(bit_lshift) LJLIB_REC(bit_shift IR_BSHL) { lj_lib_checknumber(L, 1); lj_lib_checkbit(L, 2); return FFH_RETRY; }
LJLIB_ASM(bit_tobit) LJLIB_REC(bit_unary IR_TOBIT) { lj_lib_checknumber(L, 1); return FFH_RETRY; }