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