summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-09-06 10:50:04 +0200
committerDavid Schleef <ds@schleef.org>2010-09-08 13:35:00 -0700
commitf763332b6a531fad20219c88456dd6642bd1ea2b (patch)
treef138fbfc1577f9483f422c9b89b16bccaa03b5bf
parentc09dcd7820699eca00ff323eb24d6fcf64b4b8c5 (diff)
Add 64 bit andq/andnq/orq/xorq/cmpeqq/cmpgtsq opcodes
-rw-r--r--orc/opcodes.h6
-rw-r--r--orc/orcemulateopcodes.c174
-rw-r--r--orc/orcemulateopcodes.h6
-rw-r--r--orc/orcfunctions.c16
-rw-r--r--orc/orcopcodes.c6
5 files changed, 208 insertions, 0 deletions
diff --git a/orc/opcodes.h b/orc/opcodes.h
index f8ec426..92a066e 100644
--- a/orc/opcodes.h
+++ b/orc/opcodes.h
@@ -83,6 +83,12 @@ BINARY_UL(subusl, "ORC_CLAMP_UL((orc_int64)(orc_uint32)%s - (orc_int64)(orc_uint
BINARY_SL(xorl, "%s ^ %s")
UNARY_SQ(copyq, "%s")
+BINARY_SQ(cmpeqq, "(%s == %s) ? (~0) : 0")
+BINARY_SQ(cmpgtsq, "(%s > %s) ? (~0) : 0")
+BINARY_SQ(andq, "%s & %s")
+BINARY_SQ(andnq, "(~%s) & %s")
+BINARY_SQ(orq, "%s | %s")
+BINARY_SQ(xorq, "%s ^ %s")
UNARY_BW(convsbw, "%s")
UNARY_BW(convubw, "(orc_uint8)%s")
diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c
index 75abf57..6e6d533 100644
--- a/orc/orcemulateopcodes.c
+++ b/orc/orcemulateopcodes.c
@@ -2854,6 +2854,180 @@ emulate_copyq (OrcOpcodeExecutor *ex, int offset, int n)
}
void
+emulate_cmpeqq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: cmpeqq */
+ var34.i = (var32.i == var33.i) ? (~0) : 0;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+emulate_cmpgtsq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: cmpgtsq */
+ var34.i = (var32.i > var33.i) ? (~0) : 0;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+emulate_andq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: andq */
+ var34.i = var32.i & var33.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+emulate_andnq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: andnq */
+ var34.i = (~var32.i) & var33.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+emulate_orq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: orq */
+ var34.i = var32.i | var33.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
+emulate_xorq (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union64 * ORC_RESTRICT ptr0;
+ const orc_union64 * ORC_RESTRICT ptr4;
+ const orc_union64 * ORC_RESTRICT ptr5;
+ orc_union64 var32;
+ orc_union64 var33;
+ orc_union64 var34;
+
+ ptr0 = (orc_union64 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union64 *)ex->src_ptrs[0];
+ ptr5 = (orc_union64 *)ex->src_ptrs[1];
+
+
+ for (i = 0; i < n; i++) {
+ /* 0: loadq */
+ var32 = ptr4[i];
+ /* 1: loadq */
+ var33 = ptr5[i];
+ /* 2: xorq */
+ var34.i = var32.i ^ var33.i;
+ /* 3: storeq */
+ ptr0[i] = var34;
+ }
+
+}
+
+void
emulate_convsbw (OrcOpcodeExecutor *ex, int offset, int n)
{
int i;
diff --git a/orc/orcemulateopcodes.h b/orc/orcemulateopcodes.h
index c036c62..38d1ff6 100644
--- a/orc/orcemulateopcodes.h
+++ b/orc/orcemulateopcodes.h
@@ -110,6 +110,12 @@ void emulate_loadpq (OrcOpcodeExecutor *ex, int i, int n);
void emulate_storeq (OrcOpcodeExecutor *ex, int i, int n);
void emulate_splatw3q (OrcOpcodeExecutor *ex, int i, int n);
void emulate_copyq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_cmpeqq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_cmpgtsq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_andq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_andnq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_orq (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_xorq (OrcOpcodeExecutor *ex, int i, int n);
void emulate_convsbw (OrcOpcodeExecutor *ex, int i, int n);
void emulate_convubw (OrcOpcodeExecutor *ex, int i, int n);
void emulate_splatbw (OrcOpcodeExecutor *ex, int i, int n);
diff --git a/orc/orcfunctions.c b/orc/orcfunctions.c
index 187e8a9..b37dc66 100644
--- a/orc/orcfunctions.c
+++ b/orc/orcfunctions.c
@@ -165,6 +165,14 @@ 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);
@@ -249,6 +257,14 @@ 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 73fcd5e..41142a9 100644
--- a/orc/orcopcodes.c
+++ b/orc/orcopcodes.c
@@ -397,6 +397,12 @@ static OrcStaticOpcode opcodes[] = {
{ "storeq", ORC_STATIC_OPCODE_STORE, { 8 }, { 8 }, emulate_storeq },
{ "splatw3q", 0, { 8 }, { 8 }, emulate_splatw3q },
{ "copyq", 0, { 8 }, { 8 }, emulate_copyq },
+ { "cmpeqq", 0, { 8 }, { 8, 8 }, emulate_cmpeqq },
+ { "cmpgtsq", 0, { 8 }, { 8, 8 }, emulate_cmpgtsq },
+ { "andq", 0, { 8 }, { 8, 8 }, emulate_andq },
+ { "andnq", 0, { 8 }, { 8, 8 }, emulate_andnq },
+ { "orq", 0, { 8 }, { 8, 8 }, emulate_orq },
+ { "xorq", 0, { 8 }, { 8, 8 }, emulate_xorq },
{ "convsbw", 0, { 2 }, { 1 }, emulate_convsbw },
{ "convubw", 0, { 2 }, { 1 }, emulate_convubw },