모두의 코드
VRNDSCALESD (Intel x86/64 assembly instruction)

작성일 : 2020-09-01 이 글은 565 번 읽혔습니다.

VRNDSCALESD

Round Scalar Float64 Value To Include A Given Number Of Fraction Bits

참고 사항

아래 표를 해석하는 방법은 x86-64 명령어 레퍼런스 읽는 법 글을 참조하시기 바랍니다.

Opcode/
Instruction

Op /
En

64/32
bit Mode
Support

CPUID
Feature
Flag

Description

EVEX.NDS.LIG.66.0F3A.W1 0B /r ib
VRNDSCALESD xmm1 {k1}{z} xmm2 xmm3/m64{sae} imm8

T1S

V/V

AVX512F

Rounds scalar double-precision floating-point value in xmm3/m64 to a number of fraction bits specified by the imm8 field. Stores the result in xmm1 register.

Instruction Operand Encoding

Op/En

Operand 1

Operand 2

Operand 3

Operand 4

T1S

ModRM:reg (w)

EVEX.vvvv (r)

ModRM:r/m (r)

Imm8

Description

Rounds a double-precision floating-point value in the low quadword (see Figure 5-29) element the second source operand (the third operand) by the rounding mode specified in the immediate operand and places the result in the corresponding element of the destination operand (the third operand) according to the writemask. The quadword element at bits 127:64 of the destination is copied from the first source operand (the second operand).

The destination and first source operands are XMM registers, the 2nd source operand can be an XMM register or memory location. Bits MAXVL-1:128 of the destination register are cleared.

The rounding process rounds the input to an integral value, plus number bits of fraction that are specified by imm8[7:4] (to be included in the result) and returns the result as a double-precision floating-point value.

It should be noticed that no overflow is induced while executing this instruction (although the source is scaled by the imm8[7:4] value).

The immediate operand also specifies control fields for the rounding operation, three bit fields are defined and shown in the "Immediate Control Description" figure below. Bit 3 of the immediate byte controls the processor behavior for a precision exception, bit 2 selects the source of rounding mode control. Bits 1:0 specify a non-sticky rounding-mode value (Immediate control table below lists the encoded values for rounding-mode field).

The Precision Floating-Point Exception is signaled according to the immediate operand. If any source operand is an SNaN then it will be converted to a QNaN. If DAZ is set to '1 then denormals will be converted to zero before rounding.

The sign of the result of this instruction is preserved, including the sign of zero.

The formula of the operation for VRNDSCALESD is

ROUND(x) = 2-M \esc{*}RoundtoINT(x\esc{*}2M , roundctrl),

roundctrl = imm[3:0];

M=imm[7:4];

The operation of x\esc{*}2M is computed as if the exponent range is unlimited (i.e. no overflow ever occurs).

VRNDSCALESD is a more general form of the VEX-encoded VROUNDSD instruction. In VROUNDSD, the formula of the operation is

ROUND(x) = RoundtoINT(x, roundctrl),

roundctrl = imm[3:0];

EVEX encoded version: The source operand is a XMM register or a 64-bit memory location. The destination operand is a XMM register.

Handling of special case of input values are listed in Table 5-22.

Operation

RoundToIntegerDP(SRC[63:0], imm8[7:0]) {
    if (imm8[2] = 1)
          rounding_direction <-  MXCSR:RC ; get round control from MXCSR
    else
          rounding_direction <-  imm8[1:0] ; get round control from imm8[1:0]
    FI
    M <-  imm8[7:4] ; get the scaling factor
    case (rounding_direction)
    00: TMP[63:0] <-  round_to_nearest_even_integer(2\footnote{M} *SRC[63:0])
    01: TMP[63:0] <-  round_to_equal_or_smaller_integer(2\footnote{M} *SRC[63:0])
    10: TMP[63:0] <-  round_to_equal_or_larger_integer(2\footnote{M} *SRC[63:0])
    11: TMP[63:0] <-  round_to_nearest_smallest_magnitude_integer(2\footnote{M} *SRC[63:0])
    ESAC
    Dest[63:0] <-  2\footnote{-M} * TMP[63:0]  ; scale down back to 2\footnote{-M}
    if (imm8[3] = 0) Then ; check SPE
          if (SRC[63:0] != Dest[63:0]) Then ; check precision lost
                set_precision() ; set #PE
          FI;
    FI;
    return(Dest[63:0])
}
VRNDSCALESD (EVEX encoded version)
IF k1[0] or *no writemask*
    THEN DEST[63:0] <-  RoundToIntegerDP(SRC2[63:0], Zero_upper_imm[7:0])
    ELSE 
          IF *merging-masking* ; merging-masking
                THEN *DEST[63:0] remains unchanged*
                ELSE  ; zeroing-masking
                      THEN DEST[63:0] <-  0
          FI;
FI;
DEST[127:64] <-  SRC1[127:64]
DEST[MAX_VL-1:128] <-  0

Intel C/C++ Compiler Intrinsic Equivalent

VRNDSCALESD __m128d _mm_roundscale_sd(__m128d a, __m128d b, int imm);
VRNDSCALESD __m128d _mm_roundscale_round_sd(__m128d a, __m128d b, int imm,
                                            int sae);
VRNDSCALESD __m128d _mm_mask_roundscale_sd(__m128d s, __mmask8 k, __m128d a,
                                           __m128d b, int imm);
VRNDSCALESD __m128d _mm_mask_roundscale_round_sd(__m128d s, __mmask8 k,
                                                 __m128d a, __m128d b, int imm,
                                                 int sae);
VRNDSCALESD __m128d _mm_maskz_roundscale_sd(__mmask8 k, __m128d a, __m128d b,
                                            int imm);
VRNDSCALESD __m128d _mm_maskz_roundscale_round_sd(__mmask8 k, __m128d a,
                                                  __m128d b, int imm, int sae);

SIMD Floating-Point Exceptions

Invalid, Precision

If SPE is enabled, precision exception is not reported (regardless of MXCSR exception mask).

Other Exceptions

See Exceptions Type E3.

첫 댓글을 달아주세요!
프로필 사진 없음
강좌에 관련 없이 궁금한 내용은 여기를 사용해주세요

    댓글을 불러오는 중입니다..