From a4b7b5a654ca810e296bb0cca1b27b8847f5548a Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Mon, 3 May 2010 20:05:57 -0700 Subject: [PATCH] Implement "sign" builtin via a new expression operator. --- builtins/110/sign | 34 ++++++++++++++++++++++++++++++++++ builtins/130/sign | 34 ++++++++++++++++++++++++++++++++++ ir.cpp | 2 ++ ir.h | 1 + 4 files changed, 71 insertions(+) create mode 100644 builtins/110/sign create mode 100644 builtins/130/sign diff --git a/builtins/110/sign b/builtins/110/sign new file mode 100644 index 0000000..7d540de --- /dev/null +++ b/builtins/110/sign @@ -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 index 0000000..0bdc0e0 --- /dev/null +++ b/builtins/130/sign @@ -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 --- 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 --- 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, -- 2.7.4