Commit e85c3899 authored by Paul Sokolovsky's avatar Paul Sokolovsky
Browse files

Make "unix" target be crossplatform and support x86, x64, ARM hosts.

parent 732407f1
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <string.h> #include <string.h>
#include "misc.h" #include "misc.h"
#include "mpconfig.h"
#include "asmx64.h" #include "asmx64.h"
/* all offsets are measured in multiples of 8 bytes */ /* 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) ...@@ -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) { 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)); 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 // 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 // doesn't work anymore because calls are 64 bits away
......
@ thumb callee save: bx, bp, sp, r12, r14, r14, r15 #ifdef __thumb2__
/* thumb callee save: bx, bp, sp, r12, r14, r14, r15 */
.syntax unified .syntax unified
.cpu cortex-m4 .cpu cortex-m4
...@@ -6,7 +7,7 @@ ...@@ -6,7 +7,7 @@
.text .text
.align 2 .align 2
@ uint nlr_push(r0=nlr_buf_t *nlr) /* uint nlr_push(r0=nlr_buf_t *nlr) */
.global nlr_push .global nlr_push
.thumb .thumb
.thumb_func .thumb_func
...@@ -51,7 +52,7 @@ nlr_pop: ...@@ -51,7 +52,7 @@ nlr_pop:
.word .LANCHOR0 .word .LANCHOR0
.size nlr_pop, .-nlr_pop .size nlr_pop, .-nlr_pop
@ void nlr_jump(r0=uint val) /* void nlr_jump(r0=uint val) */
.global nlr_jump .global nlr_jump
.thumb .thumb
.thumb_func .thumb_func
...@@ -81,7 +82,7 @@ nlr_jump: ...@@ -81,7 +82,7 @@ nlr_jump:
.word .LANCHOR0 .word .LANCHOR0
.size nlr_jump, .-nlr_jump .size nlr_jump, .-nlr_jump
@ local variable nlr_top /* local variable nlr_top */
.bss .bss
.align 2 .align 2
.set .LANCHOR0,. + 0 .set .LANCHOR0,. + 0
...@@ -89,3 +90,4 @@ nlr_jump: ...@@ -89,3 +90,4 @@ nlr_jump:
.size nlr_top, 4 .size nlr_top, 4
nlr_top: nlr_top:
.space 4 .space 4
#endif
# x64 callee save: bx, bp, sp, r12, r14, r14, r15 #ifdef __x86_64__
/* x64 callee save: bx, bp, sp, r12, r14, r14, r15 */
.file "nlr.s" .file "nlr.s"
.text .text
# uint nlr_push(rdi=nlr_buf_t *nlr) /* uint nlr_push(rdi=nlr_buf_t *nlr) */
.globl nlr_push .globl nlr_push
.type nlr_push, @function .type nlr_push, @function
nlr_push: nlr_push:
...@@ -23,7 +24,7 @@ nlr_push: ...@@ -23,7 +24,7 @@ nlr_push:
ret # return ret # return
.size nlr_push, .-nlr_push .size nlr_push, .-nlr_push
# void nlr_pop() /* void nlr_pop() */
.globl nlr_pop .globl nlr_pop
.type nlr_pop, @function .type nlr_pop, @function
nlr_pop: nlr_pop:
...@@ -33,7 +34,7 @@ nlr_pop: ...@@ -33,7 +34,7 @@ nlr_pop:
ret # return ret # return
.size nlr_pop, .-nlr_pop .size nlr_pop, .-nlr_pop
# void nlr_jump(rdi=uint val) /* void nlr_jump(rdi=uint val) */
.globl nlr_jump .globl nlr_jump
.type nlr_jump, @function .type nlr_jump, @function
nlr_jump: nlr_jump:
...@@ -58,3 +59,4 @@ nlr_jump: ...@@ -58,3 +59,4 @@ nlr_jump:
.local nlr_top .local nlr_top
.comm nlr_top,8,8 .comm nlr_top,8,8
#endif
# x86 callee save: bx, di, si, bp, sp #ifdef __i386__
/* x86 callee save: bx, di, si, bp, sp */
.file "nlr.s" .file "nlr.s"
.text .text
# uint nlr_push(4(%esp)=nlr_buf_t *nlr) /* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */
.globl nlr_push .globl nlr_push
.type nlr_push, @function .type nlr_push, @function
nlr_push: nlr_push:
...@@ -22,7 +23,7 @@ nlr_push: ...@@ -22,7 +23,7 @@ nlr_push:
ret # return ret # return
.size nlr_push, .-nlr_push .size nlr_push, .-nlr_push
# void nlr_pop() /* void nlr_pop() */
.globl nlr_pop .globl nlr_pop
.type nlr_pop, @function .type nlr_pop, @function
nlr_pop: nlr_pop:
...@@ -32,7 +33,7 @@ nlr_pop: ...@@ -32,7 +33,7 @@ nlr_pop:
ret # return ret # return
.size nlr_pop, .-nlr_pop .size nlr_pop, .-nlr_pop
# void nlr_jump(4(%esp)=uint val) /* void nlr_jump(4(%esp)=uint val) */
.globl nlr_jump .globl nlr_jump
.type nlr_jump, @function .type nlr_jump, @function
nlr_jump: nlr_jump:
...@@ -55,3 +56,4 @@ nlr_jump: ...@@ -55,3 +56,4 @@ nlr_jump:
.local nlr_top .local nlr_top
.comm nlr_top,4,4 .comm nlr_top,4,4
#endif
...@@ -70,7 +70,7 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -70,7 +70,7 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_LOAD_FAST_N: case MP_BC_LOAD_FAST_N:
DECODE_UINT; DECODE_UINT;
printf("LOAD_FAST_N %lu", unum); printf("LOAD_FAST_N " UINT_FMT, unum);
break; break;
case MP_BC_LOAD_NAME: case MP_BC_LOAD_NAME:
...@@ -111,7 +111,7 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -111,7 +111,7 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_STORE_FAST_N: case MP_BC_STORE_FAST_N:
DECODE_UINT; DECODE_UINT;
printf("STORE_FAST_N %lu", unum); printf("STORE_FAST_N " UINT_FMT, unum);
break; break;
case MP_BC_STORE_NAME: case MP_BC_STORE_NAME:
...@@ -161,17 +161,17 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -161,17 +161,17 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_JUMP: case MP_BC_JUMP:
DECODE_SLABEL; DECODE_SLABEL;
printf("JUMP %lu", ip + unum - ip_start); printf("JUMP " UINT_FMT, ip + unum - ip_start);
break; break;
case MP_BC_POP_JUMP_IF_TRUE: case MP_BC_POP_JUMP_IF_TRUE:
DECODE_SLABEL; DECODE_SLABEL;
printf("POP_JUMP_IF_TRUE %lu", ip + unum - ip_start); printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - ip_start);
break; break;
case MP_BC_POP_JUMP_IF_FALSE: case MP_BC_POP_JUMP_IF_FALSE:
DECODE_SLABEL; DECODE_SLABEL;
printf("POP_JUMP_IF_FALSE %lu", ip + unum - ip_start); printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start);
break; break;
/* /*
...@@ -196,7 +196,7 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -196,7 +196,7 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_SETUP_EXCEPT: case MP_BC_SETUP_EXCEPT:
DECODE_ULABEL; // except labels are always forward 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; break;
case MP_BC_END_FINALLY: case MP_BC_END_FINALLY:
...@@ -213,7 +213,7 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -213,7 +213,7 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_FOR_ITER: case MP_BC_FOR_ITER:
DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward 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; break;
case MP_BC_POP_BLOCK: case MP_BC_POP_BLOCK:
...@@ -235,22 +235,22 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -235,22 +235,22 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_BINARY_OP: case MP_BC_BINARY_OP:
unum = *ip++; unum = *ip++;
printf("BINARY_OP %lu", unum); printf("BINARY_OP " UINT_FMT, unum);
break; break;
case MP_BC_COMPARE_OP: case MP_BC_COMPARE_OP:
unum = *ip++; unum = *ip++;
printf("COMPARE_OP %lu", unum); printf("COMPARE_OP " UINT_FMT, unum);
break; break;
case MP_BC_BUILD_TUPLE: case MP_BC_BUILD_TUPLE:
DECODE_UINT; DECODE_UINT;
printf("BUILD_TUPLE %lu", unum); printf("BUILD_TUPLE " UINT_FMT, unum);
break; break;
case MP_BC_BUILD_LIST: case MP_BC_BUILD_LIST:
DECODE_UINT; DECODE_UINT;
printf("BUILD_LIST %lu", unum); printf("BUILD_LIST " UINT_FMT, unum);
break; break;
/* /*
...@@ -264,7 +264,7 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -264,7 +264,7 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_BUILD_MAP: case MP_BC_BUILD_MAP:
DECODE_UINT; DECODE_UINT;
printf("BUILD_MAP %lu", unum); printf("BUILD_MAP " UINT_FMT, unum);
break; break;
/* /*
...@@ -297,22 +297,22 @@ void mp_show_byte_code(const byte *ip, int len) { ...@@ -297,22 +297,22 @@ void mp_show_byte_code(const byte *ip, int len) {
case MP_BC_UNPACK_SEQUENCE: case MP_BC_UNPACK_SEQUENCE:
DECODE_UINT; DECODE_UINT;
printf("UNPACK_SEQUENCE %lu", unum); printf("UNPACK_SEQUENCE " UINT_FMT, unum);
break; break;
case MP_BC_MAKE_FUNCTION: case MP_BC_MAKE_FUNCTION:
DECODE_UINT; DECODE_UINT;
printf("MAKE_FUNCTION %lu", unum); printf("MAKE_FUNCTION " UINT_FMT, unum);
break; break;
case MP_BC_CALL_FUNCTION: case MP_BC_CALL_FUNCTION:
DECODE_UINT; 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; break;
case MP_BC_CALL_METHOD: case MP_BC_CALL_METHOD:
DECODE_UINT; 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; break;
case MP_BC_RETURN_VALUE: case MP_BC_RETURN_VALUE:
......
...@@ -9,7 +9,9 @@ SRC_C = \ ...@@ -9,7 +9,9 @@ SRC_C = \
main.c \ main.c \
PY_O = \ PY_O = \
nlrx86.o \
nlrx64.o \ nlrx64.o \
nlrthumb.o \
malloc.o \ malloc.o \
qstr.o \ qstr.o \
vstr.o \ vstr.o \
...@@ -73,6 +75,9 @@ $(BUILD)/%.o: %.c ...@@ -73,6 +75,9 @@ $(BUILD)/%.o: %.c
$(BUILD)/%.o: $(PYSRC)/%.s $(BUILD)/%.o: $(PYSRC)/%.s
$(AS) -o $@ $< $(AS) -o $@ $<
$(BUILD)/%.o: $(PYSRC)/%.S
$(CC) $(CFLAGS) -c -o $@ $<
$(BUILD)/%.o: $(PYSRC)/%.c mpconfig.h $(BUILD)/%.o: $(PYSRC)/%.c mpconfig.h
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
......
...@@ -8,10 +8,22 @@ ...@@ -8,10 +8,22 @@
// type definitions for the specific machine // type definitions for the specific machine
#define BYTES_PER_WORD (8) #ifdef __LP64__
typedef long machine_int_t; // must be pointer size
typedef unsigned long machine_uint_t; // must be pointer size
#define UINT_FMT "%lu"
#define INT_FMT "%ld"
#else
// These are definitions for machines where sizeof(int) == sizeof(void*),
// regardless for actual size.
typedef int machine_int_t; // must be pointer size
typedef unsigned int machine_uint_t; // must be pointer size
#define UINT_FMT "%u"
#define INT_FMT "%d"
#endif
#define BYTES_PER_WORD sizeof(machine_int_t)
typedef int64_t machine_int_t; // must be pointer size
typedef uint64_t machine_uint_t; // must be pointer size
typedef void *machine_ptr_t; // must be of pointer size typedef void *machine_ptr_t; // must be of pointer size
typedef const void *machine_const_ptr_t; // must be of pointer size typedef const void *machine_const_ptr_t; // must be of pointer size
typedef double machine_float_t; typedef double machine_float_t;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment