mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	------------------------------------------------------------------------ r242442 | wschmidt | 2015-07-16 14:14:07 -0700 (Thu, 16 Jul 2015) | 14 lines [PowerPC] v4i32 is a VSRCRegClass 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/branches/release_37@242447 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
 | |
| }
 |