diff options
| author | Damien George <damien.p.george@gmail.com> | 2015-04-06 22:38:53 +0100 |
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2015-04-07 22:43:28 +0100 |
| commit | 9988618e0e0f5c319e31b135d993e22efb593093 (patch) | |
| tree | d89d8df392ce2669c9e516a05b11742e72dc8cf2 /py/asmx64.c | |
| parent | 18bd51707c218137005cd73cb5a35ebfe2bccd6e (diff) | |
py: Implement full func arg passing for native emitter.
This patch gets full function argument passing working with native
emitter. Includes named args, keyword args, default args, var args
and var keyword args. Fully Python compliant.
It reuses the bytecode mp_setup_code_state function to do all the hard
work. This function is slightly adjusted to accommodate native calls,
and the native emitter is forced a bit to emit similar prelude and
code-info as bytecode.
Diffstat (limited to 'py/asmx64.c')
| -rw-r--r-- | py/asmx64.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/py/asmx64.c b/py/asmx64.c index d501d2cc8..05aa0c2f1 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -176,6 +176,10 @@ STATIC byte *asm_x64_get_cur_to_write_bytes(asm_x64_t *as, int num_bytes_to_writ } } +mp_uint_t asm_x64_get_code_pos(asm_x64_t *as) { + return as->code_offset; +} + mp_uint_t asm_x64_get_code_size(asm_x64_t *as) { return as->code_size; } @@ -222,6 +226,21 @@ STATIC void asm_x64_write_word64(asm_x64_t *as, int64_t w64) { c[7] = IMM64_L7(w64); } +// align must be a multiple of 2 +void asm_x64_align(asm_x64_t* as, mp_uint_t align) { + // TODO fill unused data with NOPs? + as->code_offset = (as->code_offset + align - 1) & (~(align - 1)); +} + +void asm_x64_data(asm_x64_t* as, mp_uint_t bytesize, mp_uint_t val) { + byte *c = asm_x64_get_cur_to_write_bytes(as, bytesize); + // machine is little endian + for (uint i = 0; i < bytesize; i++) { + *c++ = val; + val >>= 8; + } +} + /* unused STATIC void asm_x64_write_word32_to(asm_x64_t *as, int offset, int w32) { byte* c; |
