vpcompressb
Store Sparse Packed Byte Integer Values
VPCOMPRESSB m512 {k1}, zmm1
Compresses active bytes from ZMM to memory.
Details
Stores bytes from ZMM into memory at sparse, mask-selected positions: only bytes where the corresponding opmask bit k1 is set are written to consecutive memory locations. The instruction performs a contiguous write of active bytes while maintaining their relative order. No flags are modified; this is a memory write operation with variable length determined by the popcount of the mask.
Pseudocode Operation
byte_count = 0
for i = 0 to 63:
if k1_mask[i] == 1:
mem[byte_count] ← zmm1[8*i+7:8*i]
byte_count += 1
Example
VPCOMPRESSB [rbp-64], zmm1
Encoding
Binary Layout
EVEX
+0
66
+4
0F
+5
38
+6
63
+7
Operands
-
dest
Mem -
src
ZMM
Reference (Intel® SDM)
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| EVEX.128.66.0F38.W0 63 /r | VPCOMPRESSB m128{k1}, xmm1 | A | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 128 bits of packed byte values from xmm1 to m128 with writemask k1. |
| EVEX.128.66.0F38.W0 63 /r | VPCOMPRESSB xmm1{k1}{z}, xmm2 | B | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 128 bits of packed byte values from xmm2 to xmm1 with writemask k1. |
| EVEX.256.66.0F38.W0 63 /r | VPCOMPRESSB m256{k1}, ymm1 | A | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 256 bits of packed byte values from ymm1 to m256 with writemask k1. |
| EVEX.256.66.0F38.W0 63 /r | VPCOMPRESSB ymm1{k1}{z}, ymm2 | B | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 256 bits of packed byte values from ymm2 to ymm1 with writemask k1. |
| EVEX.512.66.0F38.W0 63 /r | VPCOMPRESSB m512{k1}, zmm1 | A | V/V | AVX512_VBMI2 OR AVX10.1 | Compress up to 512 bits of packed byte values from zmm1 to m512 with writemask k1. |
| EVEX.512.66.0F38.W0 63 /r | VPCOMPRESSB zmm1{k1}{z}, zmm2 | B | V/V | AVX512_VBMI2 OR AVX10.1 | Compress up to 512 bits of packed byte values from zmm2 to zmm1 with writemask k1. |
| EVEX.128.66.0F38.W1 63 /r | VPCOMPRESSW m128{k1}, xmm1 | A | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 128 bits of packed word values from xmm1 to m128 with writemask k1. |
| EVEX.128.66.0F38.W1 63 /r | VPCOMPRESSW xmm1{k1}{z}, xmm2 | B | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 128 bits of packed word values from xmm2 to xmm1 with writemask k1. |
| EVEX.256.66.0F38.W1 63 /r | VPCOMPRESSW m256{k1}, ymm1 | A | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 256 bits of packed word values from ymm1 to m256 with writemask k1. |
| EVEX.256.66.0F38.W1 63 /r | VPCOMPRESSW ymm1{k1}{z}, ymm2 | B | V/V | (AVX512_VBMI2 AND AVX512VL) OR AVX10.1 | Compress up to 256 bits of packed word values from ymm2 to ymm1 with writemask k1. |
| EVEX.512.66.0F38.W1 63 /r | VPCOMPRESSW m512{k1}, zmm1 | A | V/V | AVX512_VBMI2 OR AVX10.1 | Compress up to 512 bits of packed word values from zmm1 to m512 with writemask k1. |
| EVEX.512.66.0F38.W1 63 /r | VPCOMPRESSW zmm1{k1}{z}, zmm2 | B | V/V | AVX512_VBMI2 OR AVX10.1 | Compress up to 512 bits of packed word values from zmm2 to zmm1 with writemask k1. |
Instruction Operand Encoding
| Op/En | Tuple Type | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
|---|---|---|---|---|---|
| A | Tuple1 Scalar | ModRM:r/m (w) | ModRM:reg (r) | N/A | N/A |
| B | N/A | ModRM:r/m (w) | ModRM:reg (r) | N/A | N/A |
Description
Compress (stores) up to 64 byte values or 32 word values from the source operand (second operand) to the destination operand (first operand), based on the active elements determined by the writemask operand. Note:
EVEX.vvvv is reserved and must be 1111b otherwise instructions will #UD.
VPCOMPRESSB/VCOMPRESSW—Store Sparse Packed Byte/Word Integer Values Into Dense Memory/Register Vol. 2C 5-468
Moves up to 512 bits of packed byte values from the source operand (second operand) to the destination operand (first operand). This instruction is used to store partial contents of a vector register into a byte vector or single memory location using the active elements in operand writemask.
Memory destination version: Only the contiguous vector is written to the destination memory location. EVEX.z must be zero.
Register destination version: If the vector length of the contiguous vector is less than that of the input vector in the source operand, the upper bits of the destination register are unmodified if EVEX.z is not set, otherwise the upper bits are zeroed.
This instruction supports memory fault suppression.
Note that the compressed displacement assumes a pre-scaling (N) corresponding to the size of one single element instead of the size of the full vector.
Operation
VPCOMPRESSB store form (KL, VL) = (16, 128), (32, 256), (64, 512) k := 0 FOR j := 0 TO KL-1: IF k1[j] OR *no writemask*: DEST.byte[k] := SRC.byte[j] k := k +1 VPCOMPRESSB reg-reg form (KL, VL) = (16, 128), (32, 256), (64, 512) k := 0 FOR j := 0 TO KL-1: IF k1[j] OR *no writemask*: DEST.byte[k] := SRC.byte[j] k := k + 1 IF *merging-masking*: *DEST[VL-1:k*8] remains unchanged* ELSE DEST[VL-1:k*8] := 0 DEST[MAX_VL-1:VL] := 0 VPCOMPRESSW store form (KL, VL) = (8, 128), (16, 256), (32, 512) k := 0 FOR j := 0 TO KL-1: IF k1[j] OR *no writemask*: DEST.word[k] := SRC.word[j] k := k + 1 VPCOMPRESSB/VCOMPRESSW—Store Sparse Packed Byte/Word Integer Values Into Dense Memory/Register Vol. 2C 5-469 VPCOMPRESSW reg-reg form (KL, VL) = (8, 128), (16, 256), (32, 512) k := 0 FOR j := 0 TO KL-1: IF k1[j] OR *no writemask*: DEST.word[k] := SRC.word[j] k := k + 1 IF *merging-masking*: *DEST[VL-1:k*16] remains unchanged* ELSE DEST[VL-1:k*16] := 0 DEST[MAX_VL-1:VL] := 0
Intel C/C++ Compiler Intrinsic Equivalent
VPCOMPRESSB __m128i _mm_mask_compress_epi8(__m128i, __mmask16, __m128i); VPCOMPRESSB __m128i _mm_maskz_compress_epi8(__mmask16, __m128i); VPCOMPRESSB __m256i _mm256_mask_compress_epi8(__m256i, __mmask32, __m256i); VPCOMPRESSB __m256i _mm256_maskz_compress_epi8(__mmask32, __m256i); VPCOMPRESSB __m512i _mm512_mask_compress_epi8(__m512i, __mmask64, __m512i); VPCOMPRESSB __m512i _mm512_maskz_compress_epi8(__mmask64, __m512i); VPCOMPRESSB void _mm_mask_compressstoreu_epi8(void*, __mmask16, __m128i); VPCOMPRESSB void _mm256_mask_compressstoreu_epi8(void*, __mmask32, __m256i); VPCOMPRESSB void _mm512_mask_compressstoreu_epi8(void*, __mmask64, __m512i); VPCOMPRESSW __m128i _mm_mask_compress_epi16(__m128i, __mmask8, __m128i); VPCOMPRESSW __m128i _mm_maskz_compress_epi16(__mmask8, __m128i); VPCOMPRESSW __m256i _mm256_mask_compress_epi16(__m256i, __mmask16, __m256i); VPCOMPRESSW __m256i _mm256_maskz_compress_epi16(__mmask16, __m256i); VPCOMPRESSW __m512i _mm512_mask_compress_epi16(__m512i, __mmask32, __m512i); VPCOMPRESSW __m512i _mm512_maskz_compress_epi16(__mmask32, __m512i); VPCOMPRESSW void _mm_mask_compressstoreu_epi16(void*, __mmask8, __m128i); VPCOMPRESSW void _mm256_mask_compressstoreu_epi16(void*, __mmask16, __m256i); VPCOMPRESSW void _mm512_mask_compressstoreu_epi16(void*, __mmask32, __m512i);
Exceptions
SIMD Floating-Point Exceptions
None.
Other Exceptions
See Table 2-51, “Type E4 Class Exception Conditions.”
VPCOMPRESSB/VCOMPRESSW—Store Sparse Packed Byte/Word Integer Values Into Dense Memory/Register Vol. 2C 5-470