| author | |
| committer | |
| log | 81e2034d4ad935185344030e5ecedbd1388a65e9 |
| tree | 2417cdc654c74985ad8527df5f14fd15777f073e |
| parent | 04b801655cbd9b4f6f00027fc1f638b237890149 |
- structure derived from shift.zig
- rename clzsi2.zig to count0bits.zig
- test cases derived from clzsi2_test.zig
See #12907 files changed, 894 insertions(+), 130 deletions(-)
CMakeLists.txt+1-1| ... | @@ -447,8 +447,8 @@ set(ZIG_STAGE2_SOURCES | ... | @@ -447,8 +447,8 @@ set(ZIG_STAGE2_SOURCES |
| 447 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/addXf3.zig" | 447 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/addXf3.zig" |
| 448 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/atomics.zig" | 448 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/atomics.zig" |
| 449 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/clear_cache.zig" | 449 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/clear_cache.zig" |
| 450 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/clzsi2.zig" | ||
| 451 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/compareXf2.zig" | 450 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/compareXf2.zig" |
| 451 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/count0bits.zig" | ||
| 452 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divdf3.zig" | 452 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divdf3.zig" |
| 453 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divsf3.zig" | 453 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divsf3.zig" |
| 454 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divtf3.zig" | 454 | "${CMAKE_SOURCE_DIR}/lib/std/special/compiler_rt/divtf3.zig" |
lib/std/special/compiler_rt.zig+5-1| ... | @@ -269,8 +269,12 @@ comptime { | ... | @@ -269,8 +269,12 @@ comptime { |
| 269 | const __negdf2 = @import("compiler_rt/negXf2.zig").__negdf2; | 269 | const __negdf2 = @import("compiler_rt/negXf2.zig").__negdf2; |
| 270 | @export(__negdf2, .{ .name = "__negdf2", .linkage = linkage }); | 270 | @export(__negdf2, .{ .name = "__negdf2", .linkage = linkage }); |
| 271 | 271 | ||
| 272 | const __clzsi2 = @import("compiler_rt/clzsi2.zig").__clzsi2; | 272 | const __clzsi2 = @import("compiler_rt/count0bits.zig").__clzsi2; |
| 273 | @export(__clzsi2, .{ .name = "__clzsi2", .linkage = linkage }); | 273 | @export(__clzsi2, .{ .name = "__clzsi2", .linkage = linkage }); |
| 274 | const __clzdi2 = @import("compiler_rt/count0bits.zig").__clzdi2; | ||
| 275 | @export(__clzdi2, .{ .name = "__clzdi2", .linkage = linkage }); | ||
| 276 | const __clzti2 = @import("compiler_rt/count0bits.zig").__clzti2; | ||
| 277 | @export(__clzti2, .{ .name = "__clzti2", .linkage = linkage }); | ||
| 274 | 278 | ||
| 275 | if (builtin.link_libc and os_tag == .openbsd) { | 279 | if (builtin.link_libc and os_tag == .openbsd) { |
| 276 | const __emutls_get_address = @import("compiler_rt/emutls.zig").__emutls_get_address; | 280 | const __emutls_get_address = @import("compiler_rt/emutls.zig").__emutls_get_address; |
lib/std/special/compiler_rt/clzdi2_test.zig created+329| ... | @@ -0,0 +1,329 @@ | ||
| 1 | const clz = @import("count0bits.zig"); | ||
| 2 | const testing = @import("std").testing; | ||
| 3 | |||
| 4 | fn test__clzdi2(a: u64, expected: i64) !void { | ||
| 5 | // XXX At high optimization levels this test may be horribly miscompiled if | ||
| 6 | // one of the naked implementations is selected. | ||
| 7 | var nakedClzdi2 = clz.__clzdi2; | ||
| 8 | var actualClzdi2 = @ptrCast(fn (a: i64) callconv(.C) i32, nakedClzdi2); | ||
| 9 | var x = @bitCast(i64, a); | ||
| 10 | var result = actualClzdi2(x); | ||
| 11 | try testing.expectEqual(expected, result); | ||
| 12 | } | ||
| 13 | |||
| 14 | test "clzdi2" { | ||
| 15 | try test__clzdi2(0x00800000_00000000, 8); | ||
| 16 | try test__clzdi2(0x01000000_00000000, 7); | ||
| 17 | try test__clzdi2(0x02000000_00000000, 6); | ||
| 18 | try test__clzdi2(0x03000000_00000000, 6); | ||
| 19 | try test__clzdi2(0x04000000_00000000, 5); | ||
| 20 | try test__clzdi2(0x05000000_00000000, 5); | ||
| 21 | try test__clzdi2(0x06000000_00000000, 5); | ||
| 22 | try test__clzdi2(0x07000000_00000000, 5); | ||
| 23 | try test__clzdi2(0x08000000_00000000, 4); | ||
| 24 | try test__clzdi2(0x09000000_00000000, 4); | ||
| 25 | try test__clzdi2(0x0A000000_00000000, 4); | ||
| 26 | try test__clzdi2(0x0B000000_00000000, 4); | ||
| 27 | try test__clzdi2(0x0C000000_00000000, 4); | ||
| 28 | try test__clzdi2(0x0D000000_00000000, 4); | ||
| 29 | try test__clzdi2(0x0E000000_00000000, 4); | ||
| 30 | try test__clzdi2(0x0F000000_00000000, 4); | ||
| 31 | try test__clzdi2(0x10000000_00000000, 3); | ||
| 32 | try test__clzdi2(0x11000000_00000000, 3); | ||
| 33 | try test__clzdi2(0x12000000_00000000, 3); | ||
| 34 | try test__clzdi2(0x13000000_00000000, 3); | ||
| 35 | try test__clzdi2(0x14000000_00000000, 3); | ||
| 36 | try test__clzdi2(0x15000000_00000000, 3); | ||
| 37 | try test__clzdi2(0x16000000_00000000, 3); | ||
| 38 | try test__clzdi2(0x17000000_00000000, 3); | ||
| 39 | try test__clzdi2(0x18000000_00000000, 3); | ||
| 40 | try test__clzdi2(0x19000000_00000000, 3); | ||
| 41 | try test__clzdi2(0x1A000000_00000000, 3); | ||
| 42 | try test__clzdi2(0x1B000000_00000000, 3); | ||
| 43 | try test__clzdi2(0x1C000000_00000000, 3); | ||
| 44 | try test__clzdi2(0x1D000000_00000000, 3); | ||
| 45 | try test__clzdi2(0x1E000000_00000000, 3); | ||
| 46 | try test__clzdi2(0x1F000000_00000000, 3); | ||
| 47 | try test__clzdi2(0x20000000_00000000, 2); | ||
| 48 | try test__clzdi2(0x21000000_00000000, 2); | ||
| 49 | try test__clzdi2(0x22000000_00000000, 2); | ||
| 50 | try test__clzdi2(0x23000000_00000000, 2); | ||
| 51 | try test__clzdi2(0x24000000_00000000, 2); | ||
| 52 | try test__clzdi2(0x25000000_00000000, 2); | ||
| 53 | try test__clzdi2(0x26000000_00000000, 2); | ||
| 54 | try test__clzdi2(0x27000000_00000000, 2); | ||
| 55 | try test__clzdi2(0x28000000_00000000, 2); | ||
| 56 | try test__clzdi2(0x29000000_00000000, 2); | ||
| 57 | try test__clzdi2(0x2A000000_00000000, 2); | ||
| 58 | try test__clzdi2(0x2B000000_00000000, 2); | ||
| 59 | try test__clzdi2(0x2C000000_00000000, 2); | ||
| 60 | try test__clzdi2(0x2D000000_00000000, 2); | ||
| 61 | try test__clzdi2(0x2E000000_00000000, 2); | ||
| 62 | try test__clzdi2(0x2F000000_00000000, 2); | ||
| 63 | try test__clzdi2(0x30000000_00000000, 2); | ||
| 64 | try test__clzdi2(0x31000000_00000000, 2); | ||
| 65 | try test__clzdi2(0x32000000_00000000, 2); | ||
| 66 | try test__clzdi2(0x33000000_00000000, 2); | ||
| 67 | try test__clzdi2(0x34000000_00000000, 2); | ||
| 68 | try test__clzdi2(0x35000000_00000000, 2); | ||
| 69 | try test__clzdi2(0x36000000_00000000, 2); | ||
| 70 | try test__clzdi2(0x37000000_00000000, 2); | ||
| 71 | try test__clzdi2(0x38000000_00000000, 2); | ||
| 72 | try test__clzdi2(0x39000000_00000000, 2); | ||
| 73 | try test__clzdi2(0x3A000000_00000000, 2); | ||
| 74 | try test__clzdi2(0x3B000000_00000000, 2); | ||
| 75 | try test__clzdi2(0x3C000000_00000000, 2); | ||
| 76 | try test__clzdi2(0x3D000000_00000000, 2); | ||
| 77 | try test__clzdi2(0x3E000000_00000000, 2); | ||
| 78 | try test__clzdi2(0x3F000000_00000000, 2); | ||
| 79 | try test__clzdi2(0x40000000_00000000, 1); | ||
| 80 | try test__clzdi2(0x41000000_00000000, 1); | ||
| 81 | try test__clzdi2(0x42000000_00000000, 1); | ||
| 82 | try test__clzdi2(0x43000000_00000000, 1); | ||
| 83 | try test__clzdi2(0x44000000_00000000, 1); | ||
| 84 | try test__clzdi2(0x45000000_00000000, 1); | ||
| 85 | try test__clzdi2(0x46000000_00000000, 1); | ||
| 86 | try test__clzdi2(0x47000000_00000000, 1); | ||
| 87 | try test__clzdi2(0x48000000_00000000, 1); | ||
| 88 | try test__clzdi2(0x49000000_00000000, 1); | ||
| 89 | try test__clzdi2(0x4A000000_00000000, 1); | ||
| 90 | try test__clzdi2(0x4B000000_00000000, 1); | ||
| 91 | try test__clzdi2(0x4C000000_00000000, 1); | ||
| 92 | try test__clzdi2(0x4D000000_00000000, 1); | ||
| 93 | try test__clzdi2(0x4E000000_00000000, 1); | ||
| 94 | try test__clzdi2(0x4F000000_00000000, 1); | ||
| 95 | try test__clzdi2(0x50000000_00000000, 1); | ||
| 96 | try test__clzdi2(0x51000000_00000000, 1); | ||
| 97 | try test__clzdi2(0x52000000_00000000, 1); | ||
| 98 | try test__clzdi2(0x53000000_00000000, 1); | ||
| 99 | try test__clzdi2(0x54000000_00000000, 1); | ||
| 100 | try test__clzdi2(0x55000000_00000000, 1); | ||
| 101 | try test__clzdi2(0x56000000_00000000, 1); | ||
| 102 | try test__clzdi2(0x57000000_00000000, 1); | ||
| 103 | try test__clzdi2(0x58000000_00000000, 1); | ||
| 104 | try test__clzdi2(0x59000000_00000000, 1); | ||
| 105 | try test__clzdi2(0x5A000000_00000000, 1); | ||
| 106 | try test__clzdi2(0x5B000000_00000000, 1); | ||
| 107 | try test__clzdi2(0x5C000000_00000000, 1); | ||
| 108 | try test__clzdi2(0x5D000000_00000000, 1); | ||
| 109 | try test__clzdi2(0x5E000000_00000000, 1); | ||
| 110 | try test__clzdi2(0x5F000000_00000000, 1); | ||
| 111 | try test__clzdi2(0x60000000_00000000, 1); | ||
| 112 | try test__clzdi2(0x61000000_00000000, 1); | ||
| 113 | try test__clzdi2(0x62000000_00000000, 1); | ||
| 114 | try test__clzdi2(0x63000000_00000000, 1); | ||
| 115 | try test__clzdi2(0x64000000_00000000, 1); | ||
| 116 | try test__clzdi2(0x65000000_00000000, 1); | ||
| 117 | try test__clzdi2(0x66000000_00000000, 1); | ||
| 118 | try test__clzdi2(0x67000000_00000000, 1); | ||
| 119 | try test__clzdi2(0x68000000_00000000, 1); | ||
| 120 | try test__clzdi2(0x69000000_00000000, 1); | ||
| 121 | try test__clzdi2(0x6A000000_00000000, 1); | ||
| 122 | try test__clzdi2(0x6B000000_00000000, 1); | ||
| 123 | try test__clzdi2(0x6C000000_00000000, 1); | ||
| 124 | try test__clzdi2(0x6D000000_00000000, 1); | ||
| 125 | try test__clzdi2(0x6E000000_00000000, 1); | ||
| 126 | try test__clzdi2(0x6F000000_00000000, 1); | ||
| 127 | try test__clzdi2(0x70000000_00000000, 1); | ||
| 128 | try test__clzdi2(0x71000000_00000000, 1); | ||
| 129 | try test__clzdi2(0x72000000_00000000, 1); | ||
| 130 | try test__clzdi2(0x73000000_00000000, 1); | ||
| 131 | try test__clzdi2(0x74000000_00000000, 1); | ||
| 132 | try test__clzdi2(0x75000000_00000000, 1); | ||
| 133 | try test__clzdi2(0x76000000_00000000, 1); | ||
| 134 | try test__clzdi2(0x77000000_00000000, 1); | ||
| 135 | try test__clzdi2(0x78000000_00000000, 1); | ||
| 136 | try test__clzdi2(0x79000000_00000000, 1); | ||
| 137 | try test__clzdi2(0x7A000000_00000000, 1); | ||
| 138 | try test__clzdi2(0x7B000000_00000000, 1); | ||
| 139 | try test__clzdi2(0x7C000000_00000000, 1); | ||
| 140 | try test__clzdi2(0x7D000000_00000000, 1); | ||
| 141 | try test__clzdi2(0x7E000000_00000000, 1); | ||
| 142 | try test__clzdi2(0x7F000000_00000000, 1); | ||
| 143 | try test__clzdi2(0x80000000_00000000, 0); | ||
| 144 | try test__clzdi2(0x81000000_00000000, 0); | ||
| 145 | try test__clzdi2(0x82000000_00000000, 0); | ||
| 146 | try test__clzdi2(0x83000000_00000000, 0); | ||
| 147 | try test__clzdi2(0x84000000_00000000, 0); | ||
| 148 | try test__clzdi2(0x85000000_00000000, 0); | ||
| 149 | try test__clzdi2(0x86000000_00000000, 0); | ||
| 150 | try test__clzdi2(0x87000000_00000000, 0); | ||
| 151 | try test__clzdi2(0x88000000_00000000, 0); | ||
| 152 | try test__clzdi2(0x89000000_00000000, 0); | ||
| 153 | try test__clzdi2(0x8A000000_00000000, 0); | ||
| 154 | try test__clzdi2(0x8B000000_00000000, 0); | ||
| 155 | try test__clzdi2(0x8C000000_00000000, 0); | ||
| 156 | try test__clzdi2(0x8D000000_00000000, 0); | ||
| 157 | try test__clzdi2(0x8E000000_00000000, 0); | ||
| 158 | try test__clzdi2(0x8F000000_00000000, 0); | ||
| 159 | try test__clzdi2(0x90000000_00000000, 0); | ||
| 160 | try test__clzdi2(0x91000000_00000000, 0); | ||
| 161 | try test__clzdi2(0x92000000_00000000, 0); | ||
| 162 | try test__clzdi2(0x93000000_00000000, 0); | ||
| 163 | try test__clzdi2(0x94000000_00000000, 0); | ||
| 164 | try test__clzdi2(0x95000000_00000000, 0); | ||
| 165 | try test__clzdi2(0x96000000_00000000, 0); | ||
| 166 | try test__clzdi2(0x97000000_00000000, 0); | ||
| 167 | try test__clzdi2(0x98000000_00000000, 0); | ||
| 168 | try test__clzdi2(0x99000000_00000000, 0); | ||
| 169 | try test__clzdi2(0x9A000000_00000000, 0); | ||
| 170 | try test__clzdi2(0x9B000000_00000000, 0); | ||
| 171 | try test__clzdi2(0x9C000000_00000000, 0); | ||
| 172 | try test__clzdi2(0x9D000000_00000000, 0); | ||
| 173 | try test__clzdi2(0x9E000000_00000000, 0); | ||
| 174 | try test__clzdi2(0x9F000000_00000000, 0); | ||
| 175 | try test__clzdi2(0xA0000000_00000000, 0); | ||
| 176 | try test__clzdi2(0xA1000000_00000000, 0); | ||
| 177 | try test__clzdi2(0xA2000000_00000000, 0); | ||
| 178 | try test__clzdi2(0xA3000000_00000000, 0); | ||
| 179 | try test__clzdi2(0xA4000000_00000000, 0); | ||
| 180 | try test__clzdi2(0xA5000000_00000000, 0); | ||
| 181 | try test__clzdi2(0xA6000000_00000000, 0); | ||
| 182 | try test__clzdi2(0xA7000000_00000000, 0); | ||
| 183 | try test__clzdi2(0xA8000000_00000000, 0); | ||
| 184 | try test__clzdi2(0xA9000000_00000000, 0); | ||
| 185 | try test__clzdi2(0xAA000000_00000000, 0); | ||
| 186 | try test__clzdi2(0xAB000000_00000000, 0); | ||
| 187 | try test__clzdi2(0xAC000000_00000000, 0); | ||
| 188 | try test__clzdi2(0xAD000000_00000000, 0); | ||
| 189 | try test__clzdi2(0xAE000000_00000000, 0); | ||
| 190 | try test__clzdi2(0xAF000000_00000000, 0); | ||
| 191 | try test__clzdi2(0xB0000000_00000000, 0); | ||
| 192 | try test__clzdi2(0xB1000000_00000000, 0); | ||
| 193 | try test__clzdi2(0xB2000000_00000000, 0); | ||
| 194 | try test__clzdi2(0xB3000000_00000000, 0); | ||
| 195 | try test__clzdi2(0xB4000000_00000000, 0); | ||
| 196 | try test__clzdi2(0xB5000000_00000000, 0); | ||
| 197 | try test__clzdi2(0xB6000000_00000000, 0); | ||
| 198 | try test__clzdi2(0xB7000000_00000000, 0); | ||
| 199 | try test__clzdi2(0xB8000000_00000000, 0); | ||
| 200 | try test__clzdi2(0xB9000000_00000000, 0); | ||
| 201 | try test__clzdi2(0xBA000000_00000000, 0); | ||
| 202 | try test__clzdi2(0xBB000000_00000000, 0); | ||
| 203 | try test__clzdi2(0xBC000000_00000000, 0); | ||
| 204 | try test__clzdi2(0xBD000000_00000000, 0); | ||
| 205 | try test__clzdi2(0xBE000000_00000000, 0); | ||
| 206 | try test__clzdi2(0xBF000000_00000000, 0); | ||
| 207 | try test__clzdi2(0xC0000000_00000000, 0); | ||
| 208 | try test__clzdi2(0xC1000000_00000000, 0); | ||
| 209 | try test__clzdi2(0xC2000000_00000000, 0); | ||
| 210 | try test__clzdi2(0xC3000000_00000000, 0); | ||
| 211 | try test__clzdi2(0xC4000000_00000000, 0); | ||
| 212 | try test__clzdi2(0xC5000000_00000000, 0); | ||
| 213 | try test__clzdi2(0xC6000000_00000000, 0); | ||
| 214 | try test__clzdi2(0xC7000000_00000000, 0); | ||
| 215 | try test__clzdi2(0xC8000000_00000000, 0); | ||
| 216 | try test__clzdi2(0xC9000000_00000000, 0); | ||
| 217 | try test__clzdi2(0xCA000000_00000000, 0); | ||
| 218 | try test__clzdi2(0xCB000000_00000000, 0); | ||
| 219 | try test__clzdi2(0xCC000000_00000000, 0); | ||
| 220 | try test__clzdi2(0xCD000000_00000000, 0); | ||
| 221 | try test__clzdi2(0xCE000000_00000000, 0); | ||
| 222 | try test__clzdi2(0xCF000000_00000000, 0); | ||
| 223 | try test__clzdi2(0xD0000000_00000000, 0); | ||
| 224 | try test__clzdi2(0xD1000000_00000000, 0); | ||
| 225 | try test__clzdi2(0xD2000000_00000000, 0); | ||
| 226 | try test__clzdi2(0xD3000000_00000000, 0); | ||
| 227 | try test__clzdi2(0xD4000000_00000000, 0); | ||
| 228 | try test__clzdi2(0xD5000000_00000000, 0); | ||
| 229 | try test__clzdi2(0xD6000000_00000000, 0); | ||
| 230 | try test__clzdi2(0xD7000000_00000000, 0); | ||
| 231 | try test__clzdi2(0xD8000000_00000000, 0); | ||
| 232 | try test__clzdi2(0xD9000000_00000000, 0); | ||
| 233 | try test__clzdi2(0xDA000000_00000000, 0); | ||
| 234 | try test__clzdi2(0xDB000000_00000000, 0); | ||
| 235 | try test__clzdi2(0xDC000000_00000000, 0); | ||
| 236 | try test__clzdi2(0xDD000000_00000000, 0); | ||
| 237 | try test__clzdi2(0xDE000000_00000000, 0); | ||
| 238 | try test__clzdi2(0xDF000000_00000000, 0); | ||
| 239 | try test__clzdi2(0xE0000000_00000000, 0); | ||
| 240 | try test__clzdi2(0xE1000000_00000000, 0); | ||
| 241 | try test__clzdi2(0xE2000000_00000000, 0); | ||
| 242 | try test__clzdi2(0xE3000000_00000000, 0); | ||
| 243 | try test__clzdi2(0xE4000000_00000000, 0); | ||
| 244 | try test__clzdi2(0xE5000000_00000000, 0); | ||
| 245 | try test__clzdi2(0xE6000000_00000000, 0); | ||
| 246 | try test__clzdi2(0xE7000000_00000000, 0); | ||
| 247 | try test__clzdi2(0xE8000000_00000000, 0); | ||
| 248 | try test__clzdi2(0xE9000000_00000000, 0); | ||
| 249 | try test__clzdi2(0xEA000000_00000000, 0); | ||
| 250 | try test__clzdi2(0xEB000000_00000000, 0); | ||
| 251 | try test__clzdi2(0xEC000000_00000000, 0); | ||
| 252 | try test__clzdi2(0xED000000_00000000, 0); | ||
| 253 | try test__clzdi2(0xEE000000_00000000, 0); | ||
| 254 | try test__clzdi2(0xEF000000_00000000, 0); | ||
| 255 | try test__clzdi2(0xF0000000_00000000, 0); | ||
| 256 | try test__clzdi2(0xF1000000_00000000, 0); | ||
| 257 | try test__clzdi2(0xF2000000_00000000, 0); | ||
| 258 | try test__clzdi2(0xF3000000_00000000, 0); | ||
| 259 | try test__clzdi2(0xF4000000_00000000, 0); | ||
| 260 | try test__clzdi2(0xF5000000_00000000, 0); | ||
| 261 | try test__clzdi2(0xF6000000_00000000, 0); | ||
| 262 | try test__clzdi2(0xF7000000_00000000, 0); | ||
| 263 | try test__clzdi2(0xF8000000_00000000, 0); | ||
| 264 | try test__clzdi2(0xF9000000_00000000, 0); | ||
| 265 | try test__clzdi2(0xFA000000_00000000, 0); | ||
| 266 | try test__clzdi2(0xFB000000_00000000, 0); | ||
| 267 | try test__clzdi2(0xFC000000_00000000, 0); | ||
| 268 | try test__clzdi2(0xFD000000_00000000, 0); | ||
| 269 | try test__clzdi2(0xFE000000_00000000, 0); | ||
| 270 | try test__clzdi2(0xFF000000_00000000, 0); | ||
| 271 | |||
| 272 | try test__clzdi2(0x00000000_00000000, 64); | ||
| 273 | try test__clzdi2(0x00000000_00000001, 63); | ||
| 274 | try test__clzdi2(0x00000000_00000002, 62); | ||
| 275 | try test__clzdi2(0x00000000_00000004, 61); | ||
| 276 | try test__clzdi2(0x00000000_00000008, 60); | ||
| 277 | try test__clzdi2(0x00000000_00000010, 59); | ||
| 278 | try test__clzdi2(0x00000000_00000020, 58); | ||
| 279 | try test__clzdi2(0x00000000_00000040, 57); | ||
| 280 | try test__clzdi2(0x00000000_00000080, 56); | ||
| 281 | try test__clzdi2(0x00000000_00000100, 55); | ||
| 282 | try test__clzdi2(0x00000000_00000200, 54); | ||
| 283 | try test__clzdi2(0x00000000_00000400, 53); | ||
| 284 | try test__clzdi2(0x00000000_00000800, 52); | ||
| 285 | try test__clzdi2(0x00000000_00001000, 51); | ||
| 286 | try test__clzdi2(0x00000000_00002000, 50); | ||
| 287 | try test__clzdi2(0x00000000_00004000, 49); | ||
| 288 | try test__clzdi2(0x00000000_00008000, 48); | ||
| 289 | try test__clzdi2(0x00000000_00010000, 47); | ||
| 290 | try test__clzdi2(0x00000000_00020000, 46); | ||
| 291 | try test__clzdi2(0x00000000_00040000, 45); | ||
| 292 | try test__clzdi2(0x00000000_00080000, 44); | ||
| 293 | try test__clzdi2(0x00000000_00100000, 43); | ||
| 294 | try test__clzdi2(0x00000000_00200000, 42); | ||
| 295 | try test__clzdi2(0x00000000_00400000, 41); | ||
| 296 | try test__clzdi2(0x00000000_00800000, 40); | ||
| 297 | try test__clzdi2(0x00000000_01000000, 39); | ||
| 298 | try test__clzdi2(0x00000000_02000000, 38); | ||
| 299 | try test__clzdi2(0x00000000_04000000, 37); | ||
| 300 | try test__clzdi2(0x00000000_08000000, 36); | ||
| 301 | try test__clzdi2(0x00000000_10000000, 35); | ||
| 302 | try test__clzdi2(0x00000000_20000000, 34); | ||
| 303 | try test__clzdi2(0x00000000_40000000, 33); | ||
| 304 | try test__clzdi2(0x00000000_80000000, 32); | ||
| 305 | |||
| 306 | try test__clzdi2(0x00000001_00000000, 31); | ||
| 307 | try test__clzdi2(0x00000002_00000000, 30); | ||
| 308 | try test__clzdi2(0x00000004_00000000, 29); | ||
| 309 | try test__clzdi2(0x00000008_00000000, 28); | ||
| 310 | try test__clzdi2(0x00000010_00000000, 27); | ||
| 311 | try test__clzdi2(0x00000020_00000000, 26); | ||
| 312 | try test__clzdi2(0x00000040_00000000, 25); | ||
| 313 | try test__clzdi2(0x00000080_00000000, 24); | ||
| 314 | try test__clzdi2(0x00000100_00000000, 23); | ||
| 315 | try test__clzdi2(0x00000200_00000000, 22); | ||
| 316 | try test__clzdi2(0x00000400_00000000, 21); | ||
| 317 | try test__clzdi2(0x00000800_00000000, 20); | ||
| 318 | try test__clzdi2(0x00001000_00000000, 19); | ||
| 319 | try test__clzdi2(0x00002000_00000000, 18); | ||
| 320 | try test__clzdi2(0x00004000_00000000, 17); | ||
| 321 | try test__clzdi2(0x00008000_00000000, 16); | ||
| 322 | try test__clzdi2(0x00010000_00000000, 15); | ||
| 323 | try test__clzdi2(0x00020000_00000000, 14); | ||
| 324 | try test__clzdi2(0x00040000_00000000, 13); | ||
| 325 | try test__clzdi2(0x00080000_00000000, 12); | ||
| 326 | try test__clzdi2(0x00100000_00000000, 11); | ||
| 327 | try test__clzdi2(0x00200000_00000000, 10); | ||
| 328 | try test__clzdi2(0x00400000_00000000, 9); | ||
| 329 | } | ||
lib/std/special/compiler_rt/clzsi2.zig deleted-126| ... | @@ -1,126 +0,0 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = std.builtin; | ||
| 3 | |||
| 4 | fn __clzsi2_generic(a: i32) callconv(.C) i32 { | ||
| 5 | @setRuntimeSafety(builtin.is_test); | ||
| 6 | |||
| 7 | var x = @bitCast(u32, a); | ||
| 8 | var n: i32 = 32; | ||
| 9 | |||
| 10 | // Count first bit set using binary search, from Hacker's Delight | ||
| 11 | var y: u32 = 0; | ||
| 12 | inline for ([_]i32{ 16, 8, 4, 2, 1 }) |shift| { | ||
| 13 | y = x >> shift; | ||
| 14 | if (y != 0) { | ||
| 15 | n = n - shift; | ||
| 16 | x = y; | ||
| 17 | } | ||
| 18 | } | ||
| 19 | |||
| 20 | return n - @bitCast(i32, x); | ||
| 21 | } | ||
| 22 | |||
| 23 | fn __clzsi2_thumb1() callconv(.Naked) void { | ||
| 24 | @setRuntimeSafety(false); | ||
| 25 | |||
| 26 | // Similar to the generic version with the last two rounds replaced by a LUT | ||
| 27 | asm volatile ( | ||
| 28 | \\ movs r1, #32 | ||
| 29 | \\ lsrs r2, r0, #16 | ||
| 30 | \\ beq 1f | ||
| 31 | \\ subs r1, #16 | ||
| 32 | \\ movs r0, r2 | ||
| 33 | \\ 1: | ||
| 34 | \\ lsrs r2, r0, #8 | ||
| 35 | \\ beq 1f | ||
| 36 | \\ subs r1, #8 | ||
| 37 | \\ movs r0, r2 | ||
| 38 | \\ 1: | ||
| 39 | \\ lsrs r2, r0, #4 | ||
| 40 | \\ beq 1f | ||
| 41 | \\ subs r1, #4 | ||
| 42 | \\ movs r0, r2 | ||
| 43 | \\ 1: | ||
| 44 | \\ ldr r3, =LUT | ||
| 45 | \\ ldrb r0, [r3, r0] | ||
| 46 | \\ subs r0, r1, r0 | ||
| 47 | \\ bx lr | ||
| 48 | \\ .p2align 2 | ||
| 49 | \\ // Number of bits set in the 0-15 range | ||
| 50 | \\ LUT: | ||
| 51 | \\ .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 | ||
| 52 | ); | ||
| 53 | |||
| 54 | unreachable; | ||
| 55 | } | ||
| 56 | |||
| 57 | fn __clzsi2_arm32() callconv(.Naked) void { | ||
| 58 | @setRuntimeSafety(false); | ||
| 59 | |||
| 60 | asm volatile ( | ||
| 61 | \\ // Assumption: n != 0 | ||
| 62 | \\ // r0: n | ||
| 63 | \\ // r1: count of leading zeros in n + 1 | ||
| 64 | \\ // r2: scratch register for shifted r0 | ||
| 65 | \\ mov r1, #1 | ||
| 66 | \\ | ||
| 67 | \\ // Basic block: | ||
| 68 | \\ // if ((r0 >> SHIFT) == 0) | ||
| 69 | \\ // r1 += SHIFT; | ||
| 70 | \\ // else | ||
| 71 | \\ // r0 >>= SHIFT; | ||
| 72 | \\ // for descending powers of two as SHIFT. | ||
| 73 | \\ lsrs r2, r0, #16 | ||
| 74 | \\ movne r0, r2 | ||
| 75 | \\ addeq r1, #16 | ||
| 76 | \\ | ||
| 77 | \\ lsrs r2, r0, #8 | ||
| 78 | \\ movne r0, r2 | ||
| 79 | \\ addeq r1, #8 | ||
| 80 | \\ | ||
| 81 | \\ lsrs r2, r0, #4 | ||
| 82 | \\ movne r0, r2 | ||
| 83 | \\ addeq r1, #4 | ||
| 84 | \\ | ||
| 85 | \\ lsrs r2, r0, #2 | ||
| 86 | \\ movne r0, r2 | ||
| 87 | \\ addeq r1, #2 | ||
| 88 | \\ | ||
| 89 | \\ // The basic block invariants at this point are (r0 >> 2) == 0 and | ||
| 90 | \\ // r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. | ||
| 91 | \\ // | ||
| 92 | \\ // r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1)f | ||
| 93 | \\ // ---+----------------+----------------+------------+-------------- | ||
| 94 | \\ // 1 | 1 | 0 | 0 | 1 | ||
| 95 | \\ // 2 | 0 | 1 | -1 | 0 | ||
| 96 | \\ // 3 | 0 | 1 | -1 | 0 | ||
| 97 | \\ // | ||
| 98 | \\ // The r1's initial value of 1 compensates for the 1 here. | ||
| 99 | \\ sub r0, r1, r0, lsr #1 | ||
| 100 | \\ bx lr | ||
| 101 | ); | ||
| 102 | |||
| 103 | unreachable; | ||
| 104 | } | ||
| 105 | |||
| 106 | pub const __clzsi2 = impl: { | ||
| 107 | switch (std.Target.current.cpu.arch) { | ||
| 108 | .arm, .armeb, .thumb, .thumbeb => { | ||
| 109 | const use_thumb1 = | ||
| 110 | (std.Target.current.cpu.arch.isThumb() or | ||
| 111 | std.Target.arm.featureSetHas(std.Target.current.cpu.features, .noarm)) and | ||
| 112 | !std.Target.arm.featureSetHas(std.Target.current.cpu.features, .thumb2); | ||
| 113 | |||
| 114 | if (use_thumb1) break :impl __clzsi2_thumb1 | ||
| 115 | // From here on we're either targeting Thumb2 or ARM. | ||
| 116 | else if (!std.Target.current.cpu.arch.isThumb()) break :impl __clzsi2_arm32 | ||
| 117 | // Use the generic implementation otherwise. | ||
| 118 | else break :impl __clzsi2_generic; | ||
| 119 | }, | ||
| 120 | else => break :impl __clzsi2_generic, | ||
| 121 | } | ||
| 122 | }; | ||
| 123 | |||
| 124 | test "test clzsi2" { | ||
| 125 | _ = @import("clzsi2_test.zig"); | ||
| 126 | } | ||
lib/std/special/compiler_rt/clzsi2_test.zig+4-2| ... | @@ -1,10 +1,10 @@ | ... | @@ -1,10 +1,10 @@ |
| 1 | const clzsi2 = @import("clzsi2.zig"); | 1 | const clz = @import("count0bits.zig"); |
| 2 | const testing = @import("std").testing; | 2 | const testing = @import("std").testing; |
| 3 | 3 | ||
| 4 | fn test__clzsi2(a: u32, expected: i32) !void { | 4 | fn test__clzsi2(a: u32, expected: i32) !void { |
| 5 | // XXX At high optimization levels this test may be horribly miscompiled if | 5 | // XXX At high optimization levels this test may be horribly miscompiled if |
| 6 | // one of the naked implementations is selected. | 6 | // one of the naked implementations is selected. |
| 7 | var nakedClzsi2 = clzsi2.__clzsi2; | 7 | var nakedClzsi2 = clz.__clzsi2; |
| 8 | var actualClzsi2 = @ptrCast(fn (a: i32) callconv(.C) i32, nakedClzsi2); | 8 | var actualClzsi2 = @ptrCast(fn (a: i32) callconv(.C) i32, nakedClzsi2); |
| 9 | var x = @bitCast(i32, a); | 9 | var x = @bitCast(i32, a); |
| 10 | var result = actualClzsi2(x); | 10 | var result = actualClzsi2(x); |
| ... | @@ -268,6 +268,8 @@ test "clzsi2" { | ... | @@ -268,6 +268,8 @@ test "clzsi2" { |
| 268 | try test__clzsi2(0xFD000000, 0); | 268 | try test__clzsi2(0xFD000000, 0); |
| 269 | try test__clzsi2(0xFE000000, 0); | 269 | try test__clzsi2(0xFE000000, 0); |
| 270 | try test__clzsi2(0xFF000000, 0); | 270 | try test__clzsi2(0xFF000000, 0); |
| 271 | // arm and thumb1 assume input a != 0 | ||
| 272 | //try test__clzsi2(0x00000000, 32); | ||
| 271 | try test__clzsi2(0x00000001, 31); | 273 | try test__clzsi2(0x00000001, 31); |
| 272 | try test__clzsi2(0x00000002, 30); | 274 | try test__clzsi2(0x00000002, 30); |
| 273 | try test__clzsi2(0x00000004, 29); | 275 | try test__clzsi2(0x00000004, 29); |
lib/std/special/compiler_rt/clzti2_test.zig created+395| ... | @@ -0,0 +1,395 @@ | ||
| 1 | const clz = @import("count0bits.zig"); | ||
| 2 | const testing = @import("std").testing; | ||
| 3 | |||
| 4 | fn test__clzti2(a: u128, expected: i64) !void { | ||
| 5 | // XXX At high optimization levels this test may be horribly miscompiled if | ||
| 6 | // one of the naked implementations is selected. | ||
| 7 | var nakedClzti2 = clz.__clzti2; | ||
| 8 | var actualClzti2 = @ptrCast(fn (a: i128) callconv(.C) i32, nakedClzti2); | ||
| 9 | var x = @bitCast(i128, a); | ||
| 10 | var result = actualClzti2(x); | ||
| 11 | try testing.expectEqual(expected, result); | ||
| 12 | } | ||
| 13 | |||
| 14 | test "clzti2" { | ||
| 15 | try test__clzti2(0x00800000_00000000_00000000_00000000, 8); | ||
| 16 | try test__clzti2(0x01000000_00000000_00000000_00000000, 7); | ||
| 17 | try test__clzti2(0x02000000_00000000_00000000_00000000, 6); | ||
| 18 | try test__clzti2(0x03000000_00000000_00000000_00000000, 6); | ||
| 19 | try test__clzti2(0x04000000_00000000_00000000_00000000, 5); | ||
| 20 | try test__clzti2(0x05000000_00000000_00000000_00000000, 5); | ||
| 21 | try test__clzti2(0x06000000_00000000_00000000_00000000, 5); | ||
| 22 | try test__clzti2(0x07000000_00000000_00000000_00000000, 5); | ||
| 23 | try test__clzti2(0x08000000_00000000_00000000_00000000, 4); | ||
| 24 | try test__clzti2(0x09000000_00000000_00000000_00000000, 4); | ||
| 25 | try test__clzti2(0x0A000000_00000000_00000000_00000000, 4); | ||
| 26 | try test__clzti2(0x0B000000_00000000_00000000_00000000, 4); | ||
| 27 | try test__clzti2(0x0C000000_00000000_00000000_00000000, 4); | ||
| 28 | try test__clzti2(0x0D000000_00000000_00000000_00000000, 4); | ||
| 29 | try test__clzti2(0x0E000000_00000000_00000000_00000000, 4); | ||
| 30 | try test__clzti2(0x0F000000_00000000_00000000_00000000, 4); | ||
| 31 | try test__clzti2(0x10000000_00000000_00000000_00000000, 3); | ||
| 32 | try test__clzti2(0x11000000_00000000_00000000_00000000, 3); | ||
| 33 | try test__clzti2(0x12000000_00000000_00000000_00000000, 3); | ||
| 34 | try test__clzti2(0x13000000_00000000_00000000_00000000, 3); | ||
| 35 | try test__clzti2(0x14000000_00000000_00000000_00000000, 3); | ||
| 36 | try test__clzti2(0x15000000_00000000_00000000_00000000, 3); | ||
| 37 | try test__clzti2(0x16000000_00000000_00000000_00000000, 3); | ||
| 38 | try test__clzti2(0x17000000_00000000_00000000_00000000, 3); | ||
| 39 | try test__clzti2(0x18000000_00000000_00000000_00000000, 3); | ||
| 40 | try test__clzti2(0x19000000_00000000_00000000_00000000, 3); | ||
| 41 | try test__clzti2(0x1A000000_00000000_00000000_00000000, 3); | ||
| 42 | try test__clzti2(0x1B000000_00000000_00000000_00000000, 3); | ||
| 43 | try test__clzti2(0x1C000000_00000000_00000000_00000000, 3); | ||
| 44 | try test__clzti2(0x1D000000_00000000_00000000_00000000, 3); | ||
| 45 | try test__clzti2(0x1E000000_00000000_00000000_00000000, 3); | ||
| 46 | try test__clzti2(0x1F000000_00000000_00000000_00000000, 3); | ||
| 47 | try test__clzti2(0x20000000_00000000_00000000_00000000, 2); | ||
| 48 | try test__clzti2(0x21000000_00000000_00000000_00000000, 2); | ||
| 49 | try test__clzti2(0x22000000_00000000_00000000_00000000, 2); | ||
| 50 | try test__clzti2(0x23000000_00000000_00000000_00000000, 2); | ||
| 51 | try test__clzti2(0x24000000_00000000_00000000_00000000, 2); | ||
| 52 | try test__clzti2(0x25000000_00000000_00000000_00000000, 2); | ||
| 53 | try test__clzti2(0x26000000_00000000_00000000_00000000, 2); | ||
| 54 | try test__clzti2(0x27000000_00000000_00000000_00000000, 2); | ||
| 55 | try test__clzti2(0x28000000_00000000_00000000_00000000, 2); | ||
| 56 | try test__clzti2(0x29000000_00000000_00000000_00000000, 2); | ||
| 57 | try test__clzti2(0x2A000000_00000000_00000000_00000000, 2); | ||
| 58 | try test__clzti2(0x2B000000_00000000_00000000_00000000, 2); | ||
| 59 | try test__clzti2(0x2C000000_00000000_00000000_00000000, 2); | ||
| 60 | try test__clzti2(0x2D000000_00000000_00000000_00000000, 2); | ||
| 61 | try test__clzti2(0x2E000000_00000000_00000000_00000000, 2); | ||
| 62 | try test__clzti2(0x2F000000_00000000_00000000_00000000, 2); | ||
| 63 | try test__clzti2(0x30000000_00000000_00000000_00000000, 2); | ||
| 64 | try test__clzti2(0x31000000_00000000_00000000_00000000, 2); | ||
| 65 | try test__clzti2(0x32000000_00000000_00000000_00000000, 2); | ||
| 66 | try test__clzti2(0x33000000_00000000_00000000_00000000, 2); | ||
| 67 | try test__clzti2(0x34000000_00000000_00000000_00000000, 2); | ||
| 68 | try test__clzti2(0x35000000_00000000_00000000_00000000, 2); | ||
| 69 | try test__clzti2(0x36000000_00000000_00000000_00000000, 2); | ||
| 70 | try test__clzti2(0x37000000_00000000_00000000_00000000, 2); | ||
| 71 | try test__clzti2(0x38000000_00000000_00000000_00000000, 2); | ||
| 72 | try test__clzti2(0x39000000_00000000_00000000_00000000, 2); | ||
| 73 | try test__clzti2(0x3A000000_00000000_00000000_00000000, 2); | ||
| 74 | try test__clzti2(0x3B000000_00000000_00000000_00000000, 2); | ||
| 75 | try test__clzti2(0x3C000000_00000000_00000000_00000000, 2); | ||
| 76 | try test__clzti2(0x3D000000_00000000_00000000_00000000, 2); | ||
| 77 | try test__clzti2(0x3E000000_00000000_00000000_00000000, 2); | ||
| 78 | try test__clzti2(0x3F000000_00000000_00000000_00000000, 2); | ||
| 79 | try test__clzti2(0x40000000_00000000_00000000_00000000, 1); | ||
| 80 | try test__clzti2(0x41000000_00000000_00000000_00000000, 1); | ||
| 81 | try test__clzti2(0x42000000_00000000_00000000_00000000, 1); | ||
| 82 | try test__clzti2(0x43000000_00000000_00000000_00000000, 1); | ||
| 83 | try test__clzti2(0x44000000_00000000_00000000_00000000, 1); | ||
| 84 | try test__clzti2(0x45000000_00000000_00000000_00000000, 1); | ||
| 85 | try test__clzti2(0x46000000_00000000_00000000_00000000, 1); | ||
| 86 | try test__clzti2(0x47000000_00000000_00000000_00000000, 1); | ||
| 87 | try test__clzti2(0x48000000_00000000_00000000_00000000, 1); | ||
| 88 | try test__clzti2(0x49000000_00000000_00000000_00000000, 1); | ||
| 89 | try test__clzti2(0x4A000000_00000000_00000000_00000000, 1); | ||
| 90 | try test__clzti2(0x4B000000_00000000_00000000_00000000, 1); | ||
| 91 | try test__clzti2(0x4C000000_00000000_00000000_00000000, 1); | ||
| 92 | try test__clzti2(0x4D000000_00000000_00000000_00000000, 1); | ||
| 93 | try test__clzti2(0x4E000000_00000000_00000000_00000000, 1); | ||
| 94 | try test__clzti2(0x4F000000_00000000_00000000_00000000, 1); | ||
| 95 | try test__clzti2(0x50000000_00000000_00000000_00000000, 1); | ||
| 96 | try test__clzti2(0x51000000_00000000_00000000_00000000, 1); | ||
| 97 | try test__clzti2(0x52000000_00000000_00000000_00000000, 1); | ||
| 98 | try test__clzti2(0x53000000_00000000_00000000_00000000, 1); | ||
| 99 | try test__clzti2(0x54000000_00000000_00000000_00000000, 1); | ||
| 100 | try test__clzti2(0x55000000_00000000_00000000_00000000, 1); | ||
| 101 | try test__clzti2(0x56000000_00000000_00000000_00000000, 1); | ||
| 102 | try test__clzti2(0x57000000_00000000_00000000_00000000, 1); | ||
| 103 | try test__clzti2(0x58000000_00000000_00000000_00000000, 1); | ||
| 104 | try test__clzti2(0x59000000_00000000_00000000_00000000, 1); | ||
| 105 | try test__clzti2(0x5A000000_00000000_00000000_00000000, 1); | ||
| 106 | try test__clzti2(0x5B000000_00000000_00000000_00000000, 1); | ||
| 107 | try test__clzti2(0x5C000000_00000000_00000000_00000000, 1); | ||
| 108 | try test__clzti2(0x5D000000_00000000_00000000_00000000, 1); | ||
| 109 | try test__clzti2(0x5E000000_00000000_00000000_00000000, 1); | ||
| 110 | try test__clzti2(0x5F000000_00000000_00000000_00000000, 1); | ||
| 111 | try test__clzti2(0x60000000_00000000_00000000_00000000, 1); | ||
| 112 | try test__clzti2(0x61000000_00000000_00000000_00000000, 1); | ||
| 113 | try test__clzti2(0x62000000_00000000_00000000_00000000, 1); | ||
| 114 | try test__clzti2(0x63000000_00000000_00000000_00000000, 1); | ||
| 115 | try test__clzti2(0x64000000_00000000_00000000_00000000, 1); | ||
| 116 | try test__clzti2(0x65000000_00000000_00000000_00000000, 1); | ||
| 117 | try test__clzti2(0x66000000_00000000_00000000_00000000, 1); | ||
| 118 | try test__clzti2(0x67000000_00000000_00000000_00000000, 1); | ||
| 119 | try test__clzti2(0x68000000_00000000_00000000_00000000, 1); | ||
| 120 | try test__clzti2(0x69000000_00000000_00000000_00000000, 1); | ||
| 121 | try test__clzti2(0x6A000000_00000000_00000000_00000000, 1); | ||
| 122 | try test__clzti2(0x6B000000_00000000_00000000_00000000, 1); | ||
| 123 | try test__clzti2(0x6C000000_00000000_00000000_00000000, 1); | ||
| 124 | try test__clzti2(0x6D000000_00000000_00000000_00000000, 1); | ||
| 125 | try test__clzti2(0x6E000000_00000000_00000000_00000000, 1); | ||
| 126 | try test__clzti2(0x6F000000_00000000_00000000_00000000, 1); | ||
| 127 | try test__clzti2(0x70000000_00000000_00000000_00000000, 1); | ||
| 128 | try test__clzti2(0x71000000_00000000_00000000_00000000, 1); | ||
| 129 | try test__clzti2(0x72000000_00000000_00000000_00000000, 1); | ||
| 130 | try test__clzti2(0x73000000_00000000_00000000_00000000, 1); | ||
| 131 | try test__clzti2(0x74000000_00000000_00000000_00000000, 1); | ||
| 132 | try test__clzti2(0x75000000_00000000_00000000_00000000, 1); | ||
| 133 | try test__clzti2(0x76000000_00000000_00000000_00000000, 1); | ||
| 134 | try test__clzti2(0x77000000_00000000_00000000_00000000, 1); | ||
| 135 | try test__clzti2(0x78000000_00000000_00000000_00000000, 1); | ||
| 136 | try test__clzti2(0x79000000_00000000_00000000_00000000, 1); | ||
| 137 | try test__clzti2(0x7A000000_00000000_00000000_00000000, 1); | ||
| 138 | try test__clzti2(0x7B000000_00000000_00000000_00000000, 1); | ||
| 139 | try test__clzti2(0x7C000000_00000000_00000000_00000000, 1); | ||
| 140 | try test__clzti2(0x7D000000_00000000_00000000_00000000, 1); | ||
| 141 | try test__clzti2(0x7E000000_00000000_00000000_00000000, 1); | ||
| 142 | try test__clzti2(0x7F000000_00000000_00000000_00000000, 1); | ||
| 143 | try test__clzti2(0x80000000_00000000_00000000_00000000, 0); | ||
| 144 | try test__clzti2(0x81000000_00000000_00000000_00000000, 0); | ||
| 145 | try test__clzti2(0x82000000_00000000_00000000_00000000, 0); | ||
| 146 | try test__clzti2(0x83000000_00000000_00000000_00000000, 0); | ||
| 147 | try test__clzti2(0x84000000_00000000_00000000_00000000, 0); | ||
| 148 | try test__clzti2(0x85000000_00000000_00000000_00000000, 0); | ||
| 149 | try test__clzti2(0x86000000_00000000_00000000_00000000, 0); | ||
| 150 | try test__clzti2(0x87000000_00000000_00000000_00000000, 0); | ||
| 151 | try test__clzti2(0x88000000_00000000_00000000_00000000, 0); | ||
| 152 | try test__clzti2(0x89000000_00000000_00000000_00000000, 0); | ||
| 153 | try test__clzti2(0x8A000000_00000000_00000000_00000000, 0); | ||
| 154 | try test__clzti2(0x8B000000_00000000_00000000_00000000, 0); | ||
| 155 | try test__clzti2(0x8C000000_00000000_00000000_00000000, 0); | ||
| 156 | try test__clzti2(0x8D000000_00000000_00000000_00000000, 0); | ||
| 157 | try test__clzti2(0x8E000000_00000000_00000000_00000000, 0); | ||
| 158 | try test__clzti2(0x8F000000_00000000_00000000_00000000, 0); | ||
| 159 | try test__clzti2(0x90000000_00000000_00000000_00000000, 0); | ||
| 160 | try test__clzti2(0x91000000_00000000_00000000_00000000, 0); | ||
| 161 | try test__clzti2(0x92000000_00000000_00000000_00000000, 0); | ||
| 162 | try test__clzti2(0x93000000_00000000_00000000_00000000, 0); | ||
| 163 | try test__clzti2(0x94000000_00000000_00000000_00000000, 0); | ||
| 164 | try test__clzti2(0x95000000_00000000_00000000_00000000, 0); | ||
| 165 | try test__clzti2(0x96000000_00000000_00000000_00000000, 0); | ||
| 166 | try test__clzti2(0x97000000_00000000_00000000_00000000, 0); | ||
| 167 | try test__clzti2(0x98000000_00000000_00000000_00000000, 0); | ||
| 168 | try test__clzti2(0x99000000_00000000_00000000_00000000, 0); | ||
| 169 | try test__clzti2(0x9A000000_00000000_00000000_00000000, 0); | ||
| 170 | try test__clzti2(0x9B000000_00000000_00000000_00000000, 0); | ||
| 171 | try test__clzti2(0x9C000000_00000000_00000000_00000000, 0); | ||
| 172 | try test__clzti2(0x9D000000_00000000_00000000_00000000, 0); | ||
| 173 | try test__clzti2(0x9E000000_00000000_00000000_00000000, 0); | ||
| 174 | try test__clzti2(0x9F000000_00000000_00000000_00000000, 0); | ||
| 175 | try test__clzti2(0xA0000000_00000000_00000000_00000000, 0); | ||
| 176 | try test__clzti2(0xA1000000_00000000_00000000_00000000, 0); | ||
| 177 | try test__clzti2(0xA2000000_00000000_00000000_00000000, 0); | ||
| 178 | try test__clzti2(0xA3000000_00000000_00000000_00000000, 0); | ||
| 179 | try test__clzti2(0xA4000000_00000000_00000000_00000000, 0); | ||
| 180 | try test__clzti2(0xA5000000_00000000_00000000_00000000, 0); | ||
| 181 | try test__clzti2(0xA6000000_00000000_00000000_00000000, 0); | ||
| 182 | try test__clzti2(0xA7000000_00000000_00000000_00000000, 0); | ||
| 183 | try test__clzti2(0xA8000000_00000000_00000000_00000000, 0); | ||
| 184 | try test__clzti2(0xA9000000_00000000_00000000_00000000, 0); | ||
| 185 | try test__clzti2(0xAA000000_00000000_00000000_00000000, 0); | ||
| 186 | try test__clzti2(0xAB000000_00000000_00000000_00000000, 0); | ||
| 187 | try test__clzti2(0xAC000000_00000000_00000000_00000000, 0); | ||
| 188 | try test__clzti2(0xAD000000_00000000_00000000_00000000, 0); | ||
| 189 | try test__clzti2(0xAE000000_00000000_00000000_00000000, 0); | ||
| 190 | try test__clzti2(0xAF000000_00000000_00000000_00000000, 0); | ||
| 191 | try test__clzti2(0xB0000000_00000000_00000000_00000000, 0); | ||
| 192 | try test__clzti2(0xB1000000_00000000_00000000_00000000, 0); | ||
| 193 | try test__clzti2(0xB2000000_00000000_00000000_00000000, 0); | ||
| 194 | try test__clzti2(0xB3000000_00000000_00000000_00000000, 0); | ||
| 195 | try test__clzti2(0xB4000000_00000000_00000000_00000000, 0); | ||
| 196 | try test__clzti2(0xB5000000_00000000_00000000_00000000, 0); | ||
| 197 | try test__clzti2(0xB6000000_00000000_00000000_00000000, 0); | ||
| 198 | try test__clzti2(0xB7000000_00000000_00000000_00000000, 0); | ||
| 199 | try test__clzti2(0xB8000000_00000000_00000000_00000000, 0); | ||
| 200 | try test__clzti2(0xB9000000_00000000_00000000_00000000, 0); | ||
| 201 | try test__clzti2(0xBA000000_00000000_00000000_00000000, 0); | ||
| 202 | try test__clzti2(0xBB000000_00000000_00000000_00000000, 0); | ||
| 203 | try test__clzti2(0xBC000000_00000000_00000000_00000000, 0); | ||
| 204 | try test__clzti2(0xBD000000_00000000_00000000_00000000, 0); | ||
| 205 | try test__clzti2(0xBE000000_00000000_00000000_00000000, 0); | ||
| 206 | try test__clzti2(0xBF000000_00000000_00000000_00000000, 0); | ||
| 207 | try test__clzti2(0xC0000000_00000000_00000000_00000000, 0); | ||
| 208 | try test__clzti2(0xC1000000_00000000_00000000_00000000, 0); | ||
| 209 | try test__clzti2(0xC2000000_00000000_00000000_00000000, 0); | ||
| 210 | try test__clzti2(0xC3000000_00000000_00000000_00000000, 0); | ||
| 211 | try test__clzti2(0xC4000000_00000000_00000000_00000000, 0); | ||
| 212 | try test__clzti2(0xC5000000_00000000_00000000_00000000, 0); | ||
| 213 | try test__clzti2(0xC6000000_00000000_00000000_00000000, 0); | ||
| 214 | try test__clzti2(0xC7000000_00000000_00000000_00000000, 0); | ||
| 215 | try test__clzti2(0xC8000000_00000000_00000000_00000000, 0); | ||
| 216 | try test__clzti2(0xC9000000_00000000_00000000_00000000, 0); | ||
| 217 | try test__clzti2(0xCA000000_00000000_00000000_00000000, 0); | ||
| 218 | try test__clzti2(0xCB000000_00000000_00000000_00000000, 0); | ||
| 219 | try test__clzti2(0xCC000000_00000000_00000000_00000000, 0); | ||
| 220 | try test__clzti2(0xCD000000_00000000_00000000_00000000, 0); | ||
| 221 | try test__clzti2(0xCE000000_00000000_00000000_00000000, 0); | ||
| 222 | try test__clzti2(0xCF000000_00000000_00000000_00000000, 0); | ||
| 223 | try test__clzti2(0xD0000000_00000000_00000000_00000000, 0); | ||
| 224 | try test__clzti2(0xD1000000_00000000_00000000_00000000, 0); | ||
| 225 | try test__clzti2(0xD2000000_00000000_00000000_00000000, 0); | ||
| 226 | try test__clzti2(0xD3000000_00000000_00000000_00000000, 0); | ||
| 227 | try test__clzti2(0xD4000000_00000000_00000000_00000000, 0); | ||
| 228 | try test__clzti2(0xD5000000_00000000_00000000_00000000, 0); | ||
| 229 | try test__clzti2(0xD6000000_00000000_00000000_00000000, 0); | ||
| 230 | try test__clzti2(0xD7000000_00000000_00000000_00000000, 0); | ||
| 231 | try test__clzti2(0xD8000000_00000000_00000000_00000000, 0); | ||
| 232 | try test__clzti2(0xD9000000_00000000_00000000_00000000, 0); | ||
| 233 | try test__clzti2(0xDA000000_00000000_00000000_00000000, 0); | ||
| 234 | try test__clzti2(0xDB000000_00000000_00000000_00000000, 0); | ||
| 235 | try test__clzti2(0xDC000000_00000000_00000000_00000000, 0); | ||
| 236 | try test__clzti2(0xDD000000_00000000_00000000_00000000, 0); | ||
| 237 | try test__clzti2(0xDE000000_00000000_00000000_00000000, 0); | ||
| 238 | try test__clzti2(0xDF000000_00000000_00000000_00000000, 0); | ||
| 239 | try test__clzti2(0xE0000000_00000000_00000000_00000000, 0); | ||
| 240 | try test__clzti2(0xE1000000_00000000_00000000_00000000, 0); | ||
| 241 | try test__clzti2(0xE2000000_00000000_00000000_00000000, 0); | ||
| 242 | try test__clzti2(0xE3000000_00000000_00000000_00000000, 0); | ||
| 243 | try test__clzti2(0xE4000000_00000000_00000000_00000000, 0); | ||
| 244 | try test__clzti2(0xE5000000_00000000_00000000_00000000, 0); | ||
| 245 | try test__clzti2(0xE6000000_00000000_00000000_00000000, 0); | ||
| 246 | try test__clzti2(0xE7000000_00000000_00000000_00000000, 0); | ||
| 247 | try test__clzti2(0xE8000000_00000000_00000000_00000000, 0); | ||
| 248 | try test__clzti2(0xE9000000_00000000_00000000_00000000, 0); | ||
| 249 | try test__clzti2(0xEA000000_00000000_00000000_00000000, 0); | ||
| 250 | try test__clzti2(0xEB000000_00000000_00000000_00000000, 0); | ||
| 251 | try test__clzti2(0xEC000000_00000000_00000000_00000000, 0); | ||
| 252 | try test__clzti2(0xED000000_00000000_00000000_00000000, 0); | ||
| 253 | try test__clzti2(0xEE000000_00000000_00000000_00000000, 0); | ||
| 254 | try test__clzti2(0xEF000000_00000000_00000000_00000000, 0); | ||
| 255 | try test__clzti2(0xF0000000_00000000_00000000_00000000, 0); | ||
| 256 | try test__clzti2(0xF1000000_00000000_00000000_00000000, 0); | ||
| 257 | try test__clzti2(0xF2000000_00000000_00000000_00000000, 0); | ||
| 258 | try test__clzti2(0xF3000000_00000000_00000000_00000000, 0); | ||
| 259 | try test__clzti2(0xF4000000_00000000_00000000_00000000, 0); | ||
| 260 | try test__clzti2(0xF5000000_00000000_00000000_00000000, 0); | ||
| 261 | try test__clzti2(0xF6000000_00000000_00000000_00000000, 0); | ||
| 262 | try test__clzti2(0xF7000000_00000000_00000000_00000000, 0); | ||
| 263 | try test__clzti2(0xF8000000_00000000_00000000_00000000, 0); | ||
| 264 | try test__clzti2(0xF9000000_00000000_00000000_00000000, 0); | ||
| 265 | try test__clzti2(0xFA000000_00000000_00000000_00000000, 0); | ||
| 266 | try test__clzti2(0xFB000000_00000000_00000000_00000000, 0); | ||
| 267 | try test__clzti2(0xFC000000_00000000_00000000_00000000, 0); | ||
| 268 | try test__clzti2(0xFD000000_00000000_00000000_00000000, 0); | ||
| 269 | try test__clzti2(0xFE000000_00000000_00000000_00000000, 0); | ||
| 270 | try test__clzti2(0xFF000000_00000000_00000000_00000000, 0); | ||
| 271 | |||
| 272 | try test__clzti2(0x00000000_00000000_00000000_00000000, 128); | ||
| 273 | try test__clzti2(0x00000000_00000000_00000000_00000001, 127); | ||
| 274 | try test__clzti2(0x00000000_00000000_00000000_00000002, 126); | ||
| 275 | try test__clzti2(0x00000000_00000000_00000000_00000004, 125); | ||
| 276 | try test__clzti2(0x00000000_00000000_00000000_00000008, 124); | ||
| 277 | try test__clzti2(0x00000000_00000000_00000000_00000010, 123); | ||
| 278 | try test__clzti2(0x00000000_00000000_00000000_00000020, 122); | ||
| 279 | try test__clzti2(0x00000000_00000000_00000000_00000040, 121); | ||
| 280 | try test__clzti2(0x00000000_00000000_00000000_00000080, 120); | ||
| 281 | try test__clzti2(0x00000000_00000000_00000000_00000100, 119); | ||
| 282 | try test__clzti2(0x00000000_00000000_00000000_00000200, 118); | ||
| 283 | try test__clzti2(0x00000000_00000000_00000000_00000400, 117); | ||
| 284 | try test__clzti2(0x00000000_00000000_00000000_00000800, 116); | ||
| 285 | try test__clzti2(0x00000000_00000000_00000000_00001000, 115); | ||
| 286 | try test__clzti2(0x00000000_00000000_00000000_00002000, 114); | ||
| 287 | try test__clzti2(0x00000000_00000000_00000000_00004000, 113); | ||
| 288 | try test__clzti2(0x00000000_00000000_00000000_00008000, 112); | ||
| 289 | try test__clzti2(0x00000000_00000000_00000000_00010000, 111); | ||
| 290 | try test__clzti2(0x00000000_00000000_00000000_00020000, 110); | ||
| 291 | try test__clzti2(0x00000000_00000000_00000000_00040000, 109); | ||
| 292 | try test__clzti2(0x00000000_00000000_00000000_00080000, 108); | ||
| 293 | try test__clzti2(0x00000000_00000000_00000000_00100000, 107); | ||
| 294 | try test__clzti2(0x00000000_00000000_00000000_00200000, 106); | ||
| 295 | try test__clzti2(0x00000000_00000000_00000000_00400000, 105); | ||
| 296 | try test__clzti2(0x00000000_00000000_00000000_00800000, 104); | ||
| 297 | try test__clzti2(0x00000000_00000000_00000000_01000000, 103); | ||
| 298 | try test__clzti2(0x00000000_00000000_00000000_02000000, 102); | ||
| 299 | try test__clzti2(0x00000000_00000000_00000000_04000000, 101); | ||
| 300 | try test__clzti2(0x00000000_00000000_00000000_08000000, 100); | ||
| 301 | try test__clzti2(0x00000000_00000000_00000000_10000000, 99); | ||
| 302 | try test__clzti2(0x00000000_00000000_00000000_20000000, 98); | ||
| 303 | try test__clzti2(0x00000000_00000000_00000000_40000000, 97); | ||
| 304 | try test__clzti2(0x00000000_00000000_00000000_80000000, 96); | ||
| 305 | |||
| 306 | try test__clzti2(0x00000000_00000000_00000001_00000000, 95); | ||
| 307 | try test__clzti2(0x00000000_00000000_00000002_00000000, 94); | ||
| 308 | try test__clzti2(0x00000000_00000000_00000004_00000000, 93); | ||
| 309 | try test__clzti2(0x00000000_00000000_00000008_00000000, 92); | ||
| 310 | try test__clzti2(0x00000000_00000000_00000010_00000000, 91); | ||
| 311 | try test__clzti2(0x00000000_00000000_00000020_00000000, 90); | ||
| 312 | try test__clzti2(0x00000000_00000000_00000040_00000000, 89); | ||
| 313 | try test__clzti2(0x00000000_00000000_00000080_00000000, 88); | ||
| 314 | try test__clzti2(0x00000000_00000000_00000100_00000000, 87); | ||
| 315 | try test__clzti2(0x00000000_00000000_00000200_00000000, 86); | ||
| 316 | try test__clzti2(0x00000000_00000000_00000400_00000000, 85); | ||
| 317 | try test__clzti2(0x00000000_00000000_00000800_00000000, 84); | ||
| 318 | try test__clzti2(0x00000000_00000000_00001000_00000000, 83); | ||
| 319 | try test__clzti2(0x00000000_00000000_00002000_00000000, 82); | ||
| 320 | try test__clzti2(0x00000000_00000000_00004000_00000000, 81); | ||
| 321 | try test__clzti2(0x00000000_00000000_00008000_00000000, 80); | ||
| 322 | try test__clzti2(0x00000000_00000000_00010000_00000000, 79); | ||
| 323 | try test__clzti2(0x00000000_00000000_00020000_00000000, 78); | ||
| 324 | try test__clzti2(0x00000000_00000000_00040000_00000000, 77); | ||
| 325 | try test__clzti2(0x00000000_00000000_00080000_00000000, 76); | ||
| 326 | try test__clzti2(0x00000000_00000000_00100000_00000000, 75); | ||
| 327 | try test__clzti2(0x00000000_00000000_00200000_00000000, 74); | ||
| 328 | try test__clzti2(0x00000000_00000000_00400000_00000000, 73); | ||
| 329 | try test__clzti2(0x00000000_00000000_00800000_00000000, 72); | ||
| 330 | try test__clzti2(0x00000000_00000000_01000000_00000000, 71); | ||
| 331 | try test__clzti2(0x00000000_00000000_02000000_00000000, 70); | ||
| 332 | try test__clzti2(0x00000000_00000000_04000000_00000000, 69); | ||
| 333 | try test__clzti2(0x00000000_00000000_08000000_00000000, 68); | ||
| 334 | try test__clzti2(0x00000000_00000000_10000000_00000000, 67); | ||
| 335 | try test__clzti2(0x00000000_00000000_20000000_00000000, 66); | ||
| 336 | try test__clzti2(0x00000000_00000000_40000000_00000000, 65); | ||
| 337 | try test__clzti2(0x00000000_00000000_80000000_00000000, 64); | ||
| 338 | |||
| 339 | try test__clzti2(0x00000000_00000001_00000000_00000000, 63); | ||
| 340 | try test__clzti2(0x00000000_00000002_00000000_00000000, 62); | ||
| 341 | try test__clzti2(0x00000000_00000004_00000000_00000000, 61); | ||
| 342 | try test__clzti2(0x00000000_00000008_00000000_00000000, 60); | ||
| 343 | try test__clzti2(0x00000000_00000010_00000000_00000000, 59); | ||
| 344 | try test__clzti2(0x00000000_00000020_00000000_00000000, 58); | ||
| 345 | try test__clzti2(0x00000000_00000040_00000000_00000000, 57); | ||
| 346 | try test__clzti2(0x00000000_00000080_00000000_00000000, 56); | ||
| 347 | try test__clzti2(0x00000000_00000100_00000000_00000000, 55); | ||
| 348 | try test__clzti2(0x00000000_00000200_00000000_00000000, 54); | ||
| 349 | try test__clzti2(0x00000000_00000400_00000000_00000000, 53); | ||
| 350 | try test__clzti2(0x00000000_00000800_00000000_00000000, 52); | ||
| 351 | try test__clzti2(0x00000000_00001000_00000000_00000000, 51); | ||
| 352 | try test__clzti2(0x00000000_00002000_00000000_00000000, 50); | ||
| 353 | try test__clzti2(0x00000000_00004000_00000000_00000000, 49); | ||
| 354 | try test__clzti2(0x00000000_00008000_00000000_00000000, 48); | ||
| 355 | try test__clzti2(0x00000000_00010000_00000000_00000000, 47); | ||
| 356 | try test__clzti2(0x00000000_00020000_00000000_00000000, 46); | ||
| 357 | try test__clzti2(0x00000000_00040000_00000000_00000000, 45); | ||
| 358 | try test__clzti2(0x00000000_00080000_00000000_00000000, 44); | ||
| 359 | try test__clzti2(0x00000000_00100000_00000000_00000000, 43); | ||
| 360 | try test__clzti2(0x00000000_00200000_00000000_00000000, 42); | ||
| 361 | try test__clzti2(0x00000000_00400000_00000000_00000000, 41); | ||
| 362 | try test__clzti2(0x00000000_00800000_00000000_00000000, 40); | ||
| 363 | try test__clzti2(0x00000000_01000000_00000000_00000000, 39); | ||
| 364 | try test__clzti2(0x00000000_02000000_00000000_00000000, 38); | ||
| 365 | try test__clzti2(0x00000000_04000000_00000000_00000000, 37); | ||
| 366 | try test__clzti2(0x00000000_08000000_00000000_00000000, 36); | ||
| 367 | try test__clzti2(0x00000000_10000000_00000000_00000000, 35); | ||
| 368 | try test__clzti2(0x00000000_20000000_00000000_00000000, 34); | ||
| 369 | try test__clzti2(0x00000000_40000000_00000000_00000000, 33); | ||
| 370 | try test__clzti2(0x00000000_80000000_00000000_00000000, 32); | ||
| 371 | |||
| 372 | try test__clzti2(0x00000001_00000000_00000000_00000000, 31); | ||
| 373 | try test__clzti2(0x00000002_00000000_00000000_00000000, 30); | ||
| 374 | try test__clzti2(0x00000004_00000000_00000000_00000000, 29); | ||
| 375 | try test__clzti2(0x00000008_00000000_00000000_00000000, 28); | ||
| 376 | try test__clzti2(0x00000010_00000000_00000000_00000000, 27); | ||
| 377 | try test__clzti2(0x00000020_00000000_00000000_00000000, 26); | ||
| 378 | try test__clzti2(0x00000040_00000000_00000000_00000000, 25); | ||
| 379 | try test__clzti2(0x00000080_00000000_00000000_00000000, 24); | ||
| 380 | try test__clzti2(0x00000100_00000000_00000000_00000000, 23); | ||
| 381 | try test__clzti2(0x00000200_00000000_00000000_00000000, 22); | ||
| 382 | try test__clzti2(0x00000400_00000000_00000000_00000000, 21); | ||
| 383 | try test__clzti2(0x00000800_00000000_00000000_00000000, 20); | ||
| 384 | try test__clzti2(0x00001000_00000000_00000000_00000000, 19); | ||
| 385 | try test__clzti2(0x00002000_00000000_00000000_00000000, 18); | ||
| 386 | try test__clzti2(0x00004000_00000000_00000000_00000000, 17); | ||
| 387 | try test__clzti2(0x00008000_00000000_00000000_00000000, 16); | ||
| 388 | try test__clzti2(0x00010000_00000000_00000000_00000000, 15); | ||
| 389 | try test__clzti2(0x00020000_00000000_00000000_00000000, 14); | ||
| 390 | try test__clzti2(0x00040000_00000000_00000000_00000000, 13); | ||
| 391 | try test__clzti2(0x00080000_00000000_00000000_00000000, 12); | ||
| 392 | try test__clzti2(0x00100000_00000000_00000000_00000000, 11); | ||
| 393 | try test__clzti2(0x00200000_00000000_00000000_00000000, 10); | ||
| 394 | try test__clzti2(0x00400000_00000000_00000000_00000000, 9); | ||
| 395 | } | ||
lib/std/special/compiler_rt/count0bits.zig created+160| ... | @@ -0,0 +1,160 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = std.builtin; | ||
| 3 | |||
| 4 | // clz - count leading zeroes | ||
| 5 | // - clzXi2_generic for little endian | ||
| 6 | // - __clzsi2_thumb1: assume a != 0 | ||
| 7 | // - __clzsi2_arm32: assume a != 0 | ||
| 8 | |||
| 9 | fn clzXi2_generic(comptime T: type) fn (a: T) callconv(.C) i32 { | ||
| 10 | return struct { | ||
| 11 | fn f(a: T) callconv(.C) i32 { | ||
| 12 | @setRuntimeSafety(builtin.is_test); | ||
| 13 | |||
| 14 | var x = switch (@bitSizeOf(T)) { | ||
| 15 | 32 => @bitCast(u32, a), | ||
| 16 | 64 => @bitCast(u64, a), | ||
| 17 | 128 => @bitCast(u128, a), | ||
| 18 | else => unreachable, | ||
| 19 | }; | ||
| 20 | var n: T = @bitSizeOf(T); | ||
| 21 | // Count first bit set using binary search, from Hacker's Delight | ||
| 22 | var y: @TypeOf(x) = 0; | ||
| 23 | comptime var shift: u8 = @bitSizeOf(T); | ||
| 24 | inline while (shift > 0) { | ||
| 25 | shift = shift >> 1; | ||
| 26 | y = x >> shift; | ||
| 27 | if (y != 0) { | ||
| 28 | n = n - shift; | ||
| 29 | x = y; | ||
| 30 | } | ||
| 31 | } | ||
| 32 | return @intCast(i32, n - @bitCast(T, x)); | ||
| 33 | } | ||
| 34 | }.f; | ||
| 35 | } | ||
| 36 | |||
| 37 | fn __clzsi2_thumb1() callconv(.Naked) void { | ||
| 38 | @setRuntimeSafety(false); | ||
| 39 | |||
| 40 | // Similar to the generic version with the last two rounds replaced by a LUT | ||
| 41 | asm volatile ( | ||
| 42 | \\ movs r1, #32 | ||
| 43 | \\ lsrs r2, r0, #16 | ||
| 44 | \\ beq 1f | ||
| 45 | \\ subs r1, #16 | ||
| 46 | \\ movs r0, r2 | ||
| 47 | \\ 1: | ||
| 48 | \\ lsrs r2, r0, #8 | ||
| 49 | \\ beq 1f | ||
| 50 | \\ subs r1, #8 | ||
| 51 | \\ movs r0, r2 | ||
| 52 | \\ 1: | ||
| 53 | \\ lsrs r2, r0, #4 | ||
| 54 | \\ beq 1f | ||
| 55 | \\ subs r1, #4 | ||
| 56 | \\ movs r0, r2 | ||
| 57 | \\ 1: | ||
| 58 | \\ ldr r3, =LUT | ||
| 59 | \\ ldrb r0, [r3, r0] | ||
| 60 | \\ subs r0, r1, r0 | ||
| 61 | \\ bx lr | ||
| 62 | \\ .p2align 2 | ||
| 63 | \\ // Number of bits set in the 0-15 range | ||
| 64 | \\ LUT: | ||
| 65 | \\ .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 | ||
| 66 | ); | ||
| 67 | |||
| 68 | unreachable; | ||
| 69 | } | ||
| 70 | |||
| 71 | fn __clzsi2_arm32() callconv(.Naked) void { | ||
| 72 | @setRuntimeSafety(false); | ||
| 73 | |||
| 74 | asm volatile ( | ||
| 75 | \\ // Assumption: n != 0 | ||
| 76 | \\ // r0: n | ||
| 77 | \\ // r1: count of leading zeros in n + 1 | ||
| 78 | \\ // r2: scratch register for shifted r0 | ||
| 79 | \\ mov r1, #1 | ||
| 80 | \\ | ||
| 81 | \\ // Basic block: | ||
| 82 | \\ // if ((r0 >> SHIFT) == 0) | ||
| 83 | \\ // r1 += SHIFT; | ||
| 84 | \\ // else | ||
| 85 | \\ // r0 >>= SHIFT; | ||
| 86 | \\ // for descending powers of two as SHIFT. | ||
| 87 | \\ lsrs r2, r0, #16 | ||
| 88 | \\ movne r0, r2 | ||
| 89 | \\ addeq r1, #16 | ||
| 90 | \\ | ||
| 91 | \\ lsrs r2, r0, #8 | ||
| 92 | \\ movne r0, r2 | ||
| 93 | \\ addeq r1, #8 | ||
| 94 | \\ | ||
| 95 | \\ lsrs r2, r0, #4 | ||
| 96 | \\ movne r0, r2 | ||
| 97 | \\ addeq r1, #4 | ||
| 98 | \\ | ||
| 99 | \\ lsrs r2, r0, #2 | ||
| 100 | \\ movne r0, r2 | ||
| 101 | \\ addeq r1, #2 | ||
| 102 | \\ | ||
| 103 | \\ // The basic block invariants at this point are (r0 >> 2) == 0 and | ||
| 104 | \\ // r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. | ||
| 105 | \\ // | ||
| 106 | \\ // r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1)f | ||
| 107 | \\ // ---+----------------+----------------+------------+-------------- | ||
| 108 | \\ // 1 | 1 | 0 | 0 | 1 | ||
| 109 | \\ // 2 | 0 | 1 | -1 | 0 | ||
| 110 | \\ // 3 | 0 | 1 | -1 | 0 | ||
| 111 | \\ // | ||
| 112 | \\ // The r1's initial value of 1 compensates for the 1 here. | ||
| 113 | \\ sub r0, r1, r0, lsr #1 | ||
| 114 | \\ bx lr | ||
| 115 | ); | ||
| 116 | |||
| 117 | unreachable; | ||
| 118 | } | ||
| 119 | |||
| 120 | pub const __clzsi2 = impl: { | ||
| 121 | switch (std.Target.current.cpu.arch) { | ||
| 122 | .arm, .armeb, .thumb, .thumbeb => { | ||
| 123 | const use_thumb1 = | ||
| 124 | (std.Target.current.cpu.arch.isThumb() or | ||
| 125 | std.Target.arm.featureSetHas(std.Target.current.cpu.features, .noarm)) and | ||
| 126 | !std.Target.arm.featureSetHas(std.Target.current.cpu.features, .thumb2); | ||
| 127 | |||
| 128 | if (use_thumb1) { | ||
| 129 | break :impl __clzsi2_thumb1; | ||
| 130 | } | ||
| 131 | // From here on we're either targeting Thumb2 or ARM. | ||
| 132 | else if (!std.Target.current.cpu.arch.isThumb()) { | ||
| 133 | break :impl __clzsi2_arm32; | ||
| 134 | } | ||
| 135 | // Use the generic implementation otherwise. | ||
| 136 | else break :impl clzXi2_generic(i32); | ||
| 137 | }, | ||
| 138 | else => break :impl clzXi2_generic(i32), | ||
| 139 | } | ||
| 140 | }; | ||
| 141 | |||
| 142 | pub const __clzdi2 = impl: { | ||
| 143 | switch (std.Target.current.cpu.arch) { | ||
| 144 | // TODO architecture optimised versions | ||
| 145 | else => break :impl clzXi2_generic(i64), | ||
| 146 | } | ||
| 147 | }; | ||
| 148 | |||
| 149 | pub const __clzti2 = impl: { | ||
| 150 | switch (std.Target.current.cpu.arch) { | ||
| 151 | // TODO architecture optimised versions | ||
| 152 | else => break :impl clzXi2_generic(i128), | ||
| 153 | } | ||
| 154 | }; | ||
| 155 | |||
| 156 | test { | ||
| 157 | _ = @import("clzsi2_test.zig"); | ||
| 158 | _ = @import("clzdi2_test.zig"); | ||
| 159 | _ = @import("clzti2_test.zig"); | ||
| 160 | } | ||