Skip to main content

6.3 组 3:FP64 与 SFU(unit: fp64 + sfu,64 条)

binary64 运算与转换(R / R1)(23 条)​

FADD​

语法(Syntax)

fadd.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d64 = s1_64 + s2_64(binary64)

变体编码延迟标志
fadd.f64R op opcode=0x1e f4=0x0fixed:16fm p64
FSUB​

语法(Syntax)

fsub.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d64 = s1_64 - s2_64(binary64)

变体编码延迟标志
fsub.f64R op opcode=0x1e f4=0x1fixed:16fm p64
FMUL​

语法(Syntax)

fmul.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d64 = s1_64 * s2_64(binary64)

变体编码延迟标志
fmul.f64R op opcode=0x1e f4=0x2fixed:16fm p64
FMIN​

语法(Syntax)

fmin.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d = minimumNumber(s1_64, s2_64)(-0 < +0;单 NaN 返回另一操作数)

变体编码延迟标志
fmin.f64R op opcode=0x1e f4=0x3fixed:16fm p64
FMAX​

语法(Syntax)

fmax.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d = maximumNumber(s1_64, s2_64)(-0 < +0;单 NaN 返回另一操作数)

变体编码延迟标志
fmax.f64R op opcode=0x1e f4=0x4fixed:16fm p64
FSGNJ​

语法(Syntax)

fsgnj.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d = {s2.sign, s1[62:0]}(binary64 符号注入)

变体编码延迟标志
fsgnj.f64R op opcode=0x1e f4=0x5fixed:16fm p64
FSGNJN​

语法(Syntax)

fsgnjn.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d = {~s2.sign, s1[62:0]}(binary64 符号注入)

变体编码延迟标志
fsgnjn.f64R op opcode=0x1e f4=0x6fixed:16fm p64
FSGNJX​

语法(Syntax)

fsgnjx.f64 rd:vp^2 rs1:vp^2 rs2:vp^2

描述:d = {s1.sign ^ s2.sign, s1[62:0]}(binary64 符号注入)

变体编码延迟标志
fsgnjx.f64R op opcode=0x1e f4=0x7fixed:16fm p64
FLDEXP​

语法(Syntax)

fldexp.f64 rd:vp^2 rs1:vp^2 rs2:v

描述:d64 = s1_64 * 2^(int32)s2

变体编码延迟标志
fldexp.f64R op opcode=0x1e f4=0x8fixed:16fm p64
FCLASS​

语法(Syntax)

fclass.f64 rd:v rs1:v

描述:d = fclass(s1_64)(RISC-V 10 位掩码)

变体编码延迟标志
fclass.f64R1 op opcode=0x20 f11=0x0fixed:16fm p64
FFLOOR​

语法(Syntax)

ffloor.f64 rd:vp^2 rs1:vp^2

描述:d = floor(s1_64)

变体编码延迟标志
ffloor.f64R1 op opcode=0x20 f11=0x1fixed:16fm p64
FCEIL​

语法(Syntax)

fceil.f64 rd:vp^2 rs1:vp^2

描述:d = ceil(s1_64)

变体编码延迟标志
fceil.f64R1 op opcode=0x20 f11=0x2fixed:16fm p64
FTRUNC​

语法(Syntax)

ftrunc.f64 rd:vp^2 rs1:vp^2

描述:d = trunc(s1_64)

变体编码延迟标志
ftrunc.f64R1 op opcode=0x20 f11=0x3fixed:16fm p64
FRNDNE​

语法(Syntax)

frndne.f64 rd:vp^2 rs1:vp^2

描述:d = round_half_even(s1_64)

变体编码延迟标志
frndne.f64R1 op opcode=0x20 f11=0x4fixed:16fm p64
FFRACT​

语法(Syntax)

ffract.f64 rd:vp^2 rs1:vp^2

描述:d = s1_64 - floor(s1_64)(钳到 < 1.0)

变体编码延迟标志
ffract.f64R1 op opcode=0x20 f11=0x5fixed:16fm p64
FCVT​

语法(Syntax)

fcvt.f64.f32 rd:vp^2 rs1:v
fcvt.f32.f64 rd:v rs1:vp^2
fcvt.i32.f64 rd:v rs1:vp^2
fcvt.u32.f64 rd:v rs1:vp^2
fcvt.f64.i32 rd:vp^2 rs1:v
fcvt.f64.u32 rd:vp^2 rs1:v
变体编码延迟语义标志
fcvt.f64.f32R1 op opcode=0x20 f11=0x6fixed:16d64 = double(s1)(精确;DAZ 看源宽度 32)fm p64
fcvt.f32.f64R1 op opcode=0x20 f11=0x7fixed:16d = float(s1_64),MODE.rmfm p64
fcvt.i32.f64R1 op opcode=0x20 f11=0x8fixed:16d = int32(s1_64),RTZ 饱和fm p64
fcvt.u32.f64R1 op opcode=0x20 f11=0x9fixed:16d = uint32(s1_64),RTZ 饱和fm p64
fcvt.f64.i32R1 op opcode=0x20 f11=0xafixed:16d64 = double(int32(s1))(精确)fm p64
fcvt.f64.u32R1 op opcode=0x20 f11=0xbfixed:16d64 = double(uint32(s1))(精确)fm p64
FREXP​

语法(Syntax)

frexp.mant.f64 rd:vp^2 rs1:vp^2
frexp.exp.f64 rd:v rs1:vp^2
变体编码延迟语义标志
frexp.mant.f64R1 op opcode=0x20 f11=0xcfixed:16d = frexp 尾数([0.5,1);NaN/inf 原样透传、不置标志)fm p64
frexp.exp.f64R1 op opcode=0x20 f11=0xdfixed:16d = frexp 指数(int32;0/inf/NaN → 0)fm p64

binary64 比较(C)(15 条)​

CMP​

语法(Syntax)

cmp.eq.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ne.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.lt.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.le.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.gt.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ge.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.o.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.u.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.equ.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.neu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ltu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.leu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.gtu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.geu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.class.f64 rd:u rs1:vp^2 rs2:v
变体编码延迟语义标志
cmp.eq.f64C op opcode=0x2a f5=0x6fixed:16U[d] = EXEC 内满足 s1_64 ordered == s2_64(binary64)的 lane 掩码re ur p64
cmp.ne.f64C op opcode=0x2a f5=0x7fixed:16U[d] = EXEC 内满足 s1_64 ordered != s2_64(binary64)的 lane 掩码re ur p64
cmp.lt.f64C op opcode=0x2a f5=0x8fixed:16U[d] = EXEC 内满足 s1_64 ordered < s2_64(binary64)的 lane 掩码re ur p64
cmp.le.f64C op opcode=0x2a f5=0x9fixed:16U[d] = EXEC 内满足 s1_64 ordered <= s2_64(binary64)的 lane 掩码re ur p64
cmp.gt.f64C op opcode=0x2a f5=0xafixed:16U[d] = EXEC 内满足 s1_64 ordered > s2_64(binary64)的 lane 掩码re ur p64
cmp.ge.f64C op opcode=0x2a f5=0xbfixed:16U[d] = EXEC 内满足 s1_64 ordered >= s2_64(binary64)的 lane 掩码re ur p64
cmp.o.f64C op opcode=0x2a f5=0xcfixed:16U[d] = EXEC 内满足 s1_64 ordered(均非 NaN) s2_64(binary64)的 lane 掩码re ur p64
cmp.u.f64C op opcode=0x2a f5=0xdfixed:16U[d] = EXEC 内满足 s1_64 unordered(任一 NaN) s2_64(binary64)的 lane 掩码re ur p64
cmp.equ.f64C op opcode=0x2a f5=0xefixed:16U[d] = EXEC 内满足 s1_64 unordered 或 == s2_64(binary64)的 lane 掩码re ur p64
cmp.neu.f64C op opcode=0x2a f5=0xffixed:16U[d] = EXEC 内满足 s1_64 unordered 或 != s2_64(binary64)的 lane 掩码re ur p64
cmp.ltu.f64C op opcode=0x2a f5=0x10fixed:16U[d] = EXEC 内满足 s1_64 unordered 或 < s2_64(binary64)的 lane 掩码re ur p64
cmp.leu.f64C op opcode=0x2a f5=0x11fixed:16U[d] = EXEC 内满足 s1_64 unordered 或 <= s2_64(binary64)的 lane 掩码re ur p64
cmp.gtu.f64C op opcode=0x2a f5=0x12fixed:16U[d] = EXEC 内满足 s1_64 unordered 或 > s2_64(binary64)的 lane 掩码re ur p64
cmp.geu.f64C op opcode=0x2a f5=0x13fixed:16U[d] = EXEC 内满足 s1_64 unordered 或 >= s2_64(binary64)的 lane 掩码re ur p64
cmp.class.f64C op opcode=0x2a f5=0x14fixed:16U[d] = EXEC 内 (fclass(s1_64) & s2) != 0 的 lane 掩码re ur p64

binary64 X 格式(2 条)​

FFMA​

语法(Syntax)

ffma.f64 rd:vp^2 rs1:vp^2 rs2:vp^2 rs3:vp^2 rm:rm neg:mod3 abs:mod3

描述:d64 = fma(s1_64, s2_64, s3_64)(显式 rm)

变体编码延迟标志
ffma.f64X op opcode=0x1 f10=0x13fixed:16fm rmo p64
FCVT​

语法(Syntax)

fcvt.f32.f64.m rd:v rs1:vp^2 rm:rm

描述:d = float(s1_64),显式 rm

变体编码延迟标志
fcvt.f32.f64.mX op opcode=0x1 f10=0x1bfixed:16fm rmo p64

SFU 近似(async:sfu)(16 条)​

RCP​

语法(Syntax)

rcp.f32 rd:v rs1:v
rcp.f64 rd:vp^2 rs1:vp^2
rcp.f16 rd:h rs1:h
变体编码延迟语义标志
rcp.f32R1 op opcode=0x22 f11=0x0async:sfud = 1/s1(正确舍入)ap fm
rcp.f64R1 op opcode=0x22 f11=0x8async:sfud = 1/s1_64(正确舍入;恒 RNE、不做 DAZ/FTZ)ap p64
rcp.f16H op opcode=0x9 f10=0x40async:sfud ≈ 1/s1(binary16;Vulkan 精度)h16 ap fm
RSQ​

语法(Syntax)

rsq.f32 rd:v rs1:v
rsq.f64 rd:vp^2 rs1:vp^2
rsq.f16 rd:h rs1:h
变体编码延迟语义标志
rsq.f32R1 op opcode=0x22 f11=0x1async:sfud ≈ 1/sqrt(s1)(忠实舍入,< 1 ulp)ap fm
rsq.f64R1 op opcode=0x22 f11=0x9async:sfud ≈ 1/sqrt(s1_64)(两步 RNE;恒 RNE;≥ 26 正确位)ap p64
rsq.f16H op opcode=0x9 f10=0x41async:sfud ≈ 1/sqrt(s1)(binary16;忠实舍入)h16 ap fm
SQRT​

语法(Syntax)

sqrt.f32 rd:v rs1:v
sqrt.f16 rd:h rs1:h
变体编码延迟语义标志
sqrt.f32R1 op opcode=0x22 f11=0x2async:sfud = sqrt(s1)(正确舍入;Vulkan 精度)ap fm
sqrt.f16H op opcode=0x9 f10=0x42async:sfud ≈ sqrt(s1)(binary16;Vulkan 精度)h16 ap fm
EXP2​

语法(Syntax)

exp2.f32 rd:v rs1:v
exp2.f16 rd:h rs1:h
变体编码延迟语义标志
exp2.f32R1 op opcode=0x22 f11=0x3async:sfud ≈ 2^s1(≤ 1 ulp;Vulkan 界)ap fm
exp2.f16H op opcode=0x9 f10=0x43async:sfud ≈ 2^s1(binary16;Vulkan 精度)h16 ap fm
LOG2​

语法(Syntax)

log2.f32 rd:v rs1:v
log2.f16 rd:h rs1:h
变体编码延迟语义标志
log2.f32R1 op opcode=0x22 f11=0x4async:sfud ≈ log2(s1)([0.5,2] 内绝对误差 ≤ 2^-21,其余 ≤ 3 ulp)ap fm
log2.f16H op opcode=0x9 f10=0x44async:sfud ≈ log2(s1)(binary16;Vulkan 精度)h16 ap fm
SIN​

语法(Syntax)

sin.f32 rd:v rs1:v
sin.f16 rd:h rs1:h
变体编码延迟语义标志
sin.f32R1 op opcode=0x22 f11=0x5async:sfud ≈ sin(2pis1)(输入单位为圈;Vulkan 界)ap fm
sin.f16H op opcode=0x9 f10=0x45async:sfud ≈ sin(2pis1)(binary16;输入单位为圈)h16 ap fm
COS​

语法(Syntax)

cos.f32 rd:v rs1:v
cos.f16 rd:h rs1:h
变体编码延迟语义标志
cos.f32R1 op opcode=0x22 f11=0x6async:sfud ≈ cos(2pis1)(输入单位为圈;Vulkan 界)ap fm
cos.f16H op opcode=0x9 f10=0x46async:sfud ≈ cos(2pis1)(binary16;输入单位为圈)h16 ap fm

除法与正确舍入平方根(async:sfu)(8 条)​

FSQRT​

语法(Syntax)

fsqrt.f32 rd:v rs1:v
fsqrt.f64 rd:vp^2 rs1:vp^2
变体编码延迟语义标志
fsqrt.f32R1 op opcode=0x22 f11=0x7async:sfud = sqrt(s1)(正确舍入,MODE.rm)fm
fsqrt.f64R1 op opcode=0x22 f11=0xaasync:sfud64 = sqrt(s1_64)(正确舍入,MODE.rm64)fm p64
DIV​

语法(Syntax)

div rd:v rs1:v rs2:v

描述:d = s1 /s s2(RISC-V:除零 → -1,INT_MIN/-1 → INT_MIN;永不陷阱)

变体编码延迟标志
divR op opcode=0x24 f4=0x0async:sfu-
DIVU​

语法(Syntax)

divu rd:v rs1:v rs2:v

描述:d = s1 /u s2(除零 → 0xffffffff;永不陷阱)

变体编码延迟标志
divuR op opcode=0x24 f4=0x1async:sfu-
REM​

语法(Syntax)

rem rd:v rs1:v rs2:v

描述:d = s1 %s s2(%0 → s1;永不陷阱)

变体编码延迟标志
remR op opcode=0x24 f4=0x2async:sfu-
REMU​

语法(Syntax)

remu rd:v rs1:v rs2:v

描述:d = s1 %u s2(%0 → s1;永不陷阱)

变体编码延迟标志
remuR op opcode=0x24 f4=0x3async:sfu-
FDIV​

语法(Syntax)

fdiv.f32 rd:v rs1:v rs2:v
fdiv.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
变体编码延迟语义标志
fdiv.f32R op opcode=0x24 f4=0x4async:sfud = s1 / s2(正确舍入,MODE.rm)fm
fdiv.f64R op opcode=0x24 f4=0x5async:sfud64 = s1_64 / s2_64(正确舍入)fm p64