【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(十)- 向量整数算术指令

  1. 引言

以下是《riscv-v-spec-1.0.pdf》文档的关键内容:
这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量算术指令格式、向量整数和浮点算术指令、向量归约操作、向量掩码指令、向量置换指令、异常处理以及标准向量扩展等。
首先,文档定义了向量元素和向量寄存器状态之间的映射关系,并阐述了向量指令的格式。在此基础上,提出了配置设置指令,如vsetvl、ivsetiv和vlsetvl,用于设定向量长度(VL)和向量对齐长度(AVL)。
接着,文档详细说明了向量加载和存储操作,以及向量内存对齐和一致性模型。这些模型确保了向量操作的高效性和准确性。
然后,文档介绍了向量算术指令格式,包括向量整数、固定点和浮点算术指令。这些指令支持广泛的数学运算,为高性能计算提供了强大的支持。
此外,文档还涉及向量归约操作、掩码指令和置换指令,这些指令增强了向量操作的灵活性和功能性。
最后,文档讨论了异常处理机制,并列举了标准向量扩展指令列表。这些扩展指令为向量处理器提供了丰富的功能集,使其能够适应不同的应用场景和性能需求。
综上所述,这份文档为向量指令集的设计和实现提供了全面的指导和参考,有助于开发者更好地理解和利用向量处理器的能力。

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(二)-向量元素到向量寄存器状态的映射-CSDN博客【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(三)-向量指令格式-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 向量加载和存储-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(六)- 向量内存一致性模型-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(九)- 向量整数算术指令-CSDN博客

13. 向量浮点指令

标准向量浮点指令将元素视为符合IEEE-754/2008标准的值。如果向量浮点操作数的元素宽度(EEW)不对应支持的IEEE浮点类型,则指令编码是保留的。

是否支持浮点,以及支持哪些元素宽度,是由特定的向量扩展决定的。当前的扩展集包括对32位和64位浮点值的支持。当添加16位和128位元素宽度时,它们也将被视为符合IEEE-754/2008标准的值。未来的扩展可能会支持其他浮点格式。

向量浮点指令要求存在与支持的向量浮点元素宽度相对应的基本标量浮点扩展。

注意:特别是,未来支持16位半精度浮点值的向量扩展也将需要一些标量半精度浮点支持。

如果浮点单元状态字段mstatus.FS处于关闭状态,则任何尝试执行向量浮点指令的操作都将引发非法指令异常。任何修改任何浮点扩展状态(即浮点CSR或f寄存器)的向量浮点指令必须将mstatus.FS设置为Dirty。

如果实现了虚拟机管理程序扩展且V=1,则vsstatus.FS字段对向量浮点指令也有效。如果vsstatus.FS或mstatus.FS处于关闭状态,则任何尝试执行向量浮点指令的操作都将引发非法指令异常。任何修改任何浮点扩展状态(即浮点CSR或f寄存器)的向量浮点指令必须将mstatus.FS和vsstatus.FS都设置为Dirty。

向量浮点指令在处理NaNs时与标量浮点指令具有相同的行为。

浮点向量-标量操作的标量值来源于“向量算术指令编码”部分所述。

13.1 向量浮点异常标志

在任何活动的浮点元素上发生的向量浮点异常都会在fflags寄存器中设置标准的FP异常标志。非活动元素不会设置FP异常标志。

13.2 向量浮点加法/减法指令

# Floating-point add		
vfadd.vv vd, vs2, vs1, vm	#	Vector-vector
vfadd.vf vd, vs2, rs1, vm	#	vector-scalar
# Floating-point subtract		
vfsub.vv vd, vs2, vs1, vm	#	Vector-vector
vfsub.vf vd, vs2, rs1, vm	#	Vector-scala r vd[i] = vs2[i] - f[rs1]
vfrsub.vf vd, vs2, rs1, vm	#	Scalar-vector vd[i] = f[rs1] - vs2[i]

13.3 向量扩展浮点加法/减法指令

# Widening FP add/subtract,2*SEW = SEW +/- SEW
vfwadd.vv vd, vs2, vs1, vm    # vector-vector
vfwadd.vf vd, vs2, rs1, vm    # vector-scalar
vfwsub.vv vd, vs2, vs1, vm    # vector-vector
vfwsub.vf vd, vs2, rs1, vm    # vector-scalar
# Widening FP add/subtract,2*SEW = 2*SEW +/- SEW
vfwadd.wv  vd, vs2, vs1, vm    # vector-vector
vfwadd.wf  vd, vs2, rs1, vm    # vector-scalar
vfwsub.wv  vd, vs2, vs1, vm    # vector-vector
vfwsub.wf  vd, vs2, rs1, vm	   # vector-scalar

13.4 向量浮点乘法/除法指令

# Floating-point multiply
vfmul.vv vd, vs2, vs1, vm   # Vector-vector
vfmul.vf vd, vs2, rs1, vm   # vector-scalar
# Floating-point divide
vfdiv.vv vd, vs2, vs1, vm   # Vector-vector
vfdiv.vf vd, vs2, rs1, vm   # vector-scalar
# Reverse floating-point divide vector = scalar / vector
vfrdiv.vf vd, vs2, rs1, vm  # scalar-vector, vd[i] = f[rs1]/vs2[i]

13.5 向量浮点扩展乘法指令

# Widening floating-point multiply
vfwmul.vv vd, vs2, vs1, vm # vector-vector
vfwmul.vf vd, vs2, rs1, vm # vector-scalar

13.6 向量浮点融合乘加指令

提供了所有四种类型的融合乘加,并且有两种破坏形式会覆盖其中一个操作数,即加数或第一个乘数。

# FP multiply-accumulate, overwrites addend
vfmacc.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vs2[i]) + vd[i]
vfmacc.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vs2[i]) + vd[i]
# FP negate-(multiply-accumulate), overwrites subtrahend
vfnmacc.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vs2[i]) - vd[i]
vfnmacc.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vs2[i]) - vd[i]
# FP multiply-subtract-accumulator, overwrites subtrahend
vfmsac.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vs2[i]) - vd[i]
vfmsac.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vs2[i]) - vd[i]
# FP negate-(multiply-subtract-accumulator), overwrites minuend
vfnmsac.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vs2[i]) + vd[i]
vfnmsac.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vs2[i]) + vd[i]
# FP multiply-add, overwrites multiplicand
vfmadd.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vd[i]) + vs2[i]
vfmadd.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vd[i]) + vs2[i]
# FP negate-(multiply-add), overwrites multiplicand
vfnmadd.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vd[i]) - vs2[i]
vfnmadd.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vd[i]) - vs2[i]
# FP multiply-sub, overwrites multiplicand
vfmsub.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vd[i]) - vs2[i]
vfmsub.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vd[i]) - vs2[i]
# FP negate-(multiply-sub), overwrites multiplicand
vfnmsub.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vd[i]) + vs2[i]
vfnmsub.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vd[i]) + vs2[i]

注意:虽然我们考虑使用标量FP FMA编码中未使用的两种舍入模式来提供一些非破坏性的FMA,但这些模式会因为是具有三个输入和单独输出的唯一可屏蔽操作而使微体系结构复杂化。

13.7 向量加宽浮点融合乘加指令

加宽的浮点融合乘加指令都会用结果覆盖宽的加数。乘数输入都是SEW宽,而加数和目标是2*SEW位宽。

# FP widening multiply-accumulate, overwrites addend
vfwmacc.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vs2[i]) + vd[i]
vfwmacc.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vs2[i]) + vd[i]
# FP widening negate-(multiply-accumulate), overwrites addend
vfwnmacc.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vs2[i]) - vd[i]
vfwnmacc.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vs2[i]) - vd[i]
# FP widening multiply-subtract-accumulator, overwrites addend
vfwmsac.vv vd, vs1, vs2, vm    # vd[i] = +(vs1[i] * vs2[i]) - vd[i]
vfwmsac.vf vd, rs1, vs2, vm    # vd[i] = +(f[rs1] * vs2[i]) - vd[i]
# FP widening negate-(multiply-subtract-accumulator), overwrites addend
vfwnmsac.vv vd, vs1, vs2, vm   # vd[i] = -(vs1[i] * vs2[i]) + vd[i]
vfwnmsac.vf vd, rs1, vs2, vm   # vd[i] = -(f[rs1] * vs2[i]) + vd[i]

13.8 向量浮点平方根指令

这是一条一元向量-向量指令。

# Floating-point square root
vfsqrt.v vd, vs2, vm   # Vector-vector square root

13.9 向量浮点平方根倒数指令

这是一条返回1/sqrt(x)的7位精确估计值的一元向量-向量指令。

# Floating-point reciprocal square-root	estimate	to	7	bits.
vfrsqrt7.v vd, vs2, vm	

注意:早期的草案版本使用了汇编器名称vfrsqrte7,但这被认为会与元素宽度的ex表示法造成混淆。为了向后兼容,早期的名称可以作为工具链中的别名保留。

下表描述了该指令对所有浮点输入类别的行为:

 Input

 Output

 Exceptions Raised

-∞ = x < -0.0

canonical NaN

NV

-0.0

-∞

DZ

+0.0

+∞

DZ

+0.0 < x < +∞

estimate of1/sqrt(x)

+∞

+0.0

qNaN

canonical NaN

sNaN

canonical NaN

NV

所有正常和次正常输入都会产生正常输出。输出值与动态舍入模式无关。

对于非异常情况,将指数的低位和尾数(最高位之后)的高6位进行连接,并用于查询以下表格。该表的输出将成为结果尾数(在首位之后)的高7位;结果尾数的其余部分为零。在查找之前,会将次正规输入正规化,并适当调整指数。选择输出指数以使结果近似于参数的平方根的倒数。

更精确地说,结果的计算方法如下。如果输入是正常的,那么让正规化输入指数等于输入指数,否则等于0减去尾数中的前导零的数量。如果输入是次正规的,那么通过将输入尾数向左移动1减去正规化输入指数的位数来获得正规化输入尾数,同时丢弃前导的1位。输出指数等于floor((3*B - 1 - 正规化输入指数) / 2)(floor表示向下取整)。输出符号等于输入符号。

下表给出了输出尾数的7个最高有效位(MSBs),作为正规化输入指数的最低有效位(LSB)和正规化输入尾数的6个最高有效位的函数;输出尾数的其他位均为零。

Table 16. vfrsqrt7.v common-case lookup table contents

exp[0]

sig[MSB -: 6]

sig__out[MSB -: 7]

0

0 ~ 63

52 ~ 0

1

0 ~ 63

127 ~ 53

注释:例如,当SEW=32时,vfrsqrt7(0x00718abc (≈ 1.043e-38)) = 0x5f080000 (≈ 9.800e18),而vfrsqrt7(0x7f765432 (≈ 3.274e38)) = 0x1f820000 (≈ 5.506e-20)。

选择7位精度是因为它分别需要0、1、2、3次牛顿-拉弗森迭代才能接近bfloat16、FP16、FP32、FP64的精度。未来的指令可以定义更高的估算精度。

13.10 向量浮点倒数指令

# Floating-point reciprocal estimate	to	7	bits.
vfrec7.v vd, vs2, vm	

早期草稿版本使用了汇编程序名vfrece7,但这被认为会与元素宽度的ex表示法造成混淆。为了向后兼容,早期的名称可以作为工具链中的别名保留。

这是一条向量-向量一元指令,它返回一个精确到7位的1 / x的估算值。

下表描述了该指令对于所有浮点输入类别的行为,其中B是指数偏差:

 Input(x)

Rounding Mode

Ouput(y- 1/x)

Exceptions Raised

-∞

any

-0.0

-2B+1 < x = -2B (normal)

any

-2-(B+1) ≥ y > -2-B (subnormal, sig=01…)

-2B < x = -2B-1 (normal)

any

-2-B ≥ y > -2-B+1 (subnormal, sig=1…)

-2B-1 < x = -2-B+1 (normal)

any

-2-B+1 ≥ y > -2B-1 (normal)

-2-B+1 < x = -2-B (subnormal, sig=1…)

any

-2B-1 ≥ y > -2B (normal)

-2-B < x = -2-(B+1) (subnormal, sig=01…)

any

-2B ≥ y > -2B+1 (normal)

-2-(B+1) < x < -0.0 (subnormal, sig=00…)

RUP, RTZ

greatest-mag. negative inite value

NX, OF

-2-(B+1) < x < -0.0 (subnormal, sig=00…)

RDN, RNE, RMM

-∞

NX, OF

-0.0

any

-∞

DZ

+0.0

any

+∞

DZ

+0.0 < x < 2-(B+1) (subnormal, sig=00…)

RUP, RNE, RMM

+∞

NX, OF

+0.0 < x < 2-(B+1) (subnormal, sig=00…)

RDN, RTZ

greatest inite value

NX, OF

2-(B+1) = x < 2-B (subnormal, sig=01…)

any

2B+1 > y ≥ 2B (normal)

2-B = x < 2-B+1 (subnormal, sig=1…)

any

2B > y ≥ 2B-1 (normal)

2-B+1 = x < 2B-1 (normal)

any

2B-1 > y ≥ 2-B+1 (normal)

2B-1 = x < 2B (normal)

any

2-B+1 > y ≥ 2-B (subnormal, sig=1…)

2B = x < 2B+1 (normal)

any

2-B > y ≥ 2-(B+1) (subnormal, sig=01…)

+∞

any

+0.0

qNaN

any

canonical NaN

sNaN

any

canonical NaN

NV

注意:次正规输入中,那些大小至少为2-(B+1)的输入会产生正规输出;其他次正规输入会产生无穷大的输出。正规输入中,那些大小至少为2B-1的输入会产生次正规输出;其他正规输入会产生正规输出。

当发生溢出异常时,输出值取决于动态舍入模式。

对于非异常情况,尾数的高7位(在最高位之后)用于查询以下表格。该表的输出将成为结果尾数(在首位之后)的高7位;结果尾数的其余部分为零。在查找之前,会将次正规输入正规化,并适当调整指数。选择输出指数以使结果近似于参数的倒数,并相应地使次正规输出反规范化。

更精确地说,结果的计算方法如下。如果输入是正常的,那么让正规化输入指数等于输入指数,否则等于0减去尾数中的前导零的数量。正规化输出指数等于(2B - 1 - 正规化输入指数)。如果正规化输出指数超出范围[-1, 2B],则结果对应于上表中异常情况之一。

如果输入是次正规的,那么通过将输入尾数向左移动1减去正规化输入指数的位数来获得正规化输入尾数,同时丢弃前导的1位。否则,正规化输入尾数等于输入尾数。下表给出了正规化输出尾数的7个最高有效位(MSBs),作为正规化输入尾数的7个最高有效位的函数;正规化输出尾数的其他位均为零。

Table 17. vfrec7.v common-case lookup table contents

sig[MSB -: 7]

sig__out[MSB -: 7]

0 ~127

127 ~ 0

如果正规化输出指数为0或-1,则结果为次正规数:输出指数为0,并且输出尾数通过将正规化输出尾数的左侧连接一个1位,然后将该数量向右移动1减去正规化输出指数的位数来获得。否则,输出指数等于正规化输出指数,输出尾数等于正规化输出尾数。输出符号等于输入符号。

注意:例如,当SEW=32时,vfrec7(0x00718abc (≈ 1.043e-38)) = 0x7e900000 (≈ 9.570e37),而vfrec7(0x7f765432 (≈ 3.274e38)) = 0x00214000 (≈ 3.053e-39)。

选择7位精度是因为它分别需要0、1、2、3次牛顿-拉弗森迭代才能接近bfloat16、FP16、FP32、FP64的精度。未来的指令可以定义更高的估算精度。

13.11 向量浮点最大/最小值指令

向量浮点vfm in和vfmax指令的行为与RISC-V F/D/Q扩展2.2版中的相应标量浮点指令相同。

# Floating-point minimum
vfmin.vv vd, vs2, vs1, vm   # Vector-vector
vfmin.vf vd, vs2, rs1, vm   # vector-scalar
# Floating-point maximum
vfmax.vv vd, vs2, vs1, vm   # Vector-vector
vfmax.vf vd, vs2, rs1, vm   # vector-scalar

13.12 向量注入指令

标量符号注入指令的向量版本。结果从向量vs2操作数中获取除符号位以外的所有位。

vfsgnj.vv vd, vs2, vs1, vm	#	Vector-vector
vfsgnj.vf vd, vs2, rs1, vm	#	vector-scalar
vfsgnjn.vv	vd,	vs2,	vs1,	vm	#	Vector-vector
vfsgnjn.vf	vd,	vs2,	rs1,	vm	#	vector-scalar
vfsgnjx.vv	vd,	vs2,	vs1,	vm	#	Vector-vector
vfsgnjx.vf	vd,	vs2,	rs1,	vm	#	vector-scalar

注意:可以使用符号注入指令将浮点数值向量的符号取反,其中两个源操作数都设置为相同的向量操作数。提供了一个汇编伪指令:vfneg.v vd,vs=vfsgnjn.vv vd,vs,vs。

可以使用符号注入指令和两个源操作数都设置为相同的向量操作数来计算浮点元素向量的绝对值。提供了一个汇编伪指令:vfabs.v vd,vs=vfsgnjx.vv vd,vs,vs。

13.13 向量比较指令

这些向量FP比较指令将两个源操作数进行比较,并将比较结果写入掩码寄存器。目标掩码向量始终保存在单个向量寄存器中,元素布局如“掩码寄存器布局”部分所述。目标掩码向量寄存器可能与源向量掩码寄存器(v0)相同。比较指令写入掩码寄存器,因此总是在无尾策略下操作。

比较指令遵循标量浮点比较指令的语义。vmfeq和vmfne仅在发出NaN信号时引发无效操作异常。vmflt、vmfle、vmfgt和vmfge在发出信号和静默NaN输入时都会引发无效操作异常。当任一操作数为NaN时,vmfne将1写入目标元素,而其他比较在任一操作数为NaN时写入0。

# Compare equal	
vmfeq.vv vd, vs2, vs1,	vm  # Vector-vector
vmfeq.vf vd, vs2, rs1,	vm  # vector-scalar
# Compare not equal	
vmfne.vv vd, vs2, vs1,	vm  # Vector-vector
vmfne.vf vd, vs2, rs1,	vm  # vector-scalar
# Compare less than	
vmflt.vv vd, vs2, vs1,	vm  # Vector-vector
vmflt.vf vd, vs2, rs1,	vm  # vector-scalar
# Compare less than or	equal
vmfle.vv vd, vs2, vs1,	vm  # Vector-vector
vmfle.vf vd, vs2, rs1,	vm  # vector-scalar
# Compare greater than	
vmfgt.vf vd, vs2, rs1,	vm  # vector-scalar
# Compare greater than	or equal
vmfge.vf vd, vs2, rs1,	vm  # vector-scalar
Comparison Assembler Mapping Assembler pseudoinstruction
va < vb    vmflt.vv vd, va, vb, vm
va <= vb    vmfle.vv vd, va, vb, vm
va > vb    vmflt.vv vd, vb, va, vm    vmfgt.vv vd, va, vb, vm
va >= vb    vmfle.vv vd, vb, va, vm    vmfge.vv vd, va, vb, vm
va < f    vmflt.vf vd, va, f, vm
va <= f    vmfle.vf vd, va, f, vm
va > f    vmfgt.vf vd, va, f, vm
va >= f    vmfge.vf vd, va, f, vm
va, vb vector register groups
f      scalar floating-point register	

注意:提供所有形式是必要的,以便正确处理NaN的无序比较。

当任一输入为NaN时,可以通过屏蔽信号比较来实现C99浮点静默比较,如下所示。当被比较数是非NaN常量时,可以省略中间的两个指令。

# Example of	implementing	isgreater()	
vmfeq.vv	v0,	va,	va		#	Only	set	where	A	is not NaN .
vmfeq.vv	v1,	vb,	vb		#	Only	set	where	B	is not NaN .
vmand.mm	v0,	v0,	v1		#	Only	set	where	A	and B are ordered,
vmfgt.vv	v0,	va,	vb,	v0.t	#  so only	set flags on ordered values.

注意:在上面的序列中,很容易想要屏蔽第二个vmfeq指令并移除vmand指令,但这种更高效的序列在va的一个元素包含静默NaN,而vb中对应的元素包含发出信号的NaN时,无法正确引发无效异常。

13.14 向量浮点分类指令

这是一个向量-向量一元指令,其操作方式与标量分类指令相同。

vfclass.v vd, vs2, vm	# Vector-vector

此指令生成的10位掩码放置在结果元素的最低位中。结果的高位(SEW-10)用零填充。该指令仅针对SEW=16b及以上定义,因此结果将始终位于目标元素中。

13.15 向量-标量浮点合并指令

提供了一个向量-标量浮点合并指令,该指令对vstart到vl中当前向量长度的所有主体元素进行操作,无论掩码值如何。

vfmerge.vfm指令被编码为屏蔽指令vm=0。在掩码值为零的元素处,将第一个向量操作数复制到目标元素,否则将标量浮点寄存器值复制到目标元素。

vfmerge.vfm vd, vs2, rs1, v0  # vd[i] = v0.mask[i] ? f[rs1] : vs2[i]

13.16 向量浮点移位指令

向量浮点移位指令将浮点标量操作数分散到一个向量寄存器组中。该指令将一个标量f寄存器值复制到向量寄存器组的所有活动元素。此指令被编码为屏蔽指令vm=1。该指令必须将vs2字段设置为v0,vs2的所有其他值均保留。

vfmv.v.f vd, rs1  # vd[i] = f[rs1]

注意:vfmv.v.f指令与vfmerge.vfm指令共享编码,但vm=1且vs2=v0。

13.17 浮点/整数转换指令

提供转换操作以在浮点值和无符号整数及有符号整数之间进行转换,其中源和目标都是SEW宽度。

vfcvt.xu.f.v vd,	vs2, vm	#	Convert	float to unsigned integer.
vfcvt.x.f.v  vd,	vs2, vm	#	Convert	float to signed integer.
vfcvt.rtz.xu.f.v	vd,	vs2,	vm	#	Convert	float to unsigned integer, truncating.
vfcvt.rtz.x.f.v	vd,	vs2,	vm	#	Convert	float to signed integer, truncating.
vfcvt.f.xu.v vd,	vs2,	vm		#	Convert	unsigned integer to float.
vfcvt.f.x.v  vd,	vs2,	vm		#	Convert	signed integer to float.

转换在异常情况下遵循与标量转换指令相同的规则。转换使用frm中的动态舍入模式,但rtz变体除外,它们向零舍入。

提供rtz变体以加速从浮点到整数的截断转换,这在C和Java等语言中很常见。

13.18 扩展浮点/整数转换指令

提供了一组转换指令,用于在较窄的整数和浮点数据类型与宽度为两倍的类型之间进行转换。

vfwcvt.xu.f.v vd,	vs2, vm	#	Convert	float to double-width unsigned integer.
vfwcvt.x.f.v  vd,	vs2, vm	#	Convert	float to double-width signed integer.
vfwcvt.rtz.xu.f.v	vd, vs2, vm	#	Convert	float to double-width unsigned integer, truncating.
vfwcvt.rtz.x.f.v	vd, vs2, vm	#	Convert	float to double-width signed integer, truncating.
vfwcvt.f.xu.v vd,	vs2, vm	#	Convert	unsigned integer to double-width float.
vfwcvt.f.x.v  vd,	vs2, vm	#	Convert	signed integer to double-width float.
vfwcvt.f.f.v vd, vs2, vm	#	Convert	single-width float to double-width float.

这些指令对向量寄存器重叠的约束与其他加宽指令相同(见加宽向量算术指令)。

双宽度IEEE浮点值总是可以准确地表示单宽度整数。

双宽度IEEE浮点值总是可以准确地表示单宽度IEEE浮点值。

不支持将浮点加宽转换作为单个指令的完整集合,但任何加宽转换都可以通过几个加倍步骤来实现,结果等效,并且不会引发额外的异常标志。

13.19 压缩浮点/整数类型转换

提供了一组转换指令,用于将更宽的整数和浮点数据类型转换为宽度为一半的类型。

vfncvt.xu.f.w vd, vs2, vm	#	Convert double-width float to unsigned integer.
vfncvt.x.f.w  vd, vs2, vm	#	Convert double-width float to signed integer.
vfncvt.rtz.xu.f.w vd, vs2, vm	#	Convert double-width float to unsigned integer, truncating.
vfncvt.rtz.x.f.w  vd, vs2, vm	#	Convert double-width float to signed integer, truncating.
vfncvt.f.xu.w vd, vs2, vm	#	Convert double-width unsigned integer to float.
vfncvt.f.x.w  vd, vs2, vm	#	Convert double-width signed integer to float.
vfncvt.f.f.w vd, vs2, vm	#	Convert double-width float to single-width float.
vfncvt.rod.f.f.w vd, vs2, vm	# 	Convert double-width float to single-width float, #rounding towards odd.

这些指令对向量寄存器重叠的约束与其他缩小指令相同(见缩小向量算术指令)。

不支持将浮点缩小转换作为单个指令的完整集合。转换可以通过一系列减半步骤来实现。如果使用除最后一次减半步骤外的所有步骤都使用向奇数舍入(vfncvt.rod.f.f.w),则结果将等效舍入,并会引发相同的异常标志。只有最后一步应该使用所需的舍入模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献速递:深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险

文献速递&#xff1a;深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险 麦田医学 美好事物中转站 2024-04-02 14:36 Title 题目 A deep learning algorithm to predict risk of pancreatic cancer from disease trajectories 深度学习算法用于从疾病轨迹预测…

Redis 客户端

Redis 客户端 客户端-服务器结构 Redis 同 Mysql 一样&#xff0c;也是一个客户端-服务器结构的程序&#xff0c;结构如下图&#xff1a; 注&#xff1a;Redis 客户端和服务器可以在同一个主机上&#xff0c;也可以在不同主机上 Redis 客户端的多种形态 自带的命令行客户端&…

HTML:表单

案例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>报名表</title> </head> <body><form action"demo/welcome.php" method"post">名字&#xff1a;<inpu…

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…

金融企业区域集中库的设计构想和测试验证

导读 本文探讨了金融企业区域集中库的设计构想和测试验证&#xff0c;包括架构设想、数据库整合场景测试及优势和使用设想。作者提出利用 TiDB 数据库产品集中建设区域集中库&#xff0c;解决 MySQL 存量节点的整合问题&#xff0c;实现部署的标准化、按需扩展和统一运维管理。…

ArcGIS10.8保姆式安装教程

ArcGIS 10.8是一款非常强大的地理信息系统软件&#xff0c;用于创建、管理、分析和可视化地理数据。以下是ArcGIS 10.8的详细安装教程&#xff1a; 确保系统满足安装要求 在开始安装之前&#xff0c;请确保您的计算机满足以下系统要求&#xff1a; 操作系统&#xff1a;Windo…

【算法集训】基础算法:前缀和 | 习题篇

习题 1480. 一维数组的动态和 简单的前缀和 int* runningSum(int* nums, int numsSize, int* returnSize){int * ret (int *)malloc(sizeof(int) * numsSize);ret[0] nums[0];for(int i 1; i < numsSize; i) {ret[i] ret[i - 1] nums[i];}*returnSize numsSize;ret…

阿里云4核8G服务器ECS通用算力型u1实例优惠价格

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

逻辑回归详解

逻辑回归详解 逻辑回归&#xff0c;虽然名字中带有“回归”二字&#xff0c;但实际上它是一种分类算法&#xff0c;被广泛用于处理二分类问题。在机器学习和统计学习中&#xff0c;逻辑回归占据了重要的地位&#xff0c;是数据科学家和机器学习工程师的必备工具。本文将详细解…

11 flink-sql 中基于 mysql-cdc 连接 mysql-pxc 集群无法获取增量数据问题

前言 问题是来自于 群友, 2024.03.29, 也是花了一些时间 来排查这个问题 大致的问题是用 mysql-cdc 连接了一个 mysql-pxc 集群, 然后创建了一个 test_user 表 使用 "select * from test_user" 获取数据表的数据, 可以拿到 查询时的快照, 但是 无法获取到后续对…

拾光坞N3 ARM 虚拟主机 i茅台项目

拾光坞N3 在Dcoker部署i茅台案例 OS&#xff1a;Ubuntu 22.04.1 LTS aarch64 cpu&#xff1a;RK3566 ram&#xff1a;2G 部署流程——》mysql——》java8——》redis——》nginx mysql # 依赖 apt update apt install -y net-tools apt install -y libaio* # 下载mysql wg…

CSS设置字体样式

目录 前言&#xff1a; 1.font-family&#xff1a; 2.font-style&#xff1a; 3.font-weight&#xff1a; 4.font-size&#xff1a; 5.font-variant&#xff1a; 6.font&#xff1a; 前言&#xff1a; 在网页中字体是重要的组成部分&#xff0c;使用好字体可以让网页更…

[AIGC] Spring Interceptor 拦截器详解

文章目录 什么是Spring Interceptor如何使用Spring InterceptorSpring Interceptor的影响 什么是Spring Interceptor Interceptor&#xff08;拦截器&#xff09;是Spring MVC框架中的一种特性&#xff0c;类似于Servlet开发中的Filter&#xff08;过滤器&#xff09;&#xf…

一点点安全资料:数通知识扩展

工具 ENSP 华为防火墙 华为防火墙是华为提供的一种网络安全产品&#xff0c;设计用来保护企业网络不受未经授权访问和各种网络威胁的侵害。华为防火墙采用先进的技术&#xff0c;以确保网络安全&#xff0c;同时提供高性能的数据处理能力。下面我们就来详细了解一下华为防火墙…

Spring 面试题(三)

1. Spring Bean 支持哪几种作用域? Spring Bean支持以下五种作用域&#xff1a; Singleton&#xff08;单例&#xff09;&#xff1a;这是Spring默认的作用域。它表示在整个Spring IoC容器中&#xff0c;只会创建一个bean实例。这种作用域适用于那些无状态的bean&#xff0c…

Java常用函数接口

Java常用函数接口 Java 8 中引入的常用函数式接口&#xff0c;也就是 java.util.function 包中的接口。这些接口提供了一种简洁的方式来定义函数&#xff0c;常用于 Lambda 表达式和方法引用。下面是一些常用的接口&#xff1a; 一、Predicate&#xff08;断言&#xff09; …

go实现工厂模式

在Go中实现工厂模式&#xff0c;可以定义一个工厂接口和实现该接口的具体工厂类型。以下是一个简单的例子&#xff1a; package main import "fmt" // 定义一个接口&#xff0c;所有的具体产品都需要实现这个接口 type Product interface { Use() string } …

前端学习之DOM编程星星点灯案例

这个案例的实现逻辑是当你点击屏幕时&#xff0c;会完成一个事件&#xff0c;在你的屏幕上生成一张星星图片。然后再设置星星图片的大小将其改为随机。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

js和ts中的null与undefined

本文在个站同步发布&#xff0c;您可以在>>这里看到最新的文章。 1 定义 本文中的undefined和null指变量的字面值&#xff1a; undefined&#xff1a;已声明但未初始化的变量值null&#xff1a;未定义&#xff08;不存在&#xff09;的变量值 例如&#xff1a; var v…

代码随想录刷题——5双指针法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言5.1 移除元素&#xff08;3.30&#xff09;5.2 翻转字符串&#xff08;3.30&#xff09;5.3 替换数字&#xff08;3.30&#xff09;5.4 翻转字符串里的单词(3.3…