callc (sm4 - asm)

Conditionally calls a subroutine marked by where the label l# appears in the program.

callc{_z|_nz} src0.select_component, l#




[in] The component on which to test the condition.


[in] The label of the subroutine.



When a ret is encountered, return execution to the instruction after this call.

The token format contains the offset of the corresponding label in the Shader as a convenience.

The following example shows the call instruction.

                callc_z  r1.y, l3 // if all bits in r0.x are 0, call l3
                callc_nz r2.z, l3 // if any bit in r0.x is nonzero, call l3
                label l3
                    retc_nz r0.x


  • Subroutines can nest 32 deep.
  • The return address stack is managed transparently by the implementation.
  • If there are already 32 entries on the return address stack and a call is issued, the call is skipped over.
  • There is no automatic parameter stack. The application can use an indexable temporary register array (x#[]) to manually implement a stack. However, the subroutine call return addresses are not visible and are orthogonal to any manual stack management done by the application.
  • Indexing of the l# parameter is not permitted.
  • The 32-bit register supplied by src0 is tested at a bit level. If any bit is nonzero, callc_nz will perform the call. If all bits are zero, callc_z will perform the call.
  • Recursion is not permitted.

This instruction applies to the following shader stages:

Vertex ShaderGeometry ShaderPixel Shader


Minimum Shader Model

This function is supported in the following shader models.

Shader ModelSupported
Shader Model 5 yes
Shader Model 4.1 yes
Shader Model 4 yes
Shader Model 3 (DirectX HLSL) no
Shader Model 2 (DirectX HLSL) no
Shader Model 1 (DirectX HLSL) no


Related topics

Shader Model 4 Assembly (DirectX HLSL)