VBROADCAST

装入广播 浮点 数据

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
VEX.128.66.0F38.W0 18 /rVBROADCASTSS xmm1, m32A有效有效在Mem中广播单精度浮点元素到xmm1的四个地点.
VEX.256.66.0F38.W0 18 /rVBROADCASTSS ymm1, m32A有效有效将单精度浮点元素在mem广播到ymm1的8个地点.
VEX.256.66.0F38.W0 19 /rVBROADCASTSD ymm1, m64A有效有效在Mem中广播双精度浮点元素到ymm1的四个地点.
VEX.256.66.0F38.W0 1A /rVBROADCASTF128 ymm1, m128A有效有效广播128比特的浮点数据以mem表示为低,高128比特的ymm1.
VEX.128.66.0F38.W0 18/rVBROADCASTSS xmm1, xmm2A有效有效在源操作数向xmm1的四个位置广播低的单精度浮点元素.
VEX.256.66.0F38.W0 18 /rVBROADCASTSS ymm1, xmm2A有效有效在源操作数广播低单精度浮点元素到ymm1的8个地点.
VEX.256.66.0F38.W0 19 /rVBROADCASTSD ymm1, xmm2A有效有效在源操作数向ymm1的四个地点广播低双精度浮点元素.
EVEX.256.66.0F38.W1 19 /rVBROADCASTSD ymm1 {k1}{z}, xmm2/m64B有效有效广播频率低双精度浮点 AVX512F(一) 或xmm2/m644个地点AVX10.1 ymm1使用写掩码 k1.
EVEX.512.66.0F38.W1 19 /rVBROADCASTSD zmm1 {k1}{z}, xmm2/m64B有效有效在xmm2/m64中广播低双精度浮点OR AVX10.1元素到zmm1的八个位置,使用writemask k1.
EVEX.256.66.0F38.W0 19 /rVBROADCASTF32X2 ymm1 {k1}{z}, xmm2/m64C有效有效广播二单精度浮点 AVX512DQ或xmm2/m64地点ymm1 AVX10.1使用写掩码 k1.
EVEX.512.66.0F38.W0 19 /rVBROADCASTF32X2 zmm1 {k1}{z}, xmm2/m64C有效有效使用 writemask k1 向 zmm1 位置广播 xmm2/m64 中两个单精度浮点 OR AVX10.1 元素.
EVEX.128.66.0F38.W0 18 /rVBROADCASTSS xmm1 {k1}{z}, xmm2/m32B有效有效广播频率低单精度浮点 AVX512F(一) 或xmm2/m32所有地点xmm1 AVX10.1使用写掩码 k1.
EVEX.256.66.0F38.W0 18 /rVBROADCASTSS ymm1 {k1}{z}, xmm2/m32B有效有效广播频率低单精度浮点 AVX512F(一) 或xmm2/m32所有地点ymm1 AVX10.1使用写掩码 k1.
EVEX.512.66.0F38.W0 18 /rVBROADCASTSS zmm1 {k1}{z}, xmm2/m32B有效有效在xmm2/m32中广播低单精度浮点OR AVX10.1元素,使用writemask k1向zmm1中的所有位置广播.
EVEX.256.66.0F38.W0 1A /rVBROADCASTF32X4 ymm1 {k1}{z}, m128D有效有效广播128位4单精度AVX512F) OR 浮点数据在mem中,使用writemask k1到ymm1 AVX10.1中的位置.
EVEX.512.66.0F38.W0 1A /rVBROADCASTF32X4 zmm1 {k1}{z}, m128D有效有效使用 写掩码 k1对 zmm1 位置进行广播 128 比特 4 单精度 OR AVX10.1 浮点 数据以 mem 表示.
EVEX.256.66.0F38.W1 1A /rVBROADCASTF64X2 ymm1 {k1}{z}, m128 Opcode/ InstructionC有效有效使用 写掩码 k1 播放128位2双精度的 AVX512DQ) OR 浮点 数据在mem中到 ymm1 AVX10.1 位置. Op/64/32 CPUID 特性描述 En Bit模式支持旗帜
EVEX.512.66.0F38.W1 1A /rVBROADCASTF64X2 zmm1 {k1}{z}, m128C有效有效使用写掩码 k1向zmm1位置播放128位的双精度OR AVX10.1 浮点数据.
EVEX.512.66.0F38.W0 1B /rVBROADCASTF32X8 zmm1 {k1}{z}, m256E有效有效使用写掩码 k1向zmm1位置播放256位8个单精度OR AVX10.1 浮点数据以mem表示.
EVEX.512.66.0F38.W1 1B /rVBROADCASTF64X4 zmm1 {k1}{z}, m256D有效有效使用 写掩码 k1对 zmm1 位置进行广播 256 比特 4双精度 OR AVX10.1 浮点 数据以 mem 表示.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

B

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Tuple1 Scalar

C

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Tuple2

D

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Tuple4

E

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Tuple8

实测开销

未实测:不在 64 位处理器上运行。

说明

VBROADCASTSD/VBROADCASTSS/VBROADCASTF128从源操作数(第二架操作数)装入浮点值,作为一款Truple,用于内存并向目标操作数(第一架操作数)的所有元素广播.

VEX256-编码版本 : 目标操作数是一个YMM登记册. 源操作数要么是32位,64位,要么是128位的内存位置. 注册源编码被保留,并将#UD. 目的地的比特(MAXVL-1:256)注册被清零.

EVEX-编码版本 : 目标操作数是一个ZMM/YMM/XMM的登记册,并根据写掩码 k1更新. 源操作数要么是一个32位,64位的内存位置,要么是一个XMM寄存器的低双字/四字元素.

VBROADCASTF32X2/VBROADCASTF32X4/VBROADCASTF64X2/VBROADCASTF32X8/VBROADCASTF64X4从源操作数(第二个操作数)装入浮点值,作为Tuple,在内存或注册并广播到目标操作数(第一个操作数)的所有元素. 目标操作数是一个按照写掩码 k1更新的YMM/ZMM登记册. 源操作数要么是一个寄存器,要么是64位/128位/256位/内存位置.

VBROADCASTSD和VBROADCASTF128,F32x4和F64x2只支持为256位和512位宽版本及上. VBROADCASTSS支持128位,256位和512位宽版本. F32x8和F64x4仅作为512位宽版本支持.

VBROADCASTF32X2/VBROADCASTF32X4/VBROADCASTF32X8 have 32-bit granularity. VBROADCASTF64X2 and VBROADCASTF64X4 have 64-bit granularity.

说明: VEX.vvvv和EVEX.vvvv是保留的,必须是1111b,否则指令会#UD.

如果VBROADCASTSD或VBROADCASTF128被编码为VEX.L=0,试图执行以VEX.L=0编码的指令将导致#UD例外.

                                                                            m32          X0

DEST X0 X0 X0 X0 X0 X0 X0 X0

图5-1。 VBROADCASTSS 操作 (VEX.256 编码版本)

                                                                            m32          X0

DEST 0 0 0 0 X0 X0 X0 X0

图5-2. VBROADCASTSS 操作(VEX.128-bit版本)

                                                                   m64               X0

DEST X0 X0 X0 X0

图5-3。 VBROADCASTSD 操作(VEX.256-bit版本)

                                                         m128           X0

DEST X0 X0

Figure 5-4. VBROADCASTF128 Operation (VEX.256-bit version)

                                                        m256            X0
                    DEST                 X0                             X0

图5-5。 VBROADCASTF64X4 操作( 512- bit 版本, 所有 1s)

行动

VBROADCASTSS (128-bit Version VEX and Legacy)
temp := SRC[31:0]
DEST[31:0] := temp
DEST[63:32] := temp
DEST[95:64] := temp
DEST[127:96] := temp
DEST[MAXVL-1:128] := 0

VBROADCASTSS (VEX.256 Encoded Version)
temp := SRC[31:0]
DEST[31:0] := temp
DEST[63:32] := temp
DEST[95:64] := temp
DEST[127:96] := temp
DEST[159:128] := temp
DEST[191:160] := temp
DEST[223:192] := temp
DEST[255:224] := temp
DEST[MAXVL-1:256] := 0

VBROADCASTSS (EVEX Encoded Versions)

(KL, VL) (4, 128), (8, 256),= (16, 512)

FOR j := 0 TO KL-1

i := j * 32

IF k1[j] OR *no writemask*

     THEN DEST[i+31:i] := SRC[31:0]

     ELSE

             IF *merging-masking*                    ; merging-masking

                 THEN *DEST[i+31:i] remains unchanged*

                 ELSE                                ; zeroing-masking

                    DEST[i+31:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0


VBROADCASTSD (VEX.256 Encoded Version)
temp := SRC[63:0]
DEST[63:0] := temp
DEST[127:64] := temp
DEST[191:128] := temp
DEST[255:192] := temp
DEST[MAXVL-1:256] := 0

VBROADCASTSD (EVEX Encoded Versions)

(KL, VL) = (4, 256), (8, 512)

FOR j := 0 TO KL-1

i := j * 64

IF k1[j] OR *no writemask*

     THEN DEST[i+63:i] := SRC[63:0]

     ELSE

             IF *merging-masking*                    ; merging-masking

                 THEN *DEST[i+63:i] remains unchanged*

                 ELSE                                ; zeroing-masking

                     DEST[i+63:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

VBROADCASTF32x2 (EVEX Encoded Versions)

(KL, VL) = (8, 256), (16, 512)

FOR j := 0 TO KL-1

i := j * 32

n := (j mod 2) * 32

IF k1[j] OR *no writemask*

     THEN DEST[i+31:i] := SRC[n+31:n]

     ELSE

             IF *merging-masking*                    ; merging-masking

                 THEN *DEST[i+31:i] remains unchanged*

                 ELSE                                ; zeroing-masking

                     DEST[i+31:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

VBROADCASTF128 (VEX.256 Encoded Version)
temp := SRC[127:0]
DEST[127:0] := temp
DEST[255:128] := temp
DEST[MAXVL-1:256] := 0


VBROADCASTF32X4 (EVEX Encoded Versions)

(KL, VL) = (8, 256), (16, 512)

FOR j := 0 TO KL-1

i := j* 32

n := (j modulo 4) * 32

IF k1[j] OR *no writemask*

     THEN DEST[i+31:i] := SRC[n+31:n]

     ELSE

             IF *merging-masking*                    ; merging-masking

                  THEN *DEST[i+31:i] remains unchanged*

                  ELSE                               ; zeroing-masking

                    DEST[i+31:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

VBROADCASTF64X2 (EVEX Encoded Versions)

(KL, VL) = (4, 256), (8, 512)

FOR j := 0 TO KL-1

i := j * 64

n := (j modulo 2) * 64

IF k1[j] OR *no writemask*

     THEN DEST[i+63:i] := SRC[n+63:n]

     ELSE

             IF *merging-masking*                    ; merging-masking

                  THEN *DEST[i+63:i] remains unchanged*

                  ELSE                               ; zeroing-masking

                    DEST[i+63:i] = 0

             FI

FI;

ENDFOR;

VBROADCASTF32X8 (EVEX.U1.512 Encoded Version)

FOR j := 0 TO 15

i := j * 32

n := (j modulo 8) * 32

IF k1[j] OR *no writemask*

     THEN DEST[i+31:i] := SRC[n+31:n]

     ELSE

             IF *merging-masking*                    ; merging-masking

                  THEN *DEST[i+31:i] remains unchanged*

                  ELSE                               ; zeroing-masking

                    DEST[i+31:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0


VBROADCASTF64X4 (EVEX.512 Encoded Version)

FOR j := 0 TO 7

i := j * 64

n := (j modulo 4) * 64

IF k1[j] OR *no writemask*

     THEN DEST[i+63:i] := SRC[n+63:n]

     ELSE

             IF *merging-masking*                    ; merging-masking

                 THEN *DEST[i+63:i] remains unchanged*

                 ELSE                                ; zeroing-masking

                 DEST[i+63:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VBROADCASTF32x2 __m512 _mm512_broadcast_f32x2( __m128 a);
VBROADCASTF32x2 __m512 _mm512_mask_broadcast_f32x2(__m512 s, __mmask16 k, __m128 a);
VBROADCASTF32x2 __m512 _mm512_maskz_broadcast_f32x2( __mmask16 k, __m128 a);
VBROADCASTF32x2 __m256 _mm256_broadcast_f32x2( __m128 a);
VBROADCASTF32x2 __m256 _mm256_mask_broadcast_f32x2(__m256 s, __mmask8 k, __m128 a);
VBROADCASTF32x2 __m256 _mm256_maskz_broadcast_f32x2( __mmask8 k, __m128 a);
VBROADCASTF32x4 __m512 _mm512_broadcast_f32x4( __m128 a);
VBROADCASTF32x4 __m512 _mm512_mask_broadcast_f32x4(__m512 s, __mmask16 k, __m128 a);
VBROADCASTF32x4 __m512 _mm512_maskz_broadcast_f32x4( __mmask16 k, __m128 a);
VBROADCASTF32x4 __m256 _mm256_broadcast_f32x4( __m128 a);
VBROADCASTF32x4 __m256 _mm256_mask_broadcast_f32x4(__m256 s, __mmask8 k, __m128 a);
VBROADCASTF32x4 __m256 _mm256_maskz_broadcast_f32x4( __mmask8 k, __m128 a);
VBROADCASTF32x8 __m512 _mm512_broadcast_f32x8( __m256 a);
VBROADCASTF32x8 __m512 _mm512_mask_broadcast_f32x8(__m512 s, __mmask16 k, __m256 a);
VBROADCASTF32x8 __m512 _mm512_maskz_broadcast_f32x8( __mmask16 k, __m256 a);
VBROADCASTF64x2 __m512d _mm512_broadcast_f64x2( __m128d a);
VBROADCASTF64x2 __m512d _mm512_mask_broadcast_f64x2(__m512d s, __mmask8 k, __m128d a);
VBROADCASTF64x2 __m512d _mm512_maskz_broadcast_f64x2( __mmask8 k, __m128d a);
VBROADCASTF64x2 __m256d _mm256_broadcast_f64x2( __m128d a);
VBROADCASTF64x2 __m256d _mm256_mask_broadcast_f64x2(__m256d s, __mmask8 k, __m128d a);
VBROADCASTF64x2 __m256d _mm256_maskz_broadcast_f64x2( __mmask8 k, __m128d a);
VBROADCASTF64x4 __m512d _mm512_broadcast_f64x4( __m256d a);
VBROADCASTF64x4 __m512d _mm512_mask_broadcast_f64x4(__m512d s, __mmask8 k, __m256d a);
VBROADCASTF64x4 __m512d _mm512_maskz_broadcast_f64x4( __mmask8 k, __m256d a);
VBROADCASTSD __m512d _mm512_broadcastsd_pd( __m128d a);
VBROADCASTSD __m512d _mm512_mask_broadcastsd_pd(__m512d s, __mmask8 k, __m128d a);
VBROADCASTSD __m512d _mm512_maskz_broadcastsd_pd(__mmask8 k, __m128d a);
VBROADCASTSD __m256d _mm256_broadcastsd_pd(__m128d a);
VBROADCASTSD __m256d _mm256_mask_broadcastsd_pd(__m256d s, __mmask8 k, __m128d a);
VBROADCASTSD __m256d _mm256_maskz_broadcastsd_pd( __mmask8 k, __m128d a);
VBROADCASTSD __m256d _mm256_broadcast_sd(double *a);
VBROADCASTSS __m512 _mm512_broadcastss_ps( __m128 a);
VBROADCASTSS __m512 _mm512_mask_broadcastss_ps(__m512 s, __mmask16 k, __m128 a);
VBROADCASTSS __m512 _mm512_maskz_broadcastss_ps( __mmask16 k, __m128 a);
VBROADCASTSS __m256 _mm256_broadcastss_ps(__m128 a);
VBROADCASTSS __m256 _mm256_mask_broadcastss_ps(__m256 s, __mmask8 k, __m128 a);
VBROADCASTSS __m256 _mm256_maskz_broadcastss_ps( __mmask8 k, __m128 a);
VBROADCASTSS __m128 _mm_broadcastss_ps(__m128 a);
VBROADCASTSS __m128 _mm_mask_broadcastss_ps(__m128 s, __mmask8 k, __m128 a);
VBROADCASTSS __m128 _mm_maskz_broadcastss_ps( __mmask8 k, __m128 a);
VBROADCASTSS __m128 _mm_broadcast_ss(float *a);
VBROADCASTSS __m256 _mm256_broadcast_ss(float *a);
VBROADCASTF128 __m256 _mm256_broadcast_ps(__m128 * a);
VBROADCASTF128 __m256d _mm256_broadcast_pd(__m128d * a);

来源