Author: fijal Branch: arm64 Changeset: r96951:88dea7ad32c8 Date: 2019-07-05 07:34 +0200 http://bitbucket.org/pypy/pypy/changeset/88dea7ad32c8/
Log: merge diff --git a/rpython/jit/backend/aarch64/regalloc.py b/rpython/jit/backend/aarch64/regalloc.py --- a/rpython/jit/backend/aarch64/regalloc.py +++ b/rpython/jit/backend/aarch64/regalloc.py @@ -1091,7 +1091,7 @@ if box.type == REF and self.rm.is_still_alive(box): assert not noregs assert loc.is_core_reg() - val = loc.value + val = self.cpu.all_reg_indexes[loc.value] gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8)) for box, loc in self.fm.bindings.iteritems(): if box.type == REF and self.rm.is_still_alive(box): @@ -1137,4 +1137,4 @@ if hasattr(Regalloc, methname): func = getattr(Regalloc, methname).im_func comp_operations[value] = func - \ No newline at end of file + diff --git a/rpython/translator/c/src/stacklet/slp_platformselect.h b/rpython/translator/c/src/stacklet/slp_platformselect.h --- a/rpython/translator/c/src/stacklet/slp_platformselect.h +++ b/rpython/translator/c/src/stacklet/slp_platformselect.h @@ -10,6 +10,8 @@ #include "switch_x86_gcc.h" /* gcc on X86 */ #elif defined(__GNUC__) && defined(__arm__) #include "switch_arm_gcc.h" /* gcc on arm */ +#elif defined(__GNUC__) && defined(__aarch64__) +#include "switch_aarch64_gcc.h" /* gcc on aarch64 */ #elif defined(__GNUC__) && defined(__PPC64__) #include "switch_ppc64_gcc.h" /* gcc on ppc64 */ #elif defined(__GNUC__) && defined(__mips__) && defined(_ABI64) diff --git a/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h b/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h new file mode 100644 --- /dev/null +++ b/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h @@ -0,0 +1,117 @@ + +static void *slp_switch(void *(*save_state)(void*, void*), + void *(*restore_state)(void*, void*), + void *extra) __attribute__((noinline)); + +static void *slp_switch(void *(*save_state)(void*, void*), + void *(*restore_state)(void*, void*), + void *extra) +{ + void *result; + /* + registers to preserve: x18-x28, x29(fp), x30(lr), and v8-v15 + registers marked as clobbered: x0-x18 + + Note that x18 appears in both lists; see below. + + Don't assume gcc saves any register for us when generating + code for slp_switch(). + + The values 'save_state', 'restore_state' and 'extra' are first moved + by gcc to some registers that are not marked as clobbered, so >= x19. + Similarly, gcc expects 'result' to be in a register >= x19. + We don't want x18 to be used here, because of some special meaning + it might have. + + This means that three of the values we happen to save and restore + will, in fact, contain the three arguments, and one of these values + will, in fact, not be restored at all but receive 'result'. + + The following two points may no longer be true, because "x30" is + now present in the clobbered list, but the extra workarounds we + do might be safer just in case: + + (1) Careful writing "blr %[...]": if gcc resolves it to x30---and it + can!---then you're in trouble, because "blr x30" does not jump + anywhere at all (it probably loads the current position into x30 + before it jumps to x30...) + + (2) Also, because "%[...]" can resolve to x30, we can't use that after + the first call. Instead, we need to copy the values somewhere + safe, like x24 and x25. We do that in such an order that it should + work even if any of the "%[...]" expressions becomes x24 or x25 too. + */ + + __asm__ volatile ( + + /* The stack is supposed to be aligned as necessary already. + Save 13 registers from x18 to x30, plus 8 from v8 to v15 */ + + "stp x29, x30, [sp, -176]!\n" + "stp x18, x19, [sp, 16]\n" + "stp x20, x21, [sp, 32]\n" + "stp x22, x23, [sp, 48]\n" + "stp x24, x25, [sp, 64]\n" + "stp x26, x27, [sp, 80]\n" + "str x28, [sp, 96]\n" + "str d8, [sp, 104]\n" + "str d9, [sp, 112]\n" + "str d10, [sp, 120]\n" + "str d11, [sp, 128]\n" + "str d12, [sp, 136]\n" + "str d13, [sp, 144]\n" + "str d14, [sp, 152]\n" + "str d15, [sp, 160]\n" + + "mov x0, sp\n" /* arg 1: current (old) stack pointer */ + "mov x1, %[extra]\n" /* arg 2: extra, from >= x18 */ + "mov x3, %[save_state]\n" + "mov x24, %[restore_state]\n" /* save restore_state => x24 */ + "mov x25, x1\n" /* save extra => x25 */ + "blr x3\n" /* call save_state() */ + + /* skip the rest if the return value is null */ + "cbz x0, zero\n" + + "mov sp, x0\n" /* change the stack pointer */ + + /* From now on, the stack pointer is modified, but the content of the + stack is not restored yet. It contains only garbage here. */ + "mov x1, x25\n" /* arg 2: extra */ + /* arg 1: current (new) stack pointer is already in x0*/ + "blr x24\n" /* call restore_state() */ + + /* The stack's content is now restored. */ + "zero:\n" + + /* Restore all saved registers */ + "ldp x18, x19, [sp, 16]\n" + "ldp x20, x21, [sp, 32]\n" + "ldp x22, x23, [sp, 48]\n" + "ldp x24, x25, [sp, 64]\n" + "ldp x26, x27, [sp, 80]\n" + "ldr x28, [sp, 96]\n" + "ldr d8, [sp, 104]\n" + "ldr d9, [sp, 112]\n" + "ldr d10, [sp, 120]\n" + "ldr d11, [sp, 128]\n" + "ldr d12, [sp, 136]\n" + "ldr d13, [sp, 144]\n" + "ldr d14, [sp, 152]\n" + "ldr d15, [sp, 160]\n" + "ldp x29, x30, [sp], 176\n" + + /* Move x0 into the final location of 'result' */ + "mov %[result], x0\n" + + : [result]"=r"(result) /* output variables */ + /* input variables */ + : [restore_state]"r"(restore_state), + [save_state]"r"(save_state), + [extra]"r"(extra) + : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", + "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", + "memory", "cc", "x30" // x30==lr + ); + return result; +} _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit