_mm512_mask_extloadunpacklo_epi32
Classification
KNC, Load, CPUID Test: KNCNI
Header File
immintrin.h
Instruction
VLOADUNPACKLD zmm {k}, m512
Synopsis
 _mm512_mask_extloadunpacklo_epi32(__m512i src, __mmask16 k, void const * mt, _MM_UPCONV_EPI32_ENUM conv, int hint);
Description
Loads the low-64-byte-aligned portion of the byte/word/doubleword stream starting at element-aligned address mt, up-converted depending on the value of "conv", and expanded into packed 32-bit integers in "dst". The initial values of "dst" are copied from "src". Only those converted doublewords that occur before first 64-byte-aligned address following "mt" are loaded. Elements in the resulting vector that do not map to those doublewords are taken from "src". "hint" indicates to the processor whether the loaded data is non-temporal. Elements are copied to "dst" according to element selector "k" (elements are skipped when the corresponding mask bit is not set).
Operation
DEFINE UPCONVERT(addr, offset, convertTo) {
	CASE conv OF
	_MM_UPCONV_EPI32_NONE:
		RETURN MEM[addr + 4*offset]
	_MM_UPCONV_EPI32_UINT8:
		RETURN ZeroExtend32(MEM[addr + offset])
	_MM_UPCONV_EPI32_SINT8:
		RETURN SignExtend32(MEM[addr + offset])
	_MM_UPCONV_EPI32_UINT16:
		RETURN ZeroExtend32(MEM[addr + 2*offset])
	_MM_UPCONV_EPI32_SINT16:
		RETURN SignExtend32(MEM[addr + 2*offset])
	ESAC
}
DEFINE UPCONVERTSIZE(convertTo) {
	CASE conv OF
	_MM_UPCONV_EPI32_NONE:
		RETURN 4
	_MM_UPCONV_EPI32_UINT8:
		RETURN 1
	_MM_UPCONV_EPI32_SINT8:
		RETURN 1
	_MM_UPCONV_EPI32_UINT16:
		RETURN 2
	_MM_UPCONV_EPI32_SINT16:
		RETURN 2
	ESAC
}
dst[511:0] := src[511:0]
loadOffset := 0
upSize := UPCONVERTSIZE(conv)
addr := mt
FOR j := 0 to 15
	IF k[j]
		i := j*32
		dst[i+31:i] := UPCONVERT(addr, loadOffset, conv)
		loadOffset := loadOffset + 1
		IF (mt + loadOffset * upSize) % 64 == 0
			BREAK
		FI
	FI
ENDFOR
dst[MAX:512] := 0