diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 2276ec5ef6..7acde01568 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,5 +1,12 @@ 2013-03-06 Richard Henderson + * sysdeps/arm/sysdep.h (BX, BXC, BLX): New macros. + (DO_RET): Use BX. + (RETINSTR): Use BXC. + * sysdeps/arm/dl-tlsdesc.S (BX): Remove. + * sysdeps/arm/dl-trampoline.S (BX): Remove. + (_dl_runtime_profile): Use BLX. + * sysdeps/arm/__longjmp.S (__longjmp): Use ldmia insn directly. * sysdeps/arm/sysdep.h (LOADREGS): Remove. diff --git a/ports/sysdeps/arm/dl-tlsdesc.S b/ports/sysdeps/arm/dl-tlsdesc.S index 718d5fd178..62a7e438c1 100644 --- a/ports/sysdeps/arm/dl-tlsdesc.S +++ b/ports/sysdeps/arm/dl-tlsdesc.S @@ -20,12 +20,6 @@ #include #include "tlsdesc.h" -#ifdef __USE_BX__ - #define BX(x) bx x -#else - #define BX(x) mov pc, x -#endif - .text @ emit debug information with cfi @ use arm-specific pseudos for unwinding itself diff --git a/ports/sysdeps/arm/dl-trampoline.S b/ports/sysdeps/arm/dl-trampoline.S index f2d1679a64..9366976762 100644 --- a/ports/sysdeps/arm/dl-trampoline.S +++ b/ports/sysdeps/arm/dl-trampoline.S @@ -21,12 +21,6 @@ #include #include -#if defined(__USE_BX__) -#define BX(x) bx x -#else -#define BX(x) mov pc, x -#endif - .text .globl _dl_runtime_resolve .type _dl_runtime_resolve, #function @@ -192,8 +186,7 @@ _dl_runtime_profile: add ip, r7, #72 ldmia ip, {r0-r3} ldr ip, [r7, #264] - mov lr, pc - BX(ip) + BLX(ip) stmia r7, {r0-r3} @ Call pltexit. diff --git a/ports/sysdeps/arm/sysdep.h b/ports/sysdeps/arm/sysdep.h index 5f6c3f2a45..84313fecd4 100644 --- a/ports/sysdeps/arm/sysdep.h +++ b/ports/sysdeps/arm/sysdep.h @@ -33,26 +33,23 @@ #define PLTJMP(_x) _x##(PLT) -/* APCS-32 doesn't preserve the condition codes across function call. */ -#ifdef __APCS_32__ #ifdef __USE_BX__ -#define RETINSTR(cond, reg) \ - bx##cond reg -#define DO_RET(_reg) \ - bx _reg +# define BX(R) bx R +# define BXC(C, R) bx##C R +# ifdef __ARM_ARCH_4T__ +# define BLX(R) mov lr, pc; bx R +# else +# define BLX(R) blx R +# endif #else -#define RETINSTR(cond, reg) \ - mov##cond pc, reg -#define DO_RET(_reg) \ - mov pc, _reg -#endif -#else /* APCS-26 */ -#define RETINSTR(cond, reg) \ - mov##cond##s pc, reg -#define DO_RET(_reg) \ - movs pc, _reg +# define BX(R) mov pc, R +# define BXC(C, R) mov##C pc, R +# define BLX(R) mov lr, pc; mov pc, R #endif +#define DO_RET(R) BX(R) +#define RETINSTR(C, R) BXC(C, R) + /* Define an entry point visible from C. */ #define ENTRY(name) \ .globl C_SYMBOL_NAME(name); \