Front-end: Implement 2nd task of issue #400; precision of result and operation.

From the ES spec + Bugzilla 15931 and GL_KHR_vulkan_glsl:
- Update precision qualifiers for all built-in function prototypes.
- Implement the new algorithm used to distinguish built-in function
  operation precisions from result precisions.
Also add tracking of separate result and operation precisions, and
use that in generating SPIR-V.
(SPIR-V cares about precision of operation, while the front-end
cares about precision of result, for propagation.)
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index 678c3e1..84a50e8 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -125,12 +125,12 @@
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
-0:19      uMulExtended (global void)
+0:19      uMulExtended (global highp void)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
-0:21      iMulExtended (global void)
+0:21      iMulExtended (global highp void)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
@@ -179,27 +179,27 @@
 0:31          'u4' (temp highp 4-component vector of uint)
 0:32      move second child to first child (temp highp int)
 0:32        'i1' (temp highp int)
-0:32        bitCount (global highp int)
+0:32        bitCount (global lowp int, operation at highp)
 0:32          'i1' (temp highp int)
 0:33      move second child to first child (temp highp 3-component vector of int)
 0:33        'i3' (temp highp 3-component vector of int)
-0:33        bitCount (global highp 3-component vector of int)
+0:33        bitCount (global lowp 3-component vector of int, operation at highp)
 0:33          'u3' (temp highp 3-component vector of uint)
 0:34      move second child to first child (temp highp 2-component vector of int)
 0:34        'i2' (temp highp 2-component vector of int)
-0:34        findLSB (global highp 2-component vector of int)
+0:34        findLSB (global lowp 2-component vector of int, operation at highp)
 0:34          'i2' (temp highp 2-component vector of int)
 0:35      move second child to first child (temp highp 4-component vector of int)
 0:35        'i4' (temp highp 4-component vector of int)
-0:35        findLSB (global highp 4-component vector of int)
+0:35        findLSB (global lowp 4-component vector of int, operation at highp)
 0:35          'u4' (temp highp 4-component vector of uint)
 0:36      move second child to first child (temp highp int)
 0:36        'i1' (temp highp int)
-0:36        findMSB (global highp int)
+0:36        findMSB (global lowp int, operation at highp)
 0:36          'i1' (temp highp int)
 0:37      move second child to first child (temp highp 2-component vector of int)
 0:37        'i2' (temp highp 2-component vector of int)
-0:37        findMSB (global highp 2-component vector of int)
+0:37        findMSB (global lowp 2-component vector of int, operation at highp)
 0:37          'u2' (temp highp 2-component vector of uint)
 0:40      move second child to first child (temp highp 3-component vector of float)
 0:40        'v3' (temp highp 3-component vector of float)
@@ -213,19 +213,19 @@
 0:42          'i2' (temp highp 2-component vector of int)
 0:45      move second child to first child (temp highp uint)
 0:45        'u1' (temp highp uint)
-0:45        PackUnorm4x8 (global highp uint)
+0:45        PackUnorm4x8 (global highp uint, operation at mediump)
 0:45          'v4' (temp mediump 4-component vector of float)
 0:46      move second child to first child (temp highp uint)
 0:46        'u1' (temp highp uint)
-0:46        PackSnorm4x8 (global highp uint)
+0:46        PackSnorm4x8 (global highp uint, operation at mediump)
 0:46          'v4' (temp mediump 4-component vector of float)
-0:47      move second child to first child (temp highp 4-component vector of float)
+0:47      move second child to first child (temp mediump 4-component vector of float)
 0:47        'v4' (temp mediump 4-component vector of float)
-0:47        UnpackUnorm4x8 (global highp 4-component vector of float)
+0:47        UnpackUnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:47          'u1' (temp highp uint)
-0:48      move second child to first child (temp highp 4-component vector of float)
+0:48      move second child to first child (temp mediump 4-component vector of float)
 0:48        'v4' (temp mediump 4-component vector of float)
-0:48        UnpackSnorm4x8 (global highp 4-component vector of float)
+0:48        UnpackSnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:48          'u1' (temp highp uint)
 0:60  Function Definition: foo( (global void)
 0:60    Function Parameters: 
@@ -340,7 +340,7 @@
 0:165          0.100000
 0:165        Convert float to int (temp lowp 2-component vector of int)
 0:165          'inf' (in highp 2-component vector of float)
-0:166      textureGatherOffsets (global lowp 4-component vector of float)
+0:166      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:166        direct index (temp lowp sampler2D)
 0:166          'sArray' (uniform 4-element array of lowp sampler2D)
 0:166          Constant:
@@ -404,7 +404,7 @@
 0:180          0.100000
 0:180        Convert float to int (temp lowp 2-component vector of int)
 0:180          'inf' (in highp 2-component vector of float)
-0:181      textureGatherOffsets (global lowp 4-component vector of float)
+0:181      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:181        direct index (temp lowp sampler2D)
 0:181          'sArray' (uniform 4-element array of lowp sampler2D)
 0:181          Constant:
@@ -421,7 +421,7 @@
 0:181          0 (const int)
 0:181          0 (const int)
 0:181          0 (const int)
-0:182      textureGatherOffsets (global lowp 4-component vector of float)
+0:182      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:182        direct index (temp lowp sampler2D)
 0:182          'sArray' (uniform 4-element array of lowp sampler2D)
 0:182          Constant:
@@ -1056,12 +1056,12 @@
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
 0:17          'u1' (temp highp uint)
-0:19      uMulExtended (global void)
+0:19      uMulExtended (global highp void)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
 0:19        'u4' (temp highp 4-component vector of uint)
-0:21      iMulExtended (global void)
+0:21      iMulExtended (global highp void)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
 0:21        'i4' (temp highp 4-component vector of int)
@@ -1110,27 +1110,27 @@
 0:31          'u4' (temp highp 4-component vector of uint)
 0:32      move second child to first child (temp highp int)
 0:32        'i1' (temp highp int)
-0:32        bitCount (global highp int)
+0:32        bitCount (global lowp int, operation at highp)
 0:32          'i1' (temp highp int)
 0:33      move second child to first child (temp highp 3-component vector of int)
 0:33        'i3' (temp highp 3-component vector of int)
-0:33        bitCount (global highp 3-component vector of int)
+0:33        bitCount (global lowp 3-component vector of int, operation at highp)
 0:33          'u3' (temp highp 3-component vector of uint)
 0:34      move second child to first child (temp highp 2-component vector of int)
 0:34        'i2' (temp highp 2-component vector of int)
-0:34        findLSB (global highp 2-component vector of int)
+0:34        findLSB (global lowp 2-component vector of int, operation at highp)
 0:34          'i2' (temp highp 2-component vector of int)
 0:35      move second child to first child (temp highp 4-component vector of int)
 0:35        'i4' (temp highp 4-component vector of int)
-0:35        findLSB (global highp 4-component vector of int)
+0:35        findLSB (global lowp 4-component vector of int, operation at highp)
 0:35          'u4' (temp highp 4-component vector of uint)
 0:36      move second child to first child (temp highp int)
 0:36        'i1' (temp highp int)
-0:36        findMSB (global highp int)
+0:36        findMSB (global lowp int, operation at highp)
 0:36          'i1' (temp highp int)
 0:37      move second child to first child (temp highp 2-component vector of int)
 0:37        'i2' (temp highp 2-component vector of int)
-0:37        findMSB (global highp 2-component vector of int)
+0:37        findMSB (global lowp 2-component vector of int, operation at highp)
 0:37          'u2' (temp highp 2-component vector of uint)
 0:40      move second child to first child (temp highp 3-component vector of float)
 0:40        'v3' (temp highp 3-component vector of float)
@@ -1144,19 +1144,19 @@
 0:42          'i2' (temp highp 2-component vector of int)
 0:45      move second child to first child (temp highp uint)
 0:45        'u1' (temp highp uint)
-0:45        PackUnorm4x8 (global highp uint)
+0:45        PackUnorm4x8 (global highp uint, operation at mediump)
 0:45          'v4' (temp mediump 4-component vector of float)
 0:46      move second child to first child (temp highp uint)
 0:46        'u1' (temp highp uint)
-0:46        PackSnorm4x8 (global highp uint)
+0:46        PackSnorm4x8 (global highp uint, operation at mediump)
 0:46          'v4' (temp mediump 4-component vector of float)
-0:47      move second child to first child (temp highp 4-component vector of float)
+0:47      move second child to first child (temp mediump 4-component vector of float)
 0:47        'v4' (temp mediump 4-component vector of float)
-0:47        UnpackUnorm4x8 (global highp 4-component vector of float)
+0:47        UnpackUnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:47          'u1' (temp highp uint)
-0:48      move second child to first child (temp highp 4-component vector of float)
+0:48      move second child to first child (temp mediump 4-component vector of float)
 0:48        'v4' (temp mediump 4-component vector of float)
-0:48        UnpackSnorm4x8 (global highp 4-component vector of float)
+0:48        UnpackSnorm4x8 (global mediump 4-component vector of float, operation at highp)
 0:48          'u1' (temp highp uint)
 0:60  Function Definition: foo( (global void)
 0:60    Function Parameters: 
@@ -1271,7 +1271,7 @@
 0:165          0.100000
 0:165        Convert float to int (temp lowp 2-component vector of int)
 0:165          'inf' (in highp 2-component vector of float)
-0:166      textureGatherOffsets (global lowp 4-component vector of float)
+0:166      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:166        direct index (temp lowp sampler2D)
 0:166          'sArray' (uniform 4-element array of lowp sampler2D)
 0:166          Constant:
@@ -1335,7 +1335,7 @@
 0:180          0.100000
 0:180        Convert float to int (temp lowp 2-component vector of int)
 0:180          'inf' (in highp 2-component vector of float)
-0:181      textureGatherOffsets (global lowp 4-component vector of float)
+0:181      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:181        direct index (temp lowp sampler2D)
 0:181          'sArray' (uniform 4-element array of lowp sampler2D)
 0:181          Constant:
@@ -1352,7 +1352,7 @@
 0:181          0 (const int)
 0:181          0 (const int)
 0:181          0 (const int)
-0:182      textureGatherOffsets (global lowp 4-component vector of float)
+0:182      textureGatherOffsets (global lowp 4-component vector of float, operation at highp)
 0:182        direct index (temp lowp sampler2D)
 0:182          'sArray' (uniform 4-element array of lowp sampler2D)
 0:182          Constant: