diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp
index 897b4fd09..b37d80323 100644
--- a/src/dxbc/dxbc_compiler.cpp
+++ b/src/dxbc/dxbc_compiler.cpp
@@ -62,6 +62,9 @@ namespace dxvk {
       case DxbcOpcode::Dp4:
         return this->opDpx(ins, 4);
       
+      case DxbcOpcode::Rsq:
+        return this->opRsq(ins);
+      
       case DxbcOpcode::Ret:
         return this->opRet(ins);
       
@@ -262,6 +265,17 @@ namespace dxvk {
   }
   
   
+  void DxbcCompiler::opRsq(const DxbcInstruction& ins) {
+    auto dstOp = ins.operand(0);
+    auto srcOp = ins.operand(dstOp.length());
+    DxbcComponentMask mask = this->getDstOperandMask(dstOp);
+    
+    DxbcValue src = this->loadOperand(srcOp, mask, DxbcScalarType::Float32);
+    DxbcValue val = m_gen->opRsqrt(src);
+              val = this->applyResultModifiers(val, ins.token().control());
+    this->storeOperand(dstOp, val, mask);
+  }
+  
   void DxbcCompiler::opMov(const DxbcInstruction& ins) {
     auto dstOp = ins.operand(0);
     auto srcOp = ins.operand(dstOp.length());
diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h
index 807c22e9e..fa6278a7c 100644
--- a/src/dxbc/dxbc_compiler.h
+++ b/src/dxbc/dxbc_compiler.h
@@ -57,6 +57,9 @@ namespace dxvk {
       const DxbcInstruction&  ins,
             uint32_t          n);
     
+    void opRsq(
+      const DxbcInstruction&  ins);
+    
     void opMov(
       const DxbcInstruction&  ins);
     
diff --git a/src/dxbc/gen/dxbc_gen_common.cpp b/src/dxbc/gen/dxbc_gen_common.cpp
index 0dfcdea80..b07d041da 100644
--- a/src/dxbc/gen/dxbc_gen_common.cpp
+++ b/src/dxbc/gen/dxbc_gen_common.cpp
@@ -354,6 +354,16 @@ namespace dxvk {
   }
   
   
+  DxbcValue DxbcCodeGen::opRsqrt(const DxbcValue& src) {
+    DxbcValue result;
+    result.type    = src.type;
+    result.valueId = m_module.opInverseSqrt(
+      this->defValueType(result.type),
+      src.valueId);
+    return result;
+  }
+  
+  
   DxbcValue DxbcCodeGen::opNeg(const DxbcValue& src) {
     DxbcValue result;
     result.type = src.type;
diff --git a/src/dxbc/gen/dxbc_gen_common.h b/src/dxbc/gen/dxbc_gen_common.h
index ce6af4a56..bedccaa42 100644
--- a/src/dxbc/gen/dxbc_gen_common.h
+++ b/src/dxbc/gen/dxbc_gen_common.h
@@ -118,6 +118,9 @@ namespace dxvk {
       const DxbcValue&            a,
       const DxbcValue&            b);
     
+    DxbcValue opRsqrt(
+      const DxbcValue&            src);
+    
     DxbcValue opNeg(
       const DxbcValue&            src);
     
diff --git a/src/spirv/spirv_module.cpp b/src/spirv/spirv_module.cpp
index 496388134..b3137f3f8 100644
--- a/src/spirv/spirv_module.cpp
+++ b/src/spirv/spirv_module.cpp
@@ -786,6 +786,21 @@ namespace dxvk {
   }
   
   
+  uint32_t SpirvModule::opInverseSqrt(
+          uint32_t                resultType,
+          uint32_t                x) {
+    uint32_t resultId = this->allocateId();
+    
+    m_code.putIns (spv::OpExtInst, 6);
+    m_code.putWord(resultType);
+    m_code.putWord(resultId);
+    m_code.putWord(m_instExtGlsl450);
+    m_code.putWord(spv::GLSLstd450InverseSqrt);
+    m_code.putWord(x);
+    return resultId;
+  }
+  
+  
   uint32_t SpirvModule::opFunctionCall(
           uint32_t                resultType,
           uint32_t                functionId,
diff --git a/src/spirv/spirv_module.h b/src/spirv/spirv_module.h
index 14eebaadc..76072c937 100644
--- a/src/spirv/spirv_module.h
+++ b/src/spirv/spirv_module.h
@@ -281,6 +281,10 @@ namespace dxvk {
             uint32_t                vector1,
             uint32_t                vector2);
     
+    uint32_t opInverseSqrt(
+            uint32_t                resultType,
+            uint32_t                x);
+    
     uint32_t opFunctionCall(
             uint32_t                resultType,
             uint32_t                functionId,