; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s define @oeq( %x, %x2) { ; CHECK-LABEL: oeq: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ogt( %x, %x2) { ; CHECK-LABEL: ogt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp ogt %x, %x2 ret %y } define @oge( %x, %x2) { ; CHECK-LABEL: oge: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp oge %x, %x2 ret %y } define @olt( %x, %x2) { ; CHECK-LABEL: olt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s ; CHECK-NEXT: ret %y = fcmp olt %x, %x2 ret %y } define @ole( %x, %x2) { ; CHECK-LABEL: ole: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s ; CHECK-NEXT: ret %y = fcmp ole %x, %x2 ret %y } define @one( %x, %x2) { ; CHECK-LABEL: one: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp one %x, %x2 ret %y } define @ord( %x, %x2) { ; CHECK-LABEL: ord: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ord %x, %x2 ret %y } define @ueq( %x, %x2) { ; CHECK-LABEL: ueq: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @ugt( %x, %x2) { ; CHECK-LABEL: ugt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z0.s ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ugt %x, %x2 ret %y } define @uge( %x, %x2) { ; CHECK-LABEL: uge: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp uge %x, %x2 ret %y } define @ult( %x, %x2) { ; CHECK-LABEL: ult: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ult %x, %x2 ret %y } define @ule( %x, %x2) { ; CHECK-LABEL: ule: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ule %x, %x2 ret %y } define @une( %x, %x2) { ; CHECK-LABEL: une: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp une %x, %x2 ret %y } define @uno( %x, %x2) { ; CHECK-LABEL: uno: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp uno %x, %x2 ret %y } define @oeq_2f32( %x, %x2) { ; CHECK-LABEL: oeq_2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ueq_2f32( %x, %x2) { ; CHECK-LABEL: ueq_2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @oeq_2f64( %x, %x2) { ; CHECK-LABEL: oeq_2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ueq_2f64( %x, %x2) { ; CHECK-LABEL: ueq_2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmuo p1.d, p0/z, z0.d, z1.d ; CHECK-NEXT: fcmeq p0.d, p0/z, z0.d, z1.d ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @oeq_2f16( %x, %x2) { ; CHECK-LABEL: oeq_2f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ueq_2f16( %x, %x2) { ; CHECK-LABEL: ueq_2f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @oeq_4f16( %x, %x2) { ; CHECK-LABEL: oeq_4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ueq_4f16( %x, %x2) { ; CHECK-LABEL: ueq_4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @oeq_8f16( %x, %x2) { ; CHECK-LABEL: oeq_8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 ret %y } define @ueq_8f16( %x, %x2) { ; CHECK-LABEL: ueq_8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, %x2 ret %y } define @oeq_4f32_sext( %x, %x2) { ; CHECK-LABEL: oeq_4f32_sext: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: mov z0.s, p0/z, #-1 // =0xffffffffffffffff ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 %r = sext %y to ret %r } define @oeq_4f32_zext( %x, %x2) { ; CHECK-LABEL: oeq_4f32_zext: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: mov z0.s, p0/z, #1 // =0x1 ; CHECK-NEXT: ret %y = fcmp oeq %x, %x2 %r = zext %y to ret %r } define @eq_fast( %x, %x2) { ; CHECK-LABEL: eq_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp fast oeq %x, %x2 ret %y } define @gt_fast( %x, %x2) { ; CHECK-LABEL: gt_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp fast ogt %x, %x2 ret %y } define @ge_fast( %x, %x2) { ; CHECK-LABEL: ge_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp fast oge %x, %x2 ret %y } define @lt_fast( %x, %x2) { ; CHECK-LABEL: lt_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s ; CHECK-NEXT: ret %y = fcmp fast olt %x, %x2 ret %y } define @le_fast( %x, %x2) { ; CHECK-LABEL: le_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s ; CHECK-NEXT: ret %y = fcmp fast ole %x, %x2 ret %y } define @ne_fast( %x, %x2) { ; CHECK-LABEL: ne_fast: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: ret %y = fcmp fast one %x, %x2 ret %y } define @oeq_zero( %x) { ; CHECK-LABEL: oeq_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp oeq %x, zeroinitializer ret %y } define @ogt_zero( %x) { ; CHECK-LABEL: ogt_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp ogt %x, zeroinitializer ret %y } define @oge_zero( %x) { ; CHECK-LABEL: oge_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp oge %x, zeroinitializer ret %y } define @olt_zero( %x) { ; CHECK-LABEL: olt_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmlt p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp olt %x, zeroinitializer ret %y } define @ole_zero( %x) { ; CHECK-LABEL: ole_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmle p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp ole %x, zeroinitializer ret %y } define @one_zero( %x) { ; CHECK-LABEL: one_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmlt p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp one %x, zeroinitializer ret %y } define @ueq_zero( %x) { ; CHECK-LABEL: ueq_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z1.s, #0 // =0x0 ; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b ; CHECK-NEXT: ret %y = fcmp ueq %x, zeroinitializer ret %y } define @ugt_zero( %x) { ; CHECK-LABEL: ugt_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmle p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ugt %x, zeroinitializer ret %y } define @uge_zero( %x) { ; CHECK-LABEL: uge_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmlt p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp uge %x, zeroinitializer ret %y } define @ult_zero( %x) { ; CHECK-LABEL: ult_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ult %x, zeroinitializer ret %y } define @ule_zero( %x) { ; CHECK-LABEL: ule_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: not p0.b, p0/z, p1.b ; CHECK-NEXT: ret %y = fcmp ule %x, zeroinitializer ret %y } define @une_zero( %x) { ; CHECK-LABEL: une_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp une %x, zeroinitializer ret %y } define @oeq_zero_pred( %pg, %x) { ; CHECK-LABEL: oeq_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: ret %y = fcmp oeq %x, zeroinitializer %z = and %pg, %y ret %z } define @ogt_zero_pred( %pg, %x) { ; CHECK-LABEL: ogt_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmgt p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: ret %y = fcmp ogt %x, zeroinitializer %z = and %pg, %y ret %z } define @oge_zero_pred( %pg, %x) { ; CHECK-LABEL: oge_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmge p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: ret %y = fcmp oge %x, zeroinitializer %z = and %pg, %y ret %z } define @olt_zero_pred( %pg, %x) { ; CHECK-LABEL: olt_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmlt p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp olt %x, zeroinitializer %z = and %pg, %y ret %z } define @ole_zero_pred( %pg, %x) { ; CHECK-LABEL: ole_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmle p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: ret %y = fcmp ole %x, zeroinitializer %z = and %pg, %y ret %z } define @une_zero_pred( %pg, %x) { ; CHECK-LABEL: une_zero_pred: ; CHECK: // %bb.0: ; CHECK-NEXT: fcmne p0.d, p0/z, z0.d, #0.0 ; CHECK-NEXT: ret %y = fcmp une %x, zeroinitializer %z = and %pg, %y ret %z } %svboolx2 = type { , } define %svboolx2 @and_of_multiuse_fcmp_ogt( %pg, %x, %y) { ; CHECK-LABEL: and_of_multiuse_fcmp_ogt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p1.s ; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, z1.s ; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b ; CHECK-NEXT: ret %cmp = fcmp ogt %x, %y %and = and %pg, %cmp %ins.1 = insertvalue %svboolx2 poison, %and, 0 %ins.2 = insertvalue %svboolx2 %ins.1, %cmp, 1 ret %svboolx2 %ins.2 } define %svboolx2 @and_of_multiuse_fcmp_ogt_zero( %pg, %x) { ; CHECK-LABEL: and_of_multiuse_fcmp_ogt_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p1.s ; CHECK-NEXT: fcmgt p1.s, p1/z, z0.s, #0.0 ; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b ; CHECK-NEXT: ret %cmp = fcmp ogt %x, zeroinitializer %and = and %pg, %cmp %ins.1 = insertvalue %svboolx2 poison, %and, 0 %ins.2 = insertvalue %svboolx2 %ins.1, %cmp, 1 ret %svboolx2 %ins.2 } define %svboolx2 @and_of_multiuse_fcmp_olt( %pg, %x, %y) { ; CHECK-LABEL: and_of_multiuse_fcmp_olt: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p1.s ; CHECK-NEXT: fcmgt p1.s, p1/z, z1.s, z0.s ; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b ; CHECK-NEXT: ret %cmp = fcmp olt %x, %y %and = and %pg, %cmp %ins.1 = insertvalue %svboolx2 poison, %and, 0 %ins.2 = insertvalue %svboolx2 %ins.1, %cmp, 1 ret %svboolx2 %ins.2 } define %svboolx2 @and_of_multiuse_fcmp_olt_zero( %pg, %x) { ; CHECK-LABEL: and_of_multiuse_fcmp_olt_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p1.s ; CHECK-NEXT: fcmlt p1.s, p1/z, z0.s, #0.0 ; CHECK-NEXT: and p0.b, p0/z, p0.b, p1.b ; CHECK-NEXT: ret %cmp = fcmp olt %x, zeroinitializer %and = and %pg, %cmp %ins.1 = insertvalue %svboolx2 poison, %and, 0 %ins.2 = insertvalue %svboolx2 %ins.1, %cmp, 1 ret %svboolx2 %ins.2 }