【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),则结果将等效舍入,并会引发相同的异常标志。只有最后一步应该使用所需的舍入模式。

 

 

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RISC-V是一种开放的指令集架构,它是根据精简指令集计算机(RISC)的原则设计的。RISC-V指令集中文版是对RISC-V指令集进行中文翻译的版本。这个翻译版本的目的是为了方便中文用户理解和使用RISC-V指令集RISC-V指令集中文版包括了一系列指令,用于执行不同的计算和操作。这些指令可以分为几个类别,包括算术指令、逻辑指令、存储访问指令、控制转移指令等。 算术指令主要用于实现加法、减法、乘法和除法等算术运算。逻辑指令主要用于实现逻辑运算,如与、或和非等。存储访问指令用于访问存储器中的数据,包括读取和写入操作。控制转移指令用于控制程序的执行流程,如跳转、函数调用等。 RISC-V指令集中文版的设计遵循了精简指令集计算机的原则,它采用了固定长度的指令格式,每条指令都有相同数量的位数。这种设计简化了指令的解码和执行过程,提高了指令的执行效率。 通过使用RISC-V指令集中文版,开发者可以更容易地编写和调试程序。同时,由于RISC-V是开放的指令集架构,任何人都可以自由使用和扩展它,这为开发者提供了更大的灵活性和创造性。 总之,RISC-V指令集中文版是一种开放的、简洁而功能强大的指令集架构,它为中文用户提供了一种更加便捷和灵活的编程方式。 ### 回答2: RISC-V是一种开源的指令集架构,其设计目标是简洁、清晰和可扩展RISC-V指令集的中文版描述了指令的功能和操作方式,以便于中文用户理解和使用。 RISC-V指令集中包括了基本的指令扩展指令。基本指令包括了加载、存储、算术、逻辑、控制等常用的操作。例如,LOAD指令可以从内存中加载数据到寄存器中,STORE指令可以将寄存器的数据存储到内存中。算术指令比如ADD、SUB、MUL等可以执行加法、减法、乘法等运算。逻辑指令如AND、OR、XOR可以进行与、或、异或等逻辑运算。控制指令如BRANCH、JUMP可以用于条件判断和跳转。这些基本指令可以满足大部分应用的需求。 扩展指令则可根据应用需求进行定制。例如,浮点指令扩展可以添加浮点数运算指令向量指令扩展可以添加向量运算指令。这些扩展指令能够满足不同应用领域的需求,提高了RISC-V指令集的通用性和灵活性。 RISC-V指令集中的指令使用类似于汇编语言的格式进行描述。每个指令由操作码和操作数组成。操作码表示指令的功能,操作数则是用于指定操作的寄存器或者内存地址。指令可以通过相应的汇编器进行编译,生成机器码后可以在RISC-V架构的处理器上执行。 总的来说,RISC-V指令集中文版提供了详细的指令描述和例子,使得中文用户可以理解和使用这个开源指令集,并且可以根据需要进行扩展,以满足不同应用场景的需求。 ### 回答3: RISC-V指令集是一种开源的、精简的指令集架构。其设计思想是为了简化处理器架构,提供更高的性能和灵活性。 RISC-V指令集的设计原则是简化和统一。它采用了固定大小的指令格式,指令长度为32位,其中包含指令操作码、操作数和地址等。这种设计能够提高指令的解码效率,并且使得指令的执行速度更快。 RISC-V指令集提供了丰富的指令集扩展方式,可以根据特定应用的需求进行扩展。这样的设计使得RISC-V成为了一种高度可定制化的指令集架构,适用于多种不同的应用领域。 另外,RISC-V指令集还提供了多种特权级别的支持。在特权级别方面,RISC-V定义了四个特权级别:用户模式、监管模式、机器模式和超级模式。这样的设计使得RISC-V可以适应不同的操作环境和安全需求。 最后,RISC-V指令集是一种开源的指令集架构,这意味着任何人都可以使用、修改和贡献代码。这种开源的特性促进了RISC-V的发展和创新,使得更多的人参与到指令集架构的设计和优化中。 总而言之,RISC-V指令集是一种开源的、精简的指令集架构,它具有简洁统一、可扩展性强、支持多种特权级别等特点。这些特性使得RISC-V成为了一种广泛应用的指令集架构,并在众多领域受到了广泛的关注和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值