293 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8define void @uabd_v16i8_v16i16(ptr %a, ptr %b) {9; CHECK-LABEL: uabd_v16i8_v16i16:10; CHECK: // %bb.0:11; CHECK-NEXT: ptrue p0.b, vl1612; CHECK-NEXT: ldr q0, [x0]13; CHECK-NEXT: ldr q1, [x1]14; CHECK-NEXT: uabd z0.b, p0/m, z0.b, z1.b15; CHECK-NEXT: str q0, [x0]16; CHECK-NEXT: ret17;18; NONEON-NOSVE-LABEL: uabd_v16i8_v16i16:19; NONEON-NOSVE: // %bb.0:20; NONEON-NOSVE-NEXT: ldr q0, [x1]21; NONEON-NOSVE-NEXT: ldr q1, [x0]22; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!23; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 4824; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]25; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]26; NONEON-NOSVE-NEXT: subs w8, w9, w827; NONEON-NOSVE-NEXT: csetm w9, hi28; NONEON-NOSVE-NEXT: eor w8, w8, w929; NONEON-NOSVE-NEXT: sub w8, w9, w830; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]31; NONEON-NOSVE-NEXT: strb w8, [sp, #47]32; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]33; NONEON-NOSVE-NEXT: subs w8, w9, w834; NONEON-NOSVE-NEXT: csetm w9, hi35; NONEON-NOSVE-NEXT: eor w8, w8, w936; NONEON-NOSVE-NEXT: sub w8, w9, w837; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]38; NONEON-NOSVE-NEXT: strb w8, [sp, #46]39; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]40; NONEON-NOSVE-NEXT: subs w8, w9, w841; NONEON-NOSVE-NEXT: csetm w9, hi42; NONEON-NOSVE-NEXT: eor w8, w8, w943; NONEON-NOSVE-NEXT: sub w8, w9, w844; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]45; NONEON-NOSVE-NEXT: strb w8, [sp, #45]46; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]47; NONEON-NOSVE-NEXT: subs w8, w9, w848; NONEON-NOSVE-NEXT: csetm w9, hi49; NONEON-NOSVE-NEXT: eor w8, w8, w950; NONEON-NOSVE-NEXT: sub w8, w9, w851; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]52; NONEON-NOSVE-NEXT: strb w8, [sp, #44]53; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]54; NONEON-NOSVE-NEXT: subs w8, w9, w855; NONEON-NOSVE-NEXT: csetm w9, hi56; NONEON-NOSVE-NEXT: eor w8, w8, w957; NONEON-NOSVE-NEXT: sub w8, w9, w858; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]59; NONEON-NOSVE-NEXT: strb w8, [sp, #43]60; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]61; NONEON-NOSVE-NEXT: subs w8, w9, w862; NONEON-NOSVE-NEXT: csetm w9, hi63; NONEON-NOSVE-NEXT: eor w8, w8, w964; NONEON-NOSVE-NEXT: sub w8, w9, w865; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]66; NONEON-NOSVE-NEXT: strb w8, [sp, #42]67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]68; NONEON-NOSVE-NEXT: subs w8, w9, w869; NONEON-NOSVE-NEXT: csetm w9, hi70; NONEON-NOSVE-NEXT: eor w8, w8, w971; NONEON-NOSVE-NEXT: sub w8, w9, w872; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]73; NONEON-NOSVE-NEXT: strb w8, [sp, #41]74; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]75; NONEON-NOSVE-NEXT: subs w8, w9, w876; NONEON-NOSVE-NEXT: csetm w9, hi77; NONEON-NOSVE-NEXT: eor w8, w8, w978; NONEON-NOSVE-NEXT: sub w8, w9, w879; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]80; NONEON-NOSVE-NEXT: strb w8, [sp, #40]81; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]82; NONEON-NOSVE-NEXT: subs w8, w9, w883; NONEON-NOSVE-NEXT: csetm w9, hi84; NONEON-NOSVE-NEXT: eor w8, w8, w985; NONEON-NOSVE-NEXT: sub w8, w9, w886; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]87; NONEON-NOSVE-NEXT: strb w8, [sp, #39]88; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]89; NONEON-NOSVE-NEXT: subs w8, w9, w890; NONEON-NOSVE-NEXT: csetm w9, hi91; NONEON-NOSVE-NEXT: eor w8, w8, w992; NONEON-NOSVE-NEXT: sub w8, w9, w893; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]94; NONEON-NOSVE-NEXT: strb w8, [sp, #38]95; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]96; NONEON-NOSVE-NEXT: subs w8, w9, w897; NONEON-NOSVE-NEXT: csetm w9, hi98; NONEON-NOSVE-NEXT: eor w8, w8, w999; NONEON-NOSVE-NEXT: sub w8, w9, w8100; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]101; NONEON-NOSVE-NEXT: strb w8, [sp, #37]102; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]103; NONEON-NOSVE-NEXT: subs w8, w9, w8104; NONEON-NOSVE-NEXT: csetm w9, hi105; NONEON-NOSVE-NEXT: eor w8, w8, w9106; NONEON-NOSVE-NEXT: sub w8, w9, w8107; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]108; NONEON-NOSVE-NEXT: strb w8, [sp, #36]109; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]110; NONEON-NOSVE-NEXT: subs w8, w9, w8111; NONEON-NOSVE-NEXT: csetm w9, hi112; NONEON-NOSVE-NEXT: eor w8, w8, w9113; NONEON-NOSVE-NEXT: sub w8, w9, w8114; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]115; NONEON-NOSVE-NEXT: strb w8, [sp, #35]116; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]117; NONEON-NOSVE-NEXT: subs w8, w9, w8118; NONEON-NOSVE-NEXT: csetm w9, hi119; NONEON-NOSVE-NEXT: eor w8, w8, w9120; NONEON-NOSVE-NEXT: sub w8, w9, w8121; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]122; NONEON-NOSVE-NEXT: strb w8, [sp, #34]123; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]124; NONEON-NOSVE-NEXT: subs w8, w9, w8125; NONEON-NOSVE-NEXT: csetm w9, hi126; NONEON-NOSVE-NEXT: eor w8, w8, w9127; NONEON-NOSVE-NEXT: sub w8, w9, w8128; NONEON-NOSVE-NEXT: ldrb w9, [sp]129; NONEON-NOSVE-NEXT: strb w8, [sp, #33]130; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]131; NONEON-NOSVE-NEXT: subs w8, w9, w8132; NONEON-NOSVE-NEXT: csetm w9, hi133; NONEON-NOSVE-NEXT: eor w8, w8, w9134; NONEON-NOSVE-NEXT: sub w8, w9, w8135; NONEON-NOSVE-NEXT: strb w8, [sp, #32]136; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]137; NONEON-NOSVE-NEXT: str q0, [x0]138; NONEON-NOSVE-NEXT: add sp, sp, #48139; NONEON-NOSVE-NEXT: ret140 %a.ld = load <16 x i8>, ptr %a141 %b.ld = load <16 x i8>, ptr %b142 %a.sext = zext <16 x i8> %a.ld to <16 x i16>143 %b.sext = zext <16 x i8> %b.ld to <16 x i16>144 %sub = sub <16 x i16> %a.sext, %b.sext145 %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true)146 %trunc = trunc <16 x i16> %abs to <16 x i8>147 store <16 x i8> %trunc, ptr %a148 ret void149}150 151define void @sabd_v16i8_v16i16(ptr %a, ptr %b) {152; CHECK-LABEL: sabd_v16i8_v16i16:153; CHECK: // %bb.0:154; CHECK-NEXT: ptrue p0.b, vl16155; CHECK-NEXT: ldr q0, [x0]156; CHECK-NEXT: ldr q1, [x1]157; CHECK-NEXT: sabd z0.b, p0/m, z0.b, z1.b158; CHECK-NEXT: str q0, [x0]159; CHECK-NEXT: ret160;161; NONEON-NOSVE-LABEL: sabd_v16i8_v16i16:162; NONEON-NOSVE: // %bb.0:163; NONEON-NOSVE-NEXT: ldr q0, [x1]164; NONEON-NOSVE-NEXT: ldr q1, [x0]165; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!166; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48167; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]168; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]169; NONEON-NOSVE-NEXT: subs w8, w9, w8170; NONEON-NOSVE-NEXT: csetm w9, gt171; NONEON-NOSVE-NEXT: eor w8, w8, w9172; NONEON-NOSVE-NEXT: sub w8, w9, w8173; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]174; NONEON-NOSVE-NEXT: strb w8, [sp, #47]175; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]176; NONEON-NOSVE-NEXT: subs w8, w9, w8177; NONEON-NOSVE-NEXT: csetm w9, gt178; NONEON-NOSVE-NEXT: eor w8, w8, w9179; NONEON-NOSVE-NEXT: sub w8, w9, w8180; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]181; NONEON-NOSVE-NEXT: strb w8, [sp, #46]182; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]183; NONEON-NOSVE-NEXT: subs w8, w9, w8184; NONEON-NOSVE-NEXT: csetm w9, gt185; NONEON-NOSVE-NEXT: eor w8, w8, w9186; NONEON-NOSVE-NEXT: sub w8, w9, w8187; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]188; NONEON-NOSVE-NEXT: strb w8, [sp, #45]189; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]190; NONEON-NOSVE-NEXT: subs w8, w9, w8191; NONEON-NOSVE-NEXT: csetm w9, gt192; NONEON-NOSVE-NEXT: eor w8, w8, w9193; NONEON-NOSVE-NEXT: sub w8, w9, w8194; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]195; NONEON-NOSVE-NEXT: strb w8, [sp, #44]196; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]197; NONEON-NOSVE-NEXT: subs w8, w9, w8198; NONEON-NOSVE-NEXT: csetm w9, gt199; NONEON-NOSVE-NEXT: eor w8, w8, w9200; NONEON-NOSVE-NEXT: sub w8, w9, w8201; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]202; NONEON-NOSVE-NEXT: strb w8, [sp, #43]203; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]204; NONEON-NOSVE-NEXT: subs w8, w9, w8205; NONEON-NOSVE-NEXT: csetm w9, gt206; NONEON-NOSVE-NEXT: eor w8, w8, w9207; NONEON-NOSVE-NEXT: sub w8, w9, w8208; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]209; NONEON-NOSVE-NEXT: strb w8, [sp, #42]210; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]211; NONEON-NOSVE-NEXT: subs w8, w9, w8212; NONEON-NOSVE-NEXT: csetm w9, gt213; NONEON-NOSVE-NEXT: eor w8, w8, w9214; NONEON-NOSVE-NEXT: sub w8, w9, w8215; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]216; NONEON-NOSVE-NEXT: strb w8, [sp, #41]217; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]218; NONEON-NOSVE-NEXT: subs w8, w9, w8219; NONEON-NOSVE-NEXT: csetm w9, gt220; NONEON-NOSVE-NEXT: eor w8, w8, w9221; NONEON-NOSVE-NEXT: sub w8, w9, w8222; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]223; NONEON-NOSVE-NEXT: strb w8, [sp, #40]224; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]225; NONEON-NOSVE-NEXT: subs w8, w9, w8226; NONEON-NOSVE-NEXT: csetm w9, gt227; NONEON-NOSVE-NEXT: eor w8, w8, w9228; NONEON-NOSVE-NEXT: sub w8, w9, w8229; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]230; NONEON-NOSVE-NEXT: strb w8, [sp, #39]231; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]232; NONEON-NOSVE-NEXT: subs w8, w9, w8233; NONEON-NOSVE-NEXT: csetm w9, gt234; NONEON-NOSVE-NEXT: eor w8, w8, w9235; NONEON-NOSVE-NEXT: sub w8, w9, w8236; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]237; NONEON-NOSVE-NEXT: strb w8, [sp, #38]238; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]239; NONEON-NOSVE-NEXT: subs w8, w9, w8240; NONEON-NOSVE-NEXT: csetm w9, gt241; NONEON-NOSVE-NEXT: eor w8, w8, w9242; NONEON-NOSVE-NEXT: sub w8, w9, w8243; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]244; NONEON-NOSVE-NEXT: strb w8, [sp, #37]245; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]246; NONEON-NOSVE-NEXT: subs w8, w9, w8247; NONEON-NOSVE-NEXT: csetm w9, gt248; NONEON-NOSVE-NEXT: eor w8, w8, w9249; NONEON-NOSVE-NEXT: sub w8, w9, w8250; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]251; NONEON-NOSVE-NEXT: strb w8, [sp, #36]252; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]253; NONEON-NOSVE-NEXT: subs w8, w9, w8254; NONEON-NOSVE-NEXT: csetm w9, gt255; NONEON-NOSVE-NEXT: eor w8, w8, w9256; NONEON-NOSVE-NEXT: sub w8, w9, w8257; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]258; NONEON-NOSVE-NEXT: strb w8, [sp, #35]259; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]260; NONEON-NOSVE-NEXT: subs w8, w9, w8261; NONEON-NOSVE-NEXT: csetm w9, gt262; NONEON-NOSVE-NEXT: eor w8, w8, w9263; NONEON-NOSVE-NEXT: sub w8, w9, w8264; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]265; NONEON-NOSVE-NEXT: strb w8, [sp, #34]266; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]267; NONEON-NOSVE-NEXT: subs w8, w9, w8268; NONEON-NOSVE-NEXT: csetm w9, gt269; NONEON-NOSVE-NEXT: eor w8, w8, w9270; NONEON-NOSVE-NEXT: sub w8, w9, w8271; NONEON-NOSVE-NEXT: ldrsb w9, [sp]272; NONEON-NOSVE-NEXT: strb w8, [sp, #33]273; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]274; NONEON-NOSVE-NEXT: subs w8, w9, w8275; NONEON-NOSVE-NEXT: csetm w9, gt276; NONEON-NOSVE-NEXT: eor w8, w8, w9277; NONEON-NOSVE-NEXT: sub w8, w9, w8278; NONEON-NOSVE-NEXT: strb w8, [sp, #32]279; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]280; NONEON-NOSVE-NEXT: str q0, [x0]281; NONEON-NOSVE-NEXT: add sp, sp, #48282; NONEON-NOSVE-NEXT: ret283 %a.ld = load <16 x i8>, ptr %a284 %b.ld = load <16 x i8>, ptr %b285 %a.sext = sext <16 x i8> %a.ld to <16 x i16>286 %b.sext = sext <16 x i8> %b.ld to <16 x i16>287 %sub = sub <16 x i16> %a.sext, %b.sext288 %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true)289 %trunc = trunc <16 x i16> %abs to <16 x i8>290 store <16 x i8> %trunc, ptr %a291 ret void292}293