Implement "sign" builtin via a new expression operator.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 4 May 2010 03:05:57 +0000 (20:05 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 14 May 2010 23:34:46 +0000 (16:34 -0700)
builtins/110/sign [new file with mode: 0644]
builtins/130/sign [new file with mode: 0644]
ir.cpp
ir.h

diff --git a/builtins/110/sign b/builtins/110/sign
new file mode 100644 (file)
index 0000000..7d540de
--- /dev/null
@@ -0,0 +1,34 @@
+((function sign
+   (signature float
+     (parameters
+       (declare (in) float x))
+     ((return (expression float sign (var_ref x)))))
+
+   (signature vec2
+     (parameters
+       (declare (in) vec2 x))
+     ((declare () vec2 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression float sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression float sign (swiz y (var_ref x))))
+      (return (var_ref t))))
+
+   (signature vec3
+     (parameters
+       (declare (in) vec3 x))
+     ((declare () vec3 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression float sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression float sign (swiz y (var_ref x))))
+      (assign (constant bool (1)) (swiz z (var_ref t)) (expression float sign (swiz z (var_ref x))))
+      (return (var_ref t))))
+
+   (signature vec4
+     (parameters
+       (declare (in) vec4 x))
+     ((declare () vec4 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression float sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression float sign (swiz y (var_ref x))))
+      (assign (constant bool (1)) (swiz z (var_ref t)) (expression float sign (swiz z (var_ref x))))
+      (assign (constant bool (1)) (swiz w (var_ref t)) (expression float sign (swiz w (var_ref x))))
+      (return (var_ref t))))
+))
+
diff --git a/builtins/130/sign b/builtins/130/sign
new file mode 100644 (file)
index 0000000..0bdc0e0
--- /dev/null
@@ -0,0 +1,34 @@
+((function sign
+   (signature int
+     (parameters
+       (declare (in) int x))
+     ((return (expression int / (var_ref x) (expression int abs (var_ref x))))))
+
+   (signature ivec2
+     (parameters
+       (declare (in) ivec2 x))
+     ((declare () ivec2 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression int sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression int sign (swiz y (var_ref x))))
+      (return (var_ref t))))
+
+   (signature ivec3
+     (parameters
+       (declare (in) ivec3 x))
+     ((declare () ivec3 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression int sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression int sign (swiz y (var_ref x))))
+      (assign (constant bool (1)) (swiz z (var_ref t)) (expression int sign (swiz z (var_ref x))))
+      (return (var_ref t))))
+
+   (signature ivec4
+     (parameters
+       (declare (in) ivec4 x))
+     ((declare () ivec4 t)
+      (assign (constant bool (1)) (swiz x (var_ref t)) (expression int sign (swiz x (var_ref x))))
+      (assign (constant bool (1)) (swiz y (var_ref t)) (expression int sign (swiz y (var_ref x))))
+      (assign (constant bool (1)) (swiz z (var_ref t)) (expression int sign (swiz z (var_ref x))))
+      (assign (constant bool (1)) (swiz w (var_ref t)) (expression int sign (swiz w (var_ref x))))
+      (return (var_ref t))))
+))
+
diff --git a/ir.cpp b/ir.cpp
index 76f5bab..b927c73 100644 (file)
--- a/ir.cpp
+++ b/ir.cpp
@@ -53,6 +53,7 @@ ir_expression::get_num_operands(ir_expression_operation op)
       1, /* ir_unop_logic_not */
       1, /* ir_unop_neg */
       1, /* ir_unop_abs */
+      1, /* ir_unop_sign */
       1, /* ir_unop_rcp */
       1, /* ir_unop_rsq */
       1, /* ir_unop_sqrt */
@@ -112,6 +113,7 @@ static const char *const operator_strs[] = {
    "!",
    "neg",
    "abs",
+   "sign",
    "rcp",
    "rsq",
    "sqrt",
diff --git a/ir.h b/ir.h
index d8568a8..55a6773 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -424,6 +424,7 @@ enum ir_expression_operation {
    ir_unop_logic_not,
    ir_unop_neg,
    ir_unop_abs,
+   ir_unop_sign,
    ir_unop_rcp,
    ir_unop_rsq,
    ir_unop_sqrt,