mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
v8i8 -> v8i32 on AVX machines. The codegen often scalarizes ANY_EXTEND nodes. The DAGCombiner has two optimizations that can mitigate the problem. First, if all of the operands of a BUILD_VECTOR node are extracted from an ZEXT/ANYEXT nodes, then it is possible to create a new simplified BUILD_VECTOR which uses UNDEFS/ZERO values to eliminate the scalar ZEXT/ANYEXT nodes. Second, another dag combine optimization lowers BUILD_VECTOR into a shuffle vector instruction. In the case of zext v8i8->v8i32 on AVX, a value in an XMM register is to be shuffled into a wide YMM register. This patch modifes the second optimization and allows the creation of shuffle vectors even when the newly generated vector and the original vector from which we extract the values are of different types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150340 91177308-0d34-0410-b5e6-96231b3b80d8
31 lines
692 B
LLVM
Executable File
31 lines
692 B
LLVM
Executable File
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
|
|
|
|
define <8 x i32> @zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
|
|
;CHECK: zext_8i16_to_8i32
|
|
;CHECK: vpunpckhwd
|
|
;CHECK: ret
|
|
|
|
%B = zext <8 x i16> %A to <8 x i32>
|
|
ret <8 x i32>%B
|
|
}
|
|
|
|
define <4 x i64> @zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
|
|
;CHECK: zext_4i32_to_4i64
|
|
;CHECK: vpunpckhdq
|
|
;CHECK: ret
|
|
|
|
%B = zext <4 x i32> %A to <4 x i64>
|
|
ret <4 x i64>%B
|
|
}
|
|
|
|
|
|
define <8 x i32> @zext_8i8_to_8i32(<8 x i8> %z) {
|
|
;CHECK: zext_8i8_to_8i32
|
|
;CHECK: vpunpckhwd
|
|
;CHECK: vpunpcklwd
|
|
;CHECK: vinsertf128
|
|
;CHECK: ret
|
|
%t = zext <8 x i8> %z to <8 x i32>
|
|
ret <8 x i32> %t
|
|
}
|