1/* { dg-do run } */ 2/* { dg-options "-w" } */ 3 4#include <stdlib.h> 5 6const __flash __int24 vals[] = 7 { 8 0, 1, 2, 3, -1, -2, -3, 0xff, 0x100, 0x101, 9 0xffL * 0xff, 0xfffL * 0xfff, 0x101010L, 0xaaaaaaL 10 }; 11 12void test_u (void) 13{ 14 unsigned int i; 15 unsigned long la, lb, lc; 16 __uint24 a, b, c; 17 18 int S = sizeof (vals) / sizeof (*vals); 19 20 for (i = 0; i < 500; i++) 21 { 22 if (i < S*S) 23 { 24 a = vals[i / S]; 25 b = vals[i % S]; 26 } 27 else 28 { 29 if (i & 1) 30 a += 0x7654321L; 31 else 32 b += 0x5fe453L; 33 } 34 35 c = a * b; 36 37 la = a; 38 lb = b; 39 lc = 0xffffff & (la * lb); 40 41 if (c != lc) 42 abort(); 43 } 44} 45 46#define TEST_N_U(A1,A2,B) \ 47 do { \ 48 if ((0xffffff & (A1*B)) != A2*B) \ 49 abort(); \ 50 } while (0) 51 52void test_nu (void) 53{ 54 unsigned long la; 55 unsigned int i; 56 int S = sizeof (vals) / sizeof (*vals); 57 __uint24 a; 58 59 for (i = 0; i < 500; i++) 60 { 61 a = i < S 62 ? vals[i % S] 63 : a + 0x7654321; 64 65 la = a; 66 67 TEST_N_U (la, a, 2); 68 TEST_N_U (la, a, 3); 69 TEST_N_U (la, a, 4); 70 TEST_N_U (la, a, 5); 71 TEST_N_U (la, a, 15); 72 TEST_N_U (la, a, 16); 73 TEST_N_U (la, a, 128); 74 TEST_N_U (la, a, 0x1000); 75 } 76} 77 78int main (void) 79{ 80 test_u(); 81 test_nu(); 82 83 exit(0); 84 85 return 0; 86} 87