1//===-- mulvti3_test.c - Test __mulvti3 -----------------------------------===// 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 __mulvti3 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: aborts if a * b overflows 22 23ti_int __mulvti3(ti_int a, ti_int b); 24 25int test__mulvti3(ti_int a, ti_int b, ti_int expected) 26{ 27 ti_int x = __mulvti3(a, b); 28 if (x != expected) 29 { 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 printf("error in __mulvti3: 0x%.16llX%.16llX * 0x%.16llX%.16llX = " 39 "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n", 40 at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low, 41 expectedt.s.high, expectedt.s.low); 42 } 43 return x != expected; 44} 45 46#endif 47 48int main() 49{ 50#ifdef CRT_HAS_128BIT 51 if (test__mulvti3(0, 0, 0)) 52 return 1; 53 if (test__mulvti3(0, 1, 0)) 54 return 1; 55 if (test__mulvti3(1, 0, 0)) 56 return 1; 57 if (test__mulvti3(0, 10, 0)) 58 return 1; 59 if (test__mulvti3(10, 0, 0)) 60 return 1; 61 if (test__mulvti3(0, 81985529216486895LL, 0)) 62 return 1; 63 if (test__mulvti3(81985529216486895LL, 0, 0)) 64 return 1; 65 66 if (test__mulvti3(0, -1, 0)) 67 return 1; 68 if (test__mulvti3(-1, 0, 0)) 69 return 1; 70 if (test__mulvti3(0, -10, 0)) 71 return 1; 72 if (test__mulvti3(-10, 0, 0)) 73 return 1; 74 if (test__mulvti3(0, -81985529216486895LL, 0)) 75 return 1; 76 if (test__mulvti3(-81985529216486895LL, 0, 0)) 77 return 1; 78 79 if (test__mulvti3(1, 1, 1)) 80 return 1; 81 if (test__mulvti3(1, 10, 10)) 82 return 1; 83 if (test__mulvti3(10, 1, 10)) 84 return 1; 85 if (test__mulvti3(1, 81985529216486895LL, 81985529216486895LL)) 86 return 1; 87 if (test__mulvti3(81985529216486895LL, 1, 81985529216486895LL)) 88 return 1; 89 90 if (test__mulvti3(1, -1, -1)) 91 return 1; 92 if (test__mulvti3(1, -10, -10)) 93 return 1; 94 if (test__mulvti3(-10, 1, -10)) 95 return 1; 96 if (test__mulvti3(1, -81985529216486895LL, -81985529216486895LL)) 97 return 1; 98 if (test__mulvti3(-81985529216486895LL, 1, -81985529216486895LL)) 99 return 1; 100 101 if (test__mulvti3(3037000499LL, 3037000499LL, 9223372030926249001LL)) 102 return 1; 103 if (test__mulvti3(-3037000499LL, 3037000499LL, -9223372030926249001LL)) 104 return 1; 105 if (test__mulvti3(3037000499LL, -3037000499LL, -9223372030926249001LL)) 106 return 1; 107 if (test__mulvti3(-3037000499LL, -3037000499LL, 9223372030926249001LL)) 108 return 1; 109 110 if (test__mulvti3(4398046511103LL, 2097152LL, 9223372036852678656LL)) 111 return 1; 112 if (test__mulvti3(-4398046511103LL, 2097152LL, -9223372036852678656LL)) 113 return 1; 114 if (test__mulvti3(4398046511103LL, -2097152LL, -9223372036852678656LL)) 115 return 1; 116 if (test__mulvti3(-4398046511103LL, -2097152LL, 9223372036852678656LL)) 117 return 1; 118 119 if (test__mulvti3(2097152LL, 4398046511103LL, 9223372036852678656LL)) 120 return 1; 121 if (test__mulvti3(-2097152LL, 4398046511103LL, -9223372036852678656LL)) 122 return 1; 123 if (test__mulvti3(2097152LL, -4398046511103LL, -9223372036852678656LL)) 124 return 1; 125 if (test__mulvti3(-2097152LL, -4398046511103LL, 9223372036852678656LL)) 126 return 1; 127 128 if (test__mulvti3(make_ti(0x00000000000000B5LL, 0x04F333F9DE5BE000LL), 129 make_ti(0x0000000000000000LL, 0x00B504F333F9DE5BLL), 130 make_ti(0x7FFFFFFFFFFFF328LL, 0xDF915DA296E8A000LL))) 131 return 1; 132 133// if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 134// -2, 135// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 136// return 1; 137// if (test__mulvti3(-2, 138// make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 139// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 140// return 1; 141 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 142 -1, 143 make_ti(0x8000000000000000LL, 0x0000000000000001LL))) 144 return 1; 145 if (test__mulvti3(-1, 146 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 147 make_ti(0x8000000000000000LL, 0x0000000000000001LL))) 148 return 1; 149 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 150 0, 151 0)) 152 return 1; 153 if (test__mulvti3(0, 154 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 155 0)) 156 return 1; 157 if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 158 1, 159 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL))) 160 return 1; 161 if (test__mulvti3(1, 162 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 163 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL))) 164 return 1; 165// if (test__mulvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 166// 2, 167// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 168// return 1; 169// if (test__mulvti3(2, 170// make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 171// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 172// return 1; 173 174// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL), 175// -2, 176// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 177// return 1; 178// if (test__mulvti3(-2, 179// make_ti(0x8000000000000000LL, 0x0000000000000000LL), 180// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 181// return 1; 182// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL), 183// -1, 184// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 185// return 1; 186// if (test__mulvti3(-1, 187// make_ti(0x8000000000000000LL, 0x0000000000000000LL), 188// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 189// return 1; 190 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL), 191 0, 192 0)) 193 return 1; 194 if (test__mulvti3(0, 195 make_ti(0x8000000000000000LL, 0x0000000000000000LL), 196 0)) 197 return 1; 198 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL), 199 1, 200 make_ti(0x8000000000000000LL, 0x0000000000000000LL))) 201 return 1; 202 if (test__mulvti3(1, 203 make_ti(0x8000000000000000LL, 0x0000000000000000LL), 204 make_ti(0x8000000000000000LL, 0x0000000000000000LL))) 205 return 1; 206// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000000LL), 207// 2, 208// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 209// return 1; 210// if (test__mulvti3(2, 211// make_ti(0x8000000000000000LL, 0x0000000000000000LL), 212// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 213// return 1; 214 215// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL), 216// -2, 217// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 218// return 1; 219// if (test__mulvti3(-2, 220// make_ti(0x8000000000000000LL, 0x0000000000000001LL), 221// make_ti(0x8000000000000000LL, 0x0000000000000001LL))) // abort 222// return 1; 223 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL), 224 -1, 225 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL))) 226 return 1; 227 if (test__mulvti3(-1, 228 make_ti(0x8000000000000000LL, 0x0000000000000001LL), 229 make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL))) 230 return 1; 231 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL), 232 0, 233 0)) 234 return 1; 235 if (test__mulvti3(0, 236 make_ti(0x8000000000000000LL, 0x0000000000000001LL), 237 0)) 238 return 1; 239 if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL), 240 1, 241 make_ti(0x8000000000000000LL, 0x0000000000000001LL))) 242 return 1; 243 if (test__mulvti3(1, 244 make_ti(0x8000000000000000LL, 0x0000000000000001LL), 245 make_ti(0x8000000000000000LL, 0x0000000000000001LL))) 246 return 1; 247// if (test__mulvti3(make_ti(0x8000000000000000LL, 0x0000000000000001LL), 248// 2, 249// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 250// return 1; 251// if (test__mulvti3(2, 252// make_ti(0x8000000000000000LL, 0x0000000000000001LL), 253// make_ti(0x8000000000000000LL, 0x0000000000000000LL))) // abort 254// return 1; 255 256#else 257 printf("skipped\n"); 258#endif 259 return 0; 260} 261