mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
Support unaligned load/store on more ARM targets
This patch matches GCC behavior: the code used to only allow unaligned load/store on ARM for v6+ Darwin, it will now allow unaligned load/store for v6+ Darwin as well as for v7+ on other targets. The distinction is made because v6 doesn't guarantee support (but LLVM assumes that Apple controls hardware+kernel and therefore have conformant v6 CPUs), whereas v7 does provide this guarantee (and Linux behaves sanely). Overall this should slightly improve performance in most cases because of reduced I$ pressure. Patch by JF Bastien git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181897 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
db3cc56e70
commit
6fc631978c
@ -162,10 +162,23 @@ void ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) {
|
|||||||
if (!isThumb() || hasThumb2())
|
if (!isThumb() || hasThumb2())
|
||||||
PostRAScheduler = true;
|
PostRAScheduler = true;
|
||||||
|
|
||||||
// v6+ may or may not support unaligned mem access depending on the system
|
if (!StrictAlign) {
|
||||||
// configuration.
|
// Assume pre-ARMv6 doesn't support unaligned accesses.
|
||||||
if (!StrictAlign && hasV6Ops() && isTargetDarwin())
|
//
|
||||||
AllowsUnalignedMem = true;
|
// ARMv6 may or may not support unaligned accesses depending on the
|
||||||
|
// SCTLR.U bit, which is architecture-specific. We assume ARMv6
|
||||||
|
// Darwin targets support unaligned accesses, and others don't.
|
||||||
|
//
|
||||||
|
// ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
|
||||||
|
// which raises an alignment fault on unaligned accesses. Linux
|
||||||
|
// defaults this bit to 0 and handles it as a system-wide (not
|
||||||
|
// per-process) setting. It is therefore safe to assume that ARMv7+
|
||||||
|
// targets support unaligned accesses.
|
||||||
|
//
|
||||||
|
// The above behavior is consistent with GCC.
|
||||||
|
if (hasV7Ops() || (hasV6Ops() && isTargetDarwin()))
|
||||||
|
AllowsUnalignedMem = true;
|
||||||
|
}
|
||||||
|
|
||||||
// NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default.
|
// NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default.
|
||||||
uint64_t Bits = getFeatureBits();
|
uint64_t Bits = getFeatureBits();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user