mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-01 07:30:31 +00:00
7be3a33a0b
I was looking at some vector code generation and kept seeing unnecessary vector copies into the Altivec half of the VSX registers. I discovered that we overlooked v4i32 when adding the register classes for VSX; we only added v4f32 and v2f64. This means that anything that canonicalizes into v4i32 (which is a LOT of stuff) ends up being forced into VRRC on its way to VSRC. The fix is one line. The rest of the patch is fixing up some test cases whose code generation has changed as a result. This seems like it would be a good candidate for backport to 3.7. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242442 91177308-0d34-0410-b5e6-96231b3b80d8
53 lines
1.3 KiB
LLVM
53 lines
1.3 KiB
LLVM
; RUN: llc -mcpu=pwr8 -mattr=+vsx -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
define <2 x double> @testi0(<2 x double>* %p1, double* %p2) {
|
|
%v = load <2 x double>, <2 x double>* %p1
|
|
%s = load double, double* %p2
|
|
%r = insertelement <2 x double> %v, double %s, i32 0
|
|
ret <2 x double> %r
|
|
|
|
; CHECK-LABEL: testi0
|
|
; CHECK: lxvd2x 0, 0, 3
|
|
; CHECK: lxsdx 1, 0, 4
|
|
; CHECK: xxswapd 0, 0
|
|
; CHECK: xxspltd 1, 1, 0
|
|
; CHECK: xxpermdi 34, 0, 1, 1
|
|
}
|
|
|
|
define <2 x double> @testi1(<2 x double>* %p1, double* %p2) {
|
|
%v = load <2 x double>, <2 x double>* %p1
|
|
%s = load double, double* %p2
|
|
%r = insertelement <2 x double> %v, double %s, i32 1
|
|
ret <2 x double> %r
|
|
|
|
; CHECK-LABEL: testi1
|
|
; CHECK: lxvd2x 0, 0, 3
|
|
; CHECK: lxsdx 1, 0, 4
|
|
; CHECK: xxswapd 0, 0
|
|
; CHECK: xxspltd 1, 1, 0
|
|
; CHECK: xxmrgld 34, 1, 0
|
|
}
|
|
|
|
define double @teste0(<2 x double>* %p1) {
|
|
%v = load <2 x double>, <2 x double>* %p1
|
|
%r = extractelement <2 x double> %v, i32 0
|
|
ret double %r
|
|
|
|
; FIXME: Swap optimization will collapse this into lxvd2x 1, 0, 3.
|
|
|
|
; CHECK-LABEL: teste0
|
|
; CHECK: lxvd2x 0, 0, 3
|
|
; CHECK: xxswapd 0, 0
|
|
; CHECK: xxswapd 1, 0
|
|
}
|
|
|
|
define double @teste1(<2 x double>* %p1) {
|
|
%v = load <2 x double>, <2 x double>* %p1
|
|
%r = extractelement <2 x double> %v, i32 1
|
|
ret double %r
|
|
|
|
; CHECK-LABEL: teste1
|
|
; CHECK: lxvd2x 0, 0, 3
|
|
; CHECK: xxswapd 1, 0
|
|
}
|