diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-04-27 21:40:52 +0300 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-04-27 21:49:31 +0300 |
commit | 4c428f8e059d38e5bebc47628b23bf32299511fe (patch) | |
tree | 23552e48a1e502d7203c5153fb42e4992d6e03eb | |
parent | 45672a18a37dd714174d808d00a6339d8a88469b (diff) | |
download | jato-4c428f8e059d38e5bebc47628b23bf32299511fe.tar.gz |
x86-64: Add 'arg_gp_regs' and 'arg_xmm_regs'
As a cleanup, introduce 'arg_gp_regs' and 'arg_xmm_regs' on x86-64 and use
them.
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | arch/x86/emit_64.c | 46 | ||||
-rw-r--r-- | arch/x86/include/arch/registers_64.h | 10 | ||||
-rw-r--r-- | arch/x86/registers_64.c | 20 |
3 files changed, 46 insertions, 30 deletions
diff --git a/arch/x86/emit_64.c b/arch/x86/emit_64.c index 6ad37047..ccfc2180 100644 --- a/arch/x86/emit_64.c +++ b/arch/x86/emit_64.c @@ -1281,40 +1281,30 @@ void emit_unwind(struct buffer *buf) static void emit_save_regparm(struct buffer *buf) { - __emit_push_reg(buf, MACH_REG_RDI); - __emit_push_reg(buf, MACH_REG_RSI); - __emit_push_reg(buf, MACH_REG_RDX); - __emit_push_reg(buf, MACH_REG_RCX); - __emit_push_reg(buf, MACH_REG_R8); - __emit_push_reg(buf, MACH_REG_R9); + unsigned int i; - __emit64_push_xmm(buf, MACH_REG_XMM0); - __emit64_push_xmm(buf, MACH_REG_XMM1); - __emit64_push_xmm(buf, MACH_REG_XMM2); - __emit64_push_xmm(buf, MACH_REG_XMM3); - __emit64_push_xmm(buf, MACH_REG_XMM4); - __emit64_push_xmm(buf, MACH_REG_XMM5); - __emit64_push_xmm(buf, MACH_REG_XMM6); - __emit64_push_xmm(buf, MACH_REG_XMM7); + for (i = 0; i < ARRAY_SIZE(arg_gp_regs); i++) + __emit_push_reg(buf, arg_gp_regs[i]); + + for (i = 0; i < ARRAY_SIZE(arg_xmm_regs); i++) + __emit64_push_xmm(buf, arg_xmm_regs[i]); } static void emit_restore_regparm(struct buffer *buf) { - __emit64_pop_xmm(buf, MACH_REG_XMM7); - __emit64_pop_xmm(buf, MACH_REG_XMM6); - __emit64_pop_xmm(buf, MACH_REG_XMM5); - __emit64_pop_xmm(buf, MACH_REG_XMM4); - __emit64_pop_xmm(buf, MACH_REG_XMM3); - __emit64_pop_xmm(buf, MACH_REG_XMM2); - __emit64_pop_xmm(buf, MACH_REG_XMM1); - __emit64_pop_xmm(buf, MACH_REG_XMM0); + unsigned int i; - __emit_pop_reg(buf, MACH_REG_R9); - __emit_pop_reg(buf, MACH_REG_R8); - __emit_pop_reg(buf, MACH_REG_RCX); - __emit_pop_reg(buf, MACH_REG_RDX); - __emit_pop_reg(buf, MACH_REG_RSI); - __emit_pop_reg(buf, MACH_REG_RDI); + for (i = 0; i < ARRAY_SIZE(arg_xmm_regs); i++) { + unsigned long idx = ARRAY_SIZE(arg_xmm_regs) - i - 1; + + __emit64_pop_xmm(buf, arg_xmm_regs[idx]); + } + + for (i = 0; i < ARRAY_SIZE(arg_gp_regs); i++) { + unsigned long idx = ARRAY_SIZE(arg_gp_regs) - i - 1; + + __emit_pop_reg(buf, arg_gp_regs[idx]); + } } void emit_trace_invoke(struct buffer *buf, struct compilation_unit *cu) diff --git a/arch/x86/include/arch/registers_64.h b/arch/x86/include/arch/registers_64.h index 09877f8d..9d1d4213 100644 --- a/arch/x86/include/arch/registers_64.h +++ b/arch/x86/include/arch/registers_64.h @@ -69,12 +69,18 @@ enum machine_reg { #define GPR_VM_TYPE J_LONG #define FPU_VM_TYPE J_DOUBLE -#define NR_CALLER_SAVE_REGS 25 +#define NR_CALLER_SAVE_REGS 25 extern enum machine_reg caller_save_regs[NR_CALLER_SAVE_REGS]; -#define NR_CALLEE_SAVE_REGS 5 +#define NR_CALLEE_SAVE_REGS 5 extern enum machine_reg callee_save_regs[NR_CALLEE_SAVE_REGS]; +#define NR_ARG_GP_REGS 6 +extern enum machine_reg arg_gp_regs[NR_ARG_GP_REGS]; + +#define NR_ARG_XMM_REGS 8 +extern enum machine_reg arg_xmm_regs[NR_ARG_XMM_REGS]; + const char *reg_name(enum machine_reg reg); enum machine_reg_type reg_type(enum machine_reg reg); bool reg_supports_type(enum machine_reg reg, enum vm_type type); diff --git a/arch/x86/registers_64.c b/arch/x86/registers_64.c index 6a235bd6..6a86c283 100644 --- a/arch/x86/registers_64.c +++ b/arch/x86/registers_64.c @@ -66,6 +66,26 @@ enum machine_reg callee_save_regs[NR_CALLEE_SAVE_REGS] = { MACH_REG_R15, }; +enum machine_reg arg_gp_regs[NR_ARG_GP_REGS] = { + MACH_REG_RDI, + MACH_REG_RSI, + MACH_REG_RDX, + MACH_REG_RCX, + MACH_REG_R8, + MACH_REG_R9, +}; + +enum machine_reg arg_xmm_regs[NR_ARG_XMM_REGS] = { + MACH_REG_XMM0, + MACH_REG_XMM1, + MACH_REG_XMM2, + MACH_REG_XMM3, + MACH_REG_XMM4, + MACH_REG_XMM5, + MACH_REG_XMM6, + MACH_REG_XMM7, +}; + static const char *register_names[] = { [MACH_REG_RAX] = "RAX", [MACH_REG_RCX] = "RCX", |