}
+void
+emulate_ldresnearb (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_int8 * ptr0;
+ const orc_int8 * ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *)ex->dest_ptrs[0];
+ ptr4 = (orc_int8 *)ex->src_ptrs[0];
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearb */
+ var32 = ptr4[(((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i)*((orc_union32 *)(ex->src_ptrs[2]))->i)>>16];
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+void
+emulate_ldresnearl (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union32 * ptr0;
+ const orc_union32 * ptr4;
+ orc_union32 var32;
+
+ ptr0 = (orc_union32 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union32 *)ex->src_ptrs[0];
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldresnearl */
+ var32 = ptr4[(((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i)*((orc_union32 *)(ex->src_ptrs[2]))->i)>>16];
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
+void
+emulate_ldreslinb (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_int8 * ptr0;
+ const orc_int8 * ptr4;
+ orc_int8 var32;
+
+ ptr0 = (orc_int8 *)ex->dest_ptrs[0];
+ ptr4 = (orc_int8 *)ex->src_ptrs[0];
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinb */
+ {
+ int tmp = ((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i) * ((orc_union32 *)(ex->src_ptrs[2]))->i;
+ var32 = ((orc_uint8)ptr4[tmp>>16] * (256-((tmp>>8)&0xff)) + (orc_uint8)ptr4[(tmp>>16)+1] * ((tmp>>8)&0xff))>>8;
+ }
+ /* 1: storeb */
+ ptr0[i] = var32;
+ }
+
+}
+
+void
+emulate_ldreslinl (OrcOpcodeExecutor *ex, int offset, int n)
+{
+ int i;
+ orc_union32 * ptr0;
+ const orc_union32 * ptr4;
+ orc_union32 var32;
+
+ ptr0 = (orc_union32 *)ex->dest_ptrs[0];
+ ptr4 = (orc_union32 *)ex->src_ptrs[0];
+
+ for (i = 0; i < n; i++) {
+ /* 0: ldreslinl */
+ {
+ int tmp = ((orc_union32 *)(ex->src_ptrs[1]))->i + (offset + i) * ((orc_union32 *)(ex->src_ptrs[2]))->i;
+ orc_union32 a = ptr4[tmp>>16];
+ orc_union32 b = ptr4[(tmp>>16)+1];
+ var32.x4[0] = a.x4[0] * (256-((tmp>>8)&0xff)) + b.x4[0] * ((tmp>>8)&0xff);
+ var32.x4[1] = a.x4[1] * (256-((tmp>>8)&0xff)) + b.x4[1] * ((tmp>>8)&0xff);
+ var32.x4[2] = a.x4[2] * (256-((tmp>>8)&0xff)) + b.x4[2] * ((tmp>>8)&0xff);
+ var32.x4[3] = a.x4[3] * (256-((tmp>>8)&0xff)) + b.x4[3] * ((tmp>>8)&0xff);
+ }
+ /* 1: storel */
+ ptr0[i] = var32;
+ }
+
+}
+
void
emulate_maxsb (OrcOpcodeExecutor *ex, int offset, int n)
{
void emulate_loadupdb (OrcOpcodeExecutor *ex, int i, int n);
void emulate_loadupib (OrcOpcodeExecutor *ex, int i, int n);
void emulate_loadpb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldresnearb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldresnearl (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldreslinb (OrcOpcodeExecutor *ex, int i, int n);
+void emulate_ldreslinl (OrcOpcodeExecutor *ex, int i, int n);
void emulate_maxsb (OrcOpcodeExecutor *ex, int i, int n);
void emulate_maxub (OrcOpcodeExecutor *ex, int i, int n);
void emulate_minsb (OrcOpcodeExecutor *ex, int i, int n);
orc_program_add_destination (p, 1, "d1");
orc_program_add_source (p, 1, "s1");
- orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, -1);
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1);
result = orc_program_compile (p);
}
orc_program_add_destination (p, 1, "d1");
orc_program_add_parameter (p, 1, "p1");
- orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, -1);
+ orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, ORC_VAR_D1);
result = orc_program_compile (p);
}
{ "loadupdb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_ITERATOR, { 1 }, { 1 }, emulate_loadupdb },
{ "loadupib", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_ITERATOR, { 1 }, { 1 }, emulate_loadupib },
{ "loadpb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR|ORC_STATIC_OPCODE_INVARIANT, { 1 }, { 1 }, emulate_loadpb },
+ { "ldresnearb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 1 }, { 1, 4, 4 }, emulate_null },
+ { "ldresnearl", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 4 }, { 4, 4, 4 }, emulate_null },
+ { "ldreslinb", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 1 }, { 1, 4, 4 }, emulate_null },
+ { "ldreslinl", ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_SCALAR, { 4 }, { 4, 4, 4 }, emulate_null },
{ "maxsb", 0, { 1 }, { 1, 1 }, emulate_maxsb },
{ "maxub", 0, { 1 }, { 1, 1 }, emulate_maxub },
{ "minsb", 0, { 1 }, { 1, 1 }, emulate_minsb },
}
}
+static void
+c_rule_ldresnearX (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ char src1[40];
+ char src2[40];
+
+ c_get_name_int (src1, p, insn, insn->src_args[1]);
+ c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+ if (p->target_flags & ORC_TARGET_C_OPCODE &&
+ !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+ ORC_ASM_CODE(p," var%d = ptr%d[(%s + (offset + i)*%s)>>16];\n",
+ insn->dest_args[0], insn->src_args[0], src1, src2);
+ } else {
+ ORC_ASM_CODE(p," var%d = ptr%d[(%s + i*%s)>>16];\n",
+ insn->dest_args[0], insn->src_args[0], src1, src2);
+ }
+}
+
+static void
+c_rule_ldreslinb (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ char src1[40];
+ char src2[40];
+
+ c_get_name_int (src1, p, insn, insn->src_args[1]);
+ c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+ ORC_ASM_CODE(p," {\n");
+ if (p->target_flags & ORC_TARGET_C_OPCODE &&
+ !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+ ORC_ASM_CODE(p," int tmp = %s + (offset + i) * %s;\n", src1, src2);
+ } else {
+ ORC_ASM_CODE(p," int tmp = %s + i * %s;\n", src1, src2);
+ }
+ ORC_ASM_CODE(p," var%d = ((orc_uint8)ptr%d[tmp>>16] * (256-((tmp>>8)&0xff)) + (orc_uint8)ptr%d[(tmp>>16)+1] * ((tmp>>8)&0xff))>>8;\n",
+ insn->dest_args[0], insn->src_args[0], insn->src_args[0]);
+ ORC_ASM_CODE(p," }\n");
+}
+
+static void
+c_rule_ldreslinl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ int i;
+ char src1[40];
+ char src2[40];
+
+ c_get_name_int (src1, p, insn, insn->src_args[1]);
+ c_get_name_int (src2, p, insn, insn->src_args[2]);
+
+
+ ORC_ASM_CODE(p," {\n");
+ if (p->target_flags & ORC_TARGET_C_OPCODE &&
+ !(insn->flags & ORC_INSN_FLAG_ADDED)) {
+ ORC_ASM_CODE(p," int tmp = %s + (offset + i) * %s;\n", src1, src2);
+ } else {
+ ORC_ASM_CODE(p," int tmp = %s + i * %s;\n", src1, src2);
+ }
+ ORC_ASM_CODE(p," orc_union32 a = ptr%d[tmp>>16];\n", insn->src_args[0]);
+ ORC_ASM_CODE(p," orc_union32 b = ptr%d[(tmp>>16)+1];\n", insn->src_args[0]);
+ for (i=0;i<4;i++){
+ ORC_ASM_CODE(p," var%d.x4[%d] = a.x4[%d] * (256-((tmp>>8)&0xff)) + b.x4[%d] * ((tmp>>8)&0xff);\n",
+ insn->dest_args[0], i, i, i);
+ }
+ ORC_ASM_CODE(p," }\n");
+}
+
static void
c_rule_storeX (OrcCompiler *p, void *user, OrcInstruction *insn)
{
orc_rule_register (rule_set, "loadoffl", c_rule_loadoffX, NULL);
orc_rule_register (rule_set, "loadupdb", c_rule_loadupdb, NULL);
orc_rule_register (rule_set, "loadupib", c_rule_loadupib, NULL);
+ orc_rule_register (rule_set, "ldresnearb", c_rule_ldresnearX, NULL);
+ orc_rule_register (rule_set, "ldresnearl", c_rule_ldresnearX, NULL);
+ orc_rule_register (rule_set, "ldreslinb", c_rule_ldreslinb, NULL);
+ orc_rule_register (rule_set, "ldreslinl", c_rule_ldreslinl, NULL);
orc_rule_register (rule_set, "storeb", c_rule_storeX, NULL);
orc_rule_register (rule_set, "storew", c_rule_storeX, NULL);
orc_rule_register (rule_set, "storel", c_rule_storeX, NULL);