zig

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

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 }