comparedf2_test.zig (2991B) - Raw
1 // Ported from: 2 // 3 // https://github.com/llvm/llvm-project/commit/d674d96bc56c0f377879d01c9d8dfdaaa7859cdb/compiler-rt/test/builtins/Unit/comparedf2_test.c 4 5 const std = @import("std"); 6 const builtin = @import("builtin"); 7 8 const __eqdf2 = @import("./cmpdf2.zig").__eqdf2; 9 const __ledf2 = @import("./cmpdf2.zig").__ledf2; 10 const __ltdf2 = @import("./cmpdf2.zig").__ltdf2; 11 const __nedf2 = @import("./cmpdf2.zig").__nedf2; 12 13 const __gedf2 = @import("./gedf2.zig").__gedf2; 14 const __gtdf2 = @import("./gedf2.zig").__gtdf2; 15 16 const __unorddf2 = @import("./unorddf2.zig").__unorddf2; 17 18 const TestVector = struct { 19 a: f64, 20 b: f64, 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__cmpdf2(vector: TestVector) bool { 31 if (__eqdf2(vector.a, vector.b) != vector.eqReference) { 32 return false; 33 } 34 if (__gedf2(vector.a, vector.b) != vector.geReference) { 35 return false; 36 } 37 if (__gtdf2(vector.a, vector.b) != vector.gtReference) { 38 return false; 39 } 40 if (__ledf2(vector.a, vector.b) != vector.leReference) { 41 return false; 42 } 43 if (__ltdf2(vector.a, vector.b) != vector.ltReference) { 44 return false; 45 } 46 if (__nedf2(vector.a, vector.b) != vector.neReference) { 47 return false; 48 } 49 if (__unorddf2(vector.a, vector.b) != vector.unReference) { 50 return false; 51 } 52 return true; 53 } 54 55 const arguments = [_]f64{ 56 std.math.nan(f64), 57 -std.math.inf(f64), 58 -0x1.fffffffffffffp1023, 59 -0x1.0000000000001p0 - 0x1.0000000000000p0, 60 -0x1.fffffffffffffp-1, 61 -0x1.0000000000000p-1022, 62 -0x0.fffffffffffffp-1022, 63 -0x0.0000000000001p-1022, 64 -0.0, 65 0.0, 66 0x0.0000000000001p-1022, 67 0x0.fffffffffffffp-1022, 68 0x1.0000000000000p-1022, 69 0x1.fffffffffffffp-1, 70 0x1.0000000000000p0, 71 0x1.0000000000001p0, 72 0x1.fffffffffffffp1023, 73 std.math.inf(f64), 74 }; 75 76 fn generateVector(comptime a: f64, comptime b: f64) 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 f64" { 105 for (test_vectors) |vector| { 106 try std.testing.expect(test__cmpdf2(vector)); 107 } 108 }