[arm-fast-isel] Doublewords only require word-alignment.

rdar://10528060

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145891 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier 2011-12-06 01:44:17 +00:00
parent 3e572ac2fb
commit ed42c5f778
2 changed files with 22 additions and 3 deletions

View File

@ -1106,7 +1106,7 @@ bool ARMFastISel::ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr,
case MVT::f32:
if (!Subtarget->hasVFP2()) return false;
StrOpc = ARM::VSTRS;
// Unaligned stores need special handling.
// Unaligned stores need special handling. Floats require word-alignment.
if (Alignment && Alignment < 4) {
unsigned MoveReg = createResultReg(TLI.getRegClassFor(MVT::i32));
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
@ -1119,8 +1119,9 @@ bool ARMFastISel::ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr,
break;
case MVT::f64:
if (!Subtarget->hasVFP2()) return false;
// FIXME: Unaligned stores need special handling.
if (Alignment && Alignment < 8) {
// FIXME: Unaligned stores need special handling. Doublewords require
// word-alignment.
if (Alignment && Alignment < 4) {
return false;
}
StrOpc = ARM::VSTRD;

View File

@ -180,3 +180,21 @@ entry:
store float %add, float* %x1, align 1
ret void
}
; Doublewords require only word-alignment.
; rdar://10528060
%struct.anon.0 = type { double }
@foo_unpacked = common global %struct.anon.0 zeroinitializer, align 4
define void @test5(double %a, double %b) nounwind {
entry:
; ARM: @test5
; THUMB: @test5
%add = fadd double %a, %b
store double %add, double* getelementptr inbounds (%struct.anon.0* @foo_unpacked, i32 0, i32 0), align 4
; ARM: vstr d16, [r0]
; THUMB: vstr d16, [r0]
ret void
}