annotate gcc/testsuite/c-c++-common/int128-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run { target int128 } } */
kono
parents:
diff changeset
2 /* { dg-options "-std=gnu99" { target c } } */
kono
parents:
diff changeset
3 /* { dg-options "" { target c++ } } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 #ifndef __cplusplus
kono
parents:
diff changeset
6 extern void abort (void);
kono
parents:
diff changeset
7 #else
kono
parents:
diff changeset
8 extern "C" void abort (void);
kono
parents:
diff changeset
9 #endif
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 #define MK_CONST128(A,B,C,D) \
kono
parents:
diff changeset
12 ( (((unsigned __int128) (unsigned int) A) << 96) \
kono
parents:
diff changeset
13 | (((unsigned __int128) (unsigned int) B) << 64) \
kono
parents:
diff changeset
14 | (((unsigned __int128) (unsigned int) C) << 32) \
kono
parents:
diff changeset
15 | ((unsigned __int128) (unsigned int) D) )
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 #define MK_CONST128_SIGNED(A,B,C,D) \
kono
parents:
diff changeset
18 ((__int128) MK_CONST128(A, B, C, D))
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #define MINUS_2 MK_CONST128_SIGNED (0xffffffffu, 0xffffffffu, 0xffffffffu, \
kono
parents:
diff changeset
21 0xfffffffeu)
kono
parents:
diff changeset
22 #define MINUS_3 MK_CONST128_SIGNED (0xffffffffu, 0xffffffffu, 0xffffffffu, \
kono
parents:
diff changeset
23 0xfffffffdu)
kono
parents:
diff changeset
24 #define MINUS_6 MK_CONST128_SIGNED (0xffffffffu, 0xffffffffu, 0xffffffffu, \
kono
parents:
diff changeset
25 0xfffffffau)
kono
parents:
diff changeset
26 #define PLUS_1 MK_CONST128_SIGNED (0, 0, 0, 1)
kono
parents:
diff changeset
27 #define PLUS_2 MK_CONST128_SIGNED (0, 0, 0, 2)
kono
parents:
diff changeset
28 #define PLUS_3 MK_CONST128_SIGNED (0, 0, 0, 3)
kono
parents:
diff changeset
29 #define PLUS_6 MK_CONST128_SIGNED (0, 0, 0, 6)
kono
parents:
diff changeset
30 #define PLUS_10 MK_CONST128_SIGNED (0, 0, 0, 10)
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 #define U_8 MK_CONST128 (0, 0, 0, 8)
kono
parents:
diff changeset
33 #define U_MAX MK_CONST128 (0xffffffff,0xffffffff,0xffffffff,0xffffffff)
kono
parents:
diff changeset
34 #define U_CST1 MK_CONST128 (0xbeeffeed, 0xdeafcafe, 0xaffefade, 0x12345678)
kono
parents:
diff changeset
35 #define U_CST2 MK_CONST128 (0x41100112, 0x21503501, 0x50010521, 0xedcba987)
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 signed __int128 foo_neg (signed __int128 v)
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 return -v;
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 unsigned __int128 foo_xor (unsigned __int128 x, unsigned __int128 y)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 return x ^ y;
kono
parents:
diff changeset
45 }
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 unsigned __int128 foo_inv (unsigned __int128 v)
kono
parents:
diff changeset
48 {
kono
parents:
diff changeset
49 return ~v;
kono
parents:
diff changeset
50 }
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 unsigned __int128 foo_rotate_left (unsigned __int128 v)
kono
parents:
diff changeset
53 {
kono
parents:
diff changeset
54 unsigned __int128 c;
kono
parents:
diff changeset
55 int i;
kono
parents:
diff changeset
56 for (i = 0; i < 128; i++)
kono
parents:
diff changeset
57 {
kono
parents:
diff changeset
58 c = v >> 127;
kono
parents:
diff changeset
59 v <<= 1;
kono
parents:
diff changeset
60 v |= c;
kono
parents:
diff changeset
61 }
kono
parents:
diff changeset
62 return v;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 unsigned __int128 foo_rotate_right (unsigned __int128 v)
kono
parents:
diff changeset
66 {
kono
parents:
diff changeset
67 unsigned __int128 c;
kono
parents:
diff changeset
68 int i;
kono
parents:
diff changeset
69 for (i = 0; i < 128; i++)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 c = (v & ((unsigned __int128) 1)) << 127;
kono
parents:
diff changeset
72 v >>= 1;
kono
parents:
diff changeset
73 v |= c;
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75 return v;
kono
parents:
diff changeset
76 }
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 void foo_swap (unsigned __int128 *x, unsigned __int128 *y)
kono
parents:
diff changeset
79 {
kono
parents:
diff changeset
80 unsigned __int128 x1 = x[0];
kono
parents:
diff changeset
81 unsigned __int128 y1 = y[0];
kono
parents:
diff changeset
82 x1 ^= y1 ^= x1 ^= y1;
kono
parents:
diff changeset
83 x[0] = x1;
kono
parents:
diff changeset
84 y[0] = y1;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 __int128 foo_add (signed __int128 a, unsigned __int128 b)
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 return (__int128) (a + (__int128) b);
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 __int128 foo_sub (unsigned __int128 a, signed __int128 b)
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 return (__int128) ((__int128) a - b);
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 __int128 foo_mul (signed __int128 a, signed __int128 b)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 return a * b;
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 __int128 foo_div (signed __int128 a, signed __int128 b)
kono
parents:
diff changeset
103 {
kono
parents:
diff changeset
104 return a / b;
kono
parents:
diff changeset
105 }
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 __int128 foo_shl (signed __int128 a, int shift)
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 return a << (shift & 127);
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 __int128 foo_shr (signed __int128 a, int shift)
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 return a >> (shift & 127);
kono
parents:
diff changeset
115 }
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 int main(void)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 __int128 rslt;
kono
parents:
diff changeset
120 unsigned __int128 u1, u2;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 rslt = foo_add (MINUS_2, U_8);
kono
parents:
diff changeset
123 if (rslt != PLUS_6)
kono
parents:
diff changeset
124 abort ();
kono
parents:
diff changeset
125 rslt = foo_sub (U_8, MINUS_2);
kono
parents:
diff changeset
126 if (rslt != PLUS_10)
kono
parents:
diff changeset
127 abort ();
kono
parents:
diff changeset
128 rslt = foo_sub ((unsigned __int128) foo_mul (MINUS_2, MINUS_2), MINUS_2);
kono
parents:
diff changeset
129 if (rslt != PLUS_6)
kono
parents:
diff changeset
130 abort ();
kono
parents:
diff changeset
131 if (rslt != foo_shl (PLUS_3, 1))
kono
parents:
diff changeset
132 abort ();
kono
parents:
diff changeset
133 rslt = foo_shl (MINUS_3, 1);
kono
parents:
diff changeset
134 if (rslt != MINUS_6)
kono
parents:
diff changeset
135 abort ();
kono
parents:
diff changeset
136 if (foo_shr (MINUS_6, 1) != MINUS_3)
kono
parents:
diff changeset
137 abort ();
kono
parents:
diff changeset
138 if (foo_div (MINUS_6, MINUS_3) != PLUS_2)
kono
parents:
diff changeset
139 abort ();
kono
parents:
diff changeset
140 if (foo_rotate_left (U_CST1) != U_CST1)
kono
parents:
diff changeset
141 abort ();
kono
parents:
diff changeset
142 if (foo_rotate_right (U_CST1) != U_CST1)
kono
parents:
diff changeset
143 abort ();
kono
parents:
diff changeset
144 u1 = U_CST1;
kono
parents:
diff changeset
145 u2 = U_8;
kono
parents:
diff changeset
146 foo_swap (&u1, &u2);
kono
parents:
diff changeset
147 if (u1 != U_8 || u2 != U_CST1)
kono
parents:
diff changeset
148 abort ();
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 if (foo_inv (U_CST2) != U_CST1)
kono
parents:
diff changeset
151 abort ();
kono
parents:
diff changeset
152 if (foo_neg (PLUS_2) != MINUS_2)
kono
parents:
diff changeset
153 abort ();
kono
parents:
diff changeset
154 if (foo_neg ((signed __int128) U_CST1) != foo_add (PLUS_1, foo_xor (U_CST1, U_MAX)))
kono
parents:
diff changeset
155 abort ();
kono
parents:
diff changeset
156 return 0;
kono
parents:
diff changeset
157 }