2 ** Bit manipulation library.
3 ** Copyright (C) 2005-2011 Mike Pall. See Copyright Notice in luajit.h
18 /* ------------------------------------------------------------------------ */
20 #define LJLIB_MODULE_bit
22 LJLIB_ASM(bit_tobit
) LJLIB_REC(bit_unary IR_TOBIT
)
24 lj_lib_checknumber(L
, 1);
27 LJLIB_ASM_(bit_bnot
) LJLIB_REC(bit_unary IR_BNOT
)
28 LJLIB_ASM_(bit_bswap
) LJLIB_REC(bit_unary IR_BSWAP
)
30 LJLIB_ASM(bit_lshift
) LJLIB_REC(bit_shift IR_BSHL
)
32 lj_lib_checknumber(L
, 1);
33 lj_lib_checkbit(L
, 2);
36 LJLIB_ASM_(bit_rshift
) LJLIB_REC(bit_shift IR_BSHR
)
37 LJLIB_ASM_(bit_arshift
) LJLIB_REC(bit_shift IR_BSAR
)
38 LJLIB_ASM_(bit_rol
) LJLIB_REC(bit_shift IR_BROL
)
39 LJLIB_ASM_(bit_ror
) LJLIB_REC(bit_shift IR_BROR
)
41 LJLIB_ASM(bit_band
) LJLIB_REC(bit_nary IR_BAND
)
44 do { lj_lib_checknumber(L
, ++i
); } while (L
->base
+i
< L
->top
);
47 LJLIB_ASM_(bit_bor
) LJLIB_REC(bit_nary IR_BOR
)
48 LJLIB_ASM_(bit_bxor
) LJLIB_REC(bit_nary IR_BXOR
)
50 /* ------------------------------------------------------------------------ */
54 uint32_t b
= (uint32_t)lj_lib_checkbit(L
, 1);
55 int32_t i
, n
= L
->base
+1 >= L
->top
? 8 : lj_lib_checkbit(L
, 2);
56 const char *hexdigits
= "0123456789abcdef";
58 if (n
< 0) { n
= -n
; hexdigits
= "0123456789ABCDEF"; }
60 for (i
= n
; --i
>= 0; ) { buf
[i
] = hexdigits
[b
& 15]; b
>>= 4; }
61 lua_pushlstring(L
, buf
, (size_t)n
);
65 /* ------------------------------------------------------------------------ */
67 #include "lj_libdef.h"
69 LUALIB_API
int luaopen_bit(lua_State
*L
)
71 LJ_LIB_REG(L
, LUA_BITLIBNAME
, bit
);