summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-04-22 09:14:26 -0700
committerEric Anholt <eric@anholt.net>2010-04-22 11:24:28 -0700
commit8a1a6b5be9069a28cbd6d7214d352be8ad897cd8 (patch)
tree1512a15bc053b6142a7f5380c4093ed33c55ade1
parent109fb0a89bf0b6ef7294d227f8e150376e846336 (diff)
ir_to_arbfp: Add support for sqrt.
-rw-r--r--arbfp_codegen.brg17
-rw-r--r--arbfp_codegen.cpp65
-rw-r--r--arbfp_codegen.h3
-rw-r--r--ir_to_arbfp.cpp3
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;
}