Add changes for SPV_EXT_shader_atomic_float_add
diff --git a/SPIRV/GLSL.ext.EXT.h b/SPIRV/GLSL.ext.EXT.h
index 40164b6..6eb0eee 100644
--- a/SPIRV/GLSL.ext.EXT.h
+++ b/SPIRV/GLSL.ext.EXT.h
@@ -35,5 +35,6 @@
 static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
 static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
 static const char* const E_SPV_EXT_demote_to_helper_invocation = "SPV_EXT_demote_to_helper_invocation";
+static const char* const E_SPV_EXT_shader_atomic_float_add = "SPV_EXT_shader_atomic_float_add";
 
 #endif  // #ifndef GLSLextEXT_H
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 3baa1f4..b14a3b2 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -6682,6 +6682,14 @@
     case glslang::EOpImageAtomicAdd:
     case glslang::EOpAtomicCounterAdd:
         opCode = spv::OpAtomicIAdd;
+        if (typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {
+            opCode = spv::OpAtomicFAddEXT;
+            builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add);
+            if (typeProxy == glslang::EbtFloat)
+                builder.addCapability(spv::CapabilityAtomicFloat32AddEXT);
+            else
+                builder.addCapability(spv::CapabilityAtomicFloat64AddEXT);
+        }
         break;
     case glslang::EOpAtomicCounterSubtract:
         opCode = spv::OpAtomicISub;
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index b1f2b82..4829bb4 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -938,6 +938,9 @@
 
     case CapabilityIntegerFunctions2INTEL:              return "CapabilityIntegerFunctions2INTEL";
 
+    case CapabilityAtomicFloat32AddEXT:                     return "AtomicFloat32AddEXT";
+    case CapabilityAtomicFloat64AddEXT:                     return "AtomicFloat64AddEXT";
+
     default: return "Bad";
     }
 }
@@ -1313,6 +1316,8 @@
     case 4430: return "OpSubgroupAllEqualKHR";
     case 4432: return "OpSubgroupReadInvocationKHR";
 
+    case OpAtomicFAddEXT: return "OpAtomicFAddEXT";
+
     case 5000: return "OpGroupIAddNonUniformAMD";
     case 5001: return "OpGroupFAddNonUniformAMD";
     case 5002: return "OpGroupFMinNonUniformAMD";
@@ -2260,6 +2265,11 @@
     InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'");
     InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'");
 
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'");
+
     InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'");
     InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'");
diff --git a/Test/baseResults/spv.atomicFloat.comp.out b/Test/baseResults/spv.atomicFloat.comp.out
new file mode 100755
index 0000000..3799557
--- /dev/null
+++ b/Test/baseResults/spv.atomicFloat.comp.out
@@ -0,0 +1,658 @@
+spv.atomicFloat.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 470
+
+                              Capability Shader
+                              Capability Float64
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability Image1D
+                              Capability VulkanMemoryModelKHR
+                              Capability VulkanMemoryModelDeviceScopeKHR
+                              Capability AtomicFloat32AddEXT
+                              Capability AtomicFloat64AddEXT
+                              Extension  "SPV_EXT_shader_atomic_float_add"
+                              Extension  "SPV_KHR_vulkan_memory_model"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 16 16 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_atomic_float"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 8  "resultf"
+                              Name 11  "atomf"
+                              Name 25  "Buffer"
+                              MemberName 25(Buffer) 0  "dataf"
+                              MemberName 25(Buffer) 1  "datad"
+                              Name 27  "buf"
+                              Name 34  "resultd"
+                              Name 37  "atomd"
+                              Name 143  "fimage1D"
+                              Name 189  "fimage1DArray"
+                              Name 232  "fimage2D"
+                              Name 270  "fimage2DRect"
+                              Name 308  "fimage2DArray"
+                              Name 352  "fimageCube"
+                              Name 392  "fimageCubeArray"
+                              Name 430  "fimage3D"
+                              MemberDecorate 25(Buffer) 0 Offset 0
+                              MemberDecorate 25(Buffer) 1 Offset 8
+                              Decorate 25(Buffer) BufferBlock
+                              Decorate 27(buf) DescriptorSet 0
+                              Decorate 27(buf) Binding 0
+                              Decorate 143(fimage1D) Location 0
+                              Decorate 143(fimage1D) DescriptorSet 0
+                              Decorate 143(fimage1D) Binding 0
+                              Decorate 189(fimage1DArray) Location 1
+                              Decorate 189(fimage1DArray) DescriptorSet 0
+                              Decorate 189(fimage1DArray) Binding 1
+                              Decorate 232(fimage2D) Location 2
+                              Decorate 232(fimage2D) DescriptorSet 0
+                              Decorate 232(fimage2D) Binding 2
+                              Decorate 270(fimage2DRect) Location 4
+                              Decorate 270(fimage2DRect) DescriptorSet 0
+                              Decorate 270(fimage2DRect) Binding 4
+                              Decorate 308(fimage2DArray) Location 3
+                              Decorate 308(fimage2DArray) DescriptorSet 0
+                              Decorate 308(fimage2DArray) Binding 3
+                              Decorate 352(fimageCube) Location 5
+                              Decorate 352(fimageCube) DescriptorSet 0
+                              Decorate 352(fimageCube) Binding 5
+                              Decorate 392(fimageCubeArray) Location 6
+                              Decorate 392(fimageCubeArray) DescriptorSet 0
+                              Decorate 392(fimageCubeArray) Binding 6
+                              Decorate 430(fimage3D) Location 7
+                              Decorate 430(fimage3D) DescriptorSet 0
+                              Decorate 430(fimage3D) Binding 9
+                              Decorate 469 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:    6(float) Constant 0
+              10:             TypePointer Workgroup 6(float)
+       11(atomf):     10(ptr) Variable Workgroup
+              12:    6(float) Constant 1077936128
+              13:             TypeInt 32 0
+              14:     13(int) Constant 5
+              15:     13(int) Constant 0
+              17:    6(float) Constant 1083179008
+              18:             TypeInt 32 1
+              19:     18(int) Constant 1
+              20:     18(int) Constant 64
+              21:     18(int) Constant 0
+              22:     13(int) Constant 64
+              24:             TypeFloat 64
+      25(Buffer):             TypeStruct 6(float) 24(float64_t)
+              26:             TypePointer Uniform 25(Buffer)
+         27(buf):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(float)
+              33:             TypePointer Function 24(float64_t)
+              35:24(float64_t) Constant 0 0
+              36:             TypePointer Workgroup 24(float64_t)
+       37(atomd):     36(ptr) Variable Workgroup
+              38:24(float64_t) Constant 0 1074266112
+              40:24(float64_t) Constant 0 1074921472
+              42:             TypePointer Uniform 24(float64_t)
+              57:     18(int) Constant 256
+              58:     13(int) Constant 256
+             141:             TypeImage 6(float) 1D nonsampled format:R32f
+             142:             TypePointer UniformConstant 141
+   143(fimage1D):    142(ptr) Variable UniformConstant
+             144:    6(float) Constant 1073741824
+             145:             TypePointer Image 6(float)
+             147:     13(int) Constant 32768
+             149:     13(int) Constant 2
+             155:     18(int) Constant 2048
+             157:     13(int) Constant 2048
+             164:    6(float) Constant 1082130432
+             179:     18(int) Constant 2
+             187:             TypeImage 6(float) 1D array nonsampled format:R32f
+             188:             TypePointer UniformConstant 187
+189(fimage1DArray):    188(ptr) Variable UniformConstant
+             190:             TypeVector 18(int) 2
+             191:  190(ivec2) ConstantComposite 21 21
+             199:  190(ivec2) ConstantComposite 19 19
+             207:  190(ivec2) ConstantComposite 19 21
+             222:  190(ivec2) ConstantComposite 179 179
+             230:             TypeImage 6(float) 2D nonsampled format:R32f
+             231:             TypePointer UniformConstant 230
+   232(fimage2D):    231(ptr) Variable UniformConstant
+             268:             TypeImage 6(float) Rect nonsampled format:R32f
+             269:             TypePointer UniformConstant 268
+270(fimage2DRect):    269(ptr) Variable UniformConstant
+             306:             TypeImage 6(float) 2D array nonsampled format:R32f
+             307:             TypePointer UniformConstant 306
+308(fimage2DArray):    307(ptr) Variable UniformConstant
+             309:             TypeVector 18(int) 3
+             310:  309(ivec3) ConstantComposite 21 21 21
+             318:  309(ivec3) ConstantComposite 19 19 21
+             326:  309(ivec3) ConstantComposite 19 21 19
+             334:  309(ivec3) ConstantComposite 19 19 19
+             342:  309(ivec3) ConstantComposite 179 179 21
+             350:             TypeImage 6(float) Cube nonsampled format:R32f
+             351:             TypePointer UniformConstant 350
+ 352(fimageCube):    351(ptr) Variable UniformConstant
+             367:  309(ivec3) ConstantComposite 19 21 21
+             382:  309(ivec3) ConstantComposite 179 179 19
+             390:             TypeImage 6(float) Cube array nonsampled format:R32f
+             391:             TypePointer UniformConstant 390
+392(fimageCubeArray):    391(ptr) Variable UniformConstant
+             428:             TypeImage 6(float) 3D nonsampled format:R32f
+             429:             TypePointer UniformConstant 428
+   430(fimage3D):    429(ptr) Variable UniformConstant
+             466:             TypeVector 13(int) 3
+             467:     13(int) Constant 16
+             468:     13(int) Constant 1
+             469:  466(ivec3) ConstantComposite 467 467 468
+         4(main):           2 Function None 3
+               5:             Label
+      8(resultf):      7(ptr) Variable Function
+     34(resultd):     33(ptr) Variable Function
+                              Store 8(resultf) 9
+              16:    6(float) AtomicFAddEXT 11(atomf) 14 15 12
+                              Store 8(resultf) 16
+              23:    6(float) AtomicFAddEXT 11(atomf) 19 22 17
+                              Store 8(resultf) 23
+              29:     28(ptr) AccessChain 27(buf) 21
+              30:    6(float) AtomicFAddEXT 29 14 15 12
+                              Store 8(resultf) 30
+              31:     28(ptr) AccessChain 27(buf) 21
+              32:    6(float) AtomicFAddEXT 31 19 22 17
+                              Store 8(resultf) 32
+                              Store 34(resultd) 35
+              39:24(float64_t) AtomicFAddEXT 37(atomd) 14 15 38
+                              Store 34(resultd) 39
+              41:24(float64_t) AtomicFAddEXT 37(atomd) 19 22 40
+                              Store 34(resultd) 41
+              43:     42(ptr) AccessChain 27(buf) 19
+              44:24(float64_t) AtomicFAddEXT 43 14 15 38
+                              Store 34(resultd) 44
+              45:     42(ptr) AccessChain 27(buf) 19
+              46:24(float64_t) AtomicFAddEXT 45 19 22 40
+                              Store 34(resultd) 46
+              47:     28(ptr) AccessChain 27(buf) 21
+              48:    6(float) Load 8(resultf)
+              49:    6(float) AtomicExchange 47 14 15 48
+                              Store 8(resultf) 49
+              50:    6(float) Load 8(resultf)
+              51:     28(ptr) AccessChain 27(buf) 21
+              52:    6(float) Load 51
+              53:    6(float) FAdd 52 50
+              54:     28(ptr) AccessChain 27(buf) 21
+                              Store 54 53
+              55:     28(ptr) AccessChain 27(buf) 21
+              56:    6(float) Load 8(resultf)
+              59:    6(float) AtomicExchange 55 19 58 56
+                              Store 8(resultf) 59
+              60:    6(float) Load 8(resultf)
+              61:     28(ptr) AccessChain 27(buf) 21
+              62:    6(float) Load 61
+              63:    6(float) FAdd 62 60
+              64:     28(ptr) AccessChain 27(buf) 21
+                              Store 64 63
+              65:    6(float) Load 8(resultf)
+              66:    6(float) AtomicExchange 11(atomf) 14 15 65
+                              Store 8(resultf) 66
+              67:    6(float) Load 8(resultf)
+              68:     28(ptr) AccessChain 27(buf) 21
+              69:    6(float) Load 68
+              70:    6(float) FAdd 69 67
+              71:     28(ptr) AccessChain 27(buf) 21
+                              Store 71 70
+              72:    6(float) Load 8(resultf)
+              73:    6(float) AtomicExchange 11(atomf) 19 58 72
+                              Store 8(resultf) 73
+              74:    6(float) Load 8(resultf)
+              75:     28(ptr) AccessChain 27(buf) 21
+              76:    6(float) Load 75
+              77:    6(float) FAdd 76 74
+              78:     28(ptr) AccessChain 27(buf) 21
+                              Store 78 77
+              79:     42(ptr) AccessChain 27(buf) 19
+              80:24(float64_t) Load 34(resultd)
+              81:24(float64_t) AtomicExchange 79 14 15 80
+                              Store 34(resultd) 81
+              82:24(float64_t) Load 34(resultd)
+              83:     42(ptr) AccessChain 27(buf) 19
+              84:24(float64_t) Load 83
+              85:24(float64_t) FAdd 84 82
+              86:     42(ptr) AccessChain 27(buf) 19
+                              Store 86 85
+              87:     42(ptr) AccessChain 27(buf) 19
+              88:24(float64_t) Load 34(resultd)
+              89:24(float64_t) AtomicExchange 87 19 58 88
+                              Store 34(resultd) 89
+              90:24(float64_t) Load 34(resultd)
+              91:     42(ptr) AccessChain 27(buf) 19
+              92:24(float64_t) Load 91
+              93:24(float64_t) FAdd 92 90
+              94:     42(ptr) AccessChain 27(buf) 19
+                              Store 94 93
+              95:24(float64_t) Load 34(resultd)
+              96:24(float64_t) AtomicExchange 37(atomd) 14 15 95
+                              Store 34(resultd) 96
+              97:24(float64_t) Load 34(resultd)
+              98:     42(ptr) AccessChain 27(buf) 19
+              99:24(float64_t) Load 98
+             100:24(float64_t) FAdd 99 97
+             101:     42(ptr) AccessChain 27(buf) 19
+                              Store 101 100
+             102:24(float64_t) Load 34(resultd)
+             103:24(float64_t) AtomicExchange 37(atomd) 19 58 102
+                              Store 34(resultd) 103
+             104:24(float64_t) Load 34(resultd)
+             105:     42(ptr) AccessChain 27(buf) 19
+             106:24(float64_t) Load 105
+             107:24(float64_t) FAdd 106 104
+             108:     42(ptr) AccessChain 27(buf) 19
+                              Store 108 107
+             109:     28(ptr) AccessChain 27(buf) 21
+             110:    6(float) AtomicLoad 109 19 58
+                              Store 8(resultf) 110
+             111:     28(ptr) AccessChain 27(buf) 21
+             112:    6(float) Load 8(resultf)
+                              AtomicStore 111 19 58 112
+             113:    6(float) Load 8(resultf)
+             114:     28(ptr) AccessChain 27(buf) 21
+             115:    6(float) Load 114
+             116:    6(float) FAdd 115 113
+             117:     28(ptr) AccessChain 27(buf) 21
+                              Store 117 116
+             118:    6(float) AtomicLoad 11(atomf) 19 58
+                              Store 8(resultf) 118
+             119:    6(float) Load 8(resultf)
+                              AtomicStore 11(atomf) 19 58 119
+             120:    6(float) Load 8(resultf)
+             121:     28(ptr) AccessChain 27(buf) 21
+             122:    6(float) Load 121
+             123:    6(float) FAdd 122 120
+             124:     28(ptr) AccessChain 27(buf) 21
+                              Store 124 123
+             125:     42(ptr) AccessChain 27(buf) 19
+             126:24(float64_t) AtomicLoad 125 19 58
+                              Store 34(resultd) 126
+             127:     42(ptr) AccessChain 27(buf) 19
+             128:24(float64_t) Load 34(resultd)
+                              AtomicStore 127 19 58 128
+             129:24(float64_t) Load 34(resultd)
+             130:     42(ptr) AccessChain 27(buf) 19
+             131:24(float64_t) Load 130
+             132:24(float64_t) FAdd 131 129
+             133:     42(ptr) AccessChain 27(buf) 19
+                              Store 133 132
+             134:24(float64_t) AtomicLoad 37(atomd) 19 58
+                              Store 34(resultd) 134
+             135:24(float64_t) Load 34(resultd)
+                              AtomicStore 37(atomd) 19 58 135
+             136:24(float64_t) Load 34(resultd)
+             137:     42(ptr) AccessChain 27(buf) 19
+             138:24(float64_t) Load 137
+             139:24(float64_t) FAdd 138 136
+             140:     42(ptr) AccessChain 27(buf) 19
+                              Store 140 139
+             146:    145(ptr) ImageTexelPointer 143(fimage1D) 21 15
+             148:    6(float) AtomicFAddEXT 146 14 147 144
+                              Store 11(atomf) 148 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             150:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             151:     28(ptr) AccessChain 27(buf) 21
+             152:    6(float) Load 151
+             153:    6(float) FAdd 152 150
+             154:     28(ptr) AccessChain 27(buf) 21
+                              Store 154 153
+             156:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             158:    6(float) AtomicFAddEXT 156 19 157 12
+                              Store 11(atomf) 158 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             159:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             160:     28(ptr) AccessChain 27(buf) 21
+             161:    6(float) Load 160
+             162:    6(float) FAdd 161 159
+             163:     28(ptr) AccessChain 27(buf) 21
+                              Store 163 162
+             165:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             166:    6(float) AtomicExchange 165 19 157 164
+                              Store 11(atomf) 166 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             167:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             168:     28(ptr) AccessChain 27(buf) 21
+             169:    6(float) Load 168
+             170:    6(float) FAdd 169 167
+             171:     28(ptr) AccessChain 27(buf) 21
+                              Store 171 170
+             172:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             173:    6(float) AtomicLoad 172 19 157
+                              Store 11(atomf) 173 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             174:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             175:     28(ptr) AccessChain 27(buf) 21
+             176:    6(float) Load 175
+             177:    6(float) FAdd 176 174
+             178:     28(ptr) AccessChain 27(buf) 21
+                              Store 178 177
+             180:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             181:    145(ptr) ImageTexelPointer 143(fimage1D) 179 15
+                              AtomicStore 181 19 157 180
+             182:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             183:     28(ptr) AccessChain 27(buf) 21
+             184:    6(float) Load 183
+             185:    6(float) FAdd 184 182
+             186:     28(ptr) AccessChain 27(buf) 21
+                              Store 186 185
+             192:    145(ptr) ImageTexelPointer 189(fimage1DArray) 191 15
+             193:    6(float) AtomicFAddEXT 192 14 147 144
+                              Store 11(atomf) 193 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             194:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             195:     28(ptr) AccessChain 27(buf) 21
+             196:    6(float) Load 195
+             197:    6(float) FAdd 196 194
+             198:     28(ptr) AccessChain 27(buf) 21
+                              Store 198 197
+             200:    145(ptr) ImageTexelPointer 189(fimage1DArray) 199 15
+             201:    6(float) AtomicFAddEXT 200 19 157 12
+                              Store 11(atomf) 201 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             202:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             203:     28(ptr) AccessChain 27(buf) 21
+             204:    6(float) Load 203
+             205:    6(float) FAdd 204 202
+             206:     28(ptr) AccessChain 27(buf) 21
+                              Store 206 205
+             208:    145(ptr) ImageTexelPointer 189(fimage1DArray) 207 15
+             209:    6(float) AtomicExchange 208 19 157 164
+                              Store 11(atomf) 209 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             210:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             211:     28(ptr) AccessChain 27(buf) 21
+             212:    6(float) Load 211
+             213:    6(float) FAdd 212 210
+             214:     28(ptr) AccessChain 27(buf) 21
+                              Store 214 213
+             215:    145(ptr) ImageTexelPointer 189(fimage1DArray) 199 15
+             216:    6(float) AtomicLoad 215 19 157
+                              Store 11(atomf) 216 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             217:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             218:     28(ptr) AccessChain 27(buf) 21
+             219:    6(float) Load 218
+             220:    6(float) FAdd 219 217
+             221:     28(ptr) AccessChain 27(buf) 21
+                              Store 221 220
+             223:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             224:    145(ptr) ImageTexelPointer 189(fimage1DArray) 222 15
+                              AtomicStore 224 19 157 223
+             225:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             226:     28(ptr) AccessChain 27(buf) 21
+             227:    6(float) Load 226
+             228:    6(float) FAdd 227 225
+             229:     28(ptr) AccessChain 27(buf) 21
+                              Store 229 228
+             233:    145(ptr) ImageTexelPointer 232(fimage2D) 191 15
+             234:    6(float) AtomicFAddEXT 233 14 147 144
+                              Store 11(atomf) 234 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             235:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             236:     28(ptr) AccessChain 27(buf) 21
+             237:    6(float) Load 236
+             238:    6(float) FAdd 237 235
+             239:     28(ptr) AccessChain 27(buf) 21
+                              Store 239 238
+             240:    145(ptr) ImageTexelPointer 232(fimage2D) 199 15
+             241:    6(float) AtomicFAddEXT 240 19 157 12
+                              Store 11(atomf) 241 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             242:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             243:     28(ptr) AccessChain 27(buf) 21
+             244:    6(float) Load 243
+             245:    6(float) FAdd 244 242
+             246:     28(ptr) AccessChain 27(buf) 21
+                              Store 246 245
+             247:    145(ptr) ImageTexelPointer 232(fimage2D) 207 15
+             248:    6(float) AtomicExchange 247 19 157 164
+                              Store 11(atomf) 248 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             249:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             250:     28(ptr) AccessChain 27(buf) 21
+             251:    6(float) Load 250
+             252:    6(float) FAdd 251 249
+             253:     28(ptr) AccessChain 27(buf) 21
+                              Store 253 252
+             254:    145(ptr) ImageTexelPointer 232(fimage2D) 199 15
+             255:    6(float) AtomicLoad 254 19 157
+                              Store 11(atomf) 255 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             256:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             257:     28(ptr) AccessChain 27(buf) 21
+             258:    6(float) Load 257
+             259:    6(float) FAdd 258 256
+             260:     28(ptr) AccessChain 27(buf) 21
+                              Store 260 259
+             261:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             262:    145(ptr) ImageTexelPointer 232(fimage2D) 222 15
+                              AtomicStore 262 19 157 261
+             263:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             264:     28(ptr) AccessChain 27(buf) 21
+             265:    6(float) Load 264
+             266:    6(float) FAdd 265 263
+             267:     28(ptr) AccessChain 27(buf) 21
+                              Store 267 266
+             271:    145(ptr) ImageTexelPointer 270(fimage2DRect) 191 15
+             272:    6(float) AtomicFAddEXT 271 14 147 144
+                              Store 11(atomf) 272 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             273:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             274:     28(ptr) AccessChain 27(buf) 21
+             275:    6(float) Load 274
+             276:    6(float) FAdd 275 273
+             277:     28(ptr) AccessChain 27(buf) 21
+                              Store 277 276
+             278:    145(ptr) ImageTexelPointer 270(fimage2DRect) 199 15
+             279:    6(float) AtomicFAddEXT 278 19 157 12
+                              Store 11(atomf) 279 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             280:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             281:     28(ptr) AccessChain 27(buf) 21
+             282:    6(float) Load 281
+             283:    6(float) FAdd 282 280
+             284:     28(ptr) AccessChain 27(buf) 21
+                              Store 284 283
+             285:    145(ptr) ImageTexelPointer 270(fimage2DRect) 207 15
+             286:    6(float) AtomicExchange 285 19 157 164
+                              Store 11(atomf) 286 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             287:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             288:     28(ptr) AccessChain 27(buf) 21
+             289:    6(float) Load 288
+             290:    6(float) FAdd 289 287
+             291:     28(ptr) AccessChain 27(buf) 21
+                              Store 291 290
+             292:    145(ptr) ImageTexelPointer 270(fimage2DRect) 199 15
+             293:    6(float) AtomicLoad 292 19 157
+                              Store 11(atomf) 293 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             294:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             295:     28(ptr) AccessChain 27(buf) 21
+             296:    6(float) Load 295
+             297:    6(float) FAdd 296 294
+             298:     28(ptr) AccessChain 27(buf) 21
+                              Store 298 297
+             299:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             300:    145(ptr) ImageTexelPointer 270(fimage2DRect) 222 15
+                              AtomicStore 300 19 157 299
+             301:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             302:     28(ptr) AccessChain 27(buf) 21
+             303:    6(float) Load 302
+             304:    6(float) FAdd 303 301
+             305:     28(ptr) AccessChain 27(buf) 21
+                              Store 305 304
+             311:    145(ptr) ImageTexelPointer 308(fimage2DArray) 310 15
+             312:    6(float) AtomicFAddEXT 311 14 147 144
+                              Store 11(atomf) 312 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             313:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             314:     28(ptr) AccessChain 27(buf) 21
+             315:    6(float) Load 314
+             316:    6(float) FAdd 315 313
+             317:     28(ptr) AccessChain 27(buf) 21
+                              Store 317 316
+             319:    145(ptr) ImageTexelPointer 308(fimage2DArray) 318 15
+             320:    6(float) AtomicFAddEXT 319 19 157 12
+                              Store 11(atomf) 320 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             321:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             322:     28(ptr) AccessChain 27(buf) 21
+             323:    6(float) Load 322
+             324:    6(float) FAdd 323 321
+             325:     28(ptr) AccessChain 27(buf) 21
+                              Store 325 324
+             327:    145(ptr) ImageTexelPointer 308(fimage2DArray) 326 15
+             328:    6(float) AtomicExchange 327 19 157 164
+                              Store 11(atomf) 328 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             329:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             330:     28(ptr) AccessChain 27(buf) 21
+             331:    6(float) Load 330
+             332:    6(float) FAdd 331 329
+             333:     28(ptr) AccessChain 27(buf) 21
+                              Store 333 332
+             335:    145(ptr) ImageTexelPointer 308(fimage2DArray) 334 15
+             336:    6(float) AtomicLoad 335 19 157
+                              Store 11(atomf) 336 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             337:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             338:     28(ptr) AccessChain 27(buf) 21
+             339:    6(float) Load 338
+             340:    6(float) FAdd 339 337
+             341:     28(ptr) AccessChain 27(buf) 21
+                              Store 341 340
+             343:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             344:    145(ptr) ImageTexelPointer 308(fimage2DArray) 342 15
+                              AtomicStore 344 19 157 343
+             345:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             346:     28(ptr) AccessChain 27(buf) 21
+             347:    6(float) Load 346
+             348:    6(float) FAdd 347 345
+             349:     28(ptr) AccessChain 27(buf) 21
+                              Store 349 348
+             353:    145(ptr) ImageTexelPointer 352(fimageCube) 310 15
+             354:    6(float) AtomicFAddEXT 353 14 147 144
+                              Store 11(atomf) 354 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             355:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             356:     28(ptr) AccessChain 27(buf) 21
+             357:    6(float) Load 356
+             358:    6(float) FAdd 357 355
+             359:     28(ptr) AccessChain 27(buf) 21
+                              Store 359 358
+             360:    145(ptr) ImageTexelPointer 352(fimageCube) 318 15
+             361:    6(float) AtomicFAddEXT 360 19 157 12
+                              Store 11(atomf) 361 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             362:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             363:     28(ptr) AccessChain 27(buf) 21
+             364:    6(float) Load 363
+             365:    6(float) FAdd 364 362
+             366:     28(ptr) AccessChain 27(buf) 21
+                              Store 366 365
+             368:    145(ptr) ImageTexelPointer 352(fimageCube) 367 15
+             369:    6(float) AtomicExchange 368 19 157 164
+                              Store 11(atomf) 369 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             370:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             371:     28(ptr) AccessChain 27(buf) 21
+             372:    6(float) Load 371
+             373:    6(float) FAdd 372 370
+             374:     28(ptr) AccessChain 27(buf) 21
+                              Store 374 373
+             375:    145(ptr) ImageTexelPointer 352(fimageCube) 334 15
+             376:    6(float) AtomicLoad 375 19 157
+                              Store 11(atomf) 376 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             377:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             378:     28(ptr) AccessChain 27(buf) 21
+             379:    6(float) Load 378
+             380:    6(float) FAdd 379 377
+             381:     28(ptr) AccessChain 27(buf) 21
+                              Store 381 380
+             383:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             384:    145(ptr) ImageTexelPointer 352(fimageCube) 382 15
+                              AtomicStore 384 19 157 383
+             385:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             386:     28(ptr) AccessChain 27(buf) 21
+             387:    6(float) Load 386
+             388:    6(float) FAdd 387 385
+             389:     28(ptr) AccessChain 27(buf) 21
+                              Store 389 388
+             393:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 310 15
+             394:    6(float) AtomicFAddEXT 393 14 147 144
+                              Store 11(atomf) 394 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             395:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             396:     28(ptr) AccessChain 27(buf) 21
+             397:    6(float) Load 396
+             398:    6(float) FAdd 397 395
+             399:     28(ptr) AccessChain 27(buf) 21
+                              Store 399 398
+             400:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 318 15
+             401:    6(float) AtomicFAddEXT 400 19 157 12
+                              Store 11(atomf) 401 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             402:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             403:     28(ptr) AccessChain 27(buf) 21
+             404:    6(float) Load 403
+             405:    6(float) FAdd 404 402
+             406:     28(ptr) AccessChain 27(buf) 21
+                              Store 406 405
+             407:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 326 15
+             408:    6(float) AtomicExchange 407 19 157 164
+                              Store 11(atomf) 408 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             409:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             410:     28(ptr) AccessChain 27(buf) 21
+             411:    6(float) Load 410
+             412:    6(float) FAdd 411 409
+             413:     28(ptr) AccessChain 27(buf) 21
+                              Store 413 412
+             414:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 334 15
+             415:    6(float) AtomicLoad 414 19 157
+                              Store 11(atomf) 415 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             416:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             417:     28(ptr) AccessChain 27(buf) 21
+             418:    6(float) Load 417
+             419:    6(float) FAdd 418 416
+             420:     28(ptr) AccessChain 27(buf) 21
+                              Store 420 419
+             421:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             422:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 342 15
+                              AtomicStore 422 19 157 421
+             423:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             424:     28(ptr) AccessChain 27(buf) 21
+             425:    6(float) Load 424
+             426:    6(float) FAdd 425 423
+             427:     28(ptr) AccessChain 27(buf) 21
+                              Store 427 426
+             431:    145(ptr) ImageTexelPointer 430(fimage3D) 310 15
+             432:    6(float) AtomicFAddEXT 431 14 147 144
+                              Store 11(atomf) 432 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             433:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             434:     28(ptr) AccessChain 27(buf) 21
+             435:    6(float) Load 434
+             436:    6(float) FAdd 435 433
+             437:     28(ptr) AccessChain 27(buf) 21
+                              Store 437 436
+             438:    145(ptr) ImageTexelPointer 430(fimage3D) 318 15
+             439:    6(float) AtomicFAddEXT 438 19 157 12
+                              Store 11(atomf) 439 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             440:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             441:     28(ptr) AccessChain 27(buf) 21
+             442:    6(float) Load 441
+             443:    6(float) FAdd 442 440
+             444:     28(ptr) AccessChain 27(buf) 21
+                              Store 444 443
+             445:    145(ptr) ImageTexelPointer 430(fimage3D) 326 15
+             446:    6(float) AtomicExchange 445 19 157 164
+                              Store 11(atomf) 446 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             447:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             448:     28(ptr) AccessChain 27(buf) 21
+             449:    6(float) Load 448
+             450:    6(float) FAdd 449 447
+             451:     28(ptr) AccessChain 27(buf) 21
+                              Store 451 450
+             452:    145(ptr) ImageTexelPointer 430(fimage3D) 334 15
+             453:    6(float) AtomicLoad 452 19 157
+                              Store 11(atomf) 453 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             454:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             455:     28(ptr) AccessChain 27(buf) 21
+             456:    6(float) Load 455
+             457:    6(float) FAdd 456 454
+             458:     28(ptr) AccessChain 27(buf) 21
+                              Store 458 457
+             459:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             460:    145(ptr) ImageTexelPointer 430(fimage3D) 342 15
+                              AtomicStore 460 19 157 459
+             461:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             462:     28(ptr) AccessChain 27(buf) 21
+             463:    6(float) Load 462
+             464:    6(float) FAdd 463 461
+             465:     28(ptr) AccessChain 27(buf) 21
+                              Store 465 464
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.atomicFloat_Error.comp.out b/Test/baseResults/spv.atomicFloat_Error.comp.out
new file mode 100755
index 0000000..e00ed19
--- /dev/null
+++ b/Test/baseResults/spv.atomicFloat_Error.comp.out
@@ -0,0 +1,57 @@
+spv.atomicFloat_Error.comp
+ERROR: 0:25: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:26: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:27: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:28: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:31: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:32: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:33: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:34: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:37: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:38: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:39: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:40: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:43: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:44: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:45: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:46: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:50: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:51: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:52: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:53: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:56: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:57: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:58: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:59: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:63: 'imageAtomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:64: 'imageAtomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:66: 'imageAtomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:67: 'imageAtomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:80: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:81: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:82: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:83: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:86: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:87: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:88: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:89: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:90: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:91: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:95: 'atomicLoad' : no matching overloaded function found 
+ERROR: 0:96: 'atomicStore' : no matching overloaded function found 
+ERROR: 0:99: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:100: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:101: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:102: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:103: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:104: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:105: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:106: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:107: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:108: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 0:109: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 0:110: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 52 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/spv.atomicFloat.comp b/Test/spv.atomicFloat.comp
new file mode 100755
index 0000000..2022734
--- /dev/null
+++ b/Test/spv.atomicFloat.comp
@@ -0,0 +1,197 @@
+#version 450 core
+
+#extension GL_KHR_memory_scope_semantics : enable
+#extension GL_EXT_shader_atomic_float: enable
+#pragma use_vulkan_memory_model
+
+layout(local_size_x = 16, local_size_y = 16) in;
+
+layout(binding = 0) buffer Buffer
+{
+    float dataf;
+    double datad;
+} buf;
+
+shared float  atomf;
+shared double atomd;
+
+layout(binding = 0, r32f) volatile coherent uniform image1D        fimage1D;
+layout(binding = 1, r32f) volatile coherent uniform image1DArray   fimage1DArray;
+layout(binding = 2, r32f) volatile coherent uniform image2D        fimage2D;
+layout(binding = 3, r32f) volatile coherent uniform image2DArray   fimage2DArray;
+layout(binding = 4, r32f) volatile coherent uniform image2DRect    fimage2DRect;
+layout(binding = 5, r32f) volatile coherent uniform imageCube      fimageCube;
+layout(binding = 6, r32f) volatile coherent uniform imageCubeArray fimageCubeArray;
+layout(binding = 9, r32f) volatile coherent uniform image3D        fimage3D;
+
+void main()
+{
+    //atomicAdd
+    float resultf = 0;
+    resultf = atomicAdd(atomf, 3.0);
+    resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(buf.dataf, 3.0);
+    resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    double resultd = 0;
+    resultd = atomicAdd(atomd, 3.0);
+    resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultd = atomicAdd(buf.datad, 3.0);
+    resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.dataf, resultf);
+    buf.dataf += resultf;
+    resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+    resultf = atomicExchange(atomf, resultf);
+    buf.dataf += resultf;
+    resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicExchange(buf.datad, resultd);
+    buf.datad += resultd;
+    resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+    resultd = atomicExchange(atomd, resultd);
+    buf.datad += resultd;
+    resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    // image atomics on 1D:
+    atomf = imageAtomicAdd(fimage1D, int(0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage1D, int(1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage1D, int(1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage1D, int(2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 1D Array:
+    atomf = imageAtomicAdd(fimage1DArray, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage1DArray, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage1DArray, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage1DArray, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D:
+    atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D Rect:
+    atomf = imageAtomicAdd(fimage2DRect, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2DRect, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2DRect, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2DRect, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D Array:
+    atomf = imageAtomicAdd(fimage2DArray, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2DArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2DArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2DArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on Cube:
+    atomf = imageAtomicAdd(fimageCube, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimageCube, ivec3(1,0,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimageCube, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimageCube, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on Cube Array:
+    atomf = imageAtomicAdd(fimageCubeArray, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimageCubeArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimageCubeArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimageCubeArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 3D:
+    atomf = imageAtomicAdd(fimage3D, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage3D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage3D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage3D, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
\ No newline at end of file
diff --git a/Test/spv.atomicFloat_Error.comp b/Test/spv.atomicFloat_Error.comp
new file mode 100755
index 0000000..b90b97f
--- /dev/null
+++ b/Test/spv.atomicFloat_Error.comp
@@ -0,0 +1,112 @@
+#version 450 core
+#extension GL_KHR_memory_scope_semantics : enable
+#pragma use_vulkan_memory_model
+
+layout(local_size_x = 16, local_size_y = 16) in;
+
+layout(binding = 0) buffer Buffer
+{
+    int    datai;
+    float  dataf;
+    double datad;
+} buf;
+
+shared int    atomi;
+shared float  atomf;
+shared double atomd;
+
+layout(binding = 0, r32f) volatile coherent uniform image1D fimage1D;
+layout(binding = 1, r32f) volatile coherent uniform image2D fimage2D;
+
+void undeclared_errors()
+{
+    //atomicAdd
+    float resultf = 0;
+    resultf = atomicAdd(atomf, 3.0);
+    resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(buf.dataf, 3.0);
+    resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    double resultd = 0;
+    resultd = atomicAdd(atomd, 3.0);
+    resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultd = atomicAdd(buf.datad, 3.0);
+    resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.dataf, resultf);
+    resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(atomf, resultf);
+    resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicExchange(buf.datad, resultd);
+    resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultd = atomicExchange(atomd, resultd);
+    resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    // image atomics:
+    atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
+
+#extension GL_EXT_shader_atomic_float: enable
+
+void main()
+{
+    float resultf = 0;
+    double resultd = 0;
+    int resulti = 0;
+
+    //atomicAdd
+    resultf = atomicAdd(atomi);
+    resultf = atomicAdd(atomi, 3.0);
+    resultf = atomicAdd(atomi, resultf, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(atomi, resultf, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.datai);
+    resultf = atomicExchange(buf.datai, resultf);
+    resultf = atomicExchange(buf.datai, resultf, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(buf.datai, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(atomi, resultf);
+    resultf = atomicExchange(atomi, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.datai, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datai, resulti, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+
+    // image atomics:
+    atomf = imageAtomicAdd(fimage1D, ivec2(0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, ivec3(0,0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, 2.0);
+    atomf = imageAtomicExchange(fimage1D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage1D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage1D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
\ No newline at end of file
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 78eacac..2a121b2 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1241,11 +1241,19 @@
             " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t);"
             "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
             " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+            "   float atomicAdd(coherent volatile inout float, float);"
+            "   float atomicAdd(coherent volatile inout float, float, int, int, int);"
+            "  double atomicAdd(coherent volatile inout double, double);"
+            "  double atomicAdd(coherent volatile inout double, double, int, int, int);"
 
             "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t);"
             " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t);"
             "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t, int, int, int);"
             " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+            "   float atomicExchange(coherent volatile inout float, float);"
+            "   float atomicExchange(coherent volatile inout float, float, int, int, int);"
+            "  double atomicExchange(coherent volatile inout double, double);"
+            "  double atomicExchange(coherent volatile inout double, double, int, int, int);"
 
             "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t);"
             " int64_t atomicCompSwap(coherent volatile inout  int64_t,  int64_t,  int64_t);"
@@ -1254,9 +1262,13 @@
 
             "uint64_t atomicLoad(coherent volatile in uint64_t, int, int, int);"
             " int64_t atomicLoad(coherent volatile in  int64_t, int, int, int);"
+            "   float atomicLoad(coherent volatile in float, int, int, int);"
+            "  double atomicLoad(coherent volatile in double, int, int, int);"
 
             "void atomicStore(coherent volatile out uint64_t, uint64_t, int, int, int);"
             "void atomicStore(coherent volatile out  int64_t,  int64_t, int, int, int);"
+            "void atomicStore(coherent volatile out float, float, int, int, int);"
+            "void atomicStore(coherent volatile out double, double, int, int, int);"
             "\n");
     }
 #endif
@@ -6013,12 +6025,39 @@
             // not int or uint
             // GL_ARB_ES3_1_compatibility
             // TODO: spec issue: are there restrictions on the kind of layout() that can be used?  what about dropping memory qualifiers?
-            if ((profile != EEsProfile && version >= 450) ||
-                (profile == EEsProfile && version >= 310)) {
+            if (profile == EEsProfile && version >= 310) {
                 commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
                 commonBuiltins.append(imageParams);
                 commonBuiltins.append(", float);\n");
             }
+            if (profile != EEsProfile && version >= 450) {
+                commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float);\n");
+
+                commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float);\n");
+
+                commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("float imageAtomicLoad(readonly volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("void imageAtomicStore(writeonly volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+            }
         }
     }
 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 3d0f329..c2e7021 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -2110,7 +2110,14 @@
             if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui)
                 error(loc, "only supported on image with format r32i or r32ui", fnCandidate.getName().c_str(), "");
         } else {
-            if (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") != 0)
+            bool isImageAtomicOnFloatAllowed = ((fnCandidate.getName().compare(0, 14, "imageAtomicAdd") == 0) ||
+                (fnCandidate.getName().compare(0, 15, "imageAtomicLoad") == 0) ||
+                (fnCandidate.getName().compare(0, 16, "imageAtomicStore") == 0) ||
+                (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") == 0));
+            if (imageType.getSampler().type == EbtFloat && isImageAtomicOnFloatAllowed &&
+                (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") != 0)) // imageAtomicExchange doesn't require GL_EXT_shader_atomic_float
+                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
+            if (!isImageAtomicOnFloatAllowed)
                 error(loc, "only supported on integer images", fnCandidate.getName().c_str(), "");
             else if (imageType.getQualifier().getFormat() != ElfR32f && isEsProfile())
                 error(loc, "only supported on image with format r32f", fnCandidate.getName().c_str(), "");
@@ -2139,10 +2146,18 @@
         if (argp->size() > 3) {
             requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());
             memorySemanticsCheck(loc, fnCandidate, callNode);
+            if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||
+                callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpAtomicStore) &&
+                (arg0->getType().isFloatingDomain())) {
+                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
+            }
         } else if (arg0->getType().getBasicType() == EbtInt64 || arg0->getType().getBasicType() == EbtUint64) {
             const char* const extensions[2] = { E_GL_NV_shader_atomic_int64,
                                                 E_GL_EXT_shader_atomic_int64 };
             requireExtensions(loc, 2, extensions, fnCandidate.getName().c_str());
+        } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange) &&
+                   (arg0->getType().isFloatingDomain())) {
+            requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
         }
         break;
     }
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 3bf140c..b311024 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -347,6 +347,7 @@
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int16]   = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int64]   = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_float16] = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_atomic_float]                    = EBhDisable;
 }
 
 #endif // GLSLANG_WEB
@@ -520,6 +521,8 @@
             "#define GL_EXT_shader_subgroup_extended_types_int16 1\n"
             "#define GL_EXT_shader_subgroup_extended_types_int64 1\n"
             "#define GL_EXT_shader_subgroup_extended_types_float16 1\n"
+
+            "#define GL_EXT_shader_atomic_float 1\n"
             ;
 
         if (version >= 150) {
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index c90db96..f52f605 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -298,6 +298,8 @@
 const char* const E_GL_EXT_shader_subgroup_extended_types_int64   = "GL_EXT_shader_subgroup_extended_types_int64";
 const char* const E_GL_EXT_shader_subgroup_extended_types_float16 = "GL_EXT_shader_subgroup_extended_types_float16";
 
+const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float";
+
 // Arrays of extensions for the above AEP duplications
 
 const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader };
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 714ef3c..af1409b 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -603,6 +603,8 @@
         "spv.460.vert",
         "spv.460.comp",
         "spv.atomic.comp",
+        "spv.atomicFloat.comp",
+        "spv.atomicFloat_Error.comp",
         "spv.glFragColor.frag",
         "spv.rankShift.comp",
         "spv.specConst.vert",
diff --git a/known_good.json b/known_good.json
index 9b87464..2801524 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "a1fb255a2a6856bba1e5a8486469ac93fca518c2"
+      "commit" : "e4aebf99fa14f2cd00026a56b21f7a0cf9940bbd"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "ac638f1815425403e946d0ab78bac71d2bdbf3be"
+      "commit" : "979924c8bc839e4cb1b69d03d48398551f369ce7"
     }
   ]
 }