diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-09-06 10:50:04 +0200 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2010-09-08 13:35:00 -0700 |
commit | f763332b6a531fad20219c88456dd6642bd1ea2b (patch) | |
tree | f138fbfc1577f9483f422c9b89b16bccaa03b5bf | |
parent | c09dcd7820699eca00ff323eb24d6fcf64b4b8c5 (diff) |
Add 64 bit andq/andnq/orq/xorq/cmpeqq/cmpgtsq opcodes
-rw-r--r-- | orc/opcodes.h | 6 | ||||
-rw-r--r-- | orc/orcemulateopcodes.c | 174 | ||||
-rw-r--r-- | orc/orcemulateopcodes.h | 6 | ||||
-rw-r--r-- | orc/orcfunctions.c | 16 | ||||
-rw-r--r-- | orc/orcopcodes.c | 6 |
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 }, |