From 737ab58271552a67ac4bd23ee4937e08b4cfce0e Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 23 May 2009 18:07:39 -0700 Subject: [PATCH] make all the tests work --- orc-test/orctest.c | 91 +++++++++++++++++++++++++++++++++++++++++ orc-test/orctest.h | 3 ++ orc/opcodes.h | 9 ++++ orc/orcprogram-c.c | 63 ++++++++++++++++++++++++++-- orc/orcprogram.h | 9 ++++ testsuite/compile_opcodes_c.c | 16 ++------ testsuite/compile_opcodes_sys.c | 51 +++-------------------- 7 files changed, 181 insertions(+), 61 deletions(-) diff --git a/orc-test/orctest.c b/orc-test/orctest.c index b5d63da..9024a00 100644 --- a/orc-test/orctest.c +++ b/orc-test/orctest.c @@ -388,4 +388,95 @@ orc_test_compare_output (OrcProgram *program) 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; +} diff --git a/orc-test/orctest.h b/orc-test/orctest.h index 67f8dec..7b82606 100644 --- a/orc-test/orctest.h +++ b/orc-test/orctest.h @@ -18,6 +18,9 @@ OrcTestResult orc_test_gcc_compile (OrcProgram *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 diff --git a/orc/opcodes.h b/orc/opcodes.h index 96bef07..ebbb6a0 100644 --- a/orc/opcodes.h +++ b/orc/opcodes.h @@ -102,3 +102,12 @@ BINARY_BW(mulubw, "%s * %s") 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)") + diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index f9b6089..3aec098 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -28,7 +28,15 @@ orc_target_get_asm_preamble (const char *target) { return "\n" "/* begin Orc C target preamble */\n" - "#include \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" @@ -67,6 +75,8 @@ orc_target_get_asm_preamble (const char *target) "#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"; } @@ -97,14 +107,18 @@ orc_compiler_c_assemble (OrcCompiler *compiler) 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; } @@ -123,7 +137,7 @@ orc_compiler_c_assemble (OrcCompiler *compiler) 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; } } @@ -147,9 +161,11 @@ c_get_name (char *name, OrcCompiler *p, int var) 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; } @@ -165,6 +181,8 @@ c_get_type_name (int size) return "int16_t"; case 4: return "int32_t"; + case 8: + return "int64_t"; default: return "ERROR"; } @@ -240,6 +258,40 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ #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, @@ -281,5 +333,8 @@ orc_c_init (void) #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); } diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 500aff6..12de717 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -65,6 +65,15 @@ typedef void (*OrcRuleEmitFunc)(OrcCompiler *p, void *user, OrcInstruction *insn 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), diff --git a/testsuite/compile_opcodes_c.c b/testsuite/compile_opcodes_c.c index 6534d88..14f9f2a 100644 --- a/testsuite/compile_opcodes_c.c +++ b/testsuite/compile_opcodes_c.c @@ -4,6 +4,7 @@ #include #include +#include int error = FALSE; @@ -17,6 +18,7 @@ main (int argc, char *argv[]) OrcOpcodeSet *opcode_set; orc_init(); + orc_test_init(); opcode_set = orc_opcode_set_get ("sys"); @@ -40,20 +42,10 @@ void 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)) { diff --git a/testsuite/compile_opcodes_sys.c b/testsuite/compile_opcodes_sys.c index d7d1df1..5d96e70 100644 --- a/testsuite/compile_opcodes_sys.c +++ b/testsuite/compile_opcodes_sys.c @@ -61,32 +61,9 @@ void 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); @@ -97,18 +74,10 @@ void 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) { @@ -122,18 +91,10 @@ void 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) { -- 2.7.4