mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-29 06:30:30 +00:00
Spill DPair registers, not just QPR.
The arm_neon intrinsics can create virtual registers from the DPair register class which allows both even-odd and odd-even D-register pairs. This fixes PR12389. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2ef5bf6b34
commit
5b2f913664
@ -757,7 +757,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
llvm_unreachable("Unknown reg class!");
|
||||
break;
|
||||
case 16:
|
||||
if (ARM::QPRRegClass.hasSubClassEq(RC)) {
|
||||
if (ARM::DPairRegClass.hasSubClassEq(RC)) {
|
||||
// Use aligned spills if the stack can be realigned.
|
||||
if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1q64))
|
||||
@ -907,7 +907,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
llvm_unreachable("Unknown reg class!");
|
||||
break;
|
||||
case 16:
|
||||
if (ARM::QPRRegClass.hasSubClassEq(RC)) {
|
||||
if (ARM::DPairRegClass.hasSubClassEq(RC)) {
|
||||
if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1q64), DestReg)
|
||||
.addFrameIndex(FI).addImm(16)
|
||||
|
@ -530,16 +530,16 @@ def NEONimmAllOnesV: PatLeaf<(NEONvmovImm (i32 timm)), [{
|
||||
// Use VLDM to load a Q register as a D register pair.
|
||||
// This is a pseudo instruction that is expanded to VLDMD after reg alloc.
|
||||
def VLDMQIA
|
||||
: PseudoVFPLdStM<(outs QPR:$dst), (ins GPR:$Rn),
|
||||
: PseudoVFPLdStM<(outs DPair:$dst), (ins GPR:$Rn),
|
||||
IIC_fpLoad_m, "",
|
||||
[(set QPR:$dst, (v2f64 (load GPR:$Rn)))]>;
|
||||
[(set DPair:$dst, (v2f64 (load GPR:$Rn)))]>;
|
||||
|
||||
// Use VSTM to store a Q register as a D register pair.
|
||||
// This is a pseudo instruction that is expanded to VSTMD after reg alloc.
|
||||
def VSTMQIA
|
||||
: PseudoVFPLdStM<(outs), (ins QPR:$src, GPR:$Rn),
|
||||
: PseudoVFPLdStM<(outs), (ins DPair:$src, GPR:$Rn),
|
||||
IIC_fpStore_m, "",
|
||||
[(store (v2f64 QPR:$src), GPR:$Rn)]>;
|
||||
[(store (v2f64 DPair:$src), GPR:$Rn)]>;
|
||||
|
||||
// Classes for VLD* pseudo-instructions with multi-register operands.
|
||||
// These are expanded to real instructions after register allocation.
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 -verify-machineinstrs
|
||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32"
|
||||
target triple = "thumbv7-apple-darwin10"
|
||||
|
||||
@ -47,3 +47,17 @@ bb2: ; preds = %bb
|
||||
tail call void @llvm.arm.neon.vst4.v4i32(i8* bitcast ([16 x i32]* @dbuf to i8*), <4 x i32> %2, <4 x i32> %3, <4 x i32> %4, <4 x i32> %5, i32 1) nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; PR12389
|
||||
; Make sure the DPair register class can spill.
|
||||
define void @pr12389(i8* %p) nounwind ssp {
|
||||
entry:
|
||||
%vld1 = tail call <4 x float> @llvm.arm.neon.vld1.v4f32(i8* %p, i32 1)
|
||||
tail call void asm sideeffect "", "~{q0},~{q1},~{q2},~{q3},~{q4},~{q5},~{q6},~{q7},~{q8},~{q9},~{q10},~{q11},~{q12},~{q13},~{q14},~{q15}"() nounwind
|
||||
tail call void @llvm.arm.neon.vst1.v4f32(i8* %p, <4 x float> %vld1, i32 1)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare <4 x float> @llvm.arm.neon.vld1.v4f32(i8*, i32) nounwind readonly
|
||||
|
||||
declare void @llvm.arm.neon.vst1.v4f32(i8*, <4 x float>, i32) nounwind
|
||||
|
@ -569,6 +569,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
|
||||
REG("DPR");
|
||||
REG("DPR_VFP2");
|
||||
REG("DPR_8");
|
||||
REG("DPair");
|
||||
REG("SPR");
|
||||
REG("QPR");
|
||||
REG("QQPR");
|
||||
|
Loading…
Reference in New Issue
Block a user