3267 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 8;9; SMAX10;11 12define <8 x i8> @smax_v8i8(<8 x i8> %op1, <8 x i8> %op2) {13; CHECK-LABEL: smax_v8i8:14; CHECK: // %bb.0:15; CHECK-NEXT: ptrue p0.b, vl816; CHECK-NEXT: // kill: def $d0 killed $d0 def $z017; CHECK-NEXT: // kill: def $d1 killed $d1 def $z118; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b19; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z020; CHECK-NEXT: ret21;22; NONEON-NOSVE-LABEL: smax_v8i8:23; NONEON-NOSVE: // %bb.0:24; NONEON-NOSVE-NEXT: sub sp, sp, #3225; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3226; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]27; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]28; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]29; NONEON-NOSVE-NEXT: cmp w9, w830; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt31; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]32; NONEON-NOSVE-NEXT: strb w8, [sp, #31]33; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]34; NONEON-NOSVE-NEXT: cmp w9, w835; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt36; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]37; NONEON-NOSVE-NEXT: strb w8, [sp, #30]38; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]39; NONEON-NOSVE-NEXT: cmp w9, w840; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt41; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]42; NONEON-NOSVE-NEXT: strb w8, [sp, #29]43; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]44; NONEON-NOSVE-NEXT: cmp w9, w845; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt46; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]47; NONEON-NOSVE-NEXT: strb w8, [sp, #28]48; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]49; NONEON-NOSVE-NEXT: cmp w9, w850; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt51; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]52; NONEON-NOSVE-NEXT: strb w8, [sp, #27]53; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]54; NONEON-NOSVE-NEXT: cmp w9, w855; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt56; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]57; NONEON-NOSVE-NEXT: strb w8, [sp, #26]58; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]59; NONEON-NOSVE-NEXT: cmp w9, w860; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt61; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]62; NONEON-NOSVE-NEXT: strb w8, [sp, #25]63; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]64; NONEON-NOSVE-NEXT: cmp w9, w865; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt66; NONEON-NOSVE-NEXT: strb w8, [sp, #24]67; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]68; NONEON-NOSVE-NEXT: add sp, sp, #3269; NONEON-NOSVE-NEXT: ret70 %res = call <8 x i8> @llvm.smax.v8i8(<8 x i8> %op1, <8 x i8> %op2)71 ret <8 x i8> %res72}73 74define <16 x i8> @smax_v16i8(<16 x i8> %op1, <16 x i8> %op2) {75; CHECK-LABEL: smax_v16i8:76; CHECK: // %bb.0:77; CHECK-NEXT: ptrue p0.b, vl1678; CHECK-NEXT: // kill: def $q0 killed $q0 def $z079; CHECK-NEXT: // kill: def $q1 killed $q1 def $z180; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b81; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z082; CHECK-NEXT: ret83;84; NONEON-NOSVE-LABEL: smax_v16i8:85; NONEON-NOSVE: // %bb.0:86; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!87; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 4888; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]89; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]90; NONEON-NOSVE-NEXT: cmp w9, w891; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt92; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]93; NONEON-NOSVE-NEXT: strb w8, [sp, #47]94; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]95; NONEON-NOSVE-NEXT: cmp w9, w896; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt97; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]98; NONEON-NOSVE-NEXT: strb w8, [sp, #46]99; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]100; NONEON-NOSVE-NEXT: cmp w9, w8101; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt102; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]103; NONEON-NOSVE-NEXT: strb w8, [sp, #45]104; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]105; NONEON-NOSVE-NEXT: cmp w9, w8106; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt107; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]108; NONEON-NOSVE-NEXT: strb w8, [sp, #44]109; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]110; NONEON-NOSVE-NEXT: cmp w9, w8111; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt112; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]113; NONEON-NOSVE-NEXT: strb w8, [sp, #43]114; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]115; NONEON-NOSVE-NEXT: cmp w9, w8116; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt117; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]118; NONEON-NOSVE-NEXT: strb w8, [sp, #42]119; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]120; NONEON-NOSVE-NEXT: cmp w9, w8121; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt122; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]123; NONEON-NOSVE-NEXT: strb w8, [sp, #41]124; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]125; NONEON-NOSVE-NEXT: cmp w9, w8126; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt127; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]128; NONEON-NOSVE-NEXT: strb w8, [sp, #40]129; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]130; NONEON-NOSVE-NEXT: cmp w9, w8131; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt132; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]133; NONEON-NOSVE-NEXT: strb w8, [sp, #39]134; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]135; NONEON-NOSVE-NEXT: cmp w9, w8136; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt137; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]138; NONEON-NOSVE-NEXT: strb w8, [sp, #38]139; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]140; NONEON-NOSVE-NEXT: cmp w9, w8141; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt142; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]143; NONEON-NOSVE-NEXT: strb w8, [sp, #37]144; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]145; NONEON-NOSVE-NEXT: cmp w9, w8146; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt147; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]148; NONEON-NOSVE-NEXT: strb w8, [sp, #36]149; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]150; NONEON-NOSVE-NEXT: cmp w9, w8151; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt152; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]153; NONEON-NOSVE-NEXT: strb w8, [sp, #35]154; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]155; NONEON-NOSVE-NEXT: cmp w9, w8156; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt157; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]158; NONEON-NOSVE-NEXT: strb w8, [sp, #34]159; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]160; NONEON-NOSVE-NEXT: cmp w9, w8161; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt162; NONEON-NOSVE-NEXT: ldrsb w9, [sp]163; NONEON-NOSVE-NEXT: strb w8, [sp, #33]164; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]165; NONEON-NOSVE-NEXT: cmp w9, w8166; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt167; NONEON-NOSVE-NEXT: strb w8, [sp, #32]168; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]169; NONEON-NOSVE-NEXT: add sp, sp, #48170; NONEON-NOSVE-NEXT: ret171 %res = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %op1, <16 x i8> %op2)172 ret <16 x i8> %res173}174 175define void @smax_v32i8(ptr %a, ptr %b) {176; CHECK-LABEL: smax_v32i8:177; CHECK: // %bb.0:178; CHECK-NEXT: ldp q0, q3, [x1]179; CHECK-NEXT: ptrue p0.b, vl16180; CHECK-NEXT: ldp q1, q2, [x0]181; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b182; CHECK-NEXT: smax z2.b, p0/m, z2.b, z3.b183; CHECK-NEXT: stp q0, q2, [x0]184; CHECK-NEXT: ret185;186; NONEON-NOSVE-LABEL: smax_v32i8:187; NONEON-NOSVE: // %bb.0:188; NONEON-NOSVE-NEXT: sub sp, sp, #96189; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96190; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]191; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]192; NONEON-NOSVE-NEXT: stp q2, q3, [sp]193; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]194; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #63]195; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47]196; NONEON-NOSVE-NEXT: cmp w9, w8197; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt198; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46]199; NONEON-NOSVE-NEXT: strb w8, [sp, #95]200; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #62]201; NONEON-NOSVE-NEXT: cmp w9, w8202; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt203; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45]204; NONEON-NOSVE-NEXT: strb w8, [sp, #94]205; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #61]206; NONEON-NOSVE-NEXT: cmp w9, w8207; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt208; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44]209; NONEON-NOSVE-NEXT: strb w8, [sp, #93]210; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #60]211; NONEON-NOSVE-NEXT: cmp w9, w8212; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt213; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43]214; NONEON-NOSVE-NEXT: strb w8, [sp, #92]215; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #59]216; NONEON-NOSVE-NEXT: cmp w9, w8217; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt218; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42]219; NONEON-NOSVE-NEXT: strb w8, [sp, #91]220; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #58]221; NONEON-NOSVE-NEXT: cmp w9, w8222; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt223; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41]224; NONEON-NOSVE-NEXT: strb w8, [sp, #90]225; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #57]226; NONEON-NOSVE-NEXT: cmp w9, w8227; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt228; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40]229; NONEON-NOSVE-NEXT: strb w8, [sp, #89]230; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #56]231; NONEON-NOSVE-NEXT: cmp w9, w8232; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt233; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39]234; NONEON-NOSVE-NEXT: strb w8, [sp, #88]235; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #55]236; NONEON-NOSVE-NEXT: cmp w9, w8237; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt238; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38]239; NONEON-NOSVE-NEXT: strb w8, [sp, #87]240; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #54]241; NONEON-NOSVE-NEXT: cmp w9, w8242; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt243; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37]244; NONEON-NOSVE-NEXT: strb w8, [sp, #86]245; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #53]246; NONEON-NOSVE-NEXT: cmp w9, w8247; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt248; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36]249; NONEON-NOSVE-NEXT: strb w8, [sp, #85]250; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #52]251; NONEON-NOSVE-NEXT: cmp w9, w8252; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt253; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35]254; NONEON-NOSVE-NEXT: strb w8, [sp, #84]255; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #51]256; NONEON-NOSVE-NEXT: cmp w9, w8257; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt258; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34]259; NONEON-NOSVE-NEXT: strb w8, [sp, #83]260; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #50]261; NONEON-NOSVE-NEXT: cmp w9, w8262; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt263; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33]264; NONEON-NOSVE-NEXT: strb w8, [sp, #82]265; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #49]266; NONEON-NOSVE-NEXT: cmp w9, w8267; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt268; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32]269; NONEON-NOSVE-NEXT: strb w8, [sp, #81]270; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #48]271; NONEON-NOSVE-NEXT: cmp w9, w8272; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt273; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]274; NONEON-NOSVE-NEXT: strb w8, [sp, #80]275; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]276; NONEON-NOSVE-NEXT: cmp w9, w8277; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt278; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]279; NONEON-NOSVE-NEXT: strb w8, [sp, #79]280; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]281; NONEON-NOSVE-NEXT: cmp w9, w8282; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt283; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]284; NONEON-NOSVE-NEXT: strb w8, [sp, #78]285; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]286; NONEON-NOSVE-NEXT: cmp w9, w8287; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt288; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]289; NONEON-NOSVE-NEXT: strb w8, [sp, #77]290; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]291; NONEON-NOSVE-NEXT: cmp w9, w8292; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt293; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]294; NONEON-NOSVE-NEXT: strb w8, [sp, #76]295; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]296; NONEON-NOSVE-NEXT: cmp w9, w8297; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt298; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]299; NONEON-NOSVE-NEXT: strb w8, [sp, #75]300; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]301; NONEON-NOSVE-NEXT: cmp w9, w8302; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt303; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]304; NONEON-NOSVE-NEXT: strb w8, [sp, #74]305; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]306; NONEON-NOSVE-NEXT: cmp w9, w8307; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt308; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]309; NONEON-NOSVE-NEXT: strb w8, [sp, #73]310; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]311; NONEON-NOSVE-NEXT: cmp w9, w8312; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt313; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]314; NONEON-NOSVE-NEXT: strb w8, [sp, #72]315; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]316; NONEON-NOSVE-NEXT: cmp w9, w8317; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt318; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]319; NONEON-NOSVE-NEXT: strb w8, [sp, #71]320; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]321; NONEON-NOSVE-NEXT: cmp w9, w8322; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt323; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]324; NONEON-NOSVE-NEXT: strb w8, [sp, #70]325; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]326; NONEON-NOSVE-NEXT: cmp w9, w8327; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt328; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]329; NONEON-NOSVE-NEXT: strb w8, [sp, #69]330; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]331; NONEON-NOSVE-NEXT: cmp w9, w8332; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt333; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]334; NONEON-NOSVE-NEXT: strb w8, [sp, #68]335; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]336; NONEON-NOSVE-NEXT: cmp w9, w8337; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt338; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]339; NONEON-NOSVE-NEXT: strb w8, [sp, #67]340; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]341; NONEON-NOSVE-NEXT: cmp w9, w8342; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt343; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]344; NONEON-NOSVE-NEXT: strb w8, [sp, #66]345; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]346; NONEON-NOSVE-NEXT: cmp w9, w8347; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt348; NONEON-NOSVE-NEXT: ldrsb w9, [sp]349; NONEON-NOSVE-NEXT: strb w8, [sp, #65]350; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]351; NONEON-NOSVE-NEXT: cmp w9, w8352; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt353; NONEON-NOSVE-NEXT: strb w8, [sp, #64]354; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]355; NONEON-NOSVE-NEXT: stp q0, q1, [x0]356; NONEON-NOSVE-NEXT: add sp, sp, #96357; NONEON-NOSVE-NEXT: ret358 %op1 = load <32 x i8>, ptr %a359 %op2 = load <32 x i8>, ptr %b360 %res = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %op1, <32 x i8> %op2)361 store <32 x i8> %res, ptr %a362 ret void363}364 365define <4 x i16> @smax_v4i16(<4 x i16> %op1, <4 x i16> %op2) {366; CHECK-LABEL: smax_v4i16:367; CHECK: // %bb.0:368; CHECK-NEXT: ptrue p0.h, vl4369; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0370; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1371; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h372; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0373; CHECK-NEXT: ret374;375; NONEON-NOSVE-LABEL: smax_v4i16:376; NONEON-NOSVE: // %bb.0:377; NONEON-NOSVE-NEXT: sub sp, sp, #32378; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32379; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]380; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]381; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]382; NONEON-NOSVE-NEXT: cmp w9, w8383; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt384; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]385; NONEON-NOSVE-NEXT: strh w8, [sp, #30]386; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]387; NONEON-NOSVE-NEXT: cmp w9, w8388; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt389; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]390; NONEON-NOSVE-NEXT: strh w8, [sp, #28]391; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]392; NONEON-NOSVE-NEXT: cmp w9, w8393; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt394; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]395; NONEON-NOSVE-NEXT: strh w8, [sp, #26]396; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]397; NONEON-NOSVE-NEXT: cmp w9, w8398; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt399; NONEON-NOSVE-NEXT: strh w8, [sp, #24]400; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]401; NONEON-NOSVE-NEXT: add sp, sp, #32402; NONEON-NOSVE-NEXT: ret403 %res = call <4 x i16> @llvm.smax.v4i16(<4 x i16> %op1, <4 x i16> %op2)404 ret <4 x i16> %res405}406 407define <8 x i16> @smax_v8i16(<8 x i16> %op1, <8 x i16> %op2) {408; CHECK-LABEL: smax_v8i16:409; CHECK: // %bb.0:410; CHECK-NEXT: ptrue p0.h, vl8411; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0412; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1413; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h414; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0415; CHECK-NEXT: ret416;417; NONEON-NOSVE-LABEL: smax_v8i16:418; NONEON-NOSVE: // %bb.0:419; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!420; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48421; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]422; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]423; NONEON-NOSVE-NEXT: cmp w9, w8424; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt425; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]426; NONEON-NOSVE-NEXT: strh w8, [sp, #46]427; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]428; NONEON-NOSVE-NEXT: cmp w9, w8429; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt430; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]431; NONEON-NOSVE-NEXT: strh w8, [sp, #44]432; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]433; NONEON-NOSVE-NEXT: cmp w9, w8434; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt435; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]436; NONEON-NOSVE-NEXT: strh w8, [sp, #42]437; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]438; NONEON-NOSVE-NEXT: cmp w9, w8439; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt440; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]441; NONEON-NOSVE-NEXT: strh w8, [sp, #40]442; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]443; NONEON-NOSVE-NEXT: cmp w9, w8444; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt445; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]446; NONEON-NOSVE-NEXT: strh w8, [sp, #38]447; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]448; NONEON-NOSVE-NEXT: cmp w9, w8449; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt450; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]451; NONEON-NOSVE-NEXT: strh w8, [sp, #36]452; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]453; NONEON-NOSVE-NEXT: cmp w9, w8454; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt455; NONEON-NOSVE-NEXT: ldrsh w9, [sp]456; NONEON-NOSVE-NEXT: strh w8, [sp, #34]457; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]458; NONEON-NOSVE-NEXT: cmp w9, w8459; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt460; NONEON-NOSVE-NEXT: strh w8, [sp, #32]461; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]462; NONEON-NOSVE-NEXT: add sp, sp, #48463; NONEON-NOSVE-NEXT: ret464 %res = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %op1, <8 x i16> %op2)465 ret <8 x i16> %res466}467 468define void @smax_v16i16(ptr %a, ptr %b) {469; CHECK-LABEL: smax_v16i16:470; CHECK: // %bb.0:471; CHECK-NEXT: ldp q0, q3, [x1]472; CHECK-NEXT: ptrue p0.h, vl8473; CHECK-NEXT: ldp q1, q2, [x0]474; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h475; CHECK-NEXT: smax z2.h, p0/m, z2.h, z3.h476; CHECK-NEXT: stp q0, q2, [x0]477; CHECK-NEXT: ret478;479; NONEON-NOSVE-LABEL: smax_v16i16:480; NONEON-NOSVE: // %bb.0:481; NONEON-NOSVE-NEXT: sub sp, sp, #96482; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96483; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]484; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]485; NONEON-NOSVE-NEXT: stp q2, q3, [sp]486; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]487; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62]488; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46]489; NONEON-NOSVE-NEXT: cmp w9, w8490; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt491; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44]492; NONEON-NOSVE-NEXT: strh w8, [sp, #94]493; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60]494; NONEON-NOSVE-NEXT: cmp w9, w8495; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt496; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42]497; NONEON-NOSVE-NEXT: strh w8, [sp, #92]498; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58]499; NONEON-NOSVE-NEXT: cmp w9, w8500; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt501; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40]502; NONEON-NOSVE-NEXT: strh w8, [sp, #90]503; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56]504; NONEON-NOSVE-NEXT: cmp w9, w8505; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt506; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38]507; NONEON-NOSVE-NEXT: strh w8, [sp, #88]508; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54]509; NONEON-NOSVE-NEXT: cmp w9, w8510; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt511; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36]512; NONEON-NOSVE-NEXT: strh w8, [sp, #86]513; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52]514; NONEON-NOSVE-NEXT: cmp w9, w8515; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt516; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34]517; NONEON-NOSVE-NEXT: strh w8, [sp, #84]518; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50]519; NONEON-NOSVE-NEXT: cmp w9, w8520; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt521; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32]522; NONEON-NOSVE-NEXT: strh w8, [sp, #82]523; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48]524; NONEON-NOSVE-NEXT: cmp w9, w8525; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt526; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]527; NONEON-NOSVE-NEXT: strh w8, [sp, #80]528; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]529; NONEON-NOSVE-NEXT: cmp w9, w8530; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt531; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]532; NONEON-NOSVE-NEXT: strh w8, [sp, #78]533; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]534; NONEON-NOSVE-NEXT: cmp w9, w8535; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt536; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]537; NONEON-NOSVE-NEXT: strh w8, [sp, #76]538; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]539; NONEON-NOSVE-NEXT: cmp w9, w8540; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt541; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]542; NONEON-NOSVE-NEXT: strh w8, [sp, #74]543; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]544; NONEON-NOSVE-NEXT: cmp w9, w8545; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt546; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]547; NONEON-NOSVE-NEXT: strh w8, [sp, #72]548; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]549; NONEON-NOSVE-NEXT: cmp w9, w8550; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt551; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]552; NONEON-NOSVE-NEXT: strh w8, [sp, #70]553; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]554; NONEON-NOSVE-NEXT: cmp w9, w8555; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt556; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]557; NONEON-NOSVE-NEXT: strh w8, [sp, #68]558; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]559; NONEON-NOSVE-NEXT: cmp w9, w8560; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt561; NONEON-NOSVE-NEXT: ldrsh w9, [sp]562; NONEON-NOSVE-NEXT: strh w8, [sp, #66]563; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]564; NONEON-NOSVE-NEXT: cmp w9, w8565; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt566; NONEON-NOSVE-NEXT: strh w8, [sp, #64]567; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]568; NONEON-NOSVE-NEXT: stp q0, q1, [x0]569; NONEON-NOSVE-NEXT: add sp, sp, #96570; NONEON-NOSVE-NEXT: ret571 %op1 = load <16 x i16>, ptr %a572 %op2 = load <16 x i16>, ptr %b573 %res = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %op1, <16 x i16> %op2)574 store <16 x i16> %res, ptr %a575 ret void576}577 578define <2 x i32> @smax_v2i32(<2 x i32> %op1, <2 x i32> %op2) {579; CHECK-LABEL: smax_v2i32:580; CHECK: // %bb.0:581; CHECK-NEXT: ptrue p0.s, vl2582; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0583; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1584; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s585; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0586; CHECK-NEXT: ret587;588; NONEON-NOSVE-LABEL: smax_v2i32:589; NONEON-NOSVE: // %bb.0:590; NONEON-NOSVE-NEXT: sub sp, sp, #32591; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32592; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]593; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]594; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]595; NONEON-NOSVE-NEXT: cmp w10, w8596; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt597; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]598; NONEON-NOSVE-NEXT: cmp w9, w8599; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt600; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]601; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]602; NONEON-NOSVE-NEXT: add sp, sp, #32603; NONEON-NOSVE-NEXT: ret604 %res = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %op1, <2 x i32> %op2)605 ret <2 x i32> %res606}607 608define <4 x i32> @smax_v4i32(<4 x i32> %op1, <4 x i32> %op2) {609; CHECK-LABEL: smax_v4i32:610; CHECK: // %bb.0:611; CHECK-NEXT: ptrue p0.s, vl4612; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0613; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1614; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s615; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0616; CHECK-NEXT: ret617;618; NONEON-NOSVE-LABEL: smax_v4i32:619; NONEON-NOSVE: // %bb.0:620; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!621; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48622; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]623; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]624; NONEON-NOSVE-NEXT: cmp w10, w8625; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt626; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]627; NONEON-NOSVE-NEXT: cmp w9, w8628; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt629; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]630; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]631; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]632; NONEON-NOSVE-NEXT: cmp w10, w8633; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt634; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]635; NONEON-NOSVE-NEXT: cmp w9, w8636; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt637; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]638; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]639; NONEON-NOSVE-NEXT: add sp, sp, #48640; NONEON-NOSVE-NEXT: ret641 %res = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %op1, <4 x i32> %op2)642 ret <4 x i32> %res643}644 645define void @smax_v8i32(ptr %a, ptr %b) {646; CHECK-LABEL: smax_v8i32:647; CHECK: // %bb.0:648; CHECK-NEXT: ldp q0, q3, [x1]649; CHECK-NEXT: ptrue p0.s, vl4650; CHECK-NEXT: ldp q1, q2, [x0]651; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s652; CHECK-NEXT: smax z2.s, p0/m, z2.s, z3.s653; CHECK-NEXT: stp q0, q2, [x0]654; CHECK-NEXT: ret655;656; NONEON-NOSVE-LABEL: smax_v8i32:657; NONEON-NOSVE: // %bb.0:658; NONEON-NOSVE-NEXT: sub sp, sp, #96659; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96660; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]661; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]662; NONEON-NOSVE-NEXT: stp q2, q3, [sp]663; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]664; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]665; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]666; NONEON-NOSVE-NEXT: cmp w10, w8667; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt668; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]669; NONEON-NOSVE-NEXT: cmp w9, w8670; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt671; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]672; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]673; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]674; NONEON-NOSVE-NEXT: cmp w10, w8675; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt676; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]677; NONEON-NOSVE-NEXT: cmp w9, w8678; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt679; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]680; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]681; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]682; NONEON-NOSVE-NEXT: cmp w10, w8683; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt684; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]685; NONEON-NOSVE-NEXT: cmp w9, w8686; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt687; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]688; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]689; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]690; NONEON-NOSVE-NEXT: cmp w10, w8691; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt692; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]693; NONEON-NOSVE-NEXT: cmp w9, w8694; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt695; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]696; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]697; NONEON-NOSVE-NEXT: stp q0, q1, [x0]698; NONEON-NOSVE-NEXT: add sp, sp, #96699; NONEON-NOSVE-NEXT: ret700 %op1 = load <8 x i32>, ptr %a701 %op2 = load <8 x i32>, ptr %b702 %res = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %op1, <8 x i32> %op2)703 store <8 x i32> %res, ptr %a704 ret void705}706 707; Vector i64 max are not legal for NEON so use SVE when available.708define <1 x i64> @smax_v1i64(<1 x i64> %op1, <1 x i64> %op2) {709; CHECK-LABEL: smax_v1i64:710; CHECK: // %bb.0:711; CHECK-NEXT: ptrue p0.d, vl1712; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0713; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1714; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d715; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0716; CHECK-NEXT: ret717;718; NONEON-NOSVE-LABEL: smax_v1i64:719; NONEON-NOSVE: // %bb.0:720; NONEON-NOSVE-NEXT: sub sp, sp, #16721; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16722; NONEON-NOSVE-NEXT: fmov x8, d1723; NONEON-NOSVE-NEXT: fmov x9, d0724; NONEON-NOSVE-NEXT: cmp x9, x8725; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt726; NONEON-NOSVE-NEXT: str x8, [sp, #8]727; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]728; NONEON-NOSVE-NEXT: add sp, sp, #16729; NONEON-NOSVE-NEXT: ret730 %res = call <1 x i64> @llvm.smax.v1i64(<1 x i64> %op1, <1 x i64> %op2)731 ret <1 x i64> %res732}733 734; Vector i64 max are not legal for NEON so use SVE when available.735define <2 x i64> @smax_v2i64(<2 x i64> %op1, <2 x i64> %op2) {736; CHECK-LABEL: smax_v2i64:737; CHECK: // %bb.0:738; CHECK-NEXT: ptrue p0.d, vl2739; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0740; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1741; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d742; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0743; CHECK-NEXT: ret744;745; NONEON-NOSVE-LABEL: smax_v2i64:746; NONEON-NOSVE: // %bb.0:747; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!748; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48749; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]750; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]751; NONEON-NOSVE-NEXT: cmp x10, x8752; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt753; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]754; NONEON-NOSVE-NEXT: cmp x9, x8755; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt756; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]757; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]758; NONEON-NOSVE-NEXT: add sp, sp, #48759; NONEON-NOSVE-NEXT: ret760 %res = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %op1, <2 x i64> %op2)761 ret <2 x i64> %res762}763 764define void @smax_v4i64(ptr %a, ptr %b) {765; CHECK-LABEL: smax_v4i64:766; CHECK: // %bb.0:767; CHECK-NEXT: ldp q0, q3, [x1]768; CHECK-NEXT: ptrue p0.d, vl2769; CHECK-NEXT: ldp q1, q2, [x0]770; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d771; CHECK-NEXT: smax z2.d, p0/m, z2.d, z3.d772; CHECK-NEXT: stp q0, q2, [x0]773; CHECK-NEXT: ret774;775; NONEON-NOSVE-LABEL: smax_v4i64:776; NONEON-NOSVE: // %bb.0:777; NONEON-NOSVE-NEXT: sub sp, sp, #96778; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96779; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]780; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]781; NONEON-NOSVE-NEXT: stp q2, q3, [sp]782; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]783; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]784; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]785; NONEON-NOSVE-NEXT: cmp x10, x8786; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt787; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]788; NONEON-NOSVE-NEXT: cmp x9, x8789; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt790; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]791; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]792; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]793; NONEON-NOSVE-NEXT: cmp x10, x8794; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt795; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]796; NONEON-NOSVE-NEXT: cmp x9, x8797; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt798; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]799; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]800; NONEON-NOSVE-NEXT: stp q0, q1, [x0]801; NONEON-NOSVE-NEXT: add sp, sp, #96802; NONEON-NOSVE-NEXT: ret803 %op1 = load <4 x i64>, ptr %a804 %op2 = load <4 x i64>, ptr %b805 %res = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %op1, <4 x i64> %op2)806 store <4 x i64> %res, ptr %a807 ret void808}809 810;811; SMIN812;813 814define <8 x i8> @smin_v8i8(<8 x i8> %op1, <8 x i8> %op2) {815; CHECK-LABEL: smin_v8i8:816; CHECK: // %bb.0:817; CHECK-NEXT: ptrue p0.b, vl8818; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0819; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1820; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b821; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0822; CHECK-NEXT: ret823;824; NONEON-NOSVE-LABEL: smin_v8i8:825; NONEON-NOSVE: // %bb.0:826; NONEON-NOSVE-NEXT: sub sp, sp, #32827; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32828; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]829; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]830; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]831; NONEON-NOSVE-NEXT: cmp w9, w8832; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt833; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]834; NONEON-NOSVE-NEXT: strb w8, [sp, #31]835; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]836; NONEON-NOSVE-NEXT: cmp w9, w8837; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt838; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]839; NONEON-NOSVE-NEXT: strb w8, [sp, #30]840; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]841; NONEON-NOSVE-NEXT: cmp w9, w8842; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt843; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]844; NONEON-NOSVE-NEXT: strb w8, [sp, #29]845; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]846; NONEON-NOSVE-NEXT: cmp w9, w8847; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt848; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]849; NONEON-NOSVE-NEXT: strb w8, [sp, #28]850; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]851; NONEON-NOSVE-NEXT: cmp w9, w8852; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt853; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]854; NONEON-NOSVE-NEXT: strb w8, [sp, #27]855; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]856; NONEON-NOSVE-NEXT: cmp w9, w8857; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt858; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]859; NONEON-NOSVE-NEXT: strb w8, [sp, #26]860; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]861; NONEON-NOSVE-NEXT: cmp w9, w8862; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt863; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]864; NONEON-NOSVE-NEXT: strb w8, [sp, #25]865; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]866; NONEON-NOSVE-NEXT: cmp w9, w8867; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt868; NONEON-NOSVE-NEXT: strb w8, [sp, #24]869; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]870; NONEON-NOSVE-NEXT: add sp, sp, #32871; NONEON-NOSVE-NEXT: ret872 %res = call <8 x i8> @llvm.smin.v8i8(<8 x i8> %op1, <8 x i8> %op2)873 ret <8 x i8> %res874}875 876define <16 x i8> @smin_v16i8(<16 x i8> %op1, <16 x i8> %op2) {877; CHECK-LABEL: smin_v16i8:878; CHECK: // %bb.0:879; CHECK-NEXT: ptrue p0.b, vl16880; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0881; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1882; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b883; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0884; CHECK-NEXT: ret885;886; NONEON-NOSVE-LABEL: smin_v16i8:887; NONEON-NOSVE: // %bb.0:888; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!889; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48890; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]891; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]892; NONEON-NOSVE-NEXT: cmp w9, w8893; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt894; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]895; NONEON-NOSVE-NEXT: strb w8, [sp, #47]896; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]897; NONEON-NOSVE-NEXT: cmp w9, w8898; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt899; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]900; NONEON-NOSVE-NEXT: strb w8, [sp, #46]901; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]902; NONEON-NOSVE-NEXT: cmp w9, w8903; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt904; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]905; NONEON-NOSVE-NEXT: strb w8, [sp, #45]906; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]907; NONEON-NOSVE-NEXT: cmp w9, w8908; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt909; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]910; NONEON-NOSVE-NEXT: strb w8, [sp, #44]911; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]912; NONEON-NOSVE-NEXT: cmp w9, w8913; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt914; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]915; NONEON-NOSVE-NEXT: strb w8, [sp, #43]916; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]917; NONEON-NOSVE-NEXT: cmp w9, w8918; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt919; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]920; NONEON-NOSVE-NEXT: strb w8, [sp, #42]921; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]922; NONEON-NOSVE-NEXT: cmp w9, w8923; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt924; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]925; NONEON-NOSVE-NEXT: strb w8, [sp, #41]926; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]927; NONEON-NOSVE-NEXT: cmp w9, w8928; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt929; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]930; NONEON-NOSVE-NEXT: strb w8, [sp, #40]931; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]932; NONEON-NOSVE-NEXT: cmp w9, w8933; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt934; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]935; NONEON-NOSVE-NEXT: strb w8, [sp, #39]936; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]937; NONEON-NOSVE-NEXT: cmp w9, w8938; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt939; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]940; NONEON-NOSVE-NEXT: strb w8, [sp, #38]941; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]942; NONEON-NOSVE-NEXT: cmp w9, w8943; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt944; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]945; NONEON-NOSVE-NEXT: strb w8, [sp, #37]946; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]947; NONEON-NOSVE-NEXT: cmp w9, w8948; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt949; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]950; NONEON-NOSVE-NEXT: strb w8, [sp, #36]951; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]952; NONEON-NOSVE-NEXT: cmp w9, w8953; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt954; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]955; NONEON-NOSVE-NEXT: strb w8, [sp, #35]956; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]957; NONEON-NOSVE-NEXT: cmp w9, w8958; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt959; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]960; NONEON-NOSVE-NEXT: strb w8, [sp, #34]961; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]962; NONEON-NOSVE-NEXT: cmp w9, w8963; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt964; NONEON-NOSVE-NEXT: ldrsb w9, [sp]965; NONEON-NOSVE-NEXT: strb w8, [sp, #33]966; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]967; NONEON-NOSVE-NEXT: cmp w9, w8968; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt969; NONEON-NOSVE-NEXT: strb w8, [sp, #32]970; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]971; NONEON-NOSVE-NEXT: add sp, sp, #48972; NONEON-NOSVE-NEXT: ret973 %res = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %op1, <16 x i8> %op2)974 ret <16 x i8> %res975}976 977define void @smin_v32i8(ptr %a, ptr %b) {978; CHECK-LABEL: smin_v32i8:979; CHECK: // %bb.0:980; CHECK-NEXT: ldp q0, q3, [x1]981; CHECK-NEXT: ptrue p0.b, vl16982; CHECK-NEXT: ldp q1, q2, [x0]983; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b984; CHECK-NEXT: smin z2.b, p0/m, z2.b, z3.b985; CHECK-NEXT: stp q0, q2, [x0]986; CHECK-NEXT: ret987;988; NONEON-NOSVE-LABEL: smin_v32i8:989; NONEON-NOSVE: // %bb.0:990; NONEON-NOSVE-NEXT: sub sp, sp, #96991; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96992; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]993; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]994; NONEON-NOSVE-NEXT: stp q2, q3, [sp]995; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]996; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #63]997; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47]998; NONEON-NOSVE-NEXT: cmp w9, w8999; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1000; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46]1001; NONEON-NOSVE-NEXT: strb w8, [sp, #95]1002; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #62]1003; NONEON-NOSVE-NEXT: cmp w9, w81004; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1005; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45]1006; NONEON-NOSVE-NEXT: strb w8, [sp, #94]1007; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #61]1008; NONEON-NOSVE-NEXT: cmp w9, w81009; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1010; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44]1011; NONEON-NOSVE-NEXT: strb w8, [sp, #93]1012; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #60]1013; NONEON-NOSVE-NEXT: cmp w9, w81014; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1015; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43]1016; NONEON-NOSVE-NEXT: strb w8, [sp, #92]1017; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #59]1018; NONEON-NOSVE-NEXT: cmp w9, w81019; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1020; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42]1021; NONEON-NOSVE-NEXT: strb w8, [sp, #91]1022; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #58]1023; NONEON-NOSVE-NEXT: cmp w9, w81024; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1025; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41]1026; NONEON-NOSVE-NEXT: strb w8, [sp, #90]1027; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #57]1028; NONEON-NOSVE-NEXT: cmp w9, w81029; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1030; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40]1031; NONEON-NOSVE-NEXT: strb w8, [sp, #89]1032; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #56]1033; NONEON-NOSVE-NEXT: cmp w9, w81034; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1035; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39]1036; NONEON-NOSVE-NEXT: strb w8, [sp, #88]1037; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #55]1038; NONEON-NOSVE-NEXT: cmp w9, w81039; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1040; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38]1041; NONEON-NOSVE-NEXT: strb w8, [sp, #87]1042; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #54]1043; NONEON-NOSVE-NEXT: cmp w9, w81044; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1045; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37]1046; NONEON-NOSVE-NEXT: strb w8, [sp, #86]1047; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #53]1048; NONEON-NOSVE-NEXT: cmp w9, w81049; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1050; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36]1051; NONEON-NOSVE-NEXT: strb w8, [sp, #85]1052; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #52]1053; NONEON-NOSVE-NEXT: cmp w9, w81054; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1055; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35]1056; NONEON-NOSVE-NEXT: strb w8, [sp, #84]1057; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #51]1058; NONEON-NOSVE-NEXT: cmp w9, w81059; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1060; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34]1061; NONEON-NOSVE-NEXT: strb w8, [sp, #83]1062; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #50]1063; NONEON-NOSVE-NEXT: cmp w9, w81064; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1065; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33]1066; NONEON-NOSVE-NEXT: strb w8, [sp, #82]1067; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #49]1068; NONEON-NOSVE-NEXT: cmp w9, w81069; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1070; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32]1071; NONEON-NOSVE-NEXT: strb w8, [sp, #81]1072; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #48]1073; NONEON-NOSVE-NEXT: cmp w9, w81074; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1075; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15]1076; NONEON-NOSVE-NEXT: strb w8, [sp, #80]1077; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31]1078; NONEON-NOSVE-NEXT: cmp w9, w81079; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1080; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14]1081; NONEON-NOSVE-NEXT: strb w8, [sp, #79]1082; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]1083; NONEON-NOSVE-NEXT: cmp w9, w81084; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1085; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13]1086; NONEON-NOSVE-NEXT: strb w8, [sp, #78]1087; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29]1088; NONEON-NOSVE-NEXT: cmp w9, w81089; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1090; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12]1091; NONEON-NOSVE-NEXT: strb w8, [sp, #77]1092; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]1093; NONEON-NOSVE-NEXT: cmp w9, w81094; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1095; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11]1096; NONEON-NOSVE-NEXT: strb w8, [sp, #76]1097; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27]1098; NONEON-NOSVE-NEXT: cmp w9, w81099; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1100; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10]1101; NONEON-NOSVE-NEXT: strb w8, [sp, #75]1102; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]1103; NONEON-NOSVE-NEXT: cmp w9, w81104; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1105; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9]1106; NONEON-NOSVE-NEXT: strb w8, [sp, #74]1107; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25]1108; NONEON-NOSVE-NEXT: cmp w9, w81109; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1110; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8]1111; NONEON-NOSVE-NEXT: strb w8, [sp, #73]1112; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]1113; NONEON-NOSVE-NEXT: cmp w9, w81114; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1115; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7]1116; NONEON-NOSVE-NEXT: strb w8, [sp, #72]1117; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23]1118; NONEON-NOSVE-NEXT: cmp w9, w81119; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1120; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6]1121; NONEON-NOSVE-NEXT: strb w8, [sp, #71]1122; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]1123; NONEON-NOSVE-NEXT: cmp w9, w81124; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1125; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5]1126; NONEON-NOSVE-NEXT: strb w8, [sp, #70]1127; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21]1128; NONEON-NOSVE-NEXT: cmp w9, w81129; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1130; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4]1131; NONEON-NOSVE-NEXT: strb w8, [sp, #69]1132; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]1133; NONEON-NOSVE-NEXT: cmp w9, w81134; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1135; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3]1136; NONEON-NOSVE-NEXT: strb w8, [sp, #68]1137; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19]1138; NONEON-NOSVE-NEXT: cmp w9, w81139; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1140; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2]1141; NONEON-NOSVE-NEXT: strb w8, [sp, #67]1142; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]1143; NONEON-NOSVE-NEXT: cmp w9, w81144; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1145; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1]1146; NONEON-NOSVE-NEXT: strb w8, [sp, #66]1147; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17]1148; NONEON-NOSVE-NEXT: cmp w9, w81149; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1150; NONEON-NOSVE-NEXT: ldrsb w9, [sp]1151; NONEON-NOSVE-NEXT: strb w8, [sp, #65]1152; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]1153; NONEON-NOSVE-NEXT: cmp w9, w81154; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1155; NONEON-NOSVE-NEXT: strb w8, [sp, #64]1156; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1157; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1158; NONEON-NOSVE-NEXT: add sp, sp, #961159; NONEON-NOSVE-NEXT: ret1160 %op1 = load <32 x i8>, ptr %a1161 %op2 = load <32 x i8>, ptr %b1162 %res = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %op1, <32 x i8> %op2)1163 store <32 x i8> %res, ptr %a1164 ret void1165}1166 1167define <4 x i16> @smin_v4i16(<4 x i16> %op1, <4 x i16> %op2) {1168; CHECK-LABEL: smin_v4i16:1169; CHECK: // %bb.0:1170; CHECK-NEXT: ptrue p0.h, vl41171; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01172; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11173; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h1174; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01175; CHECK-NEXT: ret1176;1177; NONEON-NOSVE-LABEL: smin_v4i16:1178; NONEON-NOSVE: // %bb.0:1179; NONEON-NOSVE-NEXT: sub sp, sp, #321180; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321181; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1182; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1183; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]1184; NONEON-NOSVE-NEXT: cmp w9, w81185; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1186; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]1187; NONEON-NOSVE-NEXT: strh w8, [sp, #30]1188; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1189; NONEON-NOSVE-NEXT: cmp w9, w81190; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1191; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]1192; NONEON-NOSVE-NEXT: strh w8, [sp, #28]1193; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1194; NONEON-NOSVE-NEXT: cmp w9, w81195; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1196; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]1197; NONEON-NOSVE-NEXT: strh w8, [sp, #26]1198; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1199; NONEON-NOSVE-NEXT: cmp w9, w81200; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1201; NONEON-NOSVE-NEXT: strh w8, [sp, #24]1202; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1203; NONEON-NOSVE-NEXT: add sp, sp, #321204; NONEON-NOSVE-NEXT: ret1205 %res = call <4 x i16> @llvm.smin.v4i16(<4 x i16> %op1, <4 x i16> %op2)1206 ret <4 x i16> %res1207}1208 1209define <8 x i16> @smin_v8i16(<8 x i16> %op1, <8 x i16> %op2) {1210; CHECK-LABEL: smin_v8i16:1211; CHECK: // %bb.0:1212; CHECK-NEXT: ptrue p0.h, vl81213; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01214; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11215; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h1216; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01217; CHECK-NEXT: ret1218;1219; NONEON-NOSVE-LABEL: smin_v8i16:1220; NONEON-NOSVE: // %bb.0:1221; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1222; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481223; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]1224; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]1225; NONEON-NOSVE-NEXT: cmp w9, w81226; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1227; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]1228; NONEON-NOSVE-NEXT: strh w8, [sp, #46]1229; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]1230; NONEON-NOSVE-NEXT: cmp w9, w81231; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1232; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]1233; NONEON-NOSVE-NEXT: strh w8, [sp, #44]1234; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]1235; NONEON-NOSVE-NEXT: cmp w9, w81236; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1237; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]1238; NONEON-NOSVE-NEXT: strh w8, [sp, #42]1239; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]1240; NONEON-NOSVE-NEXT: cmp w9, w81241; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1242; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]1243; NONEON-NOSVE-NEXT: strh w8, [sp, #40]1244; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1245; NONEON-NOSVE-NEXT: cmp w9, w81246; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1247; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]1248; NONEON-NOSVE-NEXT: strh w8, [sp, #38]1249; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1250; NONEON-NOSVE-NEXT: cmp w9, w81251; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1252; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]1253; NONEON-NOSVE-NEXT: strh w8, [sp, #36]1254; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1255; NONEON-NOSVE-NEXT: cmp w9, w81256; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1257; NONEON-NOSVE-NEXT: ldrsh w9, [sp]1258; NONEON-NOSVE-NEXT: strh w8, [sp, #34]1259; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1260; NONEON-NOSVE-NEXT: cmp w9, w81261; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1262; NONEON-NOSVE-NEXT: strh w8, [sp, #32]1263; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1264; NONEON-NOSVE-NEXT: add sp, sp, #481265; NONEON-NOSVE-NEXT: ret1266 %res = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %op1, <8 x i16> %op2)1267 ret <8 x i16> %res1268}1269 1270define void @smin_v16i16(ptr %a, ptr %b) {1271; CHECK-LABEL: smin_v16i16:1272; CHECK: // %bb.0:1273; CHECK-NEXT: ldp q0, q3, [x1]1274; CHECK-NEXT: ptrue p0.h, vl81275; CHECK-NEXT: ldp q1, q2, [x0]1276; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h1277; CHECK-NEXT: smin z2.h, p0/m, z2.h, z3.h1278; CHECK-NEXT: stp q0, q2, [x0]1279; CHECK-NEXT: ret1280;1281; NONEON-NOSVE-LABEL: smin_v16i16:1282; NONEON-NOSVE: // %bb.0:1283; NONEON-NOSVE-NEXT: sub sp, sp, #961284; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961285; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1286; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1287; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1288; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1289; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62]1290; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46]1291; NONEON-NOSVE-NEXT: cmp w9, w81292; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1293; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44]1294; NONEON-NOSVE-NEXT: strh w8, [sp, #94]1295; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60]1296; NONEON-NOSVE-NEXT: cmp w9, w81297; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1298; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42]1299; NONEON-NOSVE-NEXT: strh w8, [sp, #92]1300; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58]1301; NONEON-NOSVE-NEXT: cmp w9, w81302; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1303; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40]1304; NONEON-NOSVE-NEXT: strh w8, [sp, #90]1305; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56]1306; NONEON-NOSVE-NEXT: cmp w9, w81307; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1308; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38]1309; NONEON-NOSVE-NEXT: strh w8, [sp, #88]1310; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54]1311; NONEON-NOSVE-NEXT: cmp w9, w81312; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1313; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36]1314; NONEON-NOSVE-NEXT: strh w8, [sp, #86]1315; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52]1316; NONEON-NOSVE-NEXT: cmp w9, w81317; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1318; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34]1319; NONEON-NOSVE-NEXT: strh w8, [sp, #84]1320; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50]1321; NONEON-NOSVE-NEXT: cmp w9, w81322; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1323; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32]1324; NONEON-NOSVE-NEXT: strh w8, [sp, #82]1325; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48]1326; NONEON-NOSVE-NEXT: cmp w9, w81327; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1328; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14]1329; NONEON-NOSVE-NEXT: strh w8, [sp, #80]1330; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]1331; NONEON-NOSVE-NEXT: cmp w9, w81332; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1333; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12]1334; NONEON-NOSVE-NEXT: strh w8, [sp, #78]1335; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]1336; NONEON-NOSVE-NEXT: cmp w9, w81337; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1338; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10]1339; NONEON-NOSVE-NEXT: strh w8, [sp, #76]1340; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]1341; NONEON-NOSVE-NEXT: cmp w9, w81342; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1343; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]1344; NONEON-NOSVE-NEXT: strh w8, [sp, #74]1345; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]1346; NONEON-NOSVE-NEXT: cmp w9, w81347; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1348; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6]1349; NONEON-NOSVE-NEXT: strh w8, [sp, #72]1350; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1351; NONEON-NOSVE-NEXT: cmp w9, w81352; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1353; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4]1354; NONEON-NOSVE-NEXT: strh w8, [sp, #70]1355; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1356; NONEON-NOSVE-NEXT: cmp w9, w81357; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1358; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2]1359; NONEON-NOSVE-NEXT: strh w8, [sp, #68]1360; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1361; NONEON-NOSVE-NEXT: cmp w9, w81362; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1363; NONEON-NOSVE-NEXT: ldrsh w9, [sp]1364; NONEON-NOSVE-NEXT: strh w8, [sp, #66]1365; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1366; NONEON-NOSVE-NEXT: cmp w9, w81367; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1368; NONEON-NOSVE-NEXT: strh w8, [sp, #64]1369; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1370; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1371; NONEON-NOSVE-NEXT: add sp, sp, #961372; NONEON-NOSVE-NEXT: ret1373 %op1 = load <16 x i16>, ptr %a1374 %op2 = load <16 x i16>, ptr %b1375 %res = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %op1, <16 x i16> %op2)1376 store <16 x i16> %res, ptr %a1377 ret void1378}1379 1380define <2 x i32> @smin_v2i32(<2 x i32> %op1, <2 x i32> %op2) {1381; CHECK-LABEL: smin_v2i32:1382; CHECK: // %bb.0:1383; CHECK-NEXT: ptrue p0.s, vl21384; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01385; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11386; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s1387; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01388; CHECK-NEXT: ret1389;1390; NONEON-NOSVE-LABEL: smin_v2i32:1391; NONEON-NOSVE: // %bb.0:1392; NONEON-NOSVE-NEXT: sub sp, sp, #321393; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321394; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1395; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1396; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1397; NONEON-NOSVE-NEXT: cmp w10, w81398; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1399; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1400; NONEON-NOSVE-NEXT: cmp w9, w81401; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1402; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]1403; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1404; NONEON-NOSVE-NEXT: add sp, sp, #321405; NONEON-NOSVE-NEXT: ret1406 %res = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %op1, <2 x i32> %op2)1407 ret <2 x i32> %res1408}1409 1410define <4 x i32> @smin_v4i32(<4 x i32> %op1, <4 x i32> %op2) {1411; CHECK-LABEL: smin_v4i32:1412; CHECK: // %bb.0:1413; CHECK-NEXT: ptrue p0.s, vl41414; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01415; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11416; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s1417; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01418; CHECK-NEXT: ret1419;1420; NONEON-NOSVE-LABEL: smin_v4i32:1421; NONEON-NOSVE: // %bb.0:1422; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1423; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481424; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1425; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]1426; NONEON-NOSVE-NEXT: cmp w10, w81427; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1428; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]1429; NONEON-NOSVE-NEXT: cmp w9, w81430; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1431; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]1432; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]1433; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1434; NONEON-NOSVE-NEXT: cmp w10, w81435; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1436; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1437; NONEON-NOSVE-NEXT: cmp w9, w81438; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1439; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]1440; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1441; NONEON-NOSVE-NEXT: add sp, sp, #481442; NONEON-NOSVE-NEXT: ret1443 %res = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %op1, <4 x i32> %op2)1444 ret <4 x i32> %res1445}1446 1447define void @smin_v8i32(ptr %a, ptr %b) {1448; CHECK-LABEL: smin_v8i32:1449; CHECK: // %bb.0:1450; CHECK-NEXT: ldp q0, q3, [x1]1451; CHECK-NEXT: ptrue p0.s, vl41452; CHECK-NEXT: ldp q1, q2, [x0]1453; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s1454; CHECK-NEXT: smin z2.s, p0/m, z2.s, z3.s1455; CHECK-NEXT: stp q0, q2, [x0]1456; CHECK-NEXT: ret1457;1458; NONEON-NOSVE-LABEL: smin_v8i32:1459; NONEON-NOSVE: // %bb.0:1460; NONEON-NOSVE-NEXT: sub sp, sp, #961461; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961462; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1463; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1464; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1465; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1466; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]1467; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]1468; NONEON-NOSVE-NEXT: cmp w10, w81469; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1470; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]1471; NONEON-NOSVE-NEXT: cmp w9, w81472; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1473; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]1474; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]1475; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]1476; NONEON-NOSVE-NEXT: cmp w10, w81477; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1478; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]1479; NONEON-NOSVE-NEXT: cmp w9, w81480; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1481; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]1482; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]1483; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]1484; NONEON-NOSVE-NEXT: cmp w10, w81485; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1486; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]1487; NONEON-NOSVE-NEXT: cmp w9, w81488; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1489; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]1490; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]1491; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]1492; NONEON-NOSVE-NEXT: cmp w10, w81493; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt1494; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]1495; NONEON-NOSVE-NEXT: cmp w9, w81496; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt1497; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]1498; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1499; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1500; NONEON-NOSVE-NEXT: add sp, sp, #961501; NONEON-NOSVE-NEXT: ret1502 %op1 = load <8 x i32>, ptr %a1503 %op2 = load <8 x i32>, ptr %b1504 %res = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %op1, <8 x i32> %op2)1505 store <8 x i32> %res, ptr %a1506 ret void1507}1508 1509; Vector i64 min are not legal for NEON so use SVE when available.1510define <1 x i64> @smin_v1i64(<1 x i64> %op1, <1 x i64> %op2) {1511; CHECK-LABEL: smin_v1i64:1512; CHECK: // %bb.0:1513; CHECK-NEXT: ptrue p0.d, vl11514; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01515; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11516; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d1517; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01518; CHECK-NEXT: ret1519;1520; NONEON-NOSVE-LABEL: smin_v1i64:1521; NONEON-NOSVE: // %bb.0:1522; NONEON-NOSVE-NEXT: sub sp, sp, #161523; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161524; NONEON-NOSVE-NEXT: fmov x8, d11525; NONEON-NOSVE-NEXT: fmov x9, d01526; NONEON-NOSVE-NEXT: cmp x9, x81527; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt1528; NONEON-NOSVE-NEXT: str x8, [sp, #8]1529; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]1530; NONEON-NOSVE-NEXT: add sp, sp, #161531; NONEON-NOSVE-NEXT: ret1532 %res = call <1 x i64> @llvm.smin.v1i64(<1 x i64> %op1, <1 x i64> %op2)1533 ret <1 x i64> %res1534}1535 1536; Vector i64 min are not legal for NEON so use SVE when available.1537define <2 x i64> @smin_v2i64(<2 x i64> %op1, <2 x i64> %op2) {1538; CHECK-LABEL: smin_v2i64:1539; CHECK: // %bb.0:1540; CHECK-NEXT: ptrue p0.d, vl21541; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01542; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11543; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d1544; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01545; CHECK-NEXT: ret1546;1547; NONEON-NOSVE-LABEL: smin_v2i64:1548; NONEON-NOSVE: // %bb.0:1549; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1550; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481551; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]1552; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]1553; NONEON-NOSVE-NEXT: cmp x10, x81554; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt1555; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]1556; NONEON-NOSVE-NEXT: cmp x9, x81557; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt1558; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]1559; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1560; NONEON-NOSVE-NEXT: add sp, sp, #481561; NONEON-NOSVE-NEXT: ret1562 %res = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %op1, <2 x i64> %op2)1563 ret <2 x i64> %res1564}1565 1566define void @smin_v4i64(ptr %a, ptr %b) {1567; CHECK-LABEL: smin_v4i64:1568; CHECK: // %bb.0:1569; CHECK-NEXT: ldp q0, q3, [x1]1570; CHECK-NEXT: ptrue p0.d, vl21571; CHECK-NEXT: ldp q1, q2, [x0]1572; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d1573; CHECK-NEXT: smin z2.d, p0/m, z2.d, z3.d1574; CHECK-NEXT: stp q0, q2, [x0]1575; CHECK-NEXT: ret1576;1577; NONEON-NOSVE-LABEL: smin_v4i64:1578; NONEON-NOSVE: // %bb.0:1579; NONEON-NOSVE-NEXT: sub sp, sp, #961580; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961581; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1582; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1583; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1584; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1585; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]1586; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]1587; NONEON-NOSVE-NEXT: cmp x10, x81588; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt1589; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]1590; NONEON-NOSVE-NEXT: cmp x9, x81591; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt1592; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]1593; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]1594; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]1595; NONEON-NOSVE-NEXT: cmp x10, x81596; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt1597; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]1598; NONEON-NOSVE-NEXT: cmp x9, x81599; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt1600; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]1601; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1602; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1603; NONEON-NOSVE-NEXT: add sp, sp, #961604; NONEON-NOSVE-NEXT: ret1605 %op1 = load <4 x i64>, ptr %a1606 %op2 = load <4 x i64>, ptr %b1607 %res = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %op1, <4 x i64> %op2)1608 store <4 x i64> %res, ptr %a1609 ret void1610}1611 1612;1613; UMAX1614;1615 1616define <8 x i8> @umax_v8i8(<8 x i8> %op1, <8 x i8> %op2) {1617; CHECK-LABEL: umax_v8i8:1618; CHECK: // %bb.0:1619; CHECK-NEXT: ptrue p0.b, vl81620; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01621; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11622; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b1623; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01624; CHECK-NEXT: ret1625;1626; NONEON-NOSVE-LABEL: umax_v8i8:1627; NONEON-NOSVE: // %bb.0:1628; NONEON-NOSVE-NEXT: sub sp, sp, #321629; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321630; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1631; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1632; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1633; NONEON-NOSVE-NEXT: cmp w9, w81634; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1635; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1636; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1637; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1638; NONEON-NOSVE-NEXT: cmp w9, w81639; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1640; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1641; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1642; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1643; NONEON-NOSVE-NEXT: cmp w9, w81644; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1645; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1646; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1647; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1648; NONEON-NOSVE-NEXT: cmp w9, w81649; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1650; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1651; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1652; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1653; NONEON-NOSVE-NEXT: cmp w9, w81654; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1655; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1656; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1657; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1658; NONEON-NOSVE-NEXT: cmp w9, w81659; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1660; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1661; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1662; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1663; NONEON-NOSVE-NEXT: cmp w9, w81664; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1665; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1666; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1667; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1668; NONEON-NOSVE-NEXT: cmp w9, w81669; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1670; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1671; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1672; NONEON-NOSVE-NEXT: add sp, sp, #321673; NONEON-NOSVE-NEXT: ret1674 %res = call <8 x i8> @llvm.umax.v8i8(<8 x i8> %op1, <8 x i8> %op2)1675 ret <8 x i8> %res1676}1677 1678define <16 x i8> @umax_v16i8(<16 x i8> %op1, <16 x i8> %op2) {1679; CHECK-LABEL: umax_v16i8:1680; CHECK: // %bb.0:1681; CHECK-NEXT: ptrue p0.b, vl161682; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01683; CHECK-NEXT: // kill: def $q1 killed $q1 def $z11684; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b1685; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01686; CHECK-NEXT: ret1687;1688; NONEON-NOSVE-LABEL: umax_v16i8:1689; NONEON-NOSVE: // %bb.0:1690; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!1691; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481692; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]1693; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1694; NONEON-NOSVE-NEXT: cmp w9, w81695; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1696; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1697; NONEON-NOSVE-NEXT: strb w8, [sp, #47]1698; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]1699; NONEON-NOSVE-NEXT: cmp w9, w81700; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1701; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1702; NONEON-NOSVE-NEXT: strb w8, [sp, #46]1703; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]1704; NONEON-NOSVE-NEXT: cmp w9, w81705; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1706; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1707; NONEON-NOSVE-NEXT: strb w8, [sp, #45]1708; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]1709; NONEON-NOSVE-NEXT: cmp w9, w81710; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1711; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1712; NONEON-NOSVE-NEXT: strb w8, [sp, #44]1713; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]1714; NONEON-NOSVE-NEXT: cmp w9, w81715; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1716; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1717; NONEON-NOSVE-NEXT: strb w8, [sp, #43]1718; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]1719; NONEON-NOSVE-NEXT: cmp w9, w81720; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1721; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1722; NONEON-NOSVE-NEXT: strb w8, [sp, #42]1723; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]1724; NONEON-NOSVE-NEXT: cmp w9, w81725; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1726; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1727; NONEON-NOSVE-NEXT: strb w8, [sp, #41]1728; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]1729; NONEON-NOSVE-NEXT: cmp w9, w81730; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1731; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1732; NONEON-NOSVE-NEXT: strb w8, [sp, #40]1733; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1734; NONEON-NOSVE-NEXT: cmp w9, w81735; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1736; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]1737; NONEON-NOSVE-NEXT: strb w8, [sp, #39]1738; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1739; NONEON-NOSVE-NEXT: cmp w9, w81740; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1741; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]1742; NONEON-NOSVE-NEXT: strb w8, [sp, #38]1743; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1744; NONEON-NOSVE-NEXT: cmp w9, w81745; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1746; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]1747; NONEON-NOSVE-NEXT: strb w8, [sp, #37]1748; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1749; NONEON-NOSVE-NEXT: cmp w9, w81750; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1751; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1752; NONEON-NOSVE-NEXT: strb w8, [sp, #36]1753; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1754; NONEON-NOSVE-NEXT: cmp w9, w81755; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1756; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]1757; NONEON-NOSVE-NEXT: strb w8, [sp, #35]1758; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1759; NONEON-NOSVE-NEXT: cmp w9, w81760; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1761; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]1762; NONEON-NOSVE-NEXT: strb w8, [sp, #34]1763; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1764; NONEON-NOSVE-NEXT: cmp w9, w81765; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1766; NONEON-NOSVE-NEXT: ldrb w9, [sp]1767; NONEON-NOSVE-NEXT: strb w8, [sp, #33]1768; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1769; NONEON-NOSVE-NEXT: cmp w9, w81770; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1771; NONEON-NOSVE-NEXT: strb w8, [sp, #32]1772; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1773; NONEON-NOSVE-NEXT: add sp, sp, #481774; NONEON-NOSVE-NEXT: ret1775 %res = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %op1, <16 x i8> %op2)1776 ret <16 x i8> %res1777}1778 1779define void @umax_v32i8(ptr %a, ptr %b) {1780; CHECK-LABEL: umax_v32i8:1781; CHECK: // %bb.0:1782; CHECK-NEXT: ldp q0, q3, [x1]1783; CHECK-NEXT: ptrue p0.b, vl161784; CHECK-NEXT: ldp q1, q2, [x0]1785; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b1786; CHECK-NEXT: umax z2.b, p0/m, z2.b, z3.b1787; CHECK-NEXT: stp q0, q2, [x0]1788; CHECK-NEXT: ret1789;1790; NONEON-NOSVE-LABEL: umax_v32i8:1791; NONEON-NOSVE: // %bb.0:1792; NONEON-NOSVE-NEXT: sub sp, sp, #961793; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961794; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]1795; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]1796; NONEON-NOSVE-NEXT: stp q2, q3, [sp]1797; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]1798; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63]1799; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47]1800; NONEON-NOSVE-NEXT: cmp w9, w81801; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1802; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46]1803; NONEON-NOSVE-NEXT: strb w8, [sp, #95]1804; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62]1805; NONEON-NOSVE-NEXT: cmp w9, w81806; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1807; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45]1808; NONEON-NOSVE-NEXT: strb w8, [sp, #94]1809; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61]1810; NONEON-NOSVE-NEXT: cmp w9, w81811; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1812; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44]1813; NONEON-NOSVE-NEXT: strb w8, [sp, #93]1814; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60]1815; NONEON-NOSVE-NEXT: cmp w9, w81816; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1817; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43]1818; NONEON-NOSVE-NEXT: strb w8, [sp, #92]1819; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59]1820; NONEON-NOSVE-NEXT: cmp w9, w81821; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1822; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42]1823; NONEON-NOSVE-NEXT: strb w8, [sp, #91]1824; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58]1825; NONEON-NOSVE-NEXT: cmp w9, w81826; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1827; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41]1828; NONEON-NOSVE-NEXT: strb w8, [sp, #90]1829; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57]1830; NONEON-NOSVE-NEXT: cmp w9, w81831; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1832; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40]1833; NONEON-NOSVE-NEXT: strb w8, [sp, #89]1834; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56]1835; NONEON-NOSVE-NEXT: cmp w9, w81836; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1837; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39]1838; NONEON-NOSVE-NEXT: strb w8, [sp, #88]1839; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55]1840; NONEON-NOSVE-NEXT: cmp w9, w81841; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1842; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38]1843; NONEON-NOSVE-NEXT: strb w8, [sp, #87]1844; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54]1845; NONEON-NOSVE-NEXT: cmp w9, w81846; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1847; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37]1848; NONEON-NOSVE-NEXT: strb w8, [sp, #86]1849; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53]1850; NONEON-NOSVE-NEXT: cmp w9, w81851; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1852; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36]1853; NONEON-NOSVE-NEXT: strb w8, [sp, #85]1854; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52]1855; NONEON-NOSVE-NEXT: cmp w9, w81856; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1857; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35]1858; NONEON-NOSVE-NEXT: strb w8, [sp, #84]1859; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51]1860; NONEON-NOSVE-NEXT: cmp w9, w81861; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1862; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34]1863; NONEON-NOSVE-NEXT: strb w8, [sp, #83]1864; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50]1865; NONEON-NOSVE-NEXT: cmp w9, w81866; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1867; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33]1868; NONEON-NOSVE-NEXT: strb w8, [sp, #82]1869; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49]1870; NONEON-NOSVE-NEXT: cmp w9, w81871; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1872; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32]1873; NONEON-NOSVE-NEXT: strb w8, [sp, #81]1874; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48]1875; NONEON-NOSVE-NEXT: cmp w9, w81876; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1877; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]1878; NONEON-NOSVE-NEXT: strb w8, [sp, #80]1879; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]1880; NONEON-NOSVE-NEXT: cmp w9, w81881; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1882; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]1883; NONEON-NOSVE-NEXT: strb w8, [sp, #79]1884; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]1885; NONEON-NOSVE-NEXT: cmp w9, w81886; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1887; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]1888; NONEON-NOSVE-NEXT: strb w8, [sp, #78]1889; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]1890; NONEON-NOSVE-NEXT: cmp w9, w81891; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1892; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]1893; NONEON-NOSVE-NEXT: strb w8, [sp, #77]1894; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]1895; NONEON-NOSVE-NEXT: cmp w9, w81896; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1897; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]1898; NONEON-NOSVE-NEXT: strb w8, [sp, #76]1899; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]1900; NONEON-NOSVE-NEXT: cmp w9, w81901; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1902; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]1903; NONEON-NOSVE-NEXT: strb w8, [sp, #75]1904; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]1905; NONEON-NOSVE-NEXT: cmp w9, w81906; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1907; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]1908; NONEON-NOSVE-NEXT: strb w8, [sp, #74]1909; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]1910; NONEON-NOSVE-NEXT: cmp w9, w81911; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1912; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]1913; NONEON-NOSVE-NEXT: strb w8, [sp, #73]1914; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]1915; NONEON-NOSVE-NEXT: cmp w9, w81916; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1917; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1918; NONEON-NOSVE-NEXT: strb w8, [sp, #72]1919; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]1920; NONEON-NOSVE-NEXT: cmp w9, w81921; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1922; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]1923; NONEON-NOSVE-NEXT: strb w8, [sp, #71]1924; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]1925; NONEON-NOSVE-NEXT: cmp w9, w81926; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1927; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]1928; NONEON-NOSVE-NEXT: strb w8, [sp, #70]1929; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]1930; NONEON-NOSVE-NEXT: cmp w9, w81931; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1932; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]1933; NONEON-NOSVE-NEXT: strb w8, [sp, #69]1934; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]1935; NONEON-NOSVE-NEXT: cmp w9, w81936; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1937; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1938; NONEON-NOSVE-NEXT: strb w8, [sp, #68]1939; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]1940; NONEON-NOSVE-NEXT: cmp w9, w81941; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1942; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]1943; NONEON-NOSVE-NEXT: strb w8, [sp, #67]1944; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]1945; NONEON-NOSVE-NEXT: cmp w9, w81946; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1947; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]1948; NONEON-NOSVE-NEXT: strb w8, [sp, #66]1949; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]1950; NONEON-NOSVE-NEXT: cmp w9, w81951; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1952; NONEON-NOSVE-NEXT: ldrb w9, [sp]1953; NONEON-NOSVE-NEXT: strb w8, [sp, #65]1954; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]1955; NONEON-NOSVE-NEXT: cmp w9, w81956; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1957; NONEON-NOSVE-NEXT: strb w8, [sp, #64]1958; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]1959; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1960; NONEON-NOSVE-NEXT: add sp, sp, #961961; NONEON-NOSVE-NEXT: ret1962 %op1 = load <32 x i8>, ptr %a1963 %op2 = load <32 x i8>, ptr %b1964 %res = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %op1, <32 x i8> %op2)1965 store <32 x i8> %res, ptr %a1966 ret void1967}1968 1969define <4 x i16> @umax_v4i16(<4 x i16> %op1, <4 x i16> %op2) {1970; CHECK-LABEL: umax_v4i16:1971; CHECK: // %bb.0:1972; CHECK-NEXT: ptrue p0.h, vl41973; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01974; CHECK-NEXT: // kill: def $d1 killed $d1 def $z11975; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h1976; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01977; CHECK-NEXT: ret1978;1979; NONEON-NOSVE-LABEL: umax_v4i16:1980; NONEON-NOSVE: // %bb.0:1981; NONEON-NOSVE-NEXT: sub sp, sp, #321982; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321983; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]1984; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]1985; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]1986; NONEON-NOSVE-NEXT: cmp w9, w81987; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1988; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]1989; NONEON-NOSVE-NEXT: strh w8, [sp, #30]1990; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]1991; NONEON-NOSVE-NEXT: cmp w9, w81992; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1993; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]1994; NONEON-NOSVE-NEXT: strh w8, [sp, #28]1995; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]1996; NONEON-NOSVE-NEXT: cmp w9, w81997; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi1998; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]1999; NONEON-NOSVE-NEXT: strh w8, [sp, #26]2000; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2001; NONEON-NOSVE-NEXT: cmp w9, w82002; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2003; NONEON-NOSVE-NEXT: strh w8, [sp, #24]2004; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2005; NONEON-NOSVE-NEXT: add sp, sp, #322006; NONEON-NOSVE-NEXT: ret2007 %res = call <4 x i16> @llvm.umax.v4i16(<4 x i16> %op1, <4 x i16> %op2)2008 ret <4 x i16> %res2009}2010 2011define <8 x i16> @umax_v8i16(<8 x i16> %op1, <8 x i16> %op2) {2012; CHECK-LABEL: umax_v8i16:2013; CHECK: // %bb.0:2014; CHECK-NEXT: ptrue p0.h, vl82015; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02016; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12017; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h2018; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02019; CHECK-NEXT: ret2020;2021; NONEON-NOSVE-LABEL: umax_v8i16:2022; NONEON-NOSVE: // %bb.0:2023; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2024; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482025; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]2026; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2027; NONEON-NOSVE-NEXT: cmp w9, w82028; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2029; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2030; NONEON-NOSVE-NEXT: strh w8, [sp, #46]2031; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]2032; NONEON-NOSVE-NEXT: cmp w9, w82033; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2034; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2035; NONEON-NOSVE-NEXT: strh w8, [sp, #44]2036; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]2037; NONEON-NOSVE-NEXT: cmp w9, w82038; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2039; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2040; NONEON-NOSVE-NEXT: strh w8, [sp, #42]2041; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]2042; NONEON-NOSVE-NEXT: cmp w9, w82043; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2044; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]2045; NONEON-NOSVE-NEXT: strh w8, [sp, #40]2046; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2047; NONEON-NOSVE-NEXT: cmp w9, w82048; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2049; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]2050; NONEON-NOSVE-NEXT: strh w8, [sp, #38]2051; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2052; NONEON-NOSVE-NEXT: cmp w9, w82053; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2054; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]2055; NONEON-NOSVE-NEXT: strh w8, [sp, #36]2056; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2057; NONEON-NOSVE-NEXT: cmp w9, w82058; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2059; NONEON-NOSVE-NEXT: ldrh w9, [sp]2060; NONEON-NOSVE-NEXT: strh w8, [sp, #34]2061; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2062; NONEON-NOSVE-NEXT: cmp w9, w82063; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2064; NONEON-NOSVE-NEXT: strh w8, [sp, #32]2065; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2066; NONEON-NOSVE-NEXT: add sp, sp, #482067; NONEON-NOSVE-NEXT: ret2068 %res = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %op1, <8 x i16> %op2)2069 ret <8 x i16> %res2070}2071 2072define void @umax_v16i16(ptr %a, ptr %b) {2073; CHECK-LABEL: umax_v16i16:2074; CHECK: // %bb.0:2075; CHECK-NEXT: ldp q0, q3, [x1]2076; CHECK-NEXT: ptrue p0.h, vl82077; CHECK-NEXT: ldp q1, q2, [x0]2078; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h2079; CHECK-NEXT: umax z2.h, p0/m, z2.h, z3.h2080; CHECK-NEXT: stp q0, q2, [x0]2081; CHECK-NEXT: ret2082;2083; NONEON-NOSVE-LABEL: umax_v16i16:2084; NONEON-NOSVE: // %bb.0:2085; NONEON-NOSVE-NEXT: sub sp, sp, #962086; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962087; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2088; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2089; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2090; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2091; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]2092; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46]2093; NONEON-NOSVE-NEXT: cmp w9, w82094; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2095; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44]2096; NONEON-NOSVE-NEXT: strh w8, [sp, #94]2097; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]2098; NONEON-NOSVE-NEXT: cmp w9, w82099; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2100; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42]2101; NONEON-NOSVE-NEXT: strh w8, [sp, #92]2102; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]2103; NONEON-NOSVE-NEXT: cmp w9, w82104; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2105; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40]2106; NONEON-NOSVE-NEXT: strh w8, [sp, #90]2107; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]2108; NONEON-NOSVE-NEXT: cmp w9, w82109; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2110; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38]2111; NONEON-NOSVE-NEXT: strh w8, [sp, #88]2112; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]2113; NONEON-NOSVE-NEXT: cmp w9, w82114; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2115; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36]2116; NONEON-NOSVE-NEXT: strh w8, [sp, #86]2117; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]2118; NONEON-NOSVE-NEXT: cmp w9, w82119; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2120; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34]2121; NONEON-NOSVE-NEXT: strh w8, [sp, #84]2122; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]2123; NONEON-NOSVE-NEXT: cmp w9, w82124; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2125; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32]2126; NONEON-NOSVE-NEXT: strh w8, [sp, #82]2127; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]2128; NONEON-NOSVE-NEXT: cmp w9, w82129; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2130; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2131; NONEON-NOSVE-NEXT: strh w8, [sp, #80]2132; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]2133; NONEON-NOSVE-NEXT: cmp w9, w82134; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2135; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2136; NONEON-NOSVE-NEXT: strh w8, [sp, #78]2137; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]2138; NONEON-NOSVE-NEXT: cmp w9, w82139; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2140; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2141; NONEON-NOSVE-NEXT: strh w8, [sp, #76]2142; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]2143; NONEON-NOSVE-NEXT: cmp w9, w82144; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2145; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2146; NONEON-NOSVE-NEXT: strh w8, [sp, #74]2147; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]2148; NONEON-NOSVE-NEXT: cmp w9, w82149; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2150; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]2151; NONEON-NOSVE-NEXT: strh w8, [sp, #72]2152; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2153; NONEON-NOSVE-NEXT: cmp w9, w82154; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2155; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]2156; NONEON-NOSVE-NEXT: strh w8, [sp, #70]2157; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2158; NONEON-NOSVE-NEXT: cmp w9, w82159; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2160; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]2161; NONEON-NOSVE-NEXT: strh w8, [sp, #68]2162; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2163; NONEON-NOSVE-NEXT: cmp w9, w82164; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2165; NONEON-NOSVE-NEXT: ldrh w9, [sp]2166; NONEON-NOSVE-NEXT: strh w8, [sp, #66]2167; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2168; NONEON-NOSVE-NEXT: cmp w9, w82169; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2170; NONEON-NOSVE-NEXT: strh w8, [sp, #64]2171; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2172; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2173; NONEON-NOSVE-NEXT: add sp, sp, #962174; NONEON-NOSVE-NEXT: ret2175 %op1 = load <16 x i16>, ptr %a2176 %op2 = load <16 x i16>, ptr %b2177 %res = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %op1, <16 x i16> %op2)2178 store <16 x i16> %res, ptr %a2179 ret void2180}2181 2182define <2 x i32> @umax_v2i32(<2 x i32> %op1, <2 x i32> %op2) {2183; CHECK-LABEL: umax_v2i32:2184; CHECK: // %bb.0:2185; CHECK-NEXT: ptrue p0.s, vl22186; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02187; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12188; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s2189; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02190; CHECK-NEXT: ret2191;2192; NONEON-NOSVE-LABEL: umax_v2i32:2193; NONEON-NOSVE: // %bb.0:2194; NONEON-NOSVE-NEXT: sub sp, sp, #322195; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322196; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2197; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2198; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2199; NONEON-NOSVE-NEXT: cmp w10, w82200; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2201; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2202; NONEON-NOSVE-NEXT: cmp w9, w82203; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2204; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]2205; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2206; NONEON-NOSVE-NEXT: add sp, sp, #322207; NONEON-NOSVE-NEXT: ret2208 %res = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %op1, <2 x i32> %op2)2209 ret <2 x i32> %res2210}2211 2212define <4 x i32> @umax_v4i32(<4 x i32> %op1, <4 x i32> %op2) {2213; CHECK-LABEL: umax_v4i32:2214; CHECK: // %bb.0:2215; CHECK-NEXT: ptrue p0.s, vl42216; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02217; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12218; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s2219; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02220; CHECK-NEXT: ret2221;2222; NONEON-NOSVE-LABEL: umax_v4i32:2223; NONEON-NOSVE: // %bb.0:2224; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2225; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482226; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2227; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]2228; NONEON-NOSVE-NEXT: cmp w10, w82229; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2230; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]2231; NONEON-NOSVE-NEXT: cmp w9, w82232; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2233; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]2234; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]2235; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2236; NONEON-NOSVE-NEXT: cmp w10, w82237; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2238; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2239; NONEON-NOSVE-NEXT: cmp w9, w82240; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2241; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]2242; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2243; NONEON-NOSVE-NEXT: add sp, sp, #482244; NONEON-NOSVE-NEXT: ret2245 %res = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %op1, <4 x i32> %op2)2246 ret <4 x i32> %res2247}2248 2249define void @umax_v8i32(ptr %a, ptr %b) {2250; CHECK-LABEL: umax_v8i32:2251; CHECK: // %bb.0:2252; CHECK-NEXT: ldp q0, q3, [x1]2253; CHECK-NEXT: ptrue p0.s, vl42254; CHECK-NEXT: ldp q1, q2, [x0]2255; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s2256; CHECK-NEXT: umax z2.s, p0/m, z2.s, z3.s2257; CHECK-NEXT: stp q0, q2, [x0]2258; CHECK-NEXT: ret2259;2260; NONEON-NOSVE-LABEL: umax_v8i32:2261; NONEON-NOSVE: // %bb.0:2262; NONEON-NOSVE-NEXT: sub sp, sp, #962263; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962264; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2265; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2266; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2267; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2268; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]2269; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]2270; NONEON-NOSVE-NEXT: cmp w10, w82271; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2272; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]2273; NONEON-NOSVE-NEXT: cmp w9, w82274; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2275; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]2276; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]2277; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]2278; NONEON-NOSVE-NEXT: cmp w10, w82279; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2280; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]2281; NONEON-NOSVE-NEXT: cmp w9, w82282; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2283; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]2284; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]2285; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]2286; NONEON-NOSVE-NEXT: cmp w10, w82287; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2288; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]2289; NONEON-NOSVE-NEXT: cmp w9, w82290; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2291; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]2292; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]2293; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]2294; NONEON-NOSVE-NEXT: cmp w10, w82295; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi2296; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]2297; NONEON-NOSVE-NEXT: cmp w9, w82298; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi2299; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]2300; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2301; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2302; NONEON-NOSVE-NEXT: add sp, sp, #962303; NONEON-NOSVE-NEXT: ret2304 %op1 = load <8 x i32>, ptr %a2305 %op2 = load <8 x i32>, ptr %b2306 %res = call <8 x i32> @llvm.umax.v8i32(<8 x i32> %op1, <8 x i32> %op2)2307 store <8 x i32> %res, ptr %a2308 ret void2309}2310 2311; Vector i64 max are not legal for NEON so use SVE when available.2312define <1 x i64> @umax_v1i64(<1 x i64> %op1, <1 x i64> %op2) {2313; CHECK-LABEL: umax_v1i64:2314; CHECK: // %bb.0:2315; CHECK-NEXT: ptrue p0.d, vl12316; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02317; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12318; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d2319; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02320; CHECK-NEXT: ret2321;2322; NONEON-NOSVE-LABEL: umax_v1i64:2323; NONEON-NOSVE: // %bb.0:2324; NONEON-NOSVE-NEXT: sub sp, sp, #162325; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162326; NONEON-NOSVE-NEXT: fmov x8, d12327; NONEON-NOSVE-NEXT: fmov x9, d02328; NONEON-NOSVE-NEXT: cmp x9, x82329; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi2330; NONEON-NOSVE-NEXT: str x8, [sp, #8]2331; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2332; NONEON-NOSVE-NEXT: add sp, sp, #162333; NONEON-NOSVE-NEXT: ret2334 %res = call <1 x i64> @llvm.umax.v1i64(<1 x i64> %op1, <1 x i64> %op2)2335 ret <1 x i64> %res2336}2337 2338; Vector i64 max are not legal for NEON so use SVE when available.2339define <2 x i64> @umax_v2i64(<2 x i64> %op1, <2 x i64> %op2) {2340; CHECK-LABEL: umax_v2i64:2341; CHECK: // %bb.0:2342; CHECK-NEXT: ptrue p0.d, vl22343; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02344; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12345; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d2346; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02347; CHECK-NEXT: ret2348;2349; NONEON-NOSVE-LABEL: umax_v2i64:2350; NONEON-NOSVE: // %bb.0:2351; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2352; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482353; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]2354; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]2355; NONEON-NOSVE-NEXT: cmp x10, x82356; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi2357; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]2358; NONEON-NOSVE-NEXT: cmp x9, x82359; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi2360; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]2361; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2362; NONEON-NOSVE-NEXT: add sp, sp, #482363; NONEON-NOSVE-NEXT: ret2364 %res = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %op1, <2 x i64> %op2)2365 ret <2 x i64> %res2366}2367 2368define void @umax_v4i64(ptr %a, ptr %b) {2369; CHECK-LABEL: umax_v4i64:2370; CHECK: // %bb.0:2371; CHECK-NEXT: ldp q0, q3, [x1]2372; CHECK-NEXT: ptrue p0.d, vl22373; CHECK-NEXT: ldp q1, q2, [x0]2374; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d2375; CHECK-NEXT: umax z2.d, p0/m, z2.d, z3.d2376; CHECK-NEXT: stp q0, q2, [x0]2377; CHECK-NEXT: ret2378;2379; NONEON-NOSVE-LABEL: umax_v4i64:2380; NONEON-NOSVE: // %bb.0:2381; NONEON-NOSVE-NEXT: sub sp, sp, #962382; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962383; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2384; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2385; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2386; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2387; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]2388; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]2389; NONEON-NOSVE-NEXT: cmp x10, x82390; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi2391; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]2392; NONEON-NOSVE-NEXT: cmp x9, x82393; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi2394; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]2395; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]2396; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]2397; NONEON-NOSVE-NEXT: cmp x10, x82398; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi2399; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]2400; NONEON-NOSVE-NEXT: cmp x9, x82401; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi2402; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]2403; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2404; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2405; NONEON-NOSVE-NEXT: add sp, sp, #962406; NONEON-NOSVE-NEXT: ret2407 %op1 = load <4 x i64>, ptr %a2408 %op2 = load <4 x i64>, ptr %b2409 %res = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %op1, <4 x i64> %op2)2410 store <4 x i64> %res, ptr %a2411 ret void2412}2413 2414;2415; UMIN2416;2417 2418define <8 x i8> @umin_v8i8(<8 x i8> %op1, <8 x i8> %op2) {2419; CHECK-LABEL: umin_v8i8:2420; CHECK: // %bb.0:2421; CHECK-NEXT: ptrue p0.b, vl82422; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02423; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12424; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b2425; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02426; CHECK-NEXT: ret2427;2428; NONEON-NOSVE-LABEL: umin_v8i8:2429; NONEON-NOSVE: // %bb.0:2430; NONEON-NOSVE-NEXT: sub sp, sp, #322431; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322432; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2433; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]2434; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]2435; NONEON-NOSVE-NEXT: cmp w9, w82436; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2437; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]2438; NONEON-NOSVE-NEXT: strb w8, [sp, #31]2439; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]2440; NONEON-NOSVE-NEXT: cmp w9, w82441; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2442; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]2443; NONEON-NOSVE-NEXT: strb w8, [sp, #30]2444; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]2445; NONEON-NOSVE-NEXT: cmp w9, w82446; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2447; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]2448; NONEON-NOSVE-NEXT: strb w8, [sp, #29]2449; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]2450; NONEON-NOSVE-NEXT: cmp w9, w82451; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2452; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]2453; NONEON-NOSVE-NEXT: strb w8, [sp, #28]2454; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]2455; NONEON-NOSVE-NEXT: cmp w9, w82456; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2457; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]2458; NONEON-NOSVE-NEXT: strb w8, [sp, #27]2459; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]2460; NONEON-NOSVE-NEXT: cmp w9, w82461; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2462; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]2463; NONEON-NOSVE-NEXT: strb w8, [sp, #26]2464; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]2465; NONEON-NOSVE-NEXT: cmp w9, w82466; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2467; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]2468; NONEON-NOSVE-NEXT: strb w8, [sp, #25]2469; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]2470; NONEON-NOSVE-NEXT: cmp w9, w82471; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2472; NONEON-NOSVE-NEXT: strb w8, [sp, #24]2473; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2474; NONEON-NOSVE-NEXT: add sp, sp, #322475; NONEON-NOSVE-NEXT: ret2476 %res = call <8 x i8> @llvm.umin.v8i8(<8 x i8> %op1, <8 x i8> %op2)2477 ret <8 x i8> %res2478}2479 2480define <16 x i8> @umin_v16i8(<16 x i8> %op1, <16 x i8> %op2) {2481; CHECK-LABEL: umin_v16i8:2482; CHECK: // %bb.0:2483; CHECK-NEXT: ptrue p0.b, vl162484; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02485; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12486; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b2487; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02488; CHECK-NEXT: ret2489;2490; NONEON-NOSVE-LABEL: umin_v16i8:2491; NONEON-NOSVE: // %bb.0:2492; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2493; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482494; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]2495; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]2496; NONEON-NOSVE-NEXT: cmp w9, w82497; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2498; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]2499; NONEON-NOSVE-NEXT: strb w8, [sp, #47]2500; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]2501; NONEON-NOSVE-NEXT: cmp w9, w82502; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2503; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]2504; NONEON-NOSVE-NEXT: strb w8, [sp, #46]2505; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]2506; NONEON-NOSVE-NEXT: cmp w9, w82507; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2508; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]2509; NONEON-NOSVE-NEXT: strb w8, [sp, #45]2510; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]2511; NONEON-NOSVE-NEXT: cmp w9, w82512; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2513; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]2514; NONEON-NOSVE-NEXT: strb w8, [sp, #44]2515; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]2516; NONEON-NOSVE-NEXT: cmp w9, w82517; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2518; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]2519; NONEON-NOSVE-NEXT: strb w8, [sp, #43]2520; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]2521; NONEON-NOSVE-NEXT: cmp w9, w82522; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2523; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]2524; NONEON-NOSVE-NEXT: strb w8, [sp, #42]2525; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]2526; NONEON-NOSVE-NEXT: cmp w9, w82527; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2528; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]2529; NONEON-NOSVE-NEXT: strb w8, [sp, #41]2530; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]2531; NONEON-NOSVE-NEXT: cmp w9, w82532; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2533; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]2534; NONEON-NOSVE-NEXT: strb w8, [sp, #40]2535; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]2536; NONEON-NOSVE-NEXT: cmp w9, w82537; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2538; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]2539; NONEON-NOSVE-NEXT: strb w8, [sp, #39]2540; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]2541; NONEON-NOSVE-NEXT: cmp w9, w82542; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2543; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]2544; NONEON-NOSVE-NEXT: strb w8, [sp, #38]2545; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]2546; NONEON-NOSVE-NEXT: cmp w9, w82547; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2548; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]2549; NONEON-NOSVE-NEXT: strb w8, [sp, #37]2550; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]2551; NONEON-NOSVE-NEXT: cmp w9, w82552; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2553; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]2554; NONEON-NOSVE-NEXT: strb w8, [sp, #36]2555; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]2556; NONEON-NOSVE-NEXT: cmp w9, w82557; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2558; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]2559; NONEON-NOSVE-NEXT: strb w8, [sp, #35]2560; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]2561; NONEON-NOSVE-NEXT: cmp w9, w82562; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2563; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]2564; NONEON-NOSVE-NEXT: strb w8, [sp, #34]2565; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]2566; NONEON-NOSVE-NEXT: cmp w9, w82567; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2568; NONEON-NOSVE-NEXT: ldrb w9, [sp]2569; NONEON-NOSVE-NEXT: strb w8, [sp, #33]2570; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]2571; NONEON-NOSVE-NEXT: cmp w9, w82572; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2573; NONEON-NOSVE-NEXT: strb w8, [sp, #32]2574; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2575; NONEON-NOSVE-NEXT: add sp, sp, #482576; NONEON-NOSVE-NEXT: ret2577 %res = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %op1, <16 x i8> %op2)2578 ret <16 x i8> %res2579}2580 2581define void @umin_v32i8(ptr %a, ptr %b) {2582; CHECK-LABEL: umin_v32i8:2583; CHECK: // %bb.0:2584; CHECK-NEXT: ldp q0, q3, [x1]2585; CHECK-NEXT: ptrue p0.b, vl162586; CHECK-NEXT: ldp q1, q2, [x0]2587; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b2588; CHECK-NEXT: umin z2.b, p0/m, z2.b, z3.b2589; CHECK-NEXT: stp q0, q2, [x0]2590; CHECK-NEXT: ret2591;2592; NONEON-NOSVE-LABEL: umin_v32i8:2593; NONEON-NOSVE: // %bb.0:2594; NONEON-NOSVE-NEXT: sub sp, sp, #962595; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962596; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2597; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2598; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2599; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2600; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63]2601; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47]2602; NONEON-NOSVE-NEXT: cmp w9, w82603; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2604; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46]2605; NONEON-NOSVE-NEXT: strb w8, [sp, #95]2606; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62]2607; NONEON-NOSVE-NEXT: cmp w9, w82608; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2609; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45]2610; NONEON-NOSVE-NEXT: strb w8, [sp, #94]2611; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61]2612; NONEON-NOSVE-NEXT: cmp w9, w82613; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2614; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44]2615; NONEON-NOSVE-NEXT: strb w8, [sp, #93]2616; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60]2617; NONEON-NOSVE-NEXT: cmp w9, w82618; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2619; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43]2620; NONEON-NOSVE-NEXT: strb w8, [sp, #92]2621; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59]2622; NONEON-NOSVE-NEXT: cmp w9, w82623; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2624; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42]2625; NONEON-NOSVE-NEXT: strb w8, [sp, #91]2626; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58]2627; NONEON-NOSVE-NEXT: cmp w9, w82628; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2629; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41]2630; NONEON-NOSVE-NEXT: strb w8, [sp, #90]2631; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57]2632; NONEON-NOSVE-NEXT: cmp w9, w82633; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2634; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40]2635; NONEON-NOSVE-NEXT: strb w8, [sp, #89]2636; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56]2637; NONEON-NOSVE-NEXT: cmp w9, w82638; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2639; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39]2640; NONEON-NOSVE-NEXT: strb w8, [sp, #88]2641; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55]2642; NONEON-NOSVE-NEXT: cmp w9, w82643; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2644; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38]2645; NONEON-NOSVE-NEXT: strb w8, [sp, #87]2646; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54]2647; NONEON-NOSVE-NEXT: cmp w9, w82648; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2649; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37]2650; NONEON-NOSVE-NEXT: strb w8, [sp, #86]2651; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53]2652; NONEON-NOSVE-NEXT: cmp w9, w82653; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2654; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36]2655; NONEON-NOSVE-NEXT: strb w8, [sp, #85]2656; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52]2657; NONEON-NOSVE-NEXT: cmp w9, w82658; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2659; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35]2660; NONEON-NOSVE-NEXT: strb w8, [sp, #84]2661; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51]2662; NONEON-NOSVE-NEXT: cmp w9, w82663; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2664; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34]2665; NONEON-NOSVE-NEXT: strb w8, [sp, #83]2666; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50]2667; NONEON-NOSVE-NEXT: cmp w9, w82668; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2669; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33]2670; NONEON-NOSVE-NEXT: strb w8, [sp, #82]2671; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49]2672; NONEON-NOSVE-NEXT: cmp w9, w82673; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2674; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32]2675; NONEON-NOSVE-NEXT: strb w8, [sp, #81]2676; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48]2677; NONEON-NOSVE-NEXT: cmp w9, w82678; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2679; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]2680; NONEON-NOSVE-NEXT: strb w8, [sp, #80]2681; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]2682; NONEON-NOSVE-NEXT: cmp w9, w82683; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2684; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]2685; NONEON-NOSVE-NEXT: strb w8, [sp, #79]2686; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]2687; NONEON-NOSVE-NEXT: cmp w9, w82688; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2689; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]2690; NONEON-NOSVE-NEXT: strb w8, [sp, #78]2691; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]2692; NONEON-NOSVE-NEXT: cmp w9, w82693; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2694; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]2695; NONEON-NOSVE-NEXT: strb w8, [sp, #77]2696; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]2697; NONEON-NOSVE-NEXT: cmp w9, w82698; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2699; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]2700; NONEON-NOSVE-NEXT: strb w8, [sp, #76]2701; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]2702; NONEON-NOSVE-NEXT: cmp w9, w82703; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2704; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]2705; NONEON-NOSVE-NEXT: strb w8, [sp, #75]2706; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]2707; NONEON-NOSVE-NEXT: cmp w9, w82708; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2709; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]2710; NONEON-NOSVE-NEXT: strb w8, [sp, #74]2711; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]2712; NONEON-NOSVE-NEXT: cmp w9, w82713; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2714; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]2715; NONEON-NOSVE-NEXT: strb w8, [sp, #73]2716; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]2717; NONEON-NOSVE-NEXT: cmp w9, w82718; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2719; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]2720; NONEON-NOSVE-NEXT: strb w8, [sp, #72]2721; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]2722; NONEON-NOSVE-NEXT: cmp w9, w82723; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2724; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]2725; NONEON-NOSVE-NEXT: strb w8, [sp, #71]2726; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]2727; NONEON-NOSVE-NEXT: cmp w9, w82728; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2729; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]2730; NONEON-NOSVE-NEXT: strb w8, [sp, #70]2731; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]2732; NONEON-NOSVE-NEXT: cmp w9, w82733; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2734; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]2735; NONEON-NOSVE-NEXT: strb w8, [sp, #69]2736; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]2737; NONEON-NOSVE-NEXT: cmp w9, w82738; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2739; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]2740; NONEON-NOSVE-NEXT: strb w8, [sp, #68]2741; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]2742; NONEON-NOSVE-NEXT: cmp w9, w82743; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2744; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]2745; NONEON-NOSVE-NEXT: strb w8, [sp, #67]2746; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]2747; NONEON-NOSVE-NEXT: cmp w9, w82748; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2749; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]2750; NONEON-NOSVE-NEXT: strb w8, [sp, #66]2751; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]2752; NONEON-NOSVE-NEXT: cmp w9, w82753; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2754; NONEON-NOSVE-NEXT: ldrb w9, [sp]2755; NONEON-NOSVE-NEXT: strb w8, [sp, #65]2756; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]2757; NONEON-NOSVE-NEXT: cmp w9, w82758; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2759; NONEON-NOSVE-NEXT: strb w8, [sp, #64]2760; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2761; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2762; NONEON-NOSVE-NEXT: add sp, sp, #962763; NONEON-NOSVE-NEXT: ret2764 %op1 = load <32 x i8>, ptr %a2765 %op2 = load <32 x i8>, ptr %b2766 %res = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %op1, <32 x i8> %op2)2767 store <32 x i8> %res, ptr %a2768 ret void2769}2770 2771define <4 x i16> @umin_v4i16(<4 x i16> %op1, <4 x i16> %op2) {2772; CHECK-LABEL: umin_v4i16:2773; CHECK: // %bb.0:2774; CHECK-NEXT: ptrue p0.h, vl42775; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02776; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12777; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h2778; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02779; CHECK-NEXT: ret2780;2781; NONEON-NOSVE-LABEL: umin_v4i16:2782; NONEON-NOSVE: // %bb.0:2783; NONEON-NOSVE-NEXT: sub sp, sp, #322784; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322785; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2786; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2787; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2788; NONEON-NOSVE-NEXT: cmp w9, w82789; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2790; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2791; NONEON-NOSVE-NEXT: strh w8, [sp, #30]2792; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2793; NONEON-NOSVE-NEXT: cmp w9, w82794; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2795; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2796; NONEON-NOSVE-NEXT: strh w8, [sp, #28]2797; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2798; NONEON-NOSVE-NEXT: cmp w9, w82799; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2800; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2801; NONEON-NOSVE-NEXT: strh w8, [sp, #26]2802; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2803; NONEON-NOSVE-NEXT: cmp w9, w82804; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2805; NONEON-NOSVE-NEXT: strh w8, [sp, #24]2806; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2807; NONEON-NOSVE-NEXT: add sp, sp, #322808; NONEON-NOSVE-NEXT: ret2809 %res = call <4 x i16> @llvm.umin.v4i16(<4 x i16> %op1, <4 x i16> %op2)2810 ret <4 x i16> %res2811}2812 2813define <8 x i16> @umin_v8i16(<8 x i16> %op1, <8 x i16> %op2) {2814; CHECK-LABEL: umin_v8i16:2815; CHECK: // %bb.0:2816; CHECK-NEXT: ptrue p0.h, vl82817; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02818; CHECK-NEXT: // kill: def $q1 killed $q1 def $z12819; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h2820; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02821; CHECK-NEXT: ret2822;2823; NONEON-NOSVE-LABEL: umin_v8i16:2824; NONEON-NOSVE: // %bb.0:2825; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!2826; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482827; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]2828; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2829; NONEON-NOSVE-NEXT: cmp w9, w82830; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2831; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2832; NONEON-NOSVE-NEXT: strh w8, [sp, #46]2833; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]2834; NONEON-NOSVE-NEXT: cmp w9, w82835; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2836; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2837; NONEON-NOSVE-NEXT: strh w8, [sp, #44]2838; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]2839; NONEON-NOSVE-NEXT: cmp w9, w82840; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2841; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2842; NONEON-NOSVE-NEXT: strh w8, [sp, #42]2843; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]2844; NONEON-NOSVE-NEXT: cmp w9, w82845; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2846; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]2847; NONEON-NOSVE-NEXT: strh w8, [sp, #40]2848; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2849; NONEON-NOSVE-NEXT: cmp w9, w82850; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2851; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]2852; NONEON-NOSVE-NEXT: strh w8, [sp, #38]2853; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2854; NONEON-NOSVE-NEXT: cmp w9, w82855; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2856; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]2857; NONEON-NOSVE-NEXT: strh w8, [sp, #36]2858; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2859; NONEON-NOSVE-NEXT: cmp w9, w82860; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2861; NONEON-NOSVE-NEXT: ldrh w9, [sp]2862; NONEON-NOSVE-NEXT: strh w8, [sp, #34]2863; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2864; NONEON-NOSVE-NEXT: cmp w9, w82865; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2866; NONEON-NOSVE-NEXT: strh w8, [sp, #32]2867; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2868; NONEON-NOSVE-NEXT: add sp, sp, #482869; NONEON-NOSVE-NEXT: ret2870 %res = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %op1, <8 x i16> %op2)2871 ret <8 x i16> %res2872}2873 2874define void @umin_v16i16(ptr %a, ptr %b) {2875; CHECK-LABEL: umin_v16i16:2876; CHECK: // %bb.0:2877; CHECK-NEXT: ldp q0, q3, [x1]2878; CHECK-NEXT: ptrue p0.h, vl82879; CHECK-NEXT: ldp q1, q2, [x0]2880; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h2881; CHECK-NEXT: umin z2.h, p0/m, z2.h, z3.h2882; CHECK-NEXT: stp q0, q2, [x0]2883; CHECK-NEXT: ret2884;2885; NONEON-NOSVE-LABEL: umin_v16i16:2886; NONEON-NOSVE: // %bb.0:2887; NONEON-NOSVE-NEXT: sub sp, sp, #962888; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 962889; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]2890; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]2891; NONEON-NOSVE-NEXT: stp q2, q3, [sp]2892; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]2893; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]2894; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46]2895; NONEON-NOSVE-NEXT: cmp w9, w82896; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2897; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44]2898; NONEON-NOSVE-NEXT: strh w8, [sp, #94]2899; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]2900; NONEON-NOSVE-NEXT: cmp w9, w82901; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2902; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42]2903; NONEON-NOSVE-NEXT: strh w8, [sp, #92]2904; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]2905; NONEON-NOSVE-NEXT: cmp w9, w82906; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2907; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40]2908; NONEON-NOSVE-NEXT: strh w8, [sp, #90]2909; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]2910; NONEON-NOSVE-NEXT: cmp w9, w82911; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2912; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38]2913; NONEON-NOSVE-NEXT: strh w8, [sp, #88]2914; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]2915; NONEON-NOSVE-NEXT: cmp w9, w82916; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2917; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36]2918; NONEON-NOSVE-NEXT: strh w8, [sp, #86]2919; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]2920; NONEON-NOSVE-NEXT: cmp w9, w82921; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2922; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34]2923; NONEON-NOSVE-NEXT: strh w8, [sp, #84]2924; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]2925; NONEON-NOSVE-NEXT: cmp w9, w82926; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2927; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32]2928; NONEON-NOSVE-NEXT: strh w8, [sp, #82]2929; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]2930; NONEON-NOSVE-NEXT: cmp w9, w82931; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2932; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]2933; NONEON-NOSVE-NEXT: strh w8, [sp, #80]2934; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]2935; NONEON-NOSVE-NEXT: cmp w9, w82936; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2937; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]2938; NONEON-NOSVE-NEXT: strh w8, [sp, #78]2939; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]2940; NONEON-NOSVE-NEXT: cmp w9, w82941; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2942; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]2943; NONEON-NOSVE-NEXT: strh w8, [sp, #76]2944; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]2945; NONEON-NOSVE-NEXT: cmp w9, w82946; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2947; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]2948; NONEON-NOSVE-NEXT: strh w8, [sp, #74]2949; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]2950; NONEON-NOSVE-NEXT: cmp w9, w82951; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2952; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]2953; NONEON-NOSVE-NEXT: strh w8, [sp, #72]2954; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]2955; NONEON-NOSVE-NEXT: cmp w9, w82956; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2957; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]2958; NONEON-NOSVE-NEXT: strh w8, [sp, #70]2959; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]2960; NONEON-NOSVE-NEXT: cmp w9, w82961; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2962; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]2963; NONEON-NOSVE-NEXT: strh w8, [sp, #68]2964; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]2965; NONEON-NOSVE-NEXT: cmp w9, w82966; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2967; NONEON-NOSVE-NEXT: ldrh w9, [sp]2968; NONEON-NOSVE-NEXT: strh w8, [sp, #66]2969; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]2970; NONEON-NOSVE-NEXT: cmp w9, w82971; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo2972; NONEON-NOSVE-NEXT: strh w8, [sp, #64]2973; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]2974; NONEON-NOSVE-NEXT: stp q0, q1, [x0]2975; NONEON-NOSVE-NEXT: add sp, sp, #962976; NONEON-NOSVE-NEXT: ret2977 %op1 = load <16 x i16>, ptr %a2978 %op2 = load <16 x i16>, ptr %b2979 %res = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %op1, <16 x i16> %op2)2980 store <16 x i16> %res, ptr %a2981 ret void2982}2983 2984define <2 x i32> @umin_v2i32(<2 x i32> %op1, <2 x i32> %op2) {2985; CHECK-LABEL: umin_v2i32:2986; CHECK: // %bb.0:2987; CHECK-NEXT: ptrue p0.s, vl22988; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02989; CHECK-NEXT: // kill: def $d1 killed $d1 def $z12990; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s2991; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02992; CHECK-NEXT: ret2993;2994; NONEON-NOSVE-LABEL: umin_v2i32:2995; NONEON-NOSVE: // %bb.0:2996; NONEON-NOSVE-NEXT: sub sp, sp, #322997; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322998; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]2999; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]3000; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]3001; NONEON-NOSVE-NEXT: cmp w10, w83002; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3003; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]3004; NONEON-NOSVE-NEXT: cmp w9, w83005; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3006; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]3007; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]3008; NONEON-NOSVE-NEXT: add sp, sp, #323009; NONEON-NOSVE-NEXT: ret3010 %res = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %op1, <2 x i32> %op2)3011 ret <2 x i32> %res3012}3013 3014define <4 x i32> @umin_v4i32(<4 x i32> %op1, <4 x i32> %op2) {3015; CHECK-LABEL: umin_v4i32:3016; CHECK: // %bb.0:3017; CHECK-NEXT: ptrue p0.s, vl43018; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03019; CHECK-NEXT: // kill: def $q1 killed $q1 def $z13020; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s3021; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03022; CHECK-NEXT: ret3023;3024; NONEON-NOSVE-LABEL: umin_v4i32:3025; NONEON-NOSVE: // %bb.0:3026; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!3027; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 483028; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]3029; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]3030; NONEON-NOSVE-NEXT: cmp w10, w83031; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3032; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]3033; NONEON-NOSVE-NEXT: cmp w9, w83034; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3035; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]3036; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]3037; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]3038; NONEON-NOSVE-NEXT: cmp w10, w83039; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3040; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]3041; NONEON-NOSVE-NEXT: cmp w9, w83042; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3043; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]3044; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]3045; NONEON-NOSVE-NEXT: add sp, sp, #483046; NONEON-NOSVE-NEXT: ret3047 %res = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %op1, <4 x i32> %op2)3048 ret <4 x i32> %res3049}3050 3051define void @umin_v8i32(ptr %a, ptr %b) {3052; CHECK-LABEL: umin_v8i32:3053; CHECK: // %bb.0:3054; CHECK-NEXT: ldp q0, q3, [x1]3055; CHECK-NEXT: ptrue p0.s, vl43056; CHECK-NEXT: ldp q1, q2, [x0]3057; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s3058; CHECK-NEXT: umin z2.s, p0/m, z2.s, z3.s3059; CHECK-NEXT: stp q0, q2, [x0]3060; CHECK-NEXT: ret3061;3062; NONEON-NOSVE-LABEL: umin_v8i32:3063; NONEON-NOSVE: // %bb.0:3064; NONEON-NOSVE-NEXT: sub sp, sp, #963065; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 963066; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]3067; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]3068; NONEON-NOSVE-NEXT: stp q2, q3, [sp]3069; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]3070; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]3071; NONEON-NOSVE-NEXT: ldr w8, [sp, #60]3072; NONEON-NOSVE-NEXT: cmp w10, w83073; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3074; NONEON-NOSVE-NEXT: ldr w8, [sp, #56]3075; NONEON-NOSVE-NEXT: cmp w9, w83076; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3077; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]3078; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]3079; NONEON-NOSVE-NEXT: ldr w8, [sp, #52]3080; NONEON-NOSVE-NEXT: cmp w10, w83081; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3082; NONEON-NOSVE-NEXT: ldr w8, [sp, #48]3083; NONEON-NOSVE-NEXT: cmp w9, w83084; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3085; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]3086; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]3087; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]3088; NONEON-NOSVE-NEXT: cmp w10, w83089; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3090; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]3091; NONEON-NOSVE-NEXT: cmp w9, w83092; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3093; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]3094; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]3095; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]3096; NONEON-NOSVE-NEXT: cmp w10, w83097; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo3098; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]3099; NONEON-NOSVE-NEXT: cmp w9, w83100; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo3101; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]3102; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]3103; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3104; NONEON-NOSVE-NEXT: add sp, sp, #963105; NONEON-NOSVE-NEXT: ret3106 %op1 = load <8 x i32>, ptr %a3107 %op2 = load <8 x i32>, ptr %b3108 %res = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %op1, <8 x i32> %op2)3109 store <8 x i32> %res, ptr %a3110 ret void3111}3112 3113; Vector i64 min are not legal for NEON so use SVE when available.3114define <1 x i64> @umin_v1i64(<1 x i64> %op1, <1 x i64> %op2) {3115; CHECK-LABEL: umin_v1i64:3116; CHECK: // %bb.0:3117; CHECK-NEXT: ptrue p0.d, vl13118; CHECK-NEXT: // kill: def $d0 killed $d0 def $z03119; CHECK-NEXT: // kill: def $d1 killed $d1 def $z13120; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d3121; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03122; CHECK-NEXT: ret3123;3124; NONEON-NOSVE-LABEL: umin_v1i64:3125; NONEON-NOSVE: // %bb.0:3126; NONEON-NOSVE-NEXT: sub sp, sp, #163127; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 163128; NONEON-NOSVE-NEXT: fmov x8, d13129; NONEON-NOSVE-NEXT: fmov x9, d03130; NONEON-NOSVE-NEXT: cmp x9, x83131; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo3132; NONEON-NOSVE-NEXT: str x8, [sp, #8]3133; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]3134; NONEON-NOSVE-NEXT: add sp, sp, #163135; NONEON-NOSVE-NEXT: ret3136 %res = call <1 x i64> @llvm.umin.v1i64(<1 x i64> %op1, <1 x i64> %op2)3137 ret <1 x i64> %res3138}3139 3140; Vector i64 min are not legal for NEON so use SVE when available.3141define <2 x i64> @umin_v2i64(<2 x i64> %op1, <2 x i64> %op2) {3142; CHECK-LABEL: umin_v2i64:3143; CHECK: // %bb.0:3144; CHECK-NEXT: ptrue p0.d, vl23145; CHECK-NEXT: // kill: def $q0 killed $q0 def $z03146; CHECK-NEXT: // kill: def $q1 killed $q1 def $z13147; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d3148; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z03149; CHECK-NEXT: ret3150;3151; NONEON-NOSVE-LABEL: umin_v2i64:3152; NONEON-NOSVE: // %bb.0:3153; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!3154; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 483155; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]3156; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]3157; NONEON-NOSVE-NEXT: cmp x10, x83158; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo3159; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]3160; NONEON-NOSVE-NEXT: cmp x9, x83161; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo3162; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]3163; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]3164; NONEON-NOSVE-NEXT: add sp, sp, #483165; NONEON-NOSVE-NEXT: ret3166 %res = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %op1, <2 x i64> %op2)3167 ret <2 x i64> %res3168}3169 3170define void @umin_v4i64(ptr %a, ptr %b) {3171; CHECK-LABEL: umin_v4i64:3172; CHECK: // %bb.0:3173; CHECK-NEXT: ldp q0, q3, [x1]3174; CHECK-NEXT: ptrue p0.d, vl23175; CHECK-NEXT: ldp q1, q2, [x0]3176; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d3177; CHECK-NEXT: umin z2.d, p0/m, z2.d, z3.d3178; CHECK-NEXT: stp q0, q2, [x0]3179; CHECK-NEXT: ret3180;3181; NONEON-NOSVE-LABEL: umin_v4i64:3182; NONEON-NOSVE: // %bb.0:3183; NONEON-NOSVE-NEXT: sub sp, sp, #963184; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 963185; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]3186; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]3187; NONEON-NOSVE-NEXT: stp q2, q3, [sp]3188; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]3189; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]3190; NONEON-NOSVE-NEXT: ldr x8, [sp, #56]3191; NONEON-NOSVE-NEXT: cmp x10, x83192; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo3193; NONEON-NOSVE-NEXT: ldr x8, [sp, #48]3194; NONEON-NOSVE-NEXT: cmp x9, x83195; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo3196; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]3197; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]3198; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]3199; NONEON-NOSVE-NEXT: cmp x10, x83200; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo3201; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]3202; NONEON-NOSVE-NEXT: cmp x9, x83203; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo3204; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]3205; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]3206; NONEON-NOSVE-NEXT: stp q0, q1, [x0]3207; NONEON-NOSVE-NEXT: add sp, sp, #963208; NONEON-NOSVE-NEXT: ret3209 %op1 = load <4 x i64>, ptr %a3210 %op2 = load <4 x i64>, ptr %b3211 %res = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %op1, <4 x i64> %op2)3212 store <4 x i64> %res, ptr %a3213 ret void3214}3215 3216declare <8 x i8> @llvm.smin.v8i8(<8 x i8>, <8 x i8>)3217declare <16 x i8> @llvm.smin.v16i8(<16 x i8>, <16 x i8>)3218declare <32 x i8> @llvm.smin.v32i8(<32 x i8>, <32 x i8>)3219declare <4 x i16> @llvm.smin.v4i16(<4 x i16>, <4 x i16>)3220declare <8 x i16> @llvm.smin.v8i16(<8 x i16>, <8 x i16>)3221declare <16 x i16> @llvm.smin.v16i16(<16 x i16>, <16 x i16>)3222declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)3223declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)3224declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)3225declare <1 x i64> @llvm.smin.v1i64(<1 x i64>, <1 x i64>)3226declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)3227declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)3228 3229declare <8 x i8> @llvm.smax.v8i8(<8 x i8>, <8 x i8>)3230declare <16 x i8> @llvm.smax.v16i8(<16 x i8>, <16 x i8>)3231declare <32 x i8> @llvm.smax.v32i8(<32 x i8>, <32 x i8>)3232declare <4 x i16> @llvm.smax.v4i16(<4 x i16>, <4 x i16>)3233declare <8 x i16> @llvm.smax.v8i16(<8 x i16>, <8 x i16>)3234declare <16 x i16> @llvm.smax.v16i16(<16 x i16>, <16 x i16>)3235declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>)3236declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)3237declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)3238declare <1 x i64> @llvm.smax.v1i64(<1 x i64>, <1 x i64>)3239declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)3240declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)3241 3242declare <8 x i8> @llvm.umin.v8i8(<8 x i8>, <8 x i8>)3243declare <16 x i8> @llvm.umin.v16i8(<16 x i8>, <16 x i8>)3244declare <32 x i8> @llvm.umin.v32i8(<32 x i8>, <32 x i8>)3245declare <4 x i16> @llvm.umin.v4i16(<4 x i16>, <4 x i16>)3246declare <8 x i16> @llvm.umin.v8i16(<8 x i16>, <8 x i16>)3247declare <16 x i16> @llvm.umin.v16i16(<16 x i16>, <16 x i16>)3248declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)3249declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)3250declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)3251declare <1 x i64> @llvm.umin.v1i64(<1 x i64>, <1 x i64>)3252declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>)3253declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)3254 3255declare <8 x i8> @llvm.umax.v8i8(<8 x i8>, <8 x i8>)3256declare <16 x i8> @llvm.umax.v16i8(<16 x i8>, <16 x i8>)3257declare <32 x i8> @llvm.umax.v32i8(<32 x i8>, <32 x i8>)3258declare <4 x i16> @llvm.umax.v4i16(<4 x i16>, <4 x i16>)3259declare <8 x i16> @llvm.umax.v8i16(<8 x i16>, <8 x i16>)3260declare <16 x i16> @llvm.umax.v16i16(<16 x i16>, <16 x i16>)3261declare <2 x i32> @llvm.umax.v2i32(<2 x i32>, <2 x i32>)3262declare <4 x i32> @llvm.umax.v4i32(<4 x i32>, <4 x i32>)3263declare <8 x i32> @llvm.umax.v8i32(<8 x i32>, <8 x i32>)3264declare <1 x i64> @llvm.umax.v1i64(<1 x i64>, <1 x i64>)3265declare <2 x i64> @llvm.umax.v2i64(<2 x i64>, <2 x i64>)3266declare <4 x i64> @llvm.umax.v4i64(<4 x i64>, <4 x i64>)3267