| ; 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() |