return TRUE;
}
+OrcProgram *
+orc_test_get_program_for_opcode (OrcStaticOpcode *opcode)
+{
+ OrcProgram *p;
+ char s[40];
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ if (opcode->src_size[1] == 0) {
+ p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+ } else {
+ p = orc_program_new_ass (opcode->dest_size[0], opcode->src_size[0],
+ opcode->src_size[1]);
+ }
+ } else {
+ if (opcode->src_size[1] == 0) {
+ p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+ } else {
+ p = orc_program_new_dss (opcode->dest_size[0], opcode->src_size[0],
+ opcode->src_size[1]);
+ }
+ }
+
+ sprintf(s, "test_%s", opcode->name);
+ orc_program_set_name (p, s);
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ orc_program_append_str (p, opcode->name, "a1", "s1", "s2");
+ } else {
+ orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
+ }
+
+ return p;
+}
+
+OrcProgram *
+orc_test_get_program_for_opcode_const (OrcStaticOpcode *opcode)
+{
+ OrcProgram *p;
+ char s[40];
+
+ if (opcode->src_size[1] == 0) {
+ return NULL;
+ }
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+ } else {
+ p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+ }
+ orc_program_add_constant (p, opcode->src_size[1], 1, "c1");
+
+ sprintf(s, "test_const_%s", opcode->name);
+ orc_program_set_name (p, s);
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ orc_program_append_str (p, opcode->name, "a1", "s1", "c1");
+ } else {
+ orc_program_append_str (p, opcode->name, "d1", "s1", "c1");
+ }
+
+ return p;
+}
+
+OrcProgram *
+orc_test_get_program_for_opcode_param (OrcStaticOpcode *opcode)
+{
+ OrcProgram *p;
+ char s[40];
+
+ if (opcode->src_size[1] == 0) {
+ return NULL;
+ }
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
+ } else {
+ p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
+ }
+ orc_program_add_parameter (p, opcode->src_size[1], "p1");
+
+ sprintf(s, "test_const_%s", opcode->name);
+ orc_program_set_name (p, s);
+
+ if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
+ orc_program_append_str (p, opcode->name, "a1", "s1", "p1");
+ } else {
+ orc_program_append_str (p, opcode->name, "d1", "s1", "p1");
+ }
+
+ return p;
+}
void orc_test_random_bits (void *data, int n_bytes);
OrcTestResult orc_test_compare_output (OrcProgram *program);
+OrcProgram *orc_test_get_program_for_opcode (OrcStaticOpcode *opcode);
+OrcProgram *orc_test_get_program_for_opcode_const (OrcStaticOpcode *opcode);
+OrcProgram *orc_test_get_program_for_opcode_param (OrcStaticOpcode *opcode);
ORC_END_DECLS
BINARY_WL(mulswl, "%s * %s")
BINARY_WL(muluwl, "%s * %s")
+BINARY_WL(mergewl, "(%s << 16) | (%s)")
+BINARY_BW(mergebw, "(%s << 8) | (%s)")
+UNARY_WB(select0wb, "(%s >> 8)&0xff")
+UNARY_WB(select1wb, "%s & 0xff")
+UNARY_LW(select0lw, "(%s >> 16)&0xffff")
+UNARY_LW(select1lw, "%s & 0xffff")
+UNARY_UW(swapw, "ORC_SWAP_W(%s)")
+UNARY_UL(swapl, "ORC_SWAP_L(%s)")
+
{
return "\n"
"/* begin Orc C target preamble */\n"
- "#include <stdint.h>\n"
+ "typedef signed char int8_t;\n"
+ "typedef unsigned char uint8_t;\n"
+ "typedef signed short int16_t;\n"
+ "typedef unsigned short uint16_t;\n"
+ "typedef signed int int32_t;\n"
+ "typedef unsigned int uint32_t;\n"
+ "typedef signed long long int64_t;\n"
+ "typedef unsigned long long uint64_t;\n"
+ "#define ORC_RESTRICT restrict\n"
"typedef struct _OrcProgram OrcProgram;\n"
"typedef struct _OrcExecutor OrcExecutor;\n"
"#define ORC_N_VARIABLES 20\n"
"#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_SB_MAX)\n"
"#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SB_MAX)\n"
"#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_SB_MAX)\n"
+ "#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))\n"
+ "#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)<<24))\n"
"/* end Orc C target preamble */\n\n";
}
break;
case ORC_VAR_TYPE_SRC:
case ORC_VAR_TYPE_DEST:
- ORC_ASM_CODE(compiler," %s *var%d = ex->arrays[%d];\n",
- c_get_type_name (var->size), i, i);
+ case ORC_VAR_TYPE_ACCUMULATOR:
+ ORC_ASM_CODE(compiler," %s *%s var%d = ex->arrays[%d];\n",
+ c_get_type_name (var->size),
+ (compiler->target_flags & ORC_TARGET_C_C99) ? "restrict " : "",
+ i, i);
break;
case ORC_VAR_TYPE_PARAM:
ORC_ASM_CODE(compiler," %s var%d = ex->arrays[%d];\n",
c_get_type_name (var->size), i, i);
break;
default:
+ ORC_COMPILER_ERROR(compiler, "bad vartype");
break;
}
if (rule) {
rule->emit (compiler, rule->emit_user, insn);
} else {
- ORC_PROGRAM_ERROR(compiler,"No rule for: %s\n", opcode->name);
+ ORC_COMPILER_ERROR(compiler, "No rule for: %s\n", opcode->name);
compiler->error = TRUE;
}
}
break;
case ORC_VAR_TYPE_SRC:
case ORC_VAR_TYPE_DEST:
+ case ORC_VAR_TYPE_ACCUMULATOR:
sprintf(name, "var%d[i]", var);
break;
default:
+ ORC_COMPILER_ERROR(p, "bad vartype");
sprintf(name, "ERROR");
break;
}
return "int16_t";
case 4:
return "int32_t";
+ case 8:
+ return "int64_t";
default:
return "ERROR";
}
#undef UNARY_LW
#undef UNARY_WB
+static void
+c_rule_accw (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ char dest[20], src1[20];
+
+ c_get_name (dest, p, insn->dest_args[0]);
+ c_get_name (src1, p, insn->src_args[0]);
+
+ ORC_ASM_CODE(p," %s = %s + %s;\n", dest, dest, src1);
+}
+
+static void
+c_rule_accl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ char dest[20], src1[20];
+
+ c_get_name (dest, p, insn->dest_args[0]);
+ c_get_name (src1, p, insn->src_args[0]);
+
+ ORC_ASM_CODE(p," %s = %s + %s;\n", dest, dest, src1);
+}
+
+static void
+c_rule_accsadubl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ char dest[20], src1[20], src2[20];
+
+ c_get_name (dest, p, insn->dest_args[0]);
+ c_get_name (src1, p, insn->src_args[0]);
+ c_get_name (src2, p, insn->src_args[1]);
+
+ ORC_ASM_CODE(p," %s = %s + ORC_ABS(%s - %s);\n", dest, dest, src1, src2);
+}
+
static OrcTarget c_target = {
"c",
TRUE,
#include "opcodes.h"
+ orc_rule_register (rule_set, "accw", c_rule_accw, NULL);
+ orc_rule_register (rule_set, "accl", c_rule_accl, NULL);
+ orc_rule_register (rule_set, "accsadubl", c_rule_accsadubl, NULL);
}
orc_debug_print(ORC_DEBUG_ERROR, __FILE__, ORC_FUNCTION, __LINE__, __VA_ARGS__); \
} while (0)
+#define ORC_COMPILER_ERROR(compiler, ...) do { \
+ compiler->error = TRUE; \
+ orc_debug_print(ORC_DEBUG_ERROR, __FILE__, ORC_FUNCTION, __LINE__, __VA_ARGS__); \
+} while (0)
+
+enum {
+ ORC_TARGET_C_C99 = (1<<0)
+};
+
enum {
ORC_TARGET_SSE_SSE2 = (1<<0),
ORC_TARGET_SSE_SSE3 = (1<<1),
#include <stdio.h>
#include <orc/orc.h>
+#include <orc-test/orctest.h>
int error = FALSE;
OrcOpcodeSet *opcode_set;
orc_init();
+ orc_test_init();
opcode_set = orc_opcode_set_get ("sys");
test_opcode (OrcStaticOpcode *opcode)
{
OrcProgram *p;
- char s[40];
OrcCompileResult result;
- if (opcode->src_size[1] == 0) {
- p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
- } else {
- p = orc_program_new_dss (opcode->dest_size[0], opcode->src_size[0],
- opcode->src_size[1]);
- }
-
- sprintf(s, "test_%s", opcode->name);
- orc_program_set_name (p, s);
-
- orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
+ p = orc_test_get_program_for_opcode (opcode);
+ if (!p) return;
result = orc_program_compile_for_target (p, orc_target_get_by_name("c"));
if (!ORC_COMPILE_RESULT_IS_SUCCESSFUL(result)) {
test_opcode (OrcStaticOpcode *opcode)
{
OrcProgram *p;
- char s[40];
-
- if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
- if (opcode->src_size[1] == 0) {
- p = orc_program_new_as (opcode->dest_size[0], opcode->src_size[0]);
- } else {
- p = orc_program_new_ass (opcode->dest_size[0], opcode->src_size[0],
- opcode->src_size[1]);
- }
- } else {
- if (opcode->src_size[1] == 0) {
- p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
- } else {
- p = orc_program_new_dss (opcode->dest_size[0], opcode->src_size[0],
- opcode->src_size[1]);
- }
- }
-
- sprintf(s, "test_%s", opcode->name);
- orc_program_set_name (p, s);
- if (opcode->flags & ORC_STATIC_OPCODE_ACCUMULATOR) {
- orc_program_append_str (p, opcode->name, "a1", "s1", "s2");
- } else {
- orc_program_append_str (p, opcode->name, "d1", "s1", "s2");
- }
+ p = orc_test_get_program_for_opcode (opcode);
+ if (!p) return;
orc_test_gcc_compile (p);
test_opcode_const (OrcStaticOpcode *opcode)
{
OrcProgram *p;
- char s[40];
int ret;
- if (opcode->src_size[1] == 0) return;
-
- p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
- orc_program_add_constant (p, opcode->src_size[1], 1, "c1");
-
- sprintf(s, "test_const_%s", opcode->name);
- orc_program_set_name (p, s);
-
- orc_program_append_str (p, opcode->name, "d1", "s1", "c1");
+ p = orc_test_get_program_for_opcode_const (opcode);
+ if (!p) return;
ret = orc_test_gcc_compile (p);
if (!ret) {
test_opcode_param (OrcStaticOpcode *opcode)
{
OrcProgram *p;
- char s[40];
int ret;
- if (opcode->src_size[1] == 0) return;
-
- p = orc_program_new_ds (opcode->dest_size[0], opcode->src_size[0]);
- orc_program_add_parameter (p, opcode->src_size[1], "p1");
-
- sprintf(s, "test_param_%s", opcode->name);
- orc_program_set_name (p, s);
-
- orc_program_append_str (p, opcode->name, "d1", "s1", "p1");
+ p = orc_test_get_program_for_opcode_param (opcode);
+ if (!p) return;
ret = orc_test_gcc_compile (p);
if (!ret) {