214 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm64-apple-ios -mattr=+sve -o - %s | FileCheck %s --check-prefix=CHECK-LE-SD3; RUN: llc -mtriple=aarch64_be-unknown-linux -mattr=+sve -o - %s | FileCheck %s --check-prefix=CHECK-BE4; RUN: llc -mtriple=arm64-apple-ios -global-isel -mattr=+sve -o - %s | FileCheck %s --check-prefix=CHECK-LE-GI5 6define void @zext_of_concat(ptr %a, ptr %b, ptr %c, ptr %d) nounwind {7; CHECK-LE-SD-LABEL: zext_of_concat:8; CHECK-LE-SD: ; %bb.0:9; CHECK-LE-SD-NEXT: ldr d0, [x0]10; CHECK-LE-SD-NEXT: ldr d1, [x1]11; CHECK-LE-SD-NEXT: add.2s v0, v0, v112; CHECK-LE-SD-NEXT: ldr q1, [x2]13; CHECK-LE-SD-NEXT: ushll.2d v0, v0, #014; CHECK-LE-SD-NEXT: add.4s v0, v0, v115; CHECK-LE-SD-NEXT: str q0, [x2]16; CHECK-LE-SD-NEXT: ret17;18; CHECK-BE-LABEL: zext_of_concat:19; CHECK-BE: // %bb.0:20; CHECK-BE-NEXT: ld1 { v0.2s }, [x0]21; CHECK-BE-NEXT: ld1 { v1.2s }, [x1]22; CHECK-BE-NEXT: add v0.2s, v0.2s, v1.2s23; CHECK-BE-NEXT: movi v1.2d, #000000000000000024; CHECK-BE-NEXT: zip1 v0.4s, v0.4s, v0.4s25; CHECK-BE-NEXT: trn2 v0.4s, v0.4s, v1.4s26; CHECK-BE-NEXT: ld1 { v1.4s }, [x2]27; CHECK-BE-NEXT: add v0.4s, v0.4s, v1.4s28; CHECK-BE-NEXT: st1 { v0.4s }, [x2]29; CHECK-BE-NEXT: ret30;31; CHECK-LE-GI-LABEL: zext_of_concat:32; CHECK-LE-GI: ; %bb.0:33; CHECK-LE-GI-NEXT: ldr d0, [x0]34; CHECK-LE-GI-NEXT: ldr d1, [x1]35; CHECK-LE-GI-NEXT: movi.2d v3, #000000000000000036; CHECK-LE-GI-NEXT: Lloh0:37; CHECK-LE-GI-NEXT: adrp x8, lCPI0_0@PAGE38; CHECK-LE-GI-NEXT: add.2s v2, v0, v139; CHECK-LE-GI-NEXT: Lloh1:40; CHECK-LE-GI-NEXT: ldr q0, [x8, lCPI0_0@PAGEOFF]41; CHECK-LE-GI-NEXT: ldr q1, [x2]42; CHECK-LE-GI-NEXT: tbl.16b v0, { v2, v3 }, v043; CHECK-LE-GI-NEXT: add.4s v0, v0, v144; CHECK-LE-GI-NEXT: str q0, [x2]45; CHECK-LE-GI-NEXT: ret46; CHECK-LE-GI-NEXT: .loh AdrpLdr Lloh0, Lloh147 %i0.a = load <2 x i32>, ptr %a48 %i0.b = load <2 x i32>, ptr %b49 %i0 = add <2 x i32> %i0.a, %i0.b50 %i1 = shufflevector <2 x i32> %i0, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>51 %i2 = shufflevector <4 x i32> %i1, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>52 %i3 = load <4 x i32>, ptr %c53 %i4 = add <4 x i32> %i2, %i354 store <4 x i32> %i4, ptr %c55 ret void56}57 58define void @zext_of_concat_extrause(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e) nounwind {59; CHECK-LE-SD-LABEL: zext_of_concat_extrause:60; CHECK-LE-SD: ; %bb.0:61; CHECK-LE-SD-NEXT: ldr d0, [x1]62; CHECK-LE-SD-NEXT: ldr d1, [x0]63; CHECK-LE-SD-NEXT: add.2s v0, v1, v064; CHECK-LE-SD-NEXT: movi.2d v1, #000000000000000065; CHECK-LE-SD-NEXT: mov.d v0[1], v0[0]66; CHECK-LE-SD-NEXT: zip1.4s v1, v0, v167; CHECK-LE-SD-NEXT: str q0, [x4]68; CHECK-LE-SD-NEXT: ldr q0, [x2]69; CHECK-LE-SD-NEXT: add.4s v0, v1, v070; CHECK-LE-SD-NEXT: str q0, [x2]71; CHECK-LE-SD-NEXT: ret72;73; CHECK-BE-LABEL: zext_of_concat_extrause:74; CHECK-BE: // %bb.0:75; CHECK-BE-NEXT: ld1 { v0.2s }, [x1]76; CHECK-BE-NEXT: ld1 { v1.2s }, [x0]77; CHECK-BE-NEXT: movi v2.2d, #000000000000000078; CHECK-BE-NEXT: add v0.2s, v1.2s, v0.2s79; CHECK-BE-NEXT: mov v0.d[1], v0.d[0]80; CHECK-BE-NEXT: zip1 v1.4s, v0.4s, v0.4s81; CHECK-BE-NEXT: st1 { v0.4s }, [x4]82; CHECK-BE-NEXT: trn2 v0.4s, v1.4s, v2.4s83; CHECK-BE-NEXT: ld1 { v1.4s }, [x2]84; CHECK-BE-NEXT: add v0.4s, v0.4s, v1.4s85; CHECK-BE-NEXT: st1 { v0.4s }, [x2]86; CHECK-BE-NEXT: ret87;88; CHECK-LE-GI-LABEL: zext_of_concat_extrause:89; CHECK-LE-GI: ; %bb.0:90; CHECK-LE-GI-NEXT: ldr d0, [x0]91; CHECK-LE-GI-NEXT: ldr d1, [x1]92; CHECK-LE-GI-NEXT: movi.2d v3, #000000000000000093; CHECK-LE-GI-NEXT: Lloh2:94; CHECK-LE-GI-NEXT: adrp x8, lCPI1_0@PAGE95; CHECK-LE-GI-NEXT: add.2s v2, v0, v196; CHECK-LE-GI-NEXT: Lloh3:97; CHECK-LE-GI-NEXT: ldr q0, [x8, lCPI1_0@PAGEOFF]98; CHECK-LE-GI-NEXT: mov.d v2[1], v2[0]99; CHECK-LE-GI-NEXT: tbl.16b v0, { v2, v3 }, v0100; CHECK-LE-GI-NEXT: str q2, [x4]101; CHECK-LE-GI-NEXT: ldr q1, [x2]102; CHECK-LE-GI-NEXT: add.4s v0, v0, v1103; CHECK-LE-GI-NEXT: str q0, [x2]104; CHECK-LE-GI-NEXT: ret105; CHECK-LE-GI-NEXT: .loh AdrpLdr Lloh2, Lloh3106 %i0.a = load <2 x i32>, ptr %a107 %i0.b = load <2 x i32>, ptr %b108 %i0 = add <2 x i32> %i0.a, %i0.b109 %i1 = shufflevector <2 x i32> %i0, <2 x i32> %i0, <4 x i32> <i32 0, i32 1, i32 2, i32 3>110 store <4 x i32> %i1, ptr %e111 %i2 = shufflevector <4 x i32> %i1, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>112 %i3 = load <4 x i32>, ptr %c113 %i4 = add <4 x i32> %i2, %i3114 store <4 x i32> %i4, ptr %c115 ret void116}117 118define void @aext_of_concat(ptr %a, ptr %b, ptr %c, ptr %d) nounwind {119; CHECK-LE-SD-LABEL: aext_of_concat:120; CHECK-LE-SD: ; %bb.0:121; CHECK-LE-SD-NEXT: ldr d0, [x0]122; CHECK-LE-SD-NEXT: ldr d1, [x1]123; CHECK-LE-SD-NEXT: add.2s v0, v0, v1124; CHECK-LE-SD-NEXT: ldr q1, [x2]125; CHECK-LE-SD-NEXT: ushll.2d v0, v0, #0126; CHECK-LE-SD-NEXT: add.4s v0, v0, v1127; CHECK-LE-SD-NEXT: str q0, [x2]128; CHECK-LE-SD-NEXT: ret129;130; CHECK-BE-LABEL: aext_of_concat:131; CHECK-BE: // %bb.0:132; CHECK-BE-NEXT: ld1 { v0.2s }, [x0]133; CHECK-BE-NEXT: ld1 { v1.2s }, [x1]134; CHECK-BE-NEXT: add v0.2s, v0.2s, v1.2s135; CHECK-BE-NEXT: ld1 { v1.4s }, [x2]136; CHECK-BE-NEXT: zip1 v0.4s, v0.4s, v0.4s137; CHECK-BE-NEXT: add v0.4s, v0.4s, v1.4s138; CHECK-BE-NEXT: st1 { v0.4s }, [x2]139; CHECK-BE-NEXT: ret140;141; CHECK-LE-GI-LABEL: aext_of_concat:142; CHECK-LE-GI: ; %bb.0:143; CHECK-LE-GI-NEXT: ldr d0, [x0]144; CHECK-LE-GI-NEXT: ldr d1, [x1]145; CHECK-LE-GI-NEXT: add.2s v0, v0, v1146; CHECK-LE-GI-NEXT: ldr q1, [x2]147; CHECK-LE-GI-NEXT: zip1.4s v0, v0, v0148; CHECK-LE-GI-NEXT: add.4s v0, v0, v1149; CHECK-LE-GI-NEXT: str q0, [x2]150; CHECK-LE-GI-NEXT: ret151 %i0.a = load <2 x i32>, ptr %a152 %i0.b = load <2 x i32>, ptr %b153 %i0 = add <2 x i32> %i0.a, %i0.b154 %i1 = shufflevector <2 x i32> %i0, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>155 %i2 = shufflevector <4 x i32> %i1, <4 x i32> poison, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>156 %i3 = load <4 x i32>, ptr %c157 %i4 = add <4 x i32> %i2, %i3158 store <4 x i32> %i4, ptr %c159 ret void160}161 162define void @aext_of_concat_extrause(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e) nounwind {163; CHECK-LE-SD-LABEL: aext_of_concat_extrause:164; CHECK-LE-SD: ; %bb.0:165; CHECK-LE-SD-NEXT: ldr d0, [x1]166; CHECK-LE-SD-NEXT: ldr d1, [x0]167; CHECK-LE-SD-NEXT: add.2s v0, v1, v0168; CHECK-LE-SD-NEXT: mov.16b v1, v0169; CHECK-LE-SD-NEXT: mov.d v1[1], v0[0]170; CHECK-LE-SD-NEXT: zip1.4s v0, v0, v0171; CHECK-LE-SD-NEXT: str q1, [x4]172; CHECK-LE-SD-NEXT: ldr q1, [x2]173; CHECK-LE-SD-NEXT: add.4s v0, v0, v1174; CHECK-LE-SD-NEXT: str q0, [x2]175; CHECK-LE-SD-NEXT: ret176;177; CHECK-BE-LABEL: aext_of_concat_extrause:178; CHECK-BE: // %bb.0:179; CHECK-BE-NEXT: ld1 { v0.2s }, [x1]180; CHECK-BE-NEXT: ld1 { v1.2s }, [x0]181; CHECK-BE-NEXT: add v0.2s, v1.2s, v0.2s182; CHECK-BE-NEXT: mov v1.16b, v0.16b183; CHECK-BE-NEXT: mov v1.d[1], v0.d[0]184; CHECK-BE-NEXT: zip1 v0.4s, v0.4s, v0.4s185; CHECK-BE-NEXT: st1 { v1.4s }, [x4]186; CHECK-BE-NEXT: ld1 { v1.4s }, [x2]187; CHECK-BE-NEXT: add v0.4s, v0.4s, v1.4s188; CHECK-BE-NEXT: st1 { v0.4s }, [x2]189; CHECK-BE-NEXT: ret190;191; CHECK-LE-GI-LABEL: aext_of_concat_extrause:192; CHECK-LE-GI: ; %bb.0:193; CHECK-LE-GI-NEXT: ldr d0, [x0]194; CHECK-LE-GI-NEXT: ldr d1, [x1]195; CHECK-LE-GI-NEXT: add.2s v0, v0, v1196; CHECK-LE-GI-NEXT: mov.d v0[1], v0[0]197; CHECK-LE-GI-NEXT: zip1.4s v1, v0, v0198; CHECK-LE-GI-NEXT: str q0, [x4]199; CHECK-LE-GI-NEXT: ldr q0, [x2]200; CHECK-LE-GI-NEXT: add.4s v0, v1, v0201; CHECK-LE-GI-NEXT: str q0, [x2]202; CHECK-LE-GI-NEXT: ret203 %i0.a = load <2 x i32>, ptr %a204 %i0.b = load <2 x i32>, ptr %b205 %i0 = add <2 x i32> %i0.a, %i0.b206 %i1 = shufflevector <2 x i32> %i0, <2 x i32> %i0, <4 x i32> <i32 0, i32 1, i32 2, i32 3>207 store <4 x i32> %i1, ptr %e208 %i2 = shufflevector <4 x i32> %i1, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>209 %i3 = load <4 x i32>, ptr %c210 %i4 = add <4 x i32> %i2, %i3211 store <4 x i32> %i4, ptr %c212 ret void213}214