mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 08:23:21 +01:00
b3487aa334
This option has been disabled for a while, and it is going away so I can clean up the coalescer code. The tests that required physreg joining to be enabled were almost all of the form "tiny function with interference between arguments and return value". Such functions are usually inlined in the real world. The problem exposed by phys_subreg_coalesce-3.ll is real, but fairly rare. llvm-svn: 157027
965 lines
27 KiB
LLVM
965 lines
27 KiB
LLVM
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -promote-elements | FileCheck %s
|
|
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-unsafe-fp-math -enable-no-nans-fp-math -promote-elements | FileCheck -check-prefix=UNSAFE %s
|
|
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-no-nans-fp-math -promote-elements | FileCheck -check-prefix=FINITE %s
|
|
|
|
; Some of these patterns can be matched as SSE min or max. Some of
|
|
; then can be matched provided that the operands are swapped.
|
|
; Some of them can't be matched at all and require a comparison
|
|
; and a conditional branch.
|
|
|
|
; The naming convention is {,x_,y_}{o,u}{gt,lt,ge,le}{,_inverse}
|
|
; _x: use 0.0 instead of %y
|
|
; _y: use -0.0 instead of %y
|
|
; _inverse : swap the arms of the select.
|
|
|
|
; CHECK: ogt:
|
|
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt:
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt:
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt(double %x, double %y) nounwind {
|
|
%c = fcmp ogt double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt:
|
|
; CHECK-NEXT: minsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt:
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt:
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt(double %x, double %y) nounwind {
|
|
%c = fcmp olt double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ogt_inverse:
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt_inverse:
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt_inverse:
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp ogt double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt_inverse:
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt_inverse:
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt_inverse:
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp olt double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge:
|
|
; CHECK-NEXT: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: oge:
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge:
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge(double %x, double %y) nounwind {
|
|
%c = fcmp oge double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole:
|
|
; CHECK-NEXT: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ole:
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE: ole:
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
define double @ole(double %x, double %y) nounwind {
|
|
%c = fcmp ole double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge_inverse:
|
|
; CHECK-NEXT: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: oge_inverse:
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge_inverse:
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp oge double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole_inverse:
|
|
; CHECK-NEXT: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ole_inverse:
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ole_inverse:
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ole_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp ole double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ogt_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt_x(double %x) nounwind {
|
|
%c = fcmp ogt double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: minsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt_x(double %x) nounwind {
|
|
%c = fcmp olt double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ogt_inverse_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt_inverse_x(double %x) nounwind {
|
|
%c = fcmp ogt double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt_inverse_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt_inverse_x(double %x) nounwind {
|
|
%c = fcmp olt double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge_x:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: oge_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge_x(double %x) nounwind {
|
|
%c = fcmp oge double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole_x:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ole_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ole_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ole_x(double %x) nounwind {
|
|
%c = fcmp ole double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge_inverse_x:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: oge_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge_inverse_x(double %x) nounwind {
|
|
%c = fcmp oge double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole_inverse_x:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ole_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ole_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ole_inverse_x(double %x) nounwind {
|
|
%c = fcmp ole double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ugt:
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt:
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt(double %x, double %y) nounwind {
|
|
%c = fcmp ugt double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: ult:
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult:
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult(double %x, double %y) nounwind {
|
|
%c = fcmp ult double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt_inverse:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ugt_inverse:
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt_inverse:
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp ugt double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult_inverse:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: ult_inverse:
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult_inverse:
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp ult double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge:
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge:
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge:
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge(double %x, double %y) nounwind {
|
|
%c = fcmp uge double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule:
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule:
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule:
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule(double %x, double %y) nounwind {
|
|
%c = fcmp ule double %x, %y
|
|
%d = select i1 %c, double %x, double %y
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge_inverse:
|
|
; CHECK-NEXT: minsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge_inverse:
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge_inverse:
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp uge double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule_inverse:
|
|
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule_inverse:
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule_inverse:
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule_inverse(double %x, double %y) nounwind {
|
|
%c = fcmp ule double %x, %y
|
|
%d = select i1 %c, double %y, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt_x:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ugt_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt_x(double %x) nounwind {
|
|
%c = fcmp ugt double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult_x:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: ult_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult_x(double %x) nounwind {
|
|
%c = fcmp ult double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt_inverse_x:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ugt_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt_inverse_x(double %x) nounwind {
|
|
%c = fcmp ugt double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult_inverse_x:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ult_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult_inverse_x(double %x) nounwind {
|
|
%c = fcmp ult double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge_x(double %x) nounwind {
|
|
%c = fcmp uge double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule_x(double %x) nounwind {
|
|
%c = fcmp ule double %x, 0.000000e+00
|
|
%d = select i1 %c, double %x, double 0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge_inverse_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: minsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge_inverse_x(double %x) nounwind {
|
|
%c = fcmp uge double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule_inverse_x:
|
|
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule_inverse_x:
|
|
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule_inverse_x:
|
|
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule_inverse_x(double %x) nounwind {
|
|
%c = fcmp ule double %x, 0.000000e+00
|
|
%d = select i1 %c, double 0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ogt_y:
|
|
; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt_y:
|
|
; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt_y:
|
|
; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt_y(double %x) nounwind {
|
|
%c = fcmp ogt double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt_y:
|
|
; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt_y:
|
|
; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt_y:
|
|
; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt_y(double %x) nounwind {
|
|
%c = fcmp olt double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ogt_inverse_y:
|
|
; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ogt_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ogt_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ogt_inverse_y(double %x) nounwind {
|
|
%c = fcmp ogt double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: olt_inverse_y:
|
|
; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: olt_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: olt_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @olt_inverse_y(double %x) nounwind {
|
|
%c = fcmp olt double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge_y:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: oge_y:
|
|
; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge_y:
|
|
; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge_y(double %x) nounwind {
|
|
%c = fcmp oge double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole_y:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ole_y:
|
|
; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ole_y:
|
|
; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ole_y(double %x) nounwind {
|
|
%c = fcmp ole double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: oge_inverse_y:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: oge_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: oge_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @oge_inverse_y(double %x) nounwind {
|
|
%c = fcmp oge double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ole_inverse_y:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ole_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ole_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ole_inverse_y(double %x) nounwind {
|
|
%c = fcmp ole double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt_y:
|
|
; CHECK: ucomisd %xmm0, %xmm1
|
|
; UNSAFE: ugt_y:
|
|
; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt_y:
|
|
; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt_y(double %x) nounwind {
|
|
%c = fcmp ugt double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult_y:
|
|
; CHECK: ucomisd %xmm1, %xmm0
|
|
; UNSAFE: ult_y:
|
|
; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult_y:
|
|
; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult_y(double %x) nounwind {
|
|
%c = fcmp ult double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ugt_inverse_y:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ugt_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ugt_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ugt_inverse_y(double %x) nounwind {
|
|
%c = fcmp ugt double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ult_inverse_y:
|
|
; CHECK: ucomisd %xmm
|
|
; UNSAFE: ult_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ult_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ult_inverse_y(double %x) nounwind {
|
|
%c = fcmp ult double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge_y:
|
|
; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; CHECK-NEXT: maxsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge_y:
|
|
; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge_y:
|
|
; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge_y(double %x) nounwind {
|
|
%c = fcmp uge double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule_y:
|
|
; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; CHECK-NEXT: minsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule_y:
|
|
; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule_y:
|
|
; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule_y(double %x) nounwind {
|
|
%c = fcmp ule double %x, -0.000000e+00
|
|
%d = select i1 %c, double %x, double -0.000000e+00
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: uge_inverse_y:
|
|
; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: uge_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: minsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: uge_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: minsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @uge_inverse_y(double %x) nounwind {
|
|
%c = fcmp uge double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
|
|
; CHECK: ule_inverse_y:
|
|
; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
|
|
; CHECK-NEXT: ret
|
|
; UNSAFE: ule_inverse_y:
|
|
; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; UNSAFE-NEXT: maxsd %xmm0, %xmm1
|
|
; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; UNSAFE-NEXT: ret
|
|
; FINITE: ule_inverse_y:
|
|
; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
|
|
; FINITE-NEXT: maxsd %xmm0, %xmm1
|
|
; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
|
; FINITE-NEXT: ret
|
|
define double @ule_inverse_y(double %x) nounwind {
|
|
%c = fcmp ule double %x, -0.000000e+00
|
|
%d = select i1 %c, double -0.000000e+00, double %x
|
|
ret double %d
|
|
}
|
|
; Test a few more misc. cases.
|
|
|
|
; CHECK: clampTo3k_a:
|
|
; CHECK: minsd
|
|
; UNSAFE: clampTo3k_a:
|
|
; UNSAFE: minsd
|
|
; FINITE: clampTo3k_a:
|
|
; FINITE: minsd
|
|
define double @clampTo3k_a(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_b:
|
|
; CHECK: minsd
|
|
; UNSAFE: clampTo3k_b:
|
|
; UNSAFE: minsd
|
|
; FINITE: clampTo3k_b:
|
|
; FINITE: minsd
|
|
define double @clampTo3k_b(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_c:
|
|
; CHECK: maxsd
|
|
; UNSAFE: clampTo3k_c:
|
|
; UNSAFE: maxsd
|
|
; FINITE: clampTo3k_c:
|
|
; FINITE: maxsd
|
|
define double @clampTo3k_c(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_d:
|
|
; CHECK: maxsd
|
|
; UNSAFE: clampTo3k_d:
|
|
; UNSAFE: maxsd
|
|
; FINITE: clampTo3k_d:
|
|
; FINITE: maxsd
|
|
define double @clampTo3k_d(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_e:
|
|
; CHECK: maxsd
|
|
; UNSAFE: clampTo3k_e:
|
|
; UNSAFE: maxsd
|
|
; FINITE: clampTo3k_e:
|
|
; FINITE: maxsd
|
|
define double @clampTo3k_e(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_f:
|
|
; CHECK: maxsd
|
|
; UNSAFE: clampTo3k_f:
|
|
; UNSAFE: maxsd
|
|
; FINITE: clampTo3k_f:
|
|
; FINITE: maxsd
|
|
define double @clampTo3k_f(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_g:
|
|
; CHECK: minsd
|
|
; UNSAFE: clampTo3k_g:
|
|
; UNSAFE: minsd
|
|
; FINITE: clampTo3k_g:
|
|
; FINITE: minsd
|
|
define double @clampTo3k_g(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; CHECK: clampTo3k_h:
|
|
; CHECK: minsd
|
|
; UNSAFE: clampTo3k_h:
|
|
; UNSAFE: minsd
|
|
; FINITE: clampTo3k_h:
|
|
; FINITE: minsd
|
|
define double @clampTo3k_h(double %x) nounwind readnone {
|
|
entry:
|
|
%0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
|
|
%x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
|
|
ret double %x_addr.0
|
|
}
|
|
|
|
; UNSAFE: maxpd:
|
|
; UNSAFE: maxpd
|
|
define <2 x double> @maxpd(<2 x double> %x, <2 x double> %y) {
|
|
%max_is_x = fcmp oge <2 x double> %x, %y
|
|
%max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
|
|
ret <2 x double> %max
|
|
}
|
|
|
|
; UNSAFE: minpd:
|
|
; UNSAFE: minpd
|
|
define <2 x double> @minpd(<2 x double> %x, <2 x double> %y) {
|
|
%min_is_x = fcmp ole <2 x double> %x, %y
|
|
%min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
|
|
ret <2 x double> %min
|
|
}
|
|
|
|
; UNSAFE: maxps:
|
|
; UNSAFE: maxps
|
|
define <4 x float> @maxps(<4 x float> %x, <4 x float> %y) {
|
|
%max_is_x = fcmp oge <4 x float> %x, %y
|
|
%max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
|
|
ret <4 x float> %max
|
|
}
|
|
|
|
; UNSAFE: minps:
|
|
; UNSAFE: minps
|
|
define <4 x float> @minps(<4 x float> %x, <4 x float> %y) {
|
|
%min_is_x = fcmp ole <4 x float> %x, %y
|
|
%min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
|
|
ret <4 x float> %min
|
|
}
|