blob: 167bbe371958ab3b2bdc95d973d67ec21d5edd15 [file] [log] [blame]
Marek Olsakfa6607d2015-02-11 14:26:46 +00001; RUN: llc < %s -march=amdgcn -mcpu=SI -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=SI --check-prefix=GCN %s
2; RUN: llc < %s -march=amdgcn -mcpu=tonga -show-mc-encoding -verify-machineinstrs | FileCheck --check-prefix=VI --check-prefix=GCN %s
Tom Stellard044e4182014-02-06 18:36:34 +00003
4; SMRD load with an immediate offset.
Marek Olsakfa6607d2015-02-11 14:26:46 +00005; GCN-LABEL: {{^}}smrd0:
6; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x1 ; encoding: [0x01
7; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4
Tom Stellard044e4182014-02-06 18:36:34 +00008define void @smrd0(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
9entry:
David Blaikie79e6c742015-02-27 19:29:02 +000010 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000011 %1 = load i32, i32 addrspace(2)* %0
Tom Stellard044e4182014-02-06 18:36:34 +000012 store i32 %1, i32 addrspace(1)* %out
13 ret void
14}
15
16; SMRD load with the largest possible immediate offset.
Marek Olsakfa6607d2015-02-11 14:26:46 +000017; GCN-LABEL: {{^}}smrd1:
18; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff
19; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3fc
Tom Stellard044e4182014-02-06 18:36:34 +000020define void @smrd1(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
21entry:
David Blaikie79e6c742015-02-27 19:29:02 +000022 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 255
David Blaikiea79ac142015-02-27 21:17:42 +000023 %1 = load i32, i32 addrspace(2)* %0
Tom Stellard044e4182014-02-06 18:36:34 +000024 store i32 %1, i32 addrspace(1)* %out
25 ret void
26}
27
28; SMRD load with an offset greater than the largest possible immediate.
Marek Olsakfa6607d2015-02-11 14:26:46 +000029; GCN-LABEL: {{^}}smrd2:
30; SI: s_movk_i32 s[[OFFSET:[0-9]]], 0x400
31; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], s[[OFFSET]] ; encoding: [0x0[[OFFSET]]
32; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x400
33; GCN: s_endpgm
Tom Stellard044e4182014-02-06 18:36:34 +000034define void @smrd2(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
35entry:
David Blaikie79e6c742015-02-27 19:29:02 +000036 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 256
David Blaikiea79ac142015-02-27 21:17:42 +000037 %1 = load i32, i32 addrspace(2)* %0
Tom Stellard044e4182014-02-06 18:36:34 +000038 store i32 %1, i32 addrspace(1)* %out
39 ret void
40}
41
Tom Stellardd6cb8e82014-05-09 16:42:21 +000042; SMRD load with a 64-bit offset
Marek Olsakfa6607d2015-02-11 14:26:46 +000043; GCN-LABEL: {{^}}smrd3:
Tom Stellard83f0bce2015-01-29 16:55:25 +000044; FIXME: There are too many copies here because we don't fold immediates
45; through REG_SEQUENCE
Marek Olsak93df0602015-07-27 18:16:08 +000046; SI: s_load_dwordx2 s[{{[0-9]:[0-9]}}], s[{{[0-9]:[0-9]}}], 0xb ; encoding: [0x0b
Marek Olsakfa6607d2015-02-11 14:26:46 +000047; TODO: Add VI checks
48; GCN: s_endpgm
Tom Stellardd6cb8e82014-05-09 16:42:21 +000049define void @smrd3(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
50entry:
David Blaikie79e6c742015-02-27 19:29:02 +000051 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 4294967296 ; 2 ^ 32
David Blaikiea79ac142015-02-27 21:17:42 +000052 %1 = load i32, i32 addrspace(2)* %0
Tom Stellardd6cb8e82014-05-09 16:42:21 +000053 store i32 %1, i32 addrspace(1)* %out
54 ret void
55}
56
Tom Stellarddee26a22015-08-06 19:28:30 +000057; SMRD load with the largest possible immediate offset on VI
58; GCN-LABEL: {{^}}smrd4:
59; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0xffffc
60; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
61; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xffffc
62define void @smrd4(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
63entry:
64 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 262143
65 %1 = load i32, i32 addrspace(2)* %0
66 store i32 %1, i32 addrspace(1)* %out
67 ret void
68}
69
70; SMRD load with an offset greater than the largest possible immediate on VI
71; GCN-LABEL: {{^}}smrd5:
72; GCN: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
73; SI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
74; VI: s_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
75; GCN: s_endpgm
76define void @smrd5(i32 addrspace(1)* %out, i32 addrspace(2)* %ptr) {
77entry:
78 %0 = getelementptr i32, i32 addrspace(2)* %ptr, i64 262144
79 %1 = load i32, i32 addrspace(2)* %0
80 store i32 %1, i32 addrspace(1)* %out
81 ret void
82}
83
Tom Stellard044e4182014-02-06 18:36:34 +000084; SMRD load using the load.const intrinsic with an immediate offset
Marek Olsakfa6607d2015-02-11 14:26:46 +000085; GCN-LABEL: {{^}}smrd_load_const0:
86; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x4 ; encoding: [0x04
87; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x10
Tom Stellard044e4182014-02-06 18:36:34 +000088define void @smrd_load_const0(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
89main_body:
David Blaikie79e6c742015-02-27 19:29:02 +000090 %20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
David Blaikiea79ac142015-02-27 21:17:42 +000091 %21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
Tom Stellard044e4182014-02-06 18:36:34 +000092 %22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 16)
93 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
94 ret void
95}
96
Tom Stellarde04fd9d2014-08-11 22:18:05 +000097; SMRD load using the load.const intrinsic with the largest possible immediate
98; offset.
Marek Olsakfa6607d2015-02-11 14:26:46 +000099; GCN-LABEL: {{^}}smrd_load_const1:
100; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xff ; encoding: [0xff
101; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x3fc
Tom Stellard044e4182014-02-06 18:36:34 +0000102define void @smrd_load_const1(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
103main_body:
David Blaikie79e6c742015-02-27 19:29:02 +0000104 %20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
David Blaikiea79ac142015-02-27 21:17:42 +0000105 %21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
Tom Stellard044e4182014-02-06 18:36:34 +0000106 %22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1020)
107 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
108 ret void
109}
Tom Stellarde04fd9d2014-08-11 22:18:05 +0000110; SMRD load using the load.const intrinsic with an offset greater than the
111; largets possible immediate.
Tom Stellard044e4182014-02-06 18:36:34 +0000112; immediate offset.
Marek Olsakfa6607d2015-02-11 14:26:46 +0000113; GCN-LABEL: {{^}}smrd_load_const2:
114; SI: s_movk_i32 s[[OFFSET:[0-9]]], 0x400
115; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], s[[OFFSET]] ; encoding: [0x0[[OFFSET]]
116; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0x400
Tom Stellard044e4182014-02-06 18:36:34 +0000117define void @smrd_load_const2(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
118main_body:
David Blaikie79e6c742015-02-27 19:29:02 +0000119 %20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
David Blaikiea79ac142015-02-27 21:17:42 +0000120 %21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
Tom Stellard044e4182014-02-06 18:36:34 +0000121 %22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1024)
122 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
123 ret void
124}
125
Tom Stellarddee26a22015-08-06 19:28:30 +0000126; SMRD load with the largest possible immediate offset on VI
127; GCN-LABEL: {{^}}smrd_load_const3:
128; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0xffffc
129; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
130; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], 0xffffc
131define void @smrd_load_const3(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
132main_body:
133 %20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
134 %21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
135 %22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1048572)
136 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
137 ret void
138}
139
140; SMRD load with an offset greater than the largest possible immediate on VI
141; GCN-LABEL: {{^}}smrd_load_const4:
142; GCN: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000
143; SI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
144; VI: s_buffer_load_dword s{{[0-9]}}, s[{{[0-9]:[0-9]}}], [[OFFSET]]
145; GCN: s_endpgm
146define void @smrd_load_const4(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg, <2 x i32>, <2 x i32>, <2 x i32>, <3 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, float, float, float, float, float, float, float, float, float) #0 {
147main_body:
148 %20 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %0, i32 0
149 %21 = load <16 x i8>, <16 x i8> addrspace(2)* %20
150 %22 = call float @llvm.SI.load.const(<16 x i8> %21, i32 1048576)
151 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %22, float %22, float %22, float %22)
152 ret void
153}
154
Tom Stellard044e4182014-02-06 18:36:34 +0000155; Function Attrs: nounwind readnone
156declare float @llvm.SI.load.const(<16 x i8>, i32) #1
157
158declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float)
159
160attributes #0 = { "ShaderType"="0" }
161attributes #1 = { nounwind readnone }