_mm_mask_fixupimm_round_sd
Classification
AVX-512, Miscellaneous, CPUID Test: AVX512F
Header File
immintrin.h
Instruction
VFIXUPIMMSD xmm {k}, xmm, xmm, imm8 {sae}
Synopsis
 _mm_mask_fixupimm_round_sd(__m128d a, __mmask8 k, __m128d b, __m128i c, int imm8, int sae);
Description
Fix up the lower double-precision (64-bit) floating-point elements in "a" and "b" using the lower 64-bit integer in "c", store the result in the lower element of "dst" using writemask "k" (the element is copied from "a" when mask bit 0 is not set), and copy the upper element from "a" to the upper element of "dst". "imm8" is used to set the required flags reporting. [sae_note]
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[63:0], src2[63:0], src3[63:0], imm8[7:0]) {
	tsrc[63:0] := ((src2[62:52] == 0) AND (MXCSR.DAZ == 1)) ? 0.0 : src2[63:0]
	CASE(tsrc[63: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[63:0] := src1[63:0]
	1 : dest[63:0] := tsrc[63:0]
	2 : dest[63:0] := QNaN(tsrc[63:0])
	3 : dest[63:0] := QNAN_Indefinite
	4 : dest[63:0] := -INF
	5 : dest[63:0] := +INF
	6 : dest[63:0] := tsrc.sign? -INF : +INF
	7 : dest[63:0] := -0
	8 : dest[63:0] := +0
	9 : dest[63:0] := -1
	10: dest[63:0] := +1
	11: dest[63:0] := 1/2
	12: dest[63:0] := 90.0
	13: dest[63:0] := PI/2
	14: dest[63:0] := MAX_FLOAT
	15: dest[63: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[63:0]
}
IF k[0]
	dst[63:0] := FIXUPIMMPD(a[63:0], b[63:0], c[63:0], imm8[7:0])
ELSE
	dst[63:0] := a[63:0]
FI
dst[127:64] := a[127:64]
dst[MAX:128] := 0