aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-04-27 21:40:52 +0300
committerPekka Enberg <penberg@kernel.org>2012-04-27 21:49:31 +0300
commit4c428f8e059d38e5bebc47628b23bf32299511fe (patch)
tree23552e48a1e502d7203c5153fb42e4992d6e03eb
parent45672a18a37dd714174d808d00a6339d8a88469b (diff)
downloadjato-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.c46
-rw-r--r--arch/x86/include/arch/registers_64.h10
-rw-r--r--arch/x86/registers_64.c20
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",