diff options
author | Eric Anholt <eric@anholt.net> | 2010-04-22 09:14:26 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-04-22 11:24:28 -0700 |
commit | 8a1a6b5be9069a28cbd6d7214d352be8ad897cd8 (patch) | |
tree | 1512a15bc053b6142a7f5380c4093ed33c55ade1 | |
parent | 109fb0a89bf0b6ef7294d227f8e150376e846336 (diff) |
ir_to_arbfp: Add support for sqrt.
-rw-r--r-- | arbfp_codegen.brg | 17 | ||||
-rw-r--r-- | arbfp_codegen.cpp | 65 | ||||
-rw-r--r-- | arbfp_codegen.h | 3 | ||||
-rw-r--r-- | ir_to_arbfp.cpp | 3 |
4 files changed, 77 insertions, 11 deletions
diff --git a/arbfp_codegen.brg b/arbfp_codegen.brg index cc2717a..1990405 100644 --- a/arbfp_codegen.brg +++ b/arbfp_codegen.brg @@ -63,6 +63,7 @@ struct mbtree { %term dp4_vec4_vec4 %term dp3_vec4_vec4 %term dp2_vec4_vec4 +%term sqrt_vec4 %start stmt @@ -168,4 +169,20 @@ vec4: div_vec4_vec4(vec4, vec4) 1 tree->swizzle[i] = 0; } +vec4: sqrt_vec4(vec4) 1 +{ + int i; + + tree->v->get_temp(tree); + printf("RSQ %s, %s;\n", + tree->reg_name, + swizzle_reg(tree->left)); + printf("RCP %s, %s;\n", + tree->reg_name, + tree->reg_name); + + for (i = 0; i < 4; i++) + tree->swizzle[i] = 0; +} + %% diff --git a/arbfp_codegen.cpp b/arbfp_codegen.cpp index 569cef7..6529194 100644 --- a/arbfp_codegen.cpp +++ b/arbfp_codegen.cpp @@ -11,6 +11,7 @@ const guint8 mono_burg_arity [] = { 2, /* dp4_vec4_vec4 */ 2, /* dp3_vec4_vec4 */ 2, /* dp2_vec4_vec4 */ + 1, /* sqrt_vec4 */ }; const char *const mono_burg_term_string [] = { @@ -24,6 +25,7 @@ const char *const mono_burg_term_string [] = { "dp4_vec4_vec4", "dp3_vec4_vec4", "dp2_vec4_vec4", + "sqrt_vec4", }; const char * const mono_burg_rule_string [] = { @@ -38,11 +40,13 @@ const char * const mono_burg_rule_string [] = { "vec4: dp3_vec4_vec4(vec4, vec4)", "vec4: dp2_vec4_vec4(vec4, vec4)", "vec4: div_vec4_vec4(vec4, vec4)", + "vec4: sqrt_vec4(vec4)", }; static const guint16 mono_burg_nts_0 [] = { 0 }; static const guint16 mono_burg_nts_1 [] = { MB_NTERM_vec4, MB_NTERM_vec4, 0 }; static const guint16 mono_burg_nts_2 [] = { MB_NTERM_vec4, MB_NTERM_vec4, MB_NTERM_vec4, 0 }; +static const guint16 mono_burg_nts_3 [] = { MB_NTERM_vec4, 0 }; const guint16 *const mono_burg_nts [] = { 0, @@ -56,6 +60,7 @@ const guint16 *const mono_burg_nts [] = { mono_burg_nts_1, /* vec4: dp3_vec4_vec4(vec4, vec4) */ mono_burg_nts_1, /* vec4: dp2_vec4_vec4(vec4, vec4) */ mono_burg_nts_1, /* vec4: div_vec4_vec4(vec4, vec4) */ + mono_burg_nts_3, /* vec4: sqrt_vec4(vec4) */ }; static void /* stmt: assign(vec4, vec4) */ @@ -64,7 +69,7 @@ mono_burg_emit_1 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 72 "arbfp_codegen.brg" +#line 73 "arbfp_codegen.brg" printf("MOV %s, %s;\n", tree->left->reg_name, @@ -80,7 +85,7 @@ mono_burg_emit_2 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 79 "arbfp_codegen.brg" +#line 80 "arbfp_codegen.brg" printf("ADD %s, %s, %s;\n", tree->left->reg_name, @@ -97,7 +102,7 @@ mono_burg_emit_3 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 87 "arbfp_codegen.brg" +#line 88 "arbfp_codegen.brg" tree->v->get_temp(tree); printf("ADD %s, %s, %s;\n", @@ -115,7 +120,7 @@ mono_burg_emit_4 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 96 "arbfp_codegen.brg" +#line 97 "arbfp_codegen.brg" tree->v->get_temp(tree); printf("SUB %s, %s, -%s;\n", @@ -133,7 +138,7 @@ mono_burg_emit_5 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 105 "arbfp_codegen.brg" +#line 106 "arbfp_codegen.brg" tree->v->get_temp(tree); printf("MUL %s, %s, %s;\n", @@ -151,7 +156,7 @@ mono_burg_emit_6 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 114 "arbfp_codegen.brg" +#line 115 "arbfp_codegen.brg" tree->v->get_temp(tree); printf("DP4 %s, %s, %s;\n", @@ -169,7 +174,7 @@ mono_burg_emit_7 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 123 "arbfp_codegen.brg" +#line 124 "arbfp_codegen.brg" int i; @@ -192,7 +197,7 @@ mono_burg_emit_8 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 138 "arbfp_codegen.brg" +#line 139 "arbfp_codegen.brg" int i; @@ -218,7 +223,7 @@ mono_burg_emit_9 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) (void) tree; (void) s; { { -#line 155 "arbfp_codegen.brg" +#line 156 "arbfp_codegen.brg" int i; @@ -238,6 +243,31 @@ mono_burg_emit_9 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) } } +static void /* vec4: sqrt_vec4(vec4) */ +mono_burg_emit_10 (MBTREE_TYPE *tree, MBCGEN_TYPE *s) +{ + (void) tree; (void) s; + { + { +#line 173 "arbfp_codegen.brg" + + int i; + + tree->v->get_temp(tree); + printf("RSQ %s, %s;\n", + tree->reg_name, + swizzle_reg(tree->left)); + printf("RCP %s, %s;\n", + tree->reg_name, + tree->reg_name); + + for (i = 0; i < 4; i++) + tree->swizzle[i] = 0; + + } + } +} + MBEmitFunc const mono_burg_func [] = { NULL, NULL, @@ -250,6 +280,7 @@ MBEmitFunc const mono_burg_func [] = { mono_burg_emit_7, mono_burg_emit_8, mono_burg_emit_9, + mono_burg_emit_10, }; const int mono_burg_decode_stmt[] = { @@ -268,6 +299,7 @@ const int mono_burg_decode_vec4[] = { 8, 9, 10, + 11, }; @@ -403,6 +435,16 @@ mono_burg_label_priv (MBTREE_TYPE *tree, MBCOST_DATA *data) { } } break; + case 10: /* sqrt_vec4 */ + /* vec4: sqrt_vec4(vec4) */ + { + c = left->cost[MB_NTERM_vec4] + 1; + if (c < p->cost[MB_NTERM_vec4]) { + p->cost[MB_NTERM_vec4] = c; + p->rule_vec4 = 9; + } + } + break; default: #ifdef MBGET_OP_NAME g_error ("unknown operator: %s", MBGET_OP_NAME(MBTREE_OP(tree))); @@ -463,10 +505,13 @@ mono_burg_kids (MBTREE_TYPE *tree, int rulenr, MBTREE_TYPE *kids []) kids[1] = MBTREE_LEFT(MBTREE_RIGHT(tree)); kids[2] = MBTREE_RIGHT(MBTREE_RIGHT(tree)); break; + case 11: + kids[0] = MBTREE_LEFT(tree); + break; default: g_assert_not_reached (); } return kids; } -#line 171 "arbfp_codegen.brg" +#line 188 "arbfp_codegen.brg" diff --git a/arbfp_codegen.h b/arbfp_codegen.h index 74585da..d8b024f 100644 --- a/arbfp_codegen.h +++ b/arbfp_codegen.h @@ -155,7 +155,8 @@ typedef enum { MB_TERM_div_vec4_vec4 = 6, MB_TERM_dp4_vec4_vec4 = 7, MB_TERM_dp3_vec4_vec4 = 8, - MB_TERM_dp2_vec4_vec4 = 9 + MB_TERM_dp2_vec4_vec4 = 9, + MB_TERM_sqrt_vec4 = 10 } MBTerms; typedef enum { diff --git a/ir_to_arbfp.cpp b/ir_to_arbfp.cpp index b3779e8..d3ca262 100644 --- a/ir_to_arbfp.cpp +++ b/ir_to_arbfp.cpp @@ -223,6 +223,9 @@ ir_to_arbfp_visitor::visit(ir_expression *ir) this->result = this->create_tree(MB_TERM_dp2_vec4_vec4, op[0], op[1]); } break; + case ir_unop_sqrt: + this->result = this->create_tree(MB_TERM_sqrt_vec4, op[0], op[1]); + break; default: break; } |