391 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc < %s -global-isel -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-GISEL4 5; Tests of shufflevector where the index operand is half the width of the vector6; operands. We should get one ext instruction and not two.7 8; i8 tests9define <8 x i8> @i8_off0(<16 x i8> %arg1, <16 x i8> %arg2) {10; CHECK-LABEL: i8_off0:11; CHECK: // %bb.0: // %entry12; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q013; CHECK-NEXT: ret14entry:15 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>16 ret <8 x i8> %shuffle17}18 19define <8 x i8> @i8_off1(<16 x i8> %arg1, <16 x i8> %arg2) {20; CHECK-LABEL: i8_off1:21; CHECK: // %bb.0: // %entry22; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #123; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q024; CHECK-NEXT: ret25entry:26 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8>27 ret <8 x i8> %shuffle28}29 30define <8 x i8> @i8_off8(<16 x i8> %arg1, <16 x i8> %arg2) {31; CHECK-SD-LABEL: i8_off8:32; CHECK-SD: // %bb.0: // %entry33; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #834; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q035; CHECK-SD-NEXT: ret36;37; CHECK-GISEL-LABEL: i8_off8:38; CHECK-GISEL: // %bb.0: // %entry39; CHECK-GISEL-NEXT: mov d0, v0.d[1]40; CHECK-GISEL-NEXT: ret41entry:42 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>43 ret <8 x i8> %shuffle44}45 46define <8 x i8> @i8_off15(<16 x i8> %arg1, <16 x i8> %arg2) {47; CHECK-LABEL: i8_off15:48; CHECK: // %bb.0: // %entry49; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #1550; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q051; CHECK-NEXT: ret52entry:53 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22>54 ret <8 x i8> %shuffle55}56 57define <8 x i8> @i8_off22(<16 x i8> %arg1, <16 x i8> %arg2) {58; CHECK-SD-LABEL: i8_off22:59; CHECK-SD: // %bb.0: // %entry60; CHECK-SD-NEXT: ext v0.16b, v1.16b, v1.16b, #661; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q062; CHECK-SD-NEXT: ret63;64; CHECK-GISEL-LABEL: i8_off22:65; CHECK-GISEL: // %bb.0: // %entry66; CHECK-GISEL-NEXT: ext v0.16b, v1.16b, v0.16b, #667; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q068; CHECK-GISEL-NEXT: ret69entry:70 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29>71 ret <8 x i8> %shuffle72}73 74; i16 tests75define <4 x i16> @i16_off0(<8 x i16> %arg1, <8 x i16> %arg2) {76; CHECK-LABEL: i16_off0:77; CHECK: // %bb.0: // %entry78; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q079; CHECK-NEXT: ret80entry:81 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> %arg2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>82 ret <4 x i16> %shuffle83}84 85define <4 x i16> @i16_off1(<8 x i16> %arg1, <8 x i16> %arg2) {86; CHECK-LABEL: i16_off1:87; CHECK: // %bb.0: // %entry88; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #289; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q090; CHECK-NEXT: ret91entry:92 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> %arg2, <4 x i32> <i32 1, i32 2, i32 3, i32 4>93 ret <4 x i16> %shuffle94}95 96define <4 x i16> @i16_off7(<8 x i16> %arg1, <8 x i16> %arg2) {97; CHECK-LABEL: i16_off7:98; CHECK: // %bb.0: // %entry99; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #14100; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0101; CHECK-NEXT: ret102entry:103 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> %arg2, <4 x i32> <i32 7, i32 8, i32 9, i32 10>104 ret <4 x i16> %shuffle105}106 107define <4 x i16> @i16_off8(<8 x i16> %arg1, <8 x i16> %arg2) {108; CHECK-LABEL: i16_off8:109; CHECK: // %bb.0: // %entry110; CHECK-NEXT: mov v0.16b, v1.16b111; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0112; CHECK-NEXT: ret113entry:114 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> %arg2, <4 x i32> <i32 8, i32 9, i32 10, i32 11>115 ret <4 x i16> %shuffle116}117 118; i32 tests119define <2 x i32> @i32_off0(<4 x i32> %arg1, <4 x i32> %arg2) {120; CHECK-LABEL: i32_off0:121; CHECK: // %bb.0: // %entry122; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0123; CHECK-NEXT: ret124entry:125 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> %arg2, <2 x i32> <i32 0, i32 1>126 ret <2 x i32> %shuffle127}128 129define <2 x i32> @i32_off1(<4 x i32> %arg1, <4 x i32> %arg2) {130; CHECK-LABEL: i32_off1:131; CHECK: // %bb.0: // %entry132; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #4133; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0134; CHECK-NEXT: ret135entry:136 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> %arg2, <2 x i32> <i32 1, i32 2>137 ret <2 x i32> %shuffle138}139 140define <2 x i32> @i32_off3(<4 x i32> %arg1, <4 x i32> %arg2) {141; CHECK-LABEL: i32_off3:142; CHECK: // %bb.0: // %entry143; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #12144; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0145; CHECK-NEXT: ret146entry:147 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> %arg2, <2 x i32> <i32 3, i32 4>148 ret <2 x i32> %shuffle149}150 151define <2 x i32> @i32_off4(<4 x i32> %arg1, <4 x i32> %arg2) {152; CHECK-LABEL: i32_off4:153; CHECK: // %bb.0: // %entry154; CHECK-NEXT: mov v0.16b, v1.16b155; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0156; CHECK-NEXT: ret157entry:158 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> %arg2, <2 x i32> <i32 4, i32 5>159 ret <2 x i32> %shuffle160}161 162; i64 tests163define <1 x i64> @i64_off0(<2 x i64> %arg1, <2 x i64> %arg2) {164; CHECK-LABEL: i64_off0:165; CHECK: // %bb.0: // %entry166; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0167; CHECK-NEXT: ret168entry:169 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> %arg2, <1 x i32> <i32 0>170 ret <1 x i64> %shuffle171}172 173define <1 x i64> @i64_off1(<2 x i64> %arg1, <2 x i64> %arg2) {174; CHECK-SD-LABEL: i64_off1:175; CHECK-SD: // %bb.0: // %entry176; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8177; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0178; CHECK-SD-NEXT: ret179;180; CHECK-GISEL-LABEL: i64_off1:181; CHECK-GISEL: // %bb.0: // %entry182; CHECK-GISEL-NEXT: mov d0, v0.d[1]183; CHECK-GISEL-NEXT: ret184entry:185 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> %arg2, <1 x i32> <i32 1>186 ret <1 x i64> %shuffle187}188 189define <1 x i64> @i64_off2(<2 x i64> %arg1, <2 x i64> %arg2) {190; CHECK-LABEL: i64_off2:191; CHECK: // %bb.0: // %entry192; CHECK-NEXT: mov v0.16b, v1.16b193; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0194; CHECK-NEXT: ret195entry:196 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> %arg2, <1 x i32> <i32 2>197 ret <1 x i64> %shuffle198}199 200; i8 tests with second operand zero201define <8 x i8> @i8_zero_off0(<16 x i8> %arg1) {202; CHECK-LABEL: i8_zero_off0:203; CHECK: // %bb.0: // %entry204; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0205; CHECK-NEXT: ret206entry:207 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>208 ret <8 x i8> %shuffle209}210 211define <8 x i8> @i8_zero_off1(<16 x i8> %arg1) {212; CHECK-LABEL: i8_zero_off1:213; CHECK: // %bb.0: // %entry214; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #1215; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0216; CHECK-NEXT: ret217entry:218 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8>219 ret <8 x i8> %shuffle220}221 222define <8 x i8> @i8_zero_off8(<16 x i8> %arg1) {223; CHECK-SD-LABEL: i8_zero_off8:224; CHECK-SD: // %bb.0: // %entry225; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8226; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0227; CHECK-SD-NEXT: ret228;229; CHECK-GISEL-LABEL: i8_zero_off8:230; CHECK-GISEL: // %bb.0: // %entry231; CHECK-GISEL-NEXT: mov d0, v0.d[1]232; CHECK-GISEL-NEXT: ret233entry:234 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>235 ret <8 x i8> %shuffle236}237 238define <8 x i8> @i8_zero_off15(<16 x i8> %arg1) {239; CHECK-LABEL: i8_zero_off15:240; CHECK: // %bb.0: // %entry241; CHECK-NEXT: movi v1.2d, #0000000000000000242; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #15243; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0244; CHECK-NEXT: ret245entry:246 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22>247 ret <8 x i8> %shuffle248}249 250define <8 x i8> @i8_zero_off22(<16 x i8> %arg1) {251; CHECK-SD-LABEL: i8_zero_off22:252; CHECK-SD: // %bb.0: // %entry253; CHECK-SD-NEXT: movi v0.2d, #0000000000000000254; CHECK-SD-NEXT: ret255;256; CHECK-GISEL-LABEL: i8_zero_off22:257; CHECK-GISEL: // %bb.0: // %entry258; CHECK-GISEL-NEXT: movi v0.2d, #0000000000000000259; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v0.16b, #6260; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0261; CHECK-GISEL-NEXT: ret262entry:263 %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29>264 ret <8 x i8> %shuffle265}266 267; i16 tests with second operand zero268define <4 x i16> @i16_zero_off0(<8 x i16> %arg1) {269; CHECK-LABEL: i16_zero_off0:270; CHECK: // %bb.0: // %entry271; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0272; CHECK-NEXT: ret273entry:274 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>275 ret <4 x i16> %shuffle276}277 278define <4 x i16> @i16_zero_off1(<8 x i16> %arg1) {279; CHECK-LABEL: i16_zero_off1:280; CHECK: // %bb.0: // %entry281; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #2282; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0283; CHECK-NEXT: ret284entry:285 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> zeroinitializer, <4 x i32> <i32 1, i32 2, i32 3, i32 4>286 ret <4 x i16> %shuffle287}288 289define <4 x i16> @i16_zero_off7(<8 x i16> %arg1) {290; CHECK-LABEL: i16_zero_off7:291; CHECK: // %bb.0: // %entry292; CHECK-NEXT: movi v1.2d, #0000000000000000293; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #14294; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0295; CHECK-NEXT: ret296entry:297 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> zeroinitializer, <4 x i32> <i32 7, i32 8, i32 9, i32 10>298 ret <4 x i16> %shuffle299}300 301define <4 x i16> @i16_zero_off8(<8 x i16> %arg1) {302; CHECK-LABEL: i16_zero_off8:303; CHECK: // %bb.0: // %entry304; CHECK-NEXT: movi v0.2d, #0000000000000000305; CHECK-NEXT: ret306entry:307 %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> zeroinitializer, <4 x i32> <i32 8, i32 9, i32 10, i32 11>308 ret <4 x i16> %shuffle309}310 311; i32 tests with second operand zero312define <2 x i32> @i32_zero_off0(<4 x i32> %arg1) {313; CHECK-LABEL: i32_zero_off0:314; CHECK: // %bb.0: // %entry315; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0316; CHECK-NEXT: ret317entry:318 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> zeroinitializer, <2 x i32> <i32 0, i32 1>319 ret <2 x i32> %shuffle320}321 322define <2 x i32> @i32_zero_off1(<4 x i32> %arg1) {323; CHECK-LABEL: i32_zero_off1:324; CHECK: // %bb.0: // %entry325; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #4326; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0327; CHECK-NEXT: ret328entry:329 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> zeroinitializer, <2 x i32> <i32 1, i32 2>330 ret <2 x i32> %shuffle331}332 333define <2 x i32> @i32_zero_off3(<4 x i32> %arg1) {334; CHECK-LABEL: i32_zero_off3:335; CHECK: // %bb.0: // %entry336; CHECK-NEXT: movi v1.2d, #0000000000000000337; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #12338; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0339; CHECK-NEXT: ret340entry:341 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> zeroinitializer, <2 x i32> <i32 3, i32 4>342 ret <2 x i32> %shuffle343}344 345define <2 x i32> @i32_zero_off4(<4 x i32> %arg1) {346; CHECK-LABEL: i32_zero_off4:347; CHECK: // %bb.0: // %entry348; CHECK-NEXT: movi v0.2d, #0000000000000000349; CHECK-NEXT: ret350entry:351 %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> zeroinitializer, <2 x i32> <i32 4, i32 5>352 ret <2 x i32> %shuffle353}354 355; i64 tests with second operand zero356define <1 x i64> @i64_zero_off0(<2 x i64> %arg1) {357; CHECK-LABEL: i64_zero_off0:358; CHECK: // %bb.0: // %entry359; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0360; CHECK-NEXT: ret361entry:362 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> zeroinitializer, <1 x i32> <i32 0>363 ret <1 x i64> %shuffle364}365 366define <1 x i64> @i64_zero_off1(<2 x i64> %arg1) {367; CHECK-SD-LABEL: i64_zero_off1:368; CHECK-SD: // %bb.0: // %entry369; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8370; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0371; CHECK-SD-NEXT: ret372;373; CHECK-GISEL-LABEL: i64_zero_off1:374; CHECK-GISEL: // %bb.0: // %entry375; CHECK-GISEL-NEXT: mov d0, v0.d[1]376; CHECK-GISEL-NEXT: ret377entry:378 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> zeroinitializer, <1 x i32> <i32 1>379 ret <1 x i64> %shuffle380}381 382define <1 x i64> @i64_zero_off2(<2 x i64> %arg1) {383; CHECK-LABEL: i64_zero_off2:384; CHECK: // %bb.0: // %entry385; CHECK-NEXT: movi d0, #0000000000000000386; CHECK-NEXT: ret387entry:388 %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> zeroinitializer, <1 x i32> <i32 2>389 ret <1 x i64> %shuffle390}391