Home | History | Annotate | Download | only in Unit
      1 //===-- muloti4_test.c - Test __muloti4 -----------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file tests __muloti3 for the compiler_rt library.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "int_lib.h"
     15 #include <stdio.h>
     16 
     17 #ifdef CRT_HAS_128BIT
     18 
     19 // Returns: a * b
     20 
     21 // Effects: sets overflow if a * b overflows
     22 
     23 COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow);
     24 
     25 int test__muloti4(ti_int a, ti_int b, ti_int expected, int expected_overflow)
     26 {
     27     int ov;
     28     ti_int x = __muloti4(a, b, &ov);
     29     if (ov != expected_overflow) {
     30       twords at;
     31       at.all = a;
     32       twords bt;
     33       bt.all = b;
     34       twords xt;
     35       xt.all = x;
     36       twords expectedt;
     37       expectedt.all = expected;
     38 
     39       printf("error in __muloti4: overflow=%d expected=%d\n",
     40 	     ov, expected_overflow);
     41       printf("error in __muloti4: 0x%.16llX%.16llX * 0x%.16llX%.16llX = "
     42 	     "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
     43 	     at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low,
     44 	     expectedt.s.high, expectedt.s.low);
     45       return 1;
     46     }
     47     else if (!expected_overflow && x != expected)
     48     {
     49         twords at;
     50         at.all = a;
     51         twords bt;
     52         bt.all = b;
     53         twords xt;
     54         xt.all = x;
     55         twords expectedt;
     56         expectedt.all = expected;
     57         printf("error in __muloti4: 0x%.16llX%.16llX * 0x%.16llX%.16llX = "
     58                "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
     59                at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low,
     60                expectedt.s.high, expectedt.s.low);
     61 	return 1;
     62     }
     63     return 0;
     64 }
     65 
     66 #endif
     67 
     68 int main()
     69 {
     70 #ifdef CRT_HAS_128BIT
     71     if (test__muloti4(0, 0, 0, 0))
     72         return 1;
     73     if (test__muloti4(0, 1, 0, 0))
     74         return 1;
     75     if (test__muloti4(1, 0, 0, 0))
     76         return 1;
     77     if (test__muloti4(0, 10, 0, 0))
     78         return 1;
     79     if (test__muloti4(10, 0, 0, 0))
     80         return 1;
     81     if (test__muloti4(0, 81985529216486895LL, 0, 0))
     82         return 1;
     83     if (test__muloti4(81985529216486895LL, 0, 0, 0))
     84         return 1;
     85 
     86     if (test__muloti4(0, -1, 0, 0))
     87         return 1;
     88     if (test__muloti4(-1, 0, 0, 0))
     89         return 1;
     90     if (test__muloti4(0, -10, 0, 0))
     91         return 1;
     92     if (test__muloti4(-10, 0, 0, 0))
     93         return 1;
     94     if (test__muloti4(0, -81985529216486895LL, 0, 0))
     95         return 1;
     96     if (test__muloti4(-81985529216486895LL, 0, 0, 0))
     97         return 1;
     98 
     99     if (test__muloti4(1, 1, 1, 0))
    100         return 1;
    101     if (test__muloti4(1, 10, 10, 0))
    102         return 1;
    103     if (test__muloti4(10, 1, 10, 0))
    104         return 1;
    105     if (test__muloti4(1, 81985529216486895LL, 81985529216486895LL, 0))
    106         return 1;
    107     if (test__muloti4(81985529216486895LL, 1, 81985529216486895LL, 0))
    108         return 1;
    109 
    110     if (test__muloti4(1, -1, -1, 0))
    111         return 1;
    112     if (test__muloti4(1, -10, -10, 0))
    113         return 1;
    114     if (test__muloti4(-10, 1, -10, 0))
    115         return 1;
    116     if (test__muloti4(1, -81985529216486895LL, -81985529216486895LL, 0))
    117         return 1;
    118     if (test__muloti4(-81985529216486895LL, 1, -81985529216486895LL, 0))
    119         return 1;
    120 
    121     if (test__muloti4(3037000499LL, 3037000499LL, 9223372030926249001LL, 0))
    122         return 1;
    123     if (test__muloti4(-3037000499LL, 3037000499LL, -9223372030926249001LL, 0))
    124         return 1;
    125     if (test__muloti4(3037000499LL, -3037000499LL, -9223372030926249001LL, 0))
    126         return 1;
    127     if (test__muloti4(-3037000499LL, -3037000499LL, 9223372030926249001LL, 0))
    128         return 1;
    129 
    130     if (test__muloti4(4398046511103LL, 2097152LL, 9223372036852678656LL, 0))
    131         return 1;
    132     if (test__muloti4(-4398046511103LL, 2097152LL, -9223372036852678656LL, 0))
    133         return 1;
    134     if (test__muloti4(4398046511103LL, -2097152LL, -9223372036852678656LL, 0))
    135         return 1;
    136     if (test__muloti4(-4398046511103LL, -2097152LL, 9223372036852678656LL, 0))
    137         return 1;
    138 
    139     if (test__muloti4(2097152LL, 4398046511103LL, 9223372036852678656LL, 0))
    140         return 1;
    141     if (test__muloti4(-2097152LL, 4398046511103LL, -9223372036852678656LL, 0))
    142         return 1;
    143     if (test__muloti4(2097152LL, -4398046511103LL, -9223372036852678656LL, 0))
    144         return 1;
    145     if (test__muloti4(-2097152LL, -4398046511103LL, 9223372036852678656LL, 0))
    146         return 1;
    147 
    148     if (test__muloti4(make_ti(0x00000000000000B5LL, 0x04F333F9DE5BE000LL),
    149                       make_ti(0x0000000000000000LL, 0x00B504F333F9DE5BLL),
    150                       make_ti(0x7FFFFFFFFFFFF328LL, 0xDF915DA296E8A000LL), 0))
    151         return 1;
    152 
    153      if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    154                        -2,
    155                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    156        return 1;
    157      if (test__muloti4(-2,
    158                        make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    159                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    160          return 1;
    161     if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    162                       -1,
    163                       make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0))
    164         return 1;
    165     if (test__muloti4(-1,
    166                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    167                       make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0))
    168         return 1;
    169     if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    170                       0,
    171                       0, 0))
    172         return 1;
    173     if (test__muloti4(0,
    174                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    175                       0, 0))
    176         return 1;
    177     if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    178                       1,
    179                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0))
    180         return 1;
    181     if (test__muloti4(1,
    182                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    183                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0))
    184         return 1;
    185      if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    186                        2,
    187                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    188          return 1;
    189      if (test__muloti4(2,
    190                        make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),
    191                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    192          return 1;
    193 
    194      if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    195                        -2,
    196                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    197          return 1;
    198      if (test__muloti4(-2,
    199                        make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    200                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    201          return 1;
    202      if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    203                        -1,
    204                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    205          return 1;
    206      if (test__muloti4(-1,
    207                        make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    208                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    209          return 1;
    210     if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    211                       0,
    212                       0, 0))
    213         return 1;
    214     if (test__muloti4(0,
    215                       make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    216                       0, 0))
    217         return 1;
    218     if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    219                       1,
    220                       make_ti(0x8000000000000000LL, 0x0000000000000000LL), 0))
    221         return 1;
    222     if (test__muloti4(1,
    223                       make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    224                       make_ti(0x8000000000000000LL, 0x0000000000000000LL), 0))
    225         return 1;
    226      if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    227                        2,
    228                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    229          return 1;
    230      if (test__muloti4(2,
    231                        make_ti(0x8000000000000000LL, 0x0000000000000000LL),
    232                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    233          return 1;
    234 
    235      if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    236                        -2,
    237                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    238          return 1;
    239      if (test__muloti4(-2,
    240                        make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    241                        make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1))
    242          return 1;
    243     if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    244                       -1,
    245                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0))
    246         return 1;
    247     if (test__muloti4(-1,
    248                       make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    249                       make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0))
    250         return 1;
    251     if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    252                       0,
    253                       0, 0))
    254         return 1;
    255     if (test__muloti4(0,
    256                       make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    257                       0, 0))
    258         return 1;
    259     if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    260                       1,
    261                       make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0))
    262         return 1;
    263     if (test__muloti4(1,
    264                       make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    265                       make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0))
    266         return 1;
    267      if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    268                        2,
    269                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    270          return 1;
    271      if (test__muloti4(2,
    272                        make_ti(0x8000000000000000LL, 0x0000000000000001LL),
    273                        make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1))
    274          return 1;
    275 
    276 #else
    277     printf("skipped\n");
    278 #endif
    279     return 0;
    280 }
    281