+/* If the fallback clor, clzr, ctor and ctzr are used, it might be better
+ * to implement it as functions, as inlined it is almost as large as a
+ * function.
+ * Below is an example of how to do it.
+ */
+
+.data 4096
+str_clo:
+.c "clo"
+str_clz:
+.c "clz"
+str_cto:
+.c "cto"
+str_ctz:
+.c "ctz"
+print_fmt:
+#if __WORDSIZE == 64
+.c "%s (0x%016lx) %s = %d\n"
+#else
+.c "%s (0x%08lx) %s = %d\n"
+#endif
+ok:
+.c "ok\n"
+
+#define BIT2(OP, ARG, RES, R0, R1) \
+ movi %R1 ARG \
+ OP##r %R0 %R1 \
+ beqi OP##R0##R1##ARG %R0 RES \
+ calli @abort \
+OP##R0##R1##ARG:
+
+#define BIT1(OP, ARG, RES, V0, V1, V2, R0, R1, R2) \
+ BIT2(OP, ARG, RES, V0, V0) \
+ BIT2(OP, ARG, RES, V0, V1) \
+ BIT2(OP, ARG, RES, V0, V2) \
+ BIT2(OP, ARG, RES, V0, R0) \
+ BIT2(OP, ARG, RES, V0, R1) \
+ BIT2(OP, ARG, RES, V0, R2)
+
+#define BIT(OP, ARG, RES, V0, V1, V2, R0, R1, R2) \
+ BIT1(OP, ARG, RES, V1, V2, R0, R1, R2, V0) \
+ BIT1(OP, ARG, RES, V2, R0, R1, R2, V0, V1) \
+ BIT1(OP, ARG, RES, R0, R1, R2, V0, V1, V2) \
+ BIT1(OP, ARG, RES, R1, R2, V0, V1, V2, R0) \
+ BIT1(OP, ARG, RES, R2, V0, V1, V2, R0, R1)
+
+#define CLO(ARG, RES) \
+ BIT(clo, ARG, RES, v0, v1, v2, r0, r1, r2)
+#define CLZ(ARG, RES) \
+ BIT(clz, ARG, RES, v0, v1, v2, r0, r1, r2)
+#define CTO(ARG, RES) \
+ BIT(cto, ARG, RES, v0, v1, v2, r0, r1, r2)
+#define CTZ(ARG, RES) \
+ BIT(ctz, ARG, RES, v0, v1, v2, r0, r1, r2)
+
+.code
+ jmpi main
+/*
+ jit_uword_t cto(jit_uword_t r0) {
+ r0 = ~r0;
+ if (r0 == 0)
+ r0 = __WORDSIZE;
+ else
+ r0 = ctz(r0);
+ return r0;
+ }
+ */
+name cto
+cto:
+ prolog
+ arg $in
+ getarg %r0 $in
+ comr %r0 %r0
+ bnei do_cto %r0 0
+ movi %r0 __WORDSIZE
+ jmpi done_cto
+do_cto:
+ prepare
+ pushargr %r0
+ finishi ctz
+ retval %r0
+done_cto:
+ retr %r0
+ epilog
+
+/*
+ jit_uword_t clo(jit_uword_t r0) {
+ r0 = ~r0;
+ if (r0 == 0)
+ r0 = __WORDSIZE;
+ else
+ r0 = clz(r0);
+ return r0;
+ }
+ */
+name clo
+clo:
+ prolog
+ arg $in
+ getarg %r0 $in
+ comr %r0 %r0
+ bnei do_clo %r0 0
+ movi %r0 __WORDSIZE
+ jmpi done_clo
+do_clo:
+ prepare
+ pushargr %r0
+ finishi clz
+ retval %r0
+done_clo:
+ retr %r0
+ epilog
+
+/*
+ jit_uword_t clz(jit_word_t r1) {
+ jit_uword_t r0, r2;
+ if (r1 == 0)
+ r0 = __WORDSIZE;
+ else {
+ r0 = 0;
+ #if __WORDSIZE == 64
+ r2 = 0xffffffff00000000UL;
+ if (!(r1 & r2)) {
+ r1 <<= 32;
+ r0 += 32;
+ }
+ r2 <<= 16;
+ #else
+ r2 = 0xffff0000UL;
+ #endif
+ if (!(r1 & r2)) {
+ r1 <<= 16;
+ r0 += 16;
+ }
+ r2 <<= 8;
+ if (!(r1 & r2)) {
+ r1 <<= 8;
+ r0 += 8;
+ }
+ r2 <<= 4;
+ if (!(r1 & r2)) {
+ r1 <<= 4;
+ r0 += 4;
+ }
+ r2 <<= 2;
+ if (!(r1 & r2)) {
+ r1 <<= 2;
+ r0 += 2;
+ }
+ r2 <<= 1;
+ if (!(r1 & r2))
+ r0 += 1;
+ }
+ return r0;
+ }
+ */
+name clz
+clz:
+ prolog
+ arg $in
+ getarg %r1 $in
+ bnei lun %r1 0
+ reti __WORDSIZE
+lun:
+ movi %r0 0
+#if __WORDSIZE == 64
+ movi %r2 0xffffffff00000000
+ bmsr l32 %r1 %r2
+ lshi %r1 %r1 32
+ addi %r0 %r0 32
+l32:
+ lshi %r2 %r2 16
+#else
+ movi %r2 0xffff0000
+#endif
+ bmsr l16 %r1 %r2
+ lshi %r1 %r1 16
+ addi %r0 %r0 16
+l16:
+ lshi %r2 %r2 8
+ bmsr l8 %r1 %r2
+ lshi %r1 %r1 8
+ addi %r0 %r0 8
+l8:
+ lshi %r2 %r2 4
+ bmsr l4 %r1 %r2
+ lshi %r1 %r1 4
+ addi %r0 %r0 4
+l4:
+ lshi %r2 %r2 2
+ bmsr l2 %r1 %r2
+ lshi %r1 %r1 2
+ addi %r0 %r0 2
+l2:
+ lshi %r2 %r2 1
+ bmsr l1 %r1 %r2
+ addi %r0 %r0 1
+l1:
+ retr %r0
+ epilog
+
+/*
+ jit_uword_t ctz(jit_uword_t r1) {
+ jit_uword_t r0, r2;
+ if (r1 == 0)
+ r0 = __WORDSIZE;
+ else {
+ r0 = 0;
+ #if __WORDSIZE == 64
+ r2 = 0xffffffffUL;;
+ if (!(r1 & r2)) {
+ r1 >>= 32;
+ r0 += 32;
+ }
+ r2 >>= 16;
+ #else
+ r2 = 0xffffUL;;
+ #endif
+ if (!(r1 & r2)) {
+ r1 >>= 16;
+ r0 += 16;
+ }
+ r2 >>= 8;
+ if (!(r1 & r2)) {
+ r1 >>= 8;
+ r0 += 8;
+ }
+ r2 >>= 4;
+ if (!(r1 & r2)) {
+ r1 >>= 4;
+ r0 += 4;
+ }
+ r2 >>= 2;
+ if (!(r1 & r2)) {
+ r1 >>= 2;
+ r0 += 2;
+ }
+ r2 >>= 1;
+ if (!(r1 & r2))
+ r0 += 1;
+ }
+ return r0;
+ }
+*/
+name ctz
+ctz:
+ prolog
+ arg $in
+ getarg %r1 $in
+ bnei tun %r1 0
+ reti __WORDSIZE
+tun:
+#if __WORDSIZE == 64
+ movi %r0 0
+ movi %r2 0xffffffff
+ bmsr t32 %r1 %r2
+ rshi_u %r1 %r1 32
+ addi %r0 %r0 32
+t32:
+ rshi %r2 %r2 16
+#else
+ movi %r2 0xffff
+#endif
+ bmsr t16 %r1 %r2
+ rshi_u %r1 %r1 16
+ addi %r0 %r0 16
+t16:
+ rshi %r2 %r2 8
+ bmsr t8 %r1 %r2
+ rshi_u %r1 %r1 8
+ addi %r0 %r0 8
+t8:
+ rshi %r2 %r2 4
+ bmsr t4 %r1 %r2
+ rshi_u %r1 %r1 4
+ addi %r0 %r0 4
+t4:
+ rshi %r2 %r2 2
+ bmsr t2 %r1 %r2
+ rshi_u %r1 %r1 2
+ addi %r0 %r0 2
+t2:
+ rshi %r2 %r2 1
+ bmsr t1 %r1 %r2
+ addi %r0 %r0 1
+t1:
+ retr %r0
+ epilog
+
+/*
+ char *bitsprint(char *v0, jit_uword_t v1) {
+ jit_uword_t r0, r1;
+ memset(v0, '0', __WORDSIZE);
+ v0[__WORDSIZE] = 0;
+ for (r0 = 1L << (__WORDSIZE - 1), r1 = 0; r0; r0 >>= 1, ++r1) {
+ if (v1 & r0)
+ v0[r1] = '1';
+ }
+ return v0;
+ }
+ */
+name bitsprint
+bitsprint:
+ prolog
+ arg $buf
+ arg $val
+ getarg %v0 $buf
+ getarg %v1 $val
+ prepare
+ pushargr %v0
+ pushargi '0'
+ pushargi __WORDSIZE
+ finishi @memset
+ movi %r0 0
+ addi %r1 %v0 __WORDSIZE
+ str_c %r1 %r0
+ movi %r0 $(1 << (__WORDSIZE - 1))
+ movi %r1 0
+ movi %r2 '1'
+bitloop:
+ bmcr bitzero %v1 %r0
+ stxr_c %r1 %v0 %r2
+bitzero:
+ addi %r1 %r1 1
+ rshi_u %r0 %r0 1
+ bnei bitloop %r0 0
+ retr %v0
+ epilog
+
+/*
+ #if 0
+ int main(int argc, char *argv[]) {
+ jit_uword_t r0, v0, v1, v2;
+ char buf[80];
+ #if __WORDSIZE == 64
+ char *fmt = "%s (0x%016lx) %s = %d\n";
+ v0 = 0x8000000000000000UL;
+ v2 = 0xffffffffffffffffUL;
+ #else
+ char *fmt = "%s (0x%08lx) %s = %d\n";
+ v0 = 0x80000000UL;
+ v2 = 0xffffffffUL;
+ #endif
+ do {
+ v1 = v0 - 1;
+ r0 = clz(v0);
+ bitsprint(buf, v0);
+ printf(fmt, "clz", v0, buf, r0);
+ r0 = clo(v2);
+ bitsprint(buf, v2);
+ printf(fmt, "clo", v2, buf, r0);
+ r0 = ctz(v0);
+ bitsprint(buf, v0);
+ printf(fmt, "ctz", v0, buf, r0);
+ r0 = cto(v1);
+ bitsprint(buf, v1);
+ printf(fmt, "cto", v1, buf, r0);
+ v0 >>= 1;
+ v2 <<= 1;
+ } while ((jit_word_t)v1 > -1);
+ return 0;
+ }
+ #endif
+ */
+
+/* Make it "#if 1" for a "debug mode", that helps in regenerating tables,
+ * or temporary state while implementing optimized port specific versions. */
+#if 0
+#define CALL_FUNC 1
+ name main
+main:
+ prolog
+ allocai 80 $buf
+#if __WORDSIZE == 64
+ movi %v0 0x8000000000000000
+ movi %v2 0xffffffffffffffff
+#else
+ movi %v0 0x80000000
+ movi %v2 0xffffffff
+#endif
+loop:
+ subi %v1 %v0 1
+ addi %r1 %fp $buf
+ prepare
+ pushargr %r1
+ pushargr %v0
+ finishi bitsprint
+#if CALL_FUNC
+ prepare
+ pushargr %v0
+ finishi clz
+ retval %r0
+#else
+ clzr %r0 %v0
+#endif
+ addi %r1 %fp $buf
+ prepare
+ pushargi print_fmt
+ ellipsis
+ pushargi str_clz
+ pushargr %v0
+ pushargr %r1
+ pushargr %r0
+ finishi @printf
+ addi %r1 %fp $buf
+ prepare
+ pushargr %r1
+ pushargr %v2
+ finishi bitsprint
+#if CALL_FUNC
+ prepare
+ pushargr %v2
+ finishi clo
+ retval %r0
+#else
+ clor %r0 %v2
+#endif
+ addi %r1 %fp $buf
+ prepare
+ pushargi print_fmt
+ ellipsis
+ pushargi str_clo
+ pushargr %v2
+ pushargr %r1
+ pushargr %r0
+ finishi @printf
+ addi %r1 %fp $buf
+ prepare
+ pushargr %r1
+ pushargr %v0
+ finishi bitsprint
+#if CALL_FUNC
+ prepare
+ pushargr %v0
+ finishi ctz
+ retval %r0
+#else
+ ctzr %r0 %v0
+#endif
+ addi %r1 %fp $buf
+ prepare
+ pushargi print_fmt
+ ellipsis
+ pushargi str_ctz
+ pushargr %v0
+ pushargr %r1
+ pushargr %r0
+ finishi @printf
+ addi %r1 %fp $buf
+ prepare
+ pushargr %r1
+ pushargr %v1
+ finishi bitsprint
+#if CALL_FUNC
+ prepare
+ pushargr %v1
+ finishi cto
+ retval %r0
+#else
+ ctor %r0 %v1
+#endif
+ addi %r1 %fp $buf
+ prepare
+ pushargi print_fmt
+ ellipsis
+ pushargi str_cto
+ pushargr %v1
+ pushargr %r1
+ pushargr %r0
+ finishi @printf
+ rshi_u %v0 %v0 1
+ lshi %v2 %v2 1
+ bgti loop %v1 -1
+ ret
+ epilog
+#else
+
+ name main
+main:
+ prolog
+#if __WORDSIZE == 32
+ CLZ(0x80000000, 0)
+ CLO(0xffffffff, 32)
+ CTZ(0x80000000, 31)
+ CTO(0x7fffffff, 31)
+ CLZ(0x40000000, 1)
+ CLO(0xfffffffe, 31)
+ CTZ(0x40000000, 30)
+ CTO(0x3fffffff, 30)
+ CLZ(0x20000000, 2)
+ CLO(0xfffffffc, 30)
+ CTZ(0x20000000, 29)
+ CTO(0x1fffffff, 29)
+ CLZ(0x10000000, 3)
+ CLO(0xfffffff8, 29)
+ CTZ(0x10000000, 28)
+ CTO(0x0fffffff, 28)
+ CLZ(0x08000000, 4)
+ CLO(0xfffffff0, 28)
+ CTZ(0x08000000, 27)
+ CTO(0x07ffffff, 27)
+ CLZ(0x04000000, 5)
+ CLO(0xffffffe0, 27)
+ CTZ(0x04000000, 26)
+ CTO(0x03ffffff, 26)
+ CLZ(0x02000000, 6)
+ CLO(0xffffffc0, 26)
+ CTZ(0x02000000, 25)
+ CTO(0x01ffffff, 25)
+ CLZ(0x01000000, 7)
+ CLO(0xffffff80, 25)
+ CTZ(0x01000000, 24)
+ CTO(0x00ffffff, 24)
+ CLZ(0x00800000, 8)
+ CLO(0xffffff00, 24)
+ CTZ(0x00800000, 23)
+ CTO(0x007fffff, 23)
+ CLZ(0x00400000, 9)
+ CLO(0xfffffe00, 23)
+ CTZ(0x00400000, 22)
+ CTO(0x003fffff, 22)
+ CLZ(0x00200000, 10)
+ CLO(0xfffffc00, 22)
+ CTZ(0x00200000, 21)
+ CTO(0x001fffff, 21)
+ CLZ(0x00100000, 11)
+ CLO(0xfffff800, 21)
+ CTZ(0x00100000, 20)
+ CTO(0x000fffff, 20)
+ CLZ(0x00080000, 12)
+ CLO(0xfffff000, 20)
+ CTZ(0x00080000, 19)
+ CTO(0x0007ffff, 19)
+ CLZ(0x00040000, 13)
+ CLO(0xffffe000, 19)
+ CTZ(0x00040000, 18)
+ CTO(0x0003ffff, 18)
+ CLZ(0x00020000, 14)
+ CLO(0xffffc000, 18)
+ CTZ(0x00020000, 17)
+ CTO(0x0001ffff, 17)
+ CLZ(0x00010000, 15)
+ CLO(0xffff8000, 17)
+ CTZ(0x00010000, 16)
+ CTO(0x0000ffff, 16)
+ CLZ(0x00008000, 16)
+ CLO(0xffff0000, 16)
+ CTZ(0x00008000, 15)
+ CTO(0x00007fff, 15)
+ CLZ(0x00004000, 17)
+ CLO(0xfffe0000, 15)
+ CTZ(0x00004000, 14)
+ CTO(0x00003fff, 14)
+ CLZ(0x00002000, 18)
+ CLO(0xfffc0000, 14)
+ CTZ(0x00002000, 13)
+ CTO(0x00001fff, 13)
+ CLZ(0x00001000, 19)
+ CLO(0xfff80000, 13)
+ CTZ(0x00001000, 12)
+ CTO(0x00000fff, 12)
+ CLZ(0x00000800, 20)
+ CLO(0xfff00000, 12)
+ CTZ(0x00000800, 11)
+ CTO(0x000007ff, 11)
+ CLZ(0x00000400, 21)
+ CLO(0xffe00000, 11)
+ CTZ(0x00000400, 10)
+ CTO(0x000003ff, 10)
+ CLZ(0x00000200, 22)
+ CLO(0xffc00000, 10)
+ CTZ(0x00000200, 9)
+ CTO(0x000001ff, 9)
+ CLZ(0x00000100, 23)
+ CLO(0xff800000, 9)
+ CTZ(0x00000100, 8)
+ CTO(0x000000ff, 8)
+ CLZ(0x00000080, 24)
+ CLO(0xff000000, 8)
+ CTZ(0x00000080, 7)
+ CTO(0x0000007f, 7)
+ CLZ(0x00000040, 25)
+ CLO(0xfe000000, 7)
+ CTZ(0x00000040, 6)
+ CTO(0x0000003f, 6)
+ CLZ(0x00000020, 26)
+ CLO(0xfc000000, 6)
+ CTZ(0x00000020, 5)
+ CTO(0x0000001f, 5)
+ CLZ(0x00000010, 27)
+ CLO(0xf8000000, 5)
+ CTZ(0x00000010, 4)
+ CTO(0x0000000f, 4)
+ CLZ(0x00000008, 28)
+ CLO(0xf0000000, 4)
+ CTZ(0x00000008, 3)
+ CTO(0x00000007, 3)
+ CLZ(0x00000004, 29)
+ CLO(0xe0000000, 3)
+ CTZ(0x00000004, 2)
+ CTO(0x00000003, 2)
+ CLZ(0x00000002, 30)
+ CLO(0xc0000000, 2)
+ CTZ(0x00000002, 1)
+ CTO(0x00000001, 1)
+ CLZ(0x00000001, 31)
+ CLO(0x80000000, 1)
+ CTZ(0x00000001, 0)
+ CTO(0x00000000, 0)
+ CLZ(0x00000000, 32)
+ CLO(0x00000000, 0)
+ CTZ(0x00000000, 32)
+ CTO(0xffffffff, 32)
+#else
+ CLZ(0x8000000000000000, 0)
+ CLO(0xffffffffffffffff, 64)
+ CTZ(0x8000000000000000, 63)
+ CTO(0x7fffffffffffffff, 63)
+ CLZ(0x4000000000000000, 1)
+ CLO(0xfffffffffffffffe, 63)
+ CTZ(0x4000000000000000, 62)
+ CTO(0x3fffffffffffffff, 62)
+ CLZ(0x2000000000000000, 2)
+ CLO(0xfffffffffffffffc, 62)
+ CTZ(0x2000000000000000, 61)
+ CTO(0x1fffffffffffffff, 61)
+ CLZ(0x1000000000000000, 3)
+ CLO(0xfffffffffffffff8, 61)
+ CTZ(0x1000000000000000, 60)
+ CTO(0x0fffffffffffffff, 60)
+ CLZ(0x0800000000000000, 4)
+ CLO(0xfffffffffffffff0, 60)
+ CTZ(0x0800000000000000, 59)
+ CTO(0x07ffffffffffffff, 59)
+ CLZ(0x0400000000000000, 5)
+ CLO(0xffffffffffffffe0, 59)
+ CTZ(0x0400000000000000, 58)
+ CTO(0x03ffffffffffffff, 58)
+ CLZ(0x0200000000000000, 6)
+ CLO(0xffffffffffffffc0, 58)
+ CTZ(0x0200000000000000, 57)
+ CTO(0x01ffffffffffffff, 57)
+ CLZ(0x0100000000000000, 7)
+ CLO(0xffffffffffffff80, 57)
+ CTZ(0x0100000000000000, 56)
+ CTO(0x00ffffffffffffff, 56)
+ CLZ(0x0080000000000000, 8)
+ CLO(0xffffffffffffff00, 56)
+ CTZ(0x0080000000000000, 55)
+ CTO(0x007fffffffffffff, 55)
+ CLZ(0x0040000000000000, 9)
+ CLO(0xfffffffffffffe00, 55)
+ CTZ(0x0040000000000000, 54)
+ CTO(0x003fffffffffffff, 54)
+ CLZ(0x0020000000000000, 10)
+ CLO(0xfffffffffffffc00, 54)
+ CTZ(0x0020000000000000, 53)
+ CTO(0x001fffffffffffff, 53)
+ CLZ(0x0010000000000000, 11)
+ CLO(0xfffffffffffff800, 53)
+ CTZ(0x0010000000000000, 52)
+ CTO(0x000fffffffffffff, 52)
+ CLZ(0x0008000000000000, 12)
+ CLO(0xfffffffffffff000, 52)
+ CTZ(0x0008000000000000, 51)
+ CTO(0x0007ffffffffffff, 51)
+ CLZ(0x0004000000000000, 13)
+ CLO(0xffffffffffffe000, 51)
+ CTZ(0x0004000000000000, 50)
+ CTO(0x0003ffffffffffff, 50)
+ CLZ(0x0002000000000000, 14)
+ CLO(0xffffffffffffc000, 50)
+ CTZ(0x0002000000000000, 49)
+ CTO(0x0001ffffffffffff, 49)
+ CLZ(0x0001000000000000, 15)
+ CLO(0xffffffffffff8000, 49)
+ CTZ(0x0001000000000000, 48)
+ CTO(0x0000ffffffffffff, 48)
+ CLZ(0x0000800000000000, 16)
+ CLO(0xffffffffffff0000, 48)
+ CTZ(0x0000800000000000, 47)
+ CTO(0x00007fffffffffff, 47)
+ CLZ(0x0000400000000000, 17)
+ CLO(0xfffffffffffe0000, 47)
+ CTZ(0x0000400000000000, 46)
+ CTO(0x00003fffffffffff, 46)
+ CLZ(0x0000200000000000, 18)
+ CLO(0xfffffffffffc0000, 46)
+ CTZ(0x0000200000000000, 45)
+ CTO(0x00001fffffffffff, 45)
+ CLZ(0x0000100000000000, 19)
+ CLO(0xfffffffffff80000, 45)
+ CTZ(0x0000100000000000, 44)
+ CTO(0x00000fffffffffff, 44)
+ CLZ(0x0000080000000000, 20)
+ CLO(0xfffffffffff00000, 44)
+ CTZ(0x0000080000000000, 43)
+ CTO(0x000007ffffffffff, 43)
+ CLZ(0x0000040000000000, 21)
+ CLO(0xffffffffffe00000, 43)
+ CTZ(0x0000040000000000, 42)
+ CTO(0x000003ffffffffff, 42)
+ CLZ(0x0000020000000000, 22)
+ CLO(0xffffffffffc00000, 42)
+ CTZ(0x0000020000000000, 41)
+ CTO(0x000001ffffffffff, 41)
+ CLZ(0x0000010000000000, 23)
+ CLO(0xffffffffff800000, 41)
+ CTZ(0x0000010000000000, 40)
+ CTO(0x000000ffffffffff, 40)
+ CLZ(0x0000008000000000, 24)
+ CLO(0xffffffffff000000, 40)
+ CTZ(0x0000008000000000, 39)
+ CTO(0x0000007fffffffff, 39)
+ CLZ(0x0000004000000000, 25)
+ CLO(0xfffffffffe000000, 39)
+ CTZ(0x0000004000000000, 38)
+ CTO(0x0000003fffffffff, 38)
+ CLZ(0x0000002000000000, 26)
+ CLO(0xfffffffffc000000, 38)
+ CTZ(0x0000002000000000, 37)
+ CTO(0x0000001fffffffff, 37)
+ CLZ(0x0000001000000000, 27)
+ CLO(0xfffffffff8000000, 37)
+ CTZ(0x0000001000000000, 36)
+ CTO(0x0000000fffffffff, 36)
+ CLZ(0x0000000800000000, 28)
+ CLO(0xfffffffff0000000, 36)
+ CTZ(0x0000000800000000, 35)
+ CTO(0x00000007ffffffff, 35)
+ CLZ(0x0000000400000000, 29)
+ CLO(0xffffffffe0000000, 35)
+ CTZ(0x0000000400000000, 34)
+ CTO(0x00000003ffffffff, 34)
+ CLZ(0x0000000200000000, 30)
+ CLO(0xffffffffc0000000, 34)
+ CTZ(0x0000000200000000, 33)
+ CTO(0x00000001ffffffff, 33)
+ CLZ(0x0000000100000000, 31)
+ CLO(0xffffffff80000000, 33)
+ CTZ(0x0000000100000000, 32)
+ CTO(0x00000000ffffffff, 32)
+ CLZ(0x0000000080000000, 32)
+ CLO(0xffffffff00000000, 32)
+ CTZ(0x0000000080000000, 31)
+ CTO(0x000000007fffffff, 31)
+ CLZ(0x0000000040000000, 33)
+ CLO(0xfffffffe00000000, 31)
+ CTZ(0x0000000040000000, 30)
+ CTO(0x000000003fffffff, 30)
+ CLZ(0x0000000020000000, 34)
+ CLO(0xfffffffc00000000, 30)
+ CTZ(0x0000000020000000, 29)
+ CTO(0x000000001fffffff, 29)
+ CLZ(0x0000000010000000, 35)
+ CLO(0xfffffff800000000, 29)
+ CTZ(0x0000000010000000, 28)
+ CTO(0x000000000fffffff, 28)
+ CLZ(0x0000000008000000, 36)
+ CLO(0xfffffff000000000, 28)
+ CTZ(0x0000000008000000, 27)
+ CTO(0x0000000007ffffff, 27)
+ CLZ(0x0000000004000000, 37)
+ CLO(0xffffffe000000000, 27)
+ CTZ(0x0000000004000000, 26)
+ CTO(0x0000000003ffffff, 26)
+ CLZ(0x0000000002000000, 38)
+ CLO(0xffffffc000000000, 26)
+ CTZ(0x0000000002000000, 25)
+ CTO(0x0000000001ffffff, 25)
+ CLZ(0x0000000001000000, 39)
+ CLO(0xffffff8000000000, 25)
+ CTZ(0x0000000001000000, 24)
+ CTO(0x0000000000ffffff, 24)
+ CLZ(0x0000000000800000, 40)
+ CLO(0xffffff0000000000, 24)
+ CTZ(0x0000000000800000, 23)
+ CTO(0x00000000007fffff, 23)
+ CLZ(0x0000000000400000, 41)
+ CLO(0xfffffe0000000000, 23)
+ CTZ(0x0000000000400000, 22)
+ CTO(0x00000000003fffff, 22)
+ CLZ(0x0000000000200000, 42)
+ CLO(0xfffffc0000000000, 22)
+ CTZ(0x0000000000200000, 21)
+ CTO(0x00000000001fffff, 21)
+ CLZ(0x0000000000100000, 43)
+ CLO(0xfffff80000000000, 21)
+ CTZ(0x0000000000100000, 20)
+ CTO(0x00000000000fffff, 20)
+ CLZ(0x0000000000080000, 44)
+ CLO(0xfffff00000000000, 20)
+ CTZ(0x0000000000080000, 19)
+ CTO(0x000000000007ffff, 19)
+ CLZ(0x0000000000040000, 45)
+ CLO(0xffffe00000000000, 19)
+ CTZ(0x0000000000040000, 18)
+ CTO(0x000000000003ffff, 18)
+ CLZ(0x0000000000020000, 46)
+ CLO(0xffffc00000000000, 18)
+ CTZ(0x0000000000020000, 17)
+ CTO(0x000000000001ffff, 17)
+ CLZ(0x0000000000010000, 47)
+ CLO(0xffff800000000000, 17)
+ CTZ(0x0000000000010000, 16)
+ CTO(0x000000000000ffff, 16)
+ CLZ(0x0000000000008000, 48)
+ CLO(0xffff000000000000, 16)
+ CTZ(0x0000000000008000, 15)
+ CTO(0x0000000000007fff, 15)
+ CLZ(0x0000000000004000, 49)
+ CLO(0xfffe000000000000, 15)
+ CTZ(0x0000000000004000, 14)
+ CTO(0x0000000000003fff, 14)
+ CLZ(0x0000000000002000, 50)
+ CLO(0xfffc000000000000, 14)
+ CTZ(0x0000000000002000, 13)
+ CTO(0x0000000000001fff, 13)
+ CLZ(0x0000000000001000, 51)
+ CLO(0xfff8000000000000, 13)
+ CTZ(0x0000000000001000, 12)
+ CTO(0x0000000000000fff, 12)
+ CLZ(0x0000000000000800, 52)
+ CLO(0xfff0000000000000, 12)
+ CTZ(0x0000000000000800, 11)
+ CTO(0x00000000000007ff, 11)
+ CLZ(0x0000000000000400, 53)
+ CLO(0xffe0000000000000, 11)
+ CTZ(0x0000000000000400, 10)
+ CTO(0x00000000000003ff, 10)
+ CLZ(0x0000000000000200, 54)
+ CLO(0xffc0000000000000, 10)
+ CTZ(0x0000000000000200, 9)
+ CTO(0x00000000000001ff, 9)
+ CLZ(0x0000000000000100, 55)
+ CLO(0xff80000000000000, 9)
+ CTZ(0x0000000000000100, 8)
+ CTO(0x00000000000000ff, 8)
+ CLZ(0x0000000000000080, 56)
+ CLO(0xff00000000000000, 8)
+ CTZ(0x0000000000000080, 7)
+ CTO(0x000000000000007f, 7)
+ CLZ(0x0000000000000040, 57)
+ CLO(0xfe00000000000000, 7)
+ CTZ(0x0000000000000040, 6)
+ CTO(0x000000000000003f, 6)
+ CLZ(0x0000000000000020, 58)
+ CLO(0xfc00000000000000, 6)
+ CTZ(0x0000000000000020, 5)
+ CTO(0x000000000000001f, 5)
+ CLZ(0x0000000000000010, 59)
+ CLO(0xf800000000000000, 5)
+ CTZ(0x0000000000000010, 4)
+ CTO(0x000000000000000f, 4)
+ CLZ(0x0000000000000008, 60)
+ CLO(0xf000000000000000, 4)
+ CTZ(0x0000000000000008, 3)
+ CTO(0x0000000000000007, 3)
+ CLZ(0x0000000000000004, 61)
+ CLO(0xe000000000000000, 3)
+ CTZ(0x0000000000000004, 2)
+ CTO(0x0000000000000003, 2)
+ CLZ(0x0000000000000002, 62)
+ CLO(0xc000000000000000, 2)
+ CTZ(0x0000000000000002, 1)
+ CTO(0x0000000000000001, 1)
+ CLZ(0x0000000000000001, 63)
+ CLO(0x8000000000000000, 1)
+ CTZ(0x0000000000000001, 0)
+ CTO(0x0000000000000000, 0)
+ CLZ(0x0000000000000000, 64)
+ CLO(0x0000000000000000, 0)
+ CTZ(0x0000000000000000, 64)
+ CTO(0xffffffffffffffff, 64)
+#endif
+ prepare
+ pushargi ok
+ finishi @printf
+ reti 0
+ epilog
+#endif