1 /* This checks the availability of the low-level builtins introduced
2 for transactional execution. */
4 /* { dg-do compile } */
5 /* { dg-options "-O3 -march=zEC12 -mzarch" } */
12 struct __htm_tdb global_tdb
;
15 foo (struct __htm_tdb
* tdb
, int reg
, int *mem
, uint64_t *mem64
)
21 __builtin_tbegin ((void *)0);
22 __builtin_tbegin ((void *)-99999);
23 __builtin_tbegin ((void *)99999);
24 while (__builtin_tbegin ((void *)0) != 0)
27 cc
= __builtin_tbegin ((void *)0x12345678);
28 cc
= __builtin_tbegin (tdb
);
29 cc
= __builtin_tbegin (&global_tdb
);
30 cc
= __builtin_tbegin ((void *)(long)(reg
+ 0x12345678));
31 cc
= __builtin_tbegin ((void *)(long)(reg
));
33 __builtin_tbegin_nofloat ((void *)0);
34 __builtin_tbegin_nofloat ((void *)-99999);
35 __builtin_tbegin_nofloat ((void *)99999);
36 cc
= __builtin_tbegin_nofloat ((void *)0x12345678);
37 cc
= __builtin_tbegin_nofloat (tdb
);
38 cc
= __builtin_tbegin_nofloat (&global_tdb
);
39 cc
= __builtin_tbegin_nofloat ((void *)(long)(reg
+ 0x12345678));
40 cc
= __builtin_tbegin_nofloat ((void *)(long)(reg
));
42 __builtin_tbegin_retry ((void *)0, 0);
43 cc
= __builtin_tbegin_retry ((void *)0, 1);
44 cc
= __builtin_tbegin_retry ((void *)0, -1);
45 cc
= __builtin_tbegin_retry ((void *)0, 42);
46 cc
= __builtin_tbegin_retry ((void *)0, reg
);
47 cc
= __builtin_tbegin_retry ((void *)0, *mem
);
48 cc
= __builtin_tbegin_retry ((void *)0, global
);
49 cc
= __builtin_tbegin_retry (tdb
, 42);
50 cc
= __builtin_tbegin_retry (&global_tdb
, 42);
51 cc
= __builtin_tbegin_retry ((void *)0x12345678, global
);
52 cc
= __builtin_tbegin_retry (
53 (void *)(long) (reg
+ 0x12345678), global
+ 1);
54 cc
= __builtin_tbegin_retry (
55 (void *)(long)(reg
), global
- 1);
57 __builtin_tbegin_retry_nofloat ((void *)0, 0);
58 cc
= __builtin_tbegin_retry_nofloat ((void *)0, 1);
59 cc
= __builtin_tbegin_retry_nofloat ((void *)0, -1);
60 cc
= __builtin_tbegin_retry_nofloat ((void *)0, 42);
61 cc
= __builtin_tbegin_retry_nofloat ((void *)0, reg
);
62 cc
= __builtin_tbegin_retry_nofloat ((void *)0, *mem
);
63 cc
= __builtin_tbegin_retry_nofloat ((void *)0, global
);
64 cc
= __builtin_tbegin_retry_nofloat (tdb
, 42);
65 cc
= __builtin_tbegin_retry_nofloat (&global_tdb
, 42);
66 cc
= __builtin_tbegin_retry_nofloat ((void *)0x12345678, global
);
67 cc
= __builtin_tbegin_retry_nofloat (
68 (void *)(long) (reg
+ 0x12345678), global
+ 1);
69 cc
= __builtin_tbegin_retry_nofloat (
70 (void *)(long)(reg
), global
- 1);
74 __builtin_tx_nesting_depth ();
75 n
= __builtin_tx_nesting_depth ();
77 __builtin_non_tx_store (mem64
, 0);
79 const uint64_t val_var
= 0x1122334455667788;
81 __builtin_non_tx_store (mem64
, val_var
);
83 __builtin_non_tx_store (mem64
, (uint64_t)reg
);
84 __builtin_non_tx_store (mem64
, g
);
85 __builtin_non_tx_store ((uint64_t *)0, 0);
86 __builtin_non_tx_store ((uint64_t *)0x12345678, 0);
87 __builtin_non_tx_store (&g
, 23);
88 __builtin_non_tx_store (&g
, reg
);
89 __builtin_non_tx_store (&g
, *mem
);
90 __builtin_non_tx_store (&g
, global
);
94 __builtin_tx_assist (0);
95 __builtin_tx_assist (1);
96 __builtin_tx_assist (reg
);
97 __builtin_tx_assist (*mem
);
98 __builtin_tx_assist (global
);
101 /* The taborts must go into separate function since they are
107 __builtin_tabort (256);
113 __builtin_tabort (reg
);
119 /* { dg-final { scan-assembler-times "tabort\t255" 1 } } */
120 __builtin_tabort (reg
+ 255);
126 __builtin_tabort (*mem
);
132 __builtin_tabort (global
);
138 /* Here global + 255 gets reloaded into a reg. Better would be to
139 just reload global or *mem and get the +255 for free as address
141 __builtin_tabort (*mem
+ 255);
147 __builtin_tabort (global
+ 255);
153 __builtin_tabort (-1);
157 /* Make sure the tdb NULL argument ends up as immediate value in the
159 /* { dg-final { scan-assembler-times "tbegin\t0," 17 } } */
160 /* { dg-final { scan-assembler-times "tbegin\t" 41 } } */
161 /* Check number of occurences of certain instructions. */
162 /* { dg-final { scan-assembler-times "tbeginc\t" 1 } } */
163 /* { dg-final { scan-assembler-times "tabort\t" 8 } } */
164 /* { dg-final { scan-assembler "ppa\t" } } */