364 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s3 4define <8 x i8> @extract_2_v4i16(<4 x i16> %a, <4 x i16> %b) {5; CHECK-LABEL: extract_2_v4i16:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: uzp1 v0.8b, v0.8b, v1.8b8; CHECK-NEXT: ret9entry:10 %a0 = extractelement <4 x i16> %a, i32 011 %a1 = extractelement <4 x i16> %a, i32 112 %a2 = extractelement <4 x i16> %a, i32 213 %a3 = extractelement <4 x i16> %a, i32 314 %b0 = extractelement <4 x i16> %b, i32 015 %b1 = extractelement <4 x i16> %b, i32 116 %b2 = extractelement <4 x i16> %b, i32 217 %b3 = extractelement <4 x i16> %b, i32 318 %t0 = trunc i16 %a0 to i819 %t1 = trunc i16 %a1 to i820 %t2 = trunc i16 %a2 to i821 %t3 = trunc i16 %a3 to i822 %t4 = trunc i16 %b0 to i823 %t5 = trunc i16 %b1 to i824 %t6 = trunc i16 %b2 to i825 %t7 = trunc i16 %b3 to i826 %i0 = insertelement <8 x i8> undef, i8 %t0, i32 027 %i1 = insertelement <8 x i8> %i0, i8 %t1, i32 128 %i2 = insertelement <8 x i8> %i1, i8 %t2, i32 229 %i3 = insertelement <8 x i8> %i2, i8 %t3, i32 330 %i4 = insertelement <8 x i8> %i3, i8 %t4, i32 431 %i5 = insertelement <8 x i8> %i4, i8 %t5, i32 532 %i6 = insertelement <8 x i8> %i5, i8 %t6, i32 633 %i7 = insertelement <8 x i8> %i6, i8 %t7, i32 734 ret <8 x i8> %i735}36 37define <8 x i8> @extract_2_v4i32(<4 x i32> %a, <4 x i32> %b) {38; CHECK-LABEL: extract_2_v4i32:39; CHECK: // %bb.0: // %entry40; CHECK-NEXT: mov w8, v0.s[1]41; CHECK-NEXT: mov w9, v0.s[2]42; CHECK-NEXT: mov w10, v0.s[3]43; CHECK-NEXT: mov v0.b[1], w844; CHECK-NEXT: mov w8, v1.s[1]45; CHECK-NEXT: mov v0.b[2], w946; CHECK-NEXT: mov w9, v1.s[2]47; CHECK-NEXT: mov v0.b[3], w1048; CHECK-NEXT: mov v0.b[4], v1.b[0]49; CHECK-NEXT: mov v0.b[5], w850; CHECK-NEXT: mov w8, v1.s[3]51; CHECK-NEXT: mov v0.b[6], w952; CHECK-NEXT: mov v0.b[7], w853; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q054; CHECK-NEXT: ret55entry:56 %a0 = extractelement <4 x i32> %a, i32 057 %a1 = extractelement <4 x i32> %a, i32 158 %a2 = extractelement <4 x i32> %a, i32 259 %a3 = extractelement <4 x i32> %a, i32 360 %b0 = extractelement <4 x i32> %b, i32 061 %b1 = extractelement <4 x i32> %b, i32 162 %b2 = extractelement <4 x i32> %b, i32 263 %b3 = extractelement <4 x i32> %b, i32 364 %t0 = trunc i32 %a0 to i865 %t1 = trunc i32 %a1 to i866 %t2 = trunc i32 %a2 to i867 %t3 = trunc i32 %a3 to i868 %t4 = trunc i32 %b0 to i869 %t5 = trunc i32 %b1 to i870 %t6 = trunc i32 %b2 to i871 %t7 = trunc i32 %b3 to i872 %i0 = insertelement <8 x i8> undef, i8 %t0, i32 073 %i1 = insertelement <8 x i8> %i0, i8 %t1, i32 174 %i2 = insertelement <8 x i8> %i1, i8 %t2, i32 275 %i3 = insertelement <8 x i8> %i2, i8 %t3, i32 376 %i4 = insertelement <8 x i8> %i3, i8 %t4, i32 477 %i5 = insertelement <8 x i8> %i4, i8 %t5, i32 578 %i6 = insertelement <8 x i8> %i5, i8 %t6, i32 679 %i7 = insertelement <8 x i8> %i6, i8 %t7, i32 780 ret <8 x i8> %i781}82 83define <16 x i8> @extract_4_v4i16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c, <4 x i16> %d) {84; CHECK-LABEL: extract_4_v4i16:85; CHECK: // %bb.0: // %entry86; CHECK-NEXT: // kill: def $d2 killed $d2 def $q287; CHECK-NEXT: // kill: def $d0 killed $d0 def $q088; CHECK-NEXT: // kill: def $d3 killed $d3 def $q389; CHECK-NEXT: // kill: def $d1 killed $d1 def $q190; CHECK-NEXT: mov v2.d[1], v3.d[0]91; CHECK-NEXT: mov v0.d[1], v1.d[0]92; CHECK-NEXT: uzp1 v0.16b, v0.16b, v2.16b93; CHECK-NEXT: ret94entry:95 %a0 = extractelement <4 x i16> %a, i32 096 %a1 = extractelement <4 x i16> %a, i32 197 %a2 = extractelement <4 x i16> %a, i32 298 %a3 = extractelement <4 x i16> %a, i32 399 %b0 = extractelement <4 x i16> %b, i32 0100 %b1 = extractelement <4 x i16> %b, i32 1101 %b2 = extractelement <4 x i16> %b, i32 2102 %b3 = extractelement <4 x i16> %b, i32 3103 %c0 = extractelement <4 x i16> %c, i32 0104 %c1 = extractelement <4 x i16> %c, i32 1105 %c2 = extractelement <4 x i16> %c, i32 2106 %c3 = extractelement <4 x i16> %c, i32 3107 %d0 = extractelement <4 x i16> %d, i32 0108 %d1 = extractelement <4 x i16> %d, i32 1109 %d2 = extractelement <4 x i16> %d, i32 2110 %d3 = extractelement <4 x i16> %d, i32 3111 %t0 = trunc i16 %a0 to i8112 %t1 = trunc i16 %a1 to i8113 %t2 = trunc i16 %a2 to i8114 %t3 = trunc i16 %a3 to i8115 %t4 = trunc i16 %b0 to i8116 %t5 = trunc i16 %b1 to i8117 %t6 = trunc i16 %b2 to i8118 %t7 = trunc i16 %b3 to i8119 %t8 = trunc i16 %c0 to i8120 %t9 = trunc i16 %c1 to i8121 %t10 = trunc i16 %c2 to i8122 %t11 = trunc i16 %c3 to i8123 %t12 = trunc i16 %d0 to i8124 %t13 = trunc i16 %d1 to i8125 %t14 = trunc i16 %d2 to i8126 %t15 = trunc i16 %d3 to i8127 %i0 = insertelement <16 x i8> undef, i8 %t0, i32 0128 %i1 = insertelement <16 x i8> %i0, i8 %t1, i32 1129 %i2 = insertelement <16 x i8> %i1, i8 %t2, i32 2130 %i3 = insertelement <16 x i8> %i2, i8 %t3, i32 3131 %i4 = insertelement <16 x i8> %i3, i8 %t4, i32 4132 %i5 = insertelement <16 x i8> %i4, i8 %t5, i32 5133 %i6 = insertelement <16 x i8> %i5, i8 %t6, i32 6134 %i7 = insertelement <16 x i8> %i6, i8 %t7, i32 7135 %i8 = insertelement <16 x i8> %i7, i8 %t8, i32 8136 %i9 = insertelement <16 x i8> %i8, i8 %t9, i32 9137 %i10 = insertelement <16 x i8> %i9, i8 %t10, i32 10138 %i11 = insertelement <16 x i8> %i10, i8 %t11, i32 11139 %i12 = insertelement <16 x i8> %i11, i8 %t12, i32 12140 %i13 = insertelement <16 x i8> %i12, i8 %t13, i32 13141 %i14 = insertelement <16 x i8> %i13, i8 %t14, i32 14142 %i15 = insertelement <16 x i8> %i14, i8 %t15, i32 15143 ret <16 x i8> %i15144}145 146define <16 x i8> @extract_4_v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {147; CHECK-LABEL: extract_4_v4i32:148; CHECK: // %bb.0: // %entry149; CHECK-NEXT: uzp1 v2.8h, v2.8h, v3.8h150; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h151; CHECK-NEXT: uzp1 v0.16b, v0.16b, v2.16b152; CHECK-NEXT: ret153entry:154 %a0 = extractelement <4 x i32> %a, i32 0155 %a1 = extractelement <4 x i32> %a, i32 1156 %a2 = extractelement <4 x i32> %a, i32 2157 %a3 = extractelement <4 x i32> %a, i32 3158 %b0 = extractelement <4 x i32> %b, i32 0159 %b1 = extractelement <4 x i32> %b, i32 1160 %b2 = extractelement <4 x i32> %b, i32 2161 %b3 = extractelement <4 x i32> %b, i32 3162 %c0 = extractelement <4 x i32> %c, i32 0163 %c1 = extractelement <4 x i32> %c, i32 1164 %c2 = extractelement <4 x i32> %c, i32 2165 %c3 = extractelement <4 x i32> %c, i32 3166 %d0 = extractelement <4 x i32> %d, i32 0167 %d1 = extractelement <4 x i32> %d, i32 1168 %d2 = extractelement <4 x i32> %d, i32 2169 %d3 = extractelement <4 x i32> %d, i32 3170 %t0 = trunc i32 %a0 to i8171 %t1 = trunc i32 %a1 to i8172 %t2 = trunc i32 %a2 to i8173 %t3 = trunc i32 %a3 to i8174 %t4 = trunc i32 %b0 to i8175 %t5 = trunc i32 %b1 to i8176 %t6 = trunc i32 %b2 to i8177 %t7 = trunc i32 %b3 to i8178 %t8 = trunc i32 %c0 to i8179 %t9 = trunc i32 %c1 to i8180 %t10 = trunc i32 %c2 to i8181 %t11 = trunc i32 %c3 to i8182 %t12 = trunc i32 %d0 to i8183 %t13 = trunc i32 %d1 to i8184 %t14 = trunc i32 %d2 to i8185 %t15 = trunc i32 %d3 to i8186 %i0 = insertelement <16 x i8> undef, i8 %t0, i32 0187 %i1 = insertelement <16 x i8> %i0, i8 %t1, i32 1188 %i2 = insertelement <16 x i8> %i1, i8 %t2, i32 2189 %i3 = insertelement <16 x i8> %i2, i8 %t3, i32 3190 %i4 = insertelement <16 x i8> %i3, i8 %t4, i32 4191 %i5 = insertelement <16 x i8> %i4, i8 %t5, i32 5192 %i6 = insertelement <16 x i8> %i5, i8 %t6, i32 6193 %i7 = insertelement <16 x i8> %i6, i8 %t7, i32 7194 %i8 = insertelement <16 x i8> %i7, i8 %t8, i32 8195 %i9 = insertelement <16 x i8> %i8, i8 %t9, i32 9196 %i10 = insertelement <16 x i8> %i9, i8 %t10, i32 10197 %i11 = insertelement <16 x i8> %i10, i8 %t11, i32 11198 %i12 = insertelement <16 x i8> %i11, i8 %t12, i32 12199 %i13 = insertelement <16 x i8> %i12, i8 %t13, i32 13200 %i14 = insertelement <16 x i8> %i13, i8 %t14, i32 14201 %i15 = insertelement <16 x i8> %i14, i8 %t15, i32 15202 ret <16 x i8> %i15203}204 205define <16 x i8> @extract_4_mixed(<4 x i16> %a, <4 x i32> %b, <4 x i32> %c, <4 x i16> %d) {206; CHECK-LABEL: extract_4_mixed:207; CHECK: // %bb.0: // %entry208; CHECK-NEXT: xtn v2.4h, v2.4s209; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0210; CHECK-NEXT: // kill: def $d3 killed $d3 def $q3211; CHECK-NEXT: xtn2 v0.8h, v1.4s212; CHECK-NEXT: mov v2.d[1], v3.d[0]213; CHECK-NEXT: uzp1 v0.16b, v0.16b, v2.16b214; CHECK-NEXT: ret215entry:216 %a0 = extractelement <4 x i16> %a, i32 0217 %a1 = extractelement <4 x i16> %a, i32 1218 %a2 = extractelement <4 x i16> %a, i32 2219 %a3 = extractelement <4 x i16> %a, i32 3220 %b0 = extractelement <4 x i32> %b, i32 0221 %b1 = extractelement <4 x i32> %b, i32 1222 %b2 = extractelement <4 x i32> %b, i32 2223 %b3 = extractelement <4 x i32> %b, i32 3224 %c0 = extractelement <4 x i32> %c, i32 0225 %c1 = extractelement <4 x i32> %c, i32 1226 %c2 = extractelement <4 x i32> %c, i32 2227 %c3 = extractelement <4 x i32> %c, i32 3228 %d0 = extractelement <4 x i16> %d, i32 0229 %d1 = extractelement <4 x i16> %d, i32 1230 %d2 = extractelement <4 x i16> %d, i32 2231 %d3 = extractelement <4 x i16> %d, i32 3232 %t0 = trunc i16 %a0 to i8233 %t1 = trunc i16 %a1 to i8234 %t2 = trunc i16 %a2 to i8235 %t3 = trunc i16 %a3 to i8236 %t4 = trunc i32 %b0 to i8237 %t5 = trunc i32 %b1 to i8238 %t6 = trunc i32 %b2 to i8239 %t7 = trunc i32 %b3 to i8240 %t8 = trunc i32 %c0 to i8241 %t9 = trunc i32 %c1 to i8242 %t10 = trunc i32 %c2 to i8243 %t11 = trunc i32 %c3 to i8244 %t12 = trunc i16 %d0 to i8245 %t13 = trunc i16 %d1 to i8246 %t14 = trunc i16 %d2 to i8247 %t15 = trunc i16 %d3 to i8248 %i0 = insertelement <16 x i8> undef, i8 %t0, i32 0249 %i1 = insertelement <16 x i8> %i0, i8 %t1, i32 1250 %i2 = insertelement <16 x i8> %i1, i8 %t2, i32 2251 %i3 = insertelement <16 x i8> %i2, i8 %t3, i32 3252 %i4 = insertelement <16 x i8> %i3, i8 %t4, i32 4253 %i5 = insertelement <16 x i8> %i4, i8 %t5, i32 5254 %i6 = insertelement <16 x i8> %i5, i8 %t6, i32 6255 %i7 = insertelement <16 x i8> %i6, i8 %t7, i32 7256 %i8 = insertelement <16 x i8> %i7, i8 %t8, i32 8257 %i9 = insertelement <16 x i8> %i8, i8 %t9, i32 9258 %i10 = insertelement <16 x i8> %i9, i8 %t10, i32 10259 %i11 = insertelement <16 x i8> %i10, i8 %t11, i32 11260 %i12 = insertelement <16 x i8> %i11, i8 %t12, i32 12261 %i13 = insertelement <16 x i8> %i12, i8 %t13, i32 13262 %i14 = insertelement <16 x i8> %i13, i8 %t14, i32 14263 %i15 = insertelement <16 x i8> %i14, i8 %t15, i32 15264 ret <16 x i8> %i15265}266 267define <16 x i8> @extract_4_v4i32_badindex(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {268; CHECK-LABEL: extract_4_v4i32_badindex:269; CHECK: // %bb.0: // %entry270; CHECK-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3271; CHECK-NEXT: adrp x8, .LCPI5_0272; CHECK-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3273; CHECK-NEXT: ldr q4, [x8, :lo12:.LCPI5_0]274; CHECK-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3275; CHECK-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3276; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b, v2.16b, v3.16b }, v4.16b277; CHECK-NEXT: ret278entry:279 %a0 = extractelement <4 x i32> %a, i32 0280 %a1 = extractelement <4 x i32> %a, i32 1281 %a2 = extractelement <4 x i32> %a, i32 2282 %a3 = extractelement <4 x i32> %a, i32 3283 %b0 = extractelement <4 x i32> %b, i32 0284 %b1 = extractelement <4 x i32> %b, i32 2285 %b2 = extractelement <4 x i32> %b, i32 1286 %b3 = extractelement <4 x i32> %b, i32 3287 %c0 = extractelement <4 x i32> %c, i32 0288 %c1 = extractelement <4 x i32> %c, i32 1289 %c2 = extractelement <4 x i32> %c, i32 2290 %c3 = extractelement <4 x i32> %c, i32 3291 %d0 = extractelement <4 x i32> %d, i32 0292 %d1 = extractelement <4 x i32> %d, i32 1293 %d2 = extractelement <4 x i32> %d, i32 2294 %d3 = extractelement <4 x i32> %d, i32 3295 %t0 = trunc i32 %a0 to i8296 %t1 = trunc i32 %a1 to i8297 %t2 = trunc i32 %a2 to i8298 %t3 = trunc i32 %a3 to i8299 %t4 = trunc i32 %b0 to i8300 %t5 = trunc i32 %b1 to i8301 %t6 = trunc i32 %b2 to i8302 %t7 = trunc i32 %b3 to i8303 %t8 = trunc i32 %c0 to i8304 %t9 = trunc i32 %c1 to i8305 %t10 = trunc i32 %c2 to i8306 %t11 = trunc i32 %c3 to i8307 %t12 = trunc i32 %d0 to i8308 %t13 = trunc i32 %d1 to i8309 %t14 = trunc i32 %d2 to i8310 %t15 = trunc i32 %d3 to i8311 %i0 = insertelement <16 x i8> undef, i8 %t0, i32 0312 %i1 = insertelement <16 x i8> %i0, i8 %t1, i32 1313 %i2 = insertelement <16 x i8> %i1, i8 %t2, i32 2314 %i3 = insertelement <16 x i8> %i2, i8 %t3, i32 3315 %i4 = insertelement <16 x i8> %i3, i8 %t4, i32 4316 %i5 = insertelement <16 x i8> %i4, i8 %t5, i32 5317 %i6 = insertelement <16 x i8> %i5, i8 %t6, i32 6318 %i7 = insertelement <16 x i8> %i6, i8 %t7, i32 7319 %i8 = insertelement <16 x i8> %i7, i8 %t8, i32 8320 %i9 = insertelement <16 x i8> %i8, i8 %t9, i32 9321 %i10 = insertelement <16 x i8> %i9, i8 %t10, i32 10322 %i11 = insertelement <16 x i8> %i10, i8 %t11, i32 11323 %i12 = insertelement <16 x i8> %i11, i8 %t12, i32 12324 %i13 = insertelement <16 x i8> %i12, i8 %t13, i32 13325 %i14 = insertelement <16 x i8> %i13, i8 %t14, i32 14326 %i15 = insertelement <16 x i8> %i14, i8 %t15, i32 15327 ret <16 x i8> %i15328}329 330define <16 x i8> @extract_4_v4i32_one(<4 x i32> %a) {331; CHECK-LABEL: extract_4_v4i32_one:332; CHECK: // %bb.0: // %entry333; CHECK-NEXT: uzp1 v0.8h, v0.8h, v0.8h334; CHECK-NEXT: uzp1 v0.16b, v0.16b, v0.16b335; CHECK-NEXT: ret336entry:337 %a0 = extractelement <4 x i32> %a, i32 0338 %a1 = extractelement <4 x i32> %a, i32 1339 %a2 = extractelement <4 x i32> %a, i32 2340 %a3 = extractelement <4 x i32> %a, i32 3341 %t0 = trunc i32 %a0 to i8342 %t1 = trunc i32 %a1 to i8343 %t2 = trunc i32 %a2 to i8344 %t3 = trunc i32 %a3 to i8345 %i0 = insertelement <16 x i8> undef, i8 %t0, i32 0346 %i1 = insertelement <16 x i8> %i0, i8 %t1, i32 1347 %i2 = insertelement <16 x i8> %i1, i8 %t2, i32 2348 %i3 = insertelement <16 x i8> %i2, i8 %t3, i32 3349 %i4 = insertelement <16 x i8> %i3, i8 %t0, i32 4350 %i5 = insertelement <16 x i8> %i4, i8 %t1, i32 5351 %i6 = insertelement <16 x i8> %i5, i8 %t2, i32 6352 %i7 = insertelement <16 x i8> %i6, i8 %t3, i32 7353 %i8 = insertelement <16 x i8> %i7, i8 %t0, i32 8354 %i9 = insertelement <16 x i8> %i8, i8 %t1, i32 9355 %i10 = insertelement <16 x i8> %i9, i8 %t2, i32 10356 %i11 = insertelement <16 x i8> %i10, i8 %t3, i32 11357 %i12 = insertelement <16 x i8> %i11, i8 %t0, i32 12358 %i13 = insertelement <16 x i8> %i12, i8 %t1, i32 13359 %i14 = insertelement <16 x i8> %i13, i8 %t2, i32 14360 %i15 = insertelement <16 x i8> %i14, i8 %t3, i32 15361 ret <16 x i8> %i15362}363 364