mesa: allow variable indexing into the predefined uniform variable arrays
[mesa.git] / src / mesa / shader / slang / library / slang_common_builtin.gc
old mode 100755 (executable)
new mode 100644 (file)
index 65c5c79..3e03b10
@@ -1,58 +1,53 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.3
+ *
+ * Copyright (C) 2006  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2008  VMware, Inc.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
 
-// 
-// TODO:
-// - implement sin, asin, acos, atan, pow, log2, floor, ceil,
-// - implement texture1D, texture2D, texture3D, textureCube,
-// - implement shadow1D, shadow2D,
-// - implement noise1, noise2, noise3, noise4,
-// 
-
-// 
+//
 // From Shader Spec, ver. 1.10, rev. 59
-// 
-// The following built-in constants are provided to vertex and fragment shaders.
-// 
-
-// 
-// Implementation dependent constants. The example values below
-// are the minimum values allowed for these maximums.
-// 
-
-const int gl_MaxLights = 8;                             // GL 1.0
-const int gl_MaxClipPlanes = 6;                         // GL 1.0
-const int gl_MaxTextureUnits = 2;                       // GL 1.3
-const int gl_MaxTextureCoords = 2;                      // ARB_fragment_program
-const int gl_MaxVertexAttribs = 16;                     // ARB_vertex_shader
-const int gl_MaxVertexUniformComponents = 512;          // ARB_vertex_shader
-const int gl_MaxVaryingFloats = 32;                     // ARB_vertex_shader
-const int gl_MaxVertexTextureImageUnits = 0;            // ARB_vertex_shader
-const int gl_MaxCombinedTextureImageUnits = 2;          // ARB_vertex_shader
-const int gl_MaxTextureImageUnits = 2;                  // ARB_fragment_shader
-const int gl_MaxFragmentUniformComponents = 64;         // ARB_fragment_shader
-const int gl_MaxDrawBuffers = 1;                        // proposed ARB_draw_buffers
-
-// 
-// As an aid to accessing OpenGL processing state, the following uniform variables are built into
-// the OpenGL Shading Language. All page numbers and notations are references to the 1.4
-// specification.
-// 
-
-// 
-// Matrix state. p. 31, 32, 37, 39, 40.
-// 
+//
+
+//bp: XXX these will probably go away since the value needs to be
+//determined at runtime and may vary from one GLcontext to another...
+const int gl_MaxLights = 8;
+const int gl_MaxClipPlanes = 6;
+const int gl_MaxTextureUnits = 8;
+const int gl_MaxTextureCoords = 8;
+const int gl_MaxVertexAttribs = 16;
+const int gl_MaxVertexUniformComponents = 512;
+const int gl_MaxVaryingFloats = 32;
+const int gl_MaxVertexTextureImageUnits = 0;
+const int gl_MaxCombinedTextureImageUnits = 2;
+const int gl_MaxTextureImageUnits = 2;
+const int gl_MaxFragmentUniformComponents = 64;
+const int gl_MaxDrawBuffers = 1;
 
 uniform mat4 gl_ModelViewMatrix;
 uniform mat4 gl_ProjectionMatrix;
 uniform mat4 gl_ModelViewProjectionMatrix;
 uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords];
 
-//
-// Derived matrix state that provides inverse and transposed versions
-// of the matrices above. Poorly conditioned matrices may result
-// in unpredictable values in their inverse forms.
-//
-uniform mat3 gl_NormalMatrix; // transpose of the inverse of the
-                              // upper leftmost 3x3 of gl_ModelViewMatrix
+uniform mat3 gl_NormalMatrix;
 
 uniform mat4 gl_ModelViewMatrixInverse;
 uniform mat4 gl_ProjectionMatrixInverse;
@@ -69,34 +64,18 @@ uniform mat4 gl_ProjectionMatrixInverseTranspose;
 uniform mat4 gl_ModelViewProjectionMatrixInverseTranspose;
 uniform mat4 gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];
 
-// 
-// Normal scaling p. 39.
-// 
-
 uniform float gl_NormalScale;
 
-// 
-// Depth range in window coordinates, p. 33
-// 
-
 struct gl_DepthRangeParameters {
-    float near;                                         // n
-    float far;                                          // f
-    float diff;                                         // f - n
+    float near;
+    float far;
+    float diff;
 };
 
 uniform gl_DepthRangeParameters gl_DepthRange;
 
-// 
-// Clip planes p. 42.
-// 
-
 uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];
 
-// 
-// Point Size, p. 66, 67.
-// 
-
 struct gl_PointParameters {
     float size;
     float sizeMin;
@@ -109,74 +88,61 @@ struct gl_PointParameters {
 
 uniform gl_PointParameters gl_Point;
 
-// 
-// Material State p. 50, 55.
-// 
-
 struct gl_MaterialParameters {
-    vec4 emission;                                      // Ecm
-    vec4 ambient;                                       // Acm
-    vec4 diffuse;                                       // Dcm
-    vec4 specular;                                      // Scm
-    float shininess;                                    // Srm
+    vec4 emission;
+    vec4 ambient;
+    vec4 diffuse;
+    vec4 specular;
+    float shininess;
 };
 
 uniform gl_MaterialParameters gl_FrontMaterial;
 uniform gl_MaterialParameters gl_BackMaterial;
 
-// 
-// Light State p 50, 53, 55.
-// 
-
+/* NOTE: the order of these fields is significant!
+ * See the definition of the lighting state vars such as STATE_SPOT_DIRECTION.
+ */
 struct gl_LightSourceParameters {
-    vec4 ambient;                                       // Acli
-    vec4 diffuse;                                       // Dcli
-    vec4 specular;                                      // Scli
-    vec4 position;                                      // Ppli
-    vec4 halfVector;                                    // Derived: Hi
-    vec3 spotDirection;                                 // Sdli
-    float spotExponent;                                 // Srli
-    float spotCutoff;                                   // Crli
-                                                        // (range: [0.0,90.0], 180.0)
-    float spotCosCutoff;                                // Derived: cos(Crli)
-                                                        // (range: [1.0,0.0],-1.0)
-    float constantAttenuation;                          // K0
-    float linearAttenuation;                            // K1
-    float quadraticAttenuation;                         // K2
+    vec4 ambient;
+    vec4 diffuse;
+    vec4 specular;
+    vec4 position;
+    vec4 halfVector;
+    vec3 spotDirection;
+    float spotCosCutoff;
+
+    float constantAttenuation;
+    float linearAttenuation;
+    float quadraticAttenuation;
+    float spotExponent;
+
+    float spotCutoff;
 };
 
 uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];
 
 struct gl_LightModelParameters {
-    vec4 ambient;                                       // Acs
+    vec4 ambient;
 };
 
 uniform gl_LightModelParameters gl_LightModel;
 
-// 
-// Derived state from products of light and material.
-// 
-
 struct gl_LightModelProducts {
-    vec4 sceneColor;                                    // Derived. Ecm + Acm * Acs
+    vec4 sceneColor;
 };
 
 uniform gl_LightModelProducts gl_FrontLightModelProduct;
 uniform gl_LightModelProducts gl_BackLightModelProduct;
 
 struct gl_LightProducts {
-    vec4 ambient;                                       // Acm * Acli
-    vec4 diffuse;                                       // Dcm * Dcli
-    vec4 specular;                                      // Scm * Scli
+    vec4 ambient;
+    vec4 diffuse;
+    vec4 specular;
 };
 
 uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];
 uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];
 
-// 
-// Texture Environment and Generation, p. 152, p. 40-42.
-// 
-
 uniform vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];
 uniform vec4 gl_EyePlaneS[gl_MaxTextureCoords];
 uniform vec4 gl_EyePlaneT[gl_MaxTextureCoords];
@@ -187,1223 +153,1720 @@ uniform vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];
 uniform vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];
 uniform vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];
 
-// 
-// Fog p. 161
-// 
-
 struct gl_FogParameters {
     vec4 color;
     float density;
     float start;
     float end;
-    float scale;    // Derived:    1.0 / (end - start)
+    float scale;
 };
 
 uniform gl_FogParameters gl_Fog;
 
-// 
-// The OpenGL Shading Language defines an assortment of built-in convenience functions for scalar
-// and vector operations. Many of these built-in functions can be used in more than one type
-// of shader, but some are intended to provide a direct mapping to hardware and so are available
-// only for a specific type of shader.
-// 
-// The built-in functions basically fall into three categories:
-// 
-// \95 They expose some necessary hardware functionality in a convenient way such as accessing
-//   a texture map. There is no way in the language for these functions to be emulated by a shader.
-// 
-// \95 They represent a trivial operation (clamp, mix, etc.) that is very simple for the user
-//   to write, but they are very common and may have direct hardware support. It is a very hard
-//   problem for the compiler to map expressions to complex assembler instructions.
-// 
-// \95 They represent an operation graphics hardware is likely to accelerate at some point. The
-//   trigonometry functions fall into this category.
-// 
-// Many of the functions are similar to the same named ones in common C libraries, but they support
-// vector input as well as the more traditional scalar input.
-// 
-// Applications should be encouraged to use the built-in functions rather than do the equivalent
-// computations in their own shader code since the built-in functions are assumed to be optimal
-// (e.g., perhaps supported directly in hardware).
-// 
-// User code can replace built-in functions with their own if they choose, by simply re-declaring
-// and defining the same name and argument list.
-// 
-
-// 
+
+
+
+
+//
 // 8.1 Angle and Trigonometry Functions
-// 
-// Function parameters specified as angle are assumed to be in units of radians. In no case will
-// any of these functions result in a divide by zero error. If the divisor of a ratio is 0, then
-// results will be undefined.
-// 
-// These all operate component-wise. The description is per component.
-// 
+//
 
-// 
-// Converts degrees to radians and returns the result, i.e., result = PI*deg/180.
-// 
+//// radians
 
-float radians (float deg) {
-    return 3.141593 * deg / 180.0;
+float radians(const float deg)
+{
+   const float c = 3.1415926 / 180.0;
+   __asm vec4_multiply __retVal, deg, c;
 }
-vec2 radians (vec2 deg) {
-    return vec2 (radians (deg.x), radians (deg.y));
+
+vec2 radians(const vec2 deg)
+{
+   const float c = 3.1415926 / 180.0;
+   __asm vec4_multiply __retVal.xy, deg.xy, c.xx;
 }
-vec3 radians (vec3 deg) {
-    return vec3 (radians (deg.x), radians (deg.y), radians (deg.z));
+
+vec3 radians(const vec3 deg)
+{
+   const float c = 3.1415926 / 180.0;
+   __asm vec4_multiply __retVal.xyz, deg.xyz, c.xxx;
 }
-vec4 radians (vec4 deg) {
-    return vec4 (radians (deg.x), radians (deg.y), radians (deg.z), radians (deg.w));
+
+vec4 radians(const vec4 deg)
+{
+   const float c = 3.1415926 / 180.0;
+   __asm vec4_multiply __retVal, deg, c.xxxx;
 }
 
-// 
-// Converts radians to degrees and returns the result, i.e., result = 180*rad/PI.
-// 
 
-float degrees (float rad) {
-    return 180.0 * rad / 3.141593;
+//// degrees
+
+float degrees(const float rad)
+{
+   const float c = 180.0 / 3.1415926;
+   __asm vec4_multiply __retVal, rad, c;
 }
-vec2 degrees (vec2 rad) {
-    return vec2 (degrees (rad.x), degrees (rad.y));
+
+vec2 degrees(const vec2 rad)
+{
+   const float c = 180.0 / 3.1415926;
+   __asm vec4_multiply __retVal.xy, rad.xy, c.xx;
 }
-vec3 degrees (vec3 rad) {
-    return vec3 (degrees (rad.x), degrees (rad.y), degrees (rad.z));
+
+vec3 degrees(const vec3 rad)
+{
+   const float c = 180.0 / 3.1415926;
+   __asm vec4_multiply __retVal.xyz, rad.xyz, c.xxx;
 }
-vec4 degrees (vec4 rad) {
-    return vec4 (degrees (rad.x), degrees (rad.y), degrees (rad.z), degrees (rad.w));
+
+vec4 degrees(const vec4 rad)
+{
+   const float c = 180.0 / 3.1415926;
+   __asm vec4_multiply __retVal, rad, c.xxxx;
 }
 
-// 
-// The standard trigonometric sine function.
-// 
-// XXX
-float sin (float angle) {
-    return 0.0;
+
+//// sin
+
+float sin(const float radians)
+{
+   __asm float_sine __retVal, radians;
 }
-vec2 sin (vec2 angle) {
-    return vec2 (sin (angle.x), sin (angle.y));
+
+vec2 sin(const vec2 radians)
+{
+   __asm float_sine __retVal.x, radians.x;
+   __asm float_sine __retVal.y, radians.y;
 }
-vec3 sin (vec3 angle) {
-    return vec3 (sin (angle.x), sin (angle.y), sin (angle.z));
+
+vec3 sin(const vec3 radians)
+{
+   __asm float_sine __retVal.x, radians.x;
+   __asm float_sine __retVal.y, radians.y;
+   __asm float_sine __retVal.z, radians.z;
 }
-vec4 sin (vec4 angle) {
-    return vec4 (sin (angle.x), sin (angle.y), sin (angle.z), sin (angle.w));
+
+vec4 sin(const vec4 radians)
+{
+   __asm float_sine __retVal.x, radians.x;
+   __asm float_sine __retVal.y, radians.y;
+   __asm float_sine __retVal.z, radians.z;
+   __asm float_sine __retVal.w, radians.w;
 }
 
-// 
-// The standard trigonometric cosine function.
-// 
 
-float cos (float angle) {
-    return sin (angle + 1.5708);
+//// cos
+
+float cos(const float radians)
+{
+   __asm float_cosine __retVal, radians;
 }
-vec2 cos (vec2 angle) {
-    return vec2 (cos (angle.x), cos (angle.y));
+
+vec2 cos(const vec2 radians)
+{
+   __asm float_cosine __retVal.x, radians.x;
+   __asm float_cosine __retVal.y, radians.y;
 }
-vec3 cos (vec3 angle) {
-    return vec3 (cos (angle.x), cos (angle.y), cos (angle.z));
+
+vec3 cos(const vec3 radians)
+{
+   __asm float_cosine __retVal.x, radians.x;
+   __asm float_cosine __retVal.y, radians.y;
+   __asm float_cosine __retVal.z, radians.z;
 }
-vec4 cos (vec4 angle) {
-    return vec4 (cos (angle.x), cos (angle.y), cos (angle.z), cos (angle.w));
+
+vec4 cos(const vec4 radians)
+{
+   __asm float_cosine __retVal.x, radians.x;
+   __asm float_cosine __retVal.y, radians.y;
+   __asm float_cosine __retVal.z, radians.z;
+   __asm float_cosine __retVal.w, radians.w;
 }
 
-// 
-// The standard trigonometric tangent.
-// 
 
-float tan (float angle) {
-    return sin (angle) / cos (angle);
+
+//// tan
+
+float tan(const float angle)
+{
+   const float s = sin(angle);
+   const float c = cos(angle);
+   return s / c;
 }
-vec2 tan (vec2 angle) {
-    return vec2 (tan (angle.x), tan (angle.y));
+
+vec2 tan(const vec2 angle)
+{
+   const vec2 s = sin(angle);
+   const vec2 c = cos(angle);
+   return s / c;
 }
-vec3 tan (vec3 angle) {
-    return vec3 (tan (angle.x), tan (angle.y), tan (angle.z));
+
+vec3 tan(const vec3 angle)
+{
+   const vec3 s = sin(angle);
+   const vec3 c = cos(angle);
+   return s / c;
 }
-vec4 tan (vec4 angle) {
-    return vec4 (tan (angle.x), tan (angle.y), tan (angle.z), tan (angle.w));
+
+vec4 tan(const vec4 angle)
+{
+   const vec4 s = sin(angle);
+   const vec4 c = cos(angle);
+   return s / c;
 }
 
-// 
-// Arc sine. Returns an angle whose sine is x. The range of values returned by this function is
-// [\96PI/2, PI/2]. Results are undefined if |x| > 1.
-// 
-// XXX
-float asin (float x) {
-    return 0.0;
+
+
+float asin(const float x)
+{
+   const float a0 = 1.5707288;  // PI/2?
+   const float a1 = -0.2121144;
+   const float a2 = 0.0742610;
+   //const float a3 = -0.0187293;
+   const float halfPi = 3.1415926 * 0.5;
+   const float y = abs(x);
+   // three terms seem to be enough:
+   __retVal = (halfPi - sqrt(1.0 - y) * (a0 + y * (a1 + a2 * y))) * sign(x);
+   // otherwise, try four:
+   //__retVal = (halfPi - sqrt(1.0 - y) * (a0 + y * (a1 + y * (a2 + y * a3)))) * sign(x);
 }
-vec2 asin (vec2 x) {
-    return vec2 (asin (x.x), asin (x.y));
+
+vec2 asin(const vec2 v)
+{
+   __retVal.x = asin(v.x);
+   __retVal.y = asin(v.y);
 }
-vec3 asin (vec3 x) {
-    return vec3 (asin (x.x), asin (x.y), asin (x.z));
+
+vec3 asin(const vec3 v)
+{
+   __retVal.x = asin(v.x);
+   __retVal.y = asin(v.y);
+   __retVal.z = asin(v.z);
 }
-vec4 asin (vec4 x) {
-    return vec4 (asin (x.x), asin (x.y), asin (x.z), asin (x.w));
+
+vec4 asin(const vec4 v)
+{
+   __retVal.x = asin(v.x);
+   __retVal.y = asin(v.y);
+   __retVal.z = asin(v.z);
+   __retVal.w = asin(v.w);
 }
 
-// 
-// Arc cosine. Returns an angle whose cosine is x. The range of values returned by this function is
-// [0, PI]. Results are undefined if |x| > 1.
-// 
-// XXX
-float acos (float x) {
-    return 0.0;
+float acos(const float x)
+{
+   const float halfPi = 3.1415926 * 0.5;
+   __retVal = halfPi - asin(x);
 }
-vec2 acos (vec2 x) {
-    return vec2 (acos (x.x), acos (x.y));
+
+vec2 acos(const vec2 v)
+{
+   __retVal.x = acos(v.x);
+   __retVal.y = acos(v.y);
 }
-vec3 acos (vec3 x) {
-    return vec3 (acos (x.x), acos (x.y), acos (x.z));
+
+vec3 acos(const vec3 v)
+{
+   __retVal.x = acos(v.x);
+   __retVal.y = acos(v.y);
+   __retVal.z = acos(v.z);
 }
-vec4 acos (vec4 x) {
-    return vec4 (acos (x.x), acos (x.y), acos (x.z), acos (x.w));
+
+vec4 acos(const vec4 v)
+{
+   __retVal.x = acos(v.x);
+   __retVal.y = acos(v.y);
+   __retVal.z = acos(v.z);
+   __retVal.w = acos(v.w);
 }
 
-// 
-// Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine
-// what quadrant the angle is in. The range of values returned by this function is [\96PI, PI].
-// Results are undefined if x and y are both 0.
-// 
-// XXX
-float atan (float x, float y) {
-    return 0.0;
+float atan(const float x)
+{
+   __retVal = asin(x * inversesqrt(x * x + 1.0));
 }
-vec2 atan (vec2 x, vec2 y) {
-    return vec2 (atan (x.x, y.x), atan (x.y, y.y));
+
+vec2 atan(const vec2 y_over_x)
+{
+   __retVal.x = atan(y_over_x.x);
+   __retVal.y = atan(y_over_x.y);
 }
-vec3 atan (vec3 x, vec3 y) {
-    return vec3 (atan (x.x, y.x), atan (x.y, y.y), atan (x.z, y.z));
+
+vec3 atan(const vec3 y_over_x)
+{
+   __retVal.x = atan(y_over_x.x);
+   __retVal.y = atan(y_over_x.y);
+   __retVal.z = atan(y_over_x.z);
 }
-vec4 atan (vec4 x, vec4 y) {
-    return vec4 (atan (x.x, y.x), atan (x.y, y.y), atan (x.z, y.z), atan (x.w, y.w));
+
+vec4 atan(const vec4 y_over_x)
+{
+   __retVal.x = atan(y_over_x.x);
+   __retVal.y = atan(y_over_x.y);
+   __retVal.z = atan(y_over_x.z);
+   __retVal.w = atan(y_over_x.w);
 }
 
-// 
-// Arc tangent. Returns an angle whose tangent is y_over_x. The range of values returned by this
-// function is [\96PI/2, PI/2].
-// 
-// XXX
-float atan (float y_over_x) {
-    return 0.0;
+float atan(const float y, const float x)
+{
+   float r;
+   if (abs(x) > 1.0e-4) {
+      r = atan(y / x);
+      if (x < 0.0) {
+         r = r + sign(y) * 3.141593;
+      }
+   }
+   else {
+      r = sign(y) * 1.5707965;  // pi/2
+   }
+   return r;
 }
-vec2 atan (vec2 y_over_x) {
-    return vec2 (atan (y_over_x.x), atan (y_over_x.y));
+
+vec2 atan(const vec2 u, const vec2 v)
+{
+   __retVal.x = atan(u.x, v.x);
+   __retVal.y = atan(u.y, v.y);
 }
-vec3 atan (vec3 y_over_x) {
-    return vec3 (atan (y_over_x.x), atan (y_over_x.y), atan (y_over_x.z));
+
+vec3 atan(const vec3 u, const vec3 v)
+{
+   __retVal.x = atan(u.x, v.x);
+   __retVal.y = atan(u.y, v.y);
+   __retVal.z = atan(u.z, v.z);
 }
-vec4 atan (vec4 y_over_x) {
-    return vec4 (atan (y_over_x.x), atan (y_over_x.y), atan (y_over_x.z), atan (y_over_x.w));
+
+vec4 atan(const vec4 u, const vec4 v)
+{
+   __retVal.x = atan(u.x, v.x);
+   __retVal.y = atan(u.y, v.y);
+   __retVal.z = atan(u.z, v.z);
+   __retVal.w = atan(u.w, v.w);
 }
 
-// 
+
+//
 // 8.2 Exponential Functions
-// 
-// These all operate component-wise. The description is per component.
-// 
+//
+
+//// pow
 
-// 
-// Returns x raised to the y power, i.e., x^y.
-// Results are undefined if x < 0.
-// Results are undefined if x = 0 and y <= 0.
-// 
-// XXX
-float pow (float x, float y) {
-    return 0.0;
+float pow(const float a, const float b)
+{
+   __asm float_power __retVal, a, b;
 }
-vec2 pow (vec2 x, vec2 y) {
-    return vec2 (pow (x.x, y.x), pow (x.y, y.y));
+
+vec2 pow(const vec2 a, const vec2 b)
+{
+   __asm float_power __retVal.x, a.x, b.x;
+   __asm float_power __retVal.y, a.y, b.y;
 }
-vec3 pow (vec3 x, vec3 y) {
-    return vec3 (pow (x.x, y.x), pow (x.y, y.y), pow (x.z, y.z));
+
+vec3 pow(const vec3 a, const vec3 b)
+{
+   __asm float_power __retVal.x, a.x, b.x;
+   __asm float_power __retVal.y, a.y, b.y;
+   __asm float_power __retVal.z, a.z, b.z;
 }
-vec4 pow (vec4 x, vec4 y) {
-    return vec4 (pow (x.x, y.x), pow (x.y, y.y), pow (x.z, y.z), pow (x.w, y.w));
+
+vec4 pow(const vec4 a, const vec4 b)
+{
+   __asm float_power __retVal.x, a.x, b.x;
+   __asm float_power __retVal.y, a.y, b.y;
+   __asm float_power __retVal.z, a.z, b.z;
+   __asm float_power __retVal.w, a.w, b.w;
 }
 
-// 
-// Returns the natural exponentiation of x, i.e., e^x.
-// 
 
-float exp (float x) {
-    return pow (2.71828183, x);
+//// exp
+
+float exp(const float a)
+{
+   // NOTE: log2(e) = 1.44269502
+   float t = a * 1.44269502;
+   __asm float_exp2 __retVal, t;
 }
-vec2 exp (vec2 x) {
-    return vec2 (exp (x.x), exp (x.y));
+
+vec2 exp(const vec2 a)
+{
+   vec2 t = a * 1.44269502;
+   __asm float_exp2 __retVal.x, t.x;
+   __asm float_exp2 __retVal.y, t.y;
 }
-vec3 exp (vec3 x) {
-    return vec3 (exp (x.x), exp (x.y), exp (x.z));
+
+vec3 exp(const vec3 a)
+{
+   vec3 t = a * 1.44269502;
+   __asm float_exp2 __retVal.x, t.x;
+   __asm float_exp2 __retVal.y, t.y;
+   __asm float_exp2 __retVal.z, t.z;
 }
-vec4 exp (vec4 x) {
-    return vec4 (exp (x.x), exp (x.y), exp (x.z), exp (x.w));
+
+vec4 exp(const vec4 a)
+{
+   vec4 t = a * 1.44269502;
+   __asm float_exp2 __retVal.x, t.x;
+   __asm float_exp2 __retVal.y, t.y;
+   __asm float_exp2 __retVal.z, t.z;
+   __asm float_exp2 __retVal.w, t.w;
 }
 
-// 
-// Returns the natural logarithm of x, i.e., returns the value y which satisfies the equation
-// x = e^y.
-// Results are undefined if x <= 0.
-// 
 
-float log (float x) {
-    return log2 (x) / log2 (2.71828183);
+
+//// log2
+
+float log2(const float x)
+{
+   __asm float_log2 __retVal, x;
 }
-vec2 log (vec2 x) {
-    return vec2 (log (x.x), log (x.y));
+
+vec2 log2(const vec2 v)
+{
+   __asm float_log2 __retVal.x, v.x;
+   __asm float_log2 __retVal.y, v.y;
 }
-vec3 log (vec3 x) {
-    return vec3 (log (x.x), log (x.y), log (x.z));
+
+vec3 log2(const vec3 v)
+{
+   __asm float_log2 __retVal.x, v.x;
+   __asm float_log2 __retVal.y, v.y;
+   __asm float_log2 __retVal.z, v.z;
 }
-vec4 log (vec4 x) {
-    return vec4 (log (x.x), log (x.y), log (x.z), log (x.w));
+
+vec4 log2(const vec4 v)
+{
+   __asm float_log2 __retVal.x, v.x;
+   __asm float_log2 __retVal.y, v.y;
+   __asm float_log2 __retVal.z, v.z;
+   __asm float_log2 __retVal.w, v.w;
 }
 
-// 
-// Returns 2 raised to the x power, i.e., 2^x
-// 
 
-float exp2 (float x) {
-    return pow (2.0, x);
+//// log  (natural log)
+
+float log(const float x)
+{
+   // note:  logBaseB(x) = logBaseN(x) / logBaseN(B)
+   // compute log(x) = log2(x) / log2(e)
+   // c = 1.0 / log2(e) = 0.693147181
+   const float c = 0.693147181;
+   return log2(x) * c;
 }
-vec2 exp2 (vec2 x) {
-    return vec2 (exp2 (x.x), exp2 (x.y));
+
+vec2 log(const vec2 v)
+{
+   const float c = 0.693147181;
+   return log2(v) * c;
 }
-vec3 exp2 (vec3 x) {
-    return vec3 (exp2 (x.x), exp2 (x.y), exp2 (x.z));
+
+vec3 log(const vec3 v)
+{
+   const float c = 0.693147181;
+   return log2(v) * c;
 }
-vec4 exp2 (vec4 x) {
-    return vec4 (exp2 (x.x), exp2 (x.y), exp2 (x.z), exp2 (x.w));
+
+vec4 log(const vec4 v)
+{
+   const float c = 0.693147181;
+   return log2(v) * c;
 }
 
-// 
-// Returns the base 2 logarithm of x, i.e., returns the value y which satisfies the equation
-// x = 2^y.
-// Results are undefined if x <= 0.
-// 
-// XXX
-float log2 (float x) {
-    return 0.0;
+
+//// exp2
+
+float exp2(const float a)
+{
+   __asm float_exp2 __retVal, a;
 }
-vec2 log2 (vec2 x) {
-    return vec2 (log2 (x.x), log2 (x.y));
+
+vec2 exp2(const vec2 a)
+{
+   __asm float_exp2 __retVal.x, a.x;
+   __asm float_exp2 __retVal.y, a.y;
 }
-vec3 log2 (vec3 x) {
-    return vec3 (log2 (x.x), log2 (x.y), log2 (x.z));
+
+vec3 exp2(const vec3 a)
+{
+   __asm float_exp2 __retVal.x, a.x;
+   __asm float_exp2 __retVal.y, a.y;
+   __asm float_exp2 __retVal.z, a.z;
 }
-vec4 log2 (vec4 x) {
-    return vec4 (log2 (x.x), log2 (x.y), log2 (x.z), log2 (x.w));
+
+vec4 exp2(const vec4 a)
+{
+   __asm float_exp2 __retVal.x, a.x;
+   __asm float_exp2 __retVal.y, a.y;
+   __asm float_exp2 __retVal.z, a.z;
+   __asm float_exp2 __retVal.w, a.w;
 }
 
-// 
-// Returns the positive square root of x.
-// Results are undefined if x < 0.
-// 
 
-float sqrt (float x) {
-    return pow (x, 0.5);
+//// sqrt
+
+float sqrt(const float x)
+{
+   float r;
+   __asm float_rsq r, x;
+   __asm float_rcp __retVal, r;
 }
-vec2 sqrt (vec2 x) {
-    return vec2 (sqrt (x.x), sqrt (x.y));
+
+vec2 sqrt(const vec2 v)
+{
+   float r;
+   __asm float_rsq r, v.x;
+   __asm float_rcp __retVal.x, r;
+   __asm float_rsq r, v.y;
+   __asm float_rcp __retVal.y, r;
 }
-vec3 sqrt (vec3 x) {
-    return vec3 (sqrt (x.x), sqrt (x.y), sqrt (x.z));
+
+vec3 sqrt(const vec3 v)
+{
+   float r;
+   __asm float_rsq r, v.x;
+   __asm float_rcp __retVal.x, r;
+   __asm float_rsq r, v.y;
+   __asm float_rcp __retVal.y, r;
+   __asm float_rsq r, v.z;
+   __asm float_rcp __retVal.z, r;
 }
-vec4 sqrt (vec4 x) {
-    return vec4 (sqrt (x.x), sqrt (x.y), sqrt (x.z), sqrt (x.w));
+
+vec4 sqrt(const vec4 v)
+{
+   float r;
+   __asm float_rsq r, v.x;
+   __asm float_rcp __retVal.x, r;
+   __asm float_rsq r, v.y;
+   __asm float_rcp __retVal.y, r;
+   __asm float_rsq r, v.z;
+   __asm float_rcp __retVal.z, r;
+   __asm float_rsq r, v.w;
+   __asm float_rcp __retVal.w, r;
 }
 
-// 
-// Returns the reciprocal of the positive square root of x.
-// Results are undefined if x <= 0.
-// 
 
-float inversesqrt (float x) {
-    return 1.0 / sqrt (x);
+//// inversesqrt
+
+float inversesqrt(const float x)
+{
+   __asm float_rsq __retVal.x, x;
 }
-vec2 inversesqrt (vec2 x) {
-    return vec2 (inversesqrt (x.x), inversesqrt (x.y));
+
+vec2 inversesqrt(const vec2 v)
+{
+   __asm float_rsq __retVal.x, v.x;
+   __asm float_rsq __retVal.y, v.y;
 }
-vec3 inversesqrt (vec3 x) {
-    return vec3 (inversesqrt (x.x), inversesqrt (x.y), inversesqrt (x.z));
+
+vec3 inversesqrt(const vec3 v)
+{
+   __asm float_rsq __retVal.x, v.x;
+   __asm float_rsq __retVal.y, v.y;
+   __asm float_rsq __retVal.z, v.z;
 }
-vec4 inversesqrt (vec4 x) {
-    return vec4 (inversesqrt (x.x), inversesqrt (x.y), inversesqrt (x.z), inversesqrt (x.w));
+
+vec4 inversesqrt(const vec4 v)
+{
+   __asm float_rsq __retVal.x, v.x;
+   __asm float_rsq __retVal.y, v.y;
+   __asm float_rsq __retVal.z, v.z;
+   __asm float_rsq __retVal.w, v.w;
+}
+
+
+//// normalize
+
+float normalize(const float x)
+{
+   __retVal = 1.0;
+}
+
+vec2 normalize(const vec2 v)
+{
+   const float s = inversesqrt(dot(v, v));
+   __asm vec4_multiply __retVal.xy, v, s;
+}
+
+vec3 normalize(const vec3 v)
+{
+//   const float s = inversesqrt(dot(v, v));
+//   __retVal = v * s;
+// XXX note, we _could_ use __retVal.w instead of tmp and and save a
+// register, but that's actually a compilation error because v is a vec3
+// and the .w suffix is illegal.  Oh well.
+   float tmp;
+   __asm vec3_dot tmp, v, v;
+   __asm float_rsq tmp, tmp;
+   __asm vec4_multiply __retVal.xyz, v, tmp;
+}
+
+vec4 normalize(const vec4 v)
+{
+   float tmp;
+   __asm vec4_dot tmp, v, v;
+   __asm float_rsq tmp, tmp;
+   __asm vec4_multiply __retVal.xyz, v, tmp;
 }
 
-// 
+
+
+//
 // 8.3 Common Functions
-// 
-// These all operate component-wise. The description is per component.
-// 
+//
+
 
-// 
-// Returns x if x >= 0, otherwise it returns \96x
-// 
+//// abs
 
-float abs (float x) {
-    return x >= 0.0 ? x : -x;
+float abs(const float a)
+{
+   __asm vec4_abs __retVal, a;
 }
-vec2 abs (vec2 x) {
-    return vec2 (abs (x.x), abs (x.y));
+
+vec2 abs(const vec2 a)
+{
+   __asm vec4_abs __retVal.xy, a;
 }
-vec3 abs (vec3 x) {
-    return vec3 (abs (x.x), abs (x.y), abs (x.z));
+
+vec3 abs(const vec3 a)
+{
+   __asm vec4_abs __retVal.xyz, a;
 }
-vec4 abs (vec4 x) {
-    return vec4 (abs (x.x), abs (x.y), abs (x.z), abs (x.w));
+
+vec4 abs(const vec4 a)
+{
+   __asm vec4_abs __retVal, a;
 }
 
-// 
-// Returns 1.0 if x > 0, 0.0 if x = 0, or \961.0 if x < 0
-// 
 
-float sign (float x) {
-    return x > 0.0 ? 1.0 : x < 0.0 ? -1.0 : 0.0;
+//// sign
+
+float sign(const float x)
+{
+   float p, n;
+   __asm vec4_sgt p, x, 0.0;            // p = (x > 0)
+   __asm vec4_sgt n, 0.0, x;            // n = (x < 0)
+   __asm vec4_subtract __retVal, p, n;  // sign = p - n
 }
-vec2 sign (vec2 x) {
-    return vec2 (sign (x.x), sign (x.y));
+
+vec2 sign(const vec2 v)
+{
+   vec2 p, n;
+   __asm vec4_sgt p.xy, v, 0.0;
+   __asm vec4_sgt n.xy, 0.0, v;
+   __asm vec4_subtract __retVal.xy, p, n;
 }
-vec3 sign (vec3 x) {
-    return vec3 (sign (x.x), sign (x.y), sign (x.z));
+
+vec3 sign(const vec3 v)
+{
+   vec3 p, n;
+   __asm vec4_sgt p.xyz, v, 0.0;
+   __asm vec4_sgt n.xyz, 0.0, v;
+   __asm vec4_subtract __retVal.xyz, p, n;
 }
-vec4 sign (vec4 x) {
-    return vec4 (sign (x.x), sign (x.y), sign (x.z), sign (x.w));
+
+vec4 sign(const vec4 v)
+{
+   vec4 p, n;
+   __asm vec4_sgt p, v, 0.0;
+   __asm vec4_sgt n, 0.0, v;
+   __asm vec4_subtract __retVal, p, n;
 }
 
-// 
-// Returns a value equal to the nearest integer that is less than or equal to x
-// 
-// XXX
-float floor (float x) {
-    return 0.0;
+
+//// floor
+
+float floor(const float a)
+{
+   __asm vec4_floor __retVal, a;
 }
-vec2 floor (vec2 x) {
-    return vec2 (floor (x.x), floor (x.y));
+
+vec2 floor(const vec2 a)
+{
+   __asm vec4_floor __retVal.xy, a;
 }
-vec3 floor (vec3 x) {
-    return vec3 (floor (x.x), floor (x.y), floor (x.z));
+
+vec3 floor(const vec3 a)
+{
+   __asm vec4_floor __retVal.xyz, a;
 }
-vec4 floor (vec4 x) {
-    return vec4 (floor (x.x), floor (x.y), floor (x.z), floor (x.w));
+
+vec4 floor(const vec4 a)
+{
+   __asm vec4_floor __retVal, a;
 }
 
-// 
-// Returns a value equal to the nearest integer that is greater than or equal to x
-// 
-// XXX
-float ceil (float x) {
-    return 0.0;
+
+//// ceil
+
+float ceil(const float a)
+{
+   // XXX this could be improved
+   float b = -a;
+   __asm vec4_floor b, b;
+   __retVal = -b;
 }
-vec2 ceil (vec2 x) {
-    return vec2 (ceil (x.x), ceil (x.y));
+
+vec2 ceil(const vec2 a)
+{
+   vec2 b = -a;
+   __asm vec4_floor b, b;
+   __retVal.xy = -b;
 }
-vec3 ceil (vec3 x) {
-    return vec3 (ceil (x.x), ceil (x.y), ceil (x.z));
+
+vec3 ceil(const vec3 a)
+{
+   vec3 b = -a;
+   __asm vec4_floor b, b;
+   __retVal.xyz = -b;
 }
-vec4 ceil (vec4 x) {
-    return vec4 (ceil (x.x), ceil (x.y), ceil (x.z), ceil (x.w));
+
+vec4 ceil(const vec4 a)
+{
+   vec4 b = -a;
+   __asm vec4_floor b, b;
+   __retVal = -b;
 }
 
-// 
-// Returns x \96 floor (x)
-// 
 
-float fract (float x) {
-    return x - floor (x);
+//// fract
+
+float fract(const float a)
+{
+   __asm vec4_frac __retVal, a;
 }
-vec2 fract (vec2 x) {
-    return vec2 (fract (x.x), fract (x.y));
+
+vec2 fract(const vec2 a)
+{
+   __asm vec4_frac __retVal.xy, a;
 }
-vec3 fract (vec3 x) {
-    return vec3 (fract (x.x), fract (x.y), fract (x.z));
+
+vec3 fract(const vec3 a)
+{
+   __asm vec4_frac __retVal.xyz, a;
 }
-vec4 fract (vec4 x) {
-    return vec4 (fract (x.x), fract (x.y), fract (x.z), fract (x.w));
+
+vec4 fract(const vec4 a)
+{
+   __asm vec4_frac __retVal, a;
 }
 
-// 
-// Modulus. Returns x \96 y * floor (x/y)
-// 
 
-float mod (float x, float y) {
-    return x - y * floor (x / y);
+//// mod  (very untested!)
+
+float mod(const float a, const float b)
+{
+    float oneOverB;
+    __asm float_rcp oneOverB, b;
+    __retVal = a - b * floor(a * oneOverB);
 }
-vec2 mod (vec2 x, float y) {
-    return vec2 (mod (x.x, y), mod (x.y, y));
+
+vec2 mod(const vec2 a, const float b)
+{
+    float oneOverB;
+    __asm float_rcp oneOverB, b;
+    __retVal.xy = a - b * floor(a * oneOverB);
 }
-vec3 mod (vec3 x, float y) {
-    return vec3 (mod (x.x, y), mod (x.y, y), mod (x.z, y));
+
+vec3 mod(const vec3 a, const float b)
+{
+    float oneOverB;
+    __asm float_rcp oneOverB, b;
+    __retVal.xyz = a - b * floor(a * oneOverB);
 }
-vec4 mod (vec4 x, float y) {
-    return vec4 (mod (x.x, y), mod (x.y, y), mod (x.z, y), mod (x.w, y));
+
+vec4 mod(const vec4 a, const float b)
+{
+    float oneOverB;
+    __asm float_rcp oneOverB, b;
+    __retVal = a - b * floor(a * oneOverB);
 }
-vec2 mod (vec2 x, vec2 y) {
-    return vec2 (mod (x.x, y.x), mod (x.y, y.y));
+
+vec2 mod(const vec2 a, const vec2 b)
+{
+    vec2 oneOverB;
+    __asm float_rcp oneOverB.x, b.x;
+    __asm float_rcp oneOverB.y, b.y;
+    __retVal = a - b * floor(a * oneOverB);
 }
-vec3 mod (vec3 x, vec3 y) {
-    return vec3 (mod (x.x, y.x), mod (x.y, y.y), mod (x.z, y.z));
+
+vec3 mod(const vec3 a, const vec3 b)
+{
+    vec3 oneOverB;
+    __asm float_rcp oneOverB.x, b.x;
+    __asm float_rcp oneOverB.y, b.y;
+    __asm float_rcp oneOverB.z, b.z;
+    __retVal = a - b * floor(a * oneOverB);
 }
-vec4 mod (vec4 x, vec4 y) {
-    return vec4 (mod (x.x, y.x), mod (x.y, y.y), mod (x.z, y.z), mod (x.w, y.w));
+
+vec4 mod(const vec4 a, const vec4 b)
+{
+    vec4 oneOverB;
+    __asm float_rcp oneOverB.x, b.x;
+    __asm float_rcp oneOverB.y, b.y;
+    __asm float_rcp oneOverB.z, b.z;
+    __asm float_rcp oneOverB.w, b.w;
+    __retVal = a - b * floor(a * oneOverB);
 }
 
-// 
-// Returns y if y < x, otherwise it returns x
-// 
 
-float min (float x, float y) {
-    return y < x ? y : x;
+//// min
+
+float min(const float a, const float b)
+{
+   __asm vec4_min __retVal, a, b;
 }
-vec2 min (vec2 x, float y) {
-    return vec2 (min (x.x, y), min (x.y, y));
+
+vec2 min(const vec2 a, const vec2 b)
+{
+   __asm vec4_min __retVal.xy, a.xy, b.xy;
 }
-vec3 min (vec3 x, float y) {
-    return vec3 (min (x.x, y), min (x.y, y), min (x.z, y));
+
+vec3 min(const vec3 a, const vec3 b)
+{
+   __asm vec4_min __retVal.xyz, a.xyz, b.xyz;
 }
-vec4 min (vec4 x, float y) {
-    return vec4 (min (x.x, y), min (x.y, y), min (x.z, y), min (x.w, y));
+
+vec4 min(const vec4 a, const vec4 b)
+{
+   __asm vec4_min __retVal, a, b;
 }
-vec2 min (vec2 x, vec2 y) {
-    return vec2 (min (x.x, y.x), min (x.y, y.y));
+
+vec2 min(const vec2 a, const float b)
+{
+   __asm vec4_min __retVal, a.xy, b;
 }
-vec3 min (vec3 x, vec3 y) {
-    return vec3 (min (x.x, y.x), min (x.y, y.y), min (x.z, y.z));
+
+vec3 min(const vec3 a, const float b)
+{
+   __asm vec4_min __retVal, a.xyz, b;
 }
-vec4 min (vec4 x, vec4 y) {
-    return vec4 (min (x.x, y.x), min (x.y, y.y), min (x.z, y.z), min (x.w, y.w));
+
+vec4 min(const vec4 a, const float b)
+{
+   __asm vec4_min __retVal, a, b;
 }
 
-// 
-// Returns y if x < y, otherwise it returns x
-// 
 
-float max (float x, float y) {
-    return min (y, x);
+//// max
+
+float max(const float a, const float b)
+{
+   __asm vec4_max __retVal, a, b;
 }
-vec2 max (vec2 x, float y) {
-    return vec2 (max (x.x, y), max (x.y, y));
+
+vec2 max(const vec2 a, const vec2 b)
+{
+   __asm vec4_max __retVal.xy, a.xy, b.xy;
 }
-vec3 max (vec3 x, float y) {
-    return vec3 (max (x.x, y), max (x.y, y), max (x.z, y));
+
+vec3 max(const vec3 a, const vec3 b)
+{
+   __asm vec4_max __retVal.xyz, a.xyz, b.xyz;
 }
-vec4 max (vec4 x, float y) {
-    return vec4 (max (x.x, y), max (x.y, y), max (x.z, y), max (x.w, y));
+
+vec4 max(const vec4 a, const vec4 b)
+{
+   __asm vec4_max __retVal, a, b;
 }
-vec2 max (vec2 x, vec2 y) {
-    return vec2 (max (x.x, y.x), max (x.y, y.y));
+
+vec2 max(const vec2 a, const float b)
+{
+   __asm vec4_max __retVal, a.xy, b;
 }
-vec3 max (vec3 x, vec3 y) {
-    return vec3 (max (x.x, y.x), max (x.y, y.y), max (x.z, y.z));
+
+vec3 max(const vec3 a, const float b)
+{
+   __asm vec4_max __retVal, a.xyz, b;
 }
-vec4 max (vec4 x, vec4 y) {
-    return vec4 (max (x.x, y.x), max (x.y, y.y), max (x.z, y.z), max (x.w, y.w));
+
+vec4 max(const vec4 a, const float b)
+{
+   __asm vec4_max __retVal, a, b;
 }
 
-// 
-// Returns min (max (x, minVal), maxVal)
-// 
-// Note that colors and depths written by fragment shaders will be clamped by the implementation
-// after the fragment shader runs.
-// 
 
-float clamp (float x, float minVal, float maxVal) {
-    return min (max (x, minVal), maxVal);
+//// clamp
+
+float clamp(const float val, const float minVal, const float maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec2 clamp (vec2 x, float minVal, float maxVal) {
-    return vec2 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal));
+
+vec2 clamp(const vec2 val, const float minVal, const float maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec3 clamp (vec3 x, float minVal, float maxVal) {
-    return vec3 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal),
-        clamp (x.z, minVal, maxVal));
+
+vec3 clamp(const vec3 val, const float minVal, const float maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec4 clamp (vec4 x, float minVal, float maxVal) {
-    return vec4 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal),
-        clamp (x.z, minVal, maxVal), clamp (x.w, minVal, maxVal));
+
+vec4 clamp(const vec4 val, const float minVal, const float maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec2 clamp (vec2 x, vec2 minVal, vec2 maxVal) {
-    return vec2 (clamp (x.x, minVal.x, maxVal.x), clamp (x.y, minVal.y, maxVal.y));
+
+vec2 clamp(const vec2 val, const vec2 minVal, const vec2 maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec3 clamp (vec3 x, vec3 minVal, vec3 maxVal) {
-    return vec3 (clamp (x.x, minVal.x, maxVal.x), clamp (x.y, minVal.y, maxVal.y),
-        clamp (x.z, minVal.z, maxVal.z));
+
+vec3 clamp(const vec3 val, const vec3 minVal, const vec3 maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
-vec4 clamp (vec4 x, vec4 minVal, vec4 maxVal) {
-    return vec4 (clamp (x.x, minVal.x, maxVal.y), clamp (x.y, minVal.y, maxVal.y),
-        clamp (x.z, minVal.z, maxVal.z), clamp (x.w, minVal.w, maxVal.w));
+
+vec4 clamp(const vec4 val, const vec4 minVal, const vec4 maxVal)
+{
+   __asm vec4_clamp __retVal, val, minVal, maxVal;
 }
 
-// 
-// Returns x * (1 \96 a) + y * a, i.e., the linear blend of x and y
-// 
 
-float mix (float x, float y, float a) {
-    return x * (1.0 - a) + y * a;
+//// mix
+
+float mix(const float x, const float y, const float a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec2 mix (vec2 x, vec2 y, float a) {
-    return vec2 (mix (x.x, y.x, a), mix (x.y, y.y, a));
+
+vec2 mix(const vec2 x, const vec2 y, const float a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec3 mix (vec3 x, vec3 y, float a) {
-    return vec3 (mix (x.x, y.x, a), mix (x.y, y.y, a), mix (x.z, y.z, a));
+
+vec3 mix(const vec3 x, const vec3 y, const float a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec4 mix (vec4 x, vec4 y, float a) {
-    return vec4 (mix (x.x, y.x, a), mix (x.y, y.y, a), mix (x.z, y.z, a), mix (x.w, y.w, a));
+
+vec4 mix(const vec4 x, const vec4 y, const float a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec2 mix (vec2 x, vec2 y, vec2 a) {
-    return vec2 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y));
+
+vec2 mix(const vec2 x, const vec2 y, const vec2 a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec3 mix (vec3 x, vec3 y, vec3 a) {
-    return vec3 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y), mix (x.z, y.z, a.z));
+
+vec3 mix(const vec3 x, const vec3 y, const vec3 a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
-vec4 mix (vec4 x, vec4 y, vec4 a) {
-    return vec4 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y), mix (x.z, y.z, a.z),
-        mix (x.w, y.w, a.w));
+
+vec4 mix(const vec4 x, const vec4 y, const vec4 a)
+{
+   __asm vec4_lrp __retVal, a, y, x;
 }
 
-// 
-// Returns 0.0 if x < edge, otherwise it returns 1.0
-// 
 
-float step (float edge, float x) {
-    return x < edge ? 0.0 : 1.0;
+//// step
+
+float step(const float edge, const float x)
+{
+   __asm vec4_sge __retVal, x, edge;
 }
-vec2 step (float edge, vec2 x) {
-    return vec2 (step (edge, x.x), step (edge, x.y));
+
+vec2 step(const vec2 edge, const vec2 x)
+{
+   __asm vec4_sge __retVal.xy, x, edge;
 }
-vec3 step (float edge, vec3 x) {
-    return vec3 (step (edge, x.x), step (edge, x.y), step (edge, x.z));
+
+vec3 step(const vec3 edge, const vec3 x)
+{
+   __asm vec4_sge __retVal.xyz, x, edge;
 }
-vec4 step (float edge, vec4 x) {
-    return vec4 (step (edge, x.x), step (edge, x.y), step (edge, x.z), step (edge, x.w));
+
+vec4 step(const vec4 edge, const vec4 x)
+{
+   __asm vec4_sge __retVal, x, edge;
 }
-vec2 step (vec2 edge, vec2 x) {
-    return vec2 (step (edge.x, x.x), step (edge.y, x.y));
+
+vec2 step(const float edge, const vec2 v)
+{
+   __asm vec4_sge __retVal.xy, v, edge;
 }
-vec3 step (vec3 edge, vec3 x) {
-    return vec3 (step (edge.x, x.x), step (edge.y, x.y), step (edge.z, x.z));
+
+vec3 step(const float edge, const vec3 v)
+{
+   __asm vec4_sge __retVal.xyz, v, edge;
 }
-vec4 step (vec4 edge, vec4 x) {
-    return vec4 (step (edge.x, x.x), step (edge.y, x.y), step (edge.z, x.z), step (edge.w, x.w));
+
+vec4 step(const float edge, const vec4 v)
+{
+   __asm vec4_sge __retVal, v, edge;
 }
 
-// 
-// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and performs smooth Hermite interpolation
-// between 0 and 1 when edge0 < x < edge1. This is useful in cases where you would want a threshold
-// function with a smooth transition. This is equivalent to:
-// <type> t;
-// t = clamp ((x \96 edge0) / (edge1 \96 edge0), 0, 1);
-// return t * t * (3 \96 2 * t);
-// 
 
-float smoothstep (float edge0, float edge1, float x) {
-    const float t = clamp ((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+//// smoothstep
+
+float smoothstep(const float edge0, const float edge1, const float x)
+{
+    float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
     return t * t * (3.0 - 2.0 * t);
 }
-vec2 smoothstep (float edge0, float edge1, vec2 x) {
-    return vec2 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y));
+
+vec2 smoothstep(const vec2 edge0, const vec2 edge1, const vec2 v)
+{
+   vec2 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
-vec3 smoothstep (float edge0, float edge1, vec3 x) {
-    return vec3 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y),
-        smoothstep (edge0, edge1, x.z));
+
+vec3 smoothstep(const vec3 edge0, const vec3 edge1, const vec3 v)
+{
+   vec3 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
-vec4 smoothstep (float edge0, float edge1, vec4 x) {
-    return vec4 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y),
-        smoothstep (edge0, edge1, x.z), smoothstep (edge0, edge1, x.w));
+
+vec4 smoothstep(const vec4 edge0, const vec4 edge1, const vec4 v)
+{
+   vec4 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
-vec2 smoothstep (vec2 edge0, vec2 edge1, vec2 x) {
-    return vec2 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y));
+
+vec2 smoothstep(const float edge0, const float edge1, const vec2 v)
+{
+   vec2 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
-vec3 smoothstep (vec3 edge0, vec3 edge1, vec3 x) {
-    return vec3 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y),
-        smoothstep (edge0.z, edge1.z, x.z));
+
+vec3 smoothstep(const float edge0, const float edge1, const vec3 v)
+{
+   vec3 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
-vec4 smoothstep (vec4 edge0, vec4 edge1, vec4 x) {
-    return vec4 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y),
-        smoothstep (edge0.z, edge1.z, x.z), smoothstep (edge0.w, edge1.w, x.w));
+
+vec4 smoothstep(const float edge0, const float edge1, const vec4 v)
+{
+   vec4 t = clamp((v - edge0) / (edge1 - edge0), 0.0, 1.0);
+   return t * t * (3.0 - 2.0 * t);
 }
 
-// 
+
+
+//
 // 8.4 Geometric Functions
-// 
-// These operate on vectors as vectors, not component-wise.
-// 
+//
 
-// 
-// Returns the dot product of x and y, i.e., result = x[0] * y[0] + x[1] * y[1] + ...
-// 
 
-float dot (float x, float y) {
-    return x * y;
+//// length
+
+float length(const float x)
+{
+   return abs(x);
 }
-float dot (vec2 x, vec2 y) {
-    return dot (x.x, y.x) + dot (x.y, y.y);
+
+float length(const vec2 v)
+{
+   float r;
+   const float p = dot(v, v);      // p = v.x * v.x + v.y * v.y
+   __asm float_rsq r, p;           // r = 1 / sqrt(p)
+   __asm float_rcp __retVal.x, r;  // retVal = 1 / r
 }
-float dot (vec3 x, vec3 y) {
-    return dot (x.x, y.x) + dot (x.y, y.y) + dot (x.z, y.z);
+
+float length(const vec3 v)
+{
+   float r;
+   const float p = dot(v, v);      // p = v.x * v.x + v.y * v.y + v.z * v.z
+   __asm float_rsq r, p;           // r = 1 / sqrt(p)
+   __asm float_rcp __retVal, r;    // retVal = 1 / r
 }
-float dot (vec4 x, vec4 y) {
-    return dot (x.x, y.x) + dot (x.y, y.y) + dot (x.z, y.z) + dot (x.w, y.w);
+
+float length(const vec4 v)
+{
+   float r;
+   const float p = dot(v, v);      // p = v.x * v.x + v.y * v.y + ...
+   __asm float_rsq r, p;           // r = 1 / sqrt(p)
+   __asm float_rcp __retVal, r;    // retVal = 1 / r
 }
 
-// 
-// Returns the length of vector x, i.e., sqrt (x[0] * x[0] + x[1] * x[1] + ...)
-// 
 
-float length (float x) {
-    return sqrt (dot (x, x));
+//// distance
+
+float distance(const float x, const float y)
+{
+   const float d = x - y;
+   __retVal = length(d);
 }
-float length (vec2 x) {
-    return sqrt (dot (x, x));
+
+float distance(const vec2 v, const vec2 u)
+{
+   const vec2 d2 = v - u;
+   __retVal = length(d2);
 }
-float length (vec3 x) {
-    return sqrt (dot (x, x));
+
+float distance(const vec3 v, const vec3 u)
+{
+   const vec3 d3 = v - u;
+   __retVal = length(d3);
 }
-float length (vec4 x) {
-    return sqrt (dot (x, x));
+
+float distance(const vec4 v, const vec4 u)
+{
+   const vec4 d4 = v - u;
+   __retVal = length(d4);
 }
 
-// 
-// Returns the distance between p0 and p1, i.e. length (p0 \96 p1)
-// 
 
-float distance (float x, float y) {
-    return length (x - y);
-}
-float distance (vec2 x, vec2 y) {
-    return length (x - y);
+//// cross
+
+vec3 cross(const vec3 v, const vec3 u)
+{
+   __asm vec3_cross __retVal.xyz, v, u;
 }
-float distance (vec3 x, vec3 y) {
-    return length (x - y);
+
+
+//// faceforward
+
+float faceforward(const float N, const float I, const float Nref)
+{
+    // this could probably be done better
+    const float d = dot(Nref, I);
+    float s;
+    __asm vec4_sgt s, 0.0, d;  // s = (0.0 > d) ? 1 : 0
+    return mix(-N, N, s);
 }
-float distance (vec4 x, vec4 y) {
-    return length (x - y);
+
+vec2 faceforward(const vec2 N, const vec2 I, const vec2 Nref)
+{
+    // this could probably be done better
+    const float d = dot(Nref, I);
+    float s;
+    __asm vec4_sgt s, 0.0, d;  // s = (0.0 > d) ? 1 : 0
+    return mix(-N, N, s);
 }
 
-// 
-// Returns the cross product of x and y, i.e.
-// result.0 = x[1] * y[2] - y[1] * x[2]
-// result.1 = x[2] * y[0] - y[2] * x[0]
-// result.2 = x[0] * y[1] - y[0] * x[1]
-// 
+vec3 faceforward(const vec3 N, const vec3 I, const vec3 Nref)
+{
+    // this could probably be done better
+    const float d = dot(Nref, I);
+    float s;
+    __asm vec4_sgt s, 0.0, d;  // s = (0.0 > d) ? 1 : 0
+    return mix(-N, N, s);
+}
 
-vec3 cross (vec3 x, vec3 y) {
-    return vec3 (x.y * y.z - y.y * x.z, x.z * y.x - y.z * x.x, x.x * y.y - y.x * x.y);
+vec4 faceforward(const vec4 N, const vec4 I, const vec4 Nref)
+{
+    // this could probably be done better
+    const float d = dot(Nref, I);
+    float s;
+    __asm vec4_sgt s, 0.0, d;  // s = (0.0 > d) ? 1 : 0
+    return mix(-N, N, s);
 }
 
-// 
-// Returns a vector in the same direction as x but with a length of 1.
-// 
 
-float normalize (float x) {
-    return 1.0;
+//// reflect
+
+float reflect(const float I, const float N)
+{
+   return I - 2.0 * dot(N, I) * N;
 }
-vec2 normalize (vec2 x) {
-    return x / length (x);
+
+vec2 reflect(const vec2 I, const vec2 N)
+{
+   return I - 2.0 * dot(N, I) * N;
 }
-vec3 normalize (vec3 x) {
-    return x / length (x);
+
+vec3 reflect(const vec3 I, const vec3 N)
+{
+   return I - 2.0 * dot(N, I) * N;
 }
-vec4 normalize (vec4 x) {
-    return x / length (x);
+
+vec4 reflect(const vec4 I, const vec4 N)
+{
+   return I - 2.0 * dot(N, I) * N;
 }
 
-// 
-// If dot (Nref, I) < 0 return N otherwise return \96N
-// 
+//// refract
 
-float faceforward (float N, float I, float Nref) {
-    return dot (Nref, I) < 0.0 ? N : -N;
+float refract(const float I, const float N, const float eta)
+{
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
+   float retval;
+   if (k < 0.0)
+      retval = 0.0;
+   else
+      retval = eta * I - (eta * n_dot_i + sqrt(k)) * N;
+   return retval;
 }
-vec2 faceforward (vec2 N, vec2 I, vec2 Nref) {
-    return dot (Nref, I) < 0.0 ? N : -N;
+
+vec2 refract(const vec2 I, const vec2 N, const float eta)
+{
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
+   vec2 retval;
+   if (k < 0.0)
+      retval = vec2(0.0);
+   else
+      retval = eta * I - (eta * n_dot_i + sqrt(k)) * N;
+   return retval;
 }
-vec3 faceforward (vec3 N, vec3 I, vec3 Nref) {
-    return dot (Nref, I) < 0.0 ? N : -N;
+
+vec3 refract(const vec3 I, const vec3 N, const float eta)
+{
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
+   vec3 retval;
+   if (k < 0.0)
+      retval = vec3(0.0);
+   else
+      retval = eta * I - (eta * n_dot_i + sqrt(k)) * N;
+   return retval;
 }
-vec4 faceforward (vec4 N, vec4 I, vec4 Nref) {
-    return dot (Nref, I) < 0.0 ? N : -N;
+
+vec4 refract(const vec4 I, const vec4 N, const float eta)
+{
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
+   vec4 retval;
+   if (k < 0.0)
+      retval = vec4(0.0);
+   else
+      retval = eta * I - (eta * n_dot_i + sqrt(k)) * N;
+   return retval;
 }
 
-// 
-// For the incident vector I and surface orientation N, returns the reflection direction:
-// result = I - 2 * dot (N, I) * N
-// N must already be normalized in order to achieve the desired result.
 
-float reflect (float I, float N) {
-    return I - 2.0 * dot (N, I) * N;
-}
-vec2 reflect (vec2 I, vec2 N) {
-    return I - 2.0 * dot (N, I) * N;
+
+
+//
+// 8.5 Matrix Functions
+//
+
+mat2 matrixCompMult (mat2 m, mat2 n) {
+    return mat2 (m[0] * n[0], m[1] * n[1]);
 }
-vec3 reflect (vec3 I, vec3 N) {
-    return I - 2.0 * dot (N, I) * N;
+
+mat3 matrixCompMult (mat3 m, mat3 n) {
+    return mat3 (m[0] * n[0], m[1] * n[1], m[2] * n[2]);
 }
-vec4 reflect (vec4 I, vec4 N) {
-    return I - 2.0 * dot (N, I) * N;
+
+mat4 matrixCompMult (mat4 m, mat4 n) {
+    return mat4 (m[0] * n[0], m[1] * n[1], m[2] * n[2], m[3] * n[3]);
 }
 
+
+
+
 //
-// For the incident vector I and surface normal N, and the ratio of inidices of refraction eta,
-// return the refraction vector. The returned result is computed by
-//
-// k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I))
-// if (k < 0.0)
-//   result = genType (0.0)
-// else
-//   result = eta * I - (eta * dot (N, I) + sqrt (k)) * N
-//
-// The input parameters for the incident vector I and the surface normal N must already be
-// normalized to get the desired results.
+// 8.6 Vector Relational Functions
 //
 
-float refract (float I, float N, float eta) {
-    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));
-    if (k < 0.0)
-        return 0.0;
-    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;
+//// lessThan
+
+bvec2 lessThan(const vec2 u, const vec2 v)
+{
+   __asm vec4_slt __retVal.xy, u, v;
+}
+
+bvec3 lessThan(const vec3 u, const vec3 v)
+{
+   __asm vec4_slt __retVal.xyz, u, v;
+}
+
+bvec4 lessThan(const vec4 u, const vec4 v)
+{
+   __asm vec4_slt __retVal, u, v;
 }
-vec2 refract (vec2 I, vec2 N, float eta) {
-    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));
-    if (k < 0.0)
-        return vec2 (0.0);
-    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;
+
+bvec2 lessThan(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_slt __retVal.xy, u, v;
 }
-vec3 refract (vec3 I, vec3 N, float eta) {
-    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));
-    if (k < 0.0)
-        return vec3 (0.0);
-    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;
+
+bvec3 lessThan(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_slt __retVal.xyz, u, v;
 }
-vec4 refract (vec4 I, vec4 N, float eta) {
-    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));
-    if (k < 0.0)
-        return vec4 (0.0);
-    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;
+
+bvec4 lessThan(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_slt __retVal, u, v;
 }
 
-// 
-// 8.5 Matrix Functions
-// 
-
-// 
-// Multiply matrix x by matrix y component-wise, i.e., result[i][j] is the scalar product
-// of x[i][j] and y[i][j].
-// Note: to get linear algebraic matrix multiplication, use the multiply operator (*).
-// 
-
-mat2 matrixCompMult (mat2 x, mat2 y) {
-    return mat2 (
-        x[0].x * y[0].x, x[0].y * y[0].y,
-        x[1].x * y[1].x, x[1].y * y[1].y
-    );
-}
-mat3 matrixCompMult (mat3 x, mat3 y) {
-    return mat4 (
-        x[0].x * y[0].x, x[0].y * y[0].y, x[0].z * y[0].z,
-        x[1].x * y[1].x, x[1].y * y[1].y, x[1].z * y[1].z,
-        x[2].x * y[2].x, x[2].y * y[2].y, x[2].z * y[2].z
-    );
-}
-mat4 matrixCompMult (mat4 x, mat4 y) {
-    return mat4 (
-        x[0].x * y[0].x, x[0].y * y[0].y, x[0].z * y[0].z + x[0].w * y[0].w,
-        x[1].x * y[1].x, x[1].y * y[1].y, x[1].z * y[1].z + x[1].w * y[1].w,
-        x[2].x * y[2].x, x[2].y * y[2].y, x[2].z * y[2].z + x[2].w * y[2].w,
-        x[3].x * y[3].x, x[3].y * y[3].y, x[3].z * y[3].z + x[3].w * y[3].w
-    );
-}
-
-// 
-// 8.6 Vector Relational Functions
-// 
-// Relational and equality operators (<, <=, >, >=, ==, !=) are defined (or reserved) to produce
-// scalar Boolean results.
-// 
 
-// 
-// Returns the component-wise compare of x < y.
-// 
+//// lessThanEqual
 
-bvec2 lessThan (vec2 x, vec2 y) {
-    return bvec2 (x.x < y.x, x.y < y.y);
+bvec2 lessThanEqual(const vec2 u, const vec2 v)
+{
+   __asm vec4_sle __retVal.xy, u, v;
 }
-bvec3 lessThan (vec3 x, vec3 y) {
-    return bvec3 (x.x < y.x, x.y < y.y, x.z < y.z);
+
+bvec3 lessThanEqual(const vec3 u, const vec3 v)
+{
+   __asm vec4_sle __retVal.xyz, u, v;
 }
-bvec4 lessThan (vec4 x, vec4 y) {
-    return bvec4 (x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);
+
+bvec4 lessThanEqual(const vec4 u, const vec4 v)
+{
+   __asm vec4_sle __retVal, u, v;
 }
-bvec2 lessThan (ivec2 x, ivec2 y) {
-    return bvec2 (x.x < y.x, x.y < y.y);
+
+bvec2 lessThanEqual(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_sle __retVal.xy, u, v;
 }
-bvec3 lessThan (ivec3 x, ivec3 y) {
-    return bvec3 (x.x < y.x, x.y < y.y, x.z < y.z);
+
+bvec3 lessThanEqual(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_sle __retVal.xyz, u, v;
 }
-bvec4 lessThan (ivec4 x, ivec4 y) {
-    return bvec4 (x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);
+
+bvec4 lessThanEqual(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_sle __retVal, u, v;
 }
 
-// 
-// Returns the component-wise compare of x <= y.
-// 
 
-bvec2 lessThanEqual (vec2 x, vec2 y) {
-    return bvec2 (x.x <= y.x, x.y <= y.y);
+//// greaterThan
+
+bvec2 greaterThan(const vec2 u, const vec2 v)
+{
+   __asm vec4_sgt __retVal.xy, u, v;
 }
-bvec3 lessThanEqual (vec3 x, vec3 y) {
-    return bvec3 (x.x <= y.x, x.y <= y.y, x.z <= y.z);
+
+bvec3 greaterThan(const vec3 u, const vec3 v)
+{
+   __asm vec4_sgt __retVal.xyz, u, v;
 }
-bvec4 lessThanEqual (vec4 x, vec4 y) {
-    return bvec4 (x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);
+
+bvec4 greaterThan(const vec4 u, const vec4 v)
+{
+   __asm vec4_sgt __retVal, u, v;
 }
-bvec2 lessThanEqual (ivec2 x, ivec2 y) {
-    return bvec2 (x.x <= y.x, x.y <= y.y);
+
+bvec2 greaterThan(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_sgt __retVal.xy, u.xy, v.xy;
 }
-bvec3 lessThanEqual (ivec3 x, ivec3 y) {
-    return bvec3 (x.x <= y.x, x.y <= y.y, x.z <= y.z);
+
+bvec3 greaterThan(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_sgt __retVal.xyz, u, v;
 }
-bvec4 lessThanEqual (ivec4 x, ivec4 y) {
-    return bvec4 (x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);
+
+bvec4 greaterThan(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_sgt __retVal, u, v;
 }
 
-// 
-// Returns the component-wise compare of x > y.
-// 
 
-bvec2 greaterThan (vec2 x, vec2 y) {
-    return bvec2 (x.x > y.x, x.y > y.y);
+//// greaterThanEqual
+
+bvec2 greaterThanEqual(const vec2 u, const vec2 v)
+{
+   __asm vec4_sge __retVal.xy, u, v;
 }
-bvec3 greaterThan (vec3 x, vec3 y) {
-    return bvec3 (x.x > y.x, x.y > y.y, x.z > y.z);
+
+bvec3 greaterThanEqual(const vec3 u, const vec3 v)
+{
+   __asm vec4_sge __retVal.xyz, u, v;
 }
-bvec4 greaterThan (vec4 x, vec4 y) {
-    return bvec4 (x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);
+
+bvec4 greaterThanEqual(const vec4 u, const vec4 v)
+{
+   __asm vec4_sge __retVal, u, v;
 }
-bvec2 greaterThan (ivec2 x, ivec2 y) {
-    return bvec2 (x.x > y.x, x.y > y.y);
+
+bvec2 greaterThanEqual(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_sge __retVal.xy, u, v;
 }
-bvec3 greaterThan (ivec3 x, ivec3 y) {
-    return bvec3 (x.x > y.x, x.y > y.y, x.z > y.z);
+
+bvec3 greaterThanEqual(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_sge __retVal.xyz, u, v;
 }
-bvec4 greaterThan (ivec4 x, ivec4 y) {
-    return bvec4 (x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);
+
+bvec4 greaterThanEqual(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_sge __retVal, u, v;
 }
 
-// 
-// Returns the component-wise compare of x >= y.
-// 
 
-bvec2 greaterThanEqual (vec2 x, vec2 y) {
-    return bvec2 (x.x >= y.x, x.y >= y.y);
+//// equal
+
+bvec2 equal(const vec2 u, const vec2 v)
+{
+   __asm vec4_seq __retVal.xy, u, v;
 }
-bvec3 greaterThanEqual (vec3 x, vec3 y) {
-    return bvec3 (x.x >= y.x, x.y >= y.y, x.z >= y.z);
+
+bvec3 equal(const vec3 u, const vec3 v)
+{
+   __asm vec4_seq __retVal.xyz, u, v;
 }
-bvec4 greaterThanEqual (vec4 x, vec4 y) {
-    return bvec4 (x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);
+
+bvec4 equal(const vec4 u, const vec4 v)
+{
+   __asm vec4_seq __retVal, u, v;
 }
-bvec2 greaterThanEqual (ivec2 x, ivec2 y) {
-    return bvec2 (x.x >= y.x, x.y >= y.y);
+
+bvec2 equal(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_seq __retVal.xy, u, v;
 }
-bvec3 greaterThanEqual (ivec3 x, ivec3 y) {
-    return bvec3 (x.x >= y.x, x.y >= y.y, x.z >= y.z);
+
+bvec3 equal(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_seq __retVal.xyz, u, v;
 }
-bvec4 greaterThanEqual (ivec4 x, ivec4 y) {
-    return bvec4 (x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);
+
+bvec4 equal(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_seq __retVal, u, v;
 }
 
-// 
-// Returns the component-wise compare of x == y.
-// 
+bvec2 equal(const bvec2 u, const bvec2 v)
+{
+   __asm vec4_seq __retVal.xy, u, v;
+}
 
-bvec2 equal (vec2 x, vec2 y) {
-    return bvec2 (x.x == y.x, x.y == y.y);
+bvec3 equal(const bvec3 u, const bvec3 v)
+{
+   __asm vec4_seq __retVal.xyz, u, v;
 }
-bvec3 equal (vec3 x, vec3 y) {
-    return bvec3 (x.x == y.x, x.y == y.y, x.z == y.z);
+
+bvec4 equal(const bvec4 u, const bvec4 v)
+{
+   __asm vec4_seq __retVal, u, v;
 }
-bvec4 equal (vec4 x, vec4 y) {
-    return bvec4 (x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);
+
+
+
+
+//// notEqual
+
+bvec2 notEqual(const vec2 u, const vec2 v)
+{
+   __asm vec4_sne __retVal.xy, u, v;
 }
-bvec2 equal (ivec2 x, ivec2 y) {
-    return bvec2 (x.x == y.x, x.y == y.y);
+
+bvec3 notEqual(const vec3 u, const vec3 v)
+{
+   __asm vec4_sne __retVal.xyz, u, v;
 }
-bvec3 equal (ivec3 x, ivec3 y) {
-    return bvec3 (x.x == y.x, x.y == y.y, x.z == y.z);
+
+bvec4 notEqual(const vec4 u, const vec4 v)
+{
+   __asm vec4_sne __retVal, u, v;
 }
-bvec4 equal (ivec4 x, ivec4 y) {
-    return bvec4 (x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);
+
+bvec2 notEqual(const ivec2 u, const ivec2 v)
+{
+   __asm vec4_sne __retVal.xy, u, v;
 }
 
-// 
-// Returns the component-wise compare of x != y.
-// 
+bvec3 notEqual(const ivec3 u, const ivec3 v)
+{
+   __asm vec4_sne __retVal.xyz, u, v;
+}
 
-bvec2 notEqual (vec2 x, vec2 y) {
-    return bvec2 (x.x != y.x, x.y != y.y);
+bvec4 notEqual(const ivec4 u, const ivec4 v)
+{
+   __asm vec4_sne __retVal, u, v;
 }
-bvec3 notEqual (vec3 x, vec3 y) {
-    return bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);
+
+bvec2 notEqual(const bvec2 u, const bvec2 v)
+{
+   __asm vec4_sne __retVal.xy, u, v;
 }
-bvec4 notEqual (vec4 x, vec4 y) {
-    return (bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
+
+bvec3 notEqual(const bvec3 u, const bvec3 v)
+{
+   __asm vec4_sne __retVal.xyz, u, v;
 }
-bvec2 notEqual (ivec2 x, ivec2 y) {
-    return (bvec2 (x.x != y.x, x.y != y.y);
+
+bvec4 notEqual(const bvec4 u, const bvec4 v)
+{
+   __asm vec4_sne __retVal, u, v;
 }
-bvec3 notEqual (ivec3 x, ivec3 y) {
-    return (bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);
+
+
+
+//// any
+
+bool any(const bvec2 v)
+{
+   float sum;
+   __asm vec4_add sum.x, v.x, v.y;
+   __asm vec4_sne __retVal.x, sum.x, 0.0;
+}
+
+bool any(const bvec3 v)
+{
+   float sum;
+   __asm vec4_add sum.x, v.x, v.y;
+   __asm vec4_add sum.x, sum.x, v.z;
+   __asm vec4_sne __retVal.x, sum.x, 0.0;
+}
+
+bool any(const bvec4 v)
+{
+   float sum;
+   __asm vec4_add sum.x, v.x, v.y;
+   __asm vec4_add sum.x, sum.x, v.z;
+   __asm vec4_add sum.x, sum.x, v.w;
+   __asm vec4_sne __retVal.x, sum.x, 0.0;
+}
+
+
+//// all
+
+bool all (const bvec2 v)
+{
+   float prod;
+   __asm vec4_multiply prod, v.x, v.y;
+   __asm vec4_sne __retVal, prod, 0.0;
+}
+
+bool all (const bvec3 v)
+{
+   float prod;
+   __asm vec4_multiply prod, v.x, v.y;
+   __asm vec4_multiply prod, prod, v.z;
+   __asm vec4_sne __retVal, prod, 0.0;
+}
+
+bool all (const bvec4 v)
+{
+   float prod;
+   __asm vec4_multiply prod, v.x, v.y;
+   __asm vec4_multiply prod, prod, v.z;
+   __asm vec4_multiply prod, prod, v.w;
+   __asm vec4_sne __retVal, prod, 0.0;
+}
+
+
+
+//// not
+
+bvec2 not (const bvec2 v)
+{
+   __asm vec4_seq __retVal.xy, v, 0.0;
+}
+
+bvec3 not (const bvec3 v)
+{
+   __asm vec4_seq __retVal.xyz, v, 0.0;
 }
-bvec4 notEqual (ivec4 x, ivec4 y) {
-    return (bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
+
+bvec4 not (const bvec4 v)
+{
+   __asm vec4_seq __retVal, v, 0.0;
 }
 
-// 
-// Returns true if any component of x is true.
-// 
 
-bool any (bvec2 x) {
-    return x.x || x.y;
+
+//// Texture Lookup Functions  (for both fragment and vertex shaders)
+
+vec4 texture1D(const sampler1D sampler, const float coord)
+{
+   __asm vec4_tex1d __retVal, sampler, coord;
 }
-bool any (bvec3 x) {
-    return x.x || x.y || x.z;
+
+vec4 texture1DProj(const sampler1D sampler, const vec2 coord)
+{
+   // need to swizzle .y into .w
+   __asm vec4_texp1d __retVal, sampler, coord.xyyy;
+}
+
+vec4 texture1DProj(const sampler1D sampler, const vec4 coord)
+{
+   __asm vec4_texp1d __retVal, sampler, coord;
+}
+
+
+vec4 texture2D(const sampler2D sampler, const vec2 coord)
+{
+   __asm vec4_tex2d __retVal, sampler, coord;
+}
+
+vec4 texture2DProj(const sampler2D sampler, const vec3 coord)
+{
+   // need to swizzle 'z' into 'w'.
+   __asm vec4_texp2d __retVal, sampler, coord.xyzz;
 }
-bool any (bvec4 x) {
-    return x.x || x.y || x.z || x.w;
+
+vec4 texture2DProj(const sampler2D sampler, const vec4 coord)
+{
+   __asm vec4_texp2d __retVal, sampler, coord;
 }
 
-// 
-// Returns true only if all components of x are true.
-// 
 
-bool all (bvec2 x) {
-    return x.x && x.y;
+vec4 texture3D(const sampler3D sampler, const vec3 coord)
+{
+   __asm vec4_tex3d __retVal, sampler, coord;
 }
-bool all (bvec3 x) {
-    return x.x && x.y && x.z;
+
+vec4 texture3DProj(const sampler3D sampler, const vec4 coord)
+{
+   __asm vec4_texp3d __retVal, sampler, coord;
 }
-bool all (bvec4 x) {
-    return x.x && x.y && x.z && x.w;
+
+
+vec4 textureCube(const samplerCube sampler, const vec3 coord)
+{
+   __asm vec4_texcube __retVal, sampler, coord;
 }
 
-// 
-// Returns the component-wise logical complement of x.
-// 
 
-bvec2 not (bvec2 x) {
-    return bvec2 (!x.x, !x.y);
+
+vec4 shadow1D(const sampler1DShadow sampler, const vec3 coord)
+{
+   __asm vec4_tex1d __retVal, sampler, coord;
 }
-bvec3 not (bvec3 x) {
-    return bvec3 (!x.x, !x.y, !x.z);
+
+vec4 shadow1DProj(const sampler1DShadow sampler, const vec4 coord)
+{
+   // .s and .p will be divided by .q
+   __asm vec4_texp1d __retVal, sampler, coord;
 }
-bvec4 not (bvec4 x) {
-    return bvec4 (!x.x, !x.y, !x.z, !x.w);
+
+vec4 shadow2D(const sampler2DShadow sampler, const vec3 coord)
+{
+   __asm vec4_tex2d __retVal, sampler, coord;
+}
+
+vec4 shadow2DProj(const sampler2DShadow sampler, const vec4 coord)
+{
+   // .s, .t and .p will be divided by .q
+   __asm vec4_texp2d __retVal, sampler, coord;
 }
 
-// 
-// 8.7 Texture Lookup Functions
-// 
-// Texture lookup functions are available to both vertex and fragment shaders. However, level
-// of detail is not computed by fixed functionality for vertex shaders, so there are some
-// differences in operation between vertex and fragment texture lookups. The functions in the table
-// below provide access to textures through samplers, as set up through the OpenGL API. Texture
-// properties such as size, pixel format, number of dimensions, filtering method, number of mip-map
-// levels, depth comparison, and so on are also defined by OpenGL API calls. Such properties are
-// taken into account as the texture is accessed via the built-in functions defined below.
-// 
-// If a non-shadow texture call is made to a sampler that represents a depth texture with depth
-// comparisons turned on, then results are undefined. If a shadow texture call is made to a sampler
-// that represents a depth texture with depth comparisions turned off, the results are undefined.
-// If a shadow texture call is made to a sampler that does not represent a depth texture, then
-// results are undefined.
-// 
-// In all functions below, the bias parameter is optional for fragment shaders. The bias parameter
-// is not accepted in a vertex shader. For a fragment shader, if bias is present, it is added to
-// the calculated level of detail prior to performing the texture access operation. If the bias
-// parameter is not provided, then the implementation automatically selects level of detail:
-// For a texture that is not mip-mapped, the texture is used directly. If it is mip-mapped and
-// running in a fragment shader, the LOD computed by the implementation is used to do the texture
-// lookup. If it is mip-mapped and running on the vertex shader, then the base texture is used.
-// 
-// The built-ins suffixed with \93Lod\94 are allowed only in a vertex shader. For the \93Lod\94 functions,
-// lod is directly used as the level of detail.
-// 
 
-// 
-// Use the texture coordinate coord to do a texture lookup in the 1D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate coord.s is divided by
-// the last component of coord.
-// 
-// XXX
-vec4 texture1D (sampler1D sampler, float coord) {
-    return vec4 (0.0);
+//// GL_ARB_texture_rectangle:
+vec4 texture2DRect(const sampler2DRect sampler, const vec2 coord)
+{
+   __asm vec4_tex_rect __retVal, sampler, coord;
+}
+
+vec4 texture2DRectProj(const sampler2DRect sampler, const vec3 coord)
+{
+   // need to swizzle .y into .w
+   __asm vec4_texp_rect __retVal, sampler, coord.xyzz;
 }
-vec4 texture1DProj (sampler1D sampler, vec2 coord) {
-    return texture1D (sampler, coord.s / coord.t);
-}
-vec4 texture1DProj (sampler1D sampler, vec4 coord) {
-    return texture1D (sampler, coord.s / coord.q);
-}
-
-// 
-// Use the texture coordinate coord to do a texture lookup in the 2D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate (coord.s, coord.t) is
-// divided by the last component of coord. The third component of coord is ignored for the vec4
-// coord variant.
-// 
-// XXX
-vec4 texture2D (sampler2D sampler, vec2 coord) {
-    return vec4 (0.0);
-}
-vec4 texture2DProj (sampler2D sampler, vec3 coord) {
-    return texture2D (sampler, vec2 (coord.s / coord.p, coord.t / coord.p));
-}
-vec4 texture2DProj (sampler2D sampler, vec4 coord) {
-    return texture2D (sampler, vec2 (coord.s / coord.q, coord.t / coord.q));
-}
-
-// 
-// Use the texture coordinate coord to do a texture lookup in the 3D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate is divided by coord.q.
-// 
-// XXX
-vec4 texture3D (sampler3D sampler, vec3 coord) {
-    return vec4 (0.0);
-}
-vec4 texture3DProj (sampler3D sampler, vec4 coord) {
-    return texture3D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q));
-}
-
-// 
-// Use the texture coordinate coord to do a texture lookup in the cube map texture currently bound
-// to sampler. The direction of coord is used to select which face to do a 2-dimensional texture
-// lookup in, as described in section 3.8.6 in version 1.4 of the OpenGL specification.
-// 
-// XXX
-vec4 textureCube (samplerCube sampler, vec3 coord) {
-    return vec4 (0.0);
-}
-
-// 
-// Use texture coordinate coord to do a depth comparison lookup on the depth texture bound
-// to sampler, as described in section 3.8.14 of version 1.4 of the OpenGL specification. The 3rd
-// component of coord (coord.p) is used as the R value. The texture bound to sampler must be a
-// depth texture, or results are undefined. For the projective (\93Proj\94) version of each built-in,
-// the texture coordinate is divide by coord.q, giving a depth value R of coord.p/coord.q. The
-// second component of coord is ignored for the \931D\94 variants.
-// 
-// XXX
-vec4 shadow1D (sampler1DShadow sampler, vec3 coord) {
-    return vec4 (0.0);
-}
-// XXX
-vec4 shadow2D (sampler2DShadow sampler, vec3 coord) {
-    return vec4 (0.0);
-}
-vec4 shadow1DProj (sampler1DShadow sampler, vec4 coord) {
-    return shadow1D (sampler, vec3 (coord.s / coord.q, 0.0, coord.p / coord.q));
-}
-vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord) {
-    return shadow2D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q));
-}
-
-// 
+
+vec4 texture2DRectProj(const sampler2DRect sampler, const vec4 coord)
+{
+   __asm vec4_texp_rect __retVal, sampler, ccoord;
+}
+
+vec4 shadow2DRect(const sampler2DRectShadow sampler, const vec3 coord)
+{
+   __asm vec4_tex_rect __retVal, sampler, coord;
+}
+
+vec4 shadow2DRectProj(const sampler2DRectShadow sampler, const vec4 coord)
+{
+   __asm vec4_texp_rect __retVal, sampler, coord;
+}
+
+
+
+//
 // 8.9 Noise Functions
-// 
-// Noise functions are available to both fragment and vertex shaders. They are stochastic functions
-// that can be used to increase visual complexity. Values returned by the following noise functions
-// give the appearance of randomness, but are not truly random. The noise functions below are
-// defined to have the following characteristics:
-// 
-// - The return value(s) are always in the range [-1,1], and cover at least the range [-0.6, 0.6],
-//   with a gaussian-like distribution.
-// \95 The return value(s) have an overall average of 0.0
-// \95 They are repeatable, in that a particular input value will always produce the same return value
-// \95 They are statistically invariant under rotation (i.e., no matter how the domain is rotated, it
-//   has the same statistical character)
-// \95 They have a statistical invariance under translation (i.e., no matter how the domain is
-//   translated, it has the same statistical character)
-// \95 They typically give different results under translation.
-// - The spatial frequency is narrowly concentrated, centered somewhere between 0.5 to 1.0.
-// 
-
-// 
-// Returns a 1D noise value based on the input value x.
-// 
-// XXX
-float noise1 (float x) {
-    return 0.0;
-}
-// XXX
-float noise1 (vec2 x) {
-    return 0.0;
-}
-// XXX
-float noise1 (vec3 x) {
-    return 0.0;
-}
-// XXX
-float noise1 (vec4 x) {
-    return 0.0;
-}
-
-// 
-// Returns a 2D noise value based on the input value x.
-// 
-// XXX
-vec2 noise2 (float x) {
-    return vec2 (0.0);
-}
-// XXX
-vec2 noise2 (vec2 x) {
-    return vec2 (0.0);
-}
-// XXX
-vec2 noise2 (vec3 x) {
-    return vec2 (0.0);
-}
-// XXX
-vec2 noise2 (vec4 x) {
-    return vec2 (0.0);
-}
-
-// 
-// Returns a 3D noise value based on the input value x.
-// 
-// XXX
-vec3 noise3 (float x) {
-    return vec3 (0.0);
-}
-// XXX
-vec3 noise3 (vec2 x) {
-    return vec3 (0.0);
-}
-// XXX
-vec3 noise3 (vec3 x) {
-    return vec3 (0.0);
-}
-// XXX
-vec3 noise3 (vec4 x) {
-    return vec3 (0.0);
-}
-
-// 
-// Returns a 4D noise value based on the input value x.
-// 
-// XXX
-vec4 noise4 (float x) {
-    return vec4 (0.0);
-}
-// XXX
-vec4 noise4 (vec2 x) {
-    return vec4 (0.0);
-}
-// XXX
-vec4 noise4 (vec3 x) {
-    return vec4 (0.0);
-}
-// XXX
-vec4 noise4 (vec4 x) {
-    return vec4 (0.0);
+//
+// AUTHOR: Stefan Gustavson (stegu@itn.liu.se), Nov 26, 2005
+//
+
+float noise1(const float x)
+{
+   __asm float_noise1 __retVal, x;
+}
+
+
+float noise1(const vec2 x)
+{
+    __asm float_noise2 __retVal, x;
+}
+
+float noise1(const vec3 x)
+{
+    __asm float_noise3 __retVal, x;
+}
+
+float noise1(const vec4 x)
+{
+    __asm float_noise4 __retVal, x;
+}
+
+vec2 noise2(const float x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + 19.34);
 }
 
+vec2 noise2(const vec2 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec2(19.34, 7.66));
+}
+
+vec2 noise2(const vec3 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec3(19.34, 7.66, 3.23));
+}
+
+vec2 noise2(const vec4 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec4(19.34, 7.66, 3.23, 2.77));
+}
+
+vec3 noise3(const float x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + 19.34);
+   __retVal.z = noise1(x + 5.47);
+}
+
+vec3 noise3(const vec2 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec2(19.34, 7.66));
+   __retVal.z = noise1(x + vec2(5.47, 17.85));
+}
+
+vec3 noise3(const vec3 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec3(19.34, 7.66, 3.23));
+   __retVal.z = noise1(x + vec3(5.47, 17.85, 11.04));
+}
+
+vec3 noise3(const vec4 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec4(19.34, 7.66, 3.23, 2.77));
+   __retVal.z = noise1(x + vec4(5.47, 17.85, 11.04, 13.19));
+}
+
+vec4 noise4(const float x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + 19.34);
+   __retVal.z = noise1(x + 5.47);
+   __retVal.w = noise1(x + 23.54);
+}
+
+vec4 noise4(const vec2 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec2 (19.34, 7.66));
+   __retVal.z = noise1(x + vec2 (5.47, 17.85));
+   __retVal.w = noise1(x + vec2 (23.54, 29.11));
+}
+
+vec4 noise4(const vec3 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec3(19.34, 7.66, 3.23));
+   __retVal.z = noise1(x + vec3(5.47, 17.85, 11.04));
+   __retVal.w = noise1(x + vec3(23.54, 29.11, 31.91));
+}
+
+vec4 noise4(const vec4 x)
+{
+   __retVal.x = noise1(x);
+   __retVal.y = noise1(x + vec4(19.34, 7.66, 3.23, 2.77));
+   __retVal.z = noise1(x + vec4(5.47, 17.85, 11.04, 13.19));
+   __retVal.w = noise1(x + vec4(23.54, 29.11, 31.91, 37.48));
+}