1 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s 2 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s| FileCheck -check-prefix=GCN -check-prefix=SI %s 3 4 ;;;==========================================================================;;; 5 ;; 16-bit integer comparisons 6 ;;;==========================================================================;;; 7 8 ; GCN-LABEL: {{^}}i16_eq: 9 ; VI: v_cmp_eq_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 10 ; SI: v_cmp_eq_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 11 define amdgpu_kernel void @i16_eq(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 12 entry: 13 %tid = call i32 @llvm.amdgcn.workitem.id.x() 14 %tid.ext = sext i32 %tid to i64 15 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 16 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 17 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 18 %a = load i16, i16 addrspace(1)* %a.gep 19 %b = load i16, i16 addrspace(1)* %b.gep 20 %tmp0 = icmp eq i16 %a, %b 21 %tmp1 = sext i1 %tmp0 to i32 22 store i32 %tmp1, i32 addrspace(1)* %out.gep 23 ret void 24 } 25 26 ; GCN-LABEL: {{^}}i16_ne: 27 ; VI: v_cmp_ne_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 28 ; SI: v_cmp_ne_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 29 define amdgpu_kernel void @i16_ne(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 30 entry: 31 %tid = call i32 @llvm.amdgcn.workitem.id.x() 32 %tid.ext = sext i32 %tid to i64 33 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 34 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 35 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 36 %a = load i16, i16 addrspace(1)* %a.gep 37 %b = load i16, i16 addrspace(1)* %b.gep 38 %tmp0 = icmp ne i16 %a, %b 39 %tmp1 = sext i1 %tmp0 to i32 40 store i32 %tmp1, i32 addrspace(1)* %out.gep 41 ret void 42 } 43 44 ; GCN-LABEL: {{^}}i16_ugt: 45 ; VI: v_cmp_gt_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 46 ; SI: v_cmp_gt_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 47 define amdgpu_kernel void @i16_ugt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 48 entry: 49 %tid = call i32 @llvm.amdgcn.workitem.id.x() 50 %tid.ext = sext i32 %tid to i64 51 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 52 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 53 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 54 %a = load i16, i16 addrspace(1)* %a.gep 55 %b = load i16, i16 addrspace(1)* %b.gep 56 %tmp0 = icmp ugt i16 %a, %b 57 %tmp1 = sext i1 %tmp0 to i32 58 store i32 %tmp1, i32 addrspace(1)* %out.gep 59 ret void 60 } 61 62 ; GCN-LABEL: {{^}}i16_uge: 63 ; VI: v_cmp_ge_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 64 ; SI: v_cmp_ge_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 65 define amdgpu_kernel void @i16_uge(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 66 entry: 67 %tid = call i32 @llvm.amdgcn.workitem.id.x() 68 %tid.ext = sext i32 %tid to i64 69 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 70 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 71 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 72 %a = load i16, i16 addrspace(1)* %a.gep 73 %b = load i16, i16 addrspace(1)* %b.gep 74 %tmp0 = icmp uge i16 %a, %b 75 %tmp1 = sext i1 %tmp0 to i32 76 store i32 %tmp1, i32 addrspace(1)* %out.gep 77 ret void 78 } 79 80 ; GCN-LABEL: {{^}}i16_ult: 81 ; VI: v_cmp_lt_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 82 ; SI: v_cmp_lt_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 83 define amdgpu_kernel void @i16_ult(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 84 entry: 85 %tid = call i32 @llvm.amdgcn.workitem.id.x() 86 %tid.ext = sext i32 %tid to i64 87 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 88 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 89 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 90 %a = load i16, i16 addrspace(1)* %a.gep 91 %b = load i16, i16 addrspace(1)* %b.gep 92 %tmp0 = icmp ult i16 %a, %b 93 %tmp1 = sext i1 %tmp0 to i32 94 store i32 %tmp1, i32 addrspace(1)* %out.gep 95 ret void 96 } 97 98 ; GCN-LABEL: {{^}}i16_ule: 99 ; VI: v_cmp_le_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 100 ; SI: v_cmp_le_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 101 define amdgpu_kernel void @i16_ule(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 102 entry: 103 %tid = call i32 @llvm.amdgcn.workitem.id.x() 104 %tid.ext = sext i32 %tid to i64 105 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 106 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 107 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 108 %a = load i16, i16 addrspace(1)* %a.gep 109 %b = load i16, i16 addrspace(1)* %b.gep 110 %tmp0 = icmp ule i16 %a, %b 111 %tmp1 = sext i1 %tmp0 to i32 112 store i32 %tmp1, i32 addrspace(1)* %out.gep 113 ret void 114 115 } 116 117 ; GCN-LABEL: {{^}}i16_sgt: 118 ; VI: v_cmp_gt_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 119 ; SI: v_cmp_gt_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 120 define amdgpu_kernel void @i16_sgt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 121 entry: 122 %tid = call i32 @llvm.amdgcn.workitem.id.x() 123 %tid.ext = sext i32 %tid to i64 124 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 125 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 126 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 127 %a = load i16, i16 addrspace(1)* %a.gep 128 %b = load i16, i16 addrspace(1)* %b.gep 129 %tmp0 = icmp sgt i16 %a, %b 130 %tmp1 = sext i1 %tmp0 to i32 131 store i32 %tmp1, i32 addrspace(1)* %out.gep 132 ret void 133 } 134 135 ; GCN-LABEL: {{^}}i16_sge: 136 ; VI: v_cmp_ge_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 137 ; SI: v_cmp_ge_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 138 define amdgpu_kernel void @i16_sge(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 139 entry: 140 %tid = call i32 @llvm.amdgcn.workitem.id.x() 141 %tid.ext = sext i32 %tid to i64 142 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 143 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 144 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 145 %a = load i16, i16 addrspace(1)* %a.gep 146 %b = load i16, i16 addrspace(1)* %b.gep 147 %tmp0 = icmp sge i16 %a, %b 148 %tmp1 = sext i1 %tmp0 to i32 149 store i32 %tmp1, i32 addrspace(1)* %out.gep 150 ret void 151 } 152 153 ; GCN-LABEL: {{^}}i16_slt: 154 ; VI: v_cmp_lt_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 155 ; SI: v_cmp_lt_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 156 define amdgpu_kernel void @i16_slt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 157 entry: 158 %tid = call i32 @llvm.amdgcn.workitem.id.x() 159 %tid.ext = sext i32 %tid to i64 160 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 161 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 162 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 163 %a = load i16, i16 addrspace(1)* %a.gep 164 %b = load i16, i16 addrspace(1)* %b.gep 165 %tmp0 = icmp slt i16 %a, %b 166 %tmp1 = sext i1 %tmp0 to i32 167 store i32 %tmp1, i32 addrspace(1)* %out.gep 168 ret void 169 } 170 171 ; GCN-LABEL: {{^}}i16_sle: 172 ; VI: v_cmp_le_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 173 ; SI: v_cmp_le_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}} 174 define amdgpu_kernel void @i16_sle(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 { 175 entry: 176 %tid = call i32 @llvm.amdgcn.workitem.id.x() 177 %tid.ext = sext i32 %tid to i64 178 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 179 %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext 180 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 181 %a = load i16, i16 addrspace(1)* %a.gep 182 %b = load i16, i16 addrspace(1)* %b.gep 183 %tmp0 = icmp sle i16 %a, %b 184 %tmp1 = sext i1 %tmp0 to i32 185 store i32 %tmp1, i32 addrspace(1)* %out.gep 186 ret void 187 } 188 189 ; These should be commuted to reduce code size 190 ; GCN-LABEL: {{^}}i16_eq_v_s: 191 ; VI: v_cmp_eq_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 192 ; SI: v_cmp_eq_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 193 define amdgpu_kernel void @i16_eq_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 194 entry: 195 %tid = call i32 @llvm.amdgcn.workitem.id.x() 196 %tid.ext = sext i32 %tid to i64 197 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 198 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 199 %a = load i16, i16 addrspace(1)* %a.gep 200 %tmp0 = icmp eq i16 %a, %b 201 %tmp1 = sext i1 %tmp0 to i32 202 store i32 %tmp1, i32 addrspace(1)* %out.gep 203 ret void 204 } 205 206 ; GCN-LABEL: {{^}}i16_ne_v_s: 207 ; VI: v_cmp_ne_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 208 ; SI: v_cmp_ne_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 209 define amdgpu_kernel void @i16_ne_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 210 entry: 211 %tid = call i32 @llvm.amdgcn.workitem.id.x() 212 %tid.ext = sext i32 %tid to i64 213 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 214 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 215 %a = load i16, i16 addrspace(1)* %a.gep 216 %tmp0 = icmp ne i16 %a, %b 217 %tmp1 = sext i1 %tmp0 to i32 218 store i32 %tmp1, i32 addrspace(1)* %out.gep 219 ret void 220 } 221 222 ; GCN-LABEL: {{^}}i16_ugt_v_s: 223 ; VI: v_cmp_lt_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 224 ; SI: v_cmp_lt_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 225 define amdgpu_kernel void @i16_ugt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 226 entry: 227 %tid = call i32 @llvm.amdgcn.workitem.id.x() 228 %tid.ext = sext i32 %tid to i64 229 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 230 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 231 %a = load i16, i16 addrspace(1)* %a.gep 232 %tmp0 = icmp ugt i16 %a, %b 233 %tmp1 = sext i1 %tmp0 to i32 234 store i32 %tmp1, i32 addrspace(1)* %out.gep 235 ret void 236 } 237 238 ; GCN-LABEL: {{^}}i16_uge_v_s: 239 ; VI: v_cmp_le_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 240 ; SI: v_cmp_le_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 241 define amdgpu_kernel void @i16_uge_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 242 entry: 243 %tid = call i32 @llvm.amdgcn.workitem.id.x() 244 %tid.ext = sext i32 %tid to i64 245 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 246 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 247 %a = load i16, i16 addrspace(1)* %a.gep 248 %tmp0 = icmp uge i16 %a, %b 249 %tmp1 = sext i1 %tmp0 to i32 250 store i32 %tmp1, i32 addrspace(1)* %out.gep 251 ret void 252 } 253 254 ; GCN-LABEL: {{^}}i16_ult_v_s: 255 ; VI: v_cmp_gt_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 256 ; SI: v_cmp_gt_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 257 define amdgpu_kernel void @i16_ult_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 258 entry: 259 %tid = call i32 @llvm.amdgcn.workitem.id.x() 260 %tid.ext = sext i32 %tid to i64 261 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 262 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 263 %a = load i16, i16 addrspace(1)* %a.gep 264 %tmp0 = icmp ult i16 %a, %b 265 %tmp1 = sext i1 %tmp0 to i32 266 store i32 %tmp1, i32 addrspace(1)* %out.gep 267 ret void 268 } 269 270 ; GCN-LABEL: {{^}}i16_ule_v_s: 271 ; VI: v_cmp_ge_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 272 ; SI: v_cmp_ge_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 273 define amdgpu_kernel void @i16_ule_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 274 entry: 275 %tid = call i32 @llvm.amdgcn.workitem.id.x() 276 %tid.ext = sext i32 %tid to i64 277 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 278 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 279 %a = load i16, i16 addrspace(1)* %a.gep 280 %tmp0 = icmp ule i16 %a, %b 281 %tmp1 = sext i1 %tmp0 to i32 282 store i32 %tmp1, i32 addrspace(1)* %out.gep 283 ret void 284 } 285 286 ; GCN-LABEL: {{^}}i16_sgt_v_s: 287 ; VI: v_cmp_lt_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 288 ; SI: v_cmp_lt_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 289 define amdgpu_kernel void @i16_sgt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 290 entry: 291 %tid = call i32 @llvm.amdgcn.workitem.id.x() 292 %tid.ext = sext i32 %tid to i64 293 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 294 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 295 %a = load i16, i16 addrspace(1)* %a.gep 296 %tmp0 = icmp sgt i16 %a, %b 297 %tmp1 = sext i1 %tmp0 to i32 298 store i32 %tmp1, i32 addrspace(1)* %out.gep 299 ret void 300 } 301 302 ; GCN-LABEL: {{^}}i16_sge_v_s: 303 ; VI: v_cmp_le_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 304 ; SI: v_cmp_le_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 305 define amdgpu_kernel void @i16_sge_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 306 entry: 307 %tid = call i32 @llvm.amdgcn.workitem.id.x() 308 %tid.ext = sext i32 %tid to i64 309 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 310 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 311 %a = load i16, i16 addrspace(1)* %a.gep 312 %tmp0 = icmp sge i16 %a, %b 313 %tmp1 = sext i1 %tmp0 to i32 314 store i32 %tmp1, i32 addrspace(1)* %out.gep 315 ret void 316 } 317 318 ; GCN-LABEL: {{^}}i16_slt_v_s: 319 ; VI: v_cmp_gt_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 320 ; SI: v_cmp_gt_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 321 define amdgpu_kernel void @i16_slt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 322 entry: 323 %tid = call i32 @llvm.amdgcn.workitem.id.x() 324 %tid.ext = sext i32 %tid to i64 325 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 326 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 327 %a = load i16, i16 addrspace(1)* %a.gep 328 %tmp0 = icmp slt i16 %a, %b 329 %tmp1 = sext i1 %tmp0 to i32 330 store i32 %tmp1, i32 addrspace(1)* %out.gep 331 ret void 332 } 333 334 ; GCN-LABEL: {{^}}i16_sle_v_s: 335 ; VI: v_cmp_ge_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 336 ; SI: v_cmp_ge_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} 337 define amdgpu_kernel void @i16_sle_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 { 338 entry: 339 %tid = call i32 @llvm.amdgcn.workitem.id.x() 340 %tid.ext = sext i32 %tid to i64 341 %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext 342 %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext 343 %a = load i16, i16 addrspace(1)* %a.gep 344 %tmp0 = icmp sle i16 %a, %b 345 %tmp1 = sext i1 %tmp0 to i32 346 store i32 %tmp1, i32 addrspace(1)* %out.gep 347 ret void 348 } 349 350 declare i32 @llvm.amdgcn.workitem.id.x() #1 351 352 attributes #0 = { nounwind } 353 attributes #1 = { nounwind readnone } 354