| ... | ... | @@ -682,15 +682,15 @@ pub fn rotr(comptime T: type, x: T, r: anytype) T { |
| 682 | 682 | if (@typeInfo(C).Int.signedness == .signed) { |
| 683 | 683 | @compileError("cannot rotate signed integers"); |
| 684 | 684 | } |
| 685 | | const ar = @as(Log2Int(C), @intCast(@mod(r, @typeInfo(C).Int.bits))); |
| 685 | const ar: Log2Int(C) = @intCast(@mod(r, @typeInfo(C).Int.bits)); |
| 686 | 686 | return (x >> @splat(ar)) | (x << @splat(1 + ~ar)); |
| 687 | 687 | } else if (@typeInfo(T).Int.signedness == .signed) { |
| 688 | 688 | @compileError("cannot rotate signed integer"); |
| 689 | 689 | } else { |
| 690 | 690 | if (T == u0) return 0; |
| 691 | 691 | |
| 692 | | if (isPowerOfTwo(@typeInfo(T).Int.bits)) { |
| 693 | | const ar = @as(Log2Int(T), @intCast(@mod(r, @typeInfo(T).Int.bits))); |
| 692 | if (comptime isPowerOfTwo(@typeInfo(T).Int.bits)) { |
| 693 | const ar: Log2Int(T) = @intCast(@mod(r, @typeInfo(T).Int.bits)); |
| 694 | 694 | return x >> ar | x << (1 +% ~ar); |
| 695 | 695 | } else { |
| 696 | 696 | const ar = @mod(r, @typeInfo(T).Int.bits); |
| ... | ... | @@ -713,6 +713,7 @@ test "rotr" { |
| 713 | 713 | try testing.expect(rotr(u8, 0b00000001, @as(usize, 8)) == 0b00000001); |
| 714 | 714 | try testing.expect(rotr(u8, 0b00000001, @as(usize, 4)) == 0b00010000); |
| 715 | 715 | try testing.expect(rotr(u8, 0b00000001, @as(isize, -1)) == 0b00000010); |
| 716 | try testing.expect(rotr(u12, 0o7777, 1) == 0o7777); |
| 716 | 717 | try testing.expect(rotr(@Vector(1, u32), @Vector(1, u32){1}, @as(usize, 1))[0] == @as(u32, 1) << 31); |
| 717 | 718 | try testing.expect(rotr(@Vector(1, u32), @Vector(1, u32){1}, @as(isize, -1))[0] == @as(u32, 1) << 1); |
| 718 | 719 | } |
| ... | ... | @@ -727,15 +728,15 @@ pub fn rotl(comptime T: type, x: T, r: anytype) T { |
| 727 | 728 | if (@typeInfo(C).Int.signedness == .signed) { |
| 728 | 729 | @compileError("cannot rotate signed integers"); |
| 729 | 730 | } |
| 730 | | const ar = @as(Log2Int(C), @intCast(@mod(r, @typeInfo(C).Int.bits))); |
| 731 | const ar: Log2Int(C) = @intCast(@mod(r, @typeInfo(C).Int.bits)); |
| 731 | 732 | return (x << @splat(ar)) | (x >> @splat(1 +% ~ar)); |
| 732 | 733 | } else if (@typeInfo(T).Int.signedness == .signed) { |
| 733 | 734 | @compileError("cannot rotate signed integer"); |
| 734 | 735 | } else { |
| 735 | 736 | if (T == u0) return 0; |
| 736 | 737 | |
| 737 | | if (isPowerOfTwo(@typeInfo(T).Int.bits)) { |
| 738 | | const ar = @as(Log2Int(T), @intCast(@mod(r, @typeInfo(T).Int.bits))); |
| 738 | if (comptime isPowerOfTwo(@typeInfo(T).Int.bits)) { |
| 739 | const ar: Log2Int(T) = @intCast(@mod(r, @typeInfo(T).Int.bits)); |
| 739 | 740 | return x << ar | x >> 1 +% ~ar; |
| 740 | 741 | } else { |
| 741 | 742 | const ar = @mod(r, @typeInfo(T).Int.bits); |
| ... | ... | @@ -758,6 +759,7 @@ test "rotl" { |
| 758 | 759 | try testing.expect(rotl(u8, 0b00000001, @as(usize, 8)) == 0b00000001); |
| 759 | 760 | try testing.expect(rotl(u8, 0b00000001, @as(usize, 4)) == 0b00010000); |
| 760 | 761 | try testing.expect(rotl(u8, 0b00000001, @as(isize, -1)) == 0b10000000); |
| 762 | try testing.expect(rotl(u12, 0o7777, 1) == 0o7777); |
| 761 | 763 | try testing.expect(rotl(@Vector(1, u32), @Vector(1, u32){1 << 31}, @as(usize, 1))[0] == 1); |
| 762 | 764 | try testing.expect(rotl(@Vector(1, u32), @Vector(1, u32){1 << 31}, @as(isize, -1))[0] == @as(u32, 1) << 30); |
| 763 | 765 | } |