| ; 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 | |
| ; RUN: llc -mtriple=sparc -mattr=+hard-quad-float -verify-machineinstrs \ | |
| ; RUN: -disable-strictnode-mutation < %s | FileCheck %s --check-prefix=HARD32 | |
| ; RUN: llc -mtriple=sparcv9 -mattr=+hard-quad-float -verify-machineinstrs \ | |
| ; RUN: -disable-strictnode-mutation < %s | FileCheck %s --check-prefix=HARD | |
| define fp128 @fadd_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fadd_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -144, %sp | |
| ; SOFT32-NEXT: ldd [%i1], %f0 | |
| ; SOFT32-NEXT: ldd [%i0+8], %f2 | |
| ; SOFT32-NEXT: ldd [%i0], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f2, [%fp+-24] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f0, [%fp+-48] | |
| ; SOFT32-NEXT: std %f6, [%fp+-40] | |
| ; SOFT32-NEXT: add %fp, -16, %i1 | |
| ; SOFT32-NEXT: add %fp, -32, %o0 | |
| ; SOFT32-NEXT: add %fp, -48, %o1 | |
| ; SOFT32-NEXT: call _Q_add | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fadd_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -224, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2023] | |
| ; SOFT64-NEXT: std %f0, [%fp+2015] | |
| ; SOFT64-NEXT: std %f4, [%fp+1999] | |
| ; SOFT64-NEXT: std %f6, [%fp+2007] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: call _Qp_add | |
| ; SOFT64-NEXT: add %fp, 1999, %o2 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fadd_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: ld [%sp+64], %o0 | |
| ; HARD32-NEXT: faddq %f4, %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; | |
| ; HARD-LABEL: fadd_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: faddq %f0, %f4, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.fadd.f128(fp128 %a, fp128 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @fsub_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fsub_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -144, %sp | |
| ; SOFT32-NEXT: ldd [%i1], %f0 | |
| ; SOFT32-NEXT: ldd [%i0+8], %f2 | |
| ; SOFT32-NEXT: ldd [%i0], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f2, [%fp+-24] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f0, [%fp+-48] | |
| ; SOFT32-NEXT: std %f6, [%fp+-40] | |
| ; SOFT32-NEXT: add %fp, -16, %i1 | |
| ; SOFT32-NEXT: add %fp, -32, %o0 | |
| ; SOFT32-NEXT: add %fp, -48, %o1 | |
| ; SOFT32-NEXT: call _Q_sub | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fsub_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -224, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2023] | |
| ; SOFT64-NEXT: std %f0, [%fp+2015] | |
| ; SOFT64-NEXT: std %f4, [%fp+1999] | |
| ; SOFT64-NEXT: std %f6, [%fp+2007] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: call _Qp_sub | |
| ; SOFT64-NEXT: add %fp, 1999, %o2 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fsub_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: ld [%sp+64], %o0 | |
| ; HARD32-NEXT: fsubq %f4, %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; | |
| ; HARD-LABEL: fsub_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fsubq %f0, %f4, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.fsub.f128(fp128 %a, fp128 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @fmul_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fmul_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -144, %sp | |
| ; SOFT32-NEXT: ldd [%i1], %f0 | |
| ; SOFT32-NEXT: ldd [%i0+8], %f2 | |
| ; SOFT32-NEXT: ldd [%i0], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f2, [%fp+-24] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f0, [%fp+-48] | |
| ; SOFT32-NEXT: std %f6, [%fp+-40] | |
| ; SOFT32-NEXT: add %fp, -16, %i1 | |
| ; SOFT32-NEXT: add %fp, -32, %o0 | |
| ; SOFT32-NEXT: add %fp, -48, %o1 | |
| ; SOFT32-NEXT: call _Q_mul | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fmul_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -224, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2023] | |
| ; SOFT64-NEXT: std %f0, [%fp+2015] | |
| ; SOFT64-NEXT: std %f4, [%fp+1999] | |
| ; SOFT64-NEXT: std %f6, [%fp+2007] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: call _Qp_mul | |
| ; SOFT64-NEXT: add %fp, 1999, %o2 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fmul_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: ld [%sp+64], %o0 | |
| ; HARD32-NEXT: fmulq %f4, %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; | |
| ; HARD-LABEL: fmul_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fmulq %f0, %f4, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.fmul.f128(fp128 %a, fp128 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @fdiv_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fdiv_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -144, %sp | |
| ; SOFT32-NEXT: ldd [%i1], %f0 | |
| ; SOFT32-NEXT: ldd [%i0+8], %f2 | |
| ; SOFT32-NEXT: ldd [%i0], %f4 | |
| ; SOFT32-NEXT: ldd [%i1+8], %f6 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f2, [%fp+-24] | |
| ; SOFT32-NEXT: std %f4, [%fp+-32] | |
| ; SOFT32-NEXT: std %f0, [%fp+-48] | |
| ; SOFT32-NEXT: std %f6, [%fp+-40] | |
| ; SOFT32-NEXT: add %fp, -16, %i1 | |
| ; SOFT32-NEXT: add %fp, -32, %o0 | |
| ; SOFT32-NEXT: add %fp, -48, %o1 | |
| ; SOFT32-NEXT: call _Q_div | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fdiv_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -224, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2023] | |
| ; SOFT64-NEXT: std %f0, [%fp+2015] | |
| ; SOFT64-NEXT: std %f4, [%fp+1999] | |
| ; SOFT64-NEXT: std %f6, [%fp+2007] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: call _Qp_div | |
| ; SOFT64-NEXT: add %fp, 1999, %o2 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fdiv_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: ld [%sp+64], %o0 | |
| ; HARD32-NEXT: fdivq %f4, %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; | |
| ; HARD-LABEL: fdiv_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fdivq %f0, %f4, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.fdiv.f128(fp128 %a, fp128 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @fsqrt_f128(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fsqrt_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f0, [%fp+-24] | |
| ; SOFT32-NEXT: std %f2, [%fp+-32] | |
| ; SOFT32-NEXT: add %fp, -16, %i1 | |
| ; SOFT32-NEXT: add %fp, -32, %o0 | |
| ; SOFT32-NEXT: call _Q_sqrt | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fsqrt_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -208, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2023] | |
| ; SOFT64-NEXT: std %f0, [%fp+2015] | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: call _Qp_sqrt | |
| ; SOFT64-NEXT: add %fp, 2015, %o1 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fsqrt_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o0], %f0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f2 | |
| ; HARD32-NEXT: ld [%sp+64], %o0 | |
| ; HARD32-NEXT: fsqrtq %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; | |
| ; HARD-LABEL: fsqrt_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fsqrtq %f0, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.sqrt.f128(fp128 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @fpext_f64_f128(double %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fpext_f64_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -128, %sp | |
| ; SOFT32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1 | |
| ; SOFT32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1 | |
| ; SOFT32-NEXT: std %i0, [%fp+-8] | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ld [%fp+64], %i0 | |
| ; SOFT32-NEXT: std %f0, [%fp+-32] | |
| ; SOFT32-NEXT: add %fp, -24, %i1 | |
| ; SOFT32-NEXT: st %i1, [%sp+64] | |
| ; SOFT32-NEXT: call _Q_dtoq | |
| ; SOFT32-NEXT: ldd [%fp+-32], %o0 | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-24], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i0+8] | |
| ; SOFT32-NEXT: std %f2, [%i0] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fpext_f64_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: fmovd %f0, %f2 | |
| ; SOFT64-NEXT: call _Qp_dtoq | |
| ; SOFT64-NEXT: nop | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fpext_f64_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: add %sp, -104, %sp | |
| ; HARD32-NEXT: ! kill: def $o1 killed $o1 killed $o0_o1 def $o0_o1 | |
| ; HARD32-NEXT: ! kill: def $o0 killed $o0 killed $o0_o1 def $o0_o1 | |
| ; HARD32-NEXT: std %o0, [%sp+96] | |
| ; HARD32-NEXT: ldd [%sp+96], %f0 | |
| ; HARD32-NEXT: ld [%sp+168], %o0 | |
| ; HARD32-NEXT: fdtoq %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: add %sp, 104, %sp | |
| ; | |
| ; HARD-LABEL: fpext_f64_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fdtoq %f0, %f0 | |
| %r = call fp128 @llvm.experimental.constrained.fpext.f128.f64(double %a, metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define double @fptrunc_f128_f64(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fptrunc_f128_f64: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: call _Q_qtod | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fptrunc_f128_f64: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: call _Qp_qtod | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fptrunc_f128_f64: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o0], %f0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f2 | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: fqtod %f0, %f0 | |
| ; | |
| ; HARD-LABEL: fptrunc_f128_f64: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fqtod %f0, %f0 | |
| %r = call double @llvm.experimental.constrained.fptrunc.f64.f128(fp128 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret double %r | |
| } | |
| define float @fptrunc_f128_f32(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fptrunc_f128_f32: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: call _Q_qtos | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fptrunc_f128_f32: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: call _Qp_qtos | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fptrunc_f128_f32: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o0], %f0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f2 | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: fqtos %f0, %f0 | |
| ; | |
| ; HARD-LABEL: fptrunc_f128_f32: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: fqtos %f0, %f0 | |
| %r = call float @llvm.experimental.constrained.fptrunc.f32.f128(fp128 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret float %r | |
| } | |
| define i32 @fptosi_f128_i32(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fptosi_f128_i32: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: call _Q_qtoi | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %o0, %o0 | |
| ; | |
| ; SOFT64-LABEL: fptosi_f128_i32: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: call _Qp_qtoi | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore %g0, %o0, %o0 | |
| ; | |
| ; HARD32-LABEL: fptosi_f128_i32: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: add %sp, -96, %sp | |
| ; HARD32-NEXT: ldd [%o0], %f0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f2 | |
| ; HARD32-NEXT: fqtoi %f0, %f0 | |
| ; HARD32-NEXT: st %f0, [%sp+92] | |
| ; HARD32-NEXT: ld [%sp+92], %o0 | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: add %sp, 96, %sp | |
| ; | |
| ; HARD-LABEL: fptosi_f128_i32: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: fqtoi %f0, %f0 | |
| ; HARD-NEXT: st %f0, [%sp+2187] | |
| ; HARD-NEXT: ld [%sp+2187], %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call i32 @llvm.experimental.constrained.fptosi.i32.f128(fp128 %a, metadata !"fpexcept.strict") strictfp | |
| ret i32 %r | |
| } | |
| define i64 @fptosi_f128_i64(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fptosi_f128_i64: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: call _Q_qtoll | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: mov %o0, %i0 | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %o1, %o1 | |
| ; | |
| ; SOFT64-LABEL: fptosi_f128_i64: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: call _Qp_qtox | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore %g0, %o0, %o0 | |
| ; | |
| ; HARD32-LABEL: fptosi_f128_i64: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: save %sp, -112, %sp | |
| ; HARD32-NEXT: ldd [%i0+8], %f0 | |
| ; HARD32-NEXT: ldd [%i0], %f2 | |
| ; HARD32-NEXT: std %f0, [%fp+-8] | |
| ; HARD32-NEXT: std %f2, [%fp+-16] | |
| ; HARD32-NEXT: call _Q_qtoll | |
| ; HARD32-NEXT: add %fp, -16, %o0 | |
| ; HARD32-NEXT: mov %o0, %i0 | |
| ; HARD32-NEXT: ret | |
| ; HARD32-NEXT: restore %g0, %o1, %o1 | |
| ; | |
| ; HARD-LABEL: fptosi_f128_i64: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: fqtox %f0, %f0 | |
| ; HARD-NEXT: std %f0, [%sp+2183] | |
| ; HARD-NEXT: ldx [%sp+2183], %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call i64 @llvm.experimental.constrained.fptosi.i64.f128(fp128 %a, metadata !"fpexcept.strict") strictfp | |
| ret i64 %r | |
| } | |
| define i32 @fptoui_f128_i32(fp128 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: fptoui_f128_i32: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ldd [%i0+8], %f0 | |
| ; SOFT32-NEXT: ldd [%i0], %f2 | |
| ; SOFT32-NEXT: std %f0, [%fp+-8] | |
| ; SOFT32-NEXT: std %f2, [%fp+-16] | |
| ; SOFT32-NEXT: call _Q_qtou | |
| ; SOFT32-NEXT: add %fp, -16, %o0 | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore %g0, %o0, %o0 | |
| ; | |
| ; SOFT64-LABEL: fptoui_f128_i32: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: std %f2, [%fp+2039] | |
| ; SOFT64-NEXT: std %f0, [%fp+2031] | |
| ; SOFT64-NEXT: call _Qp_qtoui | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore %g0, %o0, %o0 | |
| ; | |
| ; HARD32-LABEL: fptoui_f128_i32: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: add %sp, -96, %sp | |
| ; HARD32-NEXT: ldd [%o0], %f0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f2 | |
| ; HARD32-NEXT: sethi %hi(.LCPI10_0), %o0 | |
| ; HARD32-NEXT: ldd [%o0+%lo(.LCPI10_0)], %f4 | |
| ; HARD32-NEXT: add %o0, %lo(.LCPI10_0), %o0 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpeq %f0, %f4 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbl .LBB10_2 | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: mov %o0, %o1 | |
| ; HARD32-NEXT: cmp %o1, 0 | |
| ; HARD32-NEXT: bne .LBB10_3 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ba .LBB10_4 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: .LBB10_2: | |
| ; HARD32-NEXT: mov 1, %o1 | |
| ; HARD32-NEXT: cmp %o1, 0 | |
| ; HARD32-NEXT: be .LBB10_4 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: .LBB10_3: | |
| ; HARD32-NEXT: sethi %hi(.LCPI10_1), %o2 | |
| ; HARD32-NEXT: ldd [%o2+%lo(.LCPI10_1)], %f4 | |
| ; HARD32-NEXT: add %o2, %lo(.LCPI10_1), %o2 | |
| ; HARD32-NEXT: ldd [%o2+8], %f6 | |
| ; HARD32-NEXT: .LBB10_4: | |
| ; HARD32-NEXT: fsubq %f0, %f4, %f0 | |
| ; HARD32-NEXT: fqtoi %f0, %f0 | |
| ; HARD32-NEXT: cmp %o1, 0 | |
| ; HARD32-NEXT: bne .LBB10_6 | |
| ; HARD32-NEXT: st %f0, [%sp+92] | |
| ; HARD32-NEXT: ! %bb.5: | |
| ; HARD32-NEXT: sethi 2097152, %o0 | |
| ; HARD32-NEXT: .LBB10_6: | |
| ; HARD32-NEXT: ld [%sp+92], %o1 | |
| ; HARD32-NEXT: xor %o1, %o0, %o0 | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: add %sp, 96, %sp | |
| ; | |
| ; HARD-LABEL: fptoui_f128_i32: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: sethi %h44(.LCPI10_0), %o1 | |
| ; HARD-NEXT: add %o1, %m44(.LCPI10_0), %o1 | |
| ; HARD-NEXT: sllx %o1, 12, %o1 | |
| ; HARD-NEXT: ldq [%o1+%l44(.LCPI10_0)], %f4 | |
| ; HARD-NEXT: sethi %h44(.LCPI10_1), %o1 | |
| ; HARD-NEXT: add %o1, %m44(.LCPI10_1), %o1 | |
| ; HARD-NEXT: sllx %o1, 12, %o1 | |
| ; HARD-NEXT: ldq [%o1+%l44(.LCPI10_1)], %f8 | |
| ; HARD-NEXT: fcmpeq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movl %fcc0, 1, %o0 | |
| ; HARD-NEXT: cmp %o0, 0 | |
| ; HARD-NEXT: fmovqne %icc, %f8, %f4 | |
| ; HARD-NEXT: fsubq %f0, %f4, %f0 | |
| ; HARD-NEXT: fqtoi %f0, %f0 | |
| ; HARD-NEXT: st %f0, [%sp+2187] | |
| ; HARD-NEXT: ld [%sp+2187], %o1 | |
| ; HARD-NEXT: cmp %o0, 0 | |
| ; HARD-NEXT: sethi 2097152, %o0 | |
| ; HARD-NEXT: movne %icc, 0, %o0 | |
| ; HARD-NEXT: xor %o1, %o0, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call i32 @llvm.experimental.constrained.fptoui.i32.f128(fp128 %a, metadata !"fpexcept.strict") strictfp | |
| ret i32 %r | |
| } | |
| define fp128 @sitofp_i32_f128(i32 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: sitofp_i32_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ld [%fp+64], %i1 | |
| ; SOFT32-NEXT: mov %i0, %o0 | |
| ; SOFT32-NEXT: add %fp, -16, %i0 | |
| ; SOFT32-NEXT: call _Q_itoq | |
| ; SOFT32-NEXT: st %i0, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i1+8] | |
| ; SOFT32-NEXT: std %f2, [%i1] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: sitofp_i32_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: mov %i0, %o1 | |
| ; SOFT64-NEXT: call _Qp_itoq | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: sitofp_i32_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: add %sp, -96, %sp | |
| ; HARD32-NEXT: st %o0, [%sp+92] | |
| ; HARD32-NEXT: ld [%sp+92], %f0 | |
| ; HARD32-NEXT: ld [%sp+160], %o0 | |
| ; HARD32-NEXT: fitoq %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: add %sp, 96, %sp | |
| ; | |
| ; HARD-LABEL: sitofp_i32_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: st %o0, [%sp+2187] | |
| ; HARD-NEXT: ld [%sp+2187], %f0 | |
| ; HARD-NEXT: fitoq %f0, %f0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call fp128 @llvm.experimental.constrained.sitofp.f128.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @sitofp_i64_f128(i64 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: sitofp_i64_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ld [%fp+64], %i2 | |
| ; SOFT32-NEXT: mov %i1, %o1 | |
| ; SOFT32-NEXT: mov %i0, %o0 | |
| ; SOFT32-NEXT: add %fp, -16, %i0 | |
| ; SOFT32-NEXT: call _Q_lltoq | |
| ; SOFT32-NEXT: st %i0, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i2+8] | |
| ; SOFT32-NEXT: std %f2, [%i2] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: sitofp_i64_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: mov %i0, %o1 | |
| ; SOFT64-NEXT: call _Qp_xtoq | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: sitofp_i64_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: save %sp, -112, %sp | |
| ; HARD32-NEXT: ld [%fp+64], %i2 | |
| ; HARD32-NEXT: mov %i1, %o1 | |
| ; HARD32-NEXT: mov %i0, %o0 | |
| ; HARD32-NEXT: add %fp, -16, %i0 | |
| ; HARD32-NEXT: call _Q_lltoq | |
| ; HARD32-NEXT: st %i0, [%sp+64] | |
| ; HARD32-NEXT: unimp 16 | |
| ; HARD32-NEXT: ldd [%fp+-8], %f0 | |
| ; HARD32-NEXT: ldd [%fp+-16], %f2 | |
| ; HARD32-NEXT: std %f0, [%i2+8] | |
| ; HARD32-NEXT: std %f2, [%i2] | |
| ; HARD32-NEXT: ret | |
| ; HARD32-NEXT: restore | |
| ; | |
| ; HARD-LABEL: sitofp_i64_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: stx %o0, [%sp+2183] | |
| ; HARD-NEXT: ldd [%sp+2183], %f0 | |
| ; HARD-NEXT: fxtoq %f0, %f0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call fp128 @llvm.experimental.constrained.sitofp.f128.i64(i64 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| define fp128 @uitofp_i32_f128(i32 %a) nounwind strictfp { | |
| ; SOFT32-LABEL: uitofp_i32_f128: | |
| ; SOFT32: ! %bb.0: | |
| ; SOFT32-NEXT: save %sp, -112, %sp | |
| ; SOFT32-NEXT: ld [%fp+64], %i1 | |
| ; SOFT32-NEXT: mov %i0, %o0 | |
| ; SOFT32-NEXT: add %fp, -16, %i0 | |
| ; SOFT32-NEXT: call _Q_utoq | |
| ; SOFT32-NEXT: st %i0, [%sp+64] | |
| ; SOFT32-NEXT: unimp 16 | |
| ; SOFT32-NEXT: ldd [%fp+-8], %f0 | |
| ; SOFT32-NEXT: ldd [%fp+-16], %f2 | |
| ; SOFT32-NEXT: std %f0, [%i1+8] | |
| ; SOFT32-NEXT: std %f2, [%i1] | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: uitofp_i32_f128: | |
| ; SOFT64: ! %bb.0: | |
| ; SOFT64-NEXT: save %sp, -192, %sp | |
| ; SOFT64-NEXT: mov %i0, %o1 | |
| ; SOFT64-NEXT: call _Qp_uitoq | |
| ; SOFT64-NEXT: add %fp, 2031, %o0 | |
| ; SOFT64-NEXT: ldd [%fp+2031], %f0 | |
| ; SOFT64-NEXT: ldd [%fp+2039], %f2 | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: uitofp_i32_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: add %sp, -104, %sp | |
| ; HARD32-NEXT: add %sp, 96, %o1 | |
| ; HARD32-NEXT: or %o1, 4, %o1 | |
| ; HARD32-NEXT: st %o0, [%o1] | |
| ; HARD32-NEXT: sethi 1100800, %o0 | |
| ; HARD32-NEXT: st %o0, [%sp+96] | |
| ; HARD32-NEXT: ldd [%sp+96], %f0 | |
| ; HARD32-NEXT: sethi %hi(.LCPI13_0), %o0 | |
| ; HARD32-NEXT: ldd [%o0+%lo(.LCPI13_0)], %f2 | |
| ; HARD32-NEXT: ld [%sp+168], %o0 | |
| ; HARD32-NEXT: fsubd %f0, %f2, %f0 | |
| ; HARD32-NEXT: fdtoq %f0, %f0 | |
| ; HARD32-NEXT: std %f2, [%o0+8] | |
| ; HARD32-NEXT: std %f0, [%o0] | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: add %sp, 104, %sp | |
| ; | |
| ; HARD-LABEL: uitofp_i32_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: add %sp, -144, %sp | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| ; HARD-NEXT: stx %o0, [%sp+2183] | |
| ; HARD-NEXT: ldd [%sp+2183], %f0 | |
| ; HARD-NEXT: fxtoq %f0, %f0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: add %sp, 144, %sp | |
| %r = call fp128 @llvm.experimental.constrained.uitofp.f128.i32(i32 %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp | |
| ret fp128 %r | |
| } | |
| ;; Soft-quad compares use _Q[p]_cmp (quiet) or _Q[p]_cmpe (signaling). | |
| define i32 @fcmp_olt_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_olt_f128: | |
| ; 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 .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: fcmp_olt_f128: | |
| ; 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 | |
| ; | |
| ; HARD32-LABEL: fcmp_olt_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbl .LBB14_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: .LBB14_2: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov 1, %o0 | |
| ; | |
| ; HARD-LABEL: fcmp_olt_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: fcmpq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movl %fcc0, 1, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| %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 @fcmps_olt_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_olt_f128: | |
| ; 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 .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_olt_f128: | |
| ; 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 | |
| ; | |
| ; HARD32-LABEL: fcmps_olt_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpeq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbl .LBB15_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: .LBB15_2: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov 1, %o0 | |
| ; | |
| ; HARD-LABEL: fcmps_olt_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: fcmpeq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movl %fcc0, 1, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| %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 @fcmp_one_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_one_f128: | |
| ; 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 .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: fcmp_one_f128: | |
| ; 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 | |
| ; | |
| ; HARD32-LABEL: fcmp_one_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fblg .LBB16_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: .LBB16_2: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov 1, %o0 | |
| ; | |
| ; HARD-LABEL: fcmp_one_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: fcmpq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movlg %fcc0, 1, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| %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_ueq_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmp_ueq_f128: | |
| ; 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 .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: fcmp_ueq_f128: | |
| ; 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 | |
| ; | |
| ; HARD32-LABEL: fcmp_ueq_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbue .LBB17_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: .LBB17_2: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov 1, %o0 | |
| ; | |
| ; HARD-LABEL: fcmp_ueq_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: fcmpq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movue %fcc0, 1, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| %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 @fcmps_oge_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_oge_f128: | |
| ; 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 .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_oge_f128: | |
| ; 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 | |
| ; | |
| ; HARD32-LABEL: fcmps_oge_f128: | |
| ; HARD32: ! %bb.0: | |
| ; HARD32-NEXT: ldd [%o1], %f0 | |
| ; HARD32-NEXT: ldd [%o1+8], %f2 | |
| ; HARD32-NEXT: ldd [%o0], %f4 | |
| ; HARD32-NEXT: ldd [%o0+8], %f6 | |
| ; HARD32-NEXT: fcmpeq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbge .LBB18_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov %g0, %o0 | |
| ; HARD32-NEXT: .LBB18_2: | |
| ; HARD32-NEXT: retl | |
| ; HARD32-NEXT: mov 1, %o0 | |
| ; | |
| ; HARD-LABEL: fcmps_oge_f128: | |
| ; HARD: ! %bb.0: | |
| ; HARD-NEXT: mov %g0, %o0 | |
| ; HARD-NEXT: fcmpeq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: movge %fcc0, 1, %o0 | |
| ; HARD-NEXT: retl | |
| ; HARD-NEXT: srl %o0, 0, %o0 | |
| %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 void @fcmps_branch_f128(fp128 %a, fp128 %b) nounwind strictfp { | |
| ; SOFT32-LABEL: fcmps_branch_f128: | |
| ; SOFT32: ! %bb.0: ! %entry | |
| ; 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 .LBB19_2 | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: ! %bb.1: ! %if.then | |
| ; SOFT32-NEXT: call foo | |
| ; SOFT32-NEXT: nop | |
| ; SOFT32-NEXT: .LBB19_2: ! %if.end | |
| ; SOFT32-NEXT: ret | |
| ; SOFT32-NEXT: restore | |
| ; | |
| ; SOFT64-LABEL: fcmps_branch_f128: | |
| ; SOFT64: ! %bb.0: ! %entry | |
| ; 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: andcc %o0, 1, %g0 | |
| ; SOFT64-NEXT: bne %icc, .LBB19_2 | |
| ; SOFT64-NEXT: nop | |
| ; SOFT64-NEXT: ! %bb.1: ! %if.then | |
| ; SOFT64-NEXT: call foo | |
| ; SOFT64-NEXT: nop | |
| ; SOFT64-NEXT: .LBB19_2: ! %if.end | |
| ; SOFT64-NEXT: ret | |
| ; SOFT64-NEXT: restore | |
| ; | |
| ; HARD32-LABEL: fcmps_branch_f128: | |
| ; HARD32: ! %bb.0: ! %entry | |
| ; HARD32-NEXT: save %sp, -96, %sp | |
| ; HARD32-NEXT: ldd [%i1], %f0 | |
| ; HARD32-NEXT: ldd [%i1+8], %f2 | |
| ; HARD32-NEXT: ldd [%i0], %f4 | |
| ; HARD32-NEXT: ldd [%i0+8], %f6 | |
| ; HARD32-NEXT: fcmpeq %f4, %f0 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: fbul .LBB19_2 | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: ! %bb.1: ! %if.then | |
| ; HARD32-NEXT: call foo | |
| ; HARD32-NEXT: nop | |
| ; HARD32-NEXT: .LBB19_2: ! %if.end | |
| ; HARD32-NEXT: ret | |
| ; HARD32-NEXT: restore | |
| ; | |
| ; HARD-LABEL: fcmps_branch_f128: | |
| ; HARD: ! %bb.0: ! %entry | |
| ; HARD-NEXT: save %sp, -176, %sp | |
| ; HARD-NEXT: fcmpeq %fcc0, %f0, %f4 | |
| ; HARD-NEXT: fbul %fcc0, .LBB19_2 | |
| ; HARD-NEXT: nop | |
| ; HARD-NEXT: ! %bb.1: ! %if.then | |
| ; HARD-NEXT: call foo | |
| ; HARD-NEXT: nop | |
| ; HARD-NEXT: .LBB19_2: ! %if.end | |
| ; HARD-NEXT: ret | |
| ; HARD-NEXT: restore | |
| entry: | |
| %c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"oge", metadata !"fpexcept.strict") strictfp | |
| br i1 %c, label %if.then, label %if.end | |
| if.then: | |
| call void @foo() strictfp | |
| br label %if.end | |
| if.end: | |
| ret void | |
| } | |
| declare void @foo() |