cvt.pack GPU Virtual ISA NVIDIA

cvt.pack Data Movement and Conversion Instructions

cvt.pack.sat.convertType.abType d, a, b;

Convert two 32-bit integers a and b into specified type and pack the results into d.

Encoding

PTX is a virtual instruction set. It has no single, stable native binary encoding - the compiler lowers this instruction to different native machine code depending on the selected NVIDIA target architecture (compute capability). This page intentionally shows no bit-diagram; see the target/version requirements below for what governs how this instruction compiles.
PTX ISA Version Introduced PTX ISA 6.5
Minimum Target sm_72

Syntax Forms

One mnemonic covers many type / state-space / scope / modifier combinations - each row below is an independently valid form.

Syntax Data Types State Space(s) Modifiers Min. Target Description
cvt.pack.sat.convertType.abType d, a, b; sm_72 Convert two 32-bit integers a and b into specified type and pack the results into d. Destination d is an unsigned 32-bit integer. (see the official PTX ISA docs for the full description)

Operands

  • d
    Destination register
  • a
    Source operand
  • b
    Source operand

At a Glance

Data Types -

Reference

NVIDIA PTX ISA

Description

Convert two 32-bit integers a and b into specified type and pack the results into d. Destination d is an unsigned 32-bit integer. Source operands a and b are integers of type.abType and the source operand c is an integer of type.cType. The inputs a and b are converted to values of type specified by.convertType with saturation and the results after conversion are packed into lower bits of d. If operand c is specified then remaining bits of d are copied from lower bits of c.

Semantics

ta = a < MIN(convertType) ? MIN(convertType) : a; ta = a > MAX(convertType) ? MAX(convertType) : a; tb = b < MIN(convertType) ? MIN(convertType) : b; tb = b > MAX(convertType) ? MAX(convertType) : b; size = sizeInBits(convertType); td = tb ; for (i = size; i <= 2 * size - 1; i++) { td[i] = ta[i - size]; } if (isU16(convertType) || isS16(convertType)) { d = td; } else { for (i = 0; i < 2 * size; i++) { d[i] = td[i]; } for (i = 2 * size; i <= 31; i++) { d[i] = c[i - 2 * size]; } }

Examples

cvt.pack.sat.s16.s32      %r1, %r2, %r3;           // 32-bit to 16-bit conversion
cvt.pack.sat.u8.s32.b32   %r4, %r5, %r6, 0;        // 32-bit to 8-bit conversion
cvt.pack.sat.u8.s32.b32   %r7, %r8, %r9, %r4;      // %r7 = { %r5, %r6, %r8, %r9 }
cvt.pack.sat.u4.s32.b32   %r10, %r12, %r13, %r14;  // 32-bit to 4-bit conversion
cvt.pack.sat.s2.s32.b32   %r15, %r16, %r17, %r18;  // 32-bits to 2-bit conversion

Reproduced from NVIDIA's official PTX ISA documentation for technical accuracy.

Sources