From 38bb6da67bea1f46c5faa5ea97439ea5efe96e08 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 13 Sep 2010 13:57:56 -0700 Subject: [PATCH] Add swapwl and swaplq opcodes --- orc/orcemulateopcodes.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ orc/orcemulateopcodes.h | 2 ++ orc/orcfunctions.c | 16 ---------------- orc/orcopcodes.c | 2 ++ orc/orcprogram-c.c | 26 ++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 16 deletions(-) diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c index 654b14e..b524667 100644 --- a/orc/orcemulateopcodes.c +++ b/orc/orcemulateopcodes.c @@ -3990,6 +3990,30 @@ emulate_swapl (OrcOpcodeExecutor *ex, int offset, int n) } void +emulate_swapwl (OrcOpcodeExecutor *ex, int offset, int n) +{ + int i; + orc_union32 * ORC_RESTRICT ptr0; + const orc_union32 * ORC_RESTRICT ptr4; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *)ex->dest_ptrs[0]; + ptr4 = (orc_union32 *)ex->src_ptrs[0]; + + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var32 = ptr4[i]; + /* 1: swapwl */ + var33.i = ((var32.i&0x0000ffff) << 16) | ((var32.i&0xffff0000) >> 16); + /* 2: storel */ + ptr0[i] = var33; + } + +} + +void emulate_swapq (OrcOpcodeExecutor *ex, int offset, int n) { int i; @@ -4014,6 +4038,30 @@ emulate_swapq (OrcOpcodeExecutor *ex, int offset, int n) } void +emulate_swaplq (OrcOpcodeExecutor *ex, int offset, int n) +{ + int i; + orc_union64 * ORC_RESTRICT ptr0; + const orc_union64 * ORC_RESTRICT ptr4; + orc_union64 var32; + orc_union64 var33; + + ptr0 = (orc_union64 *)ex->dest_ptrs[0]; + ptr4 = (orc_union64 *)ex->src_ptrs[0]; + + + for (i = 0; i < n; i++) { + /* 0: loadq */ + var32 = ptr4[i]; + /* 1: swaplq */ + var33.i = ((var32.i&0x00000000ffffffffULL) << 32) | ((var32.i&0xffffffff00000000ULL) >> 32); + /* 2: storeq */ + ptr0[i] = var33; + } + +} + +void emulate_select0wb (OrcOpcodeExecutor *ex, int offset, int n) { int i; diff --git a/orc/orcemulateopcodes.h b/orc/orcemulateopcodes.h index 26267e3..e0d6fd1 100644 --- a/orc/orcemulateopcodes.h +++ b/orc/orcemulateopcodes.h @@ -155,7 +155,9 @@ void emulate_accl (OrcOpcodeExecutor *ex, int i, int n); void emulate_accsadubl (OrcOpcodeExecutor *ex, int i, int n); void emulate_swapw (OrcOpcodeExecutor *ex, int i, int n); void emulate_swapl (OrcOpcodeExecutor *ex, int i, int n); +void emulate_swapwl (OrcOpcodeExecutor *ex, int i, int n); void emulate_swapq (OrcOpcodeExecutor *ex, int i, int n); +void emulate_swaplq (OrcOpcodeExecutor *ex, int i, int n); void emulate_select0wb (OrcOpcodeExecutor *ex, int i, int n); void emulate_select1wb (OrcOpcodeExecutor *ex, int i, int n); void emulate_select0lw (OrcOpcodeExecutor *ex, int i, int n); diff --git a/orc/orcfunctions.c b/orc/orcfunctions.c index b37dc66..187e8a9 100644 --- a/orc/orcfunctions.c +++ b/orc/orcfunctions.c @@ -165,14 +165,6 @@ orc_memcpy (void * d1, const void * s1, int n) orc_program_set_backup_function (p, _backup_orc_memcpy); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); - orc_program_add_constant (p, 0, 0x00000000, "c1"); - orc_program_add_constant (p, 0, 0x00000000, "c2"); - orc_program_add_constant (p, 0, 0x00000000, "c3"); - orc_program_add_constant (p, 0, 0x00000000, "c4"); - orc_program_add_constant (p, 0, 0x00000000, "c5"); - orc_program_add_constant (p, 0, 0x00000000, "c6"); - orc_program_add_constant (p, 0, 0x00000000, "c7"); - orc_program_add_constant (p, 0, 0x00000000, "c8"); orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); @@ -257,14 +249,6 @@ orc_memset (void * d1, int p1, int n) orc_program_set_name (p, "orc_memset"); orc_program_set_backup_function (p, _backup_orc_memset); orc_program_add_destination (p, 1, "d1"); - orc_program_add_constant (p, 0, 0x00000000, "c1"); - orc_program_add_constant (p, 0, 0x00000000, "c2"); - orc_program_add_constant (p, 0, 0x00000000, "c3"); - orc_program_add_constant (p, 0, 0x00000000, "c4"); - orc_program_add_constant (p, 0, 0x00000000, "c5"); - orc_program_add_constant (p, 0, 0x00000000, "c6"); - orc_program_add_constant (p, 0, 0x00000000, "c7"); - orc_program_add_constant (p, 0, 0x00000000, "c8"); orc_program_add_parameter (p, 1, "p1"); orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, ORC_VAR_D1); diff --git a/orc/orcopcodes.c b/orc/orcopcodes.c index 2850ca1..f6a2fdf 100644 --- a/orc/orcopcodes.c +++ b/orc/orcopcodes.c @@ -455,7 +455,9 @@ static OrcStaticOpcode opcodes[] = { { "swapw", 0, { 2 }, { 2 }, emulate_swapw }, { "swapl", 0, { 4 }, { 4 }, emulate_swapl }, + { "swapwl", 0, { 4 }, { 4 }, emulate_swapwl }, { "swapq", 0, { 8 }, { 8 }, emulate_swapq }, + { "swaplq", 0, { 8 }, { 8 }, emulate_swaplq }, { "select0wb", 0, { 1 }, { 2 }, emulate_select0wb }, { "select1wb", 0, { 1 }, { 2 }, emulate_select1wb }, { "select0lw", 0, { 2 }, { 4 }, emulate_select0lw }, diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index 5312ac4..7676a9f 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -1274,6 +1274,30 @@ c_rule_maxd (OrcCompiler *p, void *user, OrcInstruction *insn) ORC_ASM_CODE(p," }\n"); } +static void +c_rule_swapwl (OrcCompiler *p, void *user, OrcInstruction *insn) +{ + char dest[40], src[40]; + + c_get_name_int (dest, p, insn, insn->dest_args[0]); + c_get_name_int (src, p, insn, insn->src_args[0]); + + ORC_ASM_CODE(p," %s = ((%s&0x0000ffff) << 16) | ((%s&0xffff0000) >> 16);\n", + dest, src, src); +} + +static void +c_rule_swaplq (OrcCompiler *p, void *user, OrcInstruction *insn) +{ + char dest[40], src[40]; + + c_get_name_int (dest, p, insn, insn->dest_args[0]); + c_get_name_int (src, p, insn, insn->src_args[0]); + + ORC_ASM_CODE(p," %s = ((%s&0x00000000ffffffffULL) << 32) | ((%s&0xffffffff00000000ULL) >> 32);\n", + dest, src, src); +} + static OrcTarget c_target = { "c", FALSE, @@ -1381,5 +1405,7 @@ orc_c_init (void) orc_rule_register (rule_set, "maxf", c_rule_maxf, NULL); orc_rule_register (rule_set, "mind", c_rule_mind, NULL); orc_rule_register (rule_set, "maxd", c_rule_maxd, NULL); + orc_rule_register (rule_set, "swapwl", c_rule_swapwl, NULL); + orc_rule_register (rule_set, "swaplq", c_rule_swaplq, NULL); } -- 2.7.4