diff options
| author | Rob Pike <r@golang.org> | 2015-02-13 14:21:18 -0800 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2015-02-13 23:08:51 +0000 |
| commit | 69ddb7a40849f9330170144dc82a1da9627acaa9 (patch) | |
| tree | e3e1950619dcc845d114d5edbe81cdceb62b7110 /src/sync/atomic/asm_linux_arm.s | |
| parent | 2ecefd41fa853e40346e0f89c632efb8682c431b (diff) | |
| download | go-69ddb7a40849f9330170144dc82a1da9627acaa9.tar.xz | |
[dev.cc] all: edit assembly source for ARM to be more regular
Several .s files for ARM had several properties the new assembler will not support.
These include:
- mentioning SP or PC as a hardware register
These are always pseudo-registers except that in some contexts
they're not, and it's confusing because the context should not affect
which register you mean. Change the references to the hardware
registers to be explicit: R13 for SP, R15 for PC.
- constant creation using assignment
The files say a=b when they could instead say #define a b.
There is no reason to have both mechanisms.
- R(0) to refer to R0.
Some macros use this to a great extent. Again, it's easy just to
use a #define to rename a register.
Change-Id: I002335ace8e876c5b63c71c2560533eb835346d2
Reviewed-on: https://go-review.googlesource.com/4822
Reviewed-by: Dave Cheney <dave@cheney.net>
Diffstat (limited to 'src/sync/atomic/asm_linux_arm.s')
| -rw-r--r-- | src/sync/atomic/asm_linux_arm.s | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/sync/atomic/asm_linux_arm.s b/src/sync/atomic/asm_linux_arm.s index b388e4c550..63562388a2 100644 --- a/src/sync/atomic/asm_linux_arm.s +++ b/src/sync/atomic/asm_linux_arm.s @@ -24,7 +24,7 @@ // http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b49c0f24cf6744a3f4fd09289fe7cade349dead5 // TEXT cas<>(SB),NOSPLIT,$0 - MOVW $0xffff0fc0, PC + MOVW $0xffff0fc0, R15 TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0 B ·CompareAndSwapUint32(SB) @@ -95,7 +95,7 @@ TEXT ·SwapUintptr(SB),NOSPLIT,$0 B ·SwapUint32(SB) TEXT cas64<>(SB),NOSPLIT,$0 - MOVW $0xffff0f60, PC // __kuser_cmpxchg64: Linux-3.1 and above + MOVW $0xffff0f60, R15 // R15 = hardware PC. __kuser_cmpxchg64: Linux-3.1 and above TEXT kernelCAS64<>(SB),NOSPLIT,$0-21 // int (*__kuser_cmpxchg64_t)(const int64_t *oldval, const int64_t *newval, volatile int64_t *ptr); @@ -127,17 +127,17 @@ TEXT setupAndCallCAS64<>(SB),NOSPLIT,$-4-21 CMP $5, R0 MOVW.CS $kernelCAS64<>(SB), R1 MOVW.CS R1, armCAS64(SB) - MOVW.CS R1, PC + MOVW.CS R1, R15 // R15 = hardware PC MOVB runtime·armArch(SB), R0 // LDREXD, STREXD only present on ARMv6K or higher CMP $6, R0 // TODO(minux): how to differentiate ARMv6 with ARMv6K? MOVW.CS $·armCompareAndSwapUint64(SB), R1 MOVW.CS R1, armCAS64(SB) - MOVW.CS R1, PC + MOVW.CS R1, R15 // we are out of luck, can only use runtime's emulated 64-bit cas MOVW $·generalCAS64(SB), R1 MOVW R1, armCAS64(SB) - MOVW R1, PC + MOVW R1, R15 TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0 B ·CompareAndSwapUint64(SB) @@ -145,7 +145,7 @@ TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0 TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$-4-21 MOVW armCAS64(SB), R0 CMP $0, R0 - MOVW.NE R0, PC + MOVW.NE R0, R15 // R15 = hardware PC B setupAndCallCAS64<>(SB) TEXT ·AddInt64(SB),NOSPLIT,$0 |
