i128_14_arbitrary_mul.c (674B)
1 typedef __int128 i128; 2 typedef unsigned __int128 u128; 3 4 int test_main(void) { 5 u128 a = ((u128)0x123456789abcdef0ULL << 16) | 0x1357ULL; 6 u128 b = ((u128)0x0fedcba987654321ULL << 12) | 0x246ULL; 7 u128 p = a * b; 8 9 if ((unsigned long long)p != 0x71407aa829ff67caULL) return 11; 10 if ((unsigned long long)(p >> 64) != 0x0ad77d7422601184ULL) return 12; 11 12 i128 x = -(((i128)0x1234567 << 40) + 0x89abcdef); 13 i128 y = ((i128)0x13579 << 28) + 0x2468ace; 14 i128 z = x * y; 15 u128 uz = (u128)z; 16 17 if (z >= 0) return 13; 18 if ((unsigned long long)uz != 0x324b79b4fd6373aeULL) return 14; 19 if ((unsigned long long)(uz >> 64) != 0xffffe9fe36571cf3ULL) return 15; 20 21 return 73; 22 }