1 // REQUIRES: systemz-registered-target
2 // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s
3 // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm -x c++ %s -o - | FileCheck %s
10 struct __htm_tdb global_tdb
;
12 void test_htm1(struct __htm_tdb
*tdb
, int reg
, int *mem
, uint64_t *mem64
) {
13 // CHECK-LABEL: test_htm1
15 __builtin_tbegin ((void *)0);
16 // CHECK: call i32 @llvm.s390.tbegin(ptr null, i32 65292)
17 __builtin_tbegin ((void *)0x12345678);
18 // CHECK: call i32 @llvm.s390.tbegin(ptr inttoptr (i64 305419896 to ptr), i32 65292)
19 __builtin_tbegin (tdb
);
20 // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292)
21 __builtin_tbegin (&global_tdb
);
22 // CHECK: call i32 @llvm.s390.tbegin(ptr @global_tdb, i32 65292)
24 __builtin_tbegin_nofloat ((void *)0);
25 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292)
26 __builtin_tbegin_nofloat ((void *)0x12345678);
27 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr inttoptr (i64 305419896 to ptr), i32 65292)
28 __builtin_tbegin_nofloat (tdb
);
29 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292)
30 __builtin_tbegin_nofloat (&global_tdb
);
31 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr @global_tdb, i32 65292)
33 __builtin_tbegin_retry ((void *)0, 6);
34 // CHECK: call i32 @llvm.s390.tbegin(ptr null, i32 65292)
35 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
36 __builtin_tbegin_retry ((void *)0x12345678, 6);
37 // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292)
38 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
39 __builtin_tbegin_retry (tdb
, 6);
40 // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292)
41 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
42 __builtin_tbegin_retry (&global_tdb
, 6);
43 // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292)
44 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
46 __builtin_tbegin_retry_nofloat ((void *)0, 6);
47 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292)
48 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
49 __builtin_tbegin_retry_nofloat ((void *)0x12345678, 6);
50 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292)
51 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
52 __builtin_tbegin_retry_nofloat (tdb
, 6);
53 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292)
54 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
55 __builtin_tbegin_retry_nofloat (&global_tdb
, 6);
56 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292)
57 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
60 // CHECK: call void @llvm.s390.tbeginc(ptr null, i32 65288)
62 __builtin_tabort (256);
63 // CHECK: call void @llvm.s390.tabort(i64 256)
64 __builtin_tabort (-1);
65 // CHECK: call void @llvm.s390.tabort(i64 -1)
66 __builtin_tabort (reg
);
67 // CHECK: call void @llvm.s390.tabort(i64 %{{.*}})
70 // CHECK: call i32 @llvm.s390.tend()
72 int n
= __builtin_tx_nesting_depth();
73 // CHECK: call i32 @llvm.s390.etnd()
75 __builtin_non_tx_store (mem64
, 0);
76 // CHECK: call void @llvm.s390.ntstg(i64 0, ptr %{{.*}})
77 const uint64_t val_var
= 0x1122334455667788;
78 __builtin_non_tx_store (mem64
, val_var
);
79 // CHECK: call void @llvm.s390.ntstg(i64 1234605616436508552, ptr %{{.*}})
80 __builtin_non_tx_store (mem64
, (uint64_t)reg
);
81 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}})
82 __builtin_non_tx_store (mem64
, g
);
83 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}})
84 __builtin_non_tx_store ((uint64_t *)0, 0);
85 // CHECK: call void @llvm.s390.ntstg(i64 0, ptr null)
86 __builtin_non_tx_store ((uint64_t *)0x12345678, 0);
87 // CHECK: call void @llvm.s390.ntstg(i64 0, ptr inttoptr (i64 305419896 to ptr))
88 __builtin_non_tx_store (&g
, 23);
89 // CHECK: call void @llvm.s390.ntstg(i64 23, ptr @g)
90 __builtin_non_tx_store (&g
, reg
);
91 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g)
92 __builtin_non_tx_store (&g
, *mem
);
93 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g)
94 __builtin_non_tx_store (&g
, global
);
95 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g)
97 __builtin_tx_assist (0);
98 // CHECK: call void @llvm.s390.ppa.txassist(i32 0)
99 __builtin_tx_assist (1);
100 // CHECK: call void @llvm.s390.ppa.txassist(i32 1)
101 __builtin_tx_assist (reg
);
102 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
103 __builtin_tx_assist (*mem
);
104 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
105 __builtin_tx_assist (global
);
106 // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
109 #include <htmxlintrin.h>
111 void test_htmxl1(void) {
112 // CHECK-LABEL: test_htmxl1
114 struct __htm_tdb tdb_struct
;
115 void * const tdb
= &tdb_struct
;
119 result
= __TM_simple_begin ();
120 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292)
121 result
= __TM_begin (tdb
);
122 // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292)
123 result
= __TM_end ();
124 // CHECK: call i32 @llvm.s390.tend()
126 // CHECK: call void @llvm.s390.tabort(i64 256)
127 __TM_named_abort (42);
128 // CHECK: call void @llvm.s390.tabort(i64 %{{.*}})
129 __TM_non_transactional_store (&g
, 42);
130 // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}})
131 result
= __TM_nesting_depth (tdb
);
132 // CHECK: call i32 @llvm.s390.etnd()
134 result
= __TM_is_user_abort (tdb
);
135 result
= __TM_is_named_user_abort (tdb
, &code
);
136 result
= __TM_is_illegal (tdb
);
137 result
= __TM_is_footprint_exceeded (tdb
);
138 result
= __TM_is_nested_too_deep (tdb
);
139 result
= __TM_is_conflict (tdb
);
140 result
= __TM_is_failure_persistent (result
);
141 result
= __TM_failure_address (tdb
);
142 result
= __TM_failure_code (tdb
);
145 void test_eh_return_data_regno() {
147 res
= __builtin_eh_return_data_regno(0); // CHECK: store volatile i32 6
148 res
= __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 7
149 res
= __builtin_eh_return_data_regno(2); // CHECK: store volatile i32 8
150 res
= __builtin_eh_return_data_regno(3); // CHECK: store volatile i32 9