Implement 1.30 int/uint variants of min/max/clamp.
diff --git a/builtin_function.cpp b/builtin_function.cpp
index 7f22121..d248388 100644
--- a/builtin_function.cpp
+++ b/builtin_function.cpp
@@ -3056,6 +3056,132 @@
 
 /* 130 builtins */
 
+static const char *builtins_130_clamp = {
+   "((function clamp\n"
+   "   (signature int\n"
+   "     (parameters\n"
+   "       (declare (in) int arg0)\n"
+   "       (declare (in) int arg1)\n"
+   "       (declare (in) int arg2))\n"
+   "     ((return (expression int max (expression int min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2 arg0)\n"
+   "       (declare (in) ivec2 arg1)\n"
+   "       (declare (in) ivec2 arg2))\n"
+   "     ((return (expression ivec2 max (expression ivec2 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3 arg0)\n"
+   "       (declare (in) ivec3 arg1)\n"
+   "       (declare (in) ivec3 arg2))\n"
+   "     ((return (expression ivec3 max (expression ivec3 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4 arg0)\n"
+   "       (declare (in) ivec4 arg1)\n"
+   "       (declare (in) ivec4 arg2))\n"
+   "     ((return (expression ivec4 max (expression ivec4 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2 arg0)\n"
+   "       (declare (in) int arg1)\n"
+   "       (declare (in) int arg2))\n"
+   "     ((declare () ivec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3 arg0)\n"
+   "       (declare (in) int arg1)\n"
+   "       (declare (in) int arg2))\n"
+   "     ((declare () ivec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz z (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4 arg0)\n"
+   "       (declare (in) int arg1)\n"
+   "       (declare (in) int arg2))\n"
+   "     ((declare () ivec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz z (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result)) (expression ivec4 max (expression ivec4 min (swiz w (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uint\n"
+   "     (parameters\n"
+   "       (declare (in) uint arg0)\n"
+   "       (declare (in) uint arg1)\n"
+   "       (declare (in) uint arg2))\n"
+   "     ((return (expression uint max (expression uint min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2 arg0)\n"
+   "       (declare (in) uvec2 arg1)\n"
+   "       (declare (in) uvec2 arg2))\n"
+   "     ((return (expression uvec2 max (expression uvec2 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3 arg0)\n"
+   "       (declare (in) uvec3 arg1)\n"
+   "       (declare (in) uvec3 arg2))\n"
+   "     ((return (expression uvec3 max (expression uvec3 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4 arg0)\n"
+   "       (declare (in) uvec4 arg1)\n"
+   "       (declare (in) uvec4 arg2))\n"
+   "     ((return (expression uvec4 max (expression uvec4 min (var_ref arg0) (var_ref arg2)) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2 arg0)\n"
+   "       (declare (in) uint arg1)\n"
+   "       (declare (in) uint arg2))\n"
+   "     ((declare () uvec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3 arg0)\n"
+   "       (declare (in) uint arg1)\n"
+   "       (declare (in) uint arg2))\n"
+   "     ((declare () uvec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz z (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4 arg0)\n"
+   "       (declare (in) uint arg1)\n"
+   "       (declare (in) uint arg2))\n"
+   "     ((declare () uvec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz x (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz y (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz z (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result)) (expression uvec4 max (expression uvec4 min (swiz w (var_ref arg0)) (var_ref arg2)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "))\n"
+};
+
 static const char *builtins_130_cosh = {
    "((function cosh\n"
    "   (signature float\n"
@@ -3259,6 +3385,266 @@
    "))\n"
 };
 
+static const char *builtins_130_max = {
+   "((function max\n"
+   "   (signature int\n"
+   "     (parameters\n"
+   "       (declare (in) int arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((return (expression int max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2 arg0)\n"
+   "       (declare (in) ivec2 arg1))\n"
+   "     ((return (expression ivec2 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3 arg0)\n"
+   "       (declare (in) ivec3 arg1))\n"
+   "     ((return (expression ivec3 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4 arg0)\n"
+   "       (declare (in) ivec4 arg1))\n"
+   "     ((return (expression ivec4 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression int max (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression int max (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result))\n"
+   "              (expression int max (swiz w (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uint\n"
+   "     (parameters\n"
+   "       (declare (in) uint arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((return (expression uint max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2 arg0)\n"
+   "       (declare (in) uvec2 arg1))\n"
+   "     ((return (expression uvec2 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3 arg0)\n"
+   "       (declare (in) uvec3 arg1))\n"
+   "     ((return (expression uvec3 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4 arg0)\n"
+   "       (declare (in) uvec4 arg1))\n"
+   "     ((return (expression uvec4 max (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression uint max (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint max (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint max (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression uint max (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result))\n"
+   "              (expression uint max (swiz w (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "))\n"
+};
+
+static const char *builtins_130_min = {
+   "((function min\n"
+   "   (signature int\n"
+   "     (parameters\n"
+   "       (declare (in) int arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((return (expression int min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2 arg0)\n"
+   "       (declare (in) ivec2 arg1))\n"
+   "     ((return (expression ivec2 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3 arg0)\n"
+   "       (declare (in) ivec3 arg1))\n"
+   "     ((return (expression ivec3 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4 arg0)\n"
+   "       (declare (in) ivec4 arg1))\n"
+   "     ((return (expression ivec4 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature ivec2\n"
+   "     (parameters\n"
+   "       (declare (in) ivec2  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec3\n"
+   "     (parameters\n"
+   "       (declare (in) ivec3  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression int min (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature ivec4\n"
+   "     (parameters\n"
+   "       (declare (in) ivec4  arg0)\n"
+   "       (declare (in) int arg1))\n"
+   "     ((declare () ivec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression int min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression int min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression int min (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result))\n"
+   "              (expression int min (swiz w (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uint\n"
+   "     (parameters\n"
+   "       (declare (in) uint arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((return (expression uint min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2 arg0)\n"
+   "       (declare (in) uvec2 arg1))\n"
+   "     ((return (expression uvec2 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3 arg0)\n"
+   "       (declare (in) uvec3 arg1))\n"
+   "     ((return (expression uvec3 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4 arg0)\n"
+   "       (declare (in) uvec4 arg1))\n"
+   "     ((return (expression uvec4 min (var_ref arg0) (var_ref arg1)))))\n"
+   "\n"
+   "   (signature uvec2\n"
+   "     (parameters\n"
+   "       (declare (in) uvec2  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec2 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec3\n"
+   "     (parameters\n"
+   "       (declare (in) uvec3  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec3 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression uint min (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "\n"
+   "   (signature uvec4\n"
+   "     (parameters\n"
+   "       (declare (in) uvec4  arg0)\n"
+   "       (declare (in) uint arg1))\n"
+   "     ((declare () uvec4 result)\n"
+   "      (assign (constant bool (1)) (swiz x (var_ref result))\n"
+   "              (expression uint min (swiz x (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz y (var_ref result))\n"
+   "              (expression uint min (swiz y (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz z (var_ref result))\n"
+   "              (expression uint min (swiz z (var_ref arg0)) (var_ref arg1)))\n"
+   "      (assign (constant bool (1)) (swiz w (var_ref result))\n"
+   "              (expression uint min (swiz w (var_ref arg0)) (var_ref arg1)))\n"
+   "      (return (var_ref result))))\n"
+   "))\n"
+};
+
 static const char *builtins_130_notEqual = {
    "((function notEqual\n"
    "   (signature bvec2\n"
@@ -4243,12 +4629,15 @@
 };
 
 static const char *functions_for_130 [] = {
+   builtins_130_clamp,
    builtins_130_cosh,
    builtins_130_equal,
    builtins_130_greaterThan,
    builtins_130_greaterThanEqual,
    builtins_130_lessThan,
    builtins_130_lessThanEqual,
+   builtins_130_max,
+   builtins_130_min,
    builtins_130_notEqual,
    builtins_130_sign,
    builtins_130_sinh,