brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.3 KiB · f62cfef Raw
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