zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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 }