diff --git a/Install/Windows/glslangValidator.exe b/Install/Windows/glslangValidator.exe
index 905b9decd8a43a0cb9091e3e4289ad600aee00c2..a3ca0d0a727cae116bbac7ed02310cb239766c9b 100644
Binary files a/Install/Windows/glslangValidator.exe and b/Install/Windows/glslangValidator.exe differ
diff --git a/Test/120.frag b/Test/120.frag
index ac70c20a6ae8d009d87c25453c8df3eb2789dd93..f50826d064f671d42f7546a64526e0c1a91ca8d2 100644
--- a/Test/120.frag
+++ b/Test/120.frag
@@ -123,3 +123,32 @@ void atest()
 
 varying vec4 gl_TexCoord[6];  // okay, assigning a size
 varying vec4 gl_TexCoord[5];  // ERROR, changing size
+
+mat2x2 m22;
+mat2x3 m23;
+mat2x4 m24;
+
+mat3x2 m32;
+mat3x3 m33;
+mat3x4 m34;
+
+mat4x2 m42;
+mat4x3 m43;
+mat4x4 m44;
+
+void foo123()
+{
+    mat2 r2 = matrixCompMult(m22, m22);
+    mat3 r3 = matrixCompMult(m33, m33);
+    mat4 r4 = matrixCompMult(m44, m44);
+
+    mat2x3 r23 = matrixCompMult(m23, m23);
+    mat2x4 r24 = matrixCompMult(m24, m24);
+    mat3x2 r32 = matrixCompMult(m32, m32);
+    mat3x4 r34 = matrixCompMult(m34, m34);
+    mat4x2 r42 = matrixCompMult(m42, m42);
+    mat4x3 r43 = matrixCompMult(m43, m43);
+
+    mat3x2 rfoo1 = matrixCompMult(m23, m32);  // ERROR
+    mat3x4 rfoo2 = matrixCompMult(m34, m44);  // ERROR    
+}
diff --git a/Test/baseResults/100.frag.out b/Test/baseResults/100.frag.out
index fa77261866b8c7964f655ac45a98f319e31ff16c..d36e51d12bfc34b981bfec5b9e0ac9d3b1cdaf9e 100644
--- a/Test/baseResults/100.frag.out
+++ b/Test/baseResults/100.frag.out
@@ -58,11 +58,12 @@ ERROR: 0:135: 'texture2DProjLod' : no matching overloaded function found
 ERROR: 0:137: 'bitwise not' : not supported for this version or the enabled extensions 
 ERROR: 0:138: 'bitwise inclusive or' : not supported for this version or the enabled extensions 
 ERROR: 0:139: 'bitwise and' : not supported for this version or the enabled extensions 
-ERROR: 0:144: 'a' : redefinition 
-ERROR: 0:149: 'floating-point suffix' : not supported for this version or the enabled extensions 
-ERROR: 0:150: 'floating-point suffix' : not supported for this version or the enabled extensions 
-ERROR: 0:152: '' :  syntax error
-ERROR: 56 compilation errors.  No code generated.
+ERROR: 0:145: 'a' : redefinition 
+ERROR: 0:147: 'texture2DProjGradEXT' : required extension not requested: GL_EXT_shader_texture_lod
+ERROR: 0:151: 'floating-point suffix' : not supported for this version or the enabled extensions 
+ERROR: 0:152: 'floating-point suffix' : not supported for this version or the enabled extensions 
+ERROR: 0:166: '' :  syntax error
+ERROR: 57 compilation errors.  No code generated.
 
 
 ERROR: node is still EOpNull!
@@ -243,23 +244,55 @@ ERROR: node is still EOpNull!
 0:139      bitwise and (mediump int)
 0:139        'a' (mediump int)
 0:139        'a' (mediump int)
-0:144  Function Definition: foo203940(i1;f1;f1; (mediump int)
-0:144    Function Parameters: 
-0:144      'a' (in mediump int)
-0:144      'b' (in mediump float)
-0:146    Sequence
-0:146      Branch: Return with expression
-0:146        'a' (in mediump int)
-0:149  Sequence
-0:149    move second child to first child (mediump float)
-0:149      'f123' (mediump float)
-0:149      Constant:
-0:149        4.000000
-0:150  Sequence
-0:150    move second child to first child (mediump float)
-0:150      'f124' (mediump float)
-0:150      Constant:
-0:150        50000000000.000000
+0:145  Function Definition: foo203940(i1;f1;f1; (mediump int)
+0:145    Function Parameters: 
+0:145      'a' (in mediump int)
+0:145      'b' (in mediump float)
+0:147    Sequence
+0:147      Function Call: texture2DProjGradEXT(s21;vf3;vf2;vf2; (lowp 4-component vector of float)
+0:147        's2Dg' (uniform lowp sampler2D)
+0:147        Construct vec3 (3-component vector of float)
+0:147          'f13' (invariant mediump float)
+0:147        'uv2' (invariant uniform mediump 2-component vector of float)
+0:147        'uv2' (invariant uniform mediump 2-component vector of float)
+0:148      Branch: Return with expression
+0:148        'a' (in mediump int)
+0:151  Sequence
+0:151    move second child to first child (mediump float)
+0:151      'f123' (mediump float)
+0:151      Constant:
+0:151        4.000000
+0:152  Sequence
+0:152    move second child to first child (mediump float)
+0:152      'f124' (mediump float)
+0:152      Constant:
+0:152        50000000000.000000
+0:158  Function Definition: foo323433( (void)
+0:158    Function Parameters: 
+0:160    Sequence
+0:160      Function Call: texture2DLodEXT(s21;vf2;f1; (lowp 4-component vector of float)
+0:160        's2Dg' (uniform lowp sampler2D)
+0:160        'uv2' (invariant uniform mediump 2-component vector of float)
+0:160        'f13' (invariant mediump float)
+0:161      Function Call: texture2DProjGradEXT(s21;vf3;vf2;vf2; (lowp 4-component vector of float)
+0:161        's2Dg' (uniform lowp sampler2D)
+0:161        Construct vec3 (3-component vector of float)
+0:161          'f13' (invariant mediump float)
+0:161        'uv2' (invariant uniform mediump 2-component vector of float)
+0:161        'uv2' (invariant uniform mediump 2-component vector of float)
+0:162      Function Call: texture2DGradEXT(s21;vf2;vf2;vf2; (lowp 4-component vector of float)
+0:162        's2Dg' (uniform lowp sampler2D)
+0:162        'uv2' (invariant uniform mediump 2-component vector of float)
+0:162        'uv2' (invariant uniform mediump 2-component vector of float)
+0:162        'uv2' (invariant uniform mediump 2-component vector of float)
+0:163      Function Call: textureCubeGradEXT(sC1;vf3;vf3;vf3; (lowp 4-component vector of float)
+0:163        'sCube' (uniform lowp samplerCube)
+0:163        Construct vec3 (3-component vector of float)
+0:163          'f13' (invariant mediump float)
+0:163        Construct vec3 (3-component vector of float)
+0:163          'f13' (invariant mediump float)
+0:163        Construct vec3 (3-component vector of float)
+0:163          'f13' (invariant mediump float)
 0:?   Linker Objects
 0:?     'a' (3-element array of mediump int)
 0:?     'uint' (mediump int)
@@ -279,8 +312,10 @@ ERROR: node is still EOpNull!
 0:?     'sExt' (uniform lowp samplerExternalOES)
 0:?     'mediumExt' (uniform mediump samplerExternalOES)
 0:?     'highExt' (uniform highp samplerExternalOES)
+0:?     's2Dg' (uniform lowp sampler2D)
 0:?     'f123' (mediump float)
 0:?     'f124' (mediump float)
+0:?     'sCube' (uniform lowp samplerCube)
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/120.frag.out b/Test/baseResults/120.frag.out
index 10c7036380f243c6c458a3bcba4eebfc770d66bf..6d55029a3bb801efbf9b407758b17d11215bd99f 100644
--- a/Test/baseResults/120.frag.out
+++ b/Test/baseResults/120.frag.out
@@ -30,7 +30,11 @@ ERROR: 0:97: 'out' : overloaded functions must have the same parameter qualifier
 ERROR: 0:99: 'return' : function return is not matching type: 
 ERROR: 0:115: 'return' : void function cannot return a value 
 ERROR: 0:125: 'gl_TexCoord' : redeclaration of array with size 
-ERROR: 31 compilation errors.  No code generated.
+ERROR: 0:152: 'matrixCompMult' : no matching overloaded function found 
+ERROR: 0:152: '=' :  cannot convert from 'const float' to '3X2 matrix of float'
+ERROR: 0:153: 'matrixCompMult' : no matching overloaded function found 
+ERROR: 0:153: '=' :  cannot convert from 'const float' to '3X4 matrix of float'
+ERROR: 35 compilation errors.  No code generated.
 
 
 ERROR: node is still EOpNull!
@@ -304,6 +308,63 @@ ERROR: node is still EOpNull!
 0:121          'gl_TexCoord' (smooth in 6-element array of 4-component vector of float)
 0:121          Constant:
 0:121            3 (const int)
+0:139  Function Definition: foo123( (void)
+0:139    Function Parameters: 
+0:141    Sequence
+0:141      Sequence
+0:141        move second child to first child (2X2 matrix of float)
+0:141          'r2' (2X2 matrix of float)
+0:141          component-wise multiply (2X2 matrix of float)
+0:141            'm22' (2X2 matrix of float)
+0:141            'm22' (2X2 matrix of float)
+0:142      Sequence
+0:142        move second child to first child (3X3 matrix of float)
+0:142          'r3' (3X3 matrix of float)
+0:142          component-wise multiply (3X3 matrix of float)
+0:142            'm33' (3X3 matrix of float)
+0:142            'm33' (3X3 matrix of float)
+0:143      Sequence
+0:143        move second child to first child (4X4 matrix of float)
+0:143          'r4' (4X4 matrix of float)
+0:143          component-wise multiply (4X4 matrix of float)
+0:143            'm44' (4X4 matrix of float)
+0:143            'm44' (4X4 matrix of float)
+0:145      Sequence
+0:145        move second child to first child (2X3 matrix of float)
+0:145          'r23' (2X3 matrix of float)
+0:145          component-wise multiply (2X3 matrix of float)
+0:145            'm23' (2X3 matrix of float)
+0:145            'm23' (2X3 matrix of float)
+0:146      Sequence
+0:146        move second child to first child (2X4 matrix of float)
+0:146          'r24' (2X4 matrix of float)
+0:146          component-wise multiply (2X4 matrix of float)
+0:146            'm24' (2X4 matrix of float)
+0:146            'm24' (2X4 matrix of float)
+0:147      Sequence
+0:147        move second child to first child (3X2 matrix of float)
+0:147          'r32' (3X2 matrix of float)
+0:147          component-wise multiply (3X2 matrix of float)
+0:147            'm32' (3X2 matrix of float)
+0:147            'm32' (3X2 matrix of float)
+0:148      Sequence
+0:148        move second child to first child (3X4 matrix of float)
+0:148          'r34' (3X4 matrix of float)
+0:148          component-wise multiply (3X4 matrix of float)
+0:148            'm34' (3X4 matrix of float)
+0:148            'm34' (3X4 matrix of float)
+0:149      Sequence
+0:149        move second child to first child (4X2 matrix of float)
+0:149          'r42' (4X2 matrix of float)
+0:149          component-wise multiply (4X2 matrix of float)
+0:149            'm42' (4X2 matrix of float)
+0:149            'm42' (4X2 matrix of float)
+0:150      Sequence
+0:150        move second child to first child (4X3 matrix of float)
+0:150          'r43' (4X3 matrix of float)
+0:150          component-wise multiply (4X3 matrix of float)
+0:150            'm43' (4X3 matrix of float)
+0:150            'm43' (4X3 matrix of float)
 0:?   Linker Objects
 0:?     'lowp' (float)
 0:?     'mediump' (float)
@@ -318,6 +379,15 @@ ERROR: node is still EOpNull!
 0:?     'uimage2DRect' (float)
 0:?     'a' (int)
 0:?     'gl_TexCoord' (smooth in 6-element array of 4-component vector of float)
+0:?     'm22' (2X2 matrix of float)
+0:?     'm23' (2X3 matrix of float)
+0:?     'm24' (2X4 matrix of float)
+0:?     'm32' (3X2 matrix of float)
+0:?     'm33' (3X3 matrix of float)
+0:?     'm34' (3X4 matrix of float)
+0:?     'm42' (4X2 matrix of float)
+0:?     'm43' (4X3 matrix of float)
+0:?     'm44' (4X4 matrix of float)
 
 
 Linked fragment stage:
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index d3182397011e52241e22ef1f94257f63f9d74611..d825e9f4af3c12baa98391507cdf573e44687dbe 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -527,6 +527,13 @@ void TBuiltIns::initialize(int version, EProfile profile)
             "mat4x2 transpose(mat2x4 m);"
             "mat3x4 transpose(mat4x3 m);"
             "mat4x3 transpose(mat3x4 m);"
+
+            "mat2x3 matrixCompMult(mat2x3, mat2x3);"
+            "mat2x4 matrixCompMult(mat2x4, mat2x4);"
+            "mat3x2 matrixCompMult(mat3x2, mat3x2);"
+            "mat3x4 matrixCompMult(mat3x4, mat3x4);"
+            "mat4x2 matrixCompMult(mat4x2, mat4x2);"
+            "mat4x3 matrixCompMult(mat4x3, mat4x3);"          
             
             "\n");