| /* Test the IACC multiply/accumulate instructions. Also test the IACC |
| read/write functions. */ |
| /* { dg-options "-mcpu=fr405" } */ |
| /* { dg-do run } */ |
| extern void abort (void); |
| extern void exit (int); |
| |
| int main () |
| { |
| long long res, res1, res2, res3; |
| |
| __SMU (0x12345678, 0x40004000); |
| __SMASS (0x12000000, 0x11223344); |
| __SMSSS (0x01020304, 0x54321000); |
| |
| res = __IACCreadll (0); |
| res1 = 0x12345678LL * 0x40004000LL; |
| res2 = 0x12000000LL * 0x11223344LL; |
| res3 = 0x01020304LL * 0x54321000LL; |
| if (res != res1 + res2 - res3) |
| abort (); |
| |
| __IACCsetll (0, 0x7ffffffffffffff0LL); |
| __SMASS (0x100, 0x100); |
| if (__IACCreadll (0) != 0x7fffffffffffffffLL) |
| abort (); |
| |
| __IACCsetl (0, -0x7ffffffe); |
| __IACCsetl (1, 0); |
| __SMSSS (0x10001, 0x10000); |
| if (__IACCreadl (0) != -0x7fffffff - 1 || __IACCreadl (1) != -0x10000) |
| abort (); |
| |
| __SMSSS (0x10001, 0x10000); |
| if (__IACCreadl (0) != -0x7fffffff - 1 || __IACCreadl (1) != 0) |
| abort (); |
| |
| exit (0); |
| } |