mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
[fast-isel] Fallback to SelectionDAG isel if we require strict alignment for
non-aligned i32 loads/stores. rdar://12304911 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164381 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e5bd3cf000
commit
e5e674ba11
@ -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