Index: test/CodeGen/X86/avx-intrinsics-x86.ll =================================================================== --- test/CodeGen/X86/avx-intrinsics-x86.ll +++ test/CodeGen/X86/avx-intrinsics-x86.ll @@ -1943,23 +1943,29 @@ } -define i32 @test_x86_sse42_pcmpestria128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestria128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; AVX-LABEL: test_x86_sse42_pcmpestria128: ; AVX: ## BB#0: +; AVX-NEXT: pushl %ebx ; AVX-NEXT: movl $7, %eax ; AVX-NEXT: movl $7, %edx +; AVX-NEXT: xorl %ebx, %ebx ; AVX-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX-NEXT: seta %al -; AVX-NEXT: movzbl %al, %eax +; AVX-NEXT: seta %bl +; AVX-NEXT: movl %ebx, %eax +; AVX-NEXT: popl %ebx ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_sse42_pcmpestria128: ; AVX512VL: ## BB#0: +; AVX512VL-NEXT: pushl %ebx ; AVX512VL-NEXT: movl $7, %eax ; AVX512VL-NEXT: movl $7, %edx +; AVX512VL-NEXT: xorl %ebx, %ebx ; AVX512VL-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX512VL-NEXT: seta %al -; AVX512VL-NEXT: movzbl %al, %eax +; AVX512VL-NEXT: seta %bl +; AVX512VL-NEXT: movl %ebx, %eax +; AVX512VL-NEXT: popl %ebx ; AVX512VL-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestria128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -1991,23 +1997,29 @@ declare i32 @llvm.x86.sse42.pcmpestric128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestrio128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestrio128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; AVX-LABEL: test_x86_sse42_pcmpestrio128: ; AVX: ## BB#0: +; AVX-NEXT: pushl %ebx ; AVX-NEXT: movl $7, %eax ; AVX-NEXT: movl $7, %edx +; AVX-NEXT: xorl %ebx, %ebx ; AVX-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX-NEXT: seto %al -; AVX-NEXT: movzbl %al, %eax +; AVX-NEXT: seto %bl +; AVX-NEXT: movl %ebx, %eax +; AVX-NEXT: popl %ebx ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_sse42_pcmpestrio128: ; AVX512VL: ## BB#0: +; AVX512VL-NEXT: pushl %ebx ; AVX512VL-NEXT: movl $7, %eax ; AVX512VL-NEXT: movl $7, %edx +; AVX512VL-NEXT: xorl %ebx, %ebx ; AVX512VL-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX512VL-NEXT: seto %al -; AVX512VL-NEXT: movzbl %al, %eax +; AVX512VL-NEXT: seto %bl +; AVX512VL-NEXT: movl %ebx, %eax +; AVX512VL-NEXT: popl %ebx ; AVX512VL-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestrio128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -2015,23 +2027,29 @@ declare i32 @llvm.x86.sse42.pcmpestrio128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestris128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestris128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; AVX-LABEL: test_x86_sse42_pcmpestris128: ; AVX: ## BB#0: +; AVX-NEXT: pushl %ebx ; AVX-NEXT: movl $7, %eax ; AVX-NEXT: movl $7, %edx +; AVX-NEXT: xorl %ebx, %ebx ; AVX-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX-NEXT: sets %al -; AVX-NEXT: movzbl %al, %eax +; AVX-NEXT: sets %bl +; AVX-NEXT: movl %ebx, %eax +; AVX-NEXT: popl %ebx ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_sse42_pcmpestris128: ; AVX512VL: ## BB#0: +; AVX512VL-NEXT: pushl %ebx ; AVX512VL-NEXT: movl $7, %eax ; AVX512VL-NEXT: movl $7, %edx +; AVX512VL-NEXT: xorl %ebx, %ebx ; AVX512VL-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX512VL-NEXT: sets %al -; AVX512VL-NEXT: movzbl %al, %eax +; AVX512VL-NEXT: sets %bl +; AVX512VL-NEXT: movl %ebx, %eax +; AVX512VL-NEXT: popl %ebx ; AVX512VL-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestris128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -2039,23 +2057,29 @@ declare i32 @llvm.x86.sse42.pcmpestris128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestriz128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestriz128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; AVX-LABEL: test_x86_sse42_pcmpestriz128: ; AVX: ## BB#0: +; AVX-NEXT: pushl %ebx ; AVX-NEXT: movl $7, %eax ; AVX-NEXT: movl $7, %edx +; AVX-NEXT: xorl %ebx, %ebx ; AVX-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX-NEXT: sete %al -; AVX-NEXT: movzbl %al, %eax +; AVX-NEXT: sete %bl +; AVX-NEXT: movl %ebx, %eax +; AVX-NEXT: popl %ebx ; AVX-NEXT: retl ; ; AVX512VL-LABEL: test_x86_sse42_pcmpestriz128: ; AVX512VL: ## BB#0: +; AVX512VL-NEXT: pushl %ebx ; AVX512VL-NEXT: movl $7, %eax ; AVX512VL-NEXT: movl $7, %edx +; AVX512VL-NEXT: xorl %ebx, %ebx ; AVX512VL-NEXT: vpcmpestri $7, %xmm1, %xmm0 -; AVX512VL-NEXT: sete %al -; AVX512VL-NEXT: movzbl %al, %eax +; AVX512VL-NEXT: sete %bl +; AVX512VL-NEXT: movl %ebx, %eax +; AVX512VL-NEXT: popl %ebx ; AVX512VL-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestriz128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res Index: test/CodeGen/X86/fp128-cast.ll =================================================================== --- test/CodeGen/X86/fp128-cast.ll +++ test/CodeGen/X86/fp128-cast.ll @@ -238,6 +238,7 @@ ; X64-LABEL: TestConst128: ; X64: movaps {{.*}}, %xmm1 ; X64-NEXT: callq __gttf2 +; X64-NEXT: xorl ; X64-NEXT: test ; X64: retq } Index: test/CodeGen/X86/fp128-compare.ll =================================================================== --- test/CodeGen/X86/fp128-compare.ll +++ test/CodeGen/X86/fp128-compare.ll @@ -8,8 +8,9 @@ ret i32 %conv ; CHECK-LABEL: TestComp128GT: ; CHECK: callq __gttf2 -; CHECK: setg %al -; CHECK: movzbl %al, %eax +; CHECK: xorl %ecx, %ecx +; CHECK: setg %cl +; CHECK: movl %ecx, %eax ; CHECK: retq } @@ -20,9 +21,10 @@ ret i32 %conv ; CHECK-LABEL: TestComp128GE: ; CHECK: callq __getf2 +; CHECK: xorl %ecx, %ecx ; CHECK: testl %eax, %eax -; CHECK: setns %al -; CHECK: movzbl %al, %eax +; CHECK: setns %cl +; CHECK: movl %ecx, %eax ; CHECK: retq } @@ -48,9 +50,10 @@ ret i32 %conv ; CHECK-LABEL: TestComp128LE: ; CHECK: callq __letf2 -; CHECK-NEXT: testl %eax, %eax -; CHECK: setle %al -; CHECK: movzbl %al, %eax +; CHECK: xorl %ecx, %ecx +; CHECK: testl %eax, %eax +; CHECK: setle %cl +; CHECK: movl %ecx, %eax ; CHECK: retq } @@ -61,9 +64,10 @@ ret i32 %conv ; CHECK-LABEL: TestComp128EQ: ; CHECK: callq __eqtf2 -; CHECK-NEXT: testl %eax, %eax -; CHECK: sete %al -; CHECK: movzbl %al, %eax +; CHECK: xorl %ecx, %ecx +; CHECK: testl %eax, %eax +; CHECK: sete %cl +; CHECK: movl %ecx, %eax ; CHECK: retq } @@ -74,9 +78,10 @@ ret i32 %conv ; CHECK-LABEL: TestComp128NE: ; CHECK: callq __netf2 -; CHECK-NEXT: testl %eax, %eax -; CHECK: setne %al -; CHECK: movzbl %al, %eax +; CHECK: xorl %ecx, %ecx +; CHECK: testl %eax, %eax +; CHECK: setne %cl +; CHECK: movl %ecx, %eax ; CHECK: retq } Index: test/CodeGen/X86/sse42-intrinsics-fast-isel.ll =================================================================== --- test/CodeGen/X86/sse42-intrinsics-fast-isel.ll +++ test/CodeGen/X86/sse42-intrinsics-fast-isel.ll @@ -4,23 +4,27 @@ ; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse42-builtins.c -define i32 @test_mm_cmpestra(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) { +define i32 @test_mm_cmpestra(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) nounwind { ; X32-LABEL: test_mm_cmpestra: ; X32: # BB#0: +; X32-NEXT: pushl %ebx ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: xorl %ebx, %ebx ; X32-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X32-NEXT: seta %al -; X32-NEXT: movzbl %al, %eax +; X32-NEXT: seta %bl +; X32-NEXT: movl %ebx, %eax +; X32-NEXT: popl %ebx ; X32-NEXT: retl ; ; X64-LABEL: test_mm_cmpestra: ; X64: # BB#0: +; X64-NEXT: xorl %r8d, %r8d ; X64-NEXT: movl %edi, %eax ; X64-NEXT: movl %esi, %edx ; X64-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X64-NEXT: seta %al -; X64-NEXT: movzbl %al, %eax +; X64-NEXT: seta %r8b +; X64-NEXT: movl %r8d, %eax ; X64-NEXT: retq %arg0 = bitcast <2 x i64> %a0 to <16 x i8> %arg2 = bitcast <2 x i64> %a2 to <16 x i8> @@ -99,23 +103,27 @@ } declare <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_mm_cmpestro(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) { +define i32 @test_mm_cmpestro(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) nounwind { ; X32-LABEL: test_mm_cmpestro: ; X32: # BB#0: +; X32-NEXT: pushl %ebx ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: xorl %ebx, %ebx ; X32-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X32-NEXT: seto %al -; X32-NEXT: movzbl %al, %eax +; X32-NEXT: seto %bl +; X32-NEXT: movl %ebx, %eax +; X32-NEXT: popl %ebx ; X32-NEXT: retl ; ; X64-LABEL: test_mm_cmpestro: ; X64: # BB#0: +; X64-NEXT: xorl %r8d, %r8d ; X64-NEXT: movl %edi, %eax ; X64-NEXT: movl %esi, %edx ; X64-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X64-NEXT: seto %al -; X64-NEXT: movzbl %al, %eax +; X64-NEXT: seto %r8b +; X64-NEXT: movl %r8d, %eax ; X64-NEXT: retq %arg0 = bitcast <2 x i64> %a0 to <16 x i8> %arg2 = bitcast <2 x i64> %a2 to <16 x i8> @@ -124,23 +132,27 @@ } declare i32 @llvm.x86.sse42.pcmpestrio128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_mm_cmpestrs(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) { +define i32 @test_mm_cmpestrs(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) nounwind { ; X32-LABEL: test_mm_cmpestrs: ; X32: # BB#0: +; X32-NEXT: pushl %ebx ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: xorl %ebx, %ebx ; X32-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X32-NEXT: sets %al -; X32-NEXT: movzbl %al, %eax +; X32-NEXT: sets %bl +; X32-NEXT: movl %ebx, %eax +; X32-NEXT: popl %ebx ; X32-NEXT: retl ; ; X64-LABEL: test_mm_cmpestrs: ; X64: # BB#0: +; X64-NEXT: xorl %r8d, %r8d ; X64-NEXT: movl %edi, %eax ; X64-NEXT: movl %esi, %edx ; X64-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X64-NEXT: sets %al -; X64-NEXT: movzbl %al, %eax +; X64-NEXT: sets %r8b +; X64-NEXT: movl %r8d, %eax ; X64-NEXT: retq %arg0 = bitcast <2 x i64> %a0 to <16 x i8> %arg2 = bitcast <2 x i64> %a2 to <16 x i8> @@ -149,23 +161,27 @@ } declare i32 @llvm.x86.sse42.pcmpestris128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_mm_cmpestrz(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) { +define i32 @test_mm_cmpestrz(<2 x i64> %a0, i32 %a1, <2 x i64> %a2, i32 %a3) nounwind { ; X32-LABEL: test_mm_cmpestrz: ; X32: # BB#0: +; X32-NEXT: pushl %ebx ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-NEXT: xorl %ebx, %ebx ; X32-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X32-NEXT: sete %al -; X32-NEXT: movzbl %al, %eax +; X32-NEXT: sete %bl +; X32-NEXT: movl %ebx, %eax +; X32-NEXT: popl %ebx ; X32-NEXT: retl ; ; X64-LABEL: test_mm_cmpestrz: ; X64: # BB#0: +; X64-NEXT: xorl %r8d, %r8d ; X64-NEXT: movl %edi, %eax ; X64-NEXT: movl %esi, %edx ; X64-NEXT: pcmpestri $7, %xmm1, %xmm0 -; X64-NEXT: sete %al -; X64-NEXT: movzbl %al, %eax +; X64-NEXT: sete %r8b +; X64-NEXT: movl %r8d, %eax ; X64-NEXT: retq %arg0 = bitcast <2 x i64> %a0 to <16 x i8> %arg2 = bitcast <2 x i64> %a2 to <16 x i8> Index: test/CodeGen/X86/sse42-intrinsics-x86.ll =================================================================== --- test/CodeGen/X86/sse42-intrinsics-x86.ll +++ test/CodeGen/X86/sse42-intrinsics-x86.ll @@ -33,14 +33,17 @@ } -define i32 @test_x86_sse42_pcmpestria128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestria128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; CHECK-LABEL: test_x86_sse42_pcmpestria128: ; CHECK: ## BB#0: +; CHECK-NEXT: pushl %ebx ; CHECK-NEXT: movl $7, %eax ; CHECK-NEXT: movl $7, %edx +; CHECK-NEXT: xorl %ebx, %ebx ; CHECK-NEXT: pcmpestri $7, %xmm1, %xmm0 -; CHECK-NEXT: seta %al -; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: seta %bl +; CHECK-NEXT: movl %ebx, %eax +; CHECK-NEXT: popl %ebx ; CHECK-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestria128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -63,14 +66,17 @@ declare i32 @llvm.x86.sse42.pcmpestric128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestrio128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestrio128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; CHECK-LABEL: test_x86_sse42_pcmpestrio128: ; CHECK: ## BB#0: +; CHECK-NEXT: pushl %ebx ; CHECK-NEXT: movl $7, %eax ; CHECK-NEXT: movl $7, %edx +; CHECK-NEXT: xorl %ebx, %ebx ; CHECK-NEXT: pcmpestri $7, %xmm1, %xmm0 -; CHECK-NEXT: seto %al -; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: seto %bl +; CHECK-NEXT: movl %ebx, %eax +; CHECK-NEXT: popl %ebx ; CHECK-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestrio128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -78,14 +84,17 @@ declare i32 @llvm.x86.sse42.pcmpestrio128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestris128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestris128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; CHECK-LABEL: test_x86_sse42_pcmpestris128: ; CHECK: ## BB#0: +; CHECK-NEXT: pushl %ebx ; CHECK-NEXT: movl $7, %eax ; CHECK-NEXT: movl $7, %edx +; CHECK-NEXT: xorl %ebx, %ebx ; CHECK-NEXT: pcmpestri $7, %xmm1, %xmm0 -; CHECK-NEXT: sets %al -; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: sets %bl +; CHECK-NEXT: movl %ebx, %eax +; CHECK-NEXT: popl %ebx ; CHECK-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestris128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res @@ -93,14 +102,17 @@ declare i32 @llvm.x86.sse42.pcmpestris128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone -define i32 @test_x86_sse42_pcmpestriz128(<16 x i8> %a0, <16 x i8> %a2) { +define i32 @test_x86_sse42_pcmpestriz128(<16 x i8> %a0, <16 x i8> %a2) nounwind { ; CHECK-LABEL: test_x86_sse42_pcmpestriz128: ; CHECK: ## BB#0: +; CHECK-NEXT: pushl %ebx ; CHECK-NEXT: movl $7, %eax ; CHECK-NEXT: movl $7, %edx +; CHECK-NEXT: xorl %ebx, %ebx ; CHECK-NEXT: pcmpestri $7, %xmm1, %xmm0 -; CHECK-NEXT: sete %al -; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: sete %bl +; CHECK-NEXT: movl %ebx, %eax +; CHECK-NEXT: popl %ebx ; CHECK-NEXT: retl %res = call i32 @llvm.x86.sse42.pcmpestriz128(<16 x i8> %a0, i32 7, <16 x i8> %a2, i32 7, i8 7) ; [#uses=1] ret i32 %res