_mm512_extloadunpackhi_epi32
Classification
KNC, Load, CPUID Test: KNCNI
Header File
Instruction
VLOADUNPACKHD zmm, m512
Synopsis
_mm512_extloadunpackhi_epi32(__m512i src, void const * mt, _MM_UPCONV_EPI32_ENUM conv, int hint);
Description
Loads the high-64-byte-aligned portion of the byte/word/doubleword stream starting at element-aligned address mt-64, 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 at or after the first 64-byte-aligned address following (mt-64) 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.
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
foundNext64BytesBoundary := false
upSize := UPCONVERTSIZE(conv)
addr := mt-64
FOR j := 0 to 15
IF foundNext64BytesBoundary == false
IF (addr + (loadOffset + 1)*upSize % 64) == 0
foundNext64BytesBoundary := true
FI
ELSE
i := j*32
dst[i+31:i] := UPCONVERT(addr, loadOffset, conv)
FI
loadOffset := loadOffset + 1
ENDFOR
dst[MAX:512] := 0