From e85c38992da1f62fc07ee8e203ea98a221857b59 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 30 Dec 2013 03:38:32 +0200 Subject: Make "unix" target be crossplatform and support x86, x64, ARM hosts. --- py/asmx64.c | 3 +- py/nlrthumb.S | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ py/nlrthumb.s | 91 --------------------------------------------------------- py/nlrx64.S | 62 +++++++++++++++++++++++++++++++++++++++ py/nlrx64.s | 60 -------------------------------------- py/nlrx86.S | 59 +++++++++++++++++++++++++++++++++++++ py/nlrx86.s | 57 ------------------------------------ py/showbc.c | 32 ++++++++++---------- 8 files changed, 232 insertions(+), 225 deletions(-) create mode 100644 py/nlrthumb.S delete mode 100644 py/nlrthumb.s create mode 100644 py/nlrx64.S delete mode 100644 py/nlrx64.s create mode 100644 py/nlrx86.S delete mode 100644 py/nlrx86.s (limited to 'py') diff --git a/py/asmx64.c b/py/asmx64.c index 2a11de207..c023900a8 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -5,6 +5,7 @@ #include #include "misc.h" +#include "mpconfig.h" #include "asmx64.h" /* all offsets are measured in multiples of 8 bytes */ @@ -602,7 +603,7 @@ void asm_x64_call_i1(asm_x64_t* as, void* func, int i1) */ void asm_x64_call_ind(asm_x64_t* as, void *ptr, int temp_r64) { - asm_x64_mov_i64_to_r64_optimised(as, (int64_t)ptr, temp_r64); + asm_x64_mov_i64_to_r64_optimised(as, (machine_int_t)ptr, temp_r64); asm_x64_write_byte_2(as, OPCODE_CALL_RM32, MODRM_R64(2) | MODRM_RM_REG | MODRM_RM_R64(temp_r64)); // this reduces code size by 2 bytes per call, but doesn't seem to speed it up at all // doesn't work anymore because calls are 64 bits away diff --git a/py/nlrthumb.S b/py/nlrthumb.S new file mode 100644 index 000000000..22e0b6ba4 --- /dev/null +++ b/py/nlrthumb.S @@ -0,0 +1,93 @@ +#ifdef __thumb2__ +/* thumb callee save: bx, bp, sp, r12, r14, r14, r15 */ + + .syntax unified + .cpu cortex-m4 + .thumb + .text + .align 2 + +/* uint nlr_push(r0=nlr_buf_t *nlr) */ + .global nlr_push + .thumb + .thumb_func + .type nlr_push, %function +nlr_push: + str lr, [r0, #8] @ store lr into nlr_buf + str r4, [r0, #12] @ store r4 into nlr_buf + str r5, [r0, #16] @ store r5 into nlr_buf + str r6, [r0, #20] @ store r6 into nlr_buf + str r7, [r0, #24] @ store r7 into nlr_buf + str r8, [r0, #28] @ store r8 into nlr_buf + str r9, [r0, #32] @ store r9 into nlr_buf + str r10, [r0, #36] @ store r10 into nlr_buf + str r11, [r0, #40] @ store r11 into nlr_buf + str r13, [r0, #44] @ store r13=sp into nlr_buf + + ldr r3, .L2 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + str r2, [r0] @ store nlr_top into nlr_buf + str r0, [r3] @ store nlr_buf into nlr_top (to link list) + + movs r0, #0 @ return 0, normal return + bx lr @ return + .align 2 +.L2: + .word .LANCHOR0 + .size nlr_push, .-nlr_push + +@ void nlr_pop() + .global nlr_pop + .thumb + .thumb_func + .type nlr_pop, %function +nlr_pop: + ldr r3, .L5 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + ldr r2, [r2] @ load prev nlr_buf + str r2, [r3] @ store prev nlr_buf to nlr_top (to unlink list) + bx lr @ return + .align 2 +.L5: + .word .LANCHOR0 + .size nlr_pop, .-nlr_pop + +/* void nlr_jump(r0=uint val) */ + .global nlr_jump + .thumb + .thumb_func + .type nlr_jump, %function +nlr_jump: + ldr r3, .L2 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + str r0, [r2, #4] @ store return value + ldr r0, [r2] @ load prev nlr_buf + str r0, [r3] @ store prev nol_buf into nlr_top (to unlink list) + + ldr lr, [r2, #8] @ load lr from nlr_buf + ldr r4, [r2, #12] @ load r4 from nlr_buf + ldr r5, [r2, #16] @ load r5 from nlr_buf + ldr r6, [r2, #20] @ load r6 from nlr_buf + ldr r7, [r2, #24] @ load r7 from nlr_buf + ldr r8, [r2, #28] @ load r8 from nlr_buf + ldr r9, [r2, #32] @ load r9 from nlr_buf + ldr r10, [r2, #36] @ load r10 from nlr_buf + ldr r11, [r2, #40] @ load r11 from nlr_buf + ldr r13, [r2, #44] @ load r13=sp from nlr_buf + + movs r0, #1 @ return 1, non-local return + bx lr @ return + .align 2 +.L6: + .word .LANCHOR0 + .size nlr_jump, .-nlr_jump + +/* local variable nlr_top */ + .bss + .align 2 + .set .LANCHOR0,. + 0 + .type nlr_top, %object + .size nlr_top, 4 +nlr_top: + .space 4 +#endif diff --git a/py/nlrthumb.s b/py/nlrthumb.s deleted file mode 100644 index d4d1bff23..000000000 --- a/py/nlrthumb.s +++ /dev/null @@ -1,91 +0,0 @@ -@ thumb callee save: bx, bp, sp, r12, r14, r14, r15 - - .syntax unified - .cpu cortex-m4 - .thumb - .text - .align 2 - -@ uint nlr_push(r0=nlr_buf_t *nlr) - .global nlr_push - .thumb - .thumb_func - .type nlr_push, %function -nlr_push: - str lr, [r0, #8] @ store lr into nlr_buf - str r4, [r0, #12] @ store r4 into nlr_buf - str r5, [r0, #16] @ store r5 into nlr_buf - str r6, [r0, #20] @ store r6 into nlr_buf - str r7, [r0, #24] @ store r7 into nlr_buf - str r8, [r0, #28] @ store r8 into nlr_buf - str r9, [r0, #32] @ store r9 into nlr_buf - str r10, [r0, #36] @ store r10 into nlr_buf - str r11, [r0, #40] @ store r11 into nlr_buf - str r13, [r0, #44] @ store r13=sp into nlr_buf - - ldr r3, .L2 @ load addr of nlr_top - ldr r2, [r3] @ load nlr_top - str r2, [r0] @ store nlr_top into nlr_buf - str r0, [r3] @ store nlr_buf into nlr_top (to link list) - - movs r0, #0 @ return 0, normal return - bx lr @ return - .align 2 -.L2: - .word .LANCHOR0 - .size nlr_push, .-nlr_push - -@ void nlr_pop() - .global nlr_pop - .thumb - .thumb_func - .type nlr_pop, %function -nlr_pop: - ldr r3, .L5 @ load addr of nlr_top - ldr r2, [r3] @ load nlr_top - ldr r2, [r2] @ load prev nlr_buf - str r2, [r3] @ store prev nlr_buf to nlr_top (to unlink list) - bx lr @ return - .align 2 -.L5: - .word .LANCHOR0 - .size nlr_pop, .-nlr_pop - -@ void nlr_jump(r0=uint val) - .global nlr_jump - .thumb - .thumb_func - .type nlr_jump, %function -nlr_jump: - ldr r3, .L2 @ load addr of nlr_top - ldr r2, [r3] @ load nlr_top - str r0, [r2, #4] @ store return value - ldr r0, [r2] @ load prev nlr_buf - str r0, [r3] @ store prev nol_buf into nlr_top (to unlink list) - - ldr lr, [r2, #8] @ load lr from nlr_buf - ldr r4, [r2, #12] @ load r4 from nlr_buf - ldr r5, [r2, #16] @ load r5 from nlr_buf - ldr r6, [r2, #20] @ load r6 from nlr_buf - ldr r7, [r2, #24] @ load r7 from nlr_buf - ldr r8, [r2, #28] @ load r8 from nlr_buf - ldr r9, [r2, #32] @ load r9 from nlr_buf - ldr r10, [r2, #36] @ load r10 from nlr_buf - ldr r11, [r2, #40] @ load r11 from nlr_buf - ldr r13, [r2, #44] @ load r13=sp from nlr_buf - - movs r0, #1 @ return 1, non-local return - bx lr @ return - .align 2 -.L6: - .word .LANCHOR0 - .size nlr_jump, .-nlr_jump - -@ local variable nlr_top - .bss - .align 2 - .set .LANCHOR0,. + 0 - .type nlr_top, %object - .size nlr_top, 4 -nlr_top: - .space 4 diff --git a/py/nlrx64.S b/py/nlrx64.S new file mode 100644 index 000000000..6d0e2118f --- /dev/null +++ b/py/nlrx64.S @@ -0,0 +1,62 @@ +#ifdef __x86_64__ +/* x64 callee save: bx, bp, sp, r12, r14, r14, r15 */ + + .file "nlr.s" + .text + +/* uint nlr_push(rdi=nlr_buf_t *nlr) */ + .globl nlr_push + .type nlr_push, @function +nlr_push: + movq (%rsp), %rax # load return %rip + movq %rax, 16(%rdi) # store %rip into nlr_buf + movq %rbp, 24(%rdi) # store %rbp into nlr_buf + movq %rsp, 32(%rdi) # store %rsp into nlr_buf + movq %rbx, 40(%rdi) # store %rbx into nlr_buf + movq %r12, 48(%rdi) # store %r12 into nlr_buf + movq %r13, 56(%rdi) # store %r13 into nlr_buf + movq %r14, 64(%rdi) # store %r14 into nlr_buf + movq %r15, 72(%rdi) # store %r15 into nlr_buf + movq nlr_top(%rip), %rax # get last nlr_buf + movq %rax, (%rdi) # store it + movq %rdi, nlr_top(%rip) # stor new nlr_buf (to make linked list) + xorq %rax, %rax # return 0, normal return + ret # return + .size nlr_push, .-nlr_push + +/* void nlr_pop() */ + .globl nlr_pop + .type nlr_pop, @function +nlr_pop: + movq nlr_top(%rip), %rax # get nlr_top into %rax + movq (%rax), %rax # load prev nlr_buf + movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) + ret # return + .size nlr_pop, .-nlr_pop + +/* void nlr_jump(rdi=uint val) */ + .globl nlr_jump + .type nlr_jump, @function +nlr_jump: + movq %rdi, %rax # put return value in %rax + movq nlr_top(%rip), %rdi # get nlr_top into %rdi + movq %rax, 8(%rdi) # store return value + movq (%rdi), %rax # load prev nlr_buf + movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) + movq 72(%rdi), %r15 # load saved %r15 + movq 64(%rdi), %r14 # load saved %r14 + movq 56(%rdi), %r13 # load saved %r13 + movq 48(%rdi), %r12 # load saved %r12 + movq 40(%rdi), %rbx # load saved %rbx + movq 32(%rdi), %rsp # load saved %rsp + movq 24(%rdi), %rbp # load saved %rbp + movq 16(%rdi), %rax # load saved %rip + movq %rax, (%rsp) # store saved %rip to stack + xorq %rax, %rax # clear return register + inc %al # increase to make 1, non-local return + ret # return + .size nlr_jump, .-nlr_jump + + .local nlr_top + .comm nlr_top,8,8 +#endif diff --git a/py/nlrx64.s b/py/nlrx64.s deleted file mode 100644 index cf0eb3cd7..000000000 --- a/py/nlrx64.s +++ /dev/null @@ -1,60 +0,0 @@ -# x64 callee save: bx, bp, sp, r12, r14, r14, r15 - - .file "nlr.s" - .text - -# uint nlr_push(rdi=nlr_buf_t *nlr) - .globl nlr_push - .type nlr_push, @function -nlr_push: - movq (%rsp), %rax # load return %rip - movq %rax, 16(%rdi) # store %rip into nlr_buf - movq %rbp, 24(%rdi) # store %rbp into nlr_buf - movq %rsp, 32(%rdi) # store %rsp into nlr_buf - movq %rbx, 40(%rdi) # store %rbx into nlr_buf - movq %r12, 48(%rdi) # store %r12 into nlr_buf - movq %r13, 56(%rdi) # store %r13 into nlr_buf - movq %r14, 64(%rdi) # store %r14 into nlr_buf - movq %r15, 72(%rdi) # store %r15 into nlr_buf - movq nlr_top(%rip), %rax # get last nlr_buf - movq %rax, (%rdi) # store it - movq %rdi, nlr_top(%rip) # stor new nlr_buf (to make linked list) - xorq %rax, %rax # return 0, normal return - ret # return - .size nlr_push, .-nlr_push - -# void nlr_pop() - .globl nlr_pop - .type nlr_pop, @function -nlr_pop: - movq nlr_top(%rip), %rax # get nlr_top into %rax - movq (%rax), %rax # load prev nlr_buf - movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) - ret # return - .size nlr_pop, .-nlr_pop - -# void nlr_jump(rdi=uint val) - .globl nlr_jump - .type nlr_jump, @function -nlr_jump: - movq %rdi, %rax # put return value in %rax - movq nlr_top(%rip), %rdi # get nlr_top into %rdi - movq %rax, 8(%rdi) # store return value - movq (%rdi), %rax # load prev nlr_buf - movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) - movq 72(%rdi), %r15 # load saved %r15 - movq 64(%rdi), %r14 # load saved %r14 - movq 56(%rdi), %r13 # load saved %r13 - movq 48(%rdi), %r12 # load saved %r12 - movq 40(%rdi), %rbx # load saved %rbx - movq 32(%rdi), %rsp # load saved %rsp - movq 24(%rdi), %rbp # load saved %rbp - movq 16(%rdi), %rax # load saved %rip - movq %rax, (%rsp) # store saved %rip to stack - xorq %rax, %rax # clear return register - inc %al # increase to make 1, non-local return - ret # return - .size nlr_jump, .-nlr_jump - - .local nlr_top - .comm nlr_top,8,8 diff --git a/py/nlrx86.S b/py/nlrx86.S new file mode 100644 index 000000000..3e2eec7a7 --- /dev/null +++ b/py/nlrx86.S @@ -0,0 +1,59 @@ +#ifdef __i386__ +/* x86 callee save: bx, di, si, bp, sp */ + + .file "nlr.s" + .text + +/* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */ + .globl nlr_push + .type nlr_push, @function +nlr_push: + mov 4(%esp), %edx # load nlr_buf + mov (%esp), %eax # load return %ip + mov %eax, 8(%edx) # store %ip into nlr_buf+8 + mov %ebp, 12(%edx) # store %bp into nlr_buf+12 + mov %esp, 16(%edx) # store %sp into nlr_buf+16 + mov %ebx, 20(%edx) # store %bx into nlr_buf+20 + mov %edi, 24(%edx) # store %di into nlr_buf + mov %esi, 28(%edx) # store %si into nlr_buf + mov nlr_top, %eax # load nlr_top + mov %eax, (%edx) # store it + mov %edx, nlr_top # stor new nlr_buf (to make linked list) + xor %eax, %eax # return 0, normal return + ret # return + .size nlr_push, .-nlr_push + +/* void nlr_pop() */ + .globl nlr_pop + .type nlr_pop, @function +nlr_pop: + mov nlr_top, %eax # load nlr_top + mov (%eax), %eax # load prev nlr_buf + mov %eax, nlr_top # store nlr_top (to unlink list) + ret # return + .size nlr_pop, .-nlr_pop + +/* void nlr_jump(4(%esp)=uint val) */ + .globl nlr_jump + .type nlr_jump, @function +nlr_jump: + mov nlr_top, %edx # load nlr_top + mov 4(%esp), %eax # load return value + mov %eax, 4(%edx) # store return value + mov (%edx), %eax # load prev nlr_top + mov %eax, nlr_top # store nlr_top (to unlink list) + mov 28(%edx), %esi # load saved %si + mov 24(%edx), %edi # load saved %di + mov 20(%edx), %ebx # load saved %bx + mov 16(%edx), %esp # load saved %sp + mov 12(%edx), %ebp # load saved %bp + mov 8(%edx), %eax # load saved %ip + mov %eax, (%esp) # store saved %ip to stack + xor %eax, %eax # clear return register + inc %al # increase to make 1, non-local return + ret # return + .size nlr_jump, .-nlr_jump + + .local nlr_top + .comm nlr_top,4,4 +#endif diff --git a/py/nlrx86.s b/py/nlrx86.s deleted file mode 100644 index 364766da7..000000000 --- a/py/nlrx86.s +++ /dev/null @@ -1,57 +0,0 @@ -# x86 callee save: bx, di, si, bp, sp - - .file "nlr.s" - .text - -# uint nlr_push(4(%esp)=nlr_buf_t *nlr) - .globl nlr_push - .type nlr_push, @function -nlr_push: - mov 4(%esp), %edx # load nlr_buf - mov (%esp), %eax # load return %ip - mov %eax, 8(%edx) # store %ip into nlr_buf+8 - mov %ebp, 12(%edx) # store %bp into nlr_buf+12 - mov %esp, 16(%edx) # store %sp into nlr_buf+16 - mov %ebx, 20(%edx) # store %bx into nlr_buf+20 - mov %edi, 24(%edx) # store %di into nlr_buf - mov %esi, 28(%edx) # store %si into nlr_buf - mov nlr_top, %eax # load nlr_top - mov %eax, (%edx) # store it - mov %edx, nlr_top # stor new nlr_buf (to make linked list) - xor %eax, %eax # return 0, normal return - ret # return - .size nlr_push, .-nlr_push - -# void nlr_pop() - .globl nlr_pop - .type nlr_pop, @function -nlr_pop: - mov nlr_top, %eax # load nlr_top - mov (%eax), %eax # load prev nlr_buf - mov %eax, nlr_top # store nlr_top (to unlink list) - ret # return - .size nlr_pop, .-nlr_pop - -# void nlr_jump(4(%esp)=uint val) - .globl nlr_jump - .type nlr_jump, @function -nlr_jump: - mov nlr_top, %edx # load nlr_top - mov 4(%esp), %eax # load return value - mov %eax, 4(%edx) # store return value - mov (%edx), %eax # load prev nlr_top - mov %eax, nlr_top # store nlr_top (to unlink list) - mov 28(%edx), %esi # load saved %si - mov 24(%edx), %edi # load saved %di - mov 20(%edx), %ebx # load saved %bx - mov 16(%edx), %esp # load saved %sp - mov 12(%edx), %ebp # load saved %bp - mov 8(%edx), %eax # load saved %ip - mov %eax, (%esp) # store saved %ip to stack - xor %eax, %eax # clear return register - inc %al # increase to make 1, non-local return - ret # return - .size nlr_jump, .-nlr_jump - - .local nlr_top - .comm nlr_top,4,4 diff --git a/py/showbc.c b/py/showbc.c index 20a9790f9..4bdbee89f 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -70,7 +70,7 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_LOAD_FAST_N: DECODE_UINT; - printf("LOAD_FAST_N %lu", unum); + printf("LOAD_FAST_N " UINT_FMT, unum); break; case MP_BC_LOAD_NAME: @@ -111,7 +111,7 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_STORE_FAST_N: DECODE_UINT; - printf("STORE_FAST_N %lu", unum); + printf("STORE_FAST_N " UINT_FMT, unum); break; case MP_BC_STORE_NAME: @@ -161,17 +161,17 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_JUMP: DECODE_SLABEL; - printf("JUMP %lu", ip + unum - ip_start); + printf("JUMP " UINT_FMT, ip + unum - ip_start); break; case MP_BC_POP_JUMP_IF_TRUE: DECODE_SLABEL; - printf("POP_JUMP_IF_TRUE %lu", ip + unum - ip_start); + printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - ip_start); break; case MP_BC_POP_JUMP_IF_FALSE: DECODE_SLABEL; - printf("POP_JUMP_IF_FALSE %lu", ip + unum - ip_start); + printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start); break; /* @@ -196,7 +196,7 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_SETUP_EXCEPT: DECODE_ULABEL; // except labels are always forward - printf("SETUP_EXCEPT %lu", ip + unum - ip_start); + printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start); break; case MP_BC_END_FINALLY: @@ -213,7 +213,7 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_FOR_ITER: DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward - printf("FOR_ITER %lu", ip + unum - ip_start); + printf("FOR_ITER " UINT_FMT, ip + unum - ip_start); break; case MP_BC_POP_BLOCK: @@ -235,22 +235,22 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_BINARY_OP: unum = *ip++; - printf("BINARY_OP %lu", unum); + printf("BINARY_OP " UINT_FMT, unum); break; case MP_BC_COMPARE_OP: unum = *ip++; - printf("COMPARE_OP %lu", unum); + printf("COMPARE_OP " UINT_FMT, unum); break; case MP_BC_BUILD_TUPLE: DECODE_UINT; - printf("BUILD_TUPLE %lu", unum); + printf("BUILD_TUPLE " UINT_FMT, unum); break; case MP_BC_BUILD_LIST: DECODE_UINT; - printf("BUILD_LIST %lu", unum); + printf("BUILD_LIST " UINT_FMT, unum); break; /* @@ -264,7 +264,7 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_BUILD_MAP: DECODE_UINT; - printf("BUILD_MAP %lu", unum); + printf("BUILD_MAP " UINT_FMT, unum); break; /* @@ -297,22 +297,22 @@ void mp_show_byte_code(const byte *ip, int len) { case MP_BC_UNPACK_SEQUENCE: DECODE_UINT; - printf("UNPACK_SEQUENCE %lu", unum); + printf("UNPACK_SEQUENCE " UINT_FMT, unum); break; case MP_BC_MAKE_FUNCTION: DECODE_UINT; - printf("MAKE_FUNCTION %lu", unum); + printf("MAKE_FUNCTION " UINT_FMT, unum); break; case MP_BC_CALL_FUNCTION: DECODE_UINT; - printf("CALL_FUNCTION n=%lu nkw=%lu", unum & 0xff, (unum >> 8) & 0xff); + printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); break; case MP_BC_CALL_METHOD: DECODE_UINT; - printf("CALL_METHOD n=%lu nkw=%lu", unum & 0xff, (unum >> 8) & 0xff); + printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); break; case MP_BC_RETURN_VALUE: -- cgit v1.2.3