| ... | ... | @@ -132,13 +132,19 @@ test "cmp f16" { |
| 132 | 132 | try comptime testCmp(f16); |
| 133 | 133 | } |
| 134 | 134 | |
| 135 | | test "cmp f32/f64" { |
| 135 | test "cmp f32" { |
| 136 | 136 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 137 | | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; |
| 138 | 137 | if (builtin.cpu.arch.isArm() and builtin.target.abi.float() == .soft) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21234 |
| 139 | 138 | |
| 140 | 139 | try testCmp(f32); |
| 141 | 140 | try comptime testCmp(f32); |
| 141 | } |
| 142 | |
| 143 | test "cmp f64" { |
| 144 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 145 | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; |
| 146 | if (builtin.cpu.arch.isArm() and builtin.target.floatAbi() == .soft) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21234 |
| 147 | |
| 142 | 148 | try testCmp(f64); |
| 143 | 149 | try comptime testCmp(f64); |
| 144 | 150 | } |
| ... | ... | @@ -194,7 +200,7 @@ fn testCmp(comptime T: type) !void { |
| 194 | 200 | try expect(x <= 2.0); |
| 195 | 201 | } |
| 196 | 202 | |
| 197 | | @setEvalBranchQuota(4_000); |
| 203 | @setEvalBranchQuota(2_000); |
| 198 | 204 | var edges = [_]T{ |
| 199 | 205 | -math.inf(T), |
| 200 | 206 | -math.floatMax(T), |
| ... | ... | @@ -210,7 +216,6 @@ fn testCmp(comptime T: type) !void { |
| 210 | 216 | }; |
| 211 | 217 | _ = &edges; |
| 212 | 218 | for (edges, 0..) |rhs, rhs_i| { |
| 213 | | const rhs_v: @Vector(4, T) = @splat(rhs); |
| 214 | 219 | for (edges, 0..) |lhs, lhs_i| { |
| 215 | 220 | const no_nan = lhs_i != 5 and rhs_i != 5; |
| 216 | 221 | const lhs_order = if (lhs_i < 5) lhs_i else lhs_i - 2; |
| ... | ... | @@ -221,8 +226,88 @@ fn testCmp(comptime T: type) !void { |
| 221 | 226 | try expect((lhs > rhs) == (no_nan and lhs_order > rhs_order)); |
| 222 | 227 | try expect((lhs <= rhs) == (no_nan and lhs_order <= rhs_order)); |
| 223 | 228 | try expect((lhs >= rhs) == (no_nan and lhs_order >= rhs_order)); |
| 229 | } |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | test "vector cmp f16" { |
| 234 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 235 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 236 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; |
| 237 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 238 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 239 | if (builtin.cpu.arch.isArm() and builtin.target.floatAbi() == .soft) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21234 |
| 240 | |
| 241 | try testCmpVector(f16); |
| 242 | try comptime testCmpVector(f16); |
| 243 | } |
| 244 | |
| 245 | test "vector cmp f32" { |
| 246 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 247 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 248 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 249 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 250 | if (builtin.cpu.arch.isArm() and builtin.target.floatAbi() == .soft) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21234 |
| 251 | |
| 252 | try testCmpVector(f32); |
| 253 | try comptime testCmpVector(f32); |
| 254 | } |
| 255 | |
| 256 | test "vector cmp f64" { |
| 257 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 258 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 259 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 260 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 261 | if (builtin.cpu.arch.isArm() and builtin.target.floatAbi() == .soft) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21234 |
| 262 | |
| 263 | try testCmpVector(f64); |
| 264 | try comptime testCmpVector(f64); |
| 265 | } |
| 266 | |
| 267 | test "vector cmp f128" { |
| 268 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 269 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 270 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 271 | if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArm()) return error.SkipZigTest; |
| 272 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 273 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 274 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 275 | |
| 276 | try testCmpVector(f128); |
| 277 | try comptime testCmpVector(f128); |
| 278 | } |
| 224 | 279 | |
| 225 | | const lhs_v: @Vector(4, T) = @splat(lhs); |
| 280 | test "vector cmp f80/c_longdouble" { |
| 281 | if (true) return error.SkipZigTest; |
| 282 | |
| 283 | try testCmpVector(f80); |
| 284 | try comptime testCmpVector(f80); |
| 285 | try testCmpVector(c_longdouble); |
| 286 | try comptime testCmpVector(c_longdouble); |
| 287 | } |
| 288 | fn testCmpVector(comptime T: type) !void { |
| 289 | @setEvalBranchQuota(4_000); |
| 290 | var edges = [_]T{ |
| 291 | -math.inf(T), |
| 292 | -math.floatMax(T), |
| 293 | -math.floatMin(T), |
| 294 | -math.floatTrueMin(T), |
| 295 | -0.0, |
| 296 | math.nan(T), |
| 297 | 0.0, |
| 298 | math.floatTrueMin(T), |
| 299 | math.floatMin(T), |
| 300 | math.floatMax(T), |
| 301 | math.inf(T), |
| 302 | }; |
| 303 | _ = &edges; |
| 304 | for (edges, 0..) |rhs, rhs_i| { |
| 305 | const rhs_v: @Vector(4, T) = .{ rhs, rhs, rhs, rhs }; |
| 306 | for (edges, 0..) |lhs, lhs_i| { |
| 307 | const no_nan = lhs_i != 5 and rhs_i != 5; |
| 308 | const lhs_order = if (lhs_i < 5) lhs_i else lhs_i - 2; |
| 309 | const rhs_order = if (rhs_i < 5) rhs_i else rhs_i - 2; |
| 310 | const lhs_v: @Vector(4, T) = .{ lhs, lhs, lhs, lhs }; |
| 226 | 311 | try expect(@reduce(.And, (lhs_v == rhs_v)) == (no_nan and lhs_order == rhs_order)); |
| 227 | 312 | try expect(@reduce(.And, (lhs_v != rhs_v)) == !(no_nan and lhs_order == rhs_order)); |
| 228 | 313 | try expect(@reduce(.And, (lhs_v < rhs_v)) == (no_nan and lhs_order < rhs_order)); |