mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
8c8fe42a0d
Rather than LegalizeAction::Expand, this needs LegalizeAction::Promote to get promoted to fp_to_sint v8f32->v8i32. This is a legal operation on AVX. For that to work properly, we also need to teach the legalizer about the specific promotion required here. The default vector promotion uses bitcasting to a vector type of the same total size. We want to promote the vector element type, effectively widening the operation and then truncating the result. This is analogous to the current logic of how int_to_fp is promoted. The change also factors out some code from the int_to_fp promotion code to ValueType::widenIntegerVectorElementType. This is now shared between int_to_fp and fp_to_int. There is no longer need for the custom lowering of fp_to_sint f32->v8i16 in X86. It can now go through the new target-independent fp_to_*int promotion logic. I also checked that no other target uses Promote for these ops yet, so there shouldn't be any unexpected change in behavior. Fixes <rdar://problem/16202247> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204058 91177308-0d34-0410-b5e6-96231b3b80d8
44 lines
1.1 KiB
LLVM
44 lines
1.1 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s
|
|
|
|
; Check that we generate vector conversion from float to narrower int types
|
|
|
|
%f32vec_t = type <8 x float>
|
|
%i16vec_t = type <8 x i16>
|
|
%i8vec_t = type <8 x i8>
|
|
|
|
define void @fptoui16(%f32vec_t %a, %i16vec_t *%p) {
|
|
; CHECK-LABEL: fptoui16:
|
|
; CHECK: vcvttps2dq %ymm
|
|
; CHECK-NOT: vcvttss2si
|
|
%b = fptoui %f32vec_t %a to %i16vec_t
|
|
store %i16vec_t %b, %i16vec_t * %p
|
|
ret void
|
|
}
|
|
|
|
define void @fptosi16(%f32vec_t %a, %i16vec_t *%p) {
|
|
; CHECK-LABEL: fptosi16:
|
|
; CHECK: vcvttps2dq %ymm
|
|
; CHECK-NOT: vcvttss2si
|
|
%b = fptosi %f32vec_t %a to %i16vec_t
|
|
store %i16vec_t %b, %i16vec_t * %p
|
|
ret void
|
|
}
|
|
|
|
define void @fptoui8(%f32vec_t %a, %i8vec_t *%p) {
|
|
; CHECK-LABEL: fptoui8:
|
|
; CHECK: vcvttps2dq %ymm
|
|
; CHECK-NOT: vcvttss2si
|
|
%b = fptoui %f32vec_t %a to %i8vec_t
|
|
store %i8vec_t %b, %i8vec_t * %p
|
|
ret void
|
|
}
|
|
|
|
define void @fptosi8(%f32vec_t %a, %i8vec_t *%p) {
|
|
; CHECK-LABEL: fptosi8:
|
|
; CHECK: vcvttps2dq %ymm
|
|
; CHECK-NOT: vcvttss2si
|
|
%b = fptosi %f32vec_t %a to %i8vec_t
|
|
store %i8vec_t %b, %i8vec_t * %p
|
|
ret void
|
|
}
|