1665 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL3; RUN: llc -mtriple=aarch64 %s -o - -mattr=+cssc | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL-CSSC4; RUN: llc -mtriple=aarch64 -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL5; RUN: llc -mtriple=aarch64 -global-isel %s -o - -mattr=+cssc | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL-CSSC6 7; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax,8; @llvm.smin, @llvm.umin.9 10declare i8 @llvm.smax.i8(i8 %a, i8 %b) readnone11 12define i8 @smaxi8(i8 %a, i8 %b) {13; CHECK-ISEL-LABEL: smaxi8:14; CHECK-ISEL: // %bb.0:15; CHECK-ISEL-NEXT: sxtb w8, w116; CHECK-ISEL-NEXT: sxtb w9, w017; CHECK-ISEL-NEXT: cmp w9, w818; CHECK-ISEL-NEXT: csel w0, w9, w8, gt19; CHECK-ISEL-NEXT: ret20;21; CHECK-ISEL-CSSC-LABEL: smaxi8:22; CHECK-ISEL-CSSC: // %bb.0:23; CHECK-ISEL-CSSC-NEXT: sxtb w8, w124; CHECK-ISEL-CSSC-NEXT: sxtb w9, w025; CHECK-ISEL-CSSC-NEXT: smax w0, w9, w826; CHECK-ISEL-CSSC-NEXT: ret27;28; CHECK-GLOBAL-LABEL: smaxi8:29; CHECK-GLOBAL: // %bb.0:30; CHECK-GLOBAL-NEXT: sxtb w8, w031; CHECK-GLOBAL-NEXT: cmp w8, w1, sxtb32; CHECK-GLOBAL-NEXT: csel w0, w0, w1, gt33; CHECK-GLOBAL-NEXT: ret34;35; CHECK-GLOBAL-CSSC-LABEL: smaxi8:36; CHECK-GLOBAL-CSSC: // %bb.0:37; CHECK-GLOBAL-CSSC-NEXT: sxtb w8, w038; CHECK-GLOBAL-CSSC-NEXT: sxtb w9, w139; CHECK-GLOBAL-CSSC-NEXT: smax w0, w8, w940; CHECK-GLOBAL-CSSC-NEXT: ret41 %c = call i8 @llvm.smax.i8(i8 %a, i8 %b)42 ret i8 %c43}44 45declare i16 @llvm.smax.i16(i16 %a, i16 %b) readnone46 47define i16 @smaxi16(i16 %a, i16 %b) {48; CHECK-ISEL-LABEL: smaxi16:49; CHECK-ISEL: // %bb.0:50; CHECK-ISEL-NEXT: sxth w8, w151; CHECK-ISEL-NEXT: sxth w9, w052; CHECK-ISEL-NEXT: cmp w9, w853; CHECK-ISEL-NEXT: csel w0, w9, w8, gt54; CHECK-ISEL-NEXT: ret55;56; CHECK-ISEL-CSSC-LABEL: smaxi16:57; CHECK-ISEL-CSSC: // %bb.0:58; CHECK-ISEL-CSSC-NEXT: sxth w8, w159; CHECK-ISEL-CSSC-NEXT: sxth w9, w060; CHECK-ISEL-CSSC-NEXT: smax w0, w9, w861; CHECK-ISEL-CSSC-NEXT: ret62;63; CHECK-GLOBAL-LABEL: smaxi16:64; CHECK-GLOBAL: // %bb.0:65; CHECK-GLOBAL-NEXT: sxth w8, w066; CHECK-GLOBAL-NEXT: cmp w8, w1, sxth67; CHECK-GLOBAL-NEXT: csel w0, w0, w1, gt68; CHECK-GLOBAL-NEXT: ret69;70; CHECK-GLOBAL-CSSC-LABEL: smaxi16:71; CHECK-GLOBAL-CSSC: // %bb.0:72; CHECK-GLOBAL-CSSC-NEXT: sxth w8, w073; CHECK-GLOBAL-CSSC-NEXT: sxth w9, w174; CHECK-GLOBAL-CSSC-NEXT: smax w0, w8, w975; CHECK-GLOBAL-CSSC-NEXT: ret76 %c = call i16 @llvm.smax.i16(i16 %a, i16 %b)77 ret i16 %c78}79 80declare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone81 82define i32 @smaxi32(i32 %a, i32 %b) {83; CHECK-ISEL-LABEL: smaxi32:84; CHECK-ISEL: // %bb.0:85; CHECK-ISEL-NEXT: cmp w0, w186; CHECK-ISEL-NEXT: csel w0, w0, w1, gt87; CHECK-ISEL-NEXT: ret88;89; CHECK-ISEL-CSSC-LABEL: smaxi32:90; CHECK-ISEL-CSSC: // %bb.0:91; CHECK-ISEL-CSSC-NEXT: smax w0, w0, w192; CHECK-ISEL-CSSC-NEXT: ret93;94; CHECK-GLOBAL-LABEL: smaxi32:95; CHECK-GLOBAL: // %bb.0:96; CHECK-GLOBAL-NEXT: cmp w0, w197; CHECK-GLOBAL-NEXT: csel w0, w0, w1, gt98; CHECK-GLOBAL-NEXT: ret99;100; CHECK-GLOBAL-CSSC-LABEL: smaxi32:101; CHECK-GLOBAL-CSSC: // %bb.0:102; CHECK-GLOBAL-CSSC-NEXT: smax w0, w0, w1103; CHECK-GLOBAL-CSSC-NEXT: ret104 %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)105 ret i32 %c106}107 108declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone109 110define i64 @smaxi64(i64 %a, i64 %b) {111; CHECK-ISEL-LABEL: smaxi64:112; CHECK-ISEL: // %bb.0:113; CHECK-ISEL-NEXT: cmp x0, x1114; CHECK-ISEL-NEXT: csel x0, x0, x1, gt115; CHECK-ISEL-NEXT: ret116;117; CHECK-ISEL-CSSC-LABEL: smaxi64:118; CHECK-ISEL-CSSC: // %bb.0:119; CHECK-ISEL-CSSC-NEXT: smax x0, x0, x1120; CHECK-ISEL-CSSC-NEXT: ret121;122; CHECK-GLOBAL-LABEL: smaxi64:123; CHECK-GLOBAL: // %bb.0:124; CHECK-GLOBAL-NEXT: cmp x0, x1125; CHECK-GLOBAL-NEXT: csel x0, x0, x1, gt126; CHECK-GLOBAL-NEXT: ret127;128; CHECK-GLOBAL-CSSC-LABEL: smaxi64:129; CHECK-GLOBAL-CSSC: // %bb.0:130; CHECK-GLOBAL-CSSC-NEXT: smax x0, x0, x1131; CHECK-GLOBAL-CSSC-NEXT: ret132 %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)133 ret i64 %c134}135 136declare <8 x i8> @llvm.smax.v8i8(<8 x i8> %a, <8 x i8> %b) readnone137 138define <8 x i8> @smax8i8(<8 x i8> %a, <8 x i8> %b) {139; CHECK-LABEL: smax8i8:140; CHECK: // %bb.0:141; CHECK-NEXT: smax v0.8b, v0.8b, v1.8b142; CHECK-NEXT: ret143 %c = call <8 x i8> @llvm.smax.v8i8(<8 x i8> %a, <8 x i8> %b)144 ret <8 x i8> %c145}146 147declare <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b) readnone148 149define <16 x i8> @smax16i8(<16 x i8> %a, <16 x i8> %b) {150; CHECK-LABEL: smax16i8:151; CHECK: // %bb.0:152; CHECK-NEXT: smax v0.16b, v0.16b, v1.16b153; CHECK-NEXT: ret154 %c = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %a, <16 x i8> %b)155 ret <16 x i8> %c156}157 158declare <32 x i8> @llvm.smax.v32i8(<32 x i8> %a, <32 x i8> %b) readnone159 160define void @smax32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {161; CHECK-ISEL-LABEL: smax32i8:162; CHECK-ISEL: // %bb.0:163; CHECK-ISEL-NEXT: smax v1.16b, v1.16b, v3.16b164; CHECK-ISEL-NEXT: smax v0.16b, v0.16b, v2.16b165; CHECK-ISEL-NEXT: stp q0, q1, [x0]166; CHECK-ISEL-NEXT: ret167;168; CHECK-ISEL-CSSC-LABEL: smax32i8:169; CHECK-ISEL-CSSC: // %bb.0:170; CHECK-ISEL-CSSC-NEXT: smax v1.16b, v1.16b, v3.16b171; CHECK-ISEL-CSSC-NEXT: smax v0.16b, v0.16b, v2.16b172; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]173; CHECK-ISEL-CSSC-NEXT: ret174;175; CHECK-GLOBAL-LABEL: smax32i8:176; CHECK-GLOBAL: // %bb.0:177; CHECK-GLOBAL-NEXT: smax v0.16b, v0.16b, v2.16b178; CHECK-GLOBAL-NEXT: smax v1.16b, v1.16b, v3.16b179; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]180; CHECK-GLOBAL-NEXT: ret181;182; CHECK-GLOBAL-CSSC-LABEL: smax32i8:183; CHECK-GLOBAL-CSSC: // %bb.0:184; CHECK-GLOBAL-CSSC-NEXT: smax v0.16b, v0.16b, v2.16b185; CHECK-GLOBAL-CSSC-NEXT: smax v1.16b, v1.16b, v3.16b186; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]187; CHECK-GLOBAL-CSSC-NEXT: ret188 %c = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %a, <32 x i8> %b)189 store <32 x i8> %c, ptr %p190 ret void191}192 193declare <4 x i16> @llvm.smax.v4i16(<4 x i16> %a, <4 x i16> %b) readnone194 195define <4 x i16> @smax4i16(<4 x i16> %a, <4 x i16> %b) {196; CHECK-LABEL: smax4i16:197; CHECK: // %bb.0:198; CHECK-NEXT: smax v0.4h, v0.4h, v1.4h199; CHECK-NEXT: ret200 %c = call <4 x i16> @llvm.smax.v4i16(<4 x i16> %a, <4 x i16> %b)201 ret <4 x i16> %c202}203 204declare <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b) readnone205 206define <8 x i16> @smax8i16(<8 x i16> %a, <8 x i16> %b) {207; CHECK-LABEL: smax8i16:208; CHECK: // %bb.0:209; CHECK-NEXT: smax v0.8h, v0.8h, v1.8h210; CHECK-NEXT: ret211 %c = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b)212 ret <8 x i16> %c213}214 215declare <16 x i16> @llvm.smax.v16i16(<16 x i16> %a, <16 x i16> %b) readnone216 217define void @smax16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {218; CHECK-ISEL-LABEL: smax16i16:219; CHECK-ISEL: // %bb.0:220; CHECK-ISEL-NEXT: smax v1.8h, v1.8h, v3.8h221; CHECK-ISEL-NEXT: smax v0.8h, v0.8h, v2.8h222; CHECK-ISEL-NEXT: stp q0, q1, [x0]223; CHECK-ISEL-NEXT: ret224;225; CHECK-ISEL-CSSC-LABEL: smax16i16:226; CHECK-ISEL-CSSC: // %bb.0:227; CHECK-ISEL-CSSC-NEXT: smax v1.8h, v1.8h, v3.8h228; CHECK-ISEL-CSSC-NEXT: smax v0.8h, v0.8h, v2.8h229; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]230; CHECK-ISEL-CSSC-NEXT: ret231;232; CHECK-GLOBAL-LABEL: smax16i16:233; CHECK-GLOBAL: // %bb.0:234; CHECK-GLOBAL-NEXT: smax v0.8h, v0.8h, v2.8h235; CHECK-GLOBAL-NEXT: smax v1.8h, v1.8h, v3.8h236; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]237; CHECK-GLOBAL-NEXT: ret238;239; CHECK-GLOBAL-CSSC-LABEL: smax16i16:240; CHECK-GLOBAL-CSSC: // %bb.0:241; CHECK-GLOBAL-CSSC-NEXT: smax v0.8h, v0.8h, v2.8h242; CHECK-GLOBAL-CSSC-NEXT: smax v1.8h, v1.8h, v3.8h243; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]244; CHECK-GLOBAL-CSSC-NEXT: ret245 %c = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %a, <16 x i16> %b)246 store <16 x i16> %c, ptr %p247 ret void248}249 250declare <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b) readnone251 252define <2 x i32> @smax2i32(<2 x i32> %a, <2 x i32> %b) {253; CHECK-LABEL: smax2i32:254; CHECK: // %bb.0:255; CHECK-NEXT: smax v0.2s, v0.2s, v1.2s256; CHECK-NEXT: ret257 %c = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b)258 ret <2 x i32> %c259}260 261declare <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b) readnone262 263define <4 x i32> @smax4i32(<4 x i32> %a, <4 x i32> %b) {264; CHECK-LABEL: smax4i32:265; CHECK: // %bb.0:266; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s267; CHECK-NEXT: ret268 %c = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b)269 ret <4 x i32> %c270}271 272declare <8 x i32> @llvm.smax.v8i32(<8 x i32> %a, <8 x i32> %b) readnone273 274define void @smax8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {275; CHECK-ISEL-LABEL: smax8i32:276; CHECK-ISEL: // %bb.0:277; CHECK-ISEL-NEXT: smax v1.4s, v1.4s, v3.4s278; CHECK-ISEL-NEXT: smax v0.4s, v0.4s, v2.4s279; CHECK-ISEL-NEXT: stp q0, q1, [x0]280; CHECK-ISEL-NEXT: ret281;282; CHECK-ISEL-CSSC-LABEL: smax8i32:283; CHECK-ISEL-CSSC: // %bb.0:284; CHECK-ISEL-CSSC-NEXT: smax v1.4s, v1.4s, v3.4s285; CHECK-ISEL-CSSC-NEXT: smax v0.4s, v0.4s, v2.4s286; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]287; CHECK-ISEL-CSSC-NEXT: ret288;289; CHECK-GLOBAL-LABEL: smax8i32:290; CHECK-GLOBAL: // %bb.0:291; CHECK-GLOBAL-NEXT: smax v0.4s, v0.4s, v2.4s292; CHECK-GLOBAL-NEXT: smax v1.4s, v1.4s, v3.4s293; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]294; CHECK-GLOBAL-NEXT: ret295;296; CHECK-GLOBAL-CSSC-LABEL: smax8i32:297; CHECK-GLOBAL-CSSC: // %bb.0:298; CHECK-GLOBAL-CSSC-NEXT: smax v0.4s, v0.4s, v2.4s299; CHECK-GLOBAL-CSSC-NEXT: smax v1.4s, v1.4s, v3.4s300; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]301; CHECK-GLOBAL-CSSC-NEXT: ret302 %c = call <8 x i32>@llvm.smax.v8i32(<8 x i32> %a, <8 x i32> %b)303 store <8 x i32> %c, ptr %p304 ret void305}306 307declare <1 x i64> @llvm.smax.v1i64(<1 x i64> %a, <1 x i64> %b) readnone308 309define <1 x i64> @smax1i64(<1 x i64> %a, <1 x i64> %b) {310; CHECK-ISEL-LABEL: smax1i64:311; CHECK-ISEL: // %bb.0:312; CHECK-ISEL-NEXT: cmgt d2, d0, d1313; CHECK-ISEL-NEXT: bif v0.8b, v1.8b, v2.8b314; CHECK-ISEL-NEXT: ret315;316; CHECK-ISEL-CSSC-LABEL: smax1i64:317; CHECK-ISEL-CSSC: // %bb.0:318; CHECK-ISEL-CSSC-NEXT: cmgt d2, d0, d1319; CHECK-ISEL-CSSC-NEXT: bif v0.8b, v1.8b, v2.8b320; CHECK-ISEL-CSSC-NEXT: ret321;322; CHECK-GLOBAL-LABEL: smax1i64:323; CHECK-GLOBAL: // %bb.0:324; CHECK-GLOBAL-NEXT: fmov x8, d0325; CHECK-GLOBAL-NEXT: fmov x9, d1326; CHECK-GLOBAL-NEXT: cmp x8, x9327; CHECK-GLOBAL-NEXT: fcsel d0, d0, d1, gt328; CHECK-GLOBAL-NEXT: ret329;330; CHECK-GLOBAL-CSSC-LABEL: smax1i64:331; CHECK-GLOBAL-CSSC: // %bb.0:332; CHECK-GLOBAL-CSSC-NEXT: fmov x8, d0333; CHECK-GLOBAL-CSSC-NEXT: fmov x9, d1334; CHECK-GLOBAL-CSSC-NEXT: smax x8, x8, x9335; CHECK-GLOBAL-CSSC-NEXT: fmov d0, x8336; CHECK-GLOBAL-CSSC-NEXT: ret337 %c = call <1 x i64> @llvm.smax.v1i64(<1 x i64> %a, <1 x i64> %b)338 ret <1 x i64> %c339}340 341declare <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone342 343define <2 x i64> @smax2i64(<2 x i64> %a, <2 x i64> %b) {344; CHECK-LABEL: smax2i64:345; CHECK: // %bb.0:346; CHECK-NEXT: cmgt v2.2d, v0.2d, v1.2d347; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b348; CHECK-NEXT: ret349 %c = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b)350 ret <2 x i64> %c351}352 353declare <4 x i64> @llvm.smax.v4i64(<4 x i64> %a, <4 x i64> %b) readnone354 355define void @smax4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {356; CHECK-ISEL-LABEL: smax4i64:357; CHECK-ISEL: // %bb.0:358; CHECK-ISEL-NEXT: cmgt v4.2d, v1.2d, v3.2d359; CHECK-ISEL-NEXT: cmgt v5.2d, v0.2d, v2.2d360; CHECK-ISEL-NEXT: bif v1.16b, v3.16b, v4.16b361; CHECK-ISEL-NEXT: bif v0.16b, v2.16b, v5.16b362; CHECK-ISEL-NEXT: stp q0, q1, [x0]363; CHECK-ISEL-NEXT: ret364;365; CHECK-ISEL-CSSC-LABEL: smax4i64:366; CHECK-ISEL-CSSC: // %bb.0:367; CHECK-ISEL-CSSC-NEXT: cmgt v4.2d, v1.2d, v3.2d368; CHECK-ISEL-CSSC-NEXT: cmgt v5.2d, v0.2d, v2.2d369; CHECK-ISEL-CSSC-NEXT: bif v1.16b, v3.16b, v4.16b370; CHECK-ISEL-CSSC-NEXT: bif v0.16b, v2.16b, v5.16b371; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]372; CHECK-ISEL-CSSC-NEXT: ret373;374; CHECK-GLOBAL-LABEL: smax4i64:375; CHECK-GLOBAL: // %bb.0:376; CHECK-GLOBAL-NEXT: cmgt v4.2d, v0.2d, v2.2d377; CHECK-GLOBAL-NEXT: cmgt v5.2d, v1.2d, v3.2d378; CHECK-GLOBAL-NEXT: bif v0.16b, v2.16b, v4.16b379; CHECK-GLOBAL-NEXT: bif v1.16b, v3.16b, v5.16b380; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]381; CHECK-GLOBAL-NEXT: ret382;383; CHECK-GLOBAL-CSSC-LABEL: smax4i64:384; CHECK-GLOBAL-CSSC: // %bb.0:385; CHECK-GLOBAL-CSSC-NEXT: cmgt v4.2d, v0.2d, v2.2d386; CHECK-GLOBAL-CSSC-NEXT: cmgt v5.2d, v1.2d, v3.2d387; CHECK-GLOBAL-CSSC-NEXT: bif v0.16b, v2.16b, v4.16b388; CHECK-GLOBAL-CSSC-NEXT: bif v1.16b, v3.16b, v5.16b389; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]390; CHECK-GLOBAL-CSSC-NEXT: ret391 %c = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %a, <4 x i64> %b)392 store <4 x i64> %c, ptr %p393 ret void394}395 396declare i8 @llvm.umax.i8(i8 %a, i8 %b) readnone397 398define i8 @umaxi8(i8 %a, i8 %b) {399; CHECK-ISEL-LABEL: umaxi8:400; CHECK-ISEL: // %bb.0:401; CHECK-ISEL-NEXT: and w8, w1, #0xff402; CHECK-ISEL-NEXT: and w9, w0, #0xff403; CHECK-ISEL-NEXT: cmp w9, w8404; CHECK-ISEL-NEXT: csel w0, w9, w8, hi405; CHECK-ISEL-NEXT: ret406;407; CHECK-ISEL-CSSC-LABEL: umaxi8:408; CHECK-ISEL-CSSC: // %bb.0:409; CHECK-ISEL-CSSC-NEXT: and w8, w1, #0xff410; CHECK-ISEL-CSSC-NEXT: and w9, w0, #0xff411; CHECK-ISEL-CSSC-NEXT: umax w0, w9, w8412; CHECK-ISEL-CSSC-NEXT: ret413;414; CHECK-GLOBAL-LABEL: umaxi8:415; CHECK-GLOBAL: // %bb.0:416; CHECK-GLOBAL-NEXT: and w8, w0, #0xff417; CHECK-GLOBAL-NEXT: cmp w8, w1, uxtb418; CHECK-GLOBAL-NEXT: csel w0, w0, w1, hi419; CHECK-GLOBAL-NEXT: ret420;421; CHECK-GLOBAL-CSSC-LABEL: umaxi8:422; CHECK-GLOBAL-CSSC: // %bb.0:423; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xff424; CHECK-GLOBAL-CSSC-NEXT: and w9, w1, #0xff425; CHECK-GLOBAL-CSSC-NEXT: umax w0, w8, w9426; CHECK-GLOBAL-CSSC-NEXT: ret427 %c = call i8 @llvm.umax.i8(i8 %a, i8 %b)428 ret i8 %c429}430 431define i8 @umaxi8_1(i8 %a) {432; CHECK-ISEL-LABEL: umaxi8_1:433; CHECK-ISEL: // %bb.0:434; CHECK-ISEL-NEXT: and w8, w0, #0xff435; CHECK-ISEL-NEXT: tst w0, #0xfe436; CHECK-ISEL-NEXT: csinc w0, w8, wzr, ne437; CHECK-ISEL-NEXT: ret438;439; CHECK-ISEL-CSSC-LABEL: umaxi8_1:440; CHECK-ISEL-CSSC: // %bb.0:441; CHECK-ISEL-CSSC-NEXT: and w8, w0, #0xff442; CHECK-ISEL-CSSC-NEXT: umax w0, w8, #1443; CHECK-ISEL-CSSC-NEXT: ret444;445; CHECK-GLOBAL-LABEL: umaxi8_1:446; CHECK-GLOBAL: // %bb.0:447; CHECK-GLOBAL-NEXT: and w8, w0, #0xff448; CHECK-GLOBAL-NEXT: cmp w8, #1449; CHECK-GLOBAL-NEXT: csinc w0, w0, wzr, hi450; CHECK-GLOBAL-NEXT: ret451;452; CHECK-GLOBAL-CSSC-LABEL: umaxi8_1:453; CHECK-GLOBAL-CSSC: // %bb.0:454; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xff455; CHECK-GLOBAL-CSSC-NEXT: umax w0, w8, #1456; CHECK-GLOBAL-CSSC-NEXT: ret457 %c = call i8 @llvm.umax.i8(i8 %a, i8 1)458 ret i8 %c459}460 461declare i16 @llvm.umax.i16(i16 %a, i16 %b) readnone462 463define i16 @umaxi16(i16 %a, i16 %b) {464; CHECK-ISEL-LABEL: umaxi16:465; CHECK-ISEL: // %bb.0:466; CHECK-ISEL-NEXT: and w8, w1, #0xffff467; CHECK-ISEL-NEXT: and w9, w0, #0xffff468; CHECK-ISEL-NEXT: cmp w9, w8469; CHECK-ISEL-NEXT: csel w0, w9, w8, hi470; CHECK-ISEL-NEXT: ret471;472; CHECK-ISEL-CSSC-LABEL: umaxi16:473; CHECK-ISEL-CSSC: // %bb.0:474; CHECK-ISEL-CSSC-NEXT: and w8, w1, #0xffff475; CHECK-ISEL-CSSC-NEXT: and w9, w0, #0xffff476; CHECK-ISEL-CSSC-NEXT: umax w0, w9, w8477; CHECK-ISEL-CSSC-NEXT: ret478;479; CHECK-GLOBAL-LABEL: umaxi16:480; CHECK-GLOBAL: // %bb.0:481; CHECK-GLOBAL-NEXT: and w8, w0, #0xffff482; CHECK-GLOBAL-NEXT: cmp w8, w1, uxth483; CHECK-GLOBAL-NEXT: csel w0, w0, w1, hi484; CHECK-GLOBAL-NEXT: ret485;486; CHECK-GLOBAL-CSSC-LABEL: umaxi16:487; CHECK-GLOBAL-CSSC: // %bb.0:488; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xffff489; CHECK-GLOBAL-CSSC-NEXT: and w9, w1, #0xffff490; CHECK-GLOBAL-CSSC-NEXT: umax w0, w8, w9491; CHECK-GLOBAL-CSSC-NEXT: ret492 %c = call i16 @llvm.umax.i16(i16 %a, i16 %b)493 ret i16 %c494}495 496define i16 @umaxi16_1(i16 %a) {497; CHECK-ISEL-LABEL: umaxi16_1:498; CHECK-ISEL: // %bb.0:499; CHECK-ISEL-NEXT: and w8, w0, #0xffff500; CHECK-ISEL-NEXT: tst w0, #0xfffe501; CHECK-ISEL-NEXT: csinc w0, w8, wzr, ne502; CHECK-ISEL-NEXT: ret503;504; CHECK-ISEL-CSSC-LABEL: umaxi16_1:505; CHECK-ISEL-CSSC: // %bb.0:506; CHECK-ISEL-CSSC-NEXT: and w8, w0, #0xffff507; CHECK-ISEL-CSSC-NEXT: umax w0, w8, #1508; CHECK-ISEL-CSSC-NEXT: ret509;510; CHECK-GLOBAL-LABEL: umaxi16_1:511; CHECK-GLOBAL: // %bb.0:512; CHECK-GLOBAL-NEXT: and w8, w0, #0xffff513; CHECK-GLOBAL-NEXT: cmp w8, #1514; CHECK-GLOBAL-NEXT: csinc w0, w0, wzr, hi515; CHECK-GLOBAL-NEXT: ret516;517; CHECK-GLOBAL-CSSC-LABEL: umaxi16_1:518; CHECK-GLOBAL-CSSC: // %bb.0:519; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xffff520; CHECK-GLOBAL-CSSC-NEXT: umax w0, w8, #1521; CHECK-GLOBAL-CSSC-NEXT: ret522 %c = call i16 @llvm.umax.i16(i16 %a, i16 1)523 ret i16 %c524}525 526declare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone527 528define i32 @umaxi32(i32 %a, i32 %b) {529; CHECK-ISEL-LABEL: umaxi32:530; CHECK-ISEL: // %bb.0:531; CHECK-ISEL-NEXT: cmp w0, w1532; CHECK-ISEL-NEXT: csel w0, w0, w1, hi533; CHECK-ISEL-NEXT: ret534;535; CHECK-ISEL-CSSC-LABEL: umaxi32:536; CHECK-ISEL-CSSC: // %bb.0:537; CHECK-ISEL-CSSC-NEXT: umax w0, w0, w1538; CHECK-ISEL-CSSC-NEXT: ret539;540; CHECK-GLOBAL-LABEL: umaxi32:541; CHECK-GLOBAL: // %bb.0:542; CHECK-GLOBAL-NEXT: cmp w0, w1543; CHECK-GLOBAL-NEXT: csel w0, w0, w1, hi544; CHECK-GLOBAL-NEXT: ret545;546; CHECK-GLOBAL-CSSC-LABEL: umaxi32:547; CHECK-GLOBAL-CSSC: // %bb.0:548; CHECK-GLOBAL-CSSC-NEXT: umax w0, w0, w1549; CHECK-GLOBAL-CSSC-NEXT: ret550 %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)551 ret i32 %c552}553 554define i32 @umaxi32_1(i32 %a) {555; CHECK-ISEL-LABEL: umaxi32_1:556; CHECK-ISEL: // %bb.0:557; CHECK-ISEL-NEXT: cmp w0, #1558; CHECK-ISEL-NEXT: csinc w0, w0, wzr, hi559; CHECK-ISEL-NEXT: ret560;561; CHECK-ISEL-CSSC-LABEL: umaxi32_1:562; CHECK-ISEL-CSSC: // %bb.0:563; CHECK-ISEL-CSSC-NEXT: umax w0, w0, #1564; CHECK-ISEL-CSSC-NEXT: ret565;566; CHECK-GLOBAL-LABEL: umaxi32_1:567; CHECK-GLOBAL: // %bb.0:568; CHECK-GLOBAL-NEXT: cmp w0, #1569; CHECK-GLOBAL-NEXT: csinc w0, w0, wzr, hi570; CHECK-GLOBAL-NEXT: ret571;572; CHECK-GLOBAL-CSSC-LABEL: umaxi32_1:573; CHECK-GLOBAL-CSSC: // %bb.0:574; CHECK-GLOBAL-CSSC-NEXT: umax w0, w0, #1575; CHECK-GLOBAL-CSSC-NEXT: ret576 %c = call i32 @llvm.umax.i32(i32 %a, i32 1)577 ret i32 %c578}579 580declare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone581 582define i64 @umaxi64(i64 %a, i64 %b) {583; CHECK-ISEL-LABEL: umaxi64:584; CHECK-ISEL: // %bb.0:585; CHECK-ISEL-NEXT: cmp x0, x1586; CHECK-ISEL-NEXT: csel x0, x0, x1, hi587; CHECK-ISEL-NEXT: ret588;589; CHECK-ISEL-CSSC-LABEL: umaxi64:590; CHECK-ISEL-CSSC: // %bb.0:591; CHECK-ISEL-CSSC-NEXT: umax x0, x0, x1592; CHECK-ISEL-CSSC-NEXT: ret593;594; CHECK-GLOBAL-LABEL: umaxi64:595; CHECK-GLOBAL: // %bb.0:596; CHECK-GLOBAL-NEXT: cmp x0, x1597; CHECK-GLOBAL-NEXT: csel x0, x0, x1, hi598; CHECK-GLOBAL-NEXT: ret599;600; CHECK-GLOBAL-CSSC-LABEL: umaxi64:601; CHECK-GLOBAL-CSSC: // %bb.0:602; CHECK-GLOBAL-CSSC-NEXT: umax x0, x0, x1603; CHECK-GLOBAL-CSSC-NEXT: ret604 %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)605 ret i64 %c606}607 608define i64 @umaxi64_1(i64 %a) {609; CHECK-ISEL-LABEL: umaxi64_1:610; CHECK-ISEL: // %bb.0:611; CHECK-ISEL-NEXT: cmp x0, #1612; CHECK-ISEL-NEXT: csinc x0, x0, xzr, hi613; CHECK-ISEL-NEXT: ret614;615; CHECK-ISEL-CSSC-LABEL: umaxi64_1:616; CHECK-ISEL-CSSC: // %bb.0:617; CHECK-ISEL-CSSC-NEXT: umax x0, x0, #1618; CHECK-ISEL-CSSC-NEXT: ret619;620; CHECK-GLOBAL-LABEL: umaxi64_1:621; CHECK-GLOBAL: // %bb.0:622; CHECK-GLOBAL-NEXT: cmp x0, #1623; CHECK-GLOBAL-NEXT: csinc x0, x0, xzr, hi624; CHECK-GLOBAL-NEXT: ret625;626; CHECK-GLOBAL-CSSC-LABEL: umaxi64_1:627; CHECK-GLOBAL-CSSC: // %bb.0:628; CHECK-GLOBAL-CSSC-NEXT: umax x0, x0, #1629; CHECK-GLOBAL-CSSC-NEXT: ret630 %c = call i64 @llvm.umax.i64(i64 %a, i64 1)631 ret i64 %c632}633 634declare <8 x i8> @llvm.umax.v8i8(<8 x i8> %a, <8 x i8> %b) readnone635 636define <8 x i8> @umax8i8(<8 x i8> %a, <8 x i8> %b) {637; CHECK-LABEL: umax8i8:638; CHECK: // %bb.0:639; CHECK-NEXT: umax v0.8b, v0.8b, v1.8b640; CHECK-NEXT: ret641 %c = call <8 x i8> @llvm.umax.v8i8(<8 x i8> %a, <8 x i8> %b)642 ret <8 x i8> %c643}644 645declare <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b) readnone646 647define <16 x i8> @umax16i8(<16 x i8> %a, <16 x i8> %b) {648; CHECK-LABEL: umax16i8:649; CHECK: // %bb.0:650; CHECK-NEXT: umax v0.16b, v0.16b, v1.16b651; CHECK-NEXT: ret652 %c = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b)653 ret <16 x i8> %c654}655 656declare <32 x i8> @llvm.umax.v32i8(<32 x i8> %a, <32 x i8> %b) readnone657 658define void @umax32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {659; CHECK-ISEL-LABEL: umax32i8:660; CHECK-ISEL: // %bb.0:661; CHECK-ISEL-NEXT: umax v1.16b, v1.16b, v3.16b662; CHECK-ISEL-NEXT: umax v0.16b, v0.16b, v2.16b663; CHECK-ISEL-NEXT: stp q0, q1, [x0]664; CHECK-ISEL-NEXT: ret665;666; CHECK-ISEL-CSSC-LABEL: umax32i8:667; CHECK-ISEL-CSSC: // %bb.0:668; CHECK-ISEL-CSSC-NEXT: umax v1.16b, v1.16b, v3.16b669; CHECK-ISEL-CSSC-NEXT: umax v0.16b, v0.16b, v2.16b670; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]671; CHECK-ISEL-CSSC-NEXT: ret672;673; CHECK-GLOBAL-LABEL: umax32i8:674; CHECK-GLOBAL: // %bb.0:675; CHECK-GLOBAL-NEXT: umax v0.16b, v0.16b, v2.16b676; CHECK-GLOBAL-NEXT: umax v1.16b, v1.16b, v3.16b677; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]678; CHECK-GLOBAL-NEXT: ret679;680; CHECK-GLOBAL-CSSC-LABEL: umax32i8:681; CHECK-GLOBAL-CSSC: // %bb.0:682; CHECK-GLOBAL-CSSC-NEXT: umax v0.16b, v0.16b, v2.16b683; CHECK-GLOBAL-CSSC-NEXT: umax v1.16b, v1.16b, v3.16b684; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]685; CHECK-GLOBAL-CSSC-NEXT: ret686 %c = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %a, <32 x i8> %b)687 store <32 x i8> %c, ptr %p688 ret void689}690 691declare <4 x i16> @llvm.umax.v4i16(<4 x i16> %a, <4 x i16> %b) readnone692 693define <4 x i16> @umax4i16(<4 x i16> %a, <4 x i16> %b) {694; CHECK-LABEL: umax4i16:695; CHECK: // %bb.0:696; CHECK-NEXT: umax v0.4h, v0.4h, v1.4h697; CHECK-NEXT: ret698 %c = call <4 x i16> @llvm.umax.v4i16(<4 x i16> %a, <4 x i16> %b)699 ret <4 x i16> %c700}701 702declare <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b) readnone703 704define <8 x i16> @umax8i16(<8 x i16> %a, <8 x i16> %b) {705; CHECK-LABEL: umax8i16:706; CHECK: // %bb.0:707; CHECK-NEXT: umax v0.8h, v0.8h, v1.8h708; CHECK-NEXT: ret709 %c = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b)710 ret <8 x i16> %c711}712 713declare <16 x i16> @llvm.umax.v16i16(<16 x i16> %a, <16 x i16> %b) readnone714 715define void @umax16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {716; CHECK-ISEL-LABEL: umax16i16:717; CHECK-ISEL: // %bb.0:718; CHECK-ISEL-NEXT: umax v1.8h, v1.8h, v3.8h719; CHECK-ISEL-NEXT: umax v0.8h, v0.8h, v2.8h720; CHECK-ISEL-NEXT: stp q0, q1, [x0]721; CHECK-ISEL-NEXT: ret722;723; CHECK-ISEL-CSSC-LABEL: umax16i16:724; CHECK-ISEL-CSSC: // %bb.0:725; CHECK-ISEL-CSSC-NEXT: umax v1.8h, v1.8h, v3.8h726; CHECK-ISEL-CSSC-NEXT: umax v0.8h, v0.8h, v2.8h727; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]728; CHECK-ISEL-CSSC-NEXT: ret729;730; CHECK-GLOBAL-LABEL: umax16i16:731; CHECK-GLOBAL: // %bb.0:732; CHECK-GLOBAL-NEXT: umax v0.8h, v0.8h, v2.8h733; CHECK-GLOBAL-NEXT: umax v1.8h, v1.8h, v3.8h734; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]735; CHECK-GLOBAL-NEXT: ret736;737; CHECK-GLOBAL-CSSC-LABEL: umax16i16:738; CHECK-GLOBAL-CSSC: // %bb.0:739; CHECK-GLOBAL-CSSC-NEXT: umax v0.8h, v0.8h, v2.8h740; CHECK-GLOBAL-CSSC-NEXT: umax v1.8h, v1.8h, v3.8h741; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]742; CHECK-GLOBAL-CSSC-NEXT: ret743 %c = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %a, <16 x i16> %b)744 store <16 x i16> %c, ptr %p745 ret void746}747 748declare <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b) readnone749 750define <2 x i32> @umax2i32(<2 x i32> %a, <2 x i32> %b) {751; CHECK-LABEL: umax2i32:752; CHECK: // %bb.0:753; CHECK-NEXT: umax v0.2s, v0.2s, v1.2s754; CHECK-NEXT: ret755 %c = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b)756 ret <2 x i32> %c757}758 759declare <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b) readnone760 761define <4 x i32> @umax4i32(<4 x i32> %a, <4 x i32> %b) {762; CHECK-LABEL: umax4i32:763; CHECK: // %bb.0:764; CHECK-NEXT: umax v0.4s, v0.4s, v1.4s765; CHECK-NEXT: ret766 %c = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b)767 ret <4 x i32> %c768}769 770declare <8 x i32> @llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b) readnone771 772define void @umax8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {773; CHECK-ISEL-LABEL: umax8i32:774; CHECK-ISEL: // %bb.0:775; CHECK-ISEL-NEXT: umax v1.4s, v1.4s, v3.4s776; CHECK-ISEL-NEXT: umax v0.4s, v0.4s, v2.4s777; CHECK-ISEL-NEXT: stp q0, q1, [x0]778; CHECK-ISEL-NEXT: ret779;780; CHECK-ISEL-CSSC-LABEL: umax8i32:781; CHECK-ISEL-CSSC: // %bb.0:782; CHECK-ISEL-CSSC-NEXT: umax v1.4s, v1.4s, v3.4s783; CHECK-ISEL-CSSC-NEXT: umax v0.4s, v0.4s, v2.4s784; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]785; CHECK-ISEL-CSSC-NEXT: ret786;787; CHECK-GLOBAL-LABEL: umax8i32:788; CHECK-GLOBAL: // %bb.0:789; CHECK-GLOBAL-NEXT: umax v0.4s, v0.4s, v2.4s790; CHECK-GLOBAL-NEXT: umax v1.4s, v1.4s, v3.4s791; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]792; CHECK-GLOBAL-NEXT: ret793;794; CHECK-GLOBAL-CSSC-LABEL: umax8i32:795; CHECK-GLOBAL-CSSC: // %bb.0:796; CHECK-GLOBAL-CSSC-NEXT: umax v0.4s, v0.4s, v2.4s797; CHECK-GLOBAL-CSSC-NEXT: umax v1.4s, v1.4s, v3.4s798; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]799; CHECK-GLOBAL-CSSC-NEXT: ret800 %c = call <8 x i32>@llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b)801 store <8 x i32> %c, ptr %p802 ret void803}804 805declare <1 x i64> @llvm.umax.v1i64(<1 x i64> %a, <1 x i64> %b) readnone806 807define <1 x i64> @umax1i64(<1 x i64> %a, <1 x i64> %b) {808; CHECK-ISEL-LABEL: umax1i64:809; CHECK-ISEL: // %bb.0:810; CHECK-ISEL-NEXT: cmhi d2, d0, d1811; CHECK-ISEL-NEXT: bif v0.8b, v1.8b, v2.8b812; CHECK-ISEL-NEXT: ret813;814; CHECK-ISEL-CSSC-LABEL: umax1i64:815; CHECK-ISEL-CSSC: // %bb.0:816; CHECK-ISEL-CSSC-NEXT: cmhi d2, d0, d1817; CHECK-ISEL-CSSC-NEXT: bif v0.8b, v1.8b, v2.8b818; CHECK-ISEL-CSSC-NEXT: ret819;820; CHECK-GLOBAL-LABEL: umax1i64:821; CHECK-GLOBAL: // %bb.0:822; CHECK-GLOBAL-NEXT: fmov x8, d0823; CHECK-GLOBAL-NEXT: fmov x9, d1824; CHECK-GLOBAL-NEXT: cmp x8, x9825; CHECK-GLOBAL-NEXT: fcsel d0, d0, d1, hi826; CHECK-GLOBAL-NEXT: ret827;828; CHECK-GLOBAL-CSSC-LABEL: umax1i64:829; CHECK-GLOBAL-CSSC: // %bb.0:830; CHECK-GLOBAL-CSSC-NEXT: fmov x8, d0831; CHECK-GLOBAL-CSSC-NEXT: fmov x9, d1832; CHECK-GLOBAL-CSSC-NEXT: umax x8, x8, x9833; CHECK-GLOBAL-CSSC-NEXT: fmov d0, x8834; CHECK-GLOBAL-CSSC-NEXT: ret835 %c = call <1 x i64> @llvm.umax.v1i64(<1 x i64> %a, <1 x i64> %b)836 ret <1 x i64> %c837}838 839declare <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone840 841define <2 x i64> @umax2i64(<2 x i64> %a, <2 x i64> %b) {842; CHECK-LABEL: umax2i64:843; CHECK: // %bb.0:844; CHECK-NEXT: cmhi v2.2d, v0.2d, v1.2d845; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b846; CHECK-NEXT: ret847 %c = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b)848 ret <2 x i64> %c849}850 851declare <4 x i64> @llvm.umax.v4i64(<4 x i64> %a, <4 x i64> %b) readnone852 853define void @umax4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {854; CHECK-ISEL-LABEL: umax4i64:855; CHECK-ISEL: // %bb.0:856; CHECK-ISEL-NEXT: cmhi v4.2d, v1.2d, v3.2d857; CHECK-ISEL-NEXT: cmhi v5.2d, v0.2d, v2.2d858; CHECK-ISEL-NEXT: bif v1.16b, v3.16b, v4.16b859; CHECK-ISEL-NEXT: bif v0.16b, v2.16b, v5.16b860; CHECK-ISEL-NEXT: stp q0, q1, [x0]861; CHECK-ISEL-NEXT: ret862;863; CHECK-ISEL-CSSC-LABEL: umax4i64:864; CHECK-ISEL-CSSC: // %bb.0:865; CHECK-ISEL-CSSC-NEXT: cmhi v4.2d, v1.2d, v3.2d866; CHECK-ISEL-CSSC-NEXT: cmhi v5.2d, v0.2d, v2.2d867; CHECK-ISEL-CSSC-NEXT: bif v1.16b, v3.16b, v4.16b868; CHECK-ISEL-CSSC-NEXT: bif v0.16b, v2.16b, v5.16b869; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]870; CHECK-ISEL-CSSC-NEXT: ret871;872; CHECK-GLOBAL-LABEL: umax4i64:873; CHECK-GLOBAL: // %bb.0:874; CHECK-GLOBAL-NEXT: cmhi v4.2d, v0.2d, v2.2d875; CHECK-GLOBAL-NEXT: cmhi v5.2d, v1.2d, v3.2d876; CHECK-GLOBAL-NEXT: bif v0.16b, v2.16b, v4.16b877; CHECK-GLOBAL-NEXT: bif v1.16b, v3.16b, v5.16b878; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]879; CHECK-GLOBAL-NEXT: ret880;881; CHECK-GLOBAL-CSSC-LABEL: umax4i64:882; CHECK-GLOBAL-CSSC: // %bb.0:883; CHECK-GLOBAL-CSSC-NEXT: cmhi v4.2d, v0.2d, v2.2d884; CHECK-GLOBAL-CSSC-NEXT: cmhi v5.2d, v1.2d, v3.2d885; CHECK-GLOBAL-CSSC-NEXT: bif v0.16b, v2.16b, v4.16b886; CHECK-GLOBAL-CSSC-NEXT: bif v1.16b, v3.16b, v5.16b887; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]888; CHECK-GLOBAL-CSSC-NEXT: ret889 %c = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %a, <4 x i64> %b)890 store <4 x i64> %c, ptr %p891 ret void892}893 894declare i8 @llvm.smin.i8(i8 %a, i8 %b) readnone895 896define i8 @smini8(i8 %a, i8 %b) {897; CHECK-ISEL-LABEL: smini8:898; CHECK-ISEL: // %bb.0:899; CHECK-ISEL-NEXT: sxtb w8, w1900; CHECK-ISEL-NEXT: sxtb w9, w0901; CHECK-ISEL-NEXT: cmp w9, w8902; CHECK-ISEL-NEXT: csel w0, w9, w8, lt903; CHECK-ISEL-NEXT: ret904;905; CHECK-ISEL-CSSC-LABEL: smini8:906; CHECK-ISEL-CSSC: // %bb.0:907; CHECK-ISEL-CSSC-NEXT: sxtb w8, w1908; CHECK-ISEL-CSSC-NEXT: sxtb w9, w0909; CHECK-ISEL-CSSC-NEXT: smin w0, w9, w8910; CHECK-ISEL-CSSC-NEXT: ret911;912; CHECK-GLOBAL-LABEL: smini8:913; CHECK-GLOBAL: // %bb.0:914; CHECK-GLOBAL-NEXT: sxtb w8, w0915; CHECK-GLOBAL-NEXT: cmp w8, w1, sxtb916; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lt917; CHECK-GLOBAL-NEXT: ret918;919; CHECK-GLOBAL-CSSC-LABEL: smini8:920; CHECK-GLOBAL-CSSC: // %bb.0:921; CHECK-GLOBAL-CSSC-NEXT: sxtb w8, w0922; CHECK-GLOBAL-CSSC-NEXT: sxtb w9, w1923; CHECK-GLOBAL-CSSC-NEXT: smin w0, w8, w9924; CHECK-GLOBAL-CSSC-NEXT: ret925 %c = call i8 @llvm.smin.i8(i8 %a, i8 %b)926 ret i8 %c927}928 929declare i16 @llvm.smin.i16(i16 %a, i16 %b) readnone930 931define i16 @smini16(i16 %a, i16 %b) {932; CHECK-ISEL-LABEL: smini16:933; CHECK-ISEL: // %bb.0:934; CHECK-ISEL-NEXT: sxth w8, w1935; CHECK-ISEL-NEXT: sxth w9, w0936; CHECK-ISEL-NEXT: cmp w9, w8937; CHECK-ISEL-NEXT: csel w0, w9, w8, lt938; CHECK-ISEL-NEXT: ret939;940; CHECK-ISEL-CSSC-LABEL: smini16:941; CHECK-ISEL-CSSC: // %bb.0:942; CHECK-ISEL-CSSC-NEXT: sxth w8, w1943; CHECK-ISEL-CSSC-NEXT: sxth w9, w0944; CHECK-ISEL-CSSC-NEXT: smin w0, w9, w8945; CHECK-ISEL-CSSC-NEXT: ret946;947; CHECK-GLOBAL-LABEL: smini16:948; CHECK-GLOBAL: // %bb.0:949; CHECK-GLOBAL-NEXT: sxth w8, w0950; CHECK-GLOBAL-NEXT: cmp w8, w1, sxth951; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lt952; CHECK-GLOBAL-NEXT: ret953;954; CHECK-GLOBAL-CSSC-LABEL: smini16:955; CHECK-GLOBAL-CSSC: // %bb.0:956; CHECK-GLOBAL-CSSC-NEXT: sxth w8, w0957; CHECK-GLOBAL-CSSC-NEXT: sxth w9, w1958; CHECK-GLOBAL-CSSC-NEXT: smin w0, w8, w9959; CHECK-GLOBAL-CSSC-NEXT: ret960 %c = call i16 @llvm.smin.i16(i16 %a, i16 %b)961 ret i16 %c962}963 964declare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone965 966define i32 @smini32(i32 %a, i32 %b) {967; CHECK-ISEL-LABEL: smini32:968; CHECK-ISEL: // %bb.0:969; CHECK-ISEL-NEXT: cmp w0, w1970; CHECK-ISEL-NEXT: csel w0, w0, w1, lt971; CHECK-ISEL-NEXT: ret972;973; CHECK-ISEL-CSSC-LABEL: smini32:974; CHECK-ISEL-CSSC: // %bb.0:975; CHECK-ISEL-CSSC-NEXT: smin w0, w0, w1976; CHECK-ISEL-CSSC-NEXT: ret977;978; CHECK-GLOBAL-LABEL: smini32:979; CHECK-GLOBAL: // %bb.0:980; CHECK-GLOBAL-NEXT: cmp w0, w1981; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lt982; CHECK-GLOBAL-NEXT: ret983;984; CHECK-GLOBAL-CSSC-LABEL: smini32:985; CHECK-GLOBAL-CSSC: // %bb.0:986; CHECK-GLOBAL-CSSC-NEXT: smin w0, w0, w1987; CHECK-GLOBAL-CSSC-NEXT: ret988 %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)989 ret i32 %c990}991 992declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone993 994define i64 @smini64(i64 %a, i64 %b) {995; CHECK-ISEL-LABEL: smini64:996; CHECK-ISEL: // %bb.0:997; CHECK-ISEL-NEXT: cmp x0, x1998; CHECK-ISEL-NEXT: csel x0, x0, x1, lt999; CHECK-ISEL-NEXT: ret1000;1001; CHECK-ISEL-CSSC-LABEL: smini64:1002; CHECK-ISEL-CSSC: // %bb.0:1003; CHECK-ISEL-CSSC-NEXT: smin x0, x0, x11004; CHECK-ISEL-CSSC-NEXT: ret1005;1006; CHECK-GLOBAL-LABEL: smini64:1007; CHECK-GLOBAL: // %bb.0:1008; CHECK-GLOBAL-NEXT: cmp x0, x11009; CHECK-GLOBAL-NEXT: csel x0, x0, x1, lt1010; CHECK-GLOBAL-NEXT: ret1011;1012; CHECK-GLOBAL-CSSC-LABEL: smini64:1013; CHECK-GLOBAL-CSSC: // %bb.0:1014; CHECK-GLOBAL-CSSC-NEXT: smin x0, x0, x11015; CHECK-GLOBAL-CSSC-NEXT: ret1016 %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)1017 ret i64 %c1018}1019 1020declare <8 x i8> @llvm.smin.v8i8(<8 x i8> %a, <8 x i8> %b) readnone1021 1022define <8 x i8> @smin8i8(<8 x i8> %a, <8 x i8> %b) {1023; CHECK-LABEL: smin8i8:1024; CHECK: // %bb.0:1025; CHECK-NEXT: smin v0.8b, v0.8b, v1.8b1026; CHECK-NEXT: ret1027 %c = call <8 x i8> @llvm.smin.v8i8(<8 x i8> %a, <8 x i8> %b)1028 ret <8 x i8> %c1029}1030 1031declare <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b) readnone1032 1033define <16 x i8> @smin16i8(<16 x i8> %a, <16 x i8> %b) {1034; CHECK-LABEL: smin16i8:1035; CHECK: // %bb.0:1036; CHECK-NEXT: smin v0.16b, v0.16b, v1.16b1037; CHECK-NEXT: ret1038 %c = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b)1039 ret <16 x i8> %c1040}1041 1042declare <32 x i8> @llvm.smin.v32i8(<32 x i8> %a, <32 x i8> %b) readnone1043 1044define void @smin32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {1045; CHECK-ISEL-LABEL: smin32i8:1046; CHECK-ISEL: // %bb.0:1047; CHECK-ISEL-NEXT: smin v1.16b, v1.16b, v3.16b1048; CHECK-ISEL-NEXT: smin v0.16b, v0.16b, v2.16b1049; CHECK-ISEL-NEXT: stp q0, q1, [x0]1050; CHECK-ISEL-NEXT: ret1051;1052; CHECK-ISEL-CSSC-LABEL: smin32i8:1053; CHECK-ISEL-CSSC: // %bb.0:1054; CHECK-ISEL-CSSC-NEXT: smin v1.16b, v1.16b, v3.16b1055; CHECK-ISEL-CSSC-NEXT: smin v0.16b, v0.16b, v2.16b1056; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1057; CHECK-ISEL-CSSC-NEXT: ret1058;1059; CHECK-GLOBAL-LABEL: smin32i8:1060; CHECK-GLOBAL: // %bb.0:1061; CHECK-GLOBAL-NEXT: smin v0.16b, v0.16b, v2.16b1062; CHECK-GLOBAL-NEXT: smin v1.16b, v1.16b, v3.16b1063; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1064; CHECK-GLOBAL-NEXT: ret1065;1066; CHECK-GLOBAL-CSSC-LABEL: smin32i8:1067; CHECK-GLOBAL-CSSC: // %bb.0:1068; CHECK-GLOBAL-CSSC-NEXT: smin v0.16b, v0.16b, v2.16b1069; CHECK-GLOBAL-CSSC-NEXT: smin v1.16b, v1.16b, v3.16b1070; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1071; CHECK-GLOBAL-CSSC-NEXT: ret1072 %c = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %a, <32 x i8> %b)1073 store <32 x i8> %c, ptr %p1074 ret void1075}1076 1077declare <4 x i16> @llvm.smin.v4i16(<4 x i16> %a, <4 x i16> %b) readnone1078 1079define <4 x i16> @smin4i16(<4 x i16> %a, <4 x i16> %b) {1080; CHECK-LABEL: smin4i16:1081; CHECK: // %bb.0:1082; CHECK-NEXT: smin v0.4h, v0.4h, v1.4h1083; CHECK-NEXT: ret1084 %c = call <4 x i16> @llvm.smin.v4i16(<4 x i16> %a, <4 x i16> %b)1085 ret <4 x i16> %c1086}1087 1088declare <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b) readnone1089 1090define <8 x i16> @smin8i16(<8 x i16> %a, <8 x i16> %b) {1091; CHECK-LABEL: smin8i16:1092; CHECK: // %bb.0:1093; CHECK-NEXT: smin v0.8h, v0.8h, v1.8h1094; CHECK-NEXT: ret1095 %c = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b)1096 ret <8 x i16> %c1097}1098 1099declare <16 x i16> @llvm.smin.v16i16(<16 x i16> %a, <16 x i16> %b) readnone1100 1101define void @smin16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {1102; CHECK-ISEL-LABEL: smin16i16:1103; CHECK-ISEL: // %bb.0:1104; CHECK-ISEL-NEXT: smin v1.8h, v1.8h, v3.8h1105; CHECK-ISEL-NEXT: smin v0.8h, v0.8h, v2.8h1106; CHECK-ISEL-NEXT: stp q0, q1, [x0]1107; CHECK-ISEL-NEXT: ret1108;1109; CHECK-ISEL-CSSC-LABEL: smin16i16:1110; CHECK-ISEL-CSSC: // %bb.0:1111; CHECK-ISEL-CSSC-NEXT: smin v1.8h, v1.8h, v3.8h1112; CHECK-ISEL-CSSC-NEXT: smin v0.8h, v0.8h, v2.8h1113; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1114; CHECK-ISEL-CSSC-NEXT: ret1115;1116; CHECK-GLOBAL-LABEL: smin16i16:1117; CHECK-GLOBAL: // %bb.0:1118; CHECK-GLOBAL-NEXT: smin v0.8h, v0.8h, v2.8h1119; CHECK-GLOBAL-NEXT: smin v1.8h, v1.8h, v3.8h1120; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1121; CHECK-GLOBAL-NEXT: ret1122;1123; CHECK-GLOBAL-CSSC-LABEL: smin16i16:1124; CHECK-GLOBAL-CSSC: // %bb.0:1125; CHECK-GLOBAL-CSSC-NEXT: smin v0.8h, v0.8h, v2.8h1126; CHECK-GLOBAL-CSSC-NEXT: smin v1.8h, v1.8h, v3.8h1127; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1128; CHECK-GLOBAL-CSSC-NEXT: ret1129 %c = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %a, <16 x i16> %b)1130 store <16 x i16> %c, ptr %p1131 ret void1132}1133 1134declare <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b) readnone1135 1136define <2 x i32> @smin2i32(<2 x i32> %a, <2 x i32> %b) {1137; CHECK-LABEL: smin2i32:1138; CHECK: // %bb.0:1139; CHECK-NEXT: smin v0.2s, v0.2s, v1.2s1140; CHECK-NEXT: ret1141 %c = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b)1142 ret <2 x i32> %c1143}1144 1145declare <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b) readnone1146 1147define <4 x i32> @smin4i32(<4 x i32> %a, <4 x i32> %b) {1148; CHECK-LABEL: smin4i32:1149; CHECK: // %bb.0:1150; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s1151; CHECK-NEXT: ret1152 %c = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)1153 ret <4 x i32> %c1154}1155 1156declare <8 x i32> @llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b) readnone1157 1158define void @smin8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {1159; CHECK-ISEL-LABEL: smin8i32:1160; CHECK-ISEL: // %bb.0:1161; CHECK-ISEL-NEXT: smin v1.4s, v1.4s, v3.4s1162; CHECK-ISEL-NEXT: smin v0.4s, v0.4s, v2.4s1163; CHECK-ISEL-NEXT: stp q0, q1, [x0]1164; CHECK-ISEL-NEXT: ret1165;1166; CHECK-ISEL-CSSC-LABEL: smin8i32:1167; CHECK-ISEL-CSSC: // %bb.0:1168; CHECK-ISEL-CSSC-NEXT: smin v1.4s, v1.4s, v3.4s1169; CHECK-ISEL-CSSC-NEXT: smin v0.4s, v0.4s, v2.4s1170; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1171; CHECK-ISEL-CSSC-NEXT: ret1172;1173; CHECK-GLOBAL-LABEL: smin8i32:1174; CHECK-GLOBAL: // %bb.0:1175; CHECK-GLOBAL-NEXT: smin v0.4s, v0.4s, v2.4s1176; CHECK-GLOBAL-NEXT: smin v1.4s, v1.4s, v3.4s1177; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1178; CHECK-GLOBAL-NEXT: ret1179;1180; CHECK-GLOBAL-CSSC-LABEL: smin8i32:1181; CHECK-GLOBAL-CSSC: // %bb.0:1182; CHECK-GLOBAL-CSSC-NEXT: smin v0.4s, v0.4s, v2.4s1183; CHECK-GLOBAL-CSSC-NEXT: smin v1.4s, v1.4s, v3.4s1184; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1185; CHECK-GLOBAL-CSSC-NEXT: ret1186 %c = call <8 x i32>@llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b)1187 store <8 x i32> %c, ptr %p1188 ret void1189}1190 1191declare <1 x i64> @llvm.smin.v1i64(<1 x i64> %a, <1 x i64> %b) readnone1192 1193define <1 x i64> @smin1i64(<1 x i64> %a, <1 x i64> %b) {1194; CHECK-ISEL-LABEL: smin1i64:1195; CHECK-ISEL: // %bb.0:1196; CHECK-ISEL-NEXT: cmgt d2, d1, d01197; CHECK-ISEL-NEXT: bif v0.8b, v1.8b, v2.8b1198; CHECK-ISEL-NEXT: ret1199;1200; CHECK-ISEL-CSSC-LABEL: smin1i64:1201; CHECK-ISEL-CSSC: // %bb.0:1202; CHECK-ISEL-CSSC-NEXT: cmgt d2, d1, d01203; CHECK-ISEL-CSSC-NEXT: bif v0.8b, v1.8b, v2.8b1204; CHECK-ISEL-CSSC-NEXT: ret1205;1206; CHECK-GLOBAL-LABEL: smin1i64:1207; CHECK-GLOBAL: // %bb.0:1208; CHECK-GLOBAL-NEXT: fmov x8, d01209; CHECK-GLOBAL-NEXT: fmov x9, d11210; CHECK-GLOBAL-NEXT: cmp x8, x91211; CHECK-GLOBAL-NEXT: fcsel d0, d0, d1, lt1212; CHECK-GLOBAL-NEXT: ret1213;1214; CHECK-GLOBAL-CSSC-LABEL: smin1i64:1215; CHECK-GLOBAL-CSSC: // %bb.0:1216; CHECK-GLOBAL-CSSC-NEXT: fmov x8, d01217; CHECK-GLOBAL-CSSC-NEXT: fmov x9, d11218; CHECK-GLOBAL-CSSC-NEXT: smin x8, x8, x91219; CHECK-GLOBAL-CSSC-NEXT: fmov d0, x81220; CHECK-GLOBAL-CSSC-NEXT: ret1221 %c = call <1 x i64> @llvm.smin.v1i64(<1 x i64> %a, <1 x i64> %b)1222 ret <1 x i64> %c1223}1224 1225declare <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone1226 1227define <2 x i64> @smin2i64(<2 x i64> %a, <2 x i64> %b) {1228; CHECK-LABEL: smin2i64:1229; CHECK: // %bb.0:1230; CHECK-NEXT: cmgt v2.2d, v1.2d, v0.2d1231; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b1232; CHECK-NEXT: ret1233 %c = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b)1234 ret <2 x i64> %c1235}1236 1237declare <4 x i64> @llvm.smin.v4i64(<4 x i64> %a, <4 x i64> %b) readnone1238 1239define void @smin4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {1240; CHECK-ISEL-LABEL: smin4i64:1241; CHECK-ISEL: // %bb.0:1242; CHECK-ISEL-NEXT: cmgt v4.2d, v3.2d, v1.2d1243; CHECK-ISEL-NEXT: cmgt v5.2d, v2.2d, v0.2d1244; CHECK-ISEL-NEXT: bif v1.16b, v3.16b, v4.16b1245; CHECK-ISEL-NEXT: bif v0.16b, v2.16b, v5.16b1246; CHECK-ISEL-NEXT: stp q0, q1, [x0]1247; CHECK-ISEL-NEXT: ret1248;1249; CHECK-ISEL-CSSC-LABEL: smin4i64:1250; CHECK-ISEL-CSSC: // %bb.0:1251; CHECK-ISEL-CSSC-NEXT: cmgt v4.2d, v3.2d, v1.2d1252; CHECK-ISEL-CSSC-NEXT: cmgt v5.2d, v2.2d, v0.2d1253; CHECK-ISEL-CSSC-NEXT: bif v1.16b, v3.16b, v4.16b1254; CHECK-ISEL-CSSC-NEXT: bif v0.16b, v2.16b, v5.16b1255; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1256; CHECK-ISEL-CSSC-NEXT: ret1257;1258; CHECK-GLOBAL-LABEL: smin4i64:1259; CHECK-GLOBAL: // %bb.0:1260; CHECK-GLOBAL-NEXT: cmgt v4.2d, v2.2d, v0.2d1261; CHECK-GLOBAL-NEXT: cmgt v5.2d, v3.2d, v1.2d1262; CHECK-GLOBAL-NEXT: bif v0.16b, v2.16b, v4.16b1263; CHECK-GLOBAL-NEXT: bif v1.16b, v3.16b, v5.16b1264; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1265; CHECK-GLOBAL-NEXT: ret1266;1267; CHECK-GLOBAL-CSSC-LABEL: smin4i64:1268; CHECK-GLOBAL-CSSC: // %bb.0:1269; CHECK-GLOBAL-CSSC-NEXT: cmgt v4.2d, v2.2d, v0.2d1270; CHECK-GLOBAL-CSSC-NEXT: cmgt v5.2d, v3.2d, v1.2d1271; CHECK-GLOBAL-CSSC-NEXT: bif v0.16b, v2.16b, v4.16b1272; CHECK-GLOBAL-CSSC-NEXT: bif v1.16b, v3.16b, v5.16b1273; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1274; CHECK-GLOBAL-CSSC-NEXT: ret1275 %c = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %a, <4 x i64> %b)1276 store <4 x i64> %c, ptr %p1277 ret void1278}1279 1280declare i8 @llvm.umin.i8(i8 %a, i8 %b) readnone1281 1282define i8 @umini8(i8 %a, i8 %b) {1283; CHECK-ISEL-LABEL: umini8:1284; CHECK-ISEL: // %bb.0:1285; CHECK-ISEL-NEXT: and w8, w1, #0xff1286; CHECK-ISEL-NEXT: and w9, w0, #0xff1287; CHECK-ISEL-NEXT: cmp w9, w81288; CHECK-ISEL-NEXT: csel w0, w9, w8, lo1289; CHECK-ISEL-NEXT: ret1290;1291; CHECK-ISEL-CSSC-LABEL: umini8:1292; CHECK-ISEL-CSSC: // %bb.0:1293; CHECK-ISEL-CSSC-NEXT: and w8, w1, #0xff1294; CHECK-ISEL-CSSC-NEXT: and w9, w0, #0xff1295; CHECK-ISEL-CSSC-NEXT: umin w0, w9, w81296; CHECK-ISEL-CSSC-NEXT: ret1297;1298; CHECK-GLOBAL-LABEL: umini8:1299; CHECK-GLOBAL: // %bb.0:1300; CHECK-GLOBAL-NEXT: and w8, w0, #0xff1301; CHECK-GLOBAL-NEXT: cmp w8, w1, uxtb1302; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lo1303; CHECK-GLOBAL-NEXT: ret1304;1305; CHECK-GLOBAL-CSSC-LABEL: umini8:1306; CHECK-GLOBAL-CSSC: // %bb.0:1307; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xff1308; CHECK-GLOBAL-CSSC-NEXT: and w9, w1, #0xff1309; CHECK-GLOBAL-CSSC-NEXT: umin w0, w8, w91310; CHECK-GLOBAL-CSSC-NEXT: ret1311 %c = call i8 @llvm.umin.i8(i8 %a, i8 %b)1312 ret i8 %c1313}1314 1315declare i16 @llvm.umin.i16(i16 %a, i16 %b) readnone1316 1317define i16 @umini16(i16 %a, i16 %b) {1318; CHECK-ISEL-LABEL: umini16:1319; CHECK-ISEL: // %bb.0:1320; CHECK-ISEL-NEXT: and w8, w1, #0xffff1321; CHECK-ISEL-NEXT: and w9, w0, #0xffff1322; CHECK-ISEL-NEXT: cmp w9, w81323; CHECK-ISEL-NEXT: csel w0, w9, w8, lo1324; CHECK-ISEL-NEXT: ret1325;1326; CHECK-ISEL-CSSC-LABEL: umini16:1327; CHECK-ISEL-CSSC: // %bb.0:1328; CHECK-ISEL-CSSC-NEXT: and w8, w1, #0xffff1329; CHECK-ISEL-CSSC-NEXT: and w9, w0, #0xffff1330; CHECK-ISEL-CSSC-NEXT: umin w0, w9, w81331; CHECK-ISEL-CSSC-NEXT: ret1332;1333; CHECK-GLOBAL-LABEL: umini16:1334; CHECK-GLOBAL: // %bb.0:1335; CHECK-GLOBAL-NEXT: and w8, w0, #0xffff1336; CHECK-GLOBAL-NEXT: cmp w8, w1, uxth1337; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lo1338; CHECK-GLOBAL-NEXT: ret1339;1340; CHECK-GLOBAL-CSSC-LABEL: umini16:1341; CHECK-GLOBAL-CSSC: // %bb.0:1342; CHECK-GLOBAL-CSSC-NEXT: and w8, w0, #0xffff1343; CHECK-GLOBAL-CSSC-NEXT: and w9, w1, #0xffff1344; CHECK-GLOBAL-CSSC-NEXT: umin w0, w8, w91345; CHECK-GLOBAL-CSSC-NEXT: ret1346 %c = call i16 @llvm.umin.i16(i16 %a, i16 %b)1347 ret i16 %c1348}1349 1350declare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone1351 1352define i32 @umini32(i32 %a, i32 %b) {1353; CHECK-ISEL-LABEL: umini32:1354; CHECK-ISEL: // %bb.0:1355; CHECK-ISEL-NEXT: cmp w0, w11356; CHECK-ISEL-NEXT: csel w0, w0, w1, lo1357; CHECK-ISEL-NEXT: ret1358;1359; CHECK-ISEL-CSSC-LABEL: umini32:1360; CHECK-ISEL-CSSC: // %bb.0:1361; CHECK-ISEL-CSSC-NEXT: umin w0, w0, w11362; CHECK-ISEL-CSSC-NEXT: ret1363;1364; CHECK-GLOBAL-LABEL: umini32:1365; CHECK-GLOBAL: // %bb.0:1366; CHECK-GLOBAL-NEXT: cmp w0, w11367; CHECK-GLOBAL-NEXT: csel w0, w0, w1, lo1368; CHECK-GLOBAL-NEXT: ret1369;1370; CHECK-GLOBAL-CSSC-LABEL: umini32:1371; CHECK-GLOBAL-CSSC: // %bb.0:1372; CHECK-GLOBAL-CSSC-NEXT: umin w0, w0, w11373; CHECK-GLOBAL-CSSC-NEXT: ret1374 %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)1375 ret i32 %c1376}1377 1378declare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone1379 1380define i64 @umini64(i64 %a, i64 %b) {1381; CHECK-ISEL-LABEL: umini64:1382; CHECK-ISEL: // %bb.0:1383; CHECK-ISEL-NEXT: cmp x0, x11384; CHECK-ISEL-NEXT: csel x0, x0, x1, lo1385; CHECK-ISEL-NEXT: ret1386;1387; CHECK-ISEL-CSSC-LABEL: umini64:1388; CHECK-ISEL-CSSC: // %bb.0:1389; CHECK-ISEL-CSSC-NEXT: umin x0, x0, x11390; CHECK-ISEL-CSSC-NEXT: ret1391;1392; CHECK-GLOBAL-LABEL: umini64:1393; CHECK-GLOBAL: // %bb.0:1394; CHECK-GLOBAL-NEXT: cmp x0, x11395; CHECK-GLOBAL-NEXT: csel x0, x0, x1, lo1396; CHECK-GLOBAL-NEXT: ret1397;1398; CHECK-GLOBAL-CSSC-LABEL: umini64:1399; CHECK-GLOBAL-CSSC: // %bb.0:1400; CHECK-GLOBAL-CSSC-NEXT: umin x0, x0, x11401; CHECK-GLOBAL-CSSC-NEXT: ret1402 %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)1403 ret i64 %c1404}1405 1406declare <8 x i8> @llvm.umin.v8i8(<8 x i8> %a, <8 x i8> %b) readnone1407 1408define <8 x i8> @umin8i8(<8 x i8> %a, <8 x i8> %b) {1409; CHECK-LABEL: umin8i8:1410; CHECK: // %bb.0:1411; CHECK-NEXT: umin v0.8b, v0.8b, v1.8b1412; CHECK-NEXT: ret1413 %c = call <8 x i8> @llvm.umin.v8i8(<8 x i8> %a, <8 x i8> %b)1414 ret <8 x i8> %c1415}1416 1417declare <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b) readnone1418 1419define <16 x i8> @umin16i8(<16 x i8> %a, <16 x i8> %b) {1420; CHECK-LABEL: umin16i8:1421; CHECK: // %bb.0:1422; CHECK-NEXT: umin v0.16b, v0.16b, v1.16b1423; CHECK-NEXT: ret1424 %c = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b)1425 ret <16 x i8> %c1426}1427 1428declare <32 x i8> @llvm.umin.v32i8(<32 x i8> %a, <32 x i8> %b) readnone1429 1430define void @umin32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {1431; CHECK-ISEL-LABEL: umin32i8:1432; CHECK-ISEL: // %bb.0:1433; CHECK-ISEL-NEXT: umin v1.16b, v1.16b, v3.16b1434; CHECK-ISEL-NEXT: umin v0.16b, v0.16b, v2.16b1435; CHECK-ISEL-NEXT: stp q0, q1, [x0]1436; CHECK-ISEL-NEXT: ret1437;1438; CHECK-ISEL-CSSC-LABEL: umin32i8:1439; CHECK-ISEL-CSSC: // %bb.0:1440; CHECK-ISEL-CSSC-NEXT: umin v1.16b, v1.16b, v3.16b1441; CHECK-ISEL-CSSC-NEXT: umin v0.16b, v0.16b, v2.16b1442; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1443; CHECK-ISEL-CSSC-NEXT: ret1444;1445; CHECK-GLOBAL-LABEL: umin32i8:1446; CHECK-GLOBAL: // %bb.0:1447; CHECK-GLOBAL-NEXT: umin v0.16b, v0.16b, v2.16b1448; CHECK-GLOBAL-NEXT: umin v1.16b, v1.16b, v3.16b1449; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1450; CHECK-GLOBAL-NEXT: ret1451;1452; CHECK-GLOBAL-CSSC-LABEL: umin32i8:1453; CHECK-GLOBAL-CSSC: // %bb.0:1454; CHECK-GLOBAL-CSSC-NEXT: umin v0.16b, v0.16b, v2.16b1455; CHECK-GLOBAL-CSSC-NEXT: umin v1.16b, v1.16b, v3.16b1456; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1457; CHECK-GLOBAL-CSSC-NEXT: ret1458 %c = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %a, <32 x i8> %b)1459 store <32 x i8> %c, ptr %p1460 ret void1461}1462 1463declare <4 x i16> @llvm.umin.v4i16(<4 x i16> %a, <4 x i16> %b) readnone1464 1465define <4 x i16> @umin4i16(<4 x i16> %a, <4 x i16> %b) {1466; CHECK-LABEL: umin4i16:1467; CHECK: // %bb.0:1468; CHECK-NEXT: umin v0.4h, v0.4h, v1.4h1469; CHECK-NEXT: ret1470 %c = call <4 x i16> @llvm.umin.v4i16(<4 x i16> %a, <4 x i16> %b)1471 ret <4 x i16> %c1472}1473 1474declare <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b) readnone1475 1476define <8 x i16> @umin8i16(<8 x i16> %a, <8 x i16> %b) {1477; CHECK-LABEL: umin8i16:1478; CHECK: // %bb.0:1479; CHECK-NEXT: umin v0.8h, v0.8h, v1.8h1480; CHECK-NEXT: ret1481 %c = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b)1482 ret <8 x i16> %c1483}1484 1485declare <16 x i16> @llvm.umin.v16i16(<16 x i16> %a, <16 x i16> %b) readnone1486 1487define void @umin16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {1488; CHECK-ISEL-LABEL: umin16i16:1489; CHECK-ISEL: // %bb.0:1490; CHECK-ISEL-NEXT: umin v1.8h, v1.8h, v3.8h1491; CHECK-ISEL-NEXT: umin v0.8h, v0.8h, v2.8h1492; CHECK-ISEL-NEXT: stp q0, q1, [x0]1493; CHECK-ISEL-NEXT: ret1494;1495; CHECK-ISEL-CSSC-LABEL: umin16i16:1496; CHECK-ISEL-CSSC: // %bb.0:1497; CHECK-ISEL-CSSC-NEXT: umin v1.8h, v1.8h, v3.8h1498; CHECK-ISEL-CSSC-NEXT: umin v0.8h, v0.8h, v2.8h1499; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1500; CHECK-ISEL-CSSC-NEXT: ret1501;1502; CHECK-GLOBAL-LABEL: umin16i16:1503; CHECK-GLOBAL: // %bb.0:1504; CHECK-GLOBAL-NEXT: umin v0.8h, v0.8h, v2.8h1505; CHECK-GLOBAL-NEXT: umin v1.8h, v1.8h, v3.8h1506; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1507; CHECK-GLOBAL-NEXT: ret1508;1509; CHECK-GLOBAL-CSSC-LABEL: umin16i16:1510; CHECK-GLOBAL-CSSC: // %bb.0:1511; CHECK-GLOBAL-CSSC-NEXT: umin v0.8h, v0.8h, v2.8h1512; CHECK-GLOBAL-CSSC-NEXT: umin v1.8h, v1.8h, v3.8h1513; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1514; CHECK-GLOBAL-CSSC-NEXT: ret1515 %c = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %a, <16 x i16> %b)1516 store <16 x i16> %c, ptr %p1517 ret void1518}1519 1520declare <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b) readnone1521 1522define <2 x i32> @umin2i32(<2 x i32> %a, <2 x i32> %b) {1523; CHECK-LABEL: umin2i32:1524; CHECK: // %bb.0:1525; CHECK-NEXT: umin v0.2s, v0.2s, v1.2s1526; CHECK-NEXT: ret1527 %c = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)1528 ret <2 x i32> %c1529}1530 1531declare <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b) readnone1532 1533define <4 x i32> @umin4i32(<4 x i32> %a, <4 x i32> %b) {1534; CHECK-LABEL: umin4i32:1535; CHECK: // %bb.0:1536; CHECK-NEXT: umin v0.4s, v0.4s, v1.4s1537; CHECK-NEXT: ret1538 %c = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b)1539 ret <4 x i32> %c1540}1541 1542declare <8 x i32> @llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b) readnone1543 1544define void @umin8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {1545; CHECK-ISEL-LABEL: umin8i32:1546; CHECK-ISEL: // %bb.0:1547; CHECK-ISEL-NEXT: umin v1.4s, v1.4s, v3.4s1548; CHECK-ISEL-NEXT: umin v0.4s, v0.4s, v2.4s1549; CHECK-ISEL-NEXT: stp q0, q1, [x0]1550; CHECK-ISEL-NEXT: ret1551;1552; CHECK-ISEL-CSSC-LABEL: umin8i32:1553; CHECK-ISEL-CSSC: // %bb.0:1554; CHECK-ISEL-CSSC-NEXT: umin v1.4s, v1.4s, v3.4s1555; CHECK-ISEL-CSSC-NEXT: umin v0.4s, v0.4s, v2.4s1556; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1557; CHECK-ISEL-CSSC-NEXT: ret1558;1559; CHECK-GLOBAL-LABEL: umin8i32:1560; CHECK-GLOBAL: // %bb.0:1561; CHECK-GLOBAL-NEXT: umin v0.4s, v0.4s, v2.4s1562; CHECK-GLOBAL-NEXT: umin v1.4s, v1.4s, v3.4s1563; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1564; CHECK-GLOBAL-NEXT: ret1565;1566; CHECK-GLOBAL-CSSC-LABEL: umin8i32:1567; CHECK-GLOBAL-CSSC: // %bb.0:1568; CHECK-GLOBAL-CSSC-NEXT: umin v0.4s, v0.4s, v2.4s1569; CHECK-GLOBAL-CSSC-NEXT: umin v1.4s, v1.4s, v3.4s1570; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1571; CHECK-GLOBAL-CSSC-NEXT: ret1572 %c = call <8 x i32>@llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b)1573 store <8 x i32> %c, ptr %p1574 ret void1575}1576 1577declare <1 x i64> @llvm.umin.v1i64(<1 x i64> %a, <1 x i64> %b) readnone1578 1579define <1 x i64> @umin1i64(<1 x i64> %a, <1 x i64> %b) {1580; CHECK-ISEL-LABEL: umin1i64:1581; CHECK-ISEL: // %bb.0:1582; CHECK-ISEL-NEXT: cmhi d2, d1, d01583; CHECK-ISEL-NEXT: bif v0.8b, v1.8b, v2.8b1584; CHECK-ISEL-NEXT: ret1585;1586; CHECK-ISEL-CSSC-LABEL: umin1i64:1587; CHECK-ISEL-CSSC: // %bb.0:1588; CHECK-ISEL-CSSC-NEXT: cmhi d2, d1, d01589; CHECK-ISEL-CSSC-NEXT: bif v0.8b, v1.8b, v2.8b1590; CHECK-ISEL-CSSC-NEXT: ret1591;1592; CHECK-GLOBAL-LABEL: umin1i64:1593; CHECK-GLOBAL: // %bb.0:1594; CHECK-GLOBAL-NEXT: fmov x8, d01595; CHECK-GLOBAL-NEXT: fmov x9, d11596; CHECK-GLOBAL-NEXT: cmp x8, x91597; CHECK-GLOBAL-NEXT: fcsel d0, d0, d1, lo1598; CHECK-GLOBAL-NEXT: ret1599;1600; CHECK-GLOBAL-CSSC-LABEL: umin1i64:1601; CHECK-GLOBAL-CSSC: // %bb.0:1602; CHECK-GLOBAL-CSSC-NEXT: fmov x8, d01603; CHECK-GLOBAL-CSSC-NEXT: fmov x9, d11604; CHECK-GLOBAL-CSSC-NEXT: umin x8, x8, x91605; CHECK-GLOBAL-CSSC-NEXT: fmov d0, x81606; CHECK-GLOBAL-CSSC-NEXT: ret1607 %c = call <1 x i64> @llvm.umin.v1i64(<1 x i64> %a, <1 x i64> %b)1608 ret <1 x i64> %c1609}1610 1611declare <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone1612 1613define <2 x i64> @umin2i64(<2 x i64> %a, <2 x i64> %b) {1614; CHECK-LABEL: umin2i64:1615; CHECK: // %bb.0:1616; CHECK-NEXT: cmhi v2.2d, v1.2d, v0.2d1617; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b1618; CHECK-NEXT: ret1619 %c = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b)1620 ret <2 x i64> %c1621}1622 1623declare <4 x i64> @llvm.umin.v4i64(<4 x i64> %a, <4 x i64> %b) readnone1624 1625define void @umin4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {1626; CHECK-ISEL-LABEL: umin4i64:1627; CHECK-ISEL: // %bb.0:1628; CHECK-ISEL-NEXT: cmhi v4.2d, v3.2d, v1.2d1629; CHECK-ISEL-NEXT: cmhi v5.2d, v2.2d, v0.2d1630; CHECK-ISEL-NEXT: bif v1.16b, v3.16b, v4.16b1631; CHECK-ISEL-NEXT: bif v0.16b, v2.16b, v5.16b1632; CHECK-ISEL-NEXT: stp q0, q1, [x0]1633; CHECK-ISEL-NEXT: ret1634;1635; CHECK-ISEL-CSSC-LABEL: umin4i64:1636; CHECK-ISEL-CSSC: // %bb.0:1637; CHECK-ISEL-CSSC-NEXT: cmhi v4.2d, v3.2d, v1.2d1638; CHECK-ISEL-CSSC-NEXT: cmhi v5.2d, v2.2d, v0.2d1639; CHECK-ISEL-CSSC-NEXT: bif v1.16b, v3.16b, v4.16b1640; CHECK-ISEL-CSSC-NEXT: bif v0.16b, v2.16b, v5.16b1641; CHECK-ISEL-CSSC-NEXT: stp q0, q1, [x0]1642; CHECK-ISEL-CSSC-NEXT: ret1643;1644; CHECK-GLOBAL-LABEL: umin4i64:1645; CHECK-GLOBAL: // %bb.0:1646; CHECK-GLOBAL-NEXT: cmhi v4.2d, v2.2d, v0.2d1647; CHECK-GLOBAL-NEXT: cmhi v5.2d, v3.2d, v1.2d1648; CHECK-GLOBAL-NEXT: bif v0.16b, v2.16b, v4.16b1649; CHECK-GLOBAL-NEXT: bif v1.16b, v3.16b, v5.16b1650; CHECK-GLOBAL-NEXT: stp q0, q1, [x0]1651; CHECK-GLOBAL-NEXT: ret1652;1653; CHECK-GLOBAL-CSSC-LABEL: umin4i64:1654; CHECK-GLOBAL-CSSC: // %bb.0:1655; CHECK-GLOBAL-CSSC-NEXT: cmhi v4.2d, v2.2d, v0.2d1656; CHECK-GLOBAL-CSSC-NEXT: cmhi v5.2d, v3.2d, v1.2d1657; CHECK-GLOBAL-CSSC-NEXT: bif v0.16b, v2.16b, v4.16b1658; CHECK-GLOBAL-CSSC-NEXT: bif v1.16b, v3.16b, v5.16b1659; CHECK-GLOBAL-CSSC-NEXT: stp q0, q1, [x0]1660; CHECK-GLOBAL-CSSC-NEXT: ret1661 %c = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %a, <4 x i64> %b)1662 store <4 x i64> %c, ptr %p1663 ret void1664}1665