comparesf2_test.zig (2885B) - Raw
1 // Ported from: 2 // 3 // https://github.com/llvm/llvm-project/commit/d674d96bc56c0f377879d01c9d8dfdaaa7859cdb/compiler-rt/test/builtins/Unit/comparesf2_test.c 4 5 const std = @import("std"); 6 const builtin = @import("builtin"); 7 8 const __eqsf2 = @import("./cmpsf2.zig").__eqsf2; 9 const __lesf2 = @import("./cmpsf2.zig").__lesf2; 10 const __ltsf2 = @import("./cmpsf2.zig").__ltsf2; 11 const __nesf2 = @import("./cmpsf2.zig").__nesf2; 12 13 const __gesf2 = @import("./gesf2.zig").__gesf2; 14 const __gtsf2 = @import("./gesf2.zig").__gtsf2; 15 16 const __unordsf2 = @import("./unordsf2.zig").__unordsf2; 17 18 const TestVector = struct { 19 a: f32, 20 b: f32, 21 eqReference: c_int, 22 geReference: c_int, 23 gtReference: c_int, 24 leReference: c_int, 25 ltReference: c_int, 26 neReference: c_int, 27 unReference: c_int, 28 }; 29 30 fn test__cmpsf2(vector: TestVector) bool { 31 if (__eqsf2(vector.a, vector.b) != vector.eqReference) { 32 return false; 33 } 34 if (__gesf2(vector.a, vector.b) != vector.geReference) { 35 return false; 36 } 37 if (__gtsf2(vector.a, vector.b) != vector.gtReference) { 38 return false; 39 } 40 if (__lesf2(vector.a, vector.b) != vector.leReference) { 41 return false; 42 } 43 if (__ltsf2(vector.a, vector.b) != vector.ltReference) { 44 return false; 45 } 46 if (__nesf2(vector.a, vector.b) != vector.neReference) { 47 return false; 48 } 49 if (__unordsf2(vector.a, vector.b) != vector.unReference) { 50 return false; 51 } 52 return true; 53 } 54 55 const arguments = [_]f32{ 56 std.math.nan(f32), 57 -std.math.inf(f32), 58 -0x1.fffffep127, 59 -0x1.000002p0 - 0x1.000000p0, 60 -0x1.fffffep-1, 61 -0x1.000000p-126, 62 -0x0.fffffep-126, 63 -0x0.000002p-126, 64 -0.0, 65 0.0, 66 0x0.000002p-126, 67 0x0.fffffep-126, 68 0x1.000000p-126, 69 0x1.fffffep-1, 70 0x1.000000p0, 71 0x1.000002p0, 72 0x1.fffffep127, 73 std.math.inf(f32), 74 }; 75 76 fn generateVector(comptime a: f32, comptime b: f32) TestVector { 77 const leResult = if (a < b) -1 else if (a == b) 0 else 1; 78 const geResult = if (a > b) 1 else if (a == b) 0 else -1; 79 const unResult = if (a != a or b != b) 1 else 0; 80 return TestVector{ 81 .a = a, 82 .b = b, 83 .eqReference = leResult, 84 .geReference = geResult, 85 .gtReference = geResult, 86 .leReference = leResult, 87 .ltReference = leResult, 88 .neReference = leResult, 89 .unReference = unResult, 90 }; 91 } 92 93 const test_vectors = init: { 94 @setEvalBranchQuota(10000); 95 var vectors: [arguments.len * arguments.len]TestVector = undefined; 96 for (arguments[0..], 0..) |arg_i, i| { 97 for (arguments[0..], 0..) |arg_j, j| { 98 vectors[(i * arguments.len) + j] = generateVector(arg_i, arg_j); 99 } 100 } 101 break :init vectors; 102 }; 103 104 test "compare f32" { 105 for (test_vectors) |vector| { 106 try std.testing.expect(test__cmpsf2(vector)); 107 } 108 }