_mm_maskz_fixupimm_ss
Classification
AVX-512, Miscellaneous, CPUID Test: AVX512F
Header File
immintrin.h
Instruction
VFIXUPIMMSS xmm {z}, xmm, xmm, imm8
Synopsis
 _mm_maskz_fixupimm_ss(__mmask8 k, __m128 a, __m128 b, __m128i c, int imm8);
Description
Fix up the lower single-precision (32-bit) floating-point elements in "a" and "b" using the lower 32-bit integer in "c", store the result in the lower element of "dst" using zeromask "k" (the element is zeroed out when mask bit 0 is not set), and copy the upper 3 packed elements from "a" to the upper elements of "dst". "imm8" is used to set the required flags reporting.
Operation
enum TOKEN_TYPE {
	QNAN_TOKEN := 0, \
	SNAN_TOKEN := 1, \
	ZERO_VALUE_TOKEN := 2, \
	ONE_VALUE_TOKEN := 3, \
	NEG_INF_TOKEN := 4, \
	POS_INF_TOKEN := 5, \
	NEG_VALUE_TOKEN := 6, \
	POS_VALUE_TOKEN := 7
}
DEFINE FIXUPIMMPD(src1[31:0], src2[31:0], src3[31:0], imm8[7:0]) {
	tsrc[31:0] := ((src2[30:23] == 0) AND (MXCSR.DAZ == 1)) ? 0.0 : src2[31:0]
	CASE(tsrc[31:0]) OF
	QNAN_TOKEN:j := 0
	SNAN_TOKEN:j := 1
	ZERO_VALUE_TOKEN: j := 2
	ONE_VALUE_TOKEN: j := 3
	NEG_INF_TOKEN: j := 4
	POS_INF_TOKEN: j := 5
	NEG_VALUE_TOKEN: j := 6
	POS_VALUE_TOKEN: j := 7
	ESAC
	
	token_response[3:0] := src3[3+4*j:4*j]
	
	CASE(token_response[3:0]) OF
	0 : dest[31:0] := src1[31:0]
	1 : dest[31:0] := tsrc[31:0]
	2 : dest[31:0] := QNaN(tsrc[31:0])
	3 : dest[31:0] := QNAN_Indefinite
	4 : dest[31:0] := -INF
	5 : dest[31:0] := +INF
	6 : dest[31:0] := tsrc.sign? -INF : +INF
	7 : dest[31:0] := -0
	8 : dest[31:0] := +0
	9 : dest[31:0] := -1
	10: dest[31:0] := +1
	11: dest[31:0] := 1/2
	12: dest[31:0] := 90.0
	13: dest[31:0] := PI/2
	14: dest[31:0] := MAX_FLOAT
	15: dest[31:0] := -MAX_FLOAT
	ESAC
	
	CASE(tsrc[31:0]) OF
	ZERO_VALUE_TOKEN:
		IF (imm8[0]) #ZE; FI
	ZERO_VALUE_TOKEN:
		IF (imm8[1]) #IE; FI
	ONE_VALUE_TOKEN:
		IF (imm8[2]) #ZE; FI
	ONE_VALUE_TOKEN:
		IF (imm8[3]) #IE; FI
	SNAN_TOKEN:
		IF (imm8[4]) #IE; FI
	NEG_INF_TOKEN:
		IF (imm8[5]) #IE; FI
	NEG_VALUE_TOKEN:
		IF (imm8[6]) #IE; FI
	POS_INF_TOKEN:
		IF (imm8[7]) #IE; FI
	ESAC
	RETURN dest[31:0]
}
IF k[0]
	dst[31:0] := FIXUPIMMPD(a[31:0], b[31:0], c[31:0], imm8[7:0])
ELSE
	dst[31:0] := 0
FI
dst[127:32] := a[127:32]
dst[MAX:128] := 0