py: Clean up nlr*.S to make it easier to read; fix clang .bss error.

It seems that newer versions of clang don't like the .bss directive, so
we don't use it for OSX.

Addressing issues #865 and #875.
native-del-fast
Damien George 2014-09-26 13:07:26 +00:00
parent b766e79510
commit 133b083b89
3 changed files with 86 additions and 24 deletions

View File

@ -25,7 +25,12 @@
*/
#if !MICROPY_NLR_SETJMP && (defined(__thumb2__) || defined(__thumb__) || defined(__arm__))
/* arm callee save: bx, bp, sp, r12, r14, r14, r15 */
// We only need the functions here if we are on arm/thumb, and we are not
// using setjmp/longjmp.
//
// For reference, arm/thumb callee save regs are:
// r4-r11, r13=sp
.syntax unified
/*.cpu cortex-m4*/
@ -33,7 +38,9 @@
.text
.align 2
/* uint nlr_push(r0=nlr_buf_t *nlr) */
/**************************************/
// mp_uint_t nlr_push(r0=nlr_buf_t *nlr)
.global nlr_push
#if defined(__thumb2__)
.thumb
@ -64,7 +71,9 @@ nlr_push:
.word .LANCHOR0
.size nlr_push, .-nlr_push
@ void nlr_pop()
/**************************************/
// void nlr_pop()
.global nlr_pop
#if defined(__thumb2__)
.thumb
@ -82,7 +91,9 @@ nlr_pop:
.word .LANCHOR0
.size nlr_pop, .-nlr_pop
/* void nlr_jump(r0=uint val) */
/**************************************/
// void nlr_jump(r0=mp_uint_t val)
.global nlr_jump
#if defined(__thumb2__)
.thumb
@ -116,7 +127,9 @@ nlr_jump:
.word .LANCHOR0
.size nlr_jump, .-nlr_jump
/* local variable nlr_top */
/**************************************/
// local variable nlr_top
.bss
.align 2
.set .LANCHOR0,. + 0
@ -124,4 +137,5 @@ nlr_jump:
.size nlr_top, 4
nlr_top:
.space 4
#endif
#endif // !MICROPY_NLR_SETJMP && (defined(__thumb2__) || defined(__thumb__) || defined(__arm__))

View File

@ -25,18 +25,28 @@
*/
#if defined(__x86_64__) && !MICROPY_NLR_SETJMP
/* x64 callee save: bx, bp, sp, r12, r13, r14, r15 */
// We only need the functions here if we are on x86-64, and we are not
// using setjmp/longjmp.
//
// For reference, x86-64 callee save regs are:
// rbx, rbp, rsp, r12, r13, r14, r15
.file "nlr.s"
.text
#if !defined(__CYGWIN__)
#if (defined(__APPLE__) && defined(__MACH__))
#define nlr_jump_fail _nlr_jump_fail
#endif // (defined(__APPLE__) && defined(__MACH__))
/******************************************************************************/
//
// Functions for *nix and OSX.
// OSX needs _ prefix for binding to C, and doesn't support some directives.
//
/******************************************************************************/
/**************************************/
// mp_uint_t nlr_push(rdi=nlr_buf_t *nlr)
/* uint nlr_push(rdi=nlr_buf_t *nlr) */
#if !(defined(__APPLE__) && defined(__MACH__))
.globl nlr_push
.type nlr_push, @function
@ -63,7 +73,9 @@ _nlr_push:
.size nlr_push, .-nlr_push
#endif
/* void nlr_pop() */
/**************************************/
// void nlr_pop()
#if !(defined(__APPLE__) && defined(__MACH__))
.globl nlr_pop
.type nlr_pop, @function
@ -80,7 +92,9 @@ _nlr_pop:
.size nlr_pop, .-nlr_pop
#endif
/* void nlr_jump(rdi=uint val) */
/**************************************/
// void nlr_jump(rdi=mp_uint_t val)
#if !(defined(__APPLE__) && defined(__MACH__))
.globl nlr_jump
.type nlr_jump, @function
@ -110,20 +124,33 @@ nlr_jump:
ret # return
.fail:
movq %rax, %rdi # put argument back in first-arg register
je nlr_jump_fail # transfer control to nlr_jump_fail
#if !(defined(__APPLE__) && defined(__MACH__))
je nlr_jump_fail # transfer control to nlr_jump_fail
.size nlr_jump, .-nlr_jump
#else
je _nlr_jump_fail # transfer control to nlr_jump_fail
#endif
.bss
/**************************************/
// local variable nlr_top
#if !(defined(__APPLE__) && defined(__MACH__))
.bss
.local nlr_top
#endif
.comm nlr_top,8,8
#else // !defined(__CYGWIN__)
/* uint nlr_push(rcx=nlr_buf_t *nlr) */
/******************************************************************************/
//
// Functions for Cygwin
//
/******************************************************************************/
/**************************************/
// mp_uint_t nlr_push(rcx=nlr_buf_t *nlr)
.globl nlr_push
nlr_push:
movq (%rsp), %rax # load return %rip
@ -143,7 +170,9 @@ nlr_push:
xorq %rax, %rax # return 0, normal return
ret # return
/* void nlr_pop() */
/**************************************/
// void nlr_pop()
.globl nlr_pop
nlr_pop:
movq nlr_top(%rip), %rax # get nlr_top into %rax
@ -151,7 +180,9 @@ nlr_pop:
movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list)
ret # return
/* void nlr_jump(rcx=uint val) */
/**************************************/
// void nlr_jump(rcx=mp_uint_t val)
.globl nlr_jump
nlr_jump:
movq %rcx, %rax # put return value in %rax
@ -179,9 +210,12 @@ nlr_jump:
movq %rax, %rcx # put argument back in first-arg register
je nlr_jump_fail # transfer control to nlr_jump_fail
/**************************************/
// local variable nlr_top
.bss
.comm nlr_top,8,8
#endif // !defined(__CYGWIN__)
#endif // __x86_64__
#endif // defined(__x86_64__) && !MICROPY_NLR_SETJMP

View File

@ -25,12 +25,19 @@
*/
#if defined(__i386__) && !MICROPY_NLR_SETJMP
/* x86 callee save: bx, di, si, bp, sp */
// We only need the functions here if we are on x86, and we are not
// using setjmp/longjmp.
//
// For reference, x86 callee save regs are:
// ebx, esi, edi, ebp, esp, eip
.file "nlr.s"
.text
/* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */
/**************************************/
// mp_uint_t nlr_push(4(%esp)=nlr_buf_t *nlr)
#ifdef _WIN32
.globl _nlr_push
.def _nlr_push; .scl 2; .type 32; .endef
@ -57,7 +64,9 @@ nlr_push:
.size nlr_push, .-nlr_push
#endif
/* void nlr_pop() */
/**************************************/
// void nlr_pop()
#ifdef _WIN32
.globl _nlr_pop
.def _nlr_pop; .scl 2; .type 32; .endef
@ -75,7 +84,9 @@ nlr_pop:
.size nlr_pop, .-nlr_pop
#endif
/* void nlr_jump(4(%esp)=uint val) */
/**************************************/
// void nlr_jump(4(%esp)=mp_uint_t val)
#ifdef _WIN32
.globl _nlr_jump
.def _nlr_jump; .scl 2; .type 32; .endef
@ -110,10 +121,13 @@ nlr_jump:
.size nlr_jump, .-nlr_jump
#endif
/**************************************/
// local variable nlr_top
.bss
#ifndef _WIN32
.local nlr_top
#endif
.comm nlr_top,4,4
#endif /* __i386__ */
#endif // defined(__i386__) && !MICROPY_NLR_SETJMP