xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/sign_extend.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i1_to_i32:
5*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64
6*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
7*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i1_to_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
8*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, %b
9*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %cmp to i32
10*9880d681SAndroid Build Coastguard Worker  store i32 %sext, i32 addrspace(1)* %out, align 4
11*9880d681SAndroid Build Coastguard Worker  ret void
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_s_sext_i32_to_i64:
15*9880d681SAndroid Build Coastguard Worker; GCN: s_ashr_i32
16*9880d681SAndroid Build Coastguard Worker; GCN: s_endpg
17*9880d681SAndroid Build Coastguard Workerdefine void @test_s_sext_i32_to_i64(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) nounwind {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %a, %b
20*9880d681SAndroid Build Coastguard Worker  %add = add i32 %mul, %c
21*9880d681SAndroid Build Coastguard Worker  %sext = sext i32 %add to i64
22*9880d681SAndroid Build Coastguard Worker  store i64 %sext, i64 addrspace(1)* %out, align 8
23*9880d681SAndroid Build Coastguard Worker  ret void
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i1_to_i64:
27*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64 v[[LOREG:[0-9]+]], 0, -1, vcc
28*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 v[[HIREG:[0-9]+]], v[[LOREG]]
29*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[LOREG]]:[[HIREG]]{{\]}}
30*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
31*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i1_to_i64(i64 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
32*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, %b
33*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %cmp to i64
34*9880d681SAndroid Build Coastguard Worker  store i64 %sext, i64 addrspace(1)* %out, align 8
35*9880d681SAndroid Build Coastguard Worker  ret void
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i32_to_i64:
39*9880d681SAndroid Build Coastguard Worker; GCN: s_ashr_i32
40*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
41*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i32_to_i64(i64 addrspace(1)* %out, i32 %a) nounwind {
42*9880d681SAndroid Build Coastguard Worker  %sext = sext i32 %a to i64
43*9880d681SAndroid Build Coastguard Worker  store i64 %sext, i64 addrspace(1)* %out, align 8
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_i32_to_i64:
48*9880d681SAndroid Build Coastguard Worker; GCN: v_ashr
49*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
50*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_i32_to_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
51*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32 addrspace(1)* %in, align 4
52*9880d681SAndroid Build Coastguard Worker  %sext = sext i32 %val to i64
53*9880d681SAndroid Build Coastguard Worker  store i64 %sext, i64 addrspace(1)* %out, align 8
54*9880d681SAndroid Build Coastguard Worker  ret void
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i16_to_i64:
58*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
59*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i16_to_i64(i64 addrspace(1)* %out, i16 %a) nounwind {
60*9880d681SAndroid Build Coastguard Worker  %sext = sext i16 %a to i64
61*9880d681SAndroid Build Coastguard Worker  store i64 %sext, i64 addrspace(1)* %out, align 8
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_v4i8_to_v4i32:
66*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL:s[0-9]+]]
67*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i8 [[EXT0:s[0-9]+]], [[VAL]]
68*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_bfe_i32 [[EXT1:s[0-9]+]], [[VAL]], 0x80008
69*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_bfe_i32 [[EXT2:s[0-9]+]], [[VAL]], 0x80010
70*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i32 [[EXT3:s[0-9]+]], [[VAL]], 24
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT0:v[0-9]+]], [[EXT0]]
73*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT1:v[0-9]+]], [[EXT1]]
74*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT2:v[0-9]+]], [[EXT2]]
75*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT3:v[0-9]+]], [[EXT3]]
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT0]]
78*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT1]]
79*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT2]]
80*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT3]]
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
83*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_v4i8_to_v4i32(i32 addrspace(1)* %out, i32 %a) nounwind {
84*9880d681SAndroid Build Coastguard Worker  %cast = bitcast i32 %a to <4 x i8>
85*9880d681SAndroid Build Coastguard Worker  %ext = sext <4 x i8> %cast to <4 x i32>
86*9880d681SAndroid Build Coastguard Worker  %elt0 = extractelement <4 x i32> %ext, i32 0
87*9880d681SAndroid Build Coastguard Worker  %elt1 = extractelement <4 x i32> %ext, i32 1
88*9880d681SAndroid Build Coastguard Worker  %elt2 = extractelement <4 x i32> %ext, i32 2
89*9880d681SAndroid Build Coastguard Worker  %elt3 = extractelement <4 x i32> %ext, i32 3
90*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt0, i32 addrspace(1)* %out
91*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt1, i32 addrspace(1)* %out
92*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt2, i32 addrspace(1)* %out
93*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt3, i32 addrspace(1)* %out
94*9880d681SAndroid Build Coastguard Worker  ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_v4i8_to_v4i32:
98*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]]
99*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT0:v[0-9]+]], [[VAL]], 0, 8
100*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT1:v[0-9]+]], [[VAL]], 8, 8
101*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT2:v[0-9]+]], [[VAL]], 16, 8
102*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 [[EXT3:v[0-9]+]], 24, [[VAL]]
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT0]]
105*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT1]]
106*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT2]]
107*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT3]]
108*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_v4i8_to_v4i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
109*9880d681SAndroid Build Coastguard Worker  %a = load i32, i32 addrspace(1)* %in
110*9880d681SAndroid Build Coastguard Worker  %cast = bitcast i32 %a to <4 x i8>
111*9880d681SAndroid Build Coastguard Worker  %ext = sext <4 x i8> %cast to <4 x i32>
112*9880d681SAndroid Build Coastguard Worker  %elt0 = extractelement <4 x i32> %ext, i32 0
113*9880d681SAndroid Build Coastguard Worker  %elt1 = extractelement <4 x i32> %ext, i32 1
114*9880d681SAndroid Build Coastguard Worker  %elt2 = extractelement <4 x i32> %ext, i32 2
115*9880d681SAndroid Build Coastguard Worker  %elt3 = extractelement <4 x i32> %ext, i32 3
116*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt0, i32 addrspace(1)* %out
117*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt1, i32 addrspace(1)* %out
118*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt2, i32 addrspace(1)* %out
119*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt3, i32 addrspace(1)* %out
120*9880d681SAndroid Build Coastguard Worker  ret void
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; FIXME: s_bfe_i64
124*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_v4i16_to_v4i32:
125*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 48
126*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i32 s{{[0-9]+}}, s{{[0-9]+}}, 16
127*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i16
128*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i16
129*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
130*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_v4i16_to_v4i32(i32 addrspace(1)* %out, i64 %a) nounwind {
131*9880d681SAndroid Build Coastguard Worker  %cast = bitcast i64 %a to <4 x i16>
132*9880d681SAndroid Build Coastguard Worker  %ext = sext <4 x i16> %cast to <4 x i32>
133*9880d681SAndroid Build Coastguard Worker  %elt0 = extractelement <4 x i32> %ext, i32 0
134*9880d681SAndroid Build Coastguard Worker  %elt1 = extractelement <4 x i32> %ext, i32 1
135*9880d681SAndroid Build Coastguard Worker  %elt2 = extractelement <4 x i32> %ext, i32 2
136*9880d681SAndroid Build Coastguard Worker  %elt3 = extractelement <4 x i32> %ext, i32 3
137*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt0, i32 addrspace(1)* %out
138*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt1, i32 addrspace(1)* %out
139*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt2, i32 addrspace(1)* %out
140*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt3, i32 addrspace(1)* %out
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_v4i16_to_v4i32:
145*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_ashr_i64 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, 48
146*9880d681SAndroid Build Coastguard Worker; VI-DAG: v_ashrrev_i64 v{{\[[0-9]+:[0-9]+\]}}, 48, v{{\[[0-9]+:[0-9]+\]}}
147*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 v{{[0-9]+}}, 16, v{{[0-9]+}}
148*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 v{{[0-9]+}}, 16, v{{[0-9]+}}
149*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 16
150*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 16
151*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
152*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_v4i16_to_v4i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) nounwind {
153*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %in
154*9880d681SAndroid Build Coastguard Worker  %cast = bitcast i64 %a to <4 x i16>
155*9880d681SAndroid Build Coastguard Worker  %ext = sext <4 x i16> %cast to <4 x i32>
156*9880d681SAndroid Build Coastguard Worker  %elt0 = extractelement <4 x i32> %ext, i32 0
157*9880d681SAndroid Build Coastguard Worker  %elt1 = extractelement <4 x i32> %ext, i32 1
158*9880d681SAndroid Build Coastguard Worker  %elt2 = extractelement <4 x i32> %ext, i32 2
159*9880d681SAndroid Build Coastguard Worker  %elt3 = extractelement <4 x i32> %ext, i32 3
160*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt0, i32 addrspace(1)* %out
161*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt1, i32 addrspace(1)* %out
162*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt2, i32 addrspace(1)* %out
163*9880d681SAndroid Build Coastguard Worker  store volatile i32 %elt3, i32 addrspace(1)* %out
164*9880d681SAndroid Build Coastguard Worker  ret void
165*9880d681SAndroid Build Coastguard Worker}
166