master
1// Ported from:
2//
3// https://github.com/llvm/llvm-project/commit/d674d96bc56c0f377879d01c9d8dfdaaa7859cdb/compiler-rt/test/builtins/Unit/comparesf2_test.c
4
5const std = @import("std");
6const builtin = @import("builtin");
7
8const __eqsf2 = @import("./cmpsf2.zig").__eqsf2;
9const __lesf2 = @import("./cmpsf2.zig").__lesf2;
10const __ltsf2 = @import("./cmpsf2.zig").__ltsf2;
11const __nesf2 = @import("./cmpsf2.zig").__nesf2;
12
13const __gesf2 = @import("./gesf2.zig").__gesf2;
14const __gtsf2 = @import("./gesf2.zig").__gtsf2;
15
16const __unordsf2 = @import("./unordsf2.zig").__unordsf2;
17
18const 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
30fn 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
55const 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
76fn 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
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 f32" {
105 for (test_vectors) |vector| {
106 try std.testing.expect(test__cmpsf2(vector));
107 }
108}