1f4a2713aSLionel Sambuc // REQUIRES: nvptx-registered-target
2f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple nvptx-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s
3f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s
4f4a2713aSLionel Sambuc
read_tid()5f4a2713aSLionel Sambuc int read_tid() {
6f4a2713aSLionel Sambuc
7f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.tid.x()
8f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.tid.y()
9f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.tid.z()
10f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.tid.w()
11f4a2713aSLionel Sambuc
12f4a2713aSLionel Sambuc int x = __builtin_ptx_read_tid_x();
13f4a2713aSLionel Sambuc int y = __builtin_ptx_read_tid_y();
14f4a2713aSLionel Sambuc int z = __builtin_ptx_read_tid_z();
15f4a2713aSLionel Sambuc int w = __builtin_ptx_read_tid_w();
16f4a2713aSLionel Sambuc
17f4a2713aSLionel Sambuc return x + y + z + w;
18f4a2713aSLionel Sambuc
19f4a2713aSLionel Sambuc }
20f4a2713aSLionel Sambuc
read_ntid()21f4a2713aSLionel Sambuc int read_ntid() {
22f4a2713aSLionel Sambuc
23f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ntid.x()
24f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ntid.y()
25f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ntid.z()
26f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ntid.w()
27f4a2713aSLionel Sambuc
28f4a2713aSLionel Sambuc int x = __builtin_ptx_read_ntid_x();
29f4a2713aSLionel Sambuc int y = __builtin_ptx_read_ntid_y();
30f4a2713aSLionel Sambuc int z = __builtin_ptx_read_ntid_z();
31f4a2713aSLionel Sambuc int w = __builtin_ptx_read_ntid_w();
32f4a2713aSLionel Sambuc
33f4a2713aSLionel Sambuc return x + y + z + w;
34f4a2713aSLionel Sambuc
35f4a2713aSLionel Sambuc }
36f4a2713aSLionel Sambuc
read_ctaid()37f4a2713aSLionel Sambuc int read_ctaid() {
38f4a2713aSLionel Sambuc
39f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ctaid.x()
40f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ctaid.y()
41f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ctaid.z()
42f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.ctaid.w()
43f4a2713aSLionel Sambuc
44f4a2713aSLionel Sambuc int x = __builtin_ptx_read_ctaid_x();
45f4a2713aSLionel Sambuc int y = __builtin_ptx_read_ctaid_y();
46f4a2713aSLionel Sambuc int z = __builtin_ptx_read_ctaid_z();
47f4a2713aSLionel Sambuc int w = __builtin_ptx_read_ctaid_w();
48f4a2713aSLionel Sambuc
49f4a2713aSLionel Sambuc return x + y + z + w;
50f4a2713aSLionel Sambuc
51f4a2713aSLionel Sambuc }
52f4a2713aSLionel Sambuc
read_nctaid()53f4a2713aSLionel Sambuc int read_nctaid() {
54f4a2713aSLionel Sambuc
55f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nctaid.x()
56f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nctaid.y()
57f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nctaid.z()
58f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nctaid.w()
59f4a2713aSLionel Sambuc
60f4a2713aSLionel Sambuc int x = __builtin_ptx_read_nctaid_x();
61f4a2713aSLionel Sambuc int y = __builtin_ptx_read_nctaid_y();
62f4a2713aSLionel Sambuc int z = __builtin_ptx_read_nctaid_z();
63f4a2713aSLionel Sambuc int w = __builtin_ptx_read_nctaid_w();
64f4a2713aSLionel Sambuc
65f4a2713aSLionel Sambuc return x + y + z + w;
66f4a2713aSLionel Sambuc
67f4a2713aSLionel Sambuc }
68f4a2713aSLionel Sambuc
read_ids()69f4a2713aSLionel Sambuc int read_ids() {
70f4a2713aSLionel Sambuc
71f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.laneid()
72f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.warpid()
73f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nwarpid()
74f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.smid()
75f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.nsmid()
76f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.gridid()
77f4a2713aSLionel Sambuc
78f4a2713aSLionel Sambuc int a = __builtin_ptx_read_laneid();
79f4a2713aSLionel Sambuc int b = __builtin_ptx_read_warpid();
80f4a2713aSLionel Sambuc int c = __builtin_ptx_read_nwarpid();
81f4a2713aSLionel Sambuc int d = __builtin_ptx_read_smid();
82f4a2713aSLionel Sambuc int e = __builtin_ptx_read_nsmid();
83f4a2713aSLionel Sambuc int f = __builtin_ptx_read_gridid();
84f4a2713aSLionel Sambuc
85f4a2713aSLionel Sambuc return a + b + c + d + e + f;
86f4a2713aSLionel Sambuc
87f4a2713aSLionel Sambuc }
88f4a2713aSLionel Sambuc
read_lanemasks()89f4a2713aSLionel Sambuc int read_lanemasks() {
90f4a2713aSLionel Sambuc
91f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.lanemask.eq()
92f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.lanemask.le()
93f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.lanemask.lt()
94f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.lanemask.ge()
95f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.lanemask.gt()
96f4a2713aSLionel Sambuc
97f4a2713aSLionel Sambuc int a = __builtin_ptx_read_lanemask_eq();
98f4a2713aSLionel Sambuc int b = __builtin_ptx_read_lanemask_le();
99f4a2713aSLionel Sambuc int c = __builtin_ptx_read_lanemask_lt();
100f4a2713aSLionel Sambuc int d = __builtin_ptx_read_lanemask_ge();
101f4a2713aSLionel Sambuc int e = __builtin_ptx_read_lanemask_gt();
102f4a2713aSLionel Sambuc
103f4a2713aSLionel Sambuc return a + b + c + d + e;
104f4a2713aSLionel Sambuc
105f4a2713aSLionel Sambuc }
106f4a2713aSLionel Sambuc
107f4a2713aSLionel Sambuc
read_clocks()108f4a2713aSLionel Sambuc long read_clocks() {
109f4a2713aSLionel Sambuc
110f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.clock()
111f4a2713aSLionel Sambuc // CHECK: call i64 @llvm.ptx.read.clock64()
112f4a2713aSLionel Sambuc
113f4a2713aSLionel Sambuc int a = __builtin_ptx_read_clock();
114f4a2713aSLionel Sambuc long b = __builtin_ptx_read_clock64();
115f4a2713aSLionel Sambuc
116f4a2713aSLionel Sambuc return (long)a + b;
117f4a2713aSLionel Sambuc
118f4a2713aSLionel Sambuc }
119f4a2713aSLionel Sambuc
read_pms()120f4a2713aSLionel Sambuc int read_pms() {
121f4a2713aSLionel Sambuc
122f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.pm0()
123f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.pm1()
124f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.pm2()
125f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.ptx.read.pm3()
126f4a2713aSLionel Sambuc
127f4a2713aSLionel Sambuc int a = __builtin_ptx_read_pm0();
128f4a2713aSLionel Sambuc int b = __builtin_ptx_read_pm1();
129f4a2713aSLionel Sambuc int c = __builtin_ptx_read_pm2();
130f4a2713aSLionel Sambuc int d = __builtin_ptx_read_pm3();
131f4a2713aSLionel Sambuc
132f4a2713aSLionel Sambuc return a + b + c + d;
133f4a2713aSLionel Sambuc
134f4a2713aSLionel Sambuc }
135f4a2713aSLionel Sambuc
sync()136f4a2713aSLionel Sambuc void sync() {
137f4a2713aSLionel Sambuc
138f4a2713aSLionel Sambuc // CHECK: call void @llvm.ptx.bar.sync(i32 0)
139f4a2713aSLionel Sambuc
140f4a2713aSLionel Sambuc __builtin_ptx_bar_sync(0);
141f4a2713aSLionel Sambuc
142f4a2713aSLionel Sambuc }
143f4a2713aSLionel Sambuc
144f4a2713aSLionel Sambuc
145f4a2713aSLionel Sambuc // NVVM intrinsics
146f4a2713aSLionel Sambuc
147f4a2713aSLionel Sambuc // The idea is not to test all intrinsics, just that Clang is recognizing the
148f4a2713aSLionel Sambuc // builtins defined in BuiltinsNVPTX.def
nvvm_math(float f1,float f2,double d1,double d2)149f4a2713aSLionel Sambuc void nvvm_math(float f1, float f2, double d1, double d2) {
150f4a2713aSLionel Sambuc // CHECK: call float @llvm.nvvm.fmax.f
151f4a2713aSLionel Sambuc float t1 = __nvvm_fmax_f(f1, f2);
152f4a2713aSLionel Sambuc // CHECK: call float @llvm.nvvm.fmin.f
153f4a2713aSLionel Sambuc float t2 = __nvvm_fmin_f(f1, f2);
154f4a2713aSLionel Sambuc // CHECK: call float @llvm.nvvm.sqrt.rn.f
155f4a2713aSLionel Sambuc float t3 = __nvvm_sqrt_rn_f(f1);
156f4a2713aSLionel Sambuc // CHECK: call float @llvm.nvvm.rcp.rn.f
157f4a2713aSLionel Sambuc float t4 = __nvvm_rcp_rn_f(f2);
158*0a6a1f1dSLionel Sambuc // CHECK: call float @llvm.nvvm.add.rn.f
159*0a6a1f1dSLionel Sambuc float t5 = __nvvm_add_rn_f(f1, f2);
160f4a2713aSLionel Sambuc
161f4a2713aSLionel Sambuc // CHECK: call double @llvm.nvvm.fmax.d
162f4a2713aSLionel Sambuc double td1 = __nvvm_fmax_d(d1, d2);
163f4a2713aSLionel Sambuc // CHECK: call double @llvm.nvvm.fmin.d
164f4a2713aSLionel Sambuc double td2 = __nvvm_fmin_d(d1, d2);
165f4a2713aSLionel Sambuc // CHECK: call double @llvm.nvvm.sqrt.rn.d
166f4a2713aSLionel Sambuc double td3 = __nvvm_sqrt_rn_d(d1);
167f4a2713aSLionel Sambuc // CHECK: call double @llvm.nvvm.rcp.rn.d
168f4a2713aSLionel Sambuc double td4 = __nvvm_rcp_rn_d(d2);
169f4a2713aSLionel Sambuc
170f4a2713aSLionel Sambuc // CHECK: call void @llvm.nvvm.membar.cta()
171f4a2713aSLionel Sambuc __nvvm_membar_cta();
172f4a2713aSLionel Sambuc // CHECK: call void @llvm.nvvm.membar.gl()
173f4a2713aSLionel Sambuc __nvvm_membar_gl();
174f4a2713aSLionel Sambuc // CHECK: call void @llvm.nvvm.membar.sys()
175f4a2713aSLionel Sambuc __nvvm_membar_sys();
176f4a2713aSLionel Sambuc // CHECK: call void @llvm.nvvm.barrier0()
177f4a2713aSLionel Sambuc __nvvm_bar0();
178f4a2713aSLionel Sambuc }
179