VRANGEPD - RANGE Packed Double

VRANGEPD xmm1{k1}{z}, xmm2, xmm3/m128/m64bcst, imm8    (V5+DQ+VL
__m128i _mm_range_pd(__m128i a, __m128i b, int imm8)
__m128i _mm_mask_range_pd(__m128i s, __mmask8 k, __m128i a, __m128i b, int imm8)
__m128i _mm_maskz_range_pd(__mmask8 k, __m128i a, __m128i b, int imm8)

For each double, select either (1) or (2) as specified in imm8. Modify the sign of the selected value as specified in imm8 and set the result to (3)
VRANGEPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst, imm8    (V5+DQ+VL
__m256i _mm256_range_pd(__m256i a, __m256i b, int imm8)
__m256i _mm256_mask_range_pd(__m256i s, __mmask8 k, __m256i a, __m256i b, int imm8)
__m256i _mm256_maskz_range_pd(__mmask8 k, __m256i a, __m256i b, int imm8)

For each double, select either (1) or (2) as specified in imm8. Modify the sign of the selected value as specified in imm8 and set the result to (3)
VRANGEPD zmm1{k1}{z}, zmm2, zmm3/m512/m64bcst{sae}, imm8    (V5+DQ
__m512i _mm512_range_pd(__m512i a, __m512i b, int imm8)
__m512i _mm512_mask_range_pd(__m512i s, __mmask8 k, __m512i a, __m512i b, int imm8)
__m512i _mm512_maskz_range_pd(__mmask8 k, __m512i a, __m512i b, int imm8)
__m512i _mm512_range_round_pd(__m512i a, __m512i b, int imm8, int sae, imm8)
__m512i _mm512_mask_range_round_pd(__m512i s, __mmask8 k, __m512i a, __m512i b, int imm8, int sae)
__m512i _mm512_maskz_range_round_pd(__mmask8 k, __m512i a, __m512i b, int imm8, int sae)

For each double, select either (1) or (2) as specified in imm8. Modify the sign of the selected value as specified in imm8 and set the result to (3)

imm8

bit
1:0 Which one to select?
00: the smaller one
01: the larger one
10: the one that has the smaller absolute value
11: the one that has the larger absolute value
3:2 Sign operation
00: copy the sign of (1)
01: leave the selected one's sign as is
10: set positive
11: set negative
7:4 must be 0.

x86/x64 SIMD Instruction List  Feedback