blob: 396c5a70ea94b83d77fc03b6dc4db708cc0c9cf4 [file] [edit]
; 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()