mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[fast-isel] Fallback to SelectionDAG isel if we require strict alignment for
non-aligned i32 loads/stores. rdar://12304911 llvm-svn: 164381
This commit is contained in:
parent
3083ebd4de
commit
a58913fc00
@ -1036,6 +1036,9 @@ bool ARMFastISel::ARMEmitLoad(EVT VT, unsigned &ResultReg, Address &Addr,
|
||||
RC = &ARM::GPRRegClass;
|
||||
break;
|
||||
case MVT::i32:
|
||||
if (Alignment && Alignment < 4 && !Subtarget->allowsUnalignedMem())
|
||||
return false;
|
||||
|
||||
if (isThumb2) {
|
||||
if (Addr.Offset < 0 && Addr.Offset > -256 && Subtarget->hasV6T2Ops())
|
||||
Opc = ARM::t2LDRi8;
|
||||
@ -1156,6 +1159,9 @@ bool ARMFastISel::ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr,
|
||||
}
|
||||
break;
|
||||
case MVT::i32:
|
||||
if (Alignment && Alignment < 4 && !Subtarget->allowsUnalignedMem())
|
||||
return false;
|
||||
|
||||
if (isThumb2) {
|
||||
if (Addr.Offset < 0 && Addr.Offset > -256 && Subtarget->hasV6T2Ops())
|
||||
StrOpc = ARM::t2STRi8;
|
||||
|
@ -268,3 +268,39 @@ entry:
|
||||
%0 = load i16* %x, align 1
|
||||
ret i16 %0
|
||||
}
|
||||
|
||||
define void @unaligned_i32_store(i32 %x, i32* %y) nounwind {
|
||||
entry:
|
||||
; ARM-STRICT-ALIGN: @unaligned_i32_store
|
||||
; ARM-STRICT-ALIGN: strb
|
||||
; ARM-STRICT-ALIGN: strb
|
||||
; ARM-STRICT-ALIGN: strb
|
||||
; ARM-STRICT-ALIGN: strb
|
||||
|
||||
; THUMB-STRICT-ALIGN: @unaligned_i32_store
|
||||
; THUMB-STRICT-ALIGN: strb
|
||||
; THUMB-STRICT-ALIGN: strb
|
||||
; THUMB-STRICT-ALIGN: strb
|
||||
; THUMB-STRICT-ALIGN: strb
|
||||
|
||||
store i32 %x, i32* %y, align 1
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @unaligned_i32_load(i32* %x) nounwind {
|
||||
entry:
|
||||
; ARM-STRICT-ALIGN: @unaligned_i32_load
|
||||
; ARM-STRICT-ALIGN: ldrb
|
||||
; ARM-STRICT-ALIGN: ldrb
|
||||
; ARM-STRICT-ALIGN: ldrb
|
||||
; ARM-STRICT-ALIGN: ldrb
|
||||
|
||||
; THUMB-STRICT-ALIGN: @unaligned_i32_load
|
||||
; THUMB-STRICT-ALIGN: ldrb
|
||||
; THUMB-STRICT-ALIGN: ldrb
|
||||
; THUMB-STRICT-ALIGN: ldrb
|
||||
; THUMB-STRICT-ALIGN: ldrb
|
||||
|
||||
%0 = load i32* %x, align 1
|
||||
ret i32 %0
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user