From: David Schleef Date: Thu, 15 Oct 2009 19:29:05 +0000 (-0700) Subject: Add C rules for float opcodes X-Git-Tag: merge-base~20 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2fe7444cee14b6958fe3370172be182cacb596ee;p=platform%2Fupstream%2Forc.git Add C rules for float opcodes --- diff --git a/orc/opcodes.h b/orc/opcodes.h index 6f6ffba..bce47f0 100644 --- a/orc/opcodes.h +++ b/orc/opcodes.h @@ -111,3 +111,16 @@ UNARY_LW(select1lw, "((uint32_t)%s >> 16)&0xffff") UNARY_UW(swapw, "ORC_SWAP_W(%s)") UNARY_UL(swapl, "ORC_SWAP_L(%s)") +BINARY_F(addf, "%s + %s") +BINARY_F(subf, "%s - %s") +BINARY_F(mulf, "%s * %s") +BINARY_F(divf, "%s / %s") +UNARY_F(sqrtf, "sqrt(%s)") +BINARY_F(maxf, "ORC_MAX(%s,%s)") +BINARY_F(minf, "ORC_MIN(%s,%s)") +BINARY_FL(cmpeqf, "(%s == %s) ? (~0) : 0") +BINARY_FL(cmpltf, "(%s < %s) ? (~0) : 0") +BINARY_FL(cmplef, "(%s <= %s) ? (~0) : 0") +UNARY_FL(convfl, "rintf(%s)") +UNARY_LF(convlf, "%s") + diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index 4201134..c454cba 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -328,6 +328,27 @@ c_get_name (char *name, OrcCompiler *p, int var) } } +static void +c_get_name_float (char *name, OrcCompiler *p, int var) +{ + switch (p->vars[var].vartype) { + case ORC_VAR_TYPE_CONST: + case ORC_VAR_TYPE_PARAM: + case ORC_VAR_TYPE_TEMP: + case ORC_VAR_TYPE_ACCUMULATOR: + sprintf(name, "(*(float *)(&var%d))", var); + break; + case ORC_VAR_TYPE_SRC: + case ORC_VAR_TYPE_DEST: + sprintf(name, "((float *)var%d)[i]", var); + break; + default: + ORC_COMPILER_ERROR(p, "bad vartype"); + sprintf(name, "ERROR"); + break; + } +} + static const char * c_get_type_name (int size) { @@ -371,6 +392,68 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ ORC_ASM_CODE(p," %s = " op ";\n", dest, src1, src2); \ } +#define UNARYF(name,op) \ +static void \ +c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ +{ \ + char dest[40], src1[40]; \ +\ + c_get_name_float (dest, p, insn->dest_args[0]); \ + c_get_name_float (src1, p, insn->src_args[0]); \ + \ + ORC_ASM_CODE(p," %s = " op ";\n", dest, src1); \ +} + +#define BINARYF(name,op) \ +static void \ +c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ +{ \ + char dest[40], src1[40], src2[40]; \ +\ + c_get_name_float (dest, p, insn->dest_args[0]); \ + c_get_name_float (src1, p, insn->src_args[0]); \ + c_get_name_float (src2, p, insn->src_args[1]); \ + \ + ORC_ASM_CODE(p," %s = " op ";\n", dest, src1, src2); \ +} + +#define BINARYFL(name,op) \ +static void \ +c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ +{ \ + char dest[40], src1[40], src2[40]; \ +\ + c_get_name (dest, p, insn->dest_args[0]); \ + c_get_name_float (src1, p, insn->src_args[0]); \ + c_get_name_float (src2, p, insn->src_args[1]); \ + \ + ORC_ASM_CODE(p," %s = " op ";\n", dest, src1, src2); \ +} + +#define UNARYFL(name,op) \ +static void \ +c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ +{ \ + char dest[40], src1[40]; \ +\ + c_get_name (dest, p, insn->dest_args[0]); \ + c_get_name_float (src1, p, insn->src_args[0]); \ + \ + ORC_ASM_CODE(p," %s = " op ";\n", dest, src1); \ +} + +#define UNARYLF(name,op) \ +static void \ +c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ +{ \ + char dest[40], src1[40]; \ +\ + c_get_name_float (dest, p, insn->dest_args[0]); \ + c_get_name (src1, p, insn->src_args[0]); \ + \ + ORC_ASM_CODE(p," %s = " op ";\n", dest, src1); \ +} + #define BINARY_SB(a,b) BINARY(a,b) #define BINARY_UB(a,b) BINARY(a,b) #define BINARY_SW(a,b) BINARY(a,b) @@ -392,6 +475,12 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ #define UNARY_LW(a,b) UNARY(a,b) #define UNARY_WB(a,b) UNARY(a,b) +#define BINARY_F(a,b) BINARYF(a,b) +#define BINARY_FL(a,b) BINARYFL(a,b) +#define UNARY_F(a,b) UNARYF(a,b) +#define UNARY_FL(a,b) UNARYFL(a,b) +#define UNARY_LF(a,b) UNARYLF(a,b) + #include "opcodes.h" #undef BINARY_SB @@ -400,12 +489,14 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ #undef BINARY_UW #undef BINARY_SL #undef BINARY_UL +#undef BINARY_F #undef UNARY_SB #undef UNARY_UB #undef UNARY_SW #undef UNARY_UW #undef UNARY_SL #undef UNARY_UL +#undef UNARY_F #undef BINARY_BW #undef BINARY_WL #undef BINARY_LW @@ -414,6 +505,9 @@ c_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \ #undef UNARY_WL #undef UNARY_LW #undef UNARY_WB +#undef UNARY_FL +#undef UNARY_LF +#undef BINARY_FL static void c_rule_accw (OrcCompiler *p, void *user, OrcInstruction *insn) @@ -476,12 +570,14 @@ orc_c_init (void) #define BINARY_UW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define BINARY_SL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define BINARY_UL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); +#define BINARY_F(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_SB(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_UB(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_SW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_UW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_SL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_UL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); +#define UNARY_F(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define BINARY_BW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define BINARY_WL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define BINARY_LW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); @@ -491,6 +587,10 @@ orc_c_init (void) #define UNARY_LW(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); #define UNARY_WB(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); +#define UNARY_FL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); +#define BINARY_FL(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); +#define UNARY_LF(a,b) orc_rule_register (rule_set, #a , c_rule_ ## a, NULL); + #include "opcodes.h" orc_rule_register (rule_set, "accw", c_rule_accw, NULL); diff --git a/tools/orcc.c b/tools/orcc.c index 485b7f4..8ba33cb 100644 --- a/tools/orcc.c +++ b/tools/orcc.c @@ -188,6 +188,7 @@ main (int argc, char *argv[]) fprintf(output, "#include \n"); fprintf(output, "#include \n"); fprintf(output, "#include \n"); + fprintf(output, "#include \n"); if (include_file) { fprintf(output, "#include <%s>\n", include_file); }