Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -1296,6 +1296,7 @@ setCondCodeAction(ISD::SETUGE, VT, Expand); setCondCodeAction(ISD::SETUGT, VT, Expand); setCondCodeAction(ISD::SETUEQ, VT, Expand); + setCondCodeAction(ISD::SETONE, VT, Expand); setCondCodeAction(ISD::SETUNE, VT, Expand); } @@ -1551,6 +1552,7 @@ setCondCodeAction(ISD::SETUGE, VT, Expand); setCondCodeAction(ISD::SETUGT, VT, Expand); setCondCodeAction(ISD::SETUEQ, VT, Expand); + setCondCodeAction(ISD::SETONE, VT, Expand); setCondCodeAction(ISD::SETUNE, VT, Expand); } Index: llvm/test/CodeGen/AArch64/sve-fcmp.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-fcmp.ll +++ llvm/test/CodeGen/AArch64/sve-fcmp.ll @@ -50,7 +50,9 @@ ; CHECK-LABEL: one: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.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 @@ -69,8 +71,9 @@ ; CHECK-LABEL: ueq: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -147,8 +150,9 @@ ; CHECK-LABEL: ueq_2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fcmne p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -166,8 +170,9 @@ ; CHECK-LABEL: ueq_2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fcmne p1.d, p0/z, z0.d, z1.d -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -185,8 +190,9 @@ ; CHECK-LABEL: ueq_2f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fcmne p1.h, p0/z, z0.h, z1.h -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -204,8 +210,9 @@ ; CHECK-LABEL: ueq_4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p1.h, p0/z, z0.h, z1.h -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -223,8 +230,9 @@ ; CHECK-LABEL: ueq_8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: fcmne p1.h, p0/z, z0.h, z1.h -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 @@ -357,7 +365,9 @@ ; CHECK-LABEL: one_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 +; 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 @@ -365,9 +375,11 @@ define @ueq_zero( %x) { ; CHECK-LABEL: ueq_zero: ; CHECK: // %bb.0: +; CHECK-NEXT: mov z1.s, #0 // =0x0 ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p1.s, p0/z, z0.s, #0.0 -; CHECK-NEXT: not p0.b, p0/z, p1.b +; 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 Index: llvm/test/CodeGen/AArch64/sve-fixed-length-float-compares.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-fixed-length-float-compares.ll +++ llvm/test/CodeGen/AArch64/sve-fixed-length-float-compares.ll @@ -367,10 +367,10 @@ ; CHECK-NEXT: ptrue p0.h, vl16 ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] ; CHECK-NEXT: ld1h { z1.h }, p0/z, [x1] -; CHECK-NEXT: fcmne p1.h, p0/z, z0.h, z1.h -; CHECK-NEXT: mov z1.h, #-1 // =0xffffffffffffffff +; CHECK-NEXT: fcmuo p1.h, p0/z, z0.h, z1.h +; CHECK-NEXT: fcmeq p2.h, p0/z, z0.h, z1.h +; CHECK-NEXT: mov p1.b, p2/m, p2.b ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff -; CHECK-NEXT: eor z0.d, z0.d, z1.d ; CHECK-NEXT: st1h { z0.h }, p0, [x2] ; CHECK-NEXT: ret %op1 = load <16 x half>, <16 x half>* %a @@ -391,7 +391,9 @@ ; CHECK-NEXT: ptrue p0.h, vl16 ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] ; CHECK-NEXT: ld1h { z1.h }, p0/z, [x1] -; CHECK-NEXT: fcmne p1.h, p0/z, z0.h, z1.h +; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z0.h +; CHECK-NEXT: fcmgt p2.h, p0/z, z0.h, z1.h +; CHECK-NEXT: mov p1.b, p2/m, p2.b ; CHECK-NEXT: mov z0.h, p1/z, #-1 // =0xffffffffffffffff ; CHECK-NEXT: st1h { z0.h }, p0, [x2] ; CHECK-NEXT: ret Index: llvm/test/CodeGen/AArch64/sve-select.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-select.ll +++ llvm/test/CodeGen/AArch64/sve-select.ll @@ -547,7 +547,9 @@ ; CHECK-LABEL: select_f32_invert_fmul: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 +; 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: fmul z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %p = fcmp oeq %a, zeroinitializer @@ -560,7 +562,9 @@ ; CHECK-LABEL: select_f32_invert_fadd: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 +; 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: fadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %p = fcmp oeq %a, zeroinitializer @@ -573,7 +577,9 @@ ; CHECK-LABEL: select_f32_invert_fsub: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, #0.0 +; 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: fsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %p = fcmp oeq %a, zeroinitializer