master
1// Ported from:
2//
3// https://github.com/llvm/llvm-project/commit/d674d96bc56c0f377879d01c9d8dfdaaa7859cdb/compiler-rt/test/builtins/Unit/comparedf2_test.c
4
5const std = @import("std");
6const builtin = @import("builtin");
7
8const __eqdf2 = @import("./cmpdf2.zig").__eqdf2;
9const __ledf2 = @import("./cmpdf2.zig").__ledf2;
10const __ltdf2 = @import("./cmpdf2.zig").__ltdf2;
11const __nedf2 = @import("./cmpdf2.zig").__nedf2;
12
13const __gedf2 = @import("./gedf2.zig").__gedf2;
14const __gtdf2 = @import("./gedf2.zig").__gtdf2;
15
16const __unorddf2 = @import("./unorddf2.zig").__unorddf2;
17
18const 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
30fn 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
55const 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
76fn 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
93const 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
104test "compare f64" {
105 for (test_vectors) |vector| {
106 try std.testing.expect(test__cmpdf2(vector));
107 }
108}