| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=sparc -verify-machineinstrs -disable-strictnode-mutation < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=SOFT32 | |
| ; RUN: llc -mtriple=sparcv9 -verify-machineinstrs -disable-strictnode-mutation < %s \ | |
| ; RUN: | FileCheck %s --check-prefix=SOFT64 | |
| ;; Every predicate of a constrained soft-quad f128 compare. Quiet compares call | |
| ;; _Q_cmp/_Qp_cmp and signaling compares call _Q_cmpe/_Qp_cmpe; the result, | |
| ;; 0 (equal), 1 (less), 2 (greater) or 3 (unordered), is then decoded per | |
| ;; predicate. | |
| define i32 @fcmp_oeq(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_oeq: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 0 | |
| ; SOFT32-NEXT: be .LBB0_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB0_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_oeq: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ogt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ogt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: be .LBB1_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB1_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ogt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_oge(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_oge: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT32-NEXT: be .LBB2_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB2_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_oge: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"oge", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_olt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_olt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: be .LBB3_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB3_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_olt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ole(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ole: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: bcs .LBB4_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB4_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ole: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: movcs %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ole", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_one(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_one: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: add %o0, -1, %i0 | |
| ; SOFT32-NEXT: cmp %i0, 2 | |
| ; SOFT32-NEXT: bcs .LBB5_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB5_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_one: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: add %o0, -1, %i1 | |
| ; SOFT64-NEXT: cmp %i1, 2 | |
| ; SOFT64-NEXT: movcs %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"one", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ord(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ord: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 3 | |
| ; SOFT32-NEXT: bne .LBB6_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB6_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ord: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 3 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ord", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ueq(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ueq: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: add %o0, 1, %i0 | |
| ; SOFT32-NEXT: andcc %i0, 2, %g0 | |
| ; SOFT32-NEXT: be .LBB7_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB7_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ueq: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: add %o0, 1, %i1 | |
| ; SOFT64-NEXT: andcc %i1, 2, %g0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ugt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ugt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: bgu .LBB8_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB8_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ugt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: movgu %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_uge(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_uge: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: bne .LBB9_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB9_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_uge: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"uge", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ult(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ult: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT32-NEXT: bne .LBB10_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB10_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ult: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ult", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_ule(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ule: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: bne .LBB11_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB11_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_ule: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ule", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_une(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_une: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 0 | |
| ; SOFT32-NEXT: bne .LBB12_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB12_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_une: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 0 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"une", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmp_uno(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_uno: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmp | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 3 | |
| ; SOFT32-NEXT: be .LBB13_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB13_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmp_uno: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmp | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 3 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"uno", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_oeq(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_oeq: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 0 | |
| ; SOFT32-NEXT: be .LBB14_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB14_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_oeq: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ogt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ogt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: be .LBB15_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB15_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ogt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_oge(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_oge: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT32-NEXT: be .LBB16_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB16_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_oge: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"oge", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_olt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_olt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: be .LBB17_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB17_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_olt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ole(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ole: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: bcs .LBB18_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB18_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ole: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: movcs %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ole", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_one(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_one: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: add %o0, -1, %i0 | |
| ; SOFT32-NEXT: cmp %i0, 2 | |
| ; SOFT32-NEXT: bcs .LBB19_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB19_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_one: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: add %o0, -1, %i1 | |
| ; SOFT64-NEXT: cmp %i1, 2 | |
| ; SOFT64-NEXT: movcs %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"one", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ord(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ord: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 3 | |
| ; SOFT32-NEXT: bne .LBB20_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB20_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ord: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 3 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ord", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ueq(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ueq: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: add %o0, 1, %i0 | |
| ; SOFT32-NEXT: andcc %i0, 2, %g0 | |
| ; SOFT32-NEXT: be .LBB21_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB21_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ueq: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: add %o0, 1, %i1 | |
| ; SOFT64-NEXT: andcc %i1, 2, %g0 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ugt(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ugt: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: bgu .LBB22_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB22_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ugt: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: movgu %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_uge(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_uge: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 1 | |
| ; SOFT32-NEXT: bne .LBB23_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB23_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_uge: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 1 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"uge", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ult(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ult: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT32-NEXT: bne .LBB24_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB24_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ult: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: andcc %o0, 1, %g0 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ult", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_ule(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_ule: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 2 | |
| ; SOFT32-NEXT: bne .LBB25_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB25_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_ule: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 2 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ule", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_une(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_une: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 0 | |
| ; SOFT32-NEXT: bne .LBB26_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB26_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_une: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 0 | |
| ; SOFT64-NEXT: movne %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"une", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } | |
| define i32 @fcmps_uno(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_uno: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ldd [%i1], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f6, [%fp+-24] | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: call _Q_cmpe | |
| ; SOFT32-NEXT: add %fp, -32, %o1 | |
| ; SOFT32-NEXT: cmp %o0, 3 | |
| ; SOFT32-NEXT: be .LBB27_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %g0, %o0 | |
| ; SOFT32-NEXT: .LBB27_2: | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, 1, %o0 | |
| ; | |
| ; SOFT64-LABEL: fcmps_uno: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: std %f4, [%fp+2015] | |
| ; SOFT64-NEXT: std %f6, [%fp+2023] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_cmpe | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: mov %g0, %i0 | |
| ; SOFT64-NEXT: cmp %o0, 3 | |
| ; SOFT64-NEXT: move %icc, 1, %i0 | |
| ; SOFT64-NEXT: srl %i0, 0, %i0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"uno", metadata !"fpexcept.strict") strictfp | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } |