@@ -8287,25 +8287,6 @@ SpirvEmitter::processIntrinsicCallExpr(const CallExpr *callExpr) {
8287
8287
srcLoc, srcRange); \
8288
8288
} break
8289
8289
8290
- #define INTRINSIC_OP_CASE_SINT_UINT(intrinsicOp, glslSintOp, glslUintOp, \
8291
- doEachVec) \
8292
- case hlsl::IntrinsicOp::IOP_##intrinsicOp: { \
8293
- glslOpcode = isSintType ? GLSLstd450::GLSLstd450##glslSintOp \
8294
- : GLSLstd450::GLSLstd450##glslUintOp; \
8295
- retVal = processIntrinsicUsingGLSLInst(callExpr, glslOpcode, doEachVec, \
8296
- srcLoc, srcRange); \
8297
- } break
8298
-
8299
- #define INTRINSIC_OP_CASE_SINT_UINT_FLOAT(intrinsicOp, glslSintOp, glslUintOp, \
8300
- glslFloatOp, doEachVec) \
8301
- case hlsl::IntrinsicOp::IOP_##intrinsicOp: { \
8302
- glslOpcode = isFloatType ? GLSLstd450::GLSLstd450##glslFloatOp \
8303
- : isSintType ? GLSLstd450::GLSLstd450##glslSintOp \
8304
- : GLSLstd450::GLSLstd450##glslUintOp; \
8305
- retVal = processIntrinsicUsingGLSLInst(callExpr, glslOpcode, doEachVec, \
8306
- srcLoc, srcRange); \
8307
- } break
8308
-
8309
8290
switch (const auto hlslOpcode = static_cast<hlsl::IntrinsicOp>(opcode)) {
8310
8291
case hlsl::IntrinsicOp::IOP_InterlockedAdd:
8311
8292
case hlsl::IntrinsicOp::IOP_InterlockedAnd:
@@ -8713,6 +8694,35 @@ SpirvEmitter::processIntrinsicCallExpr(const CallExpr *callExpr) {
8713
8694
srcRange);
8714
8695
break;
8715
8696
}
8697
+ case hlsl::IntrinsicOp::IOP_ufirstbithigh:
8698
+ case hlsl::IntrinsicOp::IOP_firstbithigh: {
8699
+ const QualType argType = callExpr->getArg(0)->getType();
8700
+ if (astContext.getTypeSize(argType) == 64) {
8701
+ emitError("%0 is currently limited to 32-bit width components when "
8702
+ "targetting SPIR-V",
8703
+ srcLoc)
8704
+ << getFunctionOrOperatorName(callee, true);
8705
+ return 0;
8706
+ }
8707
+
8708
+ glslOpcode = isSintType ? GLSLstd450::GLSLstd450FindSMsb
8709
+ : GLSLstd450::GLSLstd450FindUMsb;
8710
+ retVal = processIntrinsicUsingGLSLInst(callExpr, glslOpcode, false, srcLoc,
8711
+ srcRange);
8712
+ } break;
8713
+ case hlsl::IntrinsicOp::IOP_firstbitlow: {
8714
+ const QualType argType = callExpr->getArg(0)->getType();
8715
+ if (astContext.getTypeSize(argType) == 64) {
8716
+ emitError("%0 is currently limited to 32-bit width components when "
8717
+ "targetting SPIR-V",
8718
+ srcLoc)
8719
+ << getFunctionOrOperatorName(callee, true);
8720
+ return 0;
8721
+ }
8722
+ glslOpcode = GLSLstd450::GLSLstd450FindILsb;
8723
+ retVal = processIntrinsicUsingGLSLInst(callExpr, glslOpcode, false, srcLoc,
8724
+ srcRange);
8725
+ } break;
8716
8726
INTRINSIC_SPIRV_OP_CASE(ddx, DPdx, true);
8717
8727
INTRINSIC_SPIRV_OP_CASE(ddx_coarse, DPdxCoarse, false);
8718
8728
INTRINSIC_SPIRV_OP_CASE(ddx_fine, DPdxFine, false);
@@ -8743,10 +8753,7 @@ SpirvEmitter::processIntrinsicCallExpr(const CallExpr *callExpr) {
8743
8753
INTRINSIC_OP_CASE(determinant, Determinant, false);
8744
8754
INTRINSIC_OP_CASE(exp, Exp, true);
8745
8755
INTRINSIC_OP_CASE(exp2, Exp2, true);
8746
- INTRINSIC_OP_CASE_SINT_UINT(firstbithigh, FindSMsb, FindUMsb, false);
8747
- INTRINSIC_OP_CASE_SINT_UINT(ufirstbithigh, FindSMsb, FindUMsb, false);
8748
8756
INTRINSIC_OP_CASE(faceforward, FaceForward, false);
8749
- INTRINSIC_OP_CASE(firstbitlow, FindILsb, false);
8750
8757
INTRINSIC_OP_CASE(floor, Floor, true);
8751
8758
INTRINSIC_OP_CASE(fma, Fma, true);
8752
8759
INTRINSIC_OP_CASE(frac, Fract, true);
0 commit comments