summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/spu/subti3.c
blob: 4112c958cc380e12a1fdd25b01be5b0154cee7c8 (plain)
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
/* { 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;
}