1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; 9; SMAX 10; 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, vl8 16; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 17; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 18; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b 19; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 20; CHECK-NEXT: ret 21; 22; NONEON-NOSVE-LABEL: smax_v8i8: 23; NONEON-NOSVE: // %bb.0: 24; NONEON-NOSVE-NEXT: sub sp, sp, #32 25; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 26; 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, w8 30; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 31; 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, w8 35; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 36; 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, w8 40; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 41; 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, w8 45; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 46; 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, w8 50; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 51; 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, w8 55; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 56; 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, w8 60; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 61; 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, w8 65; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 66; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 67; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 68; NONEON-NOSVE-NEXT: add sp, sp, #32 69; NONEON-NOSVE-NEXT: ret 70 %res = call <8 x i8> @llvm.smax.v8i8(<8 x i8> %op1, <8 x i8> %op2) 71 ret <8 x i8> %res 72} 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, vl16 78; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 79; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 80; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b 81; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 82; CHECK-NEXT: ret 83; 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 48 88; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 89; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 90; NONEON-NOSVE-NEXT: cmp w9, w8 91; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 92; 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, w8 96; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 97; 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, w8 101; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 102; 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, w8 106; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 107; 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, w8 111; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 112; 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, w8 116; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 117; 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, w8 121; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 122; 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, w8 126; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 127; 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, w8 131; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 132; 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, w8 136; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 137; 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, w8 141; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 142; 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, w8 146; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 147; 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, w8 151; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 152; 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, w8 156; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 157; 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, w8 161; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 162; 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, w8 166; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 167; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 168; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 169; NONEON-NOSVE-NEXT: add sp, sp, #48 170; NONEON-NOSVE-NEXT: ret 171 %res = call <16 x i8> @llvm.smax.v16i8(<16 x i8> %op1, <16 x i8> %op2) 172 ret <16 x i8> %res 173} 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, vl16 180; CHECK-NEXT: ldp q1, q2, [x0] 181; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b 182; CHECK-NEXT: movprfx z1, z2 183; CHECK-NEXT: smax z1.b, p0/m, z1.b, z3.b 184; CHECK-NEXT: stp q0, q1, [x0] 185; CHECK-NEXT: ret 186; 187; NONEON-NOSVE-LABEL: smax_v32i8: 188; NONEON-NOSVE: // %bb.0: 189; NONEON-NOSVE-NEXT: sub sp, sp, #96 190; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 191; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 192; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 193; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 194; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 195; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #63] 196; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47] 197; NONEON-NOSVE-NEXT: cmp w9, w8 198; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 199; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46] 200; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 201; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #62] 202; NONEON-NOSVE-NEXT: cmp w9, w8 203; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 204; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45] 205; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 206; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #61] 207; NONEON-NOSVE-NEXT: cmp w9, w8 208; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 209; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44] 210; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 211; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #60] 212; NONEON-NOSVE-NEXT: cmp w9, w8 213; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 214; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43] 215; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 216; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #59] 217; NONEON-NOSVE-NEXT: cmp w9, w8 218; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 219; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42] 220; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 221; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #58] 222; NONEON-NOSVE-NEXT: cmp w9, w8 223; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 224; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41] 225; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 226; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #57] 227; NONEON-NOSVE-NEXT: cmp w9, w8 228; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 229; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40] 230; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 231; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #56] 232; NONEON-NOSVE-NEXT: cmp w9, w8 233; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 234; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39] 235; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 236; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #55] 237; NONEON-NOSVE-NEXT: cmp w9, w8 238; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 239; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38] 240; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 241; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #54] 242; NONEON-NOSVE-NEXT: cmp w9, w8 243; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 244; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37] 245; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 246; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #53] 247; NONEON-NOSVE-NEXT: cmp w9, w8 248; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 249; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36] 250; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 251; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #52] 252; NONEON-NOSVE-NEXT: cmp w9, w8 253; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 254; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35] 255; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 256; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #51] 257; NONEON-NOSVE-NEXT: cmp w9, w8 258; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 259; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34] 260; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 261; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #50] 262; NONEON-NOSVE-NEXT: cmp w9, w8 263; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 264; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33] 265; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 266; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #49] 267; NONEON-NOSVE-NEXT: cmp w9, w8 268; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 269; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32] 270; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 271; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #48] 272; NONEON-NOSVE-NEXT: cmp w9, w8 273; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 274; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 275; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 276; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 277; NONEON-NOSVE-NEXT: cmp w9, w8 278; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 279; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 280; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 281; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 282; NONEON-NOSVE-NEXT: cmp w9, w8 283; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 284; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 285; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 286; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 287; NONEON-NOSVE-NEXT: cmp w9, w8 288; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 289; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 290; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 291; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 292; NONEON-NOSVE-NEXT: cmp w9, w8 293; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 294; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 295; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 296; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 297; NONEON-NOSVE-NEXT: cmp w9, w8 298; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 299; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 300; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 301; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 302; NONEON-NOSVE-NEXT: cmp w9, w8 303; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 304; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 305; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 306; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 307; NONEON-NOSVE-NEXT: cmp w9, w8 308; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 309; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 310; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 311; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 312; NONEON-NOSVE-NEXT: cmp w9, w8 313; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 314; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 315; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 316; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 317; NONEON-NOSVE-NEXT: cmp w9, w8 318; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 319; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 320; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 321; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 322; NONEON-NOSVE-NEXT: cmp w9, w8 323; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 324; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 325; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 326; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 327; NONEON-NOSVE-NEXT: cmp w9, w8 328; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 329; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 330; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 331; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 332; NONEON-NOSVE-NEXT: cmp w9, w8 333; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 334; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 335; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 336; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 337; NONEON-NOSVE-NEXT: cmp w9, w8 338; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 339; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 340; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 341; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 342; NONEON-NOSVE-NEXT: cmp w9, w8 343; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 344; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 345; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 346; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 347; NONEON-NOSVE-NEXT: cmp w9, w8 348; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 349; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 350; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 351; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 352; NONEON-NOSVE-NEXT: cmp w9, w8 353; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 354; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 355; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 356; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 357; NONEON-NOSVE-NEXT: add sp, sp, #96 358; NONEON-NOSVE-NEXT: ret 359 %op1 = load <32 x i8>, ptr %a 360 %op2 = load <32 x i8>, ptr %b 361 %res = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %op1, <32 x i8> %op2) 362 store <32 x i8> %res, ptr %a 363 ret void 364} 365 366define <4 x i16> @smax_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 367; CHECK-LABEL: smax_v4i16: 368; CHECK: // %bb.0: 369; CHECK-NEXT: ptrue p0.h, vl4 370; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 371; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 372; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h 373; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 374; CHECK-NEXT: ret 375; 376; NONEON-NOSVE-LABEL: smax_v4i16: 377; NONEON-NOSVE: // %bb.0: 378; NONEON-NOSVE-NEXT: sub sp, sp, #32 379; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 380; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 381; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 382; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 383; NONEON-NOSVE-NEXT: cmp w9, w8 384; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 385; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 386; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 387; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 388; NONEON-NOSVE-NEXT: cmp w9, w8 389; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 390; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 391; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 392; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 393; NONEON-NOSVE-NEXT: cmp w9, w8 394; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 395; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 396; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 397; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 398; NONEON-NOSVE-NEXT: cmp w9, w8 399; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 400; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 401; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 402; NONEON-NOSVE-NEXT: add sp, sp, #32 403; NONEON-NOSVE-NEXT: ret 404 %res = call <4 x i16> @llvm.smax.v4i16(<4 x i16> %op1, <4 x i16> %op2) 405 ret <4 x i16> %res 406} 407 408define <8 x i16> @smax_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 409; CHECK-LABEL: smax_v8i16: 410; CHECK: // %bb.0: 411; CHECK-NEXT: ptrue p0.h, vl8 412; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 413; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 414; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h 415; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 416; CHECK-NEXT: ret 417; 418; NONEON-NOSVE-LABEL: smax_v8i16: 419; NONEON-NOSVE: // %bb.0: 420; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 421; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 422; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 423; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 424; NONEON-NOSVE-NEXT: cmp w9, w8 425; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 426; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 427; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 428; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 429; NONEON-NOSVE-NEXT: cmp w9, w8 430; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 431; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 432; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 433; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 434; NONEON-NOSVE-NEXT: cmp w9, w8 435; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 436; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 437; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 438; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 439; NONEON-NOSVE-NEXT: cmp w9, w8 440; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 441; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 442; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 443; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 444; NONEON-NOSVE-NEXT: cmp w9, w8 445; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 446; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 447; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 448; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 449; NONEON-NOSVE-NEXT: cmp w9, w8 450; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 451; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 452; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 453; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 454; NONEON-NOSVE-NEXT: cmp w9, w8 455; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 456; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 457; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 458; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 459; NONEON-NOSVE-NEXT: cmp w9, w8 460; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 461; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 462; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 463; NONEON-NOSVE-NEXT: add sp, sp, #48 464; NONEON-NOSVE-NEXT: ret 465 %res = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %op1, <8 x i16> %op2) 466 ret <8 x i16> %res 467} 468 469define void @smax_v16i16(ptr %a, ptr %b) { 470; CHECK-LABEL: smax_v16i16: 471; CHECK: // %bb.0: 472; CHECK-NEXT: ldp q0, q3, [x1] 473; CHECK-NEXT: ptrue p0.h, vl8 474; CHECK-NEXT: ldp q1, q2, [x0] 475; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h 476; CHECK-NEXT: movprfx z1, z2 477; CHECK-NEXT: smax z1.h, p0/m, z1.h, z3.h 478; CHECK-NEXT: stp q0, q1, [x0] 479; CHECK-NEXT: ret 480; 481; NONEON-NOSVE-LABEL: smax_v16i16: 482; NONEON-NOSVE: // %bb.0: 483; NONEON-NOSVE-NEXT: sub sp, sp, #96 484; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 485; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 486; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 487; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 488; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 489; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62] 490; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 491; NONEON-NOSVE-NEXT: cmp w9, w8 492; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 493; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44] 494; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 495; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60] 496; NONEON-NOSVE-NEXT: cmp w9, w8 497; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 498; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 499; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 500; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58] 501; NONEON-NOSVE-NEXT: cmp w9, w8 502; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 503; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40] 504; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 505; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56] 506; NONEON-NOSVE-NEXT: cmp w9, w8 507; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 508; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38] 509; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 510; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54] 511; NONEON-NOSVE-NEXT: cmp w9, w8 512; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 513; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36] 514; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 515; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52] 516; NONEON-NOSVE-NEXT: cmp w9, w8 517; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 518; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34] 519; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 520; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50] 521; NONEON-NOSVE-NEXT: cmp w9, w8 522; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 523; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32] 524; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 525; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48] 526; NONEON-NOSVE-NEXT: cmp w9, w8 527; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 528; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 529; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 530; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 531; NONEON-NOSVE-NEXT: cmp w9, w8 532; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 533; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 534; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 535; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 536; NONEON-NOSVE-NEXT: cmp w9, w8 537; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 538; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 539; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 540; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 541; NONEON-NOSVE-NEXT: cmp w9, w8 542; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 543; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 544; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 545; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 546; NONEON-NOSVE-NEXT: cmp w9, w8 547; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 548; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 549; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 550; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 551; NONEON-NOSVE-NEXT: cmp w9, w8 552; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 553; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 554; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 555; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 556; NONEON-NOSVE-NEXT: cmp w9, w8 557; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 558; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 559; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 560; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 561; NONEON-NOSVE-NEXT: cmp w9, w8 562; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 563; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 564; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 565; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 566; NONEON-NOSVE-NEXT: cmp w9, w8 567; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 568; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 569; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 570; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 571; NONEON-NOSVE-NEXT: add sp, sp, #96 572; NONEON-NOSVE-NEXT: ret 573 %op1 = load <16 x i16>, ptr %a 574 %op2 = load <16 x i16>, ptr %b 575 %res = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %op1, <16 x i16> %op2) 576 store <16 x i16> %res, ptr %a 577 ret void 578} 579 580define <2 x i32> @smax_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 581; CHECK-LABEL: smax_v2i32: 582; CHECK: // %bb.0: 583; CHECK-NEXT: ptrue p0.s, vl2 584; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 585; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 586; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s 587; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 588; CHECK-NEXT: ret 589; 590; NONEON-NOSVE-LABEL: smax_v2i32: 591; NONEON-NOSVE: // %bb.0: 592; NONEON-NOSVE-NEXT: sub sp, sp, #32 593; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 594; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 595; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 596; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 597; NONEON-NOSVE-NEXT: cmp w10, w8 598; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 599; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 600; NONEON-NOSVE-NEXT: cmp w9, w8 601; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 602; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 603; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 604; NONEON-NOSVE-NEXT: add sp, sp, #32 605; NONEON-NOSVE-NEXT: ret 606 %res = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %op1, <2 x i32> %op2) 607 ret <2 x i32> %res 608} 609 610define <4 x i32> @smax_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 611; CHECK-LABEL: smax_v4i32: 612; CHECK: // %bb.0: 613; CHECK-NEXT: ptrue p0.s, vl4 614; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 615; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 616; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s 617; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 618; CHECK-NEXT: ret 619; 620; NONEON-NOSVE-LABEL: smax_v4i32: 621; NONEON-NOSVE: // %bb.0: 622; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 623; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 624; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 625; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 626; NONEON-NOSVE-NEXT: cmp w10, w8 627; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 628; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 629; NONEON-NOSVE-NEXT: cmp w9, w8 630; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 631; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 632; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 633; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 634; NONEON-NOSVE-NEXT: cmp w10, w8 635; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 636; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 637; NONEON-NOSVE-NEXT: cmp w9, w8 638; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 639; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 640; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 641; NONEON-NOSVE-NEXT: add sp, sp, #48 642; NONEON-NOSVE-NEXT: ret 643 %res = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %op1, <4 x i32> %op2) 644 ret <4 x i32> %res 645} 646 647define void @smax_v8i32(ptr %a, ptr %b) { 648; CHECK-LABEL: smax_v8i32: 649; CHECK: // %bb.0: 650; CHECK-NEXT: ldp q0, q3, [x1] 651; CHECK-NEXT: ptrue p0.s, vl4 652; CHECK-NEXT: ldp q1, q2, [x0] 653; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s 654; CHECK-NEXT: movprfx z1, z2 655; CHECK-NEXT: smax z1.s, p0/m, z1.s, z3.s 656; CHECK-NEXT: stp q0, q1, [x0] 657; CHECK-NEXT: ret 658; 659; NONEON-NOSVE-LABEL: smax_v8i32: 660; NONEON-NOSVE: // %bb.0: 661; NONEON-NOSVE-NEXT: sub sp, sp, #96 662; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 663; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 664; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 665; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 666; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 667; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 668; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 669; NONEON-NOSVE-NEXT: cmp w10, w8 670; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 671; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 672; NONEON-NOSVE-NEXT: cmp w9, w8 673; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 674; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 675; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 676; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 677; NONEON-NOSVE-NEXT: cmp w10, w8 678; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 679; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 680; NONEON-NOSVE-NEXT: cmp w9, w8 681; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 682; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 683; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 684; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 685; NONEON-NOSVE-NEXT: cmp w10, w8 686; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 687; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 688; NONEON-NOSVE-NEXT: cmp w9, w8 689; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 690; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 691; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 692; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 693; NONEON-NOSVE-NEXT: cmp w10, w8 694; NONEON-NOSVE-NEXT: csel w11, w10, w8, gt 695; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 696; NONEON-NOSVE-NEXT: cmp w9, w8 697; NONEON-NOSVE-NEXT: csel w8, w9, w8, gt 698; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 699; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 700; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 701; NONEON-NOSVE-NEXT: add sp, sp, #96 702; NONEON-NOSVE-NEXT: ret 703 %op1 = load <8 x i32>, ptr %a 704 %op2 = load <8 x i32>, ptr %b 705 %res = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %op1, <8 x i32> %op2) 706 store <8 x i32> %res, ptr %a 707 ret void 708} 709 710; Vector i64 max are not legal for NEON so use SVE when available. 711define <1 x i64> @smax_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 712; CHECK-LABEL: smax_v1i64: 713; CHECK: // %bb.0: 714; CHECK-NEXT: ptrue p0.d, vl1 715; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 716; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 717; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d 718; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 719; CHECK-NEXT: ret 720; 721; NONEON-NOSVE-LABEL: smax_v1i64: 722; NONEON-NOSVE: // %bb.0: 723; NONEON-NOSVE-NEXT: sub sp, sp, #16 724; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 725; NONEON-NOSVE-NEXT: fmov x8, d1 726; NONEON-NOSVE-NEXT: fmov x9, d0 727; NONEON-NOSVE-NEXT: cmp x9, x8 728; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt 729; NONEON-NOSVE-NEXT: str x8, [sp, #8] 730; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 731; NONEON-NOSVE-NEXT: add sp, sp, #16 732; NONEON-NOSVE-NEXT: ret 733 %res = call <1 x i64> @llvm.smax.v1i64(<1 x i64> %op1, <1 x i64> %op2) 734 ret <1 x i64> %res 735} 736 737; Vector i64 max are not legal for NEON so use SVE when available. 738define <2 x i64> @smax_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 739; CHECK-LABEL: smax_v2i64: 740; CHECK: // %bb.0: 741; CHECK-NEXT: ptrue p0.d, vl2 742; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 743; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 744; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d 745; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 746; CHECK-NEXT: ret 747; 748; NONEON-NOSVE-LABEL: smax_v2i64: 749; NONEON-NOSVE: // %bb.0: 750; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 751; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 752; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 753; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 754; NONEON-NOSVE-NEXT: cmp x10, x8 755; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt 756; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 757; NONEON-NOSVE-NEXT: cmp x9, x8 758; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt 759; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 760; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 761; NONEON-NOSVE-NEXT: add sp, sp, #48 762; NONEON-NOSVE-NEXT: ret 763 %res = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %op1, <2 x i64> %op2) 764 ret <2 x i64> %res 765} 766 767define void @smax_v4i64(ptr %a, ptr %b) { 768; CHECK-LABEL: smax_v4i64: 769; CHECK: // %bb.0: 770; CHECK-NEXT: ldp q0, q3, [x1] 771; CHECK-NEXT: ptrue p0.d, vl2 772; CHECK-NEXT: ldp q1, q2, [x0] 773; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d 774; CHECK-NEXT: movprfx z1, z2 775; CHECK-NEXT: smax z1.d, p0/m, z1.d, z3.d 776; CHECK-NEXT: stp q0, q1, [x0] 777; CHECK-NEXT: ret 778; 779; NONEON-NOSVE-LABEL: smax_v4i64: 780; NONEON-NOSVE: // %bb.0: 781; NONEON-NOSVE-NEXT: sub sp, sp, #96 782; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 783; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 784; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 785; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 786; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 787; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 788; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 789; NONEON-NOSVE-NEXT: cmp x10, x8 790; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt 791; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 792; NONEON-NOSVE-NEXT: cmp x9, x8 793; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt 794; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 795; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 796; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 797; NONEON-NOSVE-NEXT: cmp x10, x8 798; NONEON-NOSVE-NEXT: csel x11, x10, x8, gt 799; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 800; NONEON-NOSVE-NEXT: cmp x9, x8 801; NONEON-NOSVE-NEXT: csel x8, x9, x8, gt 802; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 803; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 804; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 805; NONEON-NOSVE-NEXT: add sp, sp, #96 806; NONEON-NOSVE-NEXT: ret 807 %op1 = load <4 x i64>, ptr %a 808 %op2 = load <4 x i64>, ptr %b 809 %res = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %op1, <4 x i64> %op2) 810 store <4 x i64> %res, ptr %a 811 ret void 812} 813 814; 815; SMIN 816; 817 818define <8 x i8> @smin_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 819; CHECK-LABEL: smin_v8i8: 820; CHECK: // %bb.0: 821; CHECK-NEXT: ptrue p0.b, vl8 822; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 823; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 824; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b 825; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 826; CHECK-NEXT: ret 827; 828; NONEON-NOSVE-LABEL: smin_v8i8: 829; NONEON-NOSVE: // %bb.0: 830; NONEON-NOSVE-NEXT: sub sp, sp, #32 831; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 832; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 833; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 834; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 835; NONEON-NOSVE-NEXT: cmp w9, w8 836; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 837; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 838; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 839; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 840; NONEON-NOSVE-NEXT: cmp w9, w8 841; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 842; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 843; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 844; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 845; NONEON-NOSVE-NEXT: cmp w9, w8 846; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 847; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 848; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 849; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 850; NONEON-NOSVE-NEXT: cmp w9, w8 851; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 852; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 853; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 854; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 855; NONEON-NOSVE-NEXT: cmp w9, w8 856; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 857; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 858; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 859; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 860; NONEON-NOSVE-NEXT: cmp w9, w8 861; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 862; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 863; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 864; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 865; NONEON-NOSVE-NEXT: cmp w9, w8 866; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 867; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 868; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 869; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 870; NONEON-NOSVE-NEXT: cmp w9, w8 871; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 872; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 873; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 874; NONEON-NOSVE-NEXT: add sp, sp, #32 875; NONEON-NOSVE-NEXT: ret 876 %res = call <8 x i8> @llvm.smin.v8i8(<8 x i8> %op1, <8 x i8> %op2) 877 ret <8 x i8> %res 878} 879 880define <16 x i8> @smin_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 881; CHECK-LABEL: smin_v16i8: 882; CHECK: // %bb.0: 883; CHECK-NEXT: ptrue p0.b, vl16 884; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 885; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 886; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b 887; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 888; CHECK-NEXT: ret 889; 890; NONEON-NOSVE-LABEL: smin_v16i8: 891; NONEON-NOSVE: // %bb.0: 892; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 893; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 894; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 895; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 896; NONEON-NOSVE-NEXT: cmp w9, w8 897; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 898; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 899; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 900; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 901; NONEON-NOSVE-NEXT: cmp w9, w8 902; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 903; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 904; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 905; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 906; NONEON-NOSVE-NEXT: cmp w9, w8 907; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 908; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 909; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 910; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 911; NONEON-NOSVE-NEXT: cmp w9, w8 912; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 913; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 914; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 915; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 916; NONEON-NOSVE-NEXT: cmp w9, w8 917; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 918; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 919; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 920; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 921; NONEON-NOSVE-NEXT: cmp w9, w8 922; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 923; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 924; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 925; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 926; NONEON-NOSVE-NEXT: cmp w9, w8 927; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 928; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 929; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 930; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 931; NONEON-NOSVE-NEXT: cmp w9, w8 932; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 933; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 934; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 935; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 936; NONEON-NOSVE-NEXT: cmp w9, w8 937; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 938; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 939; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 940; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 941; NONEON-NOSVE-NEXT: cmp w9, w8 942; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 943; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 944; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 945; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 946; NONEON-NOSVE-NEXT: cmp w9, w8 947; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 948; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 949; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 950; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 951; NONEON-NOSVE-NEXT: cmp w9, w8 952; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 953; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 954; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 955; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 956; NONEON-NOSVE-NEXT: cmp w9, w8 957; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 958; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 959; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 960; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 961; NONEON-NOSVE-NEXT: cmp w9, w8 962; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 963; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 964; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 965; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 966; NONEON-NOSVE-NEXT: cmp w9, w8 967; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 968; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 969; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 970; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 971; NONEON-NOSVE-NEXT: cmp w9, w8 972; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 973; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 974; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 975; NONEON-NOSVE-NEXT: add sp, sp, #48 976; NONEON-NOSVE-NEXT: ret 977 %res = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %op1, <16 x i8> %op2) 978 ret <16 x i8> %res 979} 980 981define void @smin_v32i8(ptr %a, ptr %b) { 982; CHECK-LABEL: smin_v32i8: 983; CHECK: // %bb.0: 984; CHECK-NEXT: ldp q0, q3, [x1] 985; CHECK-NEXT: ptrue p0.b, vl16 986; CHECK-NEXT: ldp q1, q2, [x0] 987; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b 988; CHECK-NEXT: movprfx z1, z2 989; CHECK-NEXT: smin z1.b, p0/m, z1.b, z3.b 990; CHECK-NEXT: stp q0, q1, [x0] 991; CHECK-NEXT: ret 992; 993; NONEON-NOSVE-LABEL: smin_v32i8: 994; NONEON-NOSVE: // %bb.0: 995; NONEON-NOSVE-NEXT: sub sp, sp, #96 996; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 997; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 998; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 999; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1000; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1001; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #63] 1002; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #47] 1003; NONEON-NOSVE-NEXT: cmp w9, w8 1004; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1005; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #46] 1006; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1007; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #62] 1008; NONEON-NOSVE-NEXT: cmp w9, w8 1009; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1010; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #45] 1011; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1012; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #61] 1013; NONEON-NOSVE-NEXT: cmp w9, w8 1014; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1015; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #44] 1016; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1017; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #60] 1018; NONEON-NOSVE-NEXT: cmp w9, w8 1019; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1020; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #43] 1021; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1022; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #59] 1023; NONEON-NOSVE-NEXT: cmp w9, w8 1024; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1025; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #42] 1026; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1027; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #58] 1028; NONEON-NOSVE-NEXT: cmp w9, w8 1029; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1030; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #41] 1031; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1032; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #57] 1033; NONEON-NOSVE-NEXT: cmp w9, w8 1034; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1035; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #40] 1036; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1037; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #56] 1038; NONEON-NOSVE-NEXT: cmp w9, w8 1039; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1040; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #39] 1041; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1042; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #55] 1043; NONEON-NOSVE-NEXT: cmp w9, w8 1044; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1045; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #38] 1046; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1047; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #54] 1048; NONEON-NOSVE-NEXT: cmp w9, w8 1049; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1050; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #37] 1051; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1052; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #53] 1053; NONEON-NOSVE-NEXT: cmp w9, w8 1054; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1055; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #36] 1056; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1057; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #52] 1058; NONEON-NOSVE-NEXT: cmp w9, w8 1059; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1060; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #35] 1061; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1062; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #51] 1063; NONEON-NOSVE-NEXT: cmp w9, w8 1064; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1065; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #34] 1066; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1067; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #50] 1068; NONEON-NOSVE-NEXT: cmp w9, w8 1069; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1070; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #33] 1071; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1072; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #49] 1073; NONEON-NOSVE-NEXT: cmp w9, w8 1074; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1075; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #32] 1076; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1077; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #48] 1078; NONEON-NOSVE-NEXT: cmp w9, w8 1079; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1080; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 1081; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1082; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 1083; NONEON-NOSVE-NEXT: cmp w9, w8 1084; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1085; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 1086; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1087; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 1088; NONEON-NOSVE-NEXT: cmp w9, w8 1089; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1090; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 1091; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1092; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 1093; NONEON-NOSVE-NEXT: cmp w9, w8 1094; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1095; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 1096; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1097; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 1098; NONEON-NOSVE-NEXT: cmp w9, w8 1099; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1100; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 1101; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1102; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 1103; NONEON-NOSVE-NEXT: cmp w9, w8 1104; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1105; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 1106; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1107; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 1108; NONEON-NOSVE-NEXT: cmp w9, w8 1109; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1110; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 1111; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1112; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 1113; NONEON-NOSVE-NEXT: cmp w9, w8 1114; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1115; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 1116; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1117; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 1118; NONEON-NOSVE-NEXT: cmp w9, w8 1119; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1120; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] 1121; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1122; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 1123; NONEON-NOSVE-NEXT: cmp w9, w8 1124; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1125; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] 1126; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1127; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 1128; NONEON-NOSVE-NEXT: cmp w9, w8 1129; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1130; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] 1131; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1132; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 1133; NONEON-NOSVE-NEXT: cmp w9, w8 1134; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1135; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 1136; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1137; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 1138; NONEON-NOSVE-NEXT: cmp w9, w8 1139; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1140; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] 1141; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1142; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 1143; NONEON-NOSVE-NEXT: cmp w9, w8 1144; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1145; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] 1146; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1147; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 1148; NONEON-NOSVE-NEXT: cmp w9, w8 1149; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1150; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] 1151; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1152; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 1153; NONEON-NOSVE-NEXT: cmp w9, w8 1154; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1155; NONEON-NOSVE-NEXT: ldrsb w9, [sp] 1156; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1157; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 1158; NONEON-NOSVE-NEXT: cmp w9, w8 1159; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1160; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1161; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1162; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1163; NONEON-NOSVE-NEXT: add sp, sp, #96 1164; NONEON-NOSVE-NEXT: ret 1165 %op1 = load <32 x i8>, ptr %a 1166 %op2 = load <32 x i8>, ptr %b 1167 %res = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %op1, <32 x i8> %op2) 1168 store <32 x i8> %res, ptr %a 1169 ret void 1170} 1171 1172define <4 x i16> @smin_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1173; CHECK-LABEL: smin_v4i16: 1174; CHECK: // %bb.0: 1175; CHECK-NEXT: ptrue p0.h, vl4 1176; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1177; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1178; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h 1179; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1180; CHECK-NEXT: ret 1181; 1182; NONEON-NOSVE-LABEL: smin_v4i16: 1183; NONEON-NOSVE: // %bb.0: 1184; NONEON-NOSVE-NEXT: sub sp, sp, #32 1185; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1186; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1187; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 1188; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 1189; NONEON-NOSVE-NEXT: cmp w9, w8 1190; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1191; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 1192; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1193; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1194; NONEON-NOSVE-NEXT: cmp w9, w8 1195; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1196; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 1197; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1198; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 1199; NONEON-NOSVE-NEXT: cmp w9, w8 1200; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1201; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 1202; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1203; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1204; NONEON-NOSVE-NEXT: cmp w9, w8 1205; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1206; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1207; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1208; NONEON-NOSVE-NEXT: add sp, sp, #32 1209; NONEON-NOSVE-NEXT: ret 1210 %res = call <4 x i16> @llvm.smin.v4i16(<4 x i16> %op1, <4 x i16> %op2) 1211 ret <4 x i16> %res 1212} 1213 1214define <8 x i16> @smin_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1215; CHECK-LABEL: smin_v8i16: 1216; CHECK: // %bb.0: 1217; CHECK-NEXT: ptrue p0.h, vl8 1218; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1219; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1220; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h 1221; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1222; CHECK-NEXT: ret 1223; 1224; NONEON-NOSVE-LABEL: smin_v8i16: 1225; NONEON-NOSVE: // %bb.0: 1226; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1227; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1228; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 1229; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 1230; NONEON-NOSVE-NEXT: cmp w9, w8 1231; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1232; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 1233; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1234; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1235; NONEON-NOSVE-NEXT: cmp w9, w8 1236; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1237; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 1238; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1239; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 1240; NONEON-NOSVE-NEXT: cmp w9, w8 1241; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1242; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 1243; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1244; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1245; NONEON-NOSVE-NEXT: cmp w9, w8 1246; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1247; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 1248; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1249; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 1250; NONEON-NOSVE-NEXT: cmp w9, w8 1251; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1252; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 1253; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1254; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1255; NONEON-NOSVE-NEXT: cmp w9, w8 1256; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1257; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 1258; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1259; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 1260; NONEON-NOSVE-NEXT: cmp w9, w8 1261; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1262; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 1263; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1264; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1265; NONEON-NOSVE-NEXT: cmp w9, w8 1266; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1267; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1268; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1269; NONEON-NOSVE-NEXT: add sp, sp, #48 1270; NONEON-NOSVE-NEXT: ret 1271 %res = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %op1, <8 x i16> %op2) 1272 ret <8 x i16> %res 1273} 1274 1275define void @smin_v16i16(ptr %a, ptr %b) { 1276; CHECK-LABEL: smin_v16i16: 1277; CHECK: // %bb.0: 1278; CHECK-NEXT: ldp q0, q3, [x1] 1279; CHECK-NEXT: ptrue p0.h, vl8 1280; CHECK-NEXT: ldp q1, q2, [x0] 1281; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h 1282; CHECK-NEXT: movprfx z1, z2 1283; CHECK-NEXT: smin z1.h, p0/m, z1.h, z3.h 1284; CHECK-NEXT: stp q0, q1, [x0] 1285; CHECK-NEXT: ret 1286; 1287; NONEON-NOSVE-LABEL: smin_v16i16: 1288; NONEON-NOSVE: // %bb.0: 1289; NONEON-NOSVE-NEXT: sub sp, sp, #96 1290; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1291; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1292; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1293; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1294; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1295; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62] 1296; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 1297; NONEON-NOSVE-NEXT: cmp w9, w8 1298; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1299; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44] 1300; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1301; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60] 1302; NONEON-NOSVE-NEXT: cmp w9, w8 1303; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1304; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 1305; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1306; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58] 1307; NONEON-NOSVE-NEXT: cmp w9, w8 1308; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1309; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40] 1310; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1311; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56] 1312; NONEON-NOSVE-NEXT: cmp w9, w8 1313; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1314; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38] 1315; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1316; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54] 1317; NONEON-NOSVE-NEXT: cmp w9, w8 1318; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1319; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36] 1320; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1321; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52] 1322; NONEON-NOSVE-NEXT: cmp w9, w8 1323; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1324; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34] 1325; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1326; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50] 1327; NONEON-NOSVE-NEXT: cmp w9, w8 1328; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1329; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32] 1330; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1331; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48] 1332; NONEON-NOSVE-NEXT: cmp w9, w8 1333; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1334; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 1335; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1336; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 1337; NONEON-NOSVE-NEXT: cmp w9, w8 1338; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1339; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #12] 1340; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1341; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1342; NONEON-NOSVE-NEXT: cmp w9, w8 1343; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1344; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 1345; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1346; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 1347; NONEON-NOSVE-NEXT: cmp w9, w8 1348; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1349; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 1350; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1351; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1352; NONEON-NOSVE-NEXT: cmp w9, w8 1353; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1354; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #6] 1355; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1356; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 1357; NONEON-NOSVE-NEXT: cmp w9, w8 1358; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1359; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #4] 1360; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1361; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1362; NONEON-NOSVE-NEXT: cmp w9, w8 1363; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1364; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #2] 1365; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1366; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 1367; NONEON-NOSVE-NEXT: cmp w9, w8 1368; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1369; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 1370; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1371; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1372; NONEON-NOSVE-NEXT: cmp w9, w8 1373; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1374; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1375; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1376; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1377; NONEON-NOSVE-NEXT: add sp, sp, #96 1378; NONEON-NOSVE-NEXT: ret 1379 %op1 = load <16 x i16>, ptr %a 1380 %op2 = load <16 x i16>, ptr %b 1381 %res = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %op1, <16 x i16> %op2) 1382 store <16 x i16> %res, ptr %a 1383 ret void 1384} 1385 1386define <2 x i32> @smin_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1387; CHECK-LABEL: smin_v2i32: 1388; CHECK: // %bb.0: 1389; CHECK-NEXT: ptrue p0.s, vl2 1390; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1391; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1392; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s 1393; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1394; CHECK-NEXT: ret 1395; 1396; NONEON-NOSVE-LABEL: smin_v2i32: 1397; NONEON-NOSVE: // %bb.0: 1398; NONEON-NOSVE-NEXT: sub sp, sp, #32 1399; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1400; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1401; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1402; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1403; NONEON-NOSVE-NEXT: cmp w10, w8 1404; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1405; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1406; NONEON-NOSVE-NEXT: cmp w9, w8 1407; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1408; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1409; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1410; NONEON-NOSVE-NEXT: add sp, sp, #32 1411; NONEON-NOSVE-NEXT: ret 1412 %res = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %op1, <2 x i32> %op2) 1413 ret <2 x i32> %res 1414} 1415 1416define <4 x i32> @smin_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1417; CHECK-LABEL: smin_v4i32: 1418; CHECK: // %bb.0: 1419; CHECK-NEXT: ptrue p0.s, vl4 1420; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1421; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1422; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s 1423; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1424; CHECK-NEXT: ret 1425; 1426; NONEON-NOSVE-LABEL: smin_v4i32: 1427; NONEON-NOSVE: // %bb.0: 1428; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1429; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1430; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1431; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1432; NONEON-NOSVE-NEXT: cmp w10, w8 1433; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1434; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1435; NONEON-NOSVE-NEXT: cmp w9, w8 1436; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1437; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1438; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 1439; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1440; NONEON-NOSVE-NEXT: cmp w10, w8 1441; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1442; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1443; NONEON-NOSVE-NEXT: cmp w9, w8 1444; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1445; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 1446; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1447; NONEON-NOSVE-NEXT: add sp, sp, #48 1448; NONEON-NOSVE-NEXT: ret 1449 %res = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %op1, <4 x i32> %op2) 1450 ret <4 x i32> %res 1451} 1452 1453define void @smin_v8i32(ptr %a, ptr %b) { 1454; CHECK-LABEL: smin_v8i32: 1455; CHECK: // %bb.0: 1456; CHECK-NEXT: ldp q0, q3, [x1] 1457; CHECK-NEXT: ptrue p0.s, vl4 1458; CHECK-NEXT: ldp q1, q2, [x0] 1459; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s 1460; CHECK-NEXT: movprfx z1, z2 1461; CHECK-NEXT: smin z1.s, p0/m, z1.s, z3.s 1462; CHECK-NEXT: stp q0, q1, [x0] 1463; CHECK-NEXT: ret 1464; 1465; NONEON-NOSVE-LABEL: smin_v8i32: 1466; NONEON-NOSVE: // %bb.0: 1467; NONEON-NOSVE-NEXT: sub sp, sp, #96 1468; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1469; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1470; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1471; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1472; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1473; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1474; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1475; NONEON-NOSVE-NEXT: cmp w10, w8 1476; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1477; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1478; NONEON-NOSVE-NEXT: cmp w9, w8 1479; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1480; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1481; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 1482; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1483; NONEON-NOSVE-NEXT: cmp w10, w8 1484; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1485; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1486; NONEON-NOSVE-NEXT: cmp w9, w8 1487; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1488; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1489; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 1490; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1491; NONEON-NOSVE-NEXT: cmp w10, w8 1492; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1493; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1494; NONEON-NOSVE-NEXT: cmp w9, w8 1495; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1496; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1497; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 1498; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1499; NONEON-NOSVE-NEXT: cmp w10, w8 1500; NONEON-NOSVE-NEXT: csel w11, w10, w8, lt 1501; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1502; NONEON-NOSVE-NEXT: cmp w9, w8 1503; NONEON-NOSVE-NEXT: csel w8, w9, w8, lt 1504; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 1505; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1506; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1507; NONEON-NOSVE-NEXT: add sp, sp, #96 1508; NONEON-NOSVE-NEXT: ret 1509 %op1 = load <8 x i32>, ptr %a 1510 %op2 = load <8 x i32>, ptr %b 1511 %res = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %op1, <8 x i32> %op2) 1512 store <8 x i32> %res, ptr %a 1513 ret void 1514} 1515 1516; Vector i64 min are not legal for NEON so use SVE when available. 1517define <1 x i64> @smin_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1518; CHECK-LABEL: smin_v1i64: 1519; CHECK: // %bb.0: 1520; CHECK-NEXT: ptrue p0.d, vl1 1521; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1522; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1523; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d 1524; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1525; CHECK-NEXT: ret 1526; 1527; NONEON-NOSVE-LABEL: smin_v1i64: 1528; NONEON-NOSVE: // %bb.0: 1529; NONEON-NOSVE-NEXT: sub sp, sp, #16 1530; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1531; NONEON-NOSVE-NEXT: fmov x8, d1 1532; NONEON-NOSVE-NEXT: fmov x9, d0 1533; NONEON-NOSVE-NEXT: cmp x9, x8 1534; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt 1535; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1536; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1537; NONEON-NOSVE-NEXT: add sp, sp, #16 1538; NONEON-NOSVE-NEXT: ret 1539 %res = call <1 x i64> @llvm.smin.v1i64(<1 x i64> %op1, <1 x i64> %op2) 1540 ret <1 x i64> %res 1541} 1542 1543; Vector i64 min are not legal for NEON so use SVE when available. 1544define <2 x i64> @smin_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 1545; CHECK-LABEL: smin_v2i64: 1546; CHECK: // %bb.0: 1547; CHECK-NEXT: ptrue p0.d, vl2 1548; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1549; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1550; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d 1551; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1552; CHECK-NEXT: ret 1553; 1554; NONEON-NOSVE-LABEL: smin_v2i64: 1555; NONEON-NOSVE: // %bb.0: 1556; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1557; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1558; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1559; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1560; NONEON-NOSVE-NEXT: cmp x10, x8 1561; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt 1562; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1563; NONEON-NOSVE-NEXT: cmp x9, x8 1564; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt 1565; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 1566; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1567; NONEON-NOSVE-NEXT: add sp, sp, #48 1568; NONEON-NOSVE-NEXT: ret 1569 %res = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %op1, <2 x i64> %op2) 1570 ret <2 x i64> %res 1571} 1572 1573define void @smin_v4i64(ptr %a, ptr %b) { 1574; CHECK-LABEL: smin_v4i64: 1575; CHECK: // %bb.0: 1576; CHECK-NEXT: ldp q0, q3, [x1] 1577; CHECK-NEXT: ptrue p0.d, vl2 1578; CHECK-NEXT: ldp q1, q2, [x0] 1579; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d 1580; CHECK-NEXT: movprfx z1, z2 1581; CHECK-NEXT: smin z1.d, p0/m, z1.d, z3.d 1582; CHECK-NEXT: stp q0, q1, [x0] 1583; CHECK-NEXT: ret 1584; 1585; NONEON-NOSVE-LABEL: smin_v4i64: 1586; NONEON-NOSVE: // %bb.0: 1587; NONEON-NOSVE-NEXT: sub sp, sp, #96 1588; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1589; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1590; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1591; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1592; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1593; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 1594; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 1595; NONEON-NOSVE-NEXT: cmp x10, x8 1596; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt 1597; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 1598; NONEON-NOSVE-NEXT: cmp x9, x8 1599; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt 1600; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1601; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 1602; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1603; NONEON-NOSVE-NEXT: cmp x10, x8 1604; NONEON-NOSVE-NEXT: csel x11, x10, x8, lt 1605; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1606; NONEON-NOSVE-NEXT: cmp x9, x8 1607; NONEON-NOSVE-NEXT: csel x8, x9, x8, lt 1608; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 1609; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1610; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1611; NONEON-NOSVE-NEXT: add sp, sp, #96 1612; NONEON-NOSVE-NEXT: ret 1613 %op1 = load <4 x i64>, ptr %a 1614 %op2 = load <4 x i64>, ptr %b 1615 %res = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %op1, <4 x i64> %op2) 1616 store <4 x i64> %res, ptr %a 1617 ret void 1618} 1619 1620; 1621; UMAX 1622; 1623 1624define <8 x i8> @umax_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 1625; CHECK-LABEL: umax_v8i8: 1626; CHECK: // %bb.0: 1627; CHECK-NEXT: ptrue p0.b, vl8 1628; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1629; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1630; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b 1631; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1632; CHECK-NEXT: ret 1633; 1634; NONEON-NOSVE-LABEL: umax_v8i8: 1635; NONEON-NOSVE: // %bb.0: 1636; NONEON-NOSVE-NEXT: sub sp, sp, #32 1637; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1638; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1639; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1640; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1641; NONEON-NOSVE-NEXT: cmp w9, w8 1642; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1643; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1644; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 1645; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1646; NONEON-NOSVE-NEXT: cmp w9, w8 1647; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1648; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1649; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 1650; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1651; NONEON-NOSVE-NEXT: cmp w9, w8 1652; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1653; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1654; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 1655; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1656; NONEON-NOSVE-NEXT: cmp w9, w8 1657; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1658; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1659; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 1660; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1661; NONEON-NOSVE-NEXT: cmp w9, w8 1662; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1663; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1664; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 1665; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1666; NONEON-NOSVE-NEXT: cmp w9, w8 1667; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1668; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1669; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 1670; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1671; NONEON-NOSVE-NEXT: cmp w9, w8 1672; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1673; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1674; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 1675; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1676; NONEON-NOSVE-NEXT: cmp w9, w8 1677; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1678; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 1679; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1680; NONEON-NOSVE-NEXT: add sp, sp, #32 1681; NONEON-NOSVE-NEXT: ret 1682 %res = call <8 x i8> @llvm.umax.v8i8(<8 x i8> %op1, <8 x i8> %op2) 1683 ret <8 x i8> %res 1684} 1685 1686define <16 x i8> @umax_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 1687; CHECK-LABEL: umax_v16i8: 1688; CHECK: // %bb.0: 1689; CHECK-NEXT: ptrue p0.b, vl16 1690; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1691; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1692; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b 1693; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1694; CHECK-NEXT: ret 1695; 1696; NONEON-NOSVE-LABEL: umax_v16i8: 1697; NONEON-NOSVE: // %bb.0: 1698; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1699; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1700; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1701; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1702; NONEON-NOSVE-NEXT: cmp w9, w8 1703; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1704; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1705; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 1706; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1707; NONEON-NOSVE-NEXT: cmp w9, w8 1708; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1709; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1710; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 1711; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1712; NONEON-NOSVE-NEXT: cmp w9, w8 1713; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1714; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1715; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 1716; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1717; NONEON-NOSVE-NEXT: cmp w9, w8 1718; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1719; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1720; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 1721; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1722; NONEON-NOSVE-NEXT: cmp w9, w8 1723; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1724; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1725; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 1726; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1727; NONEON-NOSVE-NEXT: cmp w9, w8 1728; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1729; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1730; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 1731; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1732; NONEON-NOSVE-NEXT: cmp w9, w8 1733; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1734; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1735; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 1736; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1737; NONEON-NOSVE-NEXT: cmp w9, w8 1738; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1739; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1740; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 1741; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1742; NONEON-NOSVE-NEXT: cmp w9, w8 1743; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1744; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1745; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 1746; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1747; NONEON-NOSVE-NEXT: cmp w9, w8 1748; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1749; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1750; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 1751; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1752; NONEON-NOSVE-NEXT: cmp w9, w8 1753; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1754; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1755; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 1756; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1757; NONEON-NOSVE-NEXT: cmp w9, w8 1758; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1759; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1760; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 1761; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1762; NONEON-NOSVE-NEXT: cmp w9, w8 1763; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1764; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1765; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 1766; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1767; NONEON-NOSVE-NEXT: cmp w9, w8 1768; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1769; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1770; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 1771; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1772; NONEON-NOSVE-NEXT: cmp w9, w8 1773; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1774; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1775; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 1776; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1777; NONEON-NOSVE-NEXT: cmp w9, w8 1778; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1779; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 1780; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1781; NONEON-NOSVE-NEXT: add sp, sp, #48 1782; NONEON-NOSVE-NEXT: ret 1783 %res = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %op1, <16 x i8> %op2) 1784 ret <16 x i8> %res 1785} 1786 1787define void @umax_v32i8(ptr %a, ptr %b) { 1788; CHECK-LABEL: umax_v32i8: 1789; CHECK: // %bb.0: 1790; CHECK-NEXT: ldp q0, q3, [x1] 1791; CHECK-NEXT: ptrue p0.b, vl16 1792; CHECK-NEXT: ldp q1, q2, [x0] 1793; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b 1794; CHECK-NEXT: movprfx z1, z2 1795; CHECK-NEXT: umax z1.b, p0/m, z1.b, z3.b 1796; CHECK-NEXT: stp q0, q1, [x0] 1797; CHECK-NEXT: ret 1798; 1799; NONEON-NOSVE-LABEL: umax_v32i8: 1800; NONEON-NOSVE: // %bb.0: 1801; NONEON-NOSVE-NEXT: sub sp, sp, #96 1802; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1803; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1804; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1805; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1806; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1807; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1808; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1809; NONEON-NOSVE-NEXT: cmp w9, w8 1810; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1811; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1812; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1813; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1814; NONEON-NOSVE-NEXT: cmp w9, w8 1815; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1816; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1817; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1818; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1819; NONEON-NOSVE-NEXT: cmp w9, w8 1820; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1821; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1822; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1823; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1824; NONEON-NOSVE-NEXT: cmp w9, w8 1825; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1826; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1827; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1828; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1829; NONEON-NOSVE-NEXT: cmp w9, w8 1830; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1831; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1832; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1833; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1834; NONEON-NOSVE-NEXT: cmp w9, w8 1835; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1836; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1837; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1838; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1839; NONEON-NOSVE-NEXT: cmp w9, w8 1840; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1841; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1842; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1843; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1844; NONEON-NOSVE-NEXT: cmp w9, w8 1845; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1846; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1847; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1848; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1849; NONEON-NOSVE-NEXT: cmp w9, w8 1850; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1851; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1852; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1853; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1854; NONEON-NOSVE-NEXT: cmp w9, w8 1855; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1856; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1857; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1858; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1859; NONEON-NOSVE-NEXT: cmp w9, w8 1860; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1861; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1862; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1863; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1864; NONEON-NOSVE-NEXT: cmp w9, w8 1865; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1866; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1867; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1868; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1869; NONEON-NOSVE-NEXT: cmp w9, w8 1870; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1871; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1872; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1873; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1874; NONEON-NOSVE-NEXT: cmp w9, w8 1875; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1876; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1877; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1878; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1879; NONEON-NOSVE-NEXT: cmp w9, w8 1880; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1881; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1882; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1883; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1884; NONEON-NOSVE-NEXT: cmp w9, w8 1885; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1886; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1887; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1888; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1889; NONEON-NOSVE-NEXT: cmp w9, w8 1890; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1891; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1892; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1893; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1894; NONEON-NOSVE-NEXT: cmp w9, w8 1895; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1896; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1897; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1898; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1899; NONEON-NOSVE-NEXT: cmp w9, w8 1900; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1901; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1902; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1903; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1904; NONEON-NOSVE-NEXT: cmp w9, w8 1905; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1906; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1907; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1908; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1909; NONEON-NOSVE-NEXT: cmp w9, w8 1910; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1911; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1912; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1913; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1914; NONEON-NOSVE-NEXT: cmp w9, w8 1915; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1916; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1917; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1918; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1919; NONEON-NOSVE-NEXT: cmp w9, w8 1920; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1921; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1922; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1923; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1924; NONEON-NOSVE-NEXT: cmp w9, w8 1925; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1926; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1927; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1928; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1929; NONEON-NOSVE-NEXT: cmp w9, w8 1930; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1931; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1932; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1933; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1934; NONEON-NOSVE-NEXT: cmp w9, w8 1935; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1936; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1937; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1938; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1939; NONEON-NOSVE-NEXT: cmp w9, w8 1940; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1941; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1942; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1943; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1944; NONEON-NOSVE-NEXT: cmp w9, w8 1945; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1946; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1947; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1948; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1949; NONEON-NOSVE-NEXT: cmp w9, w8 1950; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1951; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1952; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1953; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1954; NONEON-NOSVE-NEXT: cmp w9, w8 1955; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1956; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1957; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1958; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1959; NONEON-NOSVE-NEXT: cmp w9, w8 1960; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1961; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1962; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1963; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1964; NONEON-NOSVE-NEXT: cmp w9, w8 1965; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1966; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1967; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1968; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1969; NONEON-NOSVE-NEXT: add sp, sp, #96 1970; NONEON-NOSVE-NEXT: ret 1971 %op1 = load <32 x i8>, ptr %a 1972 %op2 = load <32 x i8>, ptr %b 1973 %res = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %op1, <32 x i8> %op2) 1974 store <32 x i8> %res, ptr %a 1975 ret void 1976} 1977 1978define <4 x i16> @umax_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1979; CHECK-LABEL: umax_v4i16: 1980; CHECK: // %bb.0: 1981; CHECK-NEXT: ptrue p0.h, vl4 1982; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1983; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1984; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h 1985; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1986; CHECK-NEXT: ret 1987; 1988; NONEON-NOSVE-LABEL: umax_v4i16: 1989; NONEON-NOSVE: // %bb.0: 1990; NONEON-NOSVE-NEXT: sub sp, sp, #32 1991; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1992; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1993; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1994; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1995; NONEON-NOSVE-NEXT: cmp w9, w8 1996; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 1997; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1998; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1999; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2000; NONEON-NOSVE-NEXT: cmp w9, w8 2001; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2002; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2003; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2004; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2005; NONEON-NOSVE-NEXT: cmp w9, w8 2006; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2007; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2008; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2009; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2010; NONEON-NOSVE-NEXT: cmp w9, w8 2011; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2012; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2013; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2014; NONEON-NOSVE-NEXT: add sp, sp, #32 2015; NONEON-NOSVE-NEXT: ret 2016 %res = call <4 x i16> @llvm.umax.v4i16(<4 x i16> %op1, <4 x i16> %op2) 2017 ret <4 x i16> %res 2018} 2019 2020define <8 x i16> @umax_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 2021; CHECK-LABEL: umax_v8i16: 2022; CHECK: // %bb.0: 2023; CHECK-NEXT: ptrue p0.h, vl8 2024; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2025; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2026; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h 2027; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2028; CHECK-NEXT: ret 2029; 2030; NONEON-NOSVE-LABEL: umax_v8i16: 2031; NONEON-NOSVE: // %bb.0: 2032; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2033; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2034; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2035; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2036; NONEON-NOSVE-NEXT: cmp w9, w8 2037; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2038; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2039; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2040; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2041; NONEON-NOSVE-NEXT: cmp w9, w8 2042; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2043; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2044; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2045; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2046; NONEON-NOSVE-NEXT: cmp w9, w8 2047; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2048; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2049; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2050; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2051; NONEON-NOSVE-NEXT: cmp w9, w8 2052; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2053; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2054; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2055; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2056; NONEON-NOSVE-NEXT: cmp w9, w8 2057; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2058; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2059; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2060; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2061; NONEON-NOSVE-NEXT: cmp w9, w8 2062; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2063; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2064; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2065; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2066; NONEON-NOSVE-NEXT: cmp w9, w8 2067; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2068; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2069; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2070; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2071; NONEON-NOSVE-NEXT: cmp w9, w8 2072; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2073; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2074; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2075; NONEON-NOSVE-NEXT: add sp, sp, #48 2076; NONEON-NOSVE-NEXT: ret 2077 %res = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %op1, <8 x i16> %op2) 2078 ret <8 x i16> %res 2079} 2080 2081define void @umax_v16i16(ptr %a, ptr %b) { 2082; CHECK-LABEL: umax_v16i16: 2083; CHECK: // %bb.0: 2084; CHECK-NEXT: ldp q0, q3, [x1] 2085; CHECK-NEXT: ptrue p0.h, vl8 2086; CHECK-NEXT: ldp q1, q2, [x0] 2087; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h 2088; CHECK-NEXT: movprfx z1, z2 2089; CHECK-NEXT: umax z1.h, p0/m, z1.h, z3.h 2090; CHECK-NEXT: stp q0, q1, [x0] 2091; CHECK-NEXT: ret 2092; 2093; NONEON-NOSVE-LABEL: umax_v16i16: 2094; NONEON-NOSVE: // %bb.0: 2095; NONEON-NOSVE-NEXT: sub sp, sp, #96 2096; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2097; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2098; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2099; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2100; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2101; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 2102; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 2103; NONEON-NOSVE-NEXT: cmp w9, w8 2104; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2105; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 2106; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 2107; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 2108; NONEON-NOSVE-NEXT: cmp w9, w8 2109; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2110; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 2111; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 2112; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 2113; NONEON-NOSVE-NEXT: cmp w9, w8 2114; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2115; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 2116; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 2117; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 2118; NONEON-NOSVE-NEXT: cmp w9, w8 2119; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2120; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 2121; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 2122; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 2123; NONEON-NOSVE-NEXT: cmp w9, w8 2124; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2125; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 2126; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 2127; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 2128; NONEON-NOSVE-NEXT: cmp w9, w8 2129; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2130; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 2131; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 2132; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 2133; NONEON-NOSVE-NEXT: cmp w9, w8 2134; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2135; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 2136; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 2137; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 2138; NONEON-NOSVE-NEXT: cmp w9, w8 2139; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2140; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2141; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 2142; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2143; NONEON-NOSVE-NEXT: cmp w9, w8 2144; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2145; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2146; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 2147; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2148; NONEON-NOSVE-NEXT: cmp w9, w8 2149; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2150; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2151; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2152; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2153; NONEON-NOSVE-NEXT: cmp w9, w8 2154; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2155; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2156; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 2157; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2158; NONEON-NOSVE-NEXT: cmp w9, w8 2159; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2160; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2161; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2162; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2163; NONEON-NOSVE-NEXT: cmp w9, w8 2164; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2165; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2166; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 2167; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2168; NONEON-NOSVE-NEXT: cmp w9, w8 2169; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2170; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2171; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 2172; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2173; NONEON-NOSVE-NEXT: cmp w9, w8 2174; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2175; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2176; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 2177; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2178; NONEON-NOSVE-NEXT: cmp w9, w8 2179; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2180; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 2181; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2182; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2183; NONEON-NOSVE-NEXT: add sp, sp, #96 2184; NONEON-NOSVE-NEXT: ret 2185 %op1 = load <16 x i16>, ptr %a 2186 %op2 = load <16 x i16>, ptr %b 2187 %res = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %op1, <16 x i16> %op2) 2188 store <16 x i16> %res, ptr %a 2189 ret void 2190} 2191 2192define <2 x i32> @umax_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 2193; CHECK-LABEL: umax_v2i32: 2194; CHECK: // %bb.0: 2195; CHECK-NEXT: ptrue p0.s, vl2 2196; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2197; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2198; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s 2199; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2200; CHECK-NEXT: ret 2201; 2202; NONEON-NOSVE-LABEL: umax_v2i32: 2203; NONEON-NOSVE: // %bb.0: 2204; NONEON-NOSVE-NEXT: sub sp, sp, #32 2205; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2206; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2207; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2208; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2209; NONEON-NOSVE-NEXT: cmp w10, w8 2210; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2211; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2212; NONEON-NOSVE-NEXT: cmp w9, w8 2213; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2214; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 2215; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2216; NONEON-NOSVE-NEXT: add sp, sp, #32 2217; NONEON-NOSVE-NEXT: ret 2218 %res = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %op1, <2 x i32> %op2) 2219 ret <2 x i32> %res 2220} 2221 2222define <4 x i32> @umax_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 2223; CHECK-LABEL: umax_v4i32: 2224; CHECK: // %bb.0: 2225; CHECK-NEXT: ptrue p0.s, vl4 2226; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2227; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2228; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s 2229; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2230; CHECK-NEXT: ret 2231; 2232; NONEON-NOSVE-LABEL: umax_v4i32: 2233; NONEON-NOSVE: // %bb.0: 2234; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2235; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2236; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2237; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2238; NONEON-NOSVE-NEXT: cmp w10, w8 2239; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2240; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2241; NONEON-NOSVE-NEXT: cmp w9, w8 2242; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2243; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2244; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 2245; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2246; NONEON-NOSVE-NEXT: cmp w10, w8 2247; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2248; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2249; NONEON-NOSVE-NEXT: cmp w9, w8 2250; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2251; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 2252; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2253; NONEON-NOSVE-NEXT: add sp, sp, #48 2254; NONEON-NOSVE-NEXT: ret 2255 %res = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %op1, <4 x i32> %op2) 2256 ret <4 x i32> %res 2257} 2258 2259define void @umax_v8i32(ptr %a, ptr %b) { 2260; CHECK-LABEL: umax_v8i32: 2261; CHECK: // %bb.0: 2262; CHECK-NEXT: ldp q0, q3, [x1] 2263; CHECK-NEXT: ptrue p0.s, vl4 2264; CHECK-NEXT: ldp q1, q2, [x0] 2265; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s 2266; CHECK-NEXT: movprfx z1, z2 2267; CHECK-NEXT: umax z1.s, p0/m, z1.s, z3.s 2268; CHECK-NEXT: stp q0, q1, [x0] 2269; CHECK-NEXT: ret 2270; 2271; NONEON-NOSVE-LABEL: umax_v8i32: 2272; NONEON-NOSVE: // %bb.0: 2273; NONEON-NOSVE-NEXT: sub sp, sp, #96 2274; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2275; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2276; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2277; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2278; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2279; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 2280; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 2281; NONEON-NOSVE-NEXT: cmp w10, w8 2282; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2283; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 2284; NONEON-NOSVE-NEXT: cmp w9, w8 2285; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2286; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 2287; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 2288; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 2289; NONEON-NOSVE-NEXT: cmp w10, w8 2290; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2291; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 2292; NONEON-NOSVE-NEXT: cmp w9, w8 2293; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2294; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2295; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 2296; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2297; NONEON-NOSVE-NEXT: cmp w10, w8 2298; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2299; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2300; NONEON-NOSVE-NEXT: cmp w9, w8 2301; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2302; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2303; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 2304; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2305; NONEON-NOSVE-NEXT: cmp w10, w8 2306; NONEON-NOSVE-NEXT: csel w11, w10, w8, hi 2307; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2308; NONEON-NOSVE-NEXT: cmp w9, w8 2309; NONEON-NOSVE-NEXT: csel w8, w9, w8, hi 2310; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 2311; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2312; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2313; NONEON-NOSVE-NEXT: add sp, sp, #96 2314; NONEON-NOSVE-NEXT: ret 2315 %op1 = load <8 x i32>, ptr %a 2316 %op2 = load <8 x i32>, ptr %b 2317 %res = call <8 x i32> @llvm.umax.v8i32(<8 x i32> %op1, <8 x i32> %op2) 2318 store <8 x i32> %res, ptr %a 2319 ret void 2320} 2321 2322; Vector i64 max are not legal for NEON so use SVE when available. 2323define <1 x i64> @umax_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 2324; CHECK-LABEL: umax_v1i64: 2325; CHECK: // %bb.0: 2326; CHECK-NEXT: ptrue p0.d, vl1 2327; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2328; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2329; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d 2330; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2331; CHECK-NEXT: ret 2332; 2333; NONEON-NOSVE-LABEL: umax_v1i64: 2334; NONEON-NOSVE: // %bb.0: 2335; NONEON-NOSVE-NEXT: sub sp, sp, #16 2336; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2337; NONEON-NOSVE-NEXT: fmov x8, d1 2338; NONEON-NOSVE-NEXT: fmov x9, d0 2339; NONEON-NOSVE-NEXT: cmp x9, x8 2340; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi 2341; NONEON-NOSVE-NEXT: str x8, [sp, #8] 2342; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2343; NONEON-NOSVE-NEXT: add sp, sp, #16 2344; NONEON-NOSVE-NEXT: ret 2345 %res = call <1 x i64> @llvm.umax.v1i64(<1 x i64> %op1, <1 x i64> %op2) 2346 ret <1 x i64> %res 2347} 2348 2349; Vector i64 max are not legal for NEON so use SVE when available. 2350define <2 x i64> @umax_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 2351; CHECK-LABEL: umax_v2i64: 2352; CHECK: // %bb.0: 2353; CHECK-NEXT: ptrue p0.d, vl2 2354; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2355; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2356; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d 2357; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2358; CHECK-NEXT: ret 2359; 2360; NONEON-NOSVE-LABEL: umax_v2i64: 2361; NONEON-NOSVE: // %bb.0: 2362; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2363; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2364; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2365; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2366; NONEON-NOSVE-NEXT: cmp x10, x8 2367; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi 2368; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2369; NONEON-NOSVE-NEXT: cmp x9, x8 2370; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi 2371; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 2372; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2373; NONEON-NOSVE-NEXT: add sp, sp, #48 2374; NONEON-NOSVE-NEXT: ret 2375 %res = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %op1, <2 x i64> %op2) 2376 ret <2 x i64> %res 2377} 2378 2379define void @umax_v4i64(ptr %a, ptr %b) { 2380; CHECK-LABEL: umax_v4i64: 2381; CHECK: // %bb.0: 2382; CHECK-NEXT: ldp q0, q3, [x1] 2383; CHECK-NEXT: ptrue p0.d, vl2 2384; CHECK-NEXT: ldp q1, q2, [x0] 2385; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d 2386; CHECK-NEXT: movprfx z1, z2 2387; CHECK-NEXT: umax z1.d, p0/m, z1.d, z3.d 2388; CHECK-NEXT: stp q0, q1, [x0] 2389; CHECK-NEXT: ret 2390; 2391; NONEON-NOSVE-LABEL: umax_v4i64: 2392; NONEON-NOSVE: // %bb.0: 2393; NONEON-NOSVE-NEXT: sub sp, sp, #96 2394; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2395; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2396; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2397; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2398; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2399; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 2400; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 2401; NONEON-NOSVE-NEXT: cmp x10, x8 2402; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi 2403; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 2404; NONEON-NOSVE-NEXT: cmp x9, x8 2405; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi 2406; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2407; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 2408; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2409; NONEON-NOSVE-NEXT: cmp x10, x8 2410; NONEON-NOSVE-NEXT: csel x11, x10, x8, hi 2411; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2412; NONEON-NOSVE-NEXT: cmp x9, x8 2413; NONEON-NOSVE-NEXT: csel x8, x9, x8, hi 2414; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 2415; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2416; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2417; NONEON-NOSVE-NEXT: add sp, sp, #96 2418; NONEON-NOSVE-NEXT: ret 2419 %op1 = load <4 x i64>, ptr %a 2420 %op2 = load <4 x i64>, ptr %b 2421 %res = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %op1, <4 x i64> %op2) 2422 store <4 x i64> %res, ptr %a 2423 ret void 2424} 2425 2426; 2427; UMIN 2428; 2429 2430define <8 x i8> @umin_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 2431; CHECK-LABEL: umin_v8i8: 2432; CHECK: // %bb.0: 2433; CHECK-NEXT: ptrue p0.b, vl8 2434; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2435; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2436; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b 2437; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2438; CHECK-NEXT: ret 2439; 2440; NONEON-NOSVE-LABEL: umin_v8i8: 2441; NONEON-NOSVE: // %bb.0: 2442; NONEON-NOSVE-NEXT: sub sp, sp, #32 2443; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2444; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2445; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 2446; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 2447; NONEON-NOSVE-NEXT: cmp w9, w8 2448; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2449; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 2450; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 2451; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 2452; NONEON-NOSVE-NEXT: cmp w9, w8 2453; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2454; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 2455; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 2456; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 2457; NONEON-NOSVE-NEXT: cmp w9, w8 2458; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2459; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 2460; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 2461; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2462; NONEON-NOSVE-NEXT: cmp w9, w8 2463; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2464; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 2465; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 2466; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 2467; NONEON-NOSVE-NEXT: cmp w9, w8 2468; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2469; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 2470; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 2471; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 2472; NONEON-NOSVE-NEXT: cmp w9, w8 2473; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2474; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 2475; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 2476; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 2477; NONEON-NOSVE-NEXT: cmp w9, w8 2478; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2479; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 2480; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 2481; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 2482; NONEON-NOSVE-NEXT: cmp w9, w8 2483; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2484; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 2485; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2486; NONEON-NOSVE-NEXT: add sp, sp, #32 2487; NONEON-NOSVE-NEXT: ret 2488 %res = call <8 x i8> @llvm.umin.v8i8(<8 x i8> %op1, <8 x i8> %op2) 2489 ret <8 x i8> %res 2490} 2491 2492define <16 x i8> @umin_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 2493; CHECK-LABEL: umin_v16i8: 2494; CHECK: // %bb.0: 2495; CHECK-NEXT: ptrue p0.b, vl16 2496; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2497; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2498; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b 2499; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2500; CHECK-NEXT: ret 2501; 2502; NONEON-NOSVE-LABEL: umin_v16i8: 2503; NONEON-NOSVE: // %bb.0: 2504; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2505; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2506; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 2507; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 2508; NONEON-NOSVE-NEXT: cmp w9, w8 2509; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2510; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 2511; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 2512; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 2513; NONEON-NOSVE-NEXT: cmp w9, w8 2514; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2515; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 2516; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 2517; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 2518; NONEON-NOSVE-NEXT: cmp w9, w8 2519; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2520; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 2521; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 2522; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 2523; NONEON-NOSVE-NEXT: cmp w9, w8 2524; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2525; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 2526; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 2527; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 2528; NONEON-NOSVE-NEXT: cmp w9, w8 2529; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2530; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 2531; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 2532; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 2533; NONEON-NOSVE-NEXT: cmp w9, w8 2534; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2535; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 2536; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 2537; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 2538; NONEON-NOSVE-NEXT: cmp w9, w8 2539; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2540; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 2541; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 2542; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 2543; NONEON-NOSVE-NEXT: cmp w9, w8 2544; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2545; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 2546; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 2547; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 2548; NONEON-NOSVE-NEXT: cmp w9, w8 2549; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2550; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 2551; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 2552; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 2553; NONEON-NOSVE-NEXT: cmp w9, w8 2554; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2555; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 2556; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 2557; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 2558; NONEON-NOSVE-NEXT: cmp w9, w8 2559; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2560; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 2561; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 2562; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2563; NONEON-NOSVE-NEXT: cmp w9, w8 2564; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2565; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 2566; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 2567; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 2568; NONEON-NOSVE-NEXT: cmp w9, w8 2569; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2570; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 2571; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 2572; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 2573; NONEON-NOSVE-NEXT: cmp w9, w8 2574; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2575; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 2576; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 2577; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 2578; NONEON-NOSVE-NEXT: cmp w9, w8 2579; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2580; NONEON-NOSVE-NEXT: ldrb w9, [sp] 2581; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 2582; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 2583; NONEON-NOSVE-NEXT: cmp w9, w8 2584; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2585; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 2586; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2587; NONEON-NOSVE-NEXT: add sp, sp, #48 2588; NONEON-NOSVE-NEXT: ret 2589 %res = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %op1, <16 x i8> %op2) 2590 ret <16 x i8> %res 2591} 2592 2593define void @umin_v32i8(ptr %a, ptr %b) { 2594; CHECK-LABEL: umin_v32i8: 2595; CHECK: // %bb.0: 2596; CHECK-NEXT: ldp q0, q3, [x1] 2597; CHECK-NEXT: ptrue p0.b, vl16 2598; CHECK-NEXT: ldp q1, q2, [x0] 2599; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b 2600; CHECK-NEXT: movprfx z1, z2 2601; CHECK-NEXT: umin z1.b, p0/m, z1.b, z3.b 2602; CHECK-NEXT: stp q0, q1, [x0] 2603; CHECK-NEXT: ret 2604; 2605; NONEON-NOSVE-LABEL: umin_v32i8: 2606; NONEON-NOSVE: // %bb.0: 2607; NONEON-NOSVE-NEXT: sub sp, sp, #96 2608; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2609; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2610; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2611; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2612; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2613; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 2614; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 2615; NONEON-NOSVE-NEXT: cmp w9, w8 2616; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2617; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 2618; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 2619; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 2620; NONEON-NOSVE-NEXT: cmp w9, w8 2621; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2622; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 2623; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 2624; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 2625; NONEON-NOSVE-NEXT: cmp w9, w8 2626; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2627; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 2628; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 2629; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 2630; NONEON-NOSVE-NEXT: cmp w9, w8 2631; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2632; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 2633; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 2634; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 2635; NONEON-NOSVE-NEXT: cmp w9, w8 2636; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2637; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 2638; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 2639; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 2640; NONEON-NOSVE-NEXT: cmp w9, w8 2641; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2642; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 2643; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 2644; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 2645; NONEON-NOSVE-NEXT: cmp w9, w8 2646; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2647; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 2648; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 2649; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 2650; NONEON-NOSVE-NEXT: cmp w9, w8 2651; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2652; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 2653; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 2654; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 2655; NONEON-NOSVE-NEXT: cmp w9, w8 2656; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2657; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 2658; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 2659; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 2660; NONEON-NOSVE-NEXT: cmp w9, w8 2661; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2662; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 2663; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 2664; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 2665; NONEON-NOSVE-NEXT: cmp w9, w8 2666; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2667; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 2668; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 2669; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 2670; NONEON-NOSVE-NEXT: cmp w9, w8 2671; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2672; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 2673; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 2674; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 2675; NONEON-NOSVE-NEXT: cmp w9, w8 2676; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2677; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 2678; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 2679; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 2680; NONEON-NOSVE-NEXT: cmp w9, w8 2681; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2682; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 2683; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 2684; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 2685; NONEON-NOSVE-NEXT: cmp w9, w8 2686; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2687; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 2688; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 2689; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 2690; NONEON-NOSVE-NEXT: cmp w9, w8 2691; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2692; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 2693; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 2694; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 2695; NONEON-NOSVE-NEXT: cmp w9, w8 2696; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2697; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 2698; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 2699; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 2700; NONEON-NOSVE-NEXT: cmp w9, w8 2701; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2702; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 2703; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 2704; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 2705; NONEON-NOSVE-NEXT: cmp w9, w8 2706; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2707; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 2708; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 2709; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 2710; NONEON-NOSVE-NEXT: cmp w9, w8 2711; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2712; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 2713; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 2714; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 2715; NONEON-NOSVE-NEXT: cmp w9, w8 2716; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2717; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 2718; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 2719; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 2720; NONEON-NOSVE-NEXT: cmp w9, w8 2721; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2722; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 2723; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 2724; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 2725; NONEON-NOSVE-NEXT: cmp w9, w8 2726; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2727; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 2728; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 2729; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 2730; NONEON-NOSVE-NEXT: cmp w9, w8 2731; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2732; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 2733; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 2734; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 2735; NONEON-NOSVE-NEXT: cmp w9, w8 2736; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2737; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 2738; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 2739; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 2740; NONEON-NOSVE-NEXT: cmp w9, w8 2741; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2742; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 2743; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 2744; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 2745; NONEON-NOSVE-NEXT: cmp w9, w8 2746; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2747; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 2748; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 2749; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2750; NONEON-NOSVE-NEXT: cmp w9, w8 2751; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2752; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 2753; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 2754; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 2755; NONEON-NOSVE-NEXT: cmp w9, w8 2756; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2757; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 2758; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 2759; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 2760; NONEON-NOSVE-NEXT: cmp w9, w8 2761; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2762; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 2763; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 2764; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 2765; NONEON-NOSVE-NEXT: cmp w9, w8 2766; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2767; NONEON-NOSVE-NEXT: ldrb w9, [sp] 2768; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 2769; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 2770; NONEON-NOSVE-NEXT: cmp w9, w8 2771; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2772; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 2773; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2774; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2775; NONEON-NOSVE-NEXT: add sp, sp, #96 2776; NONEON-NOSVE-NEXT: ret 2777 %op1 = load <32 x i8>, ptr %a 2778 %op2 = load <32 x i8>, ptr %b 2779 %res = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %op1, <32 x i8> %op2) 2780 store <32 x i8> %res, ptr %a 2781 ret void 2782} 2783 2784define <4 x i16> @umin_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 2785; CHECK-LABEL: umin_v4i16: 2786; CHECK: // %bb.0: 2787; CHECK-NEXT: ptrue p0.h, vl4 2788; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2789; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2790; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h 2791; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2792; CHECK-NEXT: ret 2793; 2794; NONEON-NOSVE-LABEL: umin_v4i16: 2795; NONEON-NOSVE: // %bb.0: 2796; NONEON-NOSVE-NEXT: sub sp, sp, #32 2797; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2798; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2799; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2800; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2801; NONEON-NOSVE-NEXT: cmp w9, w8 2802; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2803; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2804; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 2805; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2806; NONEON-NOSVE-NEXT: cmp w9, w8 2807; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2808; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2809; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2810; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2811; NONEON-NOSVE-NEXT: cmp w9, w8 2812; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2813; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2814; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2815; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2816; NONEON-NOSVE-NEXT: cmp w9, w8 2817; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2818; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2819; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2820; NONEON-NOSVE-NEXT: add sp, sp, #32 2821; NONEON-NOSVE-NEXT: ret 2822 %res = call <4 x i16> @llvm.umin.v4i16(<4 x i16> %op1, <4 x i16> %op2) 2823 ret <4 x i16> %res 2824} 2825 2826define <8 x i16> @umin_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 2827; CHECK-LABEL: umin_v8i16: 2828; CHECK: // %bb.0: 2829; CHECK-NEXT: ptrue p0.h, vl8 2830; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2831; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2832; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h 2833; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2834; CHECK-NEXT: ret 2835; 2836; NONEON-NOSVE-LABEL: umin_v8i16: 2837; NONEON-NOSVE: // %bb.0: 2838; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2839; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2840; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2841; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2842; NONEON-NOSVE-NEXT: cmp w9, w8 2843; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2844; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2845; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2846; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2847; NONEON-NOSVE-NEXT: cmp w9, w8 2848; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2849; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2850; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2851; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2852; NONEON-NOSVE-NEXT: cmp w9, w8 2853; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2854; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2855; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2856; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2857; NONEON-NOSVE-NEXT: cmp w9, w8 2858; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2859; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2860; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2861; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2862; NONEON-NOSVE-NEXT: cmp w9, w8 2863; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2864; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2865; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2866; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2867; NONEON-NOSVE-NEXT: cmp w9, w8 2868; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2869; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2870; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2871; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2872; NONEON-NOSVE-NEXT: cmp w9, w8 2873; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2874; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2875; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2876; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2877; NONEON-NOSVE-NEXT: cmp w9, w8 2878; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2879; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2880; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2881; NONEON-NOSVE-NEXT: add sp, sp, #48 2882; NONEON-NOSVE-NEXT: ret 2883 %res = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %op1, <8 x i16> %op2) 2884 ret <8 x i16> %res 2885} 2886 2887define void @umin_v16i16(ptr %a, ptr %b) { 2888; CHECK-LABEL: umin_v16i16: 2889; CHECK: // %bb.0: 2890; CHECK-NEXT: ldp q0, q3, [x1] 2891; CHECK-NEXT: ptrue p0.h, vl8 2892; CHECK-NEXT: ldp q1, q2, [x0] 2893; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h 2894; CHECK-NEXT: movprfx z1, z2 2895; CHECK-NEXT: umin z1.h, p0/m, z1.h, z3.h 2896; CHECK-NEXT: stp q0, q1, [x0] 2897; CHECK-NEXT: ret 2898; 2899; NONEON-NOSVE-LABEL: umin_v16i16: 2900; NONEON-NOSVE: // %bb.0: 2901; NONEON-NOSVE-NEXT: sub sp, sp, #96 2902; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2903; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2904; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2905; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2906; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2907; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 2908; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 2909; NONEON-NOSVE-NEXT: cmp w9, w8 2910; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2911; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 2912; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 2913; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 2914; NONEON-NOSVE-NEXT: cmp w9, w8 2915; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2916; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 2917; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 2918; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 2919; NONEON-NOSVE-NEXT: cmp w9, w8 2920; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2921; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 2922; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 2923; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 2924; NONEON-NOSVE-NEXT: cmp w9, w8 2925; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2926; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 2927; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 2928; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 2929; NONEON-NOSVE-NEXT: cmp w9, w8 2930; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2931; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 2932; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 2933; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 2934; NONEON-NOSVE-NEXT: cmp w9, w8 2935; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2936; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 2937; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 2938; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 2939; NONEON-NOSVE-NEXT: cmp w9, w8 2940; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2941; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 2942; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 2943; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 2944; NONEON-NOSVE-NEXT: cmp w9, w8 2945; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2946; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2947; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 2948; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2949; NONEON-NOSVE-NEXT: cmp w9, w8 2950; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2951; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2952; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 2953; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2954; NONEON-NOSVE-NEXT: cmp w9, w8 2955; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2956; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2957; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2958; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2959; NONEON-NOSVE-NEXT: cmp w9, w8 2960; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2961; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2962; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 2963; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2964; NONEON-NOSVE-NEXT: cmp w9, w8 2965; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2966; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2967; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2968; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2969; NONEON-NOSVE-NEXT: cmp w9, w8 2970; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2971; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2972; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 2973; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2974; NONEON-NOSVE-NEXT: cmp w9, w8 2975; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2976; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2977; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 2978; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2979; NONEON-NOSVE-NEXT: cmp w9, w8 2980; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2981; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2982; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 2983; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2984; NONEON-NOSVE-NEXT: cmp w9, w8 2985; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 2986; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 2987; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2988; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2989; NONEON-NOSVE-NEXT: add sp, sp, #96 2990; NONEON-NOSVE-NEXT: ret 2991 %op1 = load <16 x i16>, ptr %a 2992 %op2 = load <16 x i16>, ptr %b 2993 %res = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %op1, <16 x i16> %op2) 2994 store <16 x i16> %res, ptr %a 2995 ret void 2996} 2997 2998define <2 x i32> @umin_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 2999; CHECK-LABEL: umin_v2i32: 3000; CHECK: // %bb.0: 3001; CHECK-NEXT: ptrue p0.s, vl2 3002; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3003; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 3004; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s 3005; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3006; CHECK-NEXT: ret 3007; 3008; NONEON-NOSVE-LABEL: umin_v2i32: 3009; NONEON-NOSVE: // %bb.0: 3010; NONEON-NOSVE-NEXT: sub sp, sp, #32 3011; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 3012; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 3013; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 3014; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 3015; NONEON-NOSVE-NEXT: cmp w10, w8 3016; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3017; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 3018; NONEON-NOSVE-NEXT: cmp w9, w8 3019; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3020; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 3021; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 3022; NONEON-NOSVE-NEXT: add sp, sp, #32 3023; NONEON-NOSVE-NEXT: ret 3024 %res = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %op1, <2 x i32> %op2) 3025 ret <2 x i32> %res 3026} 3027 3028define <4 x i32> @umin_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 3029; CHECK-LABEL: umin_v4i32: 3030; CHECK: // %bb.0: 3031; CHECK-NEXT: ptrue p0.s, vl4 3032; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3033; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 3034; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s 3035; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 3036; CHECK-NEXT: ret 3037; 3038; NONEON-NOSVE-LABEL: umin_v4i32: 3039; NONEON-NOSVE: // %bb.0: 3040; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 3041; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 3042; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 3043; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 3044; NONEON-NOSVE-NEXT: cmp w10, w8 3045; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3046; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 3047; NONEON-NOSVE-NEXT: cmp w9, w8 3048; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3049; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 3050; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 3051; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 3052; NONEON-NOSVE-NEXT: cmp w10, w8 3053; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3054; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 3055; NONEON-NOSVE-NEXT: cmp w9, w8 3056; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3057; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 3058; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 3059; NONEON-NOSVE-NEXT: add sp, sp, #48 3060; NONEON-NOSVE-NEXT: ret 3061 %res = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %op1, <4 x i32> %op2) 3062 ret <4 x i32> %res 3063} 3064 3065define void @umin_v8i32(ptr %a, ptr %b) { 3066; CHECK-LABEL: umin_v8i32: 3067; CHECK: // %bb.0: 3068; CHECK-NEXT: ldp q0, q3, [x1] 3069; CHECK-NEXT: ptrue p0.s, vl4 3070; CHECK-NEXT: ldp q1, q2, [x0] 3071; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s 3072; CHECK-NEXT: movprfx z1, z2 3073; CHECK-NEXT: umin z1.s, p0/m, z1.s, z3.s 3074; CHECK-NEXT: stp q0, q1, [x0] 3075; CHECK-NEXT: ret 3076; 3077; NONEON-NOSVE-LABEL: umin_v8i32: 3078; NONEON-NOSVE: // %bb.0: 3079; NONEON-NOSVE-NEXT: sub sp, sp, #96 3080; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 3081; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 3082; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 3083; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 3084; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 3085; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 3086; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 3087; NONEON-NOSVE-NEXT: cmp w10, w8 3088; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3089; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 3090; NONEON-NOSVE-NEXT: cmp w9, w8 3091; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3092; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 3093; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 3094; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 3095; NONEON-NOSVE-NEXT: cmp w10, w8 3096; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3097; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 3098; NONEON-NOSVE-NEXT: cmp w9, w8 3099; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3100; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 3101; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 3102; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 3103; NONEON-NOSVE-NEXT: cmp w10, w8 3104; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3105; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 3106; NONEON-NOSVE-NEXT: cmp w9, w8 3107; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3108; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 3109; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 3110; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 3111; NONEON-NOSVE-NEXT: cmp w10, w8 3112; NONEON-NOSVE-NEXT: csel w11, w10, w8, lo 3113; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 3114; NONEON-NOSVE-NEXT: cmp w9, w8 3115; NONEON-NOSVE-NEXT: csel w8, w9, w8, lo 3116; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 3117; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 3118; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 3119; NONEON-NOSVE-NEXT: add sp, sp, #96 3120; NONEON-NOSVE-NEXT: ret 3121 %op1 = load <8 x i32>, ptr %a 3122 %op2 = load <8 x i32>, ptr %b 3123 %res = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %op1, <8 x i32> %op2) 3124 store <8 x i32> %res, ptr %a 3125 ret void 3126} 3127 3128; Vector i64 min are not legal for NEON so use SVE when available. 3129define <1 x i64> @umin_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 3130; CHECK-LABEL: umin_v1i64: 3131; CHECK: // %bb.0: 3132; CHECK-NEXT: ptrue p0.d, vl1 3133; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3134; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 3135; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d 3136; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3137; CHECK-NEXT: ret 3138; 3139; NONEON-NOSVE-LABEL: umin_v1i64: 3140; NONEON-NOSVE: // %bb.0: 3141; NONEON-NOSVE-NEXT: sub sp, sp, #16 3142; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 3143; NONEON-NOSVE-NEXT: fmov x8, d1 3144; NONEON-NOSVE-NEXT: fmov x9, d0 3145; NONEON-NOSVE-NEXT: cmp x9, x8 3146; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo 3147; NONEON-NOSVE-NEXT: str x8, [sp, #8] 3148; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 3149; NONEON-NOSVE-NEXT: add sp, sp, #16 3150; NONEON-NOSVE-NEXT: ret 3151 %res = call <1 x i64> @llvm.umin.v1i64(<1 x i64> %op1, <1 x i64> %op2) 3152 ret <1 x i64> %res 3153} 3154 3155; Vector i64 min are not legal for NEON so use SVE when available. 3156define <2 x i64> @umin_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 3157; CHECK-LABEL: umin_v2i64: 3158; CHECK: // %bb.0: 3159; CHECK-NEXT: ptrue p0.d, vl2 3160; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3161; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 3162; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d 3163; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 3164; CHECK-NEXT: ret 3165; 3166; NONEON-NOSVE-LABEL: umin_v2i64: 3167; NONEON-NOSVE: // %bb.0: 3168; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 3169; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 3170; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 3171; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 3172; NONEON-NOSVE-NEXT: cmp x10, x8 3173; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo 3174; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 3175; NONEON-NOSVE-NEXT: cmp x9, x8 3176; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo 3177; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 3178; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 3179; NONEON-NOSVE-NEXT: add sp, sp, #48 3180; NONEON-NOSVE-NEXT: ret 3181 %res = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %op1, <2 x i64> %op2) 3182 ret <2 x i64> %res 3183} 3184 3185define void @umin_v4i64(ptr %a, ptr %b) { 3186; CHECK-LABEL: umin_v4i64: 3187; CHECK: // %bb.0: 3188; CHECK-NEXT: ldp q0, q3, [x1] 3189; CHECK-NEXT: ptrue p0.d, vl2 3190; CHECK-NEXT: ldp q1, q2, [x0] 3191; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d 3192; CHECK-NEXT: movprfx z1, z2 3193; CHECK-NEXT: umin z1.d, p0/m, z1.d, z3.d 3194; CHECK-NEXT: stp q0, q1, [x0] 3195; CHECK-NEXT: ret 3196; 3197; NONEON-NOSVE-LABEL: umin_v4i64: 3198; NONEON-NOSVE: // %bb.0: 3199; NONEON-NOSVE-NEXT: sub sp, sp, #96 3200; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 3201; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 3202; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 3203; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 3204; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 3205; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 3206; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 3207; NONEON-NOSVE-NEXT: cmp x10, x8 3208; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo 3209; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 3210; NONEON-NOSVE-NEXT: cmp x9, x8 3211; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo 3212; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 3213; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 3214; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 3215; NONEON-NOSVE-NEXT: cmp x10, x8 3216; NONEON-NOSVE-NEXT: csel x11, x10, x8, lo 3217; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 3218; NONEON-NOSVE-NEXT: cmp x9, x8 3219; NONEON-NOSVE-NEXT: csel x8, x9, x8, lo 3220; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 3221; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 3222; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 3223; NONEON-NOSVE-NEXT: add sp, sp, #96 3224; NONEON-NOSVE-NEXT: ret 3225 %op1 = load <4 x i64>, ptr %a 3226 %op2 = load <4 x i64>, ptr %b 3227 %res = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %op1, <4 x i64> %op2) 3228 store <4 x i64> %res, ptr %a 3229 ret void 3230} 3231 3232declare <8 x i8> @llvm.smin.v8i8(<8 x i8>, <8 x i8>) 3233declare <16 x i8> @llvm.smin.v16i8(<16 x i8>, <16 x i8>) 3234declare <32 x i8> @llvm.smin.v32i8(<32 x i8>, <32 x i8>) 3235declare <4 x i16> @llvm.smin.v4i16(<4 x i16>, <4 x i16>) 3236declare <8 x i16> @llvm.smin.v8i16(<8 x i16>, <8 x i16>) 3237declare <16 x i16> @llvm.smin.v16i16(<16 x i16>, <16 x i16>) 3238declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>) 3239declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>) 3240declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>) 3241declare <1 x i64> @llvm.smin.v1i64(<1 x i64>, <1 x i64>) 3242declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>) 3243declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>) 3244 3245declare <8 x i8> @llvm.smax.v8i8(<8 x i8>, <8 x i8>) 3246declare <16 x i8> @llvm.smax.v16i8(<16 x i8>, <16 x i8>) 3247declare <32 x i8> @llvm.smax.v32i8(<32 x i8>, <32 x i8>) 3248declare <4 x i16> @llvm.smax.v4i16(<4 x i16>, <4 x i16>) 3249declare <8 x i16> @llvm.smax.v8i16(<8 x i16>, <8 x i16>) 3250declare <16 x i16> @llvm.smax.v16i16(<16 x i16>, <16 x i16>) 3251declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>) 3252declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>) 3253declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>) 3254declare <1 x i64> @llvm.smax.v1i64(<1 x i64>, <1 x i64>) 3255declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>) 3256declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>) 3257 3258declare <8 x i8> @llvm.umin.v8i8(<8 x i8>, <8 x i8>) 3259declare <16 x i8> @llvm.umin.v16i8(<16 x i8>, <16 x i8>) 3260declare <32 x i8> @llvm.umin.v32i8(<32 x i8>, <32 x i8>) 3261declare <4 x i16> @llvm.umin.v4i16(<4 x i16>, <4 x i16>) 3262declare <8 x i16> @llvm.umin.v8i16(<8 x i16>, <8 x i16>) 3263declare <16 x i16> @llvm.umin.v16i16(<16 x i16>, <16 x i16>) 3264declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>) 3265declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>) 3266declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>) 3267declare <1 x i64> @llvm.umin.v1i64(<1 x i64>, <1 x i64>) 3268declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>) 3269declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>) 3270 3271declare <8 x i8> @llvm.umax.v8i8(<8 x i8>, <8 x i8>) 3272declare <16 x i8> @llvm.umax.v16i8(<16 x i8>, <16 x i8>) 3273declare <32 x i8> @llvm.umax.v32i8(<32 x i8>, <32 x i8>) 3274declare <4 x i16> @llvm.umax.v4i16(<4 x i16>, <4 x i16>) 3275declare <8 x i16> @llvm.umax.v8i16(<8 x i16>, <8 x i16>) 3276declare <16 x i16> @llvm.umax.v16i16(<16 x i16>, <16 x i16>) 3277declare <2 x i32> @llvm.umax.v2i32(<2 x i32>, <2 x i32>) 3278declare <4 x i32> @llvm.umax.v4i32(<4 x i32>, <4 x i32>) 3279declare <8 x i32> @llvm.umax.v8i32(<8 x i32>, <8 x i32>) 3280declare <1 x i64> @llvm.umax.v1i64(<1 x i64>, <1 x i64>) 3281declare <2 x i64> @llvm.umax.v2i64(<2 x i64>, <2 x i64>) 3282declare <4 x i64> @llvm.umax.v4i64(<4 x i64>, <4 x i64>) 3283