252 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2// REQUIRES: librt_has_mulvti33// REQUIRES: int1284 5#include "int_lib.h"6#include <stdio.h>7 8#ifdef CRT_HAS_128BIT9 10// Returns: a * b11 12// Effects: aborts if a * b overflows13 14COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b);15 16int test__mulvti3(ti_int a, ti_int b, ti_int expected)17{18 ti_int x = __mulvti3(a, b);19 if (x != expected)20 {21 twords at;22 at.all = a;23 twords bt;24 bt.all = b;25 twords xt;26 xt.all = x;27 twords expectedt;28 expectedt.all = expected;29 printf("error in __mulvti3: 0x%.16llX%.16llX * 0x%.16llX%.16llX = "30 "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",31 at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low,32 expectedt.s.high, expectedt.s.low);33 }34 return x != expected;35}36 37#endif38 39int main()40{41#ifdef CRT_HAS_128BIT42 if (test__mulvti3(0, 0, 0))43 return 1;44 if (test__mulvti3(0, 1, 0))45 return 1;46 if (test__mulvti3(1, 0, 0))47 return 1;48 if (test__mulvti3(0, 10, 0))49 return 1;50 if (test__mulvti3(10, 0, 0))51 return 1;52 if (test__mulvti3(0, 81985529216486895LL, 0))53 return 1;54 if (test__mulvti3(81985529216486895LL, 0, 0))55 return 1;56 57 if (test__mulvti3(0, -1, 0))58 return 1;59 if (test__mulvti3(-1, 0, 0))60 return 1;61 if (test__mulvti3(0, -10, 0))62 return 1;63 if (test__mulvti3(-10, 0, 0))64 return 1;65 if (test__mulvti3(0, -81985529216486895LL, 0))66 return 1;67 if (test__mulvti3(-81985529216486895LL, 0, 0))68 return 1;69 70 if (test__mulvti3(1, 1, 1))71 return 1;72 if (test__mulvti3(1, 10, 10))73 return 1;74 if (test__mulvti3(10, 1, 10))75 return 1;76 if (test__mulvti3(1, 81985529216486895LL, 81985529216486895LL))77 return 1;78 if (test__mulvti3(81985529216486895LL, 1, 81985529216486895LL))79 return 1;80 81 if (test__mulvti3(1, -1, -1))82 return 1;83 if (test__mulvti3(1, -10, -10))84 return 1;85 if (test__mulvti3(-10, 1, -10))86 return 1;87 if (test__mulvti3(1, -81985529216486895LL, -81985529216486895LL))88 return 1;89 if (test__mulvti3(-81985529216486895LL, 1, -81985529216486895LL))90 return 1;91 92 if (test__mulvti3(3037000499LL, 3037000499LL, 9223372030926249001ULL))93 return 1;94 if (test__mulvti3(-3037000499LL, 3037000499LL, -9223372030926249001LL))95 return 1;96 if (test__mulvti3(3037000499LL, -3037000499LL, -9223372030926249001LL))97 return 1;98 if (test__mulvti3(-3037000499LL, -3037000499LL, 9223372030926249001ULL))99 return 1;100 101 if (test__mulvti3(4398046511103LL, 2097152LL, 9223372036852678656LL))102 return 1;103 if (test__mulvti3(-4398046511103LL, 2097152LL, -9223372036852678656LL))104 return 1;105 if (test__mulvti3(4398046511103LL, -2097152LL, -9223372036852678656LL))106 return 1;107 if (test__mulvti3(-4398046511103LL, -2097152LL, 9223372036852678656LL))108 return 1;109 110 if (test__mulvti3(2097152LL, 4398046511103LL, 9223372036852678656ULL))111 return 1;112 if (test__mulvti3(-2097152LL, 4398046511103LL, -9223372036852678656LL))113 return 1;114 if (test__mulvti3(2097152LL, -4398046511103LL, -9223372036852678656LL))115 return 1;116 if (test__mulvti3(-2097152LL, -4398046511103LL, 9223372036852678656LL))117 return 1;118 119 if (test__mulvti3(make_ti(0x00000000000000B5LL, 0x04F333F9DE5BE000LL),120 make_ti(0x0000000000000000LL, 0x00B504F333F9DE5BLL),121 make_ti(0x7FFFFFFFFFFFF328LL, 0xDF915DA296E8A000LL)))122 return 1;123 124// if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),125// -2,126// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort127// return 1;128// if (test__mulvti3(-2,129// make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),130// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort131// return 1;132 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),133 -1,134 make_ti(0x8000000000000000LL, 0x0000000000000001LL)))135 return 1;136 if (test__mulvti3(-1,137 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),138 make_ti(0x8000000000000000LL, 0x0000000000000001LL)))139 return 1;140 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),141 0,142 0))143 return 1;144 if (test__mulvti3(0,145 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),146 0))147 return 1;148 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),149 1,150 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))151 return 1;152 if (test__mulvti3(1,153 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),154 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))155 return 1;156// if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),157// 2,158// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort159// return 1;160// if (test__mulvti3(2,161// make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL),162// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort163// return 1;164 165// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL),166// -2,167// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort168// return 1;169// if (test__mulvti3(-2,170// make_ti(0x8000000000000000LL, 0x0000000000000000LL),171// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort172// return 1;173// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL),174// -1,175// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort176// return 1;177// if (test__mulvti3(-1,178// make_ti(0x8000000000000000LL, 0x0000000000000000LL),179// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort180// return 1;181 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL),182 0,183 0))184 return 1;185 if (test__mulvti3(0,186 make_ti(0x8000000000000000LL, 0x0000000000000000LL),187 0))188 return 1;189 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL),190 1,191 make_ti(0x8000000000000000LL, 0x0000000000000000LL)))192 return 1;193 if (test__mulvti3(1,194 make_ti(0x8000000000000000LL, 0x0000000000000000LL),195 make_ti(0x8000000000000000LL, 0x0000000000000000LL)))196 return 1;197// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL),198// 2,199// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort200// return 1;201// if (test__mulvti3(2,202// make_ti(0x8000000000000000LL, 0x0000000000000000LL),203// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort204// return 1;205 206// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL),207// -2,208// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort209// return 1;210// if (test__mulvti3(-2,211// make_ti(0x8000000000000000LL, 0x0000000000000001LL),212// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort213// return 1;214 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL),215 -1,216 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))217 return 1;218 if (test__mulvti3(-1,219 make_ti(0x8000000000000000LL, 0x0000000000000001LL),220 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))221 return 1;222 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL),223 0,224 0))225 return 1;226 if (test__mulvti3(0,227 make_ti(0x8000000000000000LL, 0x0000000000000001LL),228 0))229 return 1;230 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL),231 1,232 make_ti(0x8000000000000000LL, 0x0000000000000001LL)))233 return 1;234 if (test__mulvti3(1,235 make_ti(0x8000000000000000LL, 0x0000000000000001LL),236 make_ti(0x8000000000000000LL, 0x0000000000000001LL)))237 return 1;238// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL),239// 2,240// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort241// return 1;242// if (test__mulvti3(2,243// make_ti(0x8000000000000000LL, 0x0000000000000001LL),244// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort245// return 1;246 247#else248 printf("skipped\n");249#endif250 return 0;251}252