; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) { ; CHECK-LABEL: test_x86_sse2_cvtsd2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsd2si %xmm0, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; [#uses=1] ret i64 %res } declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) { ; CHECK-LABEL: test_x86_sse2_cvtsi642sd: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsi2sd %rdi, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1] ret <2 x double> %res } declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone define i64 @test_x86_avx512_cvttsd2si64(<2 x double> %a0) { ; CHECK-LABEL: test_x86_avx512_cvttsd2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvttsd2si %xmm0, %rcx ; CHECK-NEXT: vcvttsd2si {sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res0 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 4) ; %res1 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 8) ; %res2 = add i64 %res0, %res1 ret i64 %res2 } declare i64 @llvm.x86.avx512.cvttsd2si64(<2 x double>, i32) nounwind readnone define i64 @test_x86_avx512_cvttsd2usi64(<2 x double> %a0) { ; CHECK-LABEL: test_x86_avx512_cvttsd2usi64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvttsd2usi %xmm0, %rcx ; CHECK-NEXT: vcvttsd2usi {sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res0 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 4) ; %res1 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 8) ; %res2 = add i64 %res0, %res1 ret i64 %res2 } declare i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double>, i32) nounwind readnone define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) { ; CHECK-LABEL: test_x86_sse_cvtss2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtss2si %xmm0, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; [#uses=1] ret i64 %res } declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) { ; CHECK-LABEL: test_x86_sse_cvtsi642ss: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsi2ss %rdi, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1] ret <4 x float> %res } declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone define i64 @test_x86_avx512_cvttss2si64(<4 x float> %a0) { ; CHECK-LABEL: test_x86_avx512_cvttss2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvttss2si %xmm0, %rcx ; CHECK-NEXT: vcvttss2si {sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res0 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 4) ; %res1 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 8) ; %res2 = add i64 %res0, %res1 ret i64 %res2 } declare i64 @llvm.x86.avx512.cvttss2si64(<4 x float>, i32) nounwind readnone define i32 @test_x86_avx512_cvttss2usi(<4 x float> %a0) { ; CHECK-LABEL: test_x86_avx512_cvttss2usi: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvttss2usi {sae}, %xmm0, %ecx ; CHECK-NEXT: vcvttss2usi %xmm0, %eax ; CHECK-NEXT: addl %ecx, %eax ; CHECK-NEXT: retq %res0 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 8) ; %res1 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 4) ; %res2 = add i32 %res0, %res1 ret i32 %res2 } declare i32 @llvm.x86.avx512.cvttss2usi(<4 x float>, i32) nounwind readnone define i64 @test_x86_avx512_cvttss2usi64(<4 x float> %a0) { ; CHECK-LABEL: test_x86_avx512_cvttss2usi64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvttss2usi %xmm0, %rcx ; CHECK-NEXT: vcvttss2usi {sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res0 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 4) ; %res1 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 8) ; %res2 = add i64 %res0, %res1 ret i64 %res2 } declare i64 @llvm.x86.avx512.cvttss2usi64(<4 x float>, i32) nounwind readnone define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) { ; CHECK-LABEL: test_x86_avx512_cvtsd2usi64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsd2usi %xmm0, %rax ; CHECK-NEXT: vcvtsd2usi {rz-sae}, %xmm0, %rcx ; CHECK-NEXT: addq %rax, %rcx ; CHECK-NEXT: vcvtsd2usi {rd-sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %a0, i32 4) %res1 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %a0, i32 11) %res2 = call i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double> %a0, i32 9) %res3 = add i64 %res, %res1 %res4 = add i64 %res3, %res2 ret i64 %res4 } declare i64 @llvm.x86.avx512.vcvtsd2usi64(<2 x double>, i32) nounwind readnone define i64 @test_x86_avx512_cvtsd2si64(<2 x double> %a0) { ; CHECK-LABEL: test_x86_avx512_cvtsd2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsd2si %xmm0, %rax ; CHECK-NEXT: vcvtsd2si {rz-sae}, %xmm0, %rcx ; CHECK-NEXT: addq %rax, %rcx ; CHECK-NEXT: vcvtsd2si {rd-sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %a0, i32 4) %res1 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %a0, i32 11) %res2 = call i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double> %a0, i32 9) %res3 = add i64 %res, %res1 %res4 = add i64 %res3, %res2 ret i64 %res4 } declare i64 @llvm.x86.avx512.vcvtsd2si64(<2 x double>, i32) nounwind readnone define i64 @test_x86_avx512_cvtss2usi64(<4 x float> %a0) { ; CHECK-LABEL: test_x86_avx512_cvtss2usi64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtss2usi %xmm0, %rax ; CHECK-NEXT: vcvtss2usi {rz-sae}, %xmm0, %rcx ; CHECK-NEXT: addq %rax, %rcx ; CHECK-NEXT: vcvtss2usi {rd-sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %a0, i32 4) %res1 = call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %a0, i32 11) %res2 = call i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float> %a0, i32 9) %res3 = add i64 %res, %res1 %res4 = add i64 %res3, %res2 ret i64 %res4 } declare i64 @llvm.x86.avx512.vcvtss2usi64(<4 x float>, i32) nounwind readnone define i64 @test_x86_avx512_cvtss2si64(<4 x float> %a0) { ; CHECK-LABEL: test_x86_avx512_cvtss2si64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtss2si %xmm0, %rax ; CHECK-NEXT: vcvtss2si {rz-sae}, %xmm0, %rcx ; CHECK-NEXT: addq %rax, %rcx ; CHECK-NEXT: vcvtss2si {rd-sae}, %xmm0, %rax ; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq %res = call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %a0, i32 4) %res1 = call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %a0, i32 11) %res2 = call i64 @llvm.x86.avx512.vcvtss2si64(<4 x float> %a0, i32 9) %res3 = add i64 %res, %res1 %res4 = add i64 %res3, %res2 ret i64 %res4 } declare i64 @llvm.x86.avx512.vcvtss2si64(<4 x float>, i32) nounwind readnone define <2 x double> @test_x86_avx512_cvtsi2sd64(<2 x double> %a, i64 %b) { ; CHECK-LABEL: test_x86_avx512_cvtsi2sd64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsi2sd %rdi, {rz-sae}, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double> %a, i64 %b, i32 11) ; <<<2 x double>> [#uses=1] ret <2 x double> %res } declare <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double>, i64, i32) nounwind readnone define <4 x float> @test_x86_avx512_cvtsi2ss64(<4 x float> %a, i64 %b) { ; CHECK-LABEL: test_x86_avx512_cvtsi2ss64: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtsi2ss %rdi, {rz-sae}, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float> %a, i64 %b, i32 11) ; <<<4 x float>> [#uses=1] ret <4 x float> %res } declare <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float>, i64, i32) nounwind readnone define <4 x float> @_mm_cvt_roundu64_ss (<4 x float> %a, i64 %b) { ; CHECK-LABEL: _mm_cvt_roundu64_ss: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtusi2ss %rdi, {rd-sae}, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 9) ; <<<4 x float>> [#uses=1] ret <4 x float> %res } define <4 x float> @_mm_cvtu64_ss(<4 x float> %a, i64 %b) { ; CHECK-LABEL: _mm_cvtu64_ss: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtusi2ss %rdi, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 4) ; <<<4 x float>> [#uses=1] ret <4 x float> %res } declare <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float>, i64, i32) nounwind readnone define <2 x double> @test_x86_avx512_mm_cvtu64_sd(<2 x double> %a, i64 %b) { ; CHECK-LABEL: test_x86_avx512_mm_cvtu64_sd: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtusi2sd %rdi, {rd-sae}, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 9) ; <<<2 x double>> [#uses=1] ret <2 x double> %res } define <2 x double> @test_x86_avx512__mm_cvt_roundu64_sd(<2 x double> %a, i64 %b) { ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu64_sd: ; CHECK: ## %bb.0: ; CHECK-NEXT: vcvtusi2sd %rdi, %xmm0, %xmm0 ; CHECK-NEXT: retq %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 4) ; <<<2 x double>> [#uses=1] ret <2 x double> %res } declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64, i32) nounwind readnone