1// RUN: %clang_builtins %s %librt -o %t && %run %t 2// REQUIRES: int128 3//===-- multi3_test.c - Test __multi3 -------------------------------------===// 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 __multi3 for the compiler_rt library. 12// 13//===----------------------------------------------------------------------===// 14 15#include "int_lib.h" 16#include <stdio.h> 17 18#ifdef CRT_HAS_128BIT 19 20COMPILER_RT_ABI ti_int __multi3(ti_int a, ti_int b); 21 22int test__multi3(ti_int a, ti_int b, ti_int expected) 23{ 24 ti_int x = __multi3(a, b); 25 if (x != expected) 26 { 27 twords at; 28 at.all = a; 29 twords bt; 30 bt.all = b; 31 twords xt; 32 xt.all = x; 33 twords expectedt; 34 expectedt.all = expected; 35 printf("error in __multi3: 0x%.16llX%.16llX * 0x%.16llX%.16llX = " 36 "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n", 37 at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low, 38 expectedt.s.high, expectedt.s.low); 39 } 40 return x != expected; 41} 42 43char assumption_1[sizeof(ti_int) == 2*sizeof(di_int)] = {0}; 44 45#endif 46 47int main() 48{ 49#ifdef CRT_HAS_128BIT 50 if (test__multi3(0, 0, 0)) 51 return 1; 52 if (test__multi3(0, 1, 0)) 53 return 1; 54 if (test__multi3(1, 0, 0)) 55 return 1; 56 if (test__multi3(0, 10, 0)) 57 return 1; 58 if (test__multi3(10, 0, 0)) 59 return 1; 60 if (test__multi3(0, 81985529216486895LL, 0)) 61 return 1; 62 if (test__multi3(81985529216486895LL, 0, 0)) 63 return 1; 64 65 if (test__multi3(0, -1, 0)) 66 return 1; 67 if (test__multi3(-1, 0, 0)) 68 return 1; 69 if (test__multi3(0, -10, 0)) 70 return 1; 71 if (test__multi3(-10, 0, 0)) 72 return 1; 73 if (test__multi3(0, -81985529216486895LL, 0)) 74 return 1; 75 if (test__multi3(-81985529216486895LL, 0, 0)) 76 return 1; 77 78 if (test__multi3(1, 1, 1)) 79 return 1; 80 if (test__multi3(1, 10, 10)) 81 return 1; 82 if (test__multi3(10, 1, 10)) 83 return 1; 84 if (test__multi3(1, 81985529216486895LL, 81985529216486895LL)) 85 return 1; 86 if (test__multi3(81985529216486895LL, 1, 81985529216486895LL)) 87 return 1; 88 89 if (test__multi3(1, -1, -1)) 90 return 1; 91 if (test__multi3(1, -10, -10)) 92 return 1; 93 if (test__multi3(-10, 1, -10)) 94 return 1; 95 if (test__multi3(1, -81985529216486895LL, -81985529216486895LL)) 96 return 1; 97 if (test__multi3(-81985529216486895LL, 1, -81985529216486895LL)) 98 return 1; 99 100 if (test__multi3(3037000499LL, 3037000499LL, 9223372030926249001LL)) 101 return 1; 102 if (test__multi3(-3037000499LL, 3037000499LL, -9223372030926249001LL)) 103 return 1; 104 if (test__multi3(3037000499LL, -3037000499LL, -9223372030926249001LL)) 105 return 1; 106 if (test__multi3(-3037000499LL, -3037000499LL, 9223372030926249001LL)) 107 return 1; 108 109 if (test__multi3(4398046511103LL, 2097152LL, 9223372036852678656LL)) 110 return 1; 111 if (test__multi3(-4398046511103LL, 2097152LL, -9223372036852678656LL)) 112 return 1; 113 if (test__multi3(4398046511103LL, -2097152LL, -9223372036852678656LL)) 114 return 1; 115 if (test__multi3(-4398046511103LL, -2097152LL, 9223372036852678656LL)) 116 return 1; 117 118 if (test__multi3(2097152LL, 4398046511103LL, 9223372036852678656LL)) 119 return 1; 120 if (test__multi3(-2097152LL, 4398046511103LL, -9223372036852678656LL)) 121 return 1; 122 if (test__multi3(2097152LL, -4398046511103LL, -9223372036852678656LL)) 123 return 1; 124 if (test__multi3(-2097152LL, -4398046511103LL, 9223372036852678656LL)) 125 return 1; 126 127 if (test__multi3(make_ti(0x00000000000000B5LL, 0x04F333F9DE5BE000LL), 128 make_ti(0x0000000000000000LL, 0x00B504F333F9DE5BLL), 129 make_ti(0x7FFFFFFFFFFFF328LL, 0xDF915DA296E8A000LL))) 130 return 1; 131#else 132 printf("skipped\n"); 133#endif 134 return 0; 135} 136