ret void
}
-define void @complex_inreg_work(<2 x float> %a, <2 x float> %b) {
+define void @complex_inreg_work(<2 x float> %a, <2 x float> %b, <2 x float> %c) {
; X32-LABEL: complex_inreg_work:
; X32: # %bb.0: # %entry
-; X32-NEXT: movaps %xmm0, %xmm2
-; X32-NEXT: cmpordps %xmm0, %xmm0
-; X32-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; X32-NEXT: movaps %xmm0, %xmm3
+; X32-NEXT: cmpordps %xmm2, %xmm2
+; X32-NEXT: movaps %xmm2, %xmm0
+; X32-NEXT: blendvps %xmm0, %xmm3, %xmm1
; X32-NEXT: movlps %xmm1, (%eax)
; X32-NEXT: retl
;
; X64-LABEL: complex_inreg_work:
; X64: # %bb.0: # %entry
-; X64-NEXT: movaps %xmm0, %xmm2
-; X64-NEXT: cmpordps %xmm0, %xmm0
-; X64-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; X64-NEXT: movaps %xmm0, %xmm3
+; X64-NEXT: cmpordps %xmm2, %xmm2
+; X64-NEXT: movaps %xmm2, %xmm0
+; X64-NEXT: blendvps %xmm0, %xmm3, %xmm1
; X64-NEXT: movlps %xmm1, (%rax)
; X64-NEXT: retq
entry:
- %0 = fcmp oeq <2 x float> undef, undef
+ %0 = fcmp oeq <2 x float> %c, %c
%1 = select <2 x i1> %0, <2 x float> %a, <2 x float> %b
store <2 x float> %1, <2 x float>* undef
ret void
; Check that a <4 x float> compare is generated and that we are
; not stuck in an endless loop.
-define void @cmp_2_floats(<2 x float> %a, <2 x float> %b) {
+define void @cmp_2_floats(<2 x float> %a, <2 x float> %b, <2 x float> %c) {
; CHECK-LABEL: cmp_2_floats:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: movaps %xmm0, %xmm2
-; CHECK-NEXT: cmpordps %xmm0, %xmm0
-; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm0, %xmm3
+; CHECK-NEXT: cmpordps %xmm2, %xmm2
+; CHECK-NEXT: movaps %xmm2, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm3, %xmm1
; CHECK-NEXT: movlps %xmm1, (%rax)
; CHECK-NEXT: retq
entry:
- %0 = fcmp oeq <2 x float> undef, undef
+ %0 = fcmp oeq <2 x float> %c, %c
%1 = select <2 x i1> %0, <2 x float> %a, <2 x float> %b
store <2 x float> %1, <2 x float>* undef
ret void
}
-define void @cmp_2_doubles(<2 x double> %a, <2 x double> %b) {
+define void @cmp_2_doubles(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
; CHECK-LABEL: cmp_2_doubles:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: movapd %xmm0, %xmm2
-; CHECK-NEXT: cmpordpd %xmm0, %xmm0
-; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm0, %xmm3
+; CHECK-NEXT: cmpordpd %xmm2, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm3, %xmm1
; CHECK-NEXT: movapd %xmm1, (%rax)
; CHECK-NEXT: retq
entry:
- %0 = fcmp oeq <2 x double> undef, undef
+ %0 = fcmp oeq <2 x double> %c, %c
%1 = select <2 x i1> %0, <2 x double> %a, <2 x double> %b
store <2 x double> %1, <2 x double>* undef
ret void
declare void @scale() nounwind
-define void @render() nounwind {
+define void @render(double %a0) nounwind {
; CHECK-LABEL: render:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rbp
; CHECK-NEXT: pushq %rbx
; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: vmovsd %xmm0, (%rsp) # 8-byte Spill
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: testb %al, %al
; CHECK-NEXT: jne .LBB2_6
; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1
; CHECK-NEXT: testb %bpl, %bpl
; CHECK-NEXT: jne .LBB2_2
-; CHECK-NEXT: # %bb.4: # %for.body33
+; CHECK-NEXT: # %bb.4: # %for.body33.preheader
; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1
+; CHECK-NEXT: vmovsd (%rsp), %xmm0 # 8-byte Reload
+; CHECK-NEXT: # xmm0 = mem[0],zero
; CHECK-NEXT: vucomisd {{\.LCPI.*}}, %xmm0
; CHECK-NEXT: jne .LBB2_5
; CHECK-NEXT: jnp .LBB2_2
; CHECK-NEXT: .LBB2_5: # %if.then
-; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1
-; CHECK-NEXT: callq scale
+; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1
+; CHECK-NEXT: callq scale
; CHECK-NEXT: jmp .LBB2_2
; CHECK-NEXT: .LBB2_6: # %for.end52
; CHECK-NEXT: addq $8, %rsp
br i1 false, label %for.body33, label %for.cond5
for.body33:
- %tobool = fcmp une double undef, 0.000000e+00
+ %tobool = fcmp une double %a0, 0.000000e+00
br i1 %tobool, label %if.then, label %for.cond30
if.then:
;; Scalar comparison
-define i32 @scalarcmpA() uwtable ssp {
+define i32 @scalarcmpA(double %a0) uwtable ssp {
; CHECK-LABEL: scalarcmpA:
; CHECK: # %bb.0:
-; CHECK-NEXT: vxorpd %xmm0, %xmm0, %xmm0
-; CHECK-NEXT: vcmpeqsd %xmm0, %xmm0, %xmm0
+; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; CHECK-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
; CHECK-NEXT: vmovq %xmm0, %rax
; CHECK-NEXT: andl $1, %eax
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
; CHECK-NEXT: retq
- %cmp29 = fcmp oeq double undef, 0.000000e+00
+ %cmp29 = fcmp oeq double %a0, 0.000000e+00
%res = zext i1 %cmp29 to i32
ret i32 %res
}
-define i32 @scalarcmpB() uwtable ssp {
+define i32 @scalarcmpB(float %a0) uwtable ssp {
; CHECK-LABEL: scalarcmpB:
; CHECK: # %bb.0:
-; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; CHECK-NEXT: vcmpeqss %xmm0, %xmm0, %xmm0
+; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; CHECK-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
; CHECK-NEXT: vmovd %xmm0, %eax
; CHECK-NEXT: andl $1, %eax
; CHECK-NEXT: retq
- %cmp29 = fcmp oeq float undef, 0.000000e+00
+ %cmp29 = fcmp oeq float %a0, 0.000000e+00
%res = zext i1 %cmp29 to i32
ret i32 %res
}
ret <16 x float> %b
}
-define <16 x i32> @test_vbroadcast() {
+define <16 x i32> @test_vbroadcast(<16 x float> %a0) {
; ALL-LABEL: test_vbroadcast:
; ALL: # %bb.0: # %entry
-; ALL-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; ALL-NEXT: vcmpunordps %zmm0, %zmm0, %k1
+; ALL-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; ALL-NEXT: vcmpunordps %zmm1, %zmm0, %k1
; ALL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
; ALL-NEXT: knotw %k1, %k1
; ALL-NEXT: vmovdqa32 %zmm0, %zmm0 {%k1} {z}
; ALL-NEXT: retq
entry:
%0 = sext <16 x i1> zeroinitializer to <16 x i32>
- %1 = fcmp uno <16 x float> undef, zeroinitializer
+ %1 = fcmp uno <16 x float> %a0, zeroinitializer
%2 = sext <16 x i1> %1 to <16 x i32>
%3 = select <16 x i1> %1, <16 x i32> %0, <16 x i32> %2
ret <16 x i32> %3