1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK 3 4; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax, 5; @llvm.smin, @llvm.umin. 6 7; tests for smax: 8 9define <vscale x 16 x i8> @smax_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 10; CHECK-LABEL: smax_select_i8: 11; CHECK: // %bb.0: 12; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b 13; CHECK-NEXT: ret 14 %sel = call <vscale x 16 x i8> @llvm.smax.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 15 %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a 16 ret <vscale x 16 x i8> %out 17} 18 19define <vscale x 8 x i16> @smax_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 20; CHECK-LABEL: smax_select_i16: 21; CHECK: // %bb.0: 22; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h 23; CHECK-NEXT: ret 24 %sel = call <vscale x 8 x i16> @llvm.smax.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 25 %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a 26 ret <vscale x 8 x i16> %out 27} 28 29define <vscale x 4 x i32> @smax_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 30; CHECK-LABEL: smax_select_i32: 31; CHECK: // %bb.0: 32; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s 33; CHECK-NEXT: ret 34 %sel = call <vscale x 4 x i32> @llvm.smax.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 35 %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a 36 ret <vscale x 4 x i32> %out 37} 38 39define <vscale x 2 x i64> @smax_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 40; CHECK-LABEL: smax_select_i64: 41; CHECK: // %bb.0: 42; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d 43; CHECK-NEXT: ret 44 %sel = call <vscale x 2 x i64> @llvm.smax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 45 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a 46 ret <vscale x 2 x i64> %out 47} 48 49; tests for umax: 50 51define <vscale x 16 x i8> @umax_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 52; CHECK-LABEL: umax_select_i8: 53; CHECK: // %bb.0: 54; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b 55; CHECK-NEXT: ret 56 %sel = call <vscale x 16 x i8> @llvm.umax.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 57 %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a 58 ret <vscale x 16 x i8> %out 59} 60 61define <vscale x 8 x i16> @umax_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 62; CHECK-LABEL: umax_select_i16: 63; CHECK: // %bb.0: 64; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h 65; CHECK-NEXT: ret 66 %sel = call <vscale x 8 x i16> @llvm.umax.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 67 %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a 68 ret <vscale x 8 x i16> %out 69} 70 71define <vscale x 4 x i32> @umax_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 72; CHECK-LABEL: umax_select_i32: 73; CHECK: // %bb.0: 74; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s 75; CHECK-NEXT: ret 76 %sel = call <vscale x 4 x i32> @llvm.umax.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 77 %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a 78 ret <vscale x 4 x i32> %out 79} 80 81define <vscale x 2 x i64> @umax_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 82; CHECK-LABEL: umax_select_i64: 83; CHECK: // %bb.0: 84; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d 85; CHECK-NEXT: ret 86 %sel = call <vscale x 2 x i64> @llvm.umax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 87 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a 88 ret <vscale x 2 x i64> %out 89} 90 91; tests for smin: 92 93define <vscale x 16 x i8> @smin_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 94; CHECK-LABEL: smin_select_i8: 95; CHECK: // %bb.0: 96; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b 97; CHECK-NEXT: ret 98 %sel = call <vscale x 16 x i8> @llvm.smin.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 99 %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a 100 ret <vscale x 16 x i8> %out 101} 102 103define <vscale x 8 x i16> @smin_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 104; CHECK-LABEL: smin_select_i16: 105; CHECK: // %bb.0: 106; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h 107; CHECK-NEXT: ret 108 %sel = call <vscale x 8 x i16> @llvm.smin.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 109 %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a 110 ret <vscale x 8 x i16> %out 111} 112 113define <vscale x 4 x i32> @smin_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 114; CHECK-LABEL: smin_select_i32: 115; CHECK: // %bb.0: 116; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s 117; CHECK-NEXT: ret 118 %sel = call <vscale x 4 x i32> @llvm.smin.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 119 %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a 120 ret <vscale x 4 x i32> %out 121} 122 123define <vscale x 2 x i64> @smin_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 124; CHECK-LABEL: smin_select_i64: 125; CHECK: // %bb.0: 126; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d 127; CHECK-NEXT: ret 128 %sel = call <vscale x 2 x i64> @llvm.smin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 129 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a 130 ret <vscale x 2 x i64> %out 131} 132 133; tests for umin: 134 135define <vscale x 16 x i8> @umin_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 136; CHECK-LABEL: umin_select_i8: 137; CHECK: // %bb.0: 138; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b 139; CHECK-NEXT: ret 140 %sel = call <vscale x 16 x i8> @llvm.umin.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 141 %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a 142 ret <vscale x 16 x i8> %out 143} 144 145define <vscale x 8 x i16> @umin_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 146; CHECK-LABEL: umin_select_i16: 147; CHECK: // %bb.0: 148; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h 149; CHECK-NEXT: ret 150 %sel = call <vscale x 8 x i16> @llvm.umin.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 151 %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a 152 ret <vscale x 8 x i16> %out 153} 154 155define <vscale x 4 x i32> @umin_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 156; CHECK-LABEL: umin_select_i32: 157; CHECK: // %bb.0: 158; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s 159; CHECK-NEXT: ret 160 %sel = call <vscale x 4 x i32> @llvm.umin.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 161 %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a 162 ret <vscale x 4 x i32> %out 163} 164 165define <vscale x 2 x i64> @umin_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 166; CHECK-LABEL: umin_select_i64: 167; CHECK: // %bb.0: 168; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d 169; CHECK-NEXT: ret 170 %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 171 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a 172 ret <vscale x 2 x i64> %out 173} 174 175 176define <vscale x 2 x i64> @umin_select_i64_multiuse(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b, ptr %p) { 177; CHECK-LABEL: umin_select_i64_multiuse: 178; CHECK: // %bb.0: 179; CHECK-NEXT: ptrue p1.d 180; CHECK-NEXT: umin z1.d, p1/m, z1.d, z0.d 181; CHECK-NEXT: mov z0.d, p0/m, z1.d 182; CHECK-NEXT: st1d { z1.d }, p1, [x0] 183; CHECK-NEXT: ret 184 %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 185 store <vscale x 2 x i64> %sel, ptr %p 186 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a 187 ret <vscale x 2 x i64> %out 188} 189 190define <vscale x 2 x i64> @smin_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 191; CHECK-LABEL: smin_select_i64_c: 192; CHECK: // %bb.0: 193; CHECK-NEXT: smin z1.d, p0/m, z1.d, z0.d 194; CHECK-NEXT: mov z0.d, z1.d 195; CHECK-NEXT: ret 196 %sel = call <vscale x 2 x i64> @llvm.smin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 197 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b 198 ret <vscale x 2 x i64> %out 199} 200 201define <vscale x 2 x i64> @smax_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 202; CHECK-LABEL: smax_select_i64_c: 203; CHECK: // %bb.0: 204; CHECK-NEXT: smax z1.d, p0/m, z1.d, z0.d 205; CHECK-NEXT: mov z0.d, z1.d 206; CHECK-NEXT: ret 207 %sel = call <vscale x 2 x i64> @llvm.smax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 208 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b 209 ret <vscale x 2 x i64> %out 210} 211 212define <vscale x 2 x i64> @umin_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 213; CHECK-LABEL: umin_select_i64_c: 214; CHECK: // %bb.0: 215; CHECK-NEXT: umin z1.d, p0/m, z1.d, z0.d 216; CHECK-NEXT: mov z0.d, z1.d 217; CHECK-NEXT: ret 218 %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 219 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b 220 ret <vscale x 2 x i64> %out 221} 222 223define <vscale x 2 x i64> @umax_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 224; CHECK-LABEL: umax_select_i64_c: 225; CHECK: // %bb.0: 226; CHECK-NEXT: umax z1.d, p0/m, z1.d, z0.d 227; CHECK-NEXT: mov z0.d, z1.d 228; CHECK-NEXT: ret 229 %sel = call <vscale x 2 x i64> @llvm.umax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 230 %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b 231 ret <vscale x 2 x i64> %out 232} 233 234 235declare <vscale x 16 x i8> @llvm.smax.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 236declare <vscale x 8 x i16> @llvm.smax.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 237declare <vscale x 4 x i32> @llvm.smax.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 238declare <vscale x 2 x i64> @llvm.smax.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 239 240declare <vscale x 16 x i8> @llvm.umax.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 241declare <vscale x 8 x i16> @llvm.umax.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 242declare <vscale x 4 x i32> @llvm.umax.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 243declare <vscale x 2 x i64> @llvm.umax.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 244 245declare <vscale x 16 x i8> @llvm.smin.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 246declare <vscale x 8 x i16> @llvm.smin.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 247declare <vscale x 4 x i32> @llvm.smin.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 248declare <vscale x 2 x i64> @llvm.smin.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 249 250declare <vscale x 16 x i8> @llvm.umin.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 251declare <vscale x 8 x i16> @llvm.umin.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 252declare <vscale x 4 x i32> @llvm.umin.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 253declare <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 254