| /* { dg-do run } */ |
| /* { dg-options "-std=c99" } */ |
| #include <stdlib.h> |
| typedef int TItype __attribute__ ((mode (TI))); |
| typedef int DItype __attribute__ ((mode (DI))); |
| typedef unsigned int UDItype __attribute__ ((mode (DI))); |
| |
| struct DIstruct {DItype high, low;}; |
| typedef union |
| { |
| struct DIstruct s; |
| TItype t; |
| } TIunion; |
| |
| static |
| void sub_ddmmss (UDItype *sh, UDItype *sl, UDItype ah, UDItype al, UDItype bh, UDItype bl) |
| { |
| UDItype x; |
| x = al - bl; |
| *sh = ah - bh - (x > al); |
| *sl = x; |
| } |
| |
| int main(void) |
| { |
| TIunion aa, bb, cc; |
| TItype m = 0x1111111111111110ULL; |
| TItype n = 0x1111111111111111ULL; |
| TItype d; |
| |
| aa.s.high = m; |
| aa.s.low = m; |
| bb.s.high = n; |
| bb.s.low = n; |
| |
| |
| sub_ddmmss (&cc.s.high, &cc.s.low, aa.s.high, aa.s.low, bb.s.high, bb.s.low); |
| d = aa.t - bb.t; |
| if (d != cc.t) |
| abort(); |
| cc.t = aa.t -d; |
| if (cc.t != bb.t) |
| abort(); |
| return 0; |
| } |