mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
d09f1e2d9a
Many of our tests were not using valid rounding mode immediates. Clang verifies this in the frontend when it creates the intrinsics from builtins, but the backend would still lower invalid immediates. With this change we will now leave them as intrinsics if the immediate is invalid. This will cause an isel selection failure. llvm-svn: 355789
250 lines
9.7 KiB
LLVM
250 lines
9.7 KiB
LLVM
; 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) ; <i64> [#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: vcvtsi2sdq %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) ; <i64> [#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: vcvtsi2ssq %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: vcvtsi2sdq %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: vcvtsi2ssq %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: vcvtusi2ssq %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: vcvtusi2ssq %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: vcvtusi2sdq %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: vcvtusi2sdq %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
|