fix 32-bit identity fillers in 16-bit matrix constructors

createMatrixConstructor() seeds its working array with the identity
matrix, so any construction that does not specify every component takes
a 0.0 or 1.0 filler from it. The width of those constants was chosen
with a two-way test on bitCount, so 16-bit fell through to the 32-bit
makeFloatConstant(). f16mat2(s) then produced

  %26 = OpCompositeConstruct %v2half %23 %float_0

which spirv-val rejects: the constituents do not match the result type's
component type. Placement was always correct, only the constant width
was wrong. Select the constant width three ways, as the equivalent sites
in GlslangToSpv.cpp already do.

Add spv.matrix.float16.frag and spv.matrix.float64.frag, ports of
spv.matrix.frag at the other two widths, so each width that
createMatrixConstructor() dispatches on has coverage. Both include a
mat4(mat2(x)) construction, which leaves the trailing diagonal at the
identity and is the only form that uses the 1.0 filler rather than just
the 0.0 filler. Nothing previously reached the filler path at 16 or 64
bits from a SPIR-V test, which is why this went unnoticed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 8707009..986bbe9 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -4439,8 +4439,17 @@
 
     // initialize the array to the identity matrix
     Id ids[maxMatrixSize][maxMatrixSize];
-    Id  one = (bitCount == 64 ? makeDoubleConstant(1.0) : makeFloatConstant(1.0));
-    Id zero = (bitCount == 64 ? makeDoubleConstant(0.0) : makeFloatConstant(0.0));
+    Id one, zero;
+    if (bitCount == 64) {
+        one = makeDoubleConstant(1.0);
+        zero = makeDoubleConstant(0.0);
+    } else if (bitCount == 16) {
+        one = makeFloat16Constant(1.0);
+        zero = makeFloat16Constant(0.0);
+    } else {
+        one = makeFloatConstant(1.0);
+        zero = makeFloatConstant(0.0);
+    }
     for (int col = 0; col < 4; ++col) {
         for (int row = 0; row < 4; ++row) {
             if (col == row)
diff --git a/Test/baseResults/spv.matrix.float16.frag.out b/Test/baseResults/spv.matrix.float16.frag.out
new file mode 100644
index 0000000..d640ec4
--- /dev/null
+++ b/Test/baseResults/spv.matrix.float16.frag.out
@@ -0,0 +1,405 @@
+spv.matrix.float16.frag
+// Module Version 10000
+// Generated by (magic number): 8000b
+// Id's are bound by 342
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 14 339
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              Name 4  "main"
+                              Name 10  "m1"
+                              Name 14  "src"
+                              Name 27  "m2"
+                              Name 37  "f"
+                              Name 44  "v3"
+                              Name 51  "v4"
+                              Name 56  "sum34"
+                              Name 180  "dm"
+                              Name 197  "sum3"
+                              Name 201  "sum4"
+                              Name 207  "m43"
+                              Name 212  "m4"
+                              Name 219  "acc"
+                              Name 317  "grown"
+                              Name 339  "color"
+                              Decorate 14(src) Location 0
+                              Decorate 339(color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypeVector 6(float16_t) 4
+               8:             TypeMatrix 7(f16vec4) 3
+               9:             TypePointer Function 8
+              11:             TypeFloat 32
+              12:             TypeVector 11(float) 4
+              13:             TypePointer Input 12(fvec4)
+         14(src):     13(ptr) Variable Input
+              15:             TypeInt 32 0
+              16:     15(int) Constant 0
+              17:             TypePointer Input 11(float)
+              21:6(float16_t) Constant 15360
+              22:6(float16_t) Constant 0
+              28:     15(int) Constant 1
+              36:             TypePointer Function 6(float16_t)
+              38:     15(int) Constant 2
+              42:             TypeVector 6(float16_t) 3
+              43:             TypePointer Function 42(f16vec3)
+              45:     15(int) Constant 3
+              50:             TypePointer Function 7(f16vec4)
+             176:             TypeFloat 64
+             177:             TypeVector 176(float64_t) 4
+             178:             TypeMatrix 177(f64vec4) 3
+             179:             TypePointer Function 178
+             205:             TypeMatrix 42(f16vec3) 4
+             206:             TypePointer Function 205
+             210:             TypeMatrix 7(f16vec4) 4
+             211:             TypePointer Function 210
+             301:             TypeVector 6(float16_t) 2
+             302:             TypeMatrix 301(f16vec2) 2
+             310:6(float16_t) Constant 18227
+             331:             TypeInt 32 1
+             332:    331(int) Constant 3
+             338:             TypePointer Output 12(fvec4)
+      339(color):    338(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+          10(m1):      9(ptr) Variable Function
+          27(m2):      9(ptr) Variable Function
+           37(f):     36(ptr) Variable Function
+          44(v3):     43(ptr) Variable Function
+          51(v4):     50(ptr) Variable Function
+       56(sum34):      9(ptr) Variable Function
+         180(dm):    179(ptr) Variable Function
+       197(sum3):     43(ptr) Variable Function
+       201(sum4):     50(ptr) Variable Function
+        207(m43):    206(ptr) Variable Function
+         212(m4):    211(ptr) Variable Function
+        219(acc):     50(ptr) Variable Function
+      317(grown):    211(ptr) Variable Function
+              18:     17(ptr) AccessChain 14(src) 16
+              19:   11(float) Load 18
+              20:6(float16_t) FConvert 19
+              23:  7(f16vec4) CompositeConstruct 20 22 22 22
+              24:  7(f16vec4) CompositeConstruct 22 20 22 22
+              25:  7(f16vec4) CompositeConstruct 22 22 20 22
+              26:           8 CompositeConstruct 23 24 25
+                              Store 10(m1) 26
+              29:     17(ptr) AccessChain 14(src) 28
+              30:   11(float) Load 29
+              31:6(float16_t) FConvert 30
+              32:  7(f16vec4) CompositeConstruct 31 22 22 22
+              33:  7(f16vec4) CompositeConstruct 22 31 22 22
+              34:  7(f16vec4) CompositeConstruct 22 22 31 22
+              35:           8 CompositeConstruct 32 33 34
+                              Store 27(m2) 35
+              39:     17(ptr) AccessChain 14(src) 38
+              40:   11(float) Load 39
+              41:6(float16_t) FConvert 40
+                              Store 37(f) 41
+              46:     17(ptr) AccessChain 14(src) 45
+              47:   11(float) Load 46
+              48:6(float16_t) FConvert 47
+              49: 42(f16vec3) CompositeConstruct 48 48 48
+                              Store 44(v3) 49
+              52:     17(ptr) AccessChain 14(src) 16
+              53:   11(float) Load 52
+              54:6(float16_t) FConvert 53
+              55:  7(f16vec4) CompositeConstruct 54 54 54 54
+                              Store 51(v4) 55
+              57:           8 Load 10(m1)
+              58:           8 Load 27(m2)
+              59:  7(f16vec4) CompositeExtract 57 0
+              60:  7(f16vec4) CompositeExtract 58 0
+              61:  7(f16vec4) FSub 59 60
+              62:  7(f16vec4) CompositeExtract 57 1
+              63:  7(f16vec4) CompositeExtract 58 1
+              64:  7(f16vec4) FSub 62 63
+              65:  7(f16vec4) CompositeExtract 57 2
+              66:  7(f16vec4) CompositeExtract 58 2
+              67:  7(f16vec4) FSub 65 66
+              68:           8 CompositeConstruct 61 64 67
+                              Store 56(sum34) 68
+              69:           8 Load 10(m1)
+              70:6(float16_t) Load 37(f)
+              71:           8 MatrixTimesScalar 69 70
+              72:           8 Load 56(sum34)
+              73:  7(f16vec4) CompositeExtract 72 0
+              74:  7(f16vec4) CompositeExtract 71 0
+              75:  7(f16vec4) FAdd 73 74
+              76:  7(f16vec4) CompositeExtract 72 1
+              77:  7(f16vec4) CompositeExtract 71 1
+              78:  7(f16vec4) FAdd 76 77
+              79:  7(f16vec4) CompositeExtract 72 2
+              80:  7(f16vec4) CompositeExtract 71 2
+              81:  7(f16vec4) FAdd 79 80
+              82:           8 CompositeConstruct 75 78 81
+                              Store 56(sum34) 82
+              83:6(float16_t) Load 37(f)
+              84:           8 Load 10(m1)
+              85:           8 MatrixTimesScalar 84 83
+              86:           8 Load 56(sum34)
+              87:  7(f16vec4) CompositeExtract 86 0
+              88:  7(f16vec4) CompositeExtract 85 0
+              89:  7(f16vec4) FAdd 87 88
+              90:  7(f16vec4) CompositeExtract 86 1
+              91:  7(f16vec4) CompositeExtract 85 1
+              92:  7(f16vec4) FAdd 90 91
+              93:  7(f16vec4) CompositeExtract 86 2
+              94:  7(f16vec4) CompositeExtract 85 2
+              95:  7(f16vec4) FAdd 93 94
+              96:           8 CompositeConstruct 89 92 95
+                              Store 56(sum34) 96
+              97:           8 Load 10(m1)
+              98:           8 Load 27(m2)
+              99:  7(f16vec4) CompositeExtract 97 0
+             100:  7(f16vec4) CompositeExtract 98 0
+             101:  7(f16vec4) FMul 99 100
+             102:  7(f16vec4) CompositeExtract 97 1
+             103:  7(f16vec4) CompositeExtract 98 1
+             104:  7(f16vec4) FMul 102 103
+             105:  7(f16vec4) CompositeExtract 97 2
+             106:  7(f16vec4) CompositeExtract 98 2
+             107:  7(f16vec4) FMul 105 106
+             108:           8 CompositeConstruct 101 104 107
+             109:           8 Load 56(sum34)
+             110:  7(f16vec4) CompositeExtract 109 0
+             111:  7(f16vec4) CompositeExtract 108 0
+             112:  7(f16vec4) FDiv 110 111
+             113:  7(f16vec4) CompositeExtract 109 1
+             114:  7(f16vec4) CompositeExtract 108 1
+             115:  7(f16vec4) FDiv 113 114
+             116:  7(f16vec4) CompositeExtract 109 2
+             117:  7(f16vec4) CompositeExtract 108 2
+             118:  7(f16vec4) FDiv 116 117
+             119:           8 CompositeConstruct 112 115 118
+                              Store 56(sum34) 119
+             120:           8 Load 10(m1)
+             121:6(float16_t) Load 37(f)
+             122:6(float16_t) FDiv 21 121
+             123:           8 MatrixTimesScalar 120 122
+             124:           8 Load 56(sum34)
+             125:  7(f16vec4) CompositeExtract 124 0
+             126:  7(f16vec4) CompositeExtract 123 0
+             127:  7(f16vec4) FAdd 125 126
+             128:  7(f16vec4) CompositeExtract 124 1
+             129:  7(f16vec4) CompositeExtract 123 1
+             130:  7(f16vec4) FAdd 128 129
+             131:  7(f16vec4) CompositeExtract 124 2
+             132:  7(f16vec4) CompositeExtract 123 2
+             133:  7(f16vec4) FAdd 131 132
+             134:           8 CompositeConstruct 127 130 133
+                              Store 56(sum34) 134
+             135:6(float16_t) Load 37(f)
+             136:           8 Load 10(m1)
+             137:  7(f16vec4) CompositeConstruct 135 135 135 135
+             138:  7(f16vec4) CompositeExtract 136 0
+             139:  7(f16vec4) FDiv 137 138
+             140:  7(f16vec4) CompositeExtract 136 1
+             141:  7(f16vec4) FDiv 137 140
+             142:  7(f16vec4) CompositeExtract 136 2
+             143:  7(f16vec4) FDiv 137 142
+             144:           8 CompositeConstruct 139 141 143
+             145:           8 Load 56(sum34)
+             146:  7(f16vec4) CompositeExtract 145 0
+             147:  7(f16vec4) CompositeExtract 144 0
+             148:  7(f16vec4) FAdd 146 147
+             149:  7(f16vec4) CompositeExtract 145 1
+             150:  7(f16vec4) CompositeExtract 144 1
+             151:  7(f16vec4) FAdd 149 150
+             152:  7(f16vec4) CompositeExtract 145 2
+             153:  7(f16vec4) CompositeExtract 144 2
+             154:  7(f16vec4) FAdd 152 153
+             155:           8 CompositeConstruct 148 151 154
+                              Store 56(sum34) 155
+             156:6(float16_t) Load 37(f)
+             157:           8 Load 56(sum34)
+             158:  7(f16vec4) CompositeConstruct 156 156 156 156
+             159:  7(f16vec4) CompositeExtract 157 0
+             160:  7(f16vec4) FAdd 159 158
+             161:  7(f16vec4) CompositeExtract 157 1
+             162:  7(f16vec4) FAdd 161 158
+             163:  7(f16vec4) CompositeExtract 157 2
+             164:  7(f16vec4) FAdd 163 158
+             165:           8 CompositeConstruct 160 162 164
+                              Store 56(sum34) 165
+             166:6(float16_t) Load 37(f)
+             167:           8 Load 56(sum34)
+             168:  7(f16vec4) CompositeConstruct 166 166 166 166
+             169:  7(f16vec4) CompositeExtract 167 0
+             170:  7(f16vec4) FSub 169 168
+             171:  7(f16vec4) CompositeExtract 167 1
+             172:  7(f16vec4) FSub 171 168
+             173:  7(f16vec4) CompositeExtract 167 2
+             174:  7(f16vec4) FSub 173 168
+             175:           8 CompositeConstruct 170 172 174
+                              Store 56(sum34) 175
+             181:           8 Load 56(sum34)
+             182:  7(f16vec4) CompositeExtract 181 0
+             183:177(f64vec4) FConvert 182
+             184:  7(f16vec4) CompositeExtract 181 1
+             185:177(f64vec4) FConvert 184
+             186:  7(f16vec4) CompositeExtract 181 2
+             187:177(f64vec4) FConvert 186
+             188:         178 CompositeConstruct 183 185 187
+                              Store 180(dm) 188
+             189:         178 Load 180(dm)
+             190:177(f64vec4) CompositeExtract 189 0
+             191:  7(f16vec4) FConvert 190
+             192:177(f64vec4) CompositeExtract 189 1
+             193:  7(f16vec4) FConvert 192
+             194:177(f64vec4) CompositeExtract 189 2
+             195:  7(f16vec4) FConvert 194
+             196:           8 CompositeConstruct 191 193 195
+                              Store 56(sum34) 196
+             198:  7(f16vec4) Load 51(v4)
+             199:           8 Load 27(m2)
+             200: 42(f16vec3) VectorTimesMatrix 198 199
+                              Store 197(sum3) 200
+             202:           8 Load 27(m2)
+             203: 42(f16vec3) Load 44(v3)
+             204:  7(f16vec4) MatrixTimesVector 202 203
+                              Store 201(sum4) 204
+             208:           8 Load 56(sum34)
+             209:         205 Transpose 208
+                              Store 207(m43) 209
+             213:           8 Load 10(m1)
+             214:         205 Load 207(m43)
+             215:         210 MatrixTimesMatrix 213 214
+                              Store 212(m4) 215
+             216:  7(f16vec4) Load 51(v4)
+             217:         210 Load 212(m4)
+             218:  7(f16vec4) VectorTimesMatrix 216 217
+                              Store 201(sum4) 218
+             220:  7(f16vec4) Load 201(sum4)
+                              Store 219(acc) 220
+             221:           8 Load 56(sum34)
+             222:  7(f16vec4) CompositeConstruct 21 21 21 21
+             223:  7(f16vec4) CompositeExtract 221 0
+             224:  7(f16vec4) FAdd 223 222
+             225:  7(f16vec4) CompositeExtract 221 1
+             226:  7(f16vec4) FAdd 225 222
+             227:  7(f16vec4) CompositeExtract 221 2
+             228:  7(f16vec4) FAdd 227 222
+             229:           8 CompositeConstruct 224 226 228
+                              Store 56(sum34) 229
+             230:           8 Load 56(sum34)
+             231:  7(f16vec4) CompositeConstruct 21 21 21 21
+             232:  7(f16vec4) CompositeExtract 230 0
+             233:  7(f16vec4) FSub 232 231
+             234:  7(f16vec4) CompositeExtract 230 1
+             235:  7(f16vec4) FSub 234 231
+             236:  7(f16vec4) CompositeExtract 230 2
+             237:  7(f16vec4) FSub 236 231
+             238:           8 CompositeConstruct 233 235 237
+                              Store 56(sum34) 238
+             239:6(float16_t) Load 37(f)
+             240:  7(f16vec4) CompositeConstruct 239 22 22 22
+             241:  7(f16vec4) CompositeConstruct 22 239 22 22
+             242:  7(f16vec4) CompositeConstruct 22 22 239 22
+             243:           8 CompositeConstruct 240 241 242
+             244:           8 Load 56(sum34)
+             245:  7(f16vec4) CompositeExtract 244 0
+             246:  7(f16vec4) CompositeExtract 243 0
+             247:  7(f16vec4) FAdd 245 246
+             248:  7(f16vec4) CompositeExtract 244 1
+             249:  7(f16vec4) CompositeExtract 243 1
+             250:  7(f16vec4) FAdd 248 249
+             251:  7(f16vec4) CompositeExtract 244 2
+             252:  7(f16vec4) CompositeExtract 243 2
+             253:  7(f16vec4) FAdd 251 252
+             254:           8 CompositeConstruct 247 250 253
+                              Store 56(sum34) 254
+             255: 42(f16vec3) Load 44(v3)
+             256:6(float16_t) Load 37(f)
+             257: 42(f16vec3) Load 44(v3)
+             258:6(float16_t) Load 37(f)
+             259: 42(f16vec3) Load 44(v3)
+             260:6(float16_t) Load 37(f)
+             261:6(float16_t) CompositeExtract 255 0
+             262:6(float16_t) CompositeExtract 255 1
+             263:6(float16_t) CompositeExtract 255 2
+             264:6(float16_t) CompositeExtract 257 0
+             265:6(float16_t) CompositeExtract 257 1
+             266:6(float16_t) CompositeExtract 257 2
+             267:6(float16_t) CompositeExtract 259 0
+             268:6(float16_t) CompositeExtract 259 1
+             269:6(float16_t) CompositeExtract 259 2
+             270:  7(f16vec4) CompositeConstruct 261 262 263 256
+             271:  7(f16vec4) CompositeConstruct 264 265 266 258
+             272:  7(f16vec4) CompositeConstruct 267 268 269 260
+             273:           8 CompositeConstruct 270 271 272
+             274:           8 Load 56(sum34)
+             275:  7(f16vec4) CompositeExtract 274 0
+             276:  7(f16vec4) CompositeExtract 273 0
+             277:  7(f16vec4) FAdd 275 276
+             278:  7(f16vec4) CompositeExtract 274 1
+             279:  7(f16vec4) CompositeExtract 273 1
+             280:  7(f16vec4) FAdd 278 279
+             281:  7(f16vec4) CompositeExtract 274 2
+             282:  7(f16vec4) CompositeExtract 273 2
+             283:  7(f16vec4) FAdd 281 282
+             284:           8 CompositeConstruct 277 280 283
+                              Store 56(sum34) 284
+             285: 42(f16vec3) Load 197(sum3)
+             286:         205 Load 207(m43)
+             287:  7(f16vec4) VectorTimesMatrix 285 286
+             288:  7(f16vec4) Load 201(sum4)
+             289:  7(f16vec4) FAdd 287 288
+             290:  7(f16vec4) Load 219(acc)
+             291:  7(f16vec4) FAdd 290 289
+                              Store 219(acc) 291
+             292:         205 Load 207(m43)
+             293:6(float16_t) CompositeExtract 292 0 0
+             294:6(float16_t) CompositeExtract 292 0 1
+             295:6(float16_t) CompositeExtract 292 0 2
+             296:6(float16_t) CompositeExtract 292 1 0
+             297:  7(f16vec4) CompositeConstruct 293 294 295 296
+             298:  7(f16vec4) Load 219(acc)
+             299:  7(f16vec4) FAdd 298 297
+                              Store 219(acc) 299
+             300:6(float16_t) Load 37(f)
+             303:301(f16vec2) CompositeConstruct 300 22
+             304:301(f16vec2) CompositeConstruct 22 300
+             305:         302 CompositeConstruct 303 304
+             306:6(float16_t) CompositeExtract 305 0 0
+             307:6(float16_t) CompositeExtract 305 0 1
+             308:6(float16_t) CompositeExtract 305 1 0
+             309: 42(f16vec3) CompositeConstruct 306 307 308
+             311:6(float16_t) CompositeExtract 309 0
+             312:6(float16_t) CompositeExtract 309 1
+             313:6(float16_t) CompositeExtract 309 2
+             314:  7(f16vec4) CompositeConstruct 311 312 313 310
+             315:  7(f16vec4) Load 219(acc)
+             316:  7(f16vec4) FAdd 315 314
+                              Store 219(acc) 316
+             318:6(float16_t) Load 37(f)
+             319:301(f16vec2) CompositeConstruct 318 22
+             320:301(f16vec2) CompositeConstruct 22 318
+             321:         302 CompositeConstruct 319 320
+             322:6(float16_t) CompositeExtract 321 0 0
+             323:6(float16_t) CompositeExtract 321 0 1
+             324:6(float16_t) CompositeExtract 321 1 0
+             325:6(float16_t) CompositeExtract 321 1 1
+             326:  7(f16vec4) CompositeConstruct 322 323 22 22
+             327:  7(f16vec4) CompositeConstruct 324 325 22 22
+             328:  7(f16vec4) CompositeConstruct 22 22 21 22
+             329:  7(f16vec4) CompositeConstruct 22 22 22 21
+             330:         210 CompositeConstruct 326 327 328 329
+                              Store 317(grown) 330
+             333:     36(ptr) AccessChain 317(grown) 332 45
+             334:6(float16_t) Load 333
+             335:  7(f16vec4) CompositeConstruct 334 334 334 334
+             336:  7(f16vec4) Load 219(acc)
+             337:  7(f16vec4) FAdd 336 335
+                              Store 219(acc) 337
+             340:  7(f16vec4) Load 219(acc)
+             341:   12(fvec4) FConvert 340
+                              Store 339(color) 341
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.matrix.float64.frag.out b/Test/baseResults/spv.matrix.float64.frag.out
new file mode 100644
index 0000000..874274a
--- /dev/null
+++ b/Test/baseResults/spv.matrix.float64.frag.out
@@ -0,0 +1,401 @@
+spv.matrix.float64.frag
+// Module Version 10000
+// Generated by (magic number): 8000b
+// Id's are bound by 340
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 14 337
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 420
+                              Name 4  "main"
+                              Name 10  "m1"
+                              Name 14  "src"
+                              Name 27  "m2"
+                              Name 37  "f"
+                              Name 44  "v3"
+                              Name 51  "v4"
+                              Name 56  "sum34"
+                              Name 178  "fm"
+                              Name 195  "sum3"
+                              Name 199  "sum4"
+                              Name 205  "m43"
+                              Name 210  "m4"
+                              Name 217  "acc"
+                              Name 315  "grown"
+                              Name 337  "color"
+                              Decorate 14(src) Location 0
+                              Decorate 337(color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 64
+               7:             TypeVector 6(float64_t) 4
+               8:             TypeMatrix 7(f64vec4) 3
+               9:             TypePointer Function 8
+              11:             TypeFloat 32
+              12:             TypeVector 11(float) 4
+              13:             TypePointer Input 12(fvec4)
+         14(src):     13(ptr) Variable Input
+              15:             TypeInt 32 0
+              16:     15(int) Constant 0
+              17:             TypePointer Input 11(float)
+              21:6(float64_t) Constant 0 1072693248
+              22:6(float64_t) Constant 0 0
+              28:     15(int) Constant 1
+              36:             TypePointer Function 6(float64_t)
+              38:     15(int) Constant 2
+              42:             TypeVector 6(float64_t) 3
+              43:             TypePointer Function 42(f64vec3)
+              45:     15(int) Constant 3
+              50:             TypePointer Function 7(f64vec4)
+             176:             TypeMatrix 12(fvec4) 3
+             177:             TypePointer Function 176
+             203:             TypeMatrix 42(f64vec3) 4
+             204:             TypePointer Function 203
+             208:             TypeMatrix 7(f64vec4) 4
+             209:             TypePointer Function 208
+             299:             TypeVector 6(float64_t) 2
+             300:             TypeMatrix 299(f64vec2) 2
+             308:6(float64_t) Constant 3435973837 1075629260
+             329:             TypeInt 32 1
+             330:    329(int) Constant 3
+             336:             TypePointer Output 12(fvec4)
+      337(color):    336(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+          10(m1):      9(ptr) Variable Function
+          27(m2):      9(ptr) Variable Function
+           37(f):     36(ptr) Variable Function
+          44(v3):     43(ptr) Variable Function
+          51(v4):     50(ptr) Variable Function
+       56(sum34):      9(ptr) Variable Function
+         178(fm):    177(ptr) Variable Function
+       195(sum3):     43(ptr) Variable Function
+       199(sum4):     50(ptr) Variable Function
+        205(m43):    204(ptr) Variable Function
+         210(m4):    209(ptr) Variable Function
+        217(acc):     50(ptr) Variable Function
+      315(grown):    209(ptr) Variable Function
+              18:     17(ptr) AccessChain 14(src) 16
+              19:   11(float) Load 18
+              20:6(float64_t) FConvert 19
+              23:  7(f64vec4) CompositeConstruct 20 22 22 22
+              24:  7(f64vec4) CompositeConstruct 22 20 22 22
+              25:  7(f64vec4) CompositeConstruct 22 22 20 22
+              26:           8 CompositeConstruct 23 24 25
+                              Store 10(m1) 26
+              29:     17(ptr) AccessChain 14(src) 28
+              30:   11(float) Load 29
+              31:6(float64_t) FConvert 30
+              32:  7(f64vec4) CompositeConstruct 31 22 22 22
+              33:  7(f64vec4) CompositeConstruct 22 31 22 22
+              34:  7(f64vec4) CompositeConstruct 22 22 31 22
+              35:           8 CompositeConstruct 32 33 34
+                              Store 27(m2) 35
+              39:     17(ptr) AccessChain 14(src) 38
+              40:   11(float) Load 39
+              41:6(float64_t) FConvert 40
+                              Store 37(f) 41
+              46:     17(ptr) AccessChain 14(src) 45
+              47:   11(float) Load 46
+              48:6(float64_t) FConvert 47
+              49: 42(f64vec3) CompositeConstruct 48 48 48
+                              Store 44(v3) 49
+              52:     17(ptr) AccessChain 14(src) 16
+              53:   11(float) Load 52
+              54:6(float64_t) FConvert 53
+              55:  7(f64vec4) CompositeConstruct 54 54 54 54
+                              Store 51(v4) 55
+              57:           8 Load 10(m1)
+              58:           8 Load 27(m2)
+              59:  7(f64vec4) CompositeExtract 57 0
+              60:  7(f64vec4) CompositeExtract 58 0
+              61:  7(f64vec4) FSub 59 60
+              62:  7(f64vec4) CompositeExtract 57 1
+              63:  7(f64vec4) CompositeExtract 58 1
+              64:  7(f64vec4) FSub 62 63
+              65:  7(f64vec4) CompositeExtract 57 2
+              66:  7(f64vec4) CompositeExtract 58 2
+              67:  7(f64vec4) FSub 65 66
+              68:           8 CompositeConstruct 61 64 67
+                              Store 56(sum34) 68
+              69:           8 Load 10(m1)
+              70:6(float64_t) Load 37(f)
+              71:           8 MatrixTimesScalar 69 70
+              72:           8 Load 56(sum34)
+              73:  7(f64vec4) CompositeExtract 72 0
+              74:  7(f64vec4) CompositeExtract 71 0
+              75:  7(f64vec4) FAdd 73 74
+              76:  7(f64vec4) CompositeExtract 72 1
+              77:  7(f64vec4) CompositeExtract 71 1
+              78:  7(f64vec4) FAdd 76 77
+              79:  7(f64vec4) CompositeExtract 72 2
+              80:  7(f64vec4) CompositeExtract 71 2
+              81:  7(f64vec4) FAdd 79 80
+              82:           8 CompositeConstruct 75 78 81
+                              Store 56(sum34) 82
+              83:6(float64_t) Load 37(f)
+              84:           8 Load 10(m1)
+              85:           8 MatrixTimesScalar 84 83
+              86:           8 Load 56(sum34)
+              87:  7(f64vec4) CompositeExtract 86 0
+              88:  7(f64vec4) CompositeExtract 85 0
+              89:  7(f64vec4) FAdd 87 88
+              90:  7(f64vec4) CompositeExtract 86 1
+              91:  7(f64vec4) CompositeExtract 85 1
+              92:  7(f64vec4) FAdd 90 91
+              93:  7(f64vec4) CompositeExtract 86 2
+              94:  7(f64vec4) CompositeExtract 85 2
+              95:  7(f64vec4) FAdd 93 94
+              96:           8 CompositeConstruct 89 92 95
+                              Store 56(sum34) 96
+              97:           8 Load 10(m1)
+              98:           8 Load 27(m2)
+              99:  7(f64vec4) CompositeExtract 97 0
+             100:  7(f64vec4) CompositeExtract 98 0
+             101:  7(f64vec4) FMul 99 100
+             102:  7(f64vec4) CompositeExtract 97 1
+             103:  7(f64vec4) CompositeExtract 98 1
+             104:  7(f64vec4) FMul 102 103
+             105:  7(f64vec4) CompositeExtract 97 2
+             106:  7(f64vec4) CompositeExtract 98 2
+             107:  7(f64vec4) FMul 105 106
+             108:           8 CompositeConstruct 101 104 107
+             109:           8 Load 56(sum34)
+             110:  7(f64vec4) CompositeExtract 109 0
+             111:  7(f64vec4) CompositeExtract 108 0
+             112:  7(f64vec4) FDiv 110 111
+             113:  7(f64vec4) CompositeExtract 109 1
+             114:  7(f64vec4) CompositeExtract 108 1
+             115:  7(f64vec4) FDiv 113 114
+             116:  7(f64vec4) CompositeExtract 109 2
+             117:  7(f64vec4) CompositeExtract 108 2
+             118:  7(f64vec4) FDiv 116 117
+             119:           8 CompositeConstruct 112 115 118
+                              Store 56(sum34) 119
+             120:           8 Load 10(m1)
+             121:6(float64_t) Load 37(f)
+             122:6(float64_t) FDiv 21 121
+             123:           8 MatrixTimesScalar 120 122
+             124:           8 Load 56(sum34)
+             125:  7(f64vec4) CompositeExtract 124 0
+             126:  7(f64vec4) CompositeExtract 123 0
+             127:  7(f64vec4) FAdd 125 126
+             128:  7(f64vec4) CompositeExtract 124 1
+             129:  7(f64vec4) CompositeExtract 123 1
+             130:  7(f64vec4) FAdd 128 129
+             131:  7(f64vec4) CompositeExtract 124 2
+             132:  7(f64vec4) CompositeExtract 123 2
+             133:  7(f64vec4) FAdd 131 132
+             134:           8 CompositeConstruct 127 130 133
+                              Store 56(sum34) 134
+             135:6(float64_t) Load 37(f)
+             136:           8 Load 10(m1)
+             137:  7(f64vec4) CompositeConstruct 135 135 135 135
+             138:  7(f64vec4) CompositeExtract 136 0
+             139:  7(f64vec4) FDiv 137 138
+             140:  7(f64vec4) CompositeExtract 136 1
+             141:  7(f64vec4) FDiv 137 140
+             142:  7(f64vec4) CompositeExtract 136 2
+             143:  7(f64vec4) FDiv 137 142
+             144:           8 CompositeConstruct 139 141 143
+             145:           8 Load 56(sum34)
+             146:  7(f64vec4) CompositeExtract 145 0
+             147:  7(f64vec4) CompositeExtract 144 0
+             148:  7(f64vec4) FAdd 146 147
+             149:  7(f64vec4) CompositeExtract 145 1
+             150:  7(f64vec4) CompositeExtract 144 1
+             151:  7(f64vec4) FAdd 149 150
+             152:  7(f64vec4) CompositeExtract 145 2
+             153:  7(f64vec4) CompositeExtract 144 2
+             154:  7(f64vec4) FAdd 152 153
+             155:           8 CompositeConstruct 148 151 154
+                              Store 56(sum34) 155
+             156:6(float64_t) Load 37(f)
+             157:           8 Load 56(sum34)
+             158:  7(f64vec4) CompositeConstruct 156 156 156 156
+             159:  7(f64vec4) CompositeExtract 157 0
+             160:  7(f64vec4) FAdd 159 158
+             161:  7(f64vec4) CompositeExtract 157 1
+             162:  7(f64vec4) FAdd 161 158
+             163:  7(f64vec4) CompositeExtract 157 2
+             164:  7(f64vec4) FAdd 163 158
+             165:           8 CompositeConstruct 160 162 164
+                              Store 56(sum34) 165
+             166:6(float64_t) Load 37(f)
+             167:           8 Load 56(sum34)
+             168:  7(f64vec4) CompositeConstruct 166 166 166 166
+             169:  7(f64vec4) CompositeExtract 167 0
+             170:  7(f64vec4) FSub 169 168
+             171:  7(f64vec4) CompositeExtract 167 1
+             172:  7(f64vec4) FSub 171 168
+             173:  7(f64vec4) CompositeExtract 167 2
+             174:  7(f64vec4) FSub 173 168
+             175:           8 CompositeConstruct 170 172 174
+                              Store 56(sum34) 175
+             179:           8 Load 56(sum34)
+             180:  7(f64vec4) CompositeExtract 179 0
+             181:   12(fvec4) FConvert 180
+             182:  7(f64vec4) CompositeExtract 179 1
+             183:   12(fvec4) FConvert 182
+             184:  7(f64vec4) CompositeExtract 179 2
+             185:   12(fvec4) FConvert 184
+             186:         176 CompositeConstruct 181 183 185
+                              Store 178(fm) 186
+             187:         176 Load 178(fm)
+             188:   12(fvec4) CompositeExtract 187 0
+             189:  7(f64vec4) FConvert 188
+             190:   12(fvec4) CompositeExtract 187 1
+             191:  7(f64vec4) FConvert 190
+             192:   12(fvec4) CompositeExtract 187 2
+             193:  7(f64vec4) FConvert 192
+             194:           8 CompositeConstruct 189 191 193
+                              Store 56(sum34) 194
+             196:  7(f64vec4) Load 51(v4)
+             197:           8 Load 27(m2)
+             198: 42(f64vec3) VectorTimesMatrix 196 197
+                              Store 195(sum3) 198
+             200:           8 Load 27(m2)
+             201: 42(f64vec3) Load 44(v3)
+             202:  7(f64vec4) MatrixTimesVector 200 201
+                              Store 199(sum4) 202
+             206:           8 Load 56(sum34)
+             207:         203 Transpose 206
+                              Store 205(m43) 207
+             211:           8 Load 10(m1)
+             212:         203 Load 205(m43)
+             213:         208 MatrixTimesMatrix 211 212
+                              Store 210(m4) 213
+             214:  7(f64vec4) Load 51(v4)
+             215:         208 Load 210(m4)
+             216:  7(f64vec4) VectorTimesMatrix 214 215
+                              Store 199(sum4) 216
+             218:  7(f64vec4) Load 199(sum4)
+                              Store 217(acc) 218
+             219:           8 Load 56(sum34)
+             220:  7(f64vec4) CompositeConstruct 21 21 21 21
+             221:  7(f64vec4) CompositeExtract 219 0
+             222:  7(f64vec4) FAdd 221 220
+             223:  7(f64vec4) CompositeExtract 219 1
+             224:  7(f64vec4) FAdd 223 220
+             225:  7(f64vec4) CompositeExtract 219 2
+             226:  7(f64vec4) FAdd 225 220
+             227:           8 CompositeConstruct 222 224 226
+                              Store 56(sum34) 227
+             228:           8 Load 56(sum34)
+             229:  7(f64vec4) CompositeConstruct 21 21 21 21
+             230:  7(f64vec4) CompositeExtract 228 0
+             231:  7(f64vec4) FSub 230 229
+             232:  7(f64vec4) CompositeExtract 228 1
+             233:  7(f64vec4) FSub 232 229
+             234:  7(f64vec4) CompositeExtract 228 2
+             235:  7(f64vec4) FSub 234 229
+             236:           8 CompositeConstruct 231 233 235
+                              Store 56(sum34) 236
+             237:6(float64_t) Load 37(f)
+             238:  7(f64vec4) CompositeConstruct 237 22 22 22
+             239:  7(f64vec4) CompositeConstruct 22 237 22 22
+             240:  7(f64vec4) CompositeConstruct 22 22 237 22
+             241:           8 CompositeConstruct 238 239 240
+             242:           8 Load 56(sum34)
+             243:  7(f64vec4) CompositeExtract 242 0
+             244:  7(f64vec4) CompositeExtract 241 0
+             245:  7(f64vec4) FAdd 243 244
+             246:  7(f64vec4) CompositeExtract 242 1
+             247:  7(f64vec4) CompositeExtract 241 1
+             248:  7(f64vec4) FAdd 246 247
+             249:  7(f64vec4) CompositeExtract 242 2
+             250:  7(f64vec4) CompositeExtract 241 2
+             251:  7(f64vec4) FAdd 249 250
+             252:           8 CompositeConstruct 245 248 251
+                              Store 56(sum34) 252
+             253: 42(f64vec3) Load 44(v3)
+             254:6(float64_t) Load 37(f)
+             255: 42(f64vec3) Load 44(v3)
+             256:6(float64_t) Load 37(f)
+             257: 42(f64vec3) Load 44(v3)
+             258:6(float64_t) Load 37(f)
+             259:6(float64_t) CompositeExtract 253 0
+             260:6(float64_t) CompositeExtract 253 1
+             261:6(float64_t) CompositeExtract 253 2
+             262:6(float64_t) CompositeExtract 255 0
+             263:6(float64_t) CompositeExtract 255 1
+             264:6(float64_t) CompositeExtract 255 2
+             265:6(float64_t) CompositeExtract 257 0
+             266:6(float64_t) CompositeExtract 257 1
+             267:6(float64_t) CompositeExtract 257 2
+             268:  7(f64vec4) CompositeConstruct 259 260 261 254
+             269:  7(f64vec4) CompositeConstruct 262 263 264 256
+             270:  7(f64vec4) CompositeConstruct 265 266 267 258
+             271:           8 CompositeConstruct 268 269 270
+             272:           8 Load 56(sum34)
+             273:  7(f64vec4) CompositeExtract 272 0
+             274:  7(f64vec4) CompositeExtract 271 0
+             275:  7(f64vec4) FAdd 273 274
+             276:  7(f64vec4) CompositeExtract 272 1
+             277:  7(f64vec4) CompositeExtract 271 1
+             278:  7(f64vec4) FAdd 276 277
+             279:  7(f64vec4) CompositeExtract 272 2
+             280:  7(f64vec4) CompositeExtract 271 2
+             281:  7(f64vec4) FAdd 279 280
+             282:           8 CompositeConstruct 275 278 281
+                              Store 56(sum34) 282
+             283: 42(f64vec3) Load 195(sum3)
+             284:         203 Load 205(m43)
+             285:  7(f64vec4) VectorTimesMatrix 283 284
+             286:  7(f64vec4) Load 199(sum4)
+             287:  7(f64vec4) FAdd 285 286
+             288:  7(f64vec4) Load 217(acc)
+             289:  7(f64vec4) FAdd 288 287
+                              Store 217(acc) 289
+             290:         203 Load 205(m43)
+             291:6(float64_t) CompositeExtract 290 0 0
+             292:6(float64_t) CompositeExtract 290 0 1
+             293:6(float64_t) CompositeExtract 290 0 2
+             294:6(float64_t) CompositeExtract 290 1 0
+             295:  7(f64vec4) CompositeConstruct 291 292 293 294
+             296:  7(f64vec4) Load 217(acc)
+             297:  7(f64vec4) FAdd 296 295
+                              Store 217(acc) 297
+             298:6(float64_t) Load 37(f)
+             301:299(f64vec2) CompositeConstruct 298 22
+             302:299(f64vec2) CompositeConstruct 22 298
+             303:         300 CompositeConstruct 301 302
+             304:6(float64_t) CompositeExtract 303 0 0
+             305:6(float64_t) CompositeExtract 303 0 1
+             306:6(float64_t) CompositeExtract 303 1 0
+             307: 42(f64vec3) CompositeConstruct 304 305 306
+             309:6(float64_t) CompositeExtract 307 0
+             310:6(float64_t) CompositeExtract 307 1
+             311:6(float64_t) CompositeExtract 307 2
+             312:  7(f64vec4) CompositeConstruct 309 310 311 308
+             313:  7(f64vec4) Load 217(acc)
+             314:  7(f64vec4) FAdd 313 312
+                              Store 217(acc) 314
+             316:6(float64_t) Load 37(f)
+             317:299(f64vec2) CompositeConstruct 316 22
+             318:299(f64vec2) CompositeConstruct 22 316
+             319:         300 CompositeConstruct 317 318
+             320:6(float64_t) CompositeExtract 319 0 0
+             321:6(float64_t) CompositeExtract 319 0 1
+             322:6(float64_t) CompositeExtract 319 1 0
+             323:6(float64_t) CompositeExtract 319 1 1
+             324:  7(f64vec4) CompositeConstruct 320 321 22 22
+             325:  7(f64vec4) CompositeConstruct 322 323 22 22
+             326:  7(f64vec4) CompositeConstruct 22 22 21 22
+             327:  7(f64vec4) CompositeConstruct 22 22 22 21
+             328:         208 CompositeConstruct 324 325 326 327
+                              Store 315(grown) 328
+             331:     36(ptr) AccessChain 315(grown) 330 45
+             332:6(float64_t) Load 331
+             333:  7(f64vec4) CompositeConstruct 332 332 332 332
+             334:  7(f64vec4) Load 217(acc)
+             335:  7(f64vec4) FAdd 334 333
+                              Store 217(acc) 335
+             338:  7(f64vec4) Load 217(acc)
+             339:   12(fvec4) FConvert 338
+                              Store 337(color) 339
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.matrix.float16.frag b/Test/spv.matrix.float16.frag
new file mode 100644
index 0000000..569c47b
--- /dev/null
+++ b/Test/spv.matrix.float16.frag
@@ -0,0 +1,67 @@
+#version 450

+

+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require

+

+// A 16-bit counterpart to spv.matrix.frag, covering the same matrix operations

+// at half precision. Two deliberate departures from that shader: the version is

+// 450 because the explicit arithmetic types extension is not available at 420,

+// and the operands are converted from a 32-bit input rather than declared as

+// f16 fragment inputs, which would additionally need GL_EXT_shader_16bit_storage.

+

+layout(location = 0) in vec4 src;

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    f16mat3x4 m1 = f16mat3x4(float16_t(src.x));

+    f16mat3x4 m2 = f16mat3x4(float16_t(src.y));

+    float16_t f  = float16_t(src.z);

+    f16vec3   v3 = f16vec3(float16_t(src.w));

+    f16vec4   v4 = f16vec4(float16_t(src.x));

+

+    f16mat3x4 sum34;

+    dmat3x4   dm;

+    f16vec3   sum3;

+    f16vec4   sum4;

+

+    sum34 = m1 - m2;

+    sum34 += m1 * f;

+    sum34 += f * m1;

+    sum34 /= matrixCompMult(m1, m2);

+    sum34 += m1 / f;

+    sum34 += f / m1;

+    sum34 += f;

+    sum34 -= f;

+    dm = dmat3x4(sum34);

+    sum34 = f16mat3x4(dm);

+

+    sum3 = v4 * m2;

+    sum4 = m2 * v3;

+

+    f16mat4x3 m43 = transpose(sum34);

+    f16mat4   m4  = m1 * m43;

+

+    sum4 = v4 * m4;

+

+    f16vec4 acc = sum4;

+

+    ++sum34;

+    --sum34;

+

+    sum34 += f16mat3x4(f);

+    sum34 += f16mat3x4(v3, f, v3, f, v3, f);

+

+    acc += sum3 * m43 + sum4;

+

+    acc += f16vec4(m43);

+    acc += f16vec4(f16vec3(f16mat2(f)), 7.2hf);

+

+    // Beyond what spv.matrix.frag covers. Growing a matrix from a smaller one

+    // leaves the trailing diagonal at the identity, and is the only construction

+    // that uses the one filler rather than just the zero filler.

+    f16mat4 grown = f16mat4(f16mat2(f));

+    acc += f16vec4(grown[3][3]);

+

+    color = vec4(acc);

+}

diff --git a/Test/spv.matrix.float64.frag b/Test/spv.matrix.float64.frag
new file mode 100644
index 0000000..5bc3983
--- /dev/null
+++ b/Test/spv.matrix.float64.frag
@@ -0,0 +1,64 @@
+#version 420

+

+// A 64-bit counterpart to spv.matrix.frag, covering the same matrix operations

+// at double precision. As in the 16-bit counterpart, the operands are converted

+// from a 32-bit input rather than declared as double fragment inputs, so that

+// the three shaders differ only in the width being exercised.

+

+layout(location = 0) in vec4 src;

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    dmat3x4 m1 = dmat3x4(double(src.x));

+    dmat3x4 m2 = dmat3x4(double(src.y));

+    double  f  = double(src.z);

+    dvec3   v3 = dvec3(double(src.w));

+    dvec4   v4 = dvec4(double(src.x));

+

+    dmat3x4 sum34;

+    mat3x4  fm;

+    dvec3   sum3;

+    dvec4   sum4;

+

+    sum34 = m1 - m2;

+    sum34 += m1 * f;

+    sum34 += f * m1;

+    sum34 /= matrixCompMult(m1, m2);

+    sum34 += m1 / f;

+    sum34 += f / m1;

+    sum34 += f;

+    sum34 -= f;

+    fm = mat3x4(sum34);

+    sum34 = dmat3x4(fm);

+

+    sum3 = v4 * m2;

+    sum4 = m2 * v3;

+

+    dmat4x3 m43 = transpose(sum34);

+    dmat4   m4  = m1 * m43;

+

+    sum4 = v4 * m4;

+

+    dvec4 acc = sum4;

+

+    ++sum34;

+    --sum34;

+

+    sum34 += dmat3x4(f);

+    sum34 += dmat3x4(v3, f, v3, f, v3, f);

+

+    acc += sum3 * m43 + sum4;

+

+    acc += dvec4(m43);

+    acc += dvec4(dvec3(dmat2(f)), 7.2lf);

+

+    // Beyond what spv.matrix.frag covers. Growing a matrix from a smaller one

+    // leaves the trailing diagonal at the identity, and is the only construction

+    // that uses the one filler rather than just the zero filler.

+    dmat4 grown = dmat4(dmat2(f));

+    acc += dvec4(grown[3][3]);

+

+    color = vec4(acc);

+}

diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 6c38162..228d445 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -506,6 +506,8 @@
         "spv.loopsArtificial.frag",
         "spv.matFun.vert",
         "spv.matrix.frag",
+        "spv.matrix.float16.frag",
+        "spv.matrix.float64.frag",
         "spv.matrix2.frag",
         "spv.maximalReconvergence.vert",
         "spv.memoryQualifier.frag",