761 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 < %s | FileCheck %s3 4; CHECK: .LCPI0_0:5; CHECK: .byte 0 // 0x06; CHECK: .byte 16 // 0x107; CHECK: .byte 32 // 0x208; CHECK: .byte 48 // 0x309; CHECK: .byte 2 // 0x210; CHECK: .byte 18 // 0x1211; CHECK: .byte 34 // 0x2212; CHECK: .byte 50 // 0x3213; CHECK: .byte 4 // 0x414; CHECK: .byte 20 // 0x1415; CHECK: .byte 36 // 0x2416; CHECK: .byte 52 // 0x3417; CHECK: .byte 6 // 0x618; CHECK: .byte 22 // 0x1619; CHECK: .byte 38 // 0x2620; CHECK: .byte 54 // 0x3621define <16 x i8> @shuffle4_v4i8_16(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <4 x i8> %d) {22; CHECK-LABEL: shuffle4_v4i8_16:23; CHECK: // %bb.0:24; CHECK-NEXT: // kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q325; CHECK-NEXT: adrp x8, .LCPI0_026; CHECK-NEXT: // kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q327; CHECK-NEXT: ldr q4, [x8, :lo12:.LCPI0_0]28; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q329; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q330; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b, v2.16b, v3.16b }, v4.16b31; CHECK-NEXT: ret32 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>33 %y = shufflevector <4 x i8> %c, <4 x i8> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>34 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>35 ret <16 x i8> %z36}37 38; CHECK: .LCPI1_0:39; CHECK: .byte 0 // 0x040; CHECK: .byte 16 // 0x1041; CHECK: .byte 32 // 0x2042; CHECK: .byte 48 // 0x3043; CHECK: .byte 2 // 0x244; CHECK: .byte 18 // 0x1245; CHECK: .byte 34 // 0x2246; CHECK: .byte 50 // 0x3247define <8 x i8> @shuffle4_v4i8_8(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <4 x i8> %d) {48; CHECK-LABEL: shuffle4_v4i8_8:49; CHECK: // %bb.0:50; CHECK-NEXT: // kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q351; CHECK-NEXT: adrp x8, .LCPI1_052; CHECK-NEXT: // kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q353; CHECK-NEXT: ldr d4, [x8, :lo12:.LCPI1_0]54; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q355; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q356; CHECK-NEXT: tbl v0.8b, { v0.16b, v1.16b, v2.16b, v3.16b }, v4.8b57; CHECK-NEXT: ret58 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>59 %y = shufflevector <4 x i8> %c, <4 x i8> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>60 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13>61 ret <8 x i8> %z62}63 64; CHECK: .LCPI2_0:65; CHECK: .byte 0 // 0x066; CHECK: .byte 3 // 0x367; CHECK: .byte 2 // 0x268; CHECK: .byte 1 // 0x169; CHECK: .byte 12 // 0xc70; CHECK: .byte 15 // 0xf71; CHECK: .byte 14 // 0xe72; CHECK: .byte 12 // 0xc73; CHECK: .LCPI2_1:74; CHECK: .byte 4 // 0x475; CHECK: .byte 7 // 0x776; CHECK: .byte 6 // 0x677; CHECK: .byte 7 // 0x778; CHECK: .byte 8 // 0x879; CHECK: .byte 10 // 0xa80; CHECK: .byte 9 // 0x981; CHECK: .byte 11 // 0xb82; CHECK: .section .rodata.cst16,"aM",@progbits,1683; CHECK: .p2align 484; CHECK: .LCPI2_2:85; CHECK: .byte 0 // 0x086; CHECK: .byte 4 // 0x487; CHECK: .byte 16 // 0x1088; CHECK: .byte 20 // 0x1489; CHECK: .byte 1 // 0x190; CHECK: .byte 5 // 0x591; CHECK: .byte 17 // 0x1192; CHECK: .byte 21 // 0x1593; CHECK: .byte 2 // 0x294; CHECK: .byte 6 // 0x695; CHECK: .byte 18 // 0x1296; CHECK: .byte 22 // 0x1697; CHECK: .byte 3 // 0x398; CHECK: .byte 7 // 0x799; CHECK: .byte 19 // 0x13100; CHECK: .byte 23 // 0x17101define <16 x i8> @shuffle4_v8i8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c, <8 x i8> %d) {102; CHECK-LABEL: shuffle4_v8i8:103; CHECK: // %bb.0:104; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0105; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2106; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1107; CHECK-NEXT: // kill: def $d3 killed $d3 def $q3108; CHECK-NEXT: adrp x8, .LCPI2_0109; CHECK-NEXT: mov v0.d[1], v1.d[0]110; CHECK-NEXT: mov v2.d[1], v3.d[0]111; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI2_0]112; CHECK-NEXT: adrp x8, .LCPI2_1113; CHECK-NEXT: ldr d3, [x8, :lo12:.LCPI2_1]114; CHECK-NEXT: adrp x8, .LCPI2_2115; CHECK-NEXT: tbl v0.8b, { v0.16b }, v1.8b116; CHECK-NEXT: tbl v1.8b, { v2.16b }, v3.8b117; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI2_2]118; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b }, v2.16b119; CHECK-NEXT: ret120 %x = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 0, i32 3, i32 2, i32 1, i32 12, i32 15, i32 14, i32 12>121 %y = shufflevector <8 x i8> %c, <8 x i8> %d, <8 x i32> <i32 4, i32 7, i32 6, i32 7, i32 8, i32 10, i32 9, i32 11>122 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>123 ret <16 x i8> %z124}125 126; CHECK: .LCPI3_0:127; CHECK: .byte 0 // 0x0128; CHECK: .byte 3 // 0x3129; CHECK: .byte 2 // 0x2130; CHECK: .byte 1 // 0x1131; CHECK: .byte 12 // 0xc132; CHECK: .byte 15 // 0xf133; CHECK: .byte 14 // 0xe134; CHECK: .byte 12 // 0xc135; CHECK: .byte 255 // 0xff136; CHECK: .byte 255 // 0xff137; CHECK: .byte 255 // 0xff138; CHECK: .byte 255 // 0xff139; CHECK: .byte 255 // 0xff140; CHECK: .byte 255 // 0xff141; CHECK: .byte 255 // 0xff142; CHECK: .byte 255 // 0xff143; CHECK: .LCPI3_1:144; CHECK: .byte 4 // 0x4145; CHECK: .byte 7 // 0x7146; CHECK: .byte 6 // 0x6147; CHECK: .byte 7 // 0x7148; CHECK: .byte 8 // 0x8149; CHECK: .byte 10 // 0xa150; CHECK: .byte 9 // 0x9151; CHECK: .byte 11 // 0xb152; CHECK: .byte 255 // 0xff153; CHECK: .byte 255 // 0xff154; CHECK: .byte 255 // 0xff155; CHECK: .byte 255 // 0xff156; CHECK: .byte 255 // 0xff157; CHECK: .byte 255 // 0xff158; CHECK: .byte 255 // 0xff159; CHECK: .byte 255 // 0xff160; CHECK: .LCPI3_2:161; CHECK: .byte 16 // 0x10162; CHECK: .byte 20 // 0x14163; CHECK: .byte 0 // 0x0164; CHECK: .byte 4 // 0x4165; CHECK: .byte 17 // 0x11166; CHECK: .byte 21 // 0x15167; CHECK: .byte 1 // 0x1168; CHECK: .byte 5 // 0x5169; CHECK: .byte 18 // 0x12170; CHECK: .byte 22 // 0x16171; CHECK: .byte 2 // 0x2172; CHECK: .byte 6 // 0x6173; CHECK: .byte 19 // 0x13174; CHECK: .byte 23 // 0x17175; CHECK: .byte 3 // 0x3176; CHECK: .byte 7 // 0x7177define <16 x i8> @shuffle4_v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) {178; CHECK-LABEL: shuffle4_v16i8:179; CHECK: // %bb.0:180; CHECK-NEXT: adrp x8, .LCPI3_0181; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI3_0]182; CHECK-NEXT: adrp x8, .LCPI3_1183; CHECK-NEXT: ldr q3, [x8, :lo12:.LCPI3_1]184; CHECK-NEXT: adrp x8, .LCPI3_2185; CHECK-NEXT: tbl v1.16b, { v0.16b }, v1.16b186; CHECK-NEXT: tbl v0.16b, { v2.16b }, v3.16b187; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI3_2]188; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b }, v2.16b189; CHECK-NEXT: ret190 %x = shufflevector <16 x i8> %a, <16 x i8> %b, <8 x i32> <i32 0, i32 3, i32 2, i32 1, i32 12, i32 15, i32 14, i32 12>191 %y = shufflevector <16 x i8> %c, <16 x i8> %d, <8 x i32> <i32 4, i32 7, i32 6, i32 7, i32 8, i32 10, i32 9, i32 11>192 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>193 ret <16 x i8> %z194}195 196; CHECK: .LCPI4_0:197; CHECK: .byte 0 // 0x0198; CHECK: .byte 1 // 0x1199; CHECK: .byte 8 // 0x8200; CHECK: .byte 9 // 0x9201; CHECK: .byte 16 // 0x10202; CHECK: .byte 17 // 0x11203; CHECK: .byte 24 // 0x18204; CHECK: .byte 25 // 0x19205; CHECK: .byte 2 // 0x2206; CHECK: .byte 3 // 0x3207; CHECK: .byte 10 // 0xa208; CHECK: .byte 11 // 0xb209; CHECK: .byte 18 // 0x12210; CHECK: .byte 19 // 0x13211; CHECK: .byte 26 // 0x1a212; CHECK: .byte 27 // 0x1b213define <8 x i16> @shuffle4_v8i16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c, <4 x i16> %d) {214; CHECK-LABEL: shuffle4_v8i16:215; CHECK: // %bb.0:216; CHECK-NEXT: fmov d5, d2217; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1218; CHECK-NEXT: // kill: def $d3 killed $d3 def $q3219; CHECK-NEXT: adrp x8, .LCPI4_0220; CHECK-NEXT: fmov d4, d0221; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI4_0]222; CHECK-NEXT: mov v4.d[1], v1.d[0]223; CHECK-NEXT: mov v5.d[1], v3.d[0]224; CHECK-NEXT: tbl v0.16b, { v4.16b, v5.16b }, v0.16b225; CHECK-NEXT: ret226 %x = shufflevector <4 x i16> %a, <4 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>227 %y = shufflevector <4 x i16> %c, <4 x i16> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>228 %z = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13>229 ret <8 x i16> %z230}231 232define <4 x i32> @shuffle4_v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {233; CHECK-LABEL: shuffle4_v4i32:234; CHECK: // %bb.0:235; CHECK-NEXT: zip1 v1.4s, v1.4s, v1.4s236; CHECK-NEXT: rev64 v3.4s, v3.4s237; CHECK-NEXT: ext v1.16b, v1.16b, v0.16b, #4238; CHECK-NEXT: zip2 v0.4s, v3.4s, v2.4s239; CHECK-NEXT: mov v0.d[1], v1.d[1]240; CHECK-NEXT: ret241 %x = shufflevector <4 x i32> %a, <4 x i32> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>242 %y = shufflevector <4 x i32> %c, <4 x i32> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>243 %z = shufflevector <8 x i32> %x, <8 x i32> %y, <4 x i32> <i32 15, i32 10, i32 5, i32 0>244 ret <4 x i32> %z245}246 247; CHECK: .LCPI6_0:248; CHECK: .byte 0 // 0x0249; CHECK: .byte 7 // 0x7250; CHECK: .byte 255 // 0xff251; CHECK: .byte 1 // 0x1252; CHECK: .byte 255 // 0xff253; CHECK: .byte 255 // 0xff254; CHECK: .byte 255 // 0xff255; CHECK: .byte 255 // 0xff256; CHECK: .section .rodata.cst16,"aM",@progbits,16257; CHECK: .p2align 4258; CHECK: .LCPI6_1:259; CHECK: .byte 0 // 0x0260; CHECK: .byte 16 // 0x10261; CHECK: .byte 19 // 0x13262; CHECK: .byte 3 // 0x3263; CHECK: .byte 1 // 0x1264; CHECK: .byte 17 // 0x11265; CHECK: .byte 0 // 0x0266; CHECK: .byte 1 // 0x1267; CHECK: .byte 0 // 0x0268; CHECK: .byte 16 // 0x10269; CHECK: .byte 19 // 0x13270; CHECK: .byte 3 // 0x3271; CHECK: .byte 1 // 0x1272; CHECK: .byte 17 // 0x11273; CHECK: .byte 0 // 0x0274; CHECK: .byte 1 // 0x1275define <16 x i8> @shuffle4_v8i8_v16i8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c, <8 x i8> %d) {276; CHECK-LABEL: shuffle4_v8i8_v16i8:277; CHECK: // %bb.0:278; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2279; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0280; CHECK-NEXT: adrp x8, .LCPI6_0281; CHECK-NEXT: mov v2.d[1], v2.d[0]282; CHECK-NEXT: mov v0.d[1], v0.d[0]283; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI6_0]284; CHECK-NEXT: adrp x8, .LCPI6_1285; CHECK-NEXT: tbl v3.8b, { v2.16b }, v1.8b286; CHECK-NEXT: tbl v2.8b, { v0.16b }, v1.8b287; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI6_1]288; CHECK-NEXT: tbl v0.16b, { v2.16b, v3.16b }, v0.16b289; CHECK-NEXT: ret290 %x = shufflevector <8 x i8> %a, <8 x i8> %b, <4 x i32> <i32 0, i32 7, i32 5, i32 1>291 %y = shufflevector <8 x i8> %c, <8 x i8> %d, <4 x i32> <i32 0, i32 7, i32 5, i32 1>292 %z = shufflevector <4 x i8> %x, <4 x i8> %y, <16 x i32> <i32 0, i32 4, i32 7, i32 3, i32 1, i32 5, i32 0, i32 1, i32 0, i32 4, i32 7, i32 3, i32 1, i32 5, i32 0, i32 1>293 ret <16 x i8> %z294}295 296; CHECK: .LCPI7_0:297; CHECK: .byte 0 // 0x0298; CHECK: .byte 7 // 0x7299; CHECK: .byte 255 // 0xff300; CHECK: .byte 1 // 0x1301; CHECK: .byte 255 // 0xff302; CHECK: .byte 255 // 0xff303; CHECK: .byte 255 // 0xff304; CHECK: .byte 255 // 0xff305; CHECK: .LCPI7_1:306; CHECK: .byte 0 // 0x0307; CHECK: .byte 8 // 0x8308; CHECK: .byte 11 // 0xb309; CHECK: .byte 3 // 0x3310; CHECK: .byte 1 // 0x1311; CHECK: .byte 9 // 0x9312; CHECK: .byte 0 // 0x0313; CHECK: .byte 1 // 0x1314define <8 x i8> @shuffle4_v8i8_v8i8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c, <8 x i8> %d) {315; CHECK-LABEL: shuffle4_v8i8_v8i8:316; CHECK: // %bb.0:317; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2318; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0319; CHECK-NEXT: adrp x8, .LCPI7_0320; CHECK-NEXT: mov v2.d[1], v2.d[0]321; CHECK-NEXT: mov v0.d[1], v0.d[0]322; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI7_0]323; CHECK-NEXT: adrp x8, .LCPI7_1324; CHECK-NEXT: tbl v2.8b, { v2.16b }, v1.8b325; CHECK-NEXT: tbl v0.8b, { v0.16b }, v1.8b326; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI7_1]327; CHECK-NEXT: mov v0.d[1], v2.d[0]328; CHECK-NEXT: tbl v0.8b, { v0.16b }, v1.8b329; CHECK-NEXT: ret330 %x = shufflevector <8 x i8> %a, <8 x i8> %b, <4 x i32> <i32 0, i32 7, i32 5, i32 1>331 %y = shufflevector <8 x i8> %c, <8 x i8> %d, <4 x i32> <i32 0, i32 7, i32 5, i32 1>332 %z = shufflevector <4 x i8> %x, <4 x i8> %y, <8 x i32> <i32 0, i32 4, i32 7, i32 3, i32 1, i32 5, i32 0, i32 1>333 ret <8 x i8> %z334}335 336; CHECK: .LCPI8_0:337; CHECK: .byte 0 // 0x0338; CHECK: .byte 1 // 0x1339; CHECK: .byte 8 // 0x8340; CHECK: .byte 9 // 0x9341; CHECK: .byte 16 // 0x10342; CHECK: .byte 17 // 0x11343; CHECK: .byte 24 // 0x18344; CHECK: .byte 25 // 0x19345; CHECK: .byte 2 // 0x2346; CHECK: .byte 3 // 0x3347; CHECK: .byte 10 // 0xa348; CHECK: .byte 11 // 0xb349; CHECK: .byte 18 // 0x12350; CHECK: .byte 19 // 0x13351; CHECK: .byte 26 // 0x1a352; CHECK: .byte 27 // 0x1b353define <8 x i16> @shuffle4_v4i8_zext(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <4 x i8> %d) {354; CHECK-LABEL: shuffle4_v4i8_zext:355; CHECK: // %bb.0:356; CHECK-NEXT: fmov d5, d2357; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1358; CHECK-NEXT: // kill: def $d3 killed $d3 def $q3359; CHECK-NEXT: adrp x8, .LCPI8_0360; CHECK-NEXT: fmov d4, d0361; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI8_0]362; CHECK-NEXT: mov v4.d[1], v1.d[0]363; CHECK-NEXT: mov v5.d[1], v3.d[0]364; CHECK-NEXT: bic v4.8h, #255, lsl #8365; CHECK-NEXT: bic v5.8h, #255, lsl #8366; CHECK-NEXT: tbl v0.16b, { v4.16b, v5.16b }, v0.16b367; CHECK-NEXT: ret368 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>369 %y = shufflevector <4 x i8> %c, <4 x i8> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>370 %xe = zext <8 x i8> %x to <8 x i16>371 %ye = zext <8 x i8> %y to <8 x i16>372 %z = shufflevector <8 x i16> %xe, <8 x i16> %ye, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13>373 ret <8 x i16> %z374}375 376; CHECK: .LCPI9_0:377; CHECK: .byte 0 // 0x0378; CHECK: .byte 16 // 0x10379; CHECK: .byte 32 // 0x20380; CHECK: .byte 48 // 0x30381; CHECK: .byte 2 // 0x2382; CHECK: .byte 18 // 0x12383; CHECK: .byte 34 // 0x22384; CHECK: .byte 50 // 0x32385; CHECK: .byte 4 // 0x4386; CHECK: .byte 20 // 0x14387; CHECK: .byte 36 // 0x24388; CHECK: .byte 52 // 0x34389; CHECK: .byte 6 // 0x6390; CHECK: .byte 22 // 0x16391; CHECK: .byte 38 // 0x26392; CHECK: .byte 54 // 0x36393define <16 x i8> @shuffle4_v4i16_trunc(<4 x i16> %ae, <4 x i16> %be, <4 x i16> %ce, <4 x i16> %de) {394; CHECK-LABEL: shuffle4_v4i16_trunc:395; CHECK: // %bb.0:396; CHECK-NEXT: // kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3397; CHECK-NEXT: adrp x8, .LCPI9_0398; CHECK-NEXT: // kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3399; CHECK-NEXT: ldr q4, [x8, :lo12:.LCPI9_0]400; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3401; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3402; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b, v2.16b, v3.16b }, v4.16b403; CHECK-NEXT: ret404 %a = trunc <4 x i16> %ae to <4 x i8>405 %b = trunc <4 x i16> %be to <4 x i8>406 %c = trunc <4 x i16> %ce to <4 x i8>407 %d = trunc <4 x i16> %de to <4 x i8>408 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>409 %y = shufflevector <4 x i8> %c, <4 x i8> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>410 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>411 ret <16 x i8> %z412}413 414; CHECK: .LCPI10_0:415; CHECK: .byte 0 // 0x0416; CHECK: .byte 16 // 0x10417; CHECK: .byte 32 // 0x20418; CHECK: .byte 48 // 0x30419; CHECK: .byte 2 // 0x2420; CHECK: .byte 18 // 0x12421; CHECK: .byte 34 // 0x22422; CHECK: .byte 50 // 0x32423; CHECK: .byte 4 // 0x4424; CHECK: .byte 20 // 0x14425; CHECK: .byte 36 // 0x24426; CHECK: .byte 52 // 0x34427; CHECK: .byte 6 // 0x6428; CHECK: .byte 22 // 0x16429; CHECK: .byte 38 // 0x26430; CHECK: .byte 54 // 0x36431; CHECK: .text432define <16 x i8> @shuffle4_v4i32_trunc(<4 x i32> %ae, <4 x i32> %be, <4 x i32> %ce, <4 x i32> %de) {433; CHECK-LABEL: shuffle4_v4i32_trunc:434; CHECK: // %bb.0:435; CHECK-NEXT: xtn v4.4h, v0.4s436; CHECK-NEXT: adrp x8, .LCPI10_0437; CHECK-NEXT: xtn v5.4h, v1.4s438; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI10_0]439; CHECK-NEXT: xtn v6.4h, v2.4s440; CHECK-NEXT: xtn v7.4h, v3.4s441; CHECK-NEXT: tbl v0.16b, { v4.16b, v5.16b, v6.16b, v7.16b }, v0.16b442; CHECK-NEXT: ret443 %a = trunc <4 x i32> %ae to <4 x i8>444 %b = trunc <4 x i32> %be to <4 x i8>445 %c = trunc <4 x i32> %ce to <4 x i8>446 %d = trunc <4 x i32> %de to <4 x i8>447 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>448 %y = shufflevector <4 x i8> %c, <4 x i8> %d, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>449 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>450 ret <16 x i8> %z451}452 453; CHECK: .LCPI11_0:454; CHECK: .byte 0 // 0x0455; CHECK: .byte 16 // 0x10456; CHECK: .byte 32 // 0x20457; CHECK: .byte 2 // 0x2458; CHECK: .byte 18 // 0x12459; CHECK: .byte 34 // 0x22460; CHECK: .byte 4 // 0x4461; CHECK: .byte 20 // 0x14462; CHECK: .byte 36 // 0x24463; CHECK: .byte 6 // 0x6464; CHECK: .byte 22 // 0x16465; CHECK: .byte 38 // 0x26466; CHECK: .byte 255 // 0xff467; CHECK: .byte 255 // 0xff468; CHECK: .byte 255 // 0xff469; CHECK: .byte 255 // 0xff470define <12 x i8> @shuffle3_v4i8(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c) {471; CHECK-LABEL: shuffle3_v4i8:472; CHECK: // %bb.0:473; CHECK-NEXT: // kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2474; CHECK-NEXT: adrp x8, .LCPI11_0475; CHECK-NEXT: ldr q3, [x8, :lo12:.LCPI11_0]476; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2477; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2478; CHECK-NEXT: tbl v0.16b, { v0.16b, v1.16b, v2.16b }, v3.16b479; CHECK-NEXT: ret480 %x = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>481 %y = shufflevector <4 x i8> %c, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>482 %z = shufflevector <8 x i8> %x, <8 x i8> %y, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>483 ret <12 x i8> %z484}485 486; CHECK: .LCPI12_0:487; CHECK: .byte 0 // 0x0488; CHECK: .byte 1 // 0x1489; CHECK: .byte 8 // 0x8490; CHECK: .byte 9 // 0x9491; CHECK: .byte 16 // 0x10492; CHECK: .byte 17 // 0x11493; CHECK: .byte 2 // 0x2494; CHECK: .byte 3 // 0x3495; CHECK: .byte 10 // 0xa496; CHECK: .byte 11 // 0xb497; CHECK: .byte 18 // 0x12498; CHECK: .byte 19 // 0x13499; CHECK: .byte 4 // 0x4500; CHECK: .byte 5 // 0x5501; CHECK: .byte 12 // 0xc502; CHECK: .byte 13 // 0xd503define <8 x i16> @shuffle3_v4i16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) {504; CHECK-LABEL: shuffle3_v4i16:505; CHECK: // %bb.0:506; CHECK-NEXT: fmov d3, d2507; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1508; CHECK-NEXT: adrp x8, .LCPI12_0509; CHECK-NEXT: fmov d2, d0510; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI12_0]511; CHECK-NEXT: mov v2.d[1], v1.d[0]512; CHECK-NEXT: tbl v0.16b, { v2.16b, v3.16b }, v0.16b513; CHECK-NEXT: ret514 %x = shufflevector <4 x i16> %a, <4 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>515 %y = shufflevector <4 x i16> %c, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>516 %z = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6>517 ret <8 x i16> %z518}519 520define <4 x i32> @shuffle3_v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {521; CHECK-LABEL: shuffle3_v4i32:522; CHECK: // %bb.0:523; CHECK-NEXT: trn1 v1.4s, v0.4s, v1.4s524; CHECK-NEXT: mov v1.d[1], v0.d[0]525; CHECK-NEXT: mov v1.s[2], v2.s[0]526; CHECK-NEXT: mov v0.16b, v1.16b527; CHECK-NEXT: ret528 %x = shufflevector <4 x i32> %a, <4 x i32> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>529 %y = shufflevector <4 x i32> %c, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>530 %z = shufflevector <8 x i32> %x, <8 x i32> %y, <4 x i32> <i32 0, i32 4, i32 8, i32 1>531 ret <4 x i32> %z532}533 534; CHECK: .LCPI14_0:535; CHECK: .byte 4 // 0x4536; CHECK: .byte 8 // 0x8537; CHECK: .byte 255 // 0xff538; CHECK: .byte 255 // 0xff539; CHECK: .byte 14 // 0xe540; CHECK: .byte 3 // 0x3541; CHECK: .byte 255 // 0xff542; CHECK: .byte 255 // 0xff543; CHECK: .section .rodata.cst16,"aM",@progbits,16544; CHECK: .p2align 4545; CHECK: .LCPI14_1:546; CHECK: .byte 255 // 0xff547; CHECK: .byte 255 // 0xff548; CHECK: .byte 15 // 0xf549; CHECK: .byte 27 // 0x1b550; CHECK: .byte 255 // 0xff551; CHECK: .byte 255 // 0xff552; CHECK: .byte 24 // 0x18553; CHECK: .byte 12 // 0xc554; CHECK: .byte 255 // 0xff555; CHECK: .byte 255 // 0xff556; CHECK: .byte 255 // 0xff557; CHECK: .byte 255 // 0xff558; CHECK: .byte 255 // 0xff559; CHECK: .byte 255 // 0xff560; CHECK: .byte 255 // 0xff561; CHECK: .byte 255 // 0xff562define <8 x i8> @insert4_v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c, <16 x i8> %d) {563; CHECK-LABEL: insert4_v8i8:564; CHECK: // %bb.0:565; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0566; CHECK-NEXT: mov v4.16b, v3.16b567; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2568; CHECK-NEXT: adrp x8, .LCPI14_0569; CHECK-NEXT: adrp x9, .LCPI14_1570; CHECK-NEXT: mov v0.d[1], v2.d[0]571; CHECK-NEXT: mov v3.16b, v1.16b572; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI14_0]573; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI14_1]574; CHECK-NEXT: tbl v0.8b, { v0.16b }, v1.8b575; CHECK-NEXT: tbl v1.16b, { v3.16b, v4.16b }, v2.16b576; CHECK-NEXT: trn1 v0.4h, v1.4h, v0.4h577; CHECK-NEXT: trn2 v0.4h, v0.4h, v1.4h578; CHECK-NEXT: ret579 %e1 = extractelement <8 x i8> %a, i32 4580 %e2 = extractelement <8 x i8> %c, i32 0581 %e3 = extractelement <16 x i8> %b, i32 15582 %e4 = extractelement <16 x i8> %d, i32 11583 %e5 = extractelement <8 x i8> %c, i32 6584 %e6 = extractelement <8 x i8> %a, i32 3585 %e7 = extractelement <16 x i8> %d, i32 8586 %e8 = extractelement <16 x i8> %b, i32 12587 %i1 = insertelement <8 x i8> undef, i8 %e1, i32 0588 %i2 = insertelement <8 x i8> %i1, i8 %e2, i32 1589 %i3 = insertelement <8 x i8> %i2, i8 %e3, i32 2590 %i4 = insertelement <8 x i8> %i3, i8 %e4, i32 3591 %i5 = insertelement <8 x i8> %i4, i8 %e5, i32 4592 %i6 = insertelement <8 x i8> %i5, i8 %e6, i32 5593 %i7 = insertelement <8 x i8> %i6, i8 %e7, i32 6594 %i8 = insertelement <8 x i8> %i7, i8 %e8, i32 7595 ret <8 x i8> %i8596}597 598; CHECK: .LCPI15_0:599; CHECK: .byte 255 // 0xff600; CHECK: .byte 255 // 0xff601; CHECK: .byte 15 // 0xf602; CHECK: .byte 27 // 0x1b603; CHECK: .byte 255 // 0xff604; CHECK: .byte 255 // 0xff605; CHECK: .byte 24 // 0x18606; CHECK: .byte 12 // 0xc607; CHECK: .byte 255 // 0xff608; CHECK: .byte 255 // 0xff609; CHECK: .byte 15 // 0xf610; CHECK: .byte 27 // 0x1b611; CHECK: .byte 255 // 0xff612; CHECK: .byte 255 // 0xff613; CHECK: .byte 24 // 0x18614; CHECK: .byte 12 // 0xc615; CHECK: .LCPI15_1:616; CHECK: .byte 20 // 0x14617; CHECK: .byte 24 // 0x18618; CHECK: .byte 2 // 0x2619; CHECK: .byte 3 // 0x3620; CHECK: .byte 30 // 0x1e621; CHECK: .byte 19 // 0x13622; CHECK: .byte 6 // 0x6623; CHECK: .byte 7 // 0x7624; CHECK: .byte 20 // 0x14625; CHECK: .byte 24 // 0x18626; CHECK: .byte 10 // 0xa627; CHECK: .byte 11 // 0xb628; CHECK: .byte 30 // 0x1e629; CHECK: .byte 19 // 0x13630; CHECK: .byte 14 // 0xe631; CHECK: .byte 15 // 0xf632define <16 x i8> @insert4_v16i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c, <16 x i8> %d) {633; CHECK-LABEL: insert4_v16i8:634; CHECK: // %bb.0:635; CHECK-NEXT: mov v4.16b, v3.16b636; CHECK-NEXT: adrp x8, .LCPI15_0637; CHECK-NEXT: // kill: def $d0 killed $d0 def $q31_q0638; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2639; CHECK-NEXT: mov v3.16b, v1.16b640; CHECK-NEXT: ldr q5, [x8, :lo12:.LCPI15_0]641; CHECK-NEXT: mov v0.d[1], v2.d[0]642; CHECK-NEXT: adrp x8, .LCPI15_1643; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI15_1]644; CHECK-NEXT: tbl v31.16b, { v3.16b, v4.16b }, v5.16b645; CHECK-NEXT: tbl v0.16b, { v31.16b, v0.16b }, v1.16b646; CHECK-NEXT: ret647 %e1 = extractelement <8 x i8> %a, i32 4648 %e2 = extractelement <8 x i8> %c, i32 0649 %e3 = extractelement <16 x i8> %b, i32 15650 %e4 = extractelement <16 x i8> %d, i32 11651 %e5 = extractelement <8 x i8> %c, i32 6652 %e6 = extractelement <8 x i8> %a, i32 3653 %e7 = extractelement <16 x i8> %d, i32 8654 %e8 = extractelement <16 x i8> %b, i32 12655 %e9 = extractelement <8 x i8> %a, i32 4656 %e10 = extractelement <8 x i8> %c, i32 0657 %e11 = extractelement <16 x i8> %b, i32 15658 %e12 = extractelement <16 x i8> %d, i32 11659 %e13 = extractelement <8 x i8> %c, i32 6660 %e14 = extractelement <8 x i8> %a, i32 3661 %e15 = extractelement <16 x i8> %d, i32 8662 %e16 = extractelement <16 x i8> %b, i32 12663 %i1 = insertelement <16 x i8> undef, i8 %e1, i32 0664 %i2 = insertelement <16 x i8> %i1, i8 %e2, i32 1665 %i3 = insertelement <16 x i8> %i2, i8 %e3, i32 2666 %i4 = insertelement <16 x i8> %i3, i8 %e4, i32 3667 %i5 = insertelement <16 x i8> %i4, i8 %e5, i32 4668 %i6 = insertelement <16 x i8> %i5, i8 %e6, i32 5669 %i7 = insertelement <16 x i8> %i6, i8 %e7, i32 6670 %i8 = insertelement <16 x i8> %i7, i8 %e8, i32 7671 %i9 = insertelement <16 x i8> %i8, i8 %e9, i32 8672 %i10 = insertelement <16 x i8> %i9, i8 %e10, i32 9673 %i11 = insertelement <16 x i8> %i10, i8 %e11, i32 10674 %i12 = insertelement <16 x i8> %i11, i8 %e12, i32 11675 %i13 = insertelement <16 x i8> %i12, i8 %e13, i32 12676 %i14 = insertelement <16 x i8> %i13, i8 %e14, i32 13677 %i15 = insertelement <16 x i8> %i14, i8 %e15, i32 14678 %i16 = insertelement <16 x i8> %i15, i8 %e16, i32 15679 ret <16 x i8> %i16680}681 682 683; CHECK: .LCPI16_0:684; CHECK: .byte 0685; CHECK: .byte 1686; CHECK: .byte 4687; CHECK: .byte 5688; CHECK: .byte 16689; CHECK: .byte 17690; CHECK: .byte 20691; CHECK: .byte 21692; CHECK: .byte 32693; CHECK: .byte 33694; CHECK: .byte 36695; CHECK: .byte 37696; CHECK: .byte 48697; CHECK: .byte 49698; CHECK: .byte 52699; CHECK: .byte 53700define <16 x i16> @test(<2 x double> %l213, <2 x double> %l231, <2 x double> %l249, <2 x double> %l267, <2 x double> %l285, <2 x double> %l303, <2 x double> %l321, <2 x double> %l339) {701; CHECK-LABEL: test:702; CHECK: // %bb.0:703; CHECK-NEXT: frintm v0.2d, v0.2d704; CHECK-NEXT: frintm v4.2d, v4.2d705; CHECK-NEXT: adrp x8, .LCPI16_0706; CHECK-NEXT: frintm v1.2d, v1.2d707; CHECK-NEXT: frintm v5.2d, v5.2d708; CHECK-NEXT: frintm v2.2d, v2.2d709; CHECK-NEXT: frintm v6.2d, v6.2d710; CHECK-NEXT: frintm v3.2d, v3.2d711; CHECK-NEXT: frintm v7.2d, v7.2d712; CHECK-NEXT: fcvtzs v0.2d, v0.2d713; CHECK-NEXT: fcvtzs v4.2d, v4.2d714; CHECK-NEXT: fcvtzs v1.2d, v1.2d715; CHECK-NEXT: fcvtzs v5.2d, v5.2d716; CHECK-NEXT: fcvtzs v2.2d, v2.2d717; CHECK-NEXT: fcvtzs v6.2d, v6.2d718; CHECK-NEXT: fcvtzs v3.2d, v3.2d719; CHECK-NEXT: fcvtzs v7.2d, v7.2d720; CHECK-NEXT: xtn v16.2s, v0.2d721; CHECK-NEXT: xtn v20.2s, v4.2d722; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI16_0]723; CHECK-NEXT: xtn v17.2s, v1.2d724; CHECK-NEXT: xtn v21.2s, v5.2d725; CHECK-NEXT: xtn v18.2s, v2.2d726; CHECK-NEXT: xtn v22.2s, v6.2d727; CHECK-NEXT: xtn v19.2s, v3.2d728; CHECK-NEXT: xtn v23.2s, v7.2d729; CHECK-NEXT: tbl v1.16b, { v16.16b, v17.16b, v18.16b, v19.16b }, v0.16b730; CHECK-NEXT: tbl v2.16b, { v20.16b, v21.16b, v22.16b, v23.16b }, v0.16b731; CHECK-NEXT: uzp1 v0.8h, v1.8h, v2.8h732; CHECK-NEXT: uzp2 v1.8h, v1.8h, v2.8h733; CHECK-NEXT: ret734 %l214 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l213)735 %l215 = fptosi <2 x double> %l214 to <2 x i16>736 %l232 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l231)737 %l233 = fptosi <2 x double> %l232 to <2 x i16>738 %l250 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l249)739 %l251 = fptosi <2 x double> %l250 to <2 x i16>740 %l268 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l267)741 %l269 = fptosi <2 x double> %l268 to <2 x i16>742 %l286 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l285)743 %l287 = fptosi <2 x double> %l286 to <2 x i16>744 %l304 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l303)745 %l305 = fptosi <2 x double> %l304 to <2 x i16>746 %l322 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l321)747 %l323 = fptosi <2 x double> %l322 to <2 x i16>748 %l340 = call fast <2 x double> @llvm.floor.v2f64(<2 x double> %l339)749 %l341 = fptosi <2 x double> %l340 to <2 x i16>750 %l342 = shufflevector <2 x i16> %l215, <2 x i16> %l233, <4 x i32> <i32 0, i32 1, i32 2, i32 3>751 %l343 = shufflevector <2 x i16> %l251, <2 x i16> %l269, <4 x i32> <i32 0, i32 1, i32 2, i32 3>752 %l344 = shufflevector <2 x i16> %l287, <2 x i16> %l305, <4 x i32> <i32 0, i32 1, i32 2, i32 3>753 %l345 = shufflevector <2 x i16> %l323, <2 x i16> %l341, <4 x i32> <i32 0, i32 1, i32 2, i32 3>754 %l346 = shufflevector <4 x i16> %l342, <4 x i16> %l343, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>755 %l347 = shufflevector <4 x i16> %l344, <4 x i16> %l345, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>756 %interleaved.vec = shufflevector <8 x i16> %l346, <8 x i16> %l347, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>757 ret <16 x i16> %interleaved.vec758}759 760declare <2 x double> @llvm.floor.v2f64(<2 x double> %l213)761