663 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s3 4define <vscale x 4 x i1> @oeq(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {5; CHECK-LABEL: oeq:6; CHECK: // %bb.0:7; CHECK-NEXT: ptrue p0.s8; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s9; CHECK-NEXT: ret10 %y = fcmp oeq <vscale x 4 x float> %x, %x211 ret <vscale x 4 x i1> %y12}13define <vscale x 4 x i1> @ogt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {14; CHECK-LABEL: ogt:15; CHECK: // %bb.0:16; CHECK-NEXT: ptrue p0.s17; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s18; CHECK-NEXT: ret19 %y = fcmp ogt <vscale x 4 x float> %x, %x220 ret <vscale x 4 x i1> %y21}22define <vscale x 4 x i1> @oge(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {23; CHECK-LABEL: oge:24; CHECK: // %bb.0:25; CHECK-NEXT: ptrue p0.s26; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s27; CHECK-NEXT: ret28 %y = fcmp oge <vscale x 4 x float> %x, %x229 ret <vscale x 4 x i1> %y30}31define <vscale x 4 x i1> @olt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {32; CHECK-LABEL: olt:33; CHECK: // %bb.0:34; CHECK-NEXT: ptrue p0.s35; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s36; CHECK-NEXT: ret37 %y = fcmp olt <vscale x 4 x float> %x, %x238 ret <vscale x 4 x i1> %y39}40define <vscale x 4 x i1> @ole(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {41; CHECK-LABEL: ole:42; CHECK: // %bb.0:43; CHECK-NEXT: ptrue p0.s44; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s45; CHECK-NEXT: ret46 %y = fcmp ole <vscale x 4 x float> %x, %x247 ret <vscale x 4 x i1> %y48}49define <vscale x 4 x i1> @one(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {50; CHECK-LABEL: one:51; CHECK: // %bb.0:52; CHECK-NEXT: ptrue p0.s53; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s54; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s55; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b56; CHECK-NEXT: ret57 %y = fcmp one <vscale x 4 x float> %x, %x258 ret <vscale x 4 x i1> %y59}60define <vscale x 4 x i1> @ord(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {61; CHECK-LABEL: ord:62; CHECK: // %bb.0:63; CHECK-NEXT: ptrue p0.s64; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s65; CHECK-NEXT: not p0.b, p0/z, p1.b66; CHECK-NEXT: ret67 %y = fcmp ord <vscale x 4 x float> %x, %x268 ret <vscale x 4 x i1> %y69}70define <vscale x 4 x i1> @ueq(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {71; CHECK-LABEL: ueq:72; CHECK: // %bb.0:73; CHECK-NEXT: ptrue p0.s74; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s75; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s76; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b77; CHECK-NEXT: ret78 %y = fcmp ueq <vscale x 4 x float> %x, %x279 ret <vscale x 4 x i1> %y80}81define <vscale x 4 x i1> @ugt(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {82; CHECK-LABEL: ugt:83; CHECK: // %bb.0:84; CHECK-NEXT: ptrue p0.s85; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z0.s86; CHECK-NEXT: not p0.b, p0/z, p1.b87; CHECK-NEXT: ret88 %y = fcmp ugt <vscale x 4 x float> %x, %x289 ret <vscale x 4 x i1> %y90}91define <vscale x 4 x i1> @uge(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {92; CHECK-LABEL: uge:93; CHECK: // %bb.0:94; CHECK-NEXT: ptrue p0.s95; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s96; CHECK-NEXT: not p0.b, p0/z, p1.b97; CHECK-NEXT: ret98 %y = fcmp uge <vscale x 4 x float> %x, %x299 ret <vscale x 4 x i1> %y100}101define <vscale x 4 x i1> @ult(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {102; CHECK-LABEL: ult:103; CHECK: // %bb.0:104; CHECK-NEXT: ptrue p0.s105; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s106; CHECK-NEXT: not p0.b, p0/z, p1.b107; CHECK-NEXT: ret108 %y = fcmp ult <vscale x 4 x float> %x, %x2109 ret <vscale x 4 x i1> %y110}111define <vscale x 4 x i1> @ule(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {112; CHECK-LABEL: ule:113; CHECK: // %bb.0:114; CHECK-NEXT: ptrue p0.s115; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s116; CHECK-NEXT: not p0.b, p0/z, p1.b117; CHECK-NEXT: ret118 %y = fcmp ule <vscale x 4 x float> %x, %x2119 ret <vscale x 4 x i1> %y120}121define <vscale x 4 x i1> @une(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {122; CHECK-LABEL: une:123; CHECK: // %bb.0:124; CHECK-NEXT: ptrue p0.s125; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s126; CHECK-NEXT: ret127 %y = fcmp une <vscale x 4 x float> %x, %x2128 ret <vscale x 4 x i1> %y129}130define <vscale x 4 x i1> @uno(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {131; CHECK-LABEL: uno:132; CHECK: // %bb.0:133; CHECK-NEXT: ptrue p0.s134; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z1.s135; CHECK-NEXT: ret136 %y = fcmp uno <vscale x 4 x float> %x, %x2137 ret <vscale x 4 x i1> %y138}139define <vscale x 2 x i1> @oeq_2f32(<vscale x 2 x float> %x, <vscale x 2 x float> %x2) {140; CHECK-LABEL: oeq_2f32:141; CHECK: // %bb.0:142; CHECK-NEXT: ptrue p0.d143; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s144; CHECK-NEXT: ret145 %y = fcmp oeq <vscale x 2 x float> %x, %x2146 ret <vscale x 2 x i1> %y147}148define <vscale x 2 x i1> @ueq_2f32(<vscale x 2 x float> %x, <vscale x 2 x float> %x2) {149; CHECK-LABEL: ueq_2f32:150; CHECK: // %bb.0:151; CHECK-NEXT: ptrue p0.d152; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s153; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s154; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b155; CHECK-NEXT: ret156 %y = fcmp ueq <vscale x 2 x float> %x, %x2157 ret <vscale x 2 x i1> %y158}159define <vscale x 2 x i1> @oeq_2f64(<vscale x 2 x double> %x, <vscale x 2 x double> %x2) {160; CHECK-LABEL: oeq_2f64:161; CHECK: // %bb.0:162; CHECK-NEXT: ptrue p0.d163; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d164; CHECK-NEXT: ret165 %y = fcmp oeq <vscale x 2 x double> %x, %x2166 ret <vscale x 2 x i1> %y167}168define <vscale x 2 x i1> @ueq_2f64(<vscale x 2 x double> %x, <vscale x 2 x double> %x2) {169; CHECK-LABEL: ueq_2f64:170; CHECK: // %bb.0:171; CHECK-NEXT: ptrue p0.d172; CHECK-NEXT: fcmuo p1.d, p0/z, z0.d, z1.d173; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d174; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b175; CHECK-NEXT: ret176 %y = fcmp ueq <vscale x 2 x double> %x, %x2177 ret <vscale x 2 x i1> %y178}179define <vscale x 2 x i1> @oeq_2f16(<vscale x 2 x half> %x, <vscale x 2 x half> %x2) {180; CHECK-LABEL: oeq_2f16:181; CHECK: // %bb.0:182; CHECK-NEXT: ptrue p0.d183; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h184; CHECK-NEXT: ret185 %y = fcmp oeq <vscale x 2 x half> %x, %x2186 ret <vscale x 2 x i1> %y187}188define <vscale x 2 x i1> @ueq_2f16(<vscale x 2 x half> %x, <vscale x 2 x half> %x2) {189; CHECK-LABEL: ueq_2f16:190; CHECK: // %bb.0:191; CHECK-NEXT: ptrue p0.d192; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h193; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h194; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b195; CHECK-NEXT: ret196 %y = fcmp ueq <vscale x 2 x half> %x, %x2197 ret <vscale x 2 x i1> %y198}199define <vscale x 4 x i1> @oeq_4f16(<vscale x 4 x half> %x, <vscale x 4 x half> %x2) {200; CHECK-LABEL: oeq_4f16:201; CHECK: // %bb.0:202; CHECK-NEXT: ptrue p0.s203; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h204; CHECK-NEXT: ret205 %y = fcmp oeq <vscale x 4 x half> %x, %x2206 ret <vscale x 4 x i1> %y207}208define <vscale x 4 x i1> @ueq_4f16(<vscale x 4 x half> %x, <vscale x 4 x half> %x2) {209; CHECK-LABEL: ueq_4f16:210; CHECK: // %bb.0:211; CHECK-NEXT: ptrue p0.s212; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h213; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h214; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b215; CHECK-NEXT: ret216 %y = fcmp ueq <vscale x 4 x half> %x, %x2217 ret <vscale x 4 x i1> %y218}219define <vscale x 8 x i1> @oeq_8f16(<vscale x 8 x half> %x, <vscale x 8 x half> %x2) {220; CHECK-LABEL: oeq_8f16:221; CHECK: // %bb.0:222; CHECK-NEXT: ptrue p0.h223; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h224; CHECK-NEXT: ret225 %y = fcmp oeq <vscale x 8 x half> %x, %x2226 ret <vscale x 8 x i1> %y227}228define <vscale x 8 x i1> @ueq_8f16(<vscale x 8 x half> %x, <vscale x 8 x half> %x2) {229; CHECK-LABEL: ueq_8f16:230; CHECK: // %bb.0:231; CHECK-NEXT: ptrue p0.h232; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h233; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h234; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b235; CHECK-NEXT: ret236 %y = fcmp ueq <vscale x 8 x half> %x, %x2237 ret <vscale x 8 x i1> %y238}239 240define <vscale x 4 x i32> @oeq_4f32_sext(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {241; CHECK-LABEL: oeq_4f32_sext:242; CHECK: // %bb.0:243; CHECK-NEXT: ptrue p0.s244; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s245; CHECK-NEXT: mov z0.s, p0/z, #-1 // =0xffffffffffffffff246; CHECK-NEXT: ret247 %y = fcmp oeq <vscale x 4 x float> %x, %x2248 %r = sext <vscale x 4 x i1> %y to <vscale x 4 x i32>249 ret <vscale x 4 x i32> %r250}251 252define <vscale x 4 x i32> @oeq_4f32_zext(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {253; CHECK-LABEL: oeq_4f32_zext:254; CHECK: // %bb.0:255; CHECK-NEXT: ptrue p0.s256; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s257; CHECK-NEXT: mov z0.s, p0/z, #1 // =0x1258; CHECK-NEXT: ret259 %y = fcmp oeq <vscale x 4 x float> %x, %x2260 %r = zext <vscale x 4 x i1> %y to <vscale x 4 x i32>261 ret <vscale x 4 x i32> %r262}263 264define <vscale x 4 x i1> @eq_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {265; CHECK-LABEL: eq_fast:266; CHECK: // %bb.0:267; CHECK-NEXT: ptrue p0.s268; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s269; CHECK-NEXT: ret270 %y = fcmp fast oeq <vscale x 4 x float> %x, %x2271 ret <vscale x 4 x i1> %y272}273define <vscale x 4 x i1> @gt_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {274; CHECK-LABEL: gt_fast:275; CHECK: // %bb.0:276; CHECK-NEXT: ptrue p0.s277; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s278; CHECK-NEXT: ret279 %y = fcmp fast ogt <vscale x 4 x float> %x, %x2280 ret <vscale x 4 x i1> %y281}282define <vscale x 4 x i1> @ge_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {283; CHECK-LABEL: ge_fast:284; CHECK: // %bb.0:285; CHECK-NEXT: ptrue p0.s286; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s287; CHECK-NEXT: ret288 %y = fcmp fast oge <vscale x 4 x float> %x, %x2289 ret <vscale x 4 x i1> %y290}291define <vscale x 4 x i1> @lt_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {292; CHECK-LABEL: lt_fast:293; CHECK: // %bb.0:294; CHECK-NEXT: ptrue p0.s295; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s296; CHECK-NEXT: ret297 %y = fcmp fast olt <vscale x 4 x float> %x, %x2298 ret <vscale x 4 x i1> %y299}300define <vscale x 4 x i1> @le_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {301; CHECK-LABEL: le_fast:302; CHECK: // %bb.0:303; CHECK-NEXT: ptrue p0.s304; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s305; CHECK-NEXT: ret306 %y = fcmp fast ole <vscale x 4 x float> %x, %x2307 ret <vscale x 4 x i1> %y308}309define <vscale x 4 x i1> @ne_fast(<vscale x 4 x float> %x, <vscale x 4 x float> %x2) {310; CHECK-LABEL: ne_fast:311; CHECK: // %bb.0:312; CHECK-NEXT: ptrue p0.s313; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s314; CHECK-NEXT: ret315 %y = fcmp fast one <vscale x 4 x float> %x, %x2316 ret <vscale x 4 x i1> %y317}318define <vscale x 4 x i1> @oeq_zero(<vscale x 4 x float> %x) {319; CHECK-LABEL: oeq_zero:320; CHECK: // %bb.0:321; CHECK-NEXT: ptrue p0.s322; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0323; CHECK-NEXT: ret324 %y = fcmp oeq <vscale x 4 x float> %x, zeroinitializer325 ret <vscale x 4 x i1> %y326}327define <vscale x 4 x i1> @ogt_zero(<vscale x 4 x float> %x) {328; CHECK-LABEL: ogt_zero:329; CHECK: // %bb.0:330; CHECK-NEXT: ptrue p0.s331; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, #0.0332; CHECK-NEXT: ret333 %y = fcmp ogt <vscale x 4 x float> %x, zeroinitializer334 ret <vscale x 4 x i1> %y335}336define <vscale x 4 x i1> @oge_zero(<vscale x 4 x float> %x) {337; CHECK-LABEL: oge_zero:338; CHECK: // %bb.0:339; CHECK-NEXT: ptrue p0.s340; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, #0.0341; CHECK-NEXT: ret342 %y = fcmp oge <vscale x 4 x float> %x, zeroinitializer343 ret <vscale x 4 x i1> %y344}345define <vscale x 4 x i1> @olt_zero(<vscale x 4 x float> %x) {346; CHECK-LABEL: olt_zero:347; CHECK: // %bb.0:348; CHECK-NEXT: ptrue p0.s349; CHECK-NEXT: fcmlt p0.s, p0/z, z0.s, #0.0350; CHECK-NEXT: ret351 %y = fcmp olt <vscale x 4 x float> %x, zeroinitializer352 ret <vscale x 4 x i1> %y353}354define <vscale x 4 x i1> @ole_zero(<vscale x 4 x float> %x) {355; CHECK-LABEL: ole_zero:356; CHECK: // %bb.0:357; CHECK-NEXT: ptrue p0.s358; CHECK-NEXT: fcmle p0.s, p0/z, z0.s, #0.0359; CHECK-NEXT: ret360 %y = fcmp ole <vscale x 4 x float> %x, zeroinitializer361 ret <vscale x 4 x i1> %y362}363define <vscale x 4 x i1> @one_zero(<vscale x 4 x float> %x) {364; CHECK-LABEL: one_zero:365; CHECK: // %bb.0:366; CHECK-NEXT: ptrue p0.s367; CHECK-NEXT: fcmlt p1.s, p0/z, z0.s, #0.0368; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, #0.0369; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b370; CHECK-NEXT: ret371 %y = fcmp one <vscale x 4 x float> %x, zeroinitializer372 ret <vscale x 4 x i1> %y373}374define <vscale x 4 x i1> @ueq_zero(<vscale x 4 x float> %x) {375; CHECK-LABEL: ueq_zero:376; CHECK: // %bb.0:377; CHECK-NEXT: movi v1.2d, #0000000000000000378; CHECK-NEXT: ptrue p0.s379; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s380; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0381; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b382; CHECK-NEXT: ret383 %y = fcmp ueq <vscale x 4 x float> %x, zeroinitializer384 ret <vscale x 4 x i1> %y385}386define <vscale x 4 x i1> @ugt_zero(<vscale x 4 x float> %x) {387; CHECK-LABEL: ugt_zero:388; CHECK: // %bb.0:389; CHECK-NEXT: ptrue p0.s390; CHECK-NEXT: fcmle p1.s, p0/z, z0.s, #0.0391; CHECK-NEXT: not p0.b, p0/z, p1.b392; CHECK-NEXT: ret393 %y = fcmp ugt <vscale x 4 x float> %x, zeroinitializer394 ret <vscale x 4 x i1> %y395}396define <vscale x 4 x i1> @uge_zero(<vscale x 4 x float> %x) {397; CHECK-LABEL: uge_zero:398; CHECK: // %bb.0:399; CHECK-NEXT: ptrue p0.s400; CHECK-NEXT: fcmlt p1.s, p0/z, z0.s, #0.0401; CHECK-NEXT: not p0.b, p0/z, p1.b402; CHECK-NEXT: ret403 %y = fcmp uge <vscale x 4 x float> %x, zeroinitializer404 ret <vscale x 4 x i1> %y405}406define <vscale x 4 x i1> @ult_zero(<vscale x 4 x float> %x) {407; CHECK-LABEL: ult_zero:408; CHECK: // %bb.0:409; CHECK-NEXT: ptrue p0.s410; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, #0.0411; CHECK-NEXT: not p0.b, p0/z, p1.b412; CHECK-NEXT: ret413 %y = fcmp ult <vscale x 4 x float> %x, zeroinitializer414 ret <vscale x 4 x i1> %y415}416define <vscale x 4 x i1> @ule_zero(<vscale x 4 x float> %x) {417; CHECK-LABEL: ule_zero:418; CHECK: // %bb.0:419; CHECK-NEXT: ptrue p0.s420; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, #0.0421; CHECK-NEXT: not p0.b, p0/z, p1.b422; CHECK-NEXT: ret423 %y = fcmp ule <vscale x 4 x float> %x, zeroinitializer424 ret <vscale x 4 x i1> %y425}426define <vscale x 4 x i1> @une_zero(<vscale x 4 x float> %x) {427; CHECK-LABEL: une_zero:428; CHECK: // %bb.0:429; CHECK-NEXT: ptrue p0.s430; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0431; CHECK-NEXT: ret432 %y = fcmp une <vscale x 4 x float> %x, zeroinitializer433 ret <vscale x 4 x i1> %y434}435define <vscale x 8 x i1> @oeq_zero_pred(<vscale x 8 x i1> %pg, <vscale x 8 x half> %x) {436; CHECK-LABEL: oeq_zero_pred:437; CHECK: // %bb.0:438; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0439; CHECK-NEXT: ret440 %y = fcmp oeq <vscale x 8 x half> %x, zeroinitializer441 %z = and <vscale x 8 x i1> %pg, %y442 ret <vscale x 8 x i1> %z443}444define <vscale x 4 x i1> @ogt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x half> %x) {445; CHECK-LABEL: ogt_zero_pred:446; CHECK: // %bb.0:447; CHECK-NEXT: fcmgt p0.h, p0/z, z0.h, #0.0448; CHECK-NEXT: ret449 %y = fcmp ogt <vscale x 4 x half> %x, zeroinitializer450 %z = and <vscale x 4 x i1> %pg, %y451 ret <vscale x 4 x i1> %z452}453define <vscale x 2 x i1> @oge_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x half> %x) {454; CHECK-LABEL: oge_zero_pred:455; CHECK: // %bb.0:456; CHECK-NEXT: fcmge p0.h, p0/z, z0.h, #0.0457; CHECK-NEXT: ret458 %y = fcmp oge <vscale x 2 x half> %x, zeroinitializer459 %z = and <vscale x 2 x i1> %pg, %y460 ret <vscale x 2 x i1> %z461}462define <vscale x 4 x i1> @olt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {463; CHECK-LABEL: olt_zero_pred:464; CHECK: // %bb.0:465; CHECK-NEXT: fcmlt p0.s, p0/z, z0.s, #0.0466; CHECK-NEXT: ret467 %y = fcmp olt <vscale x 4 x float> %x, zeroinitializer468 %z = and <vscale x 4 x i1> %pg, %y469 ret <vscale x 4 x i1> %z470}471define <vscale x 2 x i1> @ole_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x float> %x) {472; CHECK-LABEL: ole_zero_pred:473; CHECK: // %bb.0:474; CHECK-NEXT: fcmle p0.s, p0/z, z0.s, #0.0475; CHECK-NEXT: ret476 %y = fcmp ole <vscale x 2 x float> %x, zeroinitializer477 %z = and <vscale x 2 x i1> %pg, %y478 ret <vscale x 2 x i1> %z479}480define <vscale x 2 x i1> @une_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {481; CHECK-LABEL: une_zero_pred:482; CHECK: // %bb.0:483; CHECK-NEXT: fcmne p0.d, p0/z, z0.d, #0.0484; CHECK-NEXT: ret485 %y = fcmp une <vscale x 2 x double> %x, zeroinitializer486 %z = and <vscale x 2 x i1> %pg, %y487 ret <vscale x 2 x i1> %z488}489 490%svboolx2 = type { <vscale x 4 x i1>, <vscale x 4 x i1> }491 492define %svboolx2 @and_of_multiuse_fcmp_ogt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {493; CHECK-LABEL: and_of_multiuse_fcmp_ogt:494; CHECK: // %bb.0:495; CHECK-NEXT: ptrue p1.s496; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, z1.s497; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b498; CHECK-NEXT: ret499 %cmp = fcmp ogt <vscale x 4 x float> %x, %y500 %and = and <vscale x 4 x i1> %pg, %cmp501 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0502 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1503 ret %svboolx2 %ins.2504}505 506define %svboolx2 @and_of_multiuse_fcmp_ogt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {507; CHECK-LABEL: and_of_multiuse_fcmp_ogt_zero:508; CHECK: // %bb.0:509; CHECK-NEXT: ptrue p1.s510; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, #0.0511; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b512; CHECK-NEXT: ret513 %cmp = fcmp ogt <vscale x 4 x float> %x, zeroinitializer514 %and = and <vscale x 4 x i1> %pg, %cmp515 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0516 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1517 ret %svboolx2 %ins.2518}519 520define %svboolx2 @and_of_multiuse_fcmp_olt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {521; CHECK-LABEL: and_of_multiuse_fcmp_olt:522; CHECK: // %bb.0:523; CHECK-NEXT: ptrue p1.s524; CHECK-NEXT: fcmgt p1.s, p1/z, z1.s, z0.s525; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b526; CHECK-NEXT: ret527 %cmp = fcmp olt <vscale x 4 x float> %x, %y528 %and = and <vscale x 4 x i1> %pg, %cmp529 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0530 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1531 ret %svboolx2 %ins.2532}533 534define %svboolx2 @and_of_multiuse_fcmp_olt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {535; CHECK-LABEL: and_of_multiuse_fcmp_olt_zero:536; CHECK: // %bb.0:537; CHECK-NEXT: ptrue p1.s538; CHECK-NEXT: fcmlt p1.s, p1/z, z0.s, #0.0539; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b540; CHECK-NEXT: ret541 %cmp = fcmp olt <vscale x 4 x float> %x, zeroinitializer542 %and = and <vscale x 4 x i1> %pg, %cmp543 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0544 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1545 ret %svboolx2 %ins.2546}547 548define <vscale x 8 x i1> @logical_and_oeq_zero_pred(<vscale x 8 x i1> %pg, <vscale x 8 x half> %x) {549; CHECK-LABEL: logical_and_oeq_zero_pred:550; CHECK: // %bb.0:551; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0552; CHECK-NEXT: ret553 %y = fcmp oeq <vscale x 8 x half> %x, zeroinitializer554 %z = select <vscale x 8 x i1> %pg, <vscale x 8 x i1> %y, <vscale x 8 x i1> zeroinitializer555 ret <vscale x 8 x i1> %z556}557 558define <vscale x 4 x i1> @logical_and_ogt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x half> %x) {559; CHECK-LABEL: logical_and_ogt_zero_pred:560; CHECK: // %bb.0:561; CHECK-NEXT: fcmgt p0.h, p0/z, z0.h, #0.0562; CHECK-NEXT: ret563 %y = fcmp ogt <vscale x 4 x half> %x, zeroinitializer564 %z = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %y, <vscale x 4 x i1> zeroinitializer565 ret <vscale x 4 x i1> %z566}567 568define <vscale x 2 x i1> @logical_and_oge_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x half> %x) {569; CHECK-LABEL: logical_and_oge_zero_pred:570; CHECK: // %bb.0:571; CHECK-NEXT: fcmge p0.h, p0/z, z0.h, #0.0572; CHECK-NEXT: ret573 %y = fcmp oge <vscale x 2 x half> %x, zeroinitializer574 %z = select <vscale x 2 x i1> %pg, <vscale x 2 x i1> %y, <vscale x 2 x i1> zeroinitializer575 ret <vscale x 2 x i1> %z576}577 578define <vscale x 4 x i1> @logical_and_olt_zero_pred(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {579; CHECK-LABEL: logical_and_olt_zero_pred:580; CHECK: // %bb.0:581; CHECK-NEXT: fcmlt p0.s, p0/z, z0.s, #0.0582; CHECK-NEXT: ret583 %y = fcmp olt <vscale x 4 x float> %x, zeroinitializer584 %z = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %y, <vscale x 4 x i1> zeroinitializer585 ret <vscale x 4 x i1> %z586}587 588define <vscale x 2 x i1> @logical_and_ole_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x float> %x) {589; CHECK-LABEL: logical_and_ole_zero_pred:590; CHECK: // %bb.0:591; CHECK-NEXT: fcmle p0.s, p0/z, z0.s, #0.0592; CHECK-NEXT: ret593 %y = fcmp ole <vscale x 2 x float> %x, zeroinitializer594 %z = select <vscale x 2 x i1> %pg, <vscale x 2 x i1> %y, <vscale x 2 x i1> zeroinitializer595 ret <vscale x 2 x i1> %z596}597 598define <vscale x 2 x i1> @logical_and_une_zero_pred(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {599; CHECK-LABEL: logical_and_une_zero_pred:600; CHECK: // %bb.0:601; CHECK-NEXT: fcmne p0.d, p0/z, z0.d, #0.0602; CHECK-NEXT: ret603 %y = fcmp une <vscale x 2 x double> %x, zeroinitializer604 %z = select <vscale x 2 x i1> %pg, <vscale x 2 x i1> %y, <vscale x 2 x i1> zeroinitializer605 ret <vscale x 2 x i1> %z606}607 608define %svboolx2 @logical_and_of_multiuse_fcmp_ogt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {609; CHECK-LABEL: logical_and_of_multiuse_fcmp_ogt:610; CHECK: // %bb.0:611; CHECK-NEXT: ptrue p1.s612; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, z1.s613; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b614; CHECK-NEXT: ret615 %cmp = fcmp ogt <vscale x 4 x float> %x, %y616 %and = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %cmp, <vscale x 4 x i1> zeroinitializer617 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0618 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1619 ret %svboolx2 %ins.2620}621 622define %svboolx2 @logical_and_of_multiuse_fcmp_ogt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {623; CHECK-LABEL: logical_and_of_multiuse_fcmp_ogt_zero:624; CHECK: // %bb.0:625; CHECK-NEXT: ptrue p1.s626; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, #0.0627; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b628; CHECK-NEXT: ret629 %cmp = fcmp ogt <vscale x 4 x float> %x, zeroinitializer630 %and = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %cmp, <vscale x 4 x i1> zeroinitializer631 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0632 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1633 ret %svboolx2 %ins.2634}635 636define %svboolx2 @logical_and_of_multiuse_fcmp_olt(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x, <vscale x 4 x float> %y) {637; CHECK-LABEL: logical_and_of_multiuse_fcmp_olt:638; CHECK: // %bb.0:639; CHECK-NEXT: ptrue p1.s640; CHECK-NEXT: fcmgt p1.s, p1/z, z1.s, z0.s641; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b642; CHECK-NEXT: ret643 %cmp = fcmp olt <vscale x 4 x float> %x, %y644 %and = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %cmp, <vscale x 4 x i1> zeroinitializer645 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0646 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1647 ret %svboolx2 %ins.2648}649 650define %svboolx2 @logical_and_of_multiuse_fcmp_olt_zero(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {651; CHECK-LABEL: logical_and_of_multiuse_fcmp_olt_zero:652; CHECK: // %bb.0:653; CHECK-NEXT: ptrue p1.s654; CHECK-NEXT: fcmlt p1.s, p1/z, z0.s, #0.0655; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b656; CHECK-NEXT: ret657 %cmp = fcmp olt <vscale x 4 x float> %x, zeroinitializer658 %and = select <vscale x 4 x i1> %pg, <vscale x 4 x i1> %cmp, <vscale x 4 x i1> zeroinitializer659 %ins.1 = insertvalue %svboolx2 poison, <vscale x 4 x i1> %and, 0660 %ins.2 = insertvalue %svboolx2 %ins.1, <vscale x 4 x i1> %cmp, 1661 ret %svboolx2 %ins.2662}663