mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-24 13:06:56 +00:00
e693d3c558
This implements PPCTargetLowering::getTgtMemIntrinsic for Altivec load/store intrinsics. As with the construction of the MachineMemOperands for the intrinsic calls used for unaligned load/store lowering, the only slight complication is that we need to represent a larger memory range than the loaded/stored value-type size (because the address is rounded down to an aligned address, and we need to conservatively represent the entire possible range of the actual access). This required adding an extra size field to TargetLowering::IntrinsicInfo, and this was done in a way that required no modifications to other targets (the size defaults to the store size of the provided memory data type). This fixes test/CodeGen/PowerPC/unal-altivec-wint.ll (so it can be un-XFAILed). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215512 91177308-0d34-0410-b5e6-96231b3b80d8
49 lines
1.2 KiB
LLVM
49 lines
1.2 KiB
LLVM
; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
|
|
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
declare <4 x i32> @llvm.ppc.altivec.lvx(i8*) #1
|
|
|
|
define <4 x i32> @test1(<4 x i32>* %h) #0 {
|
|
entry:
|
|
%h1 = getelementptr <4 x i32>* %h, i64 1
|
|
%hv = bitcast <4 x i32>* %h1 to i8*
|
|
%vl = call <4 x i32> @llvm.ppc.altivec.lvx(i8* %hv)
|
|
|
|
%v0 = load <4 x i32>* %h, align 8
|
|
|
|
%a = add <4 x i32> %v0, %vl
|
|
ret <4 x i32> %a
|
|
|
|
; CHECK-LABEL: @test1
|
|
; CHECK: li [[REG:[0-9]+]], 16
|
|
; CHECK-NOT: li {{[0-9]+}}, 15
|
|
; CHECK-DAG: lvx {{[0-9]+}}, 0, 3
|
|
; CHECK-DAG: lvx {{[0-9]+}}, 3, [[REG]]
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare void @llvm.ppc.altivec.stvx(<4 x i32>, i8*) #0
|
|
|
|
define <4 x i32> @test2(<4 x i32>* %h, <4 x i32> %d) #0 {
|
|
entry:
|
|
%h1 = getelementptr <4 x i32>* %h, i64 1
|
|
%hv = bitcast <4 x i32>* %h1 to i8*
|
|
call void @llvm.ppc.altivec.stvx(<4 x i32> %d, i8* %hv)
|
|
|
|
%v0 = load <4 x i32>* %h, align 8
|
|
|
|
ret <4 x i32> %v0
|
|
|
|
; CHECK-LABEL: @test2
|
|
; CHECK: li [[REG:[0-9]+]], 16
|
|
; CHECK-NOT: li {{[0-9]+}}, 15
|
|
; CHECK-DAG: lvx {{[0-9]+}}, 0, 3
|
|
; CHECK-DAG: lvx {{[0-9]+}}, 3, [[REG]]
|
|
; CHECK: blr
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|
|
attributes #1 = { nounwind readonly }
|
|
|