summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2010-09-13 13:57:56 -0700
committerDavid Schleef <ds@schleef.org>2010-09-13 13:57:56 -0700
commit38bb6da67bea1f46c5faa5ea97439ea5efe96e08 (patch)
tree31c80f68acc5b8c1bc65b58e8873eb4e54817c3e
parent1ef44553cfef956dff83adb3166190827ec3e308 (diff)
Add swapwl and swaplq opcodes
-rw-r--r--orc/orcemulateopcodes.c48
-rw-r--r--orc/orcemulateopcodes.h2
-rw-r--r--orc/orcfunctions.c16
-rw-r--r--orc/orcopcodes.c2
-rw-r--r--orc/orcprogram-c.c26
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);
}