1*4684ddb6SLionel Sambuc //===-- subvti3_test.c - Test __subvti3 -----------------------------------===//
2*4684ddb6SLionel Sambuc //
3*4684ddb6SLionel Sambuc // The LLVM Compiler Infrastructure
4*4684ddb6SLionel Sambuc //
5*4684ddb6SLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open
6*4684ddb6SLionel Sambuc // Source Licenses. See LICENSE.TXT for details.
7*4684ddb6SLionel Sambuc //
8*4684ddb6SLionel Sambuc //===----------------------------------------------------------------------===//
9*4684ddb6SLionel Sambuc //
10*4684ddb6SLionel Sambuc // This file tests __subvti3 for the compiler_rt library.
11*4684ddb6SLionel Sambuc //
12*4684ddb6SLionel Sambuc //===----------------------------------------------------------------------===//
13*4684ddb6SLionel Sambuc
14*4684ddb6SLionel Sambuc #if __x86_64
15*4684ddb6SLionel Sambuc
16*4684ddb6SLionel Sambuc #include "int_lib.h"
17*4684ddb6SLionel Sambuc #include <stdio.h>
18*4684ddb6SLionel Sambuc #include <stdlib.h>
19*4684ddb6SLionel Sambuc
20*4684ddb6SLionel Sambuc // Returns: a - b
21*4684ddb6SLionel Sambuc
22*4684ddb6SLionel Sambuc // Effects: aborts if a - b overflows
23*4684ddb6SLionel Sambuc
24*4684ddb6SLionel Sambuc ti_int __subvti3(ti_int a, ti_int b);
25*4684ddb6SLionel Sambuc
test__subvti3(ti_int a,ti_int b)26*4684ddb6SLionel Sambuc int test__subvti3(ti_int a, ti_int b)
27*4684ddb6SLionel Sambuc {
28*4684ddb6SLionel Sambuc ti_int x = __subvti3(a, b);
29*4684ddb6SLionel Sambuc ti_int expected = a - b;
30*4684ddb6SLionel Sambuc if (x != expected)
31*4684ddb6SLionel Sambuc {
32*4684ddb6SLionel Sambuc twords at;
33*4684ddb6SLionel Sambuc at.all = a;
34*4684ddb6SLionel Sambuc twords bt;
35*4684ddb6SLionel Sambuc bt.all = b;
36*4684ddb6SLionel Sambuc twords xt;
37*4684ddb6SLionel Sambuc xt.all = x;
38*4684ddb6SLionel Sambuc twords expectedt;
39*4684ddb6SLionel Sambuc expectedt.all = expected;
40*4684ddb6SLionel Sambuc printf("error in test__subvsi3(0x%.16llX%.16llX, 0x%.16llX%.16llX) = "
41*4684ddb6SLionel Sambuc "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
42*4684ddb6SLionel Sambuc at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low,
43*4684ddb6SLionel Sambuc expectedt.s.high, expectedt.s.low);
44*4684ddb6SLionel Sambuc }
45*4684ddb6SLionel Sambuc return x != expected;
46*4684ddb6SLionel Sambuc }
47*4684ddb6SLionel Sambuc
48*4684ddb6SLionel Sambuc #endif
49*4684ddb6SLionel Sambuc
main()50*4684ddb6SLionel Sambuc int main()
51*4684ddb6SLionel Sambuc {
52*4684ddb6SLionel Sambuc #if __x86_64
53*4684ddb6SLionel Sambuc // test__subvti3(make_ti(0x8000000000000000LL, 0), 1); // should abort
54*4684ddb6SLionel Sambuc // test__subvti3(0, make_ti(0x8000000000000000LL, 0)); // should abort
55*4684ddb6SLionel Sambuc // test__subvti3(1, make_ti(0x8000000000000000LL, 0)); // should abort
56*4684ddb6SLionel Sambuc // test__subvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), -1); // should abort
57*4684ddb6SLionel Sambuc // test__subvti3(-2, make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)); // should abort
58*4684ddb6SLionel Sambuc
59*4684ddb6SLionel Sambuc if (test__subvti3(make_ti(0x8000000000000000LL, 0), -1))
60*4684ddb6SLionel Sambuc return 1;
61*4684ddb6SLionel Sambuc if (test__subvti3(make_ti(0x8000000000000000LL, 0), 0))
62*4684ddb6SLionel Sambuc return 1;
63*4684ddb6SLionel Sambuc if (test__subvti3(-1, make_ti(0x8000000000000000LL, 0)))
64*4684ddb6SLionel Sambuc return 1;
65*4684ddb6SLionel Sambuc if (test__subvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 1))
66*4684ddb6SLionel Sambuc return 1;
67*4684ddb6SLionel Sambuc if (test__subvti3(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0))
68*4684ddb6SLionel Sambuc return 1;
69*4684ddb6SLionel Sambuc if (test__subvti3(1, make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))
70*4684ddb6SLionel Sambuc return 1;
71*4684ddb6SLionel Sambuc if (test__subvti3(0, make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))
72*4684ddb6SLionel Sambuc return 1;
73*4684ddb6SLionel Sambuc if (test__subvti3(-1, make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL)))
74*4684ddb6SLionel Sambuc return 1;
75*4684ddb6SLionel Sambuc
76*4684ddb6SLionel Sambuc #else
77*4684ddb6SLionel Sambuc printf("skipped\n");
78*4684ddb6SLionel Sambuc #endif
79*4684ddb6SLionel Sambuc return 0;
80*4684ddb6SLionel Sambuc }
81