authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 18:23:00-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-14 18:23:00-04:00
log84f96779c381dbd885ee321042b8cb8f88e439e3
tree52a1b89acd8385bffd1142cd26fef60b1fecca52
parent3bb4c0c78978a80a3e441552591f0209f032bfc7
parent8643591c9a42d07508c9b5b623d606f27f26af2c
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11143 from jmc-88/cbe

CBE: Implement popCount, byteSwap, bitReverse for ints <= 128 bits

7 files changed, 268 insertions(+), 42 deletions(-)

src/codegen/c.zig+20-27
......@@ -842,7 +842,8 @@ pub const DeclGen = struct {
842842 var index: usize = 0;
843843 var params_written: usize = 0;
844844 while (index < param_len) : (index += 1) {
845 if (dg.decl.ty.fnParamType(index).zigTypeTag() == .Void) continue;
845 const param_type = dg.decl.ty.fnParamType(index);
846 if (!param_type.hasRuntimeBitsIgnoreComptime()) continue;
846847 if (params_written > 0) {
847848 try w.writeAll(", ");
848849 }
......@@ -882,7 +883,7 @@ pub const DeclGen = struct {
882883 var params_written: usize = 0;
883884 var index: usize = 0;
884885 while (index < param_len) : (index += 1) {
885 if (fn_info.param_types[index].zigTypeTag() == .Void) continue;
886 if (!fn_info.param_types[index].hasRuntimeBitsIgnoreComptime()) continue;
886887 if (params_written > 0) {
887888 try bw.writeAll(", ");
888889 }
......@@ -1708,8 +1709,8 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
17081709 .memcpy => try airMemcpy(f, inst),
17091710 .set_union_tag => try airSetUnionTag(f, inst),
17101711 .get_union_tag => try airGetUnionTag(f, inst),
1711 .clz => try airCountZeroes(f, inst, "clz"),
1712 .ctz => try airCountZeroes(f, inst, "ctz"),
1712 .clz => try airBuiltinCall(f, inst, "clz"),
1713 .ctz => try airBuiltinCall(f, inst, "ctz"),
17131714 .popcount => try airBuiltinCall(f, inst, "popcount"),
17141715 .byte_swap => try airBuiltinCall(f, inst, "byte_swap"),
17151716 .bit_reverse => try airBuiltinCall(f, inst, "bit_reverse"),
......@@ -2625,8 +2626,11 @@ fn airCall(
26252626 }
26262627
26272628 try writer.writeAll("(");
2628 for (args) |arg, i| {
2629 if (i != 0) {
2629 var args_written: usize = 0;
2630 for (args) |arg| {
2631 const ty = f.air.typeOf(arg);
2632 if (!ty.hasRuntimeBitsIgnoreComptime()) continue;
2633 if (args_written != 0) {
26302634 try writer.writeAll(", ");
26312635 }
26322636 if (f.air.value(arg)) |val| {
......@@ -2635,6 +2639,7 @@ fn airCall(
26352639 const val = try f.resolveInst(arg);
26362640 try f.writeCValue(writer, val);
26372641 }
2642 args_written += 1;
26382643 }
26392644 try writer.writeAll(");\n");
26402645 return result_local;
......@@ -3349,23 +3354,6 @@ fn airPtrToInt(f: *Function, inst: Air.Inst.Index) !CValue {
33493354fn airBuiltinCall(f: *Function, inst: Air.Inst.Index, fn_name: [*:0]const u8) !CValue {
33503355 if (f.liveness.isUnused(inst)) return CValue.none;
33513356
3352 const inst_ty = f.air.typeOfIndex(inst);
3353 const local = try f.allocLocal(inst_ty, .Const);
3354 const ty_op = f.air.instructions.items(.data)[inst].ty_op;
3355 const writer = f.object.writer();
3356 const operand = try f.resolveInst(ty_op.operand);
3357
3358 // TODO implement the function in zig.h and call it here
3359
3360 try writer.print(" = {s}(", .{fn_name});
3361 try f.writeCValue(writer, operand);
3362 try writer.writeAll(");\n");
3363 return local;
3364}
3365
3366fn airCountZeroes(f: *Function, inst: Air.Inst.Index, fn_name: [*:0]const u8) !CValue {
3367 if (f.liveness.isUnused(inst)) return CValue.none;
3368
33693357 const inst_ty = f.air.typeOfIndex(inst);
33703358 const local = try f.allocLocal(inst_ty, .Const);
33713359 const operand = f.air.instructions.items(.data)[inst].ty_op.operand;
......@@ -3373,13 +3361,18 @@ fn airCountZeroes(f: *Function, inst: Air.Inst.Index, fn_name: [*:0]const u8) !C
33733361 const target = f.object.dg.module.getTarget();
33743362 const writer = f.object.writer();
33753363
3376 const zig_bits = operand_ty.intInfo(target).bits;
3377 _ = toCIntBits(zig_bits) orelse
3364 const int_info = operand_ty.intInfo(target);
3365 const c_bits = toCIntBits(int_info.bits) orelse
33783366 return f.fail("TODO: C backend: implement integer types larger than 128 bits", .{});
33793367
3380 try writer.print(" = zig_{s}(", .{fn_name});
3368 try writer.print(" = zig_{s}_", .{fn_name});
3369 const prefix_byte: u8 = switch (int_info.signedness) {
3370 .signed => 'i',
3371 .unsigned => 'u',
3372 };
3373 try writer.print("{c}{d}(", .{ prefix_byte, c_bits });
33813374 try f.writeCValue(writer, try f.resolveInst(operand));
3382 try writer.print(", {d});\n", .{zig_bits});
3375 try writer.print(", {d});\n", .{int_info.bits});
33833376 return local;
33843377}
33853378
src/link/C/zig.h+240-10
......@@ -502,19 +502,249 @@ zig_shl_sat_s(int, int, ((sizeof(int )) * CHAR_BIT - 1))
502502zig_shl_sat_s(long, long, ((sizeof(long )) * CHAR_BIT - 1))
503503
504504#define zig_bitsizeof(T) (CHAR_BIT * sizeof(T))
505#define zig_bit_mask(T, bit_width) \
506 ((bit_width) == zig_bitsizeof(T) \
507 ? ((T)-1) \
508 : (((T)1 << (T)(bit_width)) - 1))
505509
506static inline int zig_clz(uint64_t value, uint8_t zig_type_bit_width) {
510static inline int zig_clz(unsigned int value, uint8_t zig_type_bit_width) {
507511 if (value == 0) return zig_type_bit_width;
508 if (zig_type_bit_width <= zig_bitsizeof(unsigned int))
509 return (__builtin_clz(value) - zig_bitsizeof(unsigned int) + zig_type_bit_width);
510 if (zig_type_bit_width <= zig_bitsizeof(unsigned long))
511 return (__builtin_clzl(value) - zig_bitsizeof(unsigned long) + zig_type_bit_width);
512 return (__builtin_clzll(value) - zig_bitsizeof(unsigned long long) + zig_type_bit_width);
512 return __builtin_clz(value) - zig_bitsizeof(unsigned int) + zig_type_bit_width;
513513}
514514
515static inline int zig_ctz(uint64_t value, uint8_t zig_type_bit_width) {
515static inline int zig_clzl(unsigned long value, uint8_t zig_type_bit_width) {
516516 if (value == 0) return zig_type_bit_width;
517 if (zig_type_bit_width <= zig_bitsizeof(unsigned int)) return __builtin_ctz(value);
518 if (zig_type_bit_width <= zig_bitsizeof(unsigned long)) return __builtin_ctzl(value);
519 return __builtin_ctzll(value);
517 return __builtin_clzl(value) - zig_bitsizeof(unsigned long) + zig_type_bit_width;
520518}
519
520static inline int zig_clzll(unsigned long long value, uint8_t zig_type_bit_width) {
521 if (value == 0) return zig_type_bit_width;
522 return __builtin_clzll(value) - zig_bitsizeof(unsigned long long) + zig_type_bit_width;
523}
524
525#define zig_clz_u8 zig_clz
526#define zig_clz_i8 zig_clz
527#define zig_clz_u16 zig_clz
528#define zig_clz_i16 zig_clz
529#define zig_clz_u32 zig_clzl
530#define zig_clz_i32 zig_clzl
531#define zig_clz_u64 zig_clzll
532#define zig_clz_i64 zig_clzll
533
534static inline int zig_clz_u128(uint128_t value, uint8_t zig_type_bit_width) {
535 if (value == 0) return zig_type_bit_width;
536 const uint128_t mask = zig_bit_mask(uint128_t, zig_type_bit_width);
537 const uint64_t hi = (value & mask) >> 64;
538 const uint64_t lo = (value & mask);
539 const int leading_zeroes = (
540 hi != 0 ? __builtin_clzll(hi) : 64 + (lo != 0 ? __builtin_clzll(lo) : 64));
541 return leading_zeroes - zig_bitsizeof(uint128_t) + zig_type_bit_width;
542}
543
544#define zig_clz_i128 zig_clz_u128
545
546static inline int zig_ctz(unsigned int value, uint8_t zig_type_bit_width) {
547 if (value == 0) return zig_type_bit_width;
548 return __builtin_ctz(value & zig_bit_mask(unsigned int, zig_type_bit_width));
549}
550
551static inline int zig_ctzl(unsigned long value, uint8_t zig_type_bit_width) {
552 if (value == 0) return zig_type_bit_width;
553 return __builtin_ctzl(value & zig_bit_mask(unsigned long, zig_type_bit_width));
554}
555
556static inline int zig_ctzll(unsigned long value, uint8_t zig_type_bit_width) {
557 if (value == 0) return zig_type_bit_width;
558 return __builtin_ctzll(value & zig_bit_mask(unsigned long, zig_type_bit_width));
559}
560
561#define zig_ctz_u8 zig_ctz
562#define zig_ctz_i8 zig_ctz
563#define zig_ctz_u16 zig_ctz
564#define zig_ctz_i16 zig_ctz
565#define zig_ctz_u32 zig_ctzl
566#define zig_ctz_i32 zig_ctzl
567#define zig_ctz_u64 zig_ctzll
568#define zig_ctz_i64 zig_ctzll
569
570static inline int zig_ctz_u128(uint128_t value, uint8_t zig_type_bit_width) {
571 const uint128_t mask = zig_bit_mask(uint128_t, zig_type_bit_width);
572 const uint64_t hi = (value & mask) >> 64;
573 const uint64_t lo = (value & mask);
574 return (lo != 0 ? __builtin_ctzll(lo) : 64 + (hi != 0 ? __builtin_ctzll(hi) : 64));
575}
576
577#define zig_ctz_i128 zig_ctz_u128
578
579static inline int zig_popcount(unsigned int value, uint8_t zig_type_bit_width) {
580 return __builtin_popcount(value & zig_bit_mask(unsigned int, zig_type_bit_width));
581}
582
583static inline int zig_popcountl(unsigned long value, uint8_t zig_type_bit_width) {
584 return __builtin_popcountl(value & zig_bit_mask(unsigned long, zig_type_bit_width));
585}
586
587static inline int zig_popcountll(unsigned long value, uint8_t zig_type_bit_width) {
588 return __builtin_popcountll(value & zig_bit_mask(unsigned long, zig_type_bit_width));
589}
590
591#define zig_popcount_u8 zig_popcount
592#define zig_popcount_i8 zig_popcount
593#define zig_popcount_u16 zig_popcount
594#define zig_popcount_i16 zig_popcount
595#define zig_popcount_u32 zig_popcountl
596#define zig_popcount_i32 zig_popcountl
597#define zig_popcount_u64 zig_popcountll
598#define zig_popcount_i64 zig_popcountll
599
600static inline int zig_popcount_u128(uint128_t value, uint8_t zig_type_bit_width) {
601 const uint128_t mask = zig_bit_mask(uint128_t, zig_type_bit_width);
602 const uint64_t hi = (value & mask) >> 64;
603 const uint64_t lo = (value & mask);
604 return __builtin_popcountll(hi) + __builtin_popcountll(lo);
605}
606
607#define zig_popcount_i128 zig_popcount_u128
608
609#define zig_sign_extend(T) \
610 static inline T zig_sign_extend_##T(T value, uint8_t zig_type_bit_width) { \
611 const T m = (T)1 << (T)(zig_type_bit_width - 1); \
612 return (value ^ m) - m; \
613 }
614
615zig_sign_extend(uint8_t)
616zig_sign_extend(uint16_t)
617zig_sign_extend(uint32_t)
618zig_sign_extend(uint64_t)
619zig_sign_extend(uint128_t)
620
621#define zig_byte_swap_u(ZigTypeBits, CTypeBits) \
622 static inline uint##CTypeBits##_t zig_byte_swap_u##ZigTypeBits(uint##CTypeBits##_t value, uint8_t zig_type_bit_width) { \
623 return __builtin_bswap##CTypeBits(value) >> (CTypeBits - zig_type_bit_width); \
624 }
625
626#define zig_byte_swap_s(ZigTypeBits, CTypeBits) \
627 static inline int##CTypeBits##_t zig_byte_swap_i##ZigTypeBits(int##CTypeBits##_t value, uint8_t zig_type_bit_width) { \
628 const uint##CTypeBits##_t swapped = zig_byte_swap_u##ZigTypeBits(value, zig_type_bit_width); \
629 return zig_sign_extend_uint##CTypeBits##_t(swapped, zig_type_bit_width); \
630 }
631
632#define zig_byte_swap(ZigTypeBits, CTypeBits) \
633 zig_byte_swap_u(ZigTypeBits, CTypeBits) \
634 zig_byte_swap_s(ZigTypeBits, CTypeBits)
635
636zig_byte_swap( 8, 16)
637zig_byte_swap(16, 16)
638zig_byte_swap(32, 32)
639zig_byte_swap(64, 64)
640
641static inline uint128_t zig_byte_swap_u128(uint128_t value, uint8_t zig_type_bit_width) {
642 const uint128_t mask = zig_bit_mask(uint128_t, zig_type_bit_width);
643 const uint128_t hi = __builtin_bswap64((uint64_t)(value >> 64));
644 const uint128_t lo = __builtin_bswap64((uint64_t)value);
645 return (((lo << 64 | hi) >> (128 - zig_type_bit_width))) & mask;
646}
647
648zig_byte_swap_s(128, 128)
649
650static const uint8_t zig_bit_reverse_lut[256] = {
651 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
652 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
653 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
654 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
655 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
656 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
657 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
658 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
659 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
660 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
661 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
662 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
663 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
664 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
665 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
666 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
667 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
668 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
669 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
670 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
671 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
672 0x3f, 0xbf, 0x7f, 0xff
673};
674
675static inline uint8_t zig_bit_reverse_u8(uint8_t value, uint8_t zig_type_bit_width) {
676 const uint8_t reversed = zig_bit_reverse_lut[value] >> (8 - zig_type_bit_width);
677 return zig_sign_extend_uint8_t(reversed, zig_type_bit_width);
678}
679
680#define zig_bit_reverse_i8 zig_bit_reverse_u8
681
682static inline uint16_t zig_bit_reverse_u16(uint16_t value, uint8_t zig_type_bit_width) {
683 const uint16_t swapped = zig_byte_swap_u16(value, zig_type_bit_width);
684 const uint16_t reversed = (
685 ((uint16_t)zig_bit_reverse_lut[(swapped >> 0x08) & 0xff] << 0x08) |
686 ((uint16_t)zig_bit_reverse_lut[(swapped >> 0x00) & 0xff] << 0x00));
687 return zig_sign_extend_uint16_t(
688 reversed & zig_bit_mask(uint16_t, zig_type_bit_width),
689 zig_type_bit_width);
690}
691
692#define zig_bit_reverse_i16 zig_bit_reverse_u16
693
694static inline uint32_t zig_bit_reverse_u32(uint32_t value, uint8_t zig_type_bit_width) {
695 const uint32_t swapped = zig_byte_swap_u32(value, zig_type_bit_width);
696 const uint32_t reversed = (
697 ((uint32_t)zig_bit_reverse_lut[(swapped >> 0x18) & 0xff] << 0x18) |
698 ((uint32_t)zig_bit_reverse_lut[(swapped >> 0x10) & 0xff] << 0x10) |
699 ((uint32_t)zig_bit_reverse_lut[(swapped >> 0x08) & 0xff] << 0x08) |
700 ((uint32_t)zig_bit_reverse_lut[(swapped >> 0x00) & 0xff] << 0x00));
701 return zig_sign_extend_uint32_t(
702 reversed & zig_bit_mask(uint32_t, zig_type_bit_width),
703 zig_type_bit_width);
704}
705
706#define zig_bit_reverse_i32 zig_bit_reverse_u32
707
708static inline uint64_t zig_bit_reverse_u64(uint64_t value, uint8_t zig_type_bit_width) {
709 const uint64_t swapped = zig_byte_swap_u64(value, zig_type_bit_width);
710 const uint64_t reversed = (
711 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x38) & 0xff] << 0x38) |
712 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x30) & 0xff] << 0x30) |
713 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x28) & 0xff] << 0x28) |
714 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x20) & 0xff] << 0x20) |
715 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x18) & 0xff] << 0x18) |
716 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x10) & 0xff] << 0x10) |
717 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x08) & 0xff] << 0x08) |
718 ((uint64_t)zig_bit_reverse_lut[(swapped >> 0x00) & 0xff] << 0x00));
719 return zig_sign_extend_uint64_t(
720 reversed & zig_bit_mask(uint64_t, zig_type_bit_width),
721 zig_type_bit_width);
722}
723
724#define zig_bit_reverse_i64 zig_bit_reverse_u64
725
726static inline uint128_t zig_bit_reverse_u128(uint128_t value, uint8_t zig_type_bit_width) {
727 const uint128_t swapped = zig_byte_swap_u128(value, zig_type_bit_width);
728 const uint128_t reversed = (
729 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x78) & 0xff] << 0x78) |
730 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x70) & 0xff] << 0x70) |
731 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x68) & 0xff] << 0x68) |
732 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x60) & 0xff] << 0x60) |
733 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x58) & 0xff] << 0x58) |
734 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x50) & 0xff] << 0x50) |
735 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x48) & 0xff] << 0x48) |
736 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x40) & 0xff] << 0x40) |
737 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x38) & 0xff] << 0x38) |
738 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x30) & 0xff] << 0x30) |
739 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x28) & 0xff] << 0x28) |
740 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x20) & 0xff] << 0x20) |
741 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x18) & 0xff] << 0x18) |
742 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x10) & 0xff] << 0x10) |
743 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x08) & 0xff] << 0x08) |
744 ((uint128_t)zig_bit_reverse_lut[(swapped >> 0x00) & 0xff] << 0x00));
745 return zig_sign_extend_uint128_t(
746 reversed & zig_bit_mask(uint128_t, zig_type_bit_width),
747 zig_type_bit_width);
748}
749
750#define zig_bit_reverse_i128 zig_bit_reverse_u128
test/behavior.zig+1-1
......@@ -139,6 +139,7 @@ test {
139139 _ = @import("behavior/eval.zig");
140140 _ = @import("behavior/export_self_referential_type_info.zig");
141141 _ = @import("behavior/int128.zig");
142 _ = @import("behavior/popcount.zig");
142143 _ = @import("behavior/translate_c_macros.zig");
143144 _ = @import("behavior/union_with_members.zig");
144145
......@@ -147,7 +148,6 @@ test {
147148 _ = @import("behavior/atomics.zig");
148149 _ = @import("behavior/export.zig");
149150 _ = @import("behavior/maximum_minimum.zig");
150 _ = @import("behavior/popcount.zig");
151151 _ = @import("behavior/saturating_arithmetic.zig");
152152 _ = @import("behavior/widening.zig");
153153 _ = @import("behavior/bugs/2114.zig");
test/behavior/bitreverse.zig-2
......@@ -5,7 +5,6 @@ const minInt = std.math.minInt;
55
66test "@bitReverse large exotic integer" {
77 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
98 // Currently failing on stage1 for big-endian targets
109 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1110
......@@ -14,7 +13,6 @@ test "@bitReverse large exotic integer" {
1413
1514test "@bitReverse" {
1615 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
1816 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1917 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2018 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
test/behavior/byteswap.zig-1
......@@ -4,7 +4,6 @@ const expect = std.testing.expect;
44
55test "@byteSwap integers" {
66 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
87 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
98 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
109 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
test/behavior/math.zig-1
......@@ -81,7 +81,6 @@ test "@clz big ints" {
8181 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
8282 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
8383 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
84 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
8584
8685 try testClzBigInts();
8786 comptime try testClzBigInts();
test/behavior/popcount.zig+7
......@@ -1,3 +1,4 @@
1const builtin = @import("builtin");
12const std = @import("std");
23const expect = std.testing.expect;
34const expectEqual = std.testing.expectEqual;
......@@ -36,6 +37,10 @@ fn testPopCountIntegers() !void {
3637 var x: i8 = -120;
3738 try expect(@popCount(i8, x) == 2);
3839 }
40 {
41 var x: u128 = 0b11111111000110001100010000100001000011000011100101010001;
42 try expect(@popCount(u128, x) == 24);
43 }
3944 comptime {
4045 try expect(@popCount(u8, @bitCast(u8, @as(i8, -120))) == 2);
4146 }
......@@ -45,6 +50,8 @@ fn testPopCountIntegers() !void {
4550}
4651
4752test "@popCount vectors" {
53 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
54
4855 comptime try testPopCountVectors();
4956 try testPopCountVectors();
5057}