_mm512_mask_extpackstorelo_epi32
Classification
KNC, Store, CPUID Test: KNCNI
Header File
immintrin.h
Instruction
VPACKSTORELD m512 {k}, zmm
Synopsis
 _mm512_mask_extpackstorelo_epi32(void * mt, __mmask16 k, __m512i v1, _MM_DOWNCONV_EPI32_ENUM conv, int hint);
Description
Down-converts and stores packed 32-bit integer elements of "v1" into a byte/word/doubleword stream according to "conv" at a logically mapped starting address "mt", storing the low-64-byte elements of that stream (those elements of the stream that map before the first 64-byte-aligned address follwing "mt"). "hint" indicates to the processor whether the data is non-temporal. Elements are written to memory according to element selector "k" (elements are skipped when the corresponding mask bit is not set).
Operation
DEFINE DOWNCONVERT(element, convertTo) {
	CASE convertTo OF
	_MM_DOWNCONV_EPI32_NONE:
		RETURN element[31:0]
	_MM_DOWNCONV_EPI32_UINT8:
		RETURN Truncate8(element[31:0])
	_MM_DOWNCONV_EPI32_SINT8:
		RETURN Saturate8(element[31:0])
	_MM_DOWNCONV_EPI32_UINT16:
		RETURN Truncate16(element[31:0])
	_MM_DOWNCONV_EPI32_SINT16:
		RETURN Saturate16(element[31:0])
	ESAC
}
DEFINE DOWNCONVERTSIZE(convertTo) {
	CASE convertTo OF
	_MM_DOWNCONV_EPI32_NONE:
		RETURN 4
	_MM_DOWNCONV_EPI32_UINT8:
		RETURN 1
	_MM_DOWNCONV_EPI32_SINT8:
		RETURN 1
	_MM_DOWNCONV_EPI32_UINT16:
		RETURN 2
	_MM_DOWNCONV_EPI32_SINT16:
		RETURN 2
	ESAC
}
storeOffset := 0
downSize := DOWNCONVERTSIZE(conv)
addr := mt
FOR j := 0 to 15
	IF k[j]
		i := j*32
		tmp := DOWNCONVERT(v1[i+31:i], conv)
		storeAddr := addr + storeOffset * downSize
		CASE downSize OF
		4: MEM[storeAddr] := tmp[31:0]
		2: MEM[storeAddr] := tmp[15:0]
		1: MEM[storeAddr] := tmp[7:0]
		ESAC
		storeOffset := storeOffset + 1
		IF ((addr + storeOffset * downSize) % 64) == 0
			BREAK
		FI
	FI
ENDFOR
dst[MAX:512] := 0