blob: 66eb82a849def78d598699d1669d9d20c5b8645c [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=V8
; RUN: llc -mtriple=sparc -mattr=+v9 -verify-machineinstrs \
; RUN: -disable-strictnode-mutation < %s | FileCheck %s --check-prefix=V8PLUS
; RUN: llc -mtriple=sparcv9 -verify-machineinstrs -disable-strictnode-mutation < %s \
; RUN: | FileCheck %s --check-prefix=V9
; RUN: llc -mtriple=sparc -mattr=+hard-quad-float -verify-machineinstrs \
; RUN: -disable-strictnode-mutation < %s | FileCheck %s --check-prefix=V8-HQ
; RUN: llc -mtriple=sparcv9 -mattr=+hard-quad-float -verify-machineinstrs \
; RUN: -disable-strictnode-mutation < %s | FileCheck %s --check-prefix=V9-HQ
;; Quiet constrained compares select fcmp{s,d,q} and signaling ones select
;; fcmpe{s,d,q}. V8 uses the forms without an explicit %fcc0 and needs an
;; instruction between the compare and the FP branch, so a nop follows the
;; compare. V9, including 32-bit V8+, uses the %fcc0 forms and needs no nop.
define void @fcmp_br_f32(float %a, float %b) nounwind strictfp {
; V8-LABEL: fcmp_br_f32:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -104, %sp
; V8-NEXT: st %i1, [%fp+-4]
; V8-NEXT: st %i0, [%fp+-8]
; V8-NEXT: ld [%fp+-4], %f0
; V8-NEXT: ld [%fp+-8], %f1
; V8-NEXT: fcmps %f1, %f0
; V8-NEXT: nop
; V8-NEXT: fbuge .LBB0_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB0_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB0_4
; V8-NEXT: nop
; V8-NEXT: .LBB0_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB0_4
; V8-NEXT: nop
; V8-NEXT: .LBB0_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB0_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmp_br_f32:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -104, %sp
; V8PLUS-NEXT: st %i1, [%fp+-4]
; V8PLUS-NEXT: st %i0, [%fp+-8]
; V8PLUS-NEXT: ld [%fp+-4], %f0
; V8PLUS-NEXT: ld [%fp+-8], %f1
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: fcmps %fcc0, %f1, %f0
; V8PLUS-NEXT: movuge %fcc0, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB0_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB0_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmp_br_f32:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -176, %sp
; V9-NEXT: mov %g0, %i0
; V9-NEXT: fcmps %fcc0, %f1, %f3
; V9-NEXT: movuge %fcc0, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB0_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB0_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmp_br_f32:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -104, %sp
; V8-HQ-NEXT: st %i1, [%fp+-4]
; V8-HQ-NEXT: st %i0, [%fp+-8]
; V8-HQ-NEXT: ld [%fp+-4], %f0
; V8-HQ-NEXT: ld [%fp+-8], %f1
; V8-HQ-NEXT: fcmps %f1, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB0_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB0_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB0_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB0_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB0_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB0_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB0_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmp_br_f32:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmps %fcc0, %f1, %f3
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB0_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB0_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
define void @fcmps_br_f32(float %a, float %b) nounwind strictfp {
; V8-LABEL: fcmps_br_f32:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -104, %sp
; V8-NEXT: st %i1, [%fp+-4]
; V8-NEXT: st %i0, [%fp+-8]
; V8-NEXT: ld [%fp+-4], %f0
; V8-NEXT: ld [%fp+-8], %f1
; V8-NEXT: fcmpes %f1, %f0
; V8-NEXT: nop
; V8-NEXT: fbuge .LBB1_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB1_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB1_4
; V8-NEXT: nop
; V8-NEXT: .LBB1_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB1_4
; V8-NEXT: nop
; V8-NEXT: .LBB1_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB1_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmps_br_f32:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -104, %sp
; V8PLUS-NEXT: st %i1, [%fp+-4]
; V8PLUS-NEXT: st %i0, [%fp+-8]
; V8PLUS-NEXT: ld [%fp+-4], %f0
; V8PLUS-NEXT: ld [%fp+-8], %f1
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: fcmpes %fcc0, %f1, %f0
; V8PLUS-NEXT: movuge %fcc0, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB1_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB1_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmps_br_f32:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -176, %sp
; V9-NEXT: mov %g0, %i0
; V9-NEXT: fcmpes %fcc0, %f1, %f3
; V9-NEXT: movuge %fcc0, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB1_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB1_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmps_br_f32:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -104, %sp
; V8-HQ-NEXT: st %i1, [%fp+-4]
; V8-HQ-NEXT: st %i0, [%fp+-8]
; V8-HQ-NEXT: ld [%fp+-4], %f0
; V8-HQ-NEXT: ld [%fp+-8], %f1
; V8-HQ-NEXT: fcmpes %f1, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB1_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB1_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB1_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB1_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB1_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB1_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB1_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmps_br_f32:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmpes %fcc0, %f1, %f3
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB1_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB1_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
define void @fcmp_br_f64(double %a, double %b) nounwind strictfp {
; V8-LABEL: fcmp_br_f64:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -112, %sp
; V8-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8-NEXT: std %i2, [%fp+-16]
; V8-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8-NEXT: std %i0, [%fp+-8]
; V8-NEXT: ldd [%fp+-16], %f0
; V8-NEXT: ldd [%fp+-8], %f2
; V8-NEXT: fcmpd %f2, %f0
; V8-NEXT: nop
; V8-NEXT: fbuge .LBB2_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB2_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB2_4
; V8-NEXT: nop
; V8-NEXT: .LBB2_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB2_4
; V8-NEXT: nop
; V8-NEXT: .LBB2_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB2_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmp_br_f64:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -112, %sp
; V8PLUS-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8PLUS-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8PLUS-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8PLUS-NEXT: std %i2, [%fp+-16]
; V8PLUS-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8PLUS-NEXT: std %i0, [%fp+-8]
; V8PLUS-NEXT: ldd [%fp+-16], %f0
; V8PLUS-NEXT: ldd [%fp+-8], %f2
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: fcmpd %fcc0, %f2, %f0
; V8PLUS-NEXT: movuge %fcc0, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB2_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB2_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmp_br_f64:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -176, %sp
; V9-NEXT: mov %g0, %i0
; V9-NEXT: fcmpd %fcc0, %f0, %f2
; V9-NEXT: movuge %fcc0, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB2_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB2_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmp_br_f64:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -112, %sp
; V8-HQ-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8-HQ-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8-HQ-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8-HQ-NEXT: std %i2, [%fp+-16]
; V8-HQ-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8-HQ-NEXT: std %i0, [%fp+-8]
; V8-HQ-NEXT: ldd [%fp+-16], %f0
; V8-HQ-NEXT: ldd [%fp+-8], %f2
; V8-HQ-NEXT: fcmpd %f2, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB2_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB2_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB2_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB2_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB2_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB2_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB2_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmp_br_f64:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmpd %fcc0, %f0, %f2
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB2_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB2_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
define void @fcmps_br_f64(double %a, double %b) nounwind strictfp {
; V8-LABEL: fcmps_br_f64:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -112, %sp
; V8-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8-NEXT: std %i2, [%fp+-16]
; V8-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8-NEXT: std %i0, [%fp+-8]
; V8-NEXT: ldd [%fp+-16], %f0
; V8-NEXT: ldd [%fp+-8], %f2
; V8-NEXT: fcmped %f2, %f0
; V8-NEXT: nop
; V8-NEXT: fbuge .LBB3_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB3_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB3_4
; V8-NEXT: nop
; V8-NEXT: .LBB3_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB3_4
; V8-NEXT: nop
; V8-NEXT: .LBB3_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB3_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmps_br_f64:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -112, %sp
; V8PLUS-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8PLUS-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8PLUS-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8PLUS-NEXT: std %i2, [%fp+-16]
; V8PLUS-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8PLUS-NEXT: std %i0, [%fp+-8]
; V8PLUS-NEXT: ldd [%fp+-16], %f0
; V8PLUS-NEXT: ldd [%fp+-8], %f2
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: fcmped %fcc0, %f2, %f0
; V8PLUS-NEXT: movuge %fcc0, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB3_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB3_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmps_br_f64:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -176, %sp
; V9-NEXT: mov %g0, %i0
; V9-NEXT: fcmped %fcc0, %f0, %f2
; V9-NEXT: movuge %fcc0, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB3_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB3_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmps_br_f64:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -112, %sp
; V8-HQ-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3
; V8-HQ-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8-HQ-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3
; V8-HQ-NEXT: std %i2, [%fp+-16]
; V8-HQ-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8-HQ-NEXT: std %i0, [%fp+-8]
; V8-HQ-NEXT: ldd [%fp+-16], %f0
; V8-HQ-NEXT: ldd [%fp+-8], %f2
; V8-HQ-NEXT: fcmped %f2, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB3_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB3_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB3_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB3_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB3_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB3_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB3_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmps_br_f64:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmped %fcc0, %f0, %f2
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB3_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB3_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
define void @fcmp_br_f128(fp128 %a, fp128 %b) nounwind strictfp {
; V8-LABEL: fcmp_br_f128:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -128, %sp
; V8-NEXT: ldd [%i0+8], %f0
; V8-NEXT: ldd [%i0], %f2
; V8-NEXT: ldd [%i1], %f4
; V8-NEXT: ldd [%i1+8], %f6
; V8-NEXT: std %f0, [%fp+-8]
; V8-NEXT: std %f2, [%fp+-16]
; V8-NEXT: std %f4, [%fp+-32]
; V8-NEXT: std %f6, [%fp+-24]
; V8-NEXT: add %fp, -16, %o0
; V8-NEXT: call _Q_cmp
; V8-NEXT: add %fp, -32, %o1
; V8-NEXT: cmp %o0, 1
; V8-NEXT: bne .LBB4_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB4_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB4_4
; V8-NEXT: nop
; V8-NEXT: .LBB4_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB4_4
; V8-NEXT: nop
; V8-NEXT: .LBB4_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB4_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmp_br_f128:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -128, %sp
; V8PLUS-NEXT: ldd [%i0+8], %f0
; V8PLUS-NEXT: ldd [%i0], %f2
; V8PLUS-NEXT: ldd [%i1], %f4
; V8PLUS-NEXT: ldd [%i1+8], %f6
; V8PLUS-NEXT: std %f0, [%fp+-8]
; V8PLUS-NEXT: std %f2, [%fp+-16]
; V8PLUS-NEXT: std %f4, [%fp+-32]
; V8PLUS-NEXT: std %f6, [%fp+-24]
; V8PLUS-NEXT: add %fp, -16, %o0
; V8PLUS-NEXT: call _Q_cmp
; V8PLUS-NEXT: add %fp, -32, %o1
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: cmp %o0, 1
; V8PLUS-NEXT: movne %icc, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB4_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB4_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmp_br_f128:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -208, %sp
; V9-NEXT: std %f2, [%fp+2039]
; V9-NEXT: std %f0, [%fp+2031]
; V9-NEXT: std %f4, [%fp+2015]
; V9-NEXT: std %f6, [%fp+2023]
; V9-NEXT: add %fp, 2031, %o0
; V9-NEXT: call _Qp_cmp
; V9-NEXT: add %fp, 2015, %o1
; V9-NEXT: mov %g0, %i0
; V9-NEXT: cmp %o0, 1
; V9-NEXT: movne %icc, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB4_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB4_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmp_br_f128:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -96, %sp
; V8-HQ-NEXT: ldd [%i1], %f0
; V8-HQ-NEXT: ldd [%i1+8], %f2
; V8-HQ-NEXT: ldd [%i0], %f4
; V8-HQ-NEXT: ldd [%i0+8], %f6
; V8-HQ-NEXT: fcmpq %f4, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB4_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB4_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB4_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB4_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB4_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB4_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB4_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmp_br_f128:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmpq %fcc0, %f0, %f4
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB4_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB4_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
define void @fcmps_br_f128(fp128 %a, fp128 %b) nounwind strictfp {
; V8-LABEL: fcmps_br_f128:
; V8: ! %bb.0: ! %entry
; V8-NEXT: save %sp, -128, %sp
; V8-NEXT: ldd [%i0+8], %f0
; V8-NEXT: ldd [%i0], %f2
; V8-NEXT: ldd [%i1], %f4
; V8-NEXT: ldd [%i1+8], %f6
; V8-NEXT: std %f0, [%fp+-8]
; V8-NEXT: std %f2, [%fp+-16]
; V8-NEXT: std %f4, [%fp+-32]
; V8-NEXT: std %f6, [%fp+-24]
; V8-NEXT: add %fp, -16, %o0
; V8-NEXT: call _Q_cmpe
; V8-NEXT: add %fp, -32, %o1
; V8-NEXT: cmp %o0, 1
; V8-NEXT: bne .LBB5_2
; V8-NEXT: nop
; V8-NEXT: ! %bb.1: ! %entry
; V8-NEXT: mov %g0, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: be .LBB5_3
; V8-NEXT: nop
; V8-NEXT: ba .LBB5_4
; V8-NEXT: nop
; V8-NEXT: .LBB5_2:
; V8-NEXT: mov 1, %i0
; V8-NEXT: cmp %i0, 0
; V8-NEXT: bne .LBB5_4
; V8-NEXT: nop
; V8-NEXT: .LBB5_3: ! %t
; V8-NEXT: call foo
; V8-NEXT: nop
; V8-NEXT: .LBB5_4: ! %e
; V8-NEXT: ret
; V8-NEXT: restore
;
; V8PLUS-LABEL: fcmps_br_f128:
; V8PLUS: ! %bb.0: ! %entry
; V8PLUS-NEXT: save %sp, -128, %sp
; V8PLUS-NEXT: ldd [%i0+8], %f0
; V8PLUS-NEXT: ldd [%i0], %f2
; V8PLUS-NEXT: ldd [%i1], %f4
; V8PLUS-NEXT: ldd [%i1+8], %f6
; V8PLUS-NEXT: std %f0, [%fp+-8]
; V8PLUS-NEXT: std %f2, [%fp+-16]
; V8PLUS-NEXT: std %f4, [%fp+-32]
; V8PLUS-NEXT: std %f6, [%fp+-24]
; V8PLUS-NEXT: add %fp, -16, %o0
; V8PLUS-NEXT: call _Q_cmpe
; V8PLUS-NEXT: add %fp, -32, %o1
; V8PLUS-NEXT: mov %g0, %i0
; V8PLUS-NEXT: cmp %o0, 1
; V8PLUS-NEXT: movne %icc, 1, %i0
; V8PLUS-NEXT: cmp %i0, 0
; V8PLUS-NEXT: bne %icc, .LBB5_2
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: ! %bb.1: ! %t
; V8PLUS-NEXT: call foo
; V8PLUS-NEXT: nop
; V8PLUS-NEXT: .LBB5_2: ! %e
; V8PLUS-NEXT: ret
; V8PLUS-NEXT: restore
;
; V9-LABEL: fcmps_br_f128:
; V9: ! %bb.0: ! %entry
; V9-NEXT: save %sp, -208, %sp
; V9-NEXT: std %f2, [%fp+2039]
; V9-NEXT: std %f0, [%fp+2031]
; V9-NEXT: std %f4, [%fp+2015]
; V9-NEXT: std %f6, [%fp+2023]
; V9-NEXT: add %fp, 2031, %o0
; V9-NEXT: call _Qp_cmpe
; V9-NEXT: add %fp, 2015, %o1
; V9-NEXT: mov %g0, %i0
; V9-NEXT: cmp %o0, 1
; V9-NEXT: movne %icc, 1, %i0
; V9-NEXT: cmp %i0, 0
; V9-NEXT: bne %icc, .LBB5_2
; V9-NEXT: nop
; V9-NEXT: ! %bb.1: ! %t
; V9-NEXT: call foo
; V9-NEXT: nop
; V9-NEXT: .LBB5_2: ! %e
; V9-NEXT: ret
; V9-NEXT: restore
;
; V8-HQ-LABEL: fcmps_br_f128:
; V8-HQ: ! %bb.0: ! %entry
; V8-HQ-NEXT: save %sp, -96, %sp
; V8-HQ-NEXT: ldd [%i1], %f0
; V8-HQ-NEXT: ldd [%i1+8], %f2
; V8-HQ-NEXT: ldd [%i0], %f4
; V8-HQ-NEXT: ldd [%i0+8], %f6
; V8-HQ-NEXT: fcmpeq %f4, %f0
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: fbuge .LBB5_2
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ! %bb.1: ! %entry
; V8-HQ-NEXT: mov %g0, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: be .LBB5_3
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: ba .LBB5_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB5_2:
; V8-HQ-NEXT: mov 1, %i0
; V8-HQ-NEXT: cmp %i0, 0
; V8-HQ-NEXT: bne .LBB5_4
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB5_3: ! %t
; V8-HQ-NEXT: call foo
; V8-HQ-NEXT: nop
; V8-HQ-NEXT: .LBB5_4: ! %e
; V8-HQ-NEXT: ret
; V8-HQ-NEXT: restore
;
; V9-HQ-LABEL: fcmps_br_f128:
; V9-HQ: ! %bb.0: ! %entry
; V9-HQ-NEXT: save %sp, -176, %sp
; V9-HQ-NEXT: mov %g0, %i0
; V9-HQ-NEXT: fcmpeq %fcc0, %f0, %f4
; V9-HQ-NEXT: movuge %fcc0, 1, %i0
; V9-HQ-NEXT: cmp %i0, 0
; V9-HQ-NEXT: bne %icc, .LBB5_2
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: ! %bb.1: ! %t
; V9-HQ-NEXT: call foo
; V9-HQ-NEXT: nop
; V9-HQ-NEXT: .LBB5_2: ! %e
; V9-HQ-NEXT: ret
; V9-HQ-NEXT: restore
entry:
%c = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
br i1 %c, label %t, label %e
t:
call void @foo() strictfp
br label %e
e:
ret void
}
declare void @foo()