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