算术原语
操作码 | Fift 语法 | 堆栈 | Gas | 描述 |
---|---|---|---|---|
Please enter a search query | ||||
No results found |
TVM 指令内容列表
算术原语
加法、减法、乘法
xxxxxxx 操作码 | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift 语法 | xxxxxxxxxxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 | xxxx Gas |
---|---|---|---|---|
A0 | ADD | x y - x+y | 18 | |
A1 | SUB | x y - x-y | 18 | |
A2 | SUBR | x y - y-x | 等同于 SWAP SUB 。 | 18 |
A3 | NEGATE | x - -x | 等同于 -1 MULCONST 或 ZERO SUBR 。注意,如果 x=-2^256 时会触发整数溢出异常。 | 18 |
A4 | INC | x - x+1 | 等同于 1 ADDCONST 。 | 18 |
A5 | DEC | x - x-1 | 等同于 -1 ADDCONST 。 | 18 |
A6cc | [cc] ADDCONST [cc] ADDINT [-cc] SUBCONST [-cc] SUBINT | x - x+cc | -128 <= cc <= 127 。 | 26 |
A7cc | [cc] MULCONST [cc] MULINT | x - x*cc | -128 <= cc <= 127 。 | 26 |
A8 | MUL | x y - x*y | 18 |
除法
xxxxxxx 操作码 | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift 语法 | xxxxxxxxxxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 | xxxx Gas |
---|---|---|---|---|
A9mscdf | 这是除法的通用编码,可选进行预乘和用移位替换除法或乘法。变量字段如下:0 <= m <= 1 - 表示是否有预乘(MULDIV 及其变体),可能被左移替换。0 <= s <= 2 - 表示乘法或除法中的哪一个被移位替换:s=0 - 无替换,s=1 - 除法被右移替换,s=2 - 乘法被左移替换(仅当 m=1 时可能)。0 <= c <= 1 - 表示是否有移位操作符的一个字节常量参数 tt (如果 s!=0 )。对于 s=0 ,c=0 。如果 c=1 ,则 0 <= tt <= 255 ,并且移位由 tt+1 位执行。如果 s!=0 且 c=0 ,则移位量作为栈顶的 整数在 0...256 范围内提供。1 <= d <= 3 - 表示需要哪些除法结果:1 - 仅商,2 - 仅余数,3 - 商和余数。0 <= f <= 2 - 舍入模式:0 - 向下取整,1 - 最近整数,2 - 向上取整。下列所有指令均为此变体。 | 26 | ||
A904 | DIV | x y - q | q=floor(x/y) ,r=x-y*q | 26 |
A905 | DIVR | x y - q’ | q’=round(x/y) ,r’=x-y*q’ | 26 |
A906 | DIVC | x y - q'' | q’’=ceil(x/y) ,r’’=x-y*q’’ | 26 |
A908 | MOD | x y - r | 26 | |
A90C | DIVMOD | x y - q r | 26 | |
A90D | DIVMODR | x y - q' r' | 26 | |
A90E | DIVMODC | x y - q'' r'' | 26 | |
A925 | RSHIFTR | x y - round(x/2^y) | 26 | |
A926 | RSHIFTC | x y - ceil(x/2^y) | 34 | |
A935tt | [tt+1] RSHIFTR# | x y - round(x/2^(tt+1)) | 34 | |
A936tt | [tt+1] RSHIFTC# | x y - ceil(x/2^(tt+1)) | 34 | |
A938tt | [tt+1] MODPOW2# | x - x mod 2^(tt+1) | 34 | |
A98 | MULDIV | x y z - q | q=floor(x*y/z) | 26 |
A985 | MULDIVR | x y z - q' | q'=round(x*y/z) | 26 |
A98C | MULDIVMOD | x y z - q r | q=floor(x*y/z) ,r=x*y-z*q | 26 |
A9A4 | MULRSHIFT | x y z - floor(x*y/2^z) | 0 <= z <= 256 | 26 |
A9A5 | MULRSHIFTR | x y z - round(x*y/2^z) | 0 <= z <= 256 | 26 |
A9A6 | MULRSHIFTC | x y z - ceil(x*y/2^z) | 0 <= z <= 256 | 34 |
A9B4tt | [tt+1] MULRSHIFT# | x y - floor(x*y/2^(tt+1)) | 34 | |
A9B5tt | [tt+1] MULRSHIFTR# | x y - round(x*y/2^(tt+1)) | 34 | |
A9B6tt | [tt+1] MULRSHIFTC# | x y - ceil(x*y/2^(tt+1)) | 26 | |
A9C4 | LSHIFTDIV | x y z - floor(2^z*x/y) | 0 <= z <= 256 | 26 |
A9C5 | LSHIFTDIVR | x y z - round(2^z*x/y) | 0 <= z <= 256 | 26 |
A9C6 | LSHIFTDIVC | x y z - ceil(2^z*x/y) | 0 <= z <= 256 | 34 |
A9D4tt | [tt+1] LSHIFT#DIV | x y - floor(2^(tt+1)*x/y) | 34 | |
A9D5tt | [tt+1] LSHIFT#DIVR | x y - round(2^(tt+1)*x/y) | 34 | |
A9D6tt | [tt+1] LSHIFT#DIVC | x y - ceil(2^(tt+1)*x/y) | 26 |
移位、逻辑操作
xxxxxxx 操作码 | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift 语法 | xxxxxxxxxxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 | xxxx Gas |
---|---|---|---|---|
AAcc | [cc+1] LSHIFT# | x - x*2^(cc+1) | 0 <= cc <= 255 | 26 |
ABcc | [cc+1] RSHIFT# | x - floor(x/2^(cc+1)) | 0 <= cc <= 255 | 18 |
AC | LSHIFT | x y - x*2^y | 0 <= y <= 1023 | 18 |
AD | RSHIFT | x y - floor(x/2^y) | 0 <= y <= 1023 | 18 |
AE | POW2 | y - 2^y | 0 <= y <= 1023 等同于 ONE SWAP LSHIFT 。 | 18 |
B0 | AND | x y - x&y | 对两个有符号整数 x 和 y 进行按位与运算,符号扩展到无限。 | 18 |
B1 | OR | x y - x\|y | 对两个整数进行按位或运算。 | 18 |
B2 | XOR | x y - x xor y | 对两个整数进行按位异或运算。 | 18 |
B3 | NOT | x - ~x | 一个整数的按位非运算。 | 26 |
B4cc | [cc+1] FITS | x - x | 检查 x 是否为 cc+1 位有符号整数,对于 0 <= cc <= 255 (即 -2^cc <= x < 2^cc )。如果不是,要么触发整数溢出异常,要么用 NaN 替换 x (静默版本)。 | 26/76 |
B400 | CHKBOOL | x - x | 检查 x 是否为“布尔值”(即 0 或 -1)。 | 26/76 |
B5cc | [cc+1] UFITS | x - x | 检查 x 是否为 cc+1 位无符号整数,对于 0 <= cc <= 255 (即 0 <= x < 2^(cc+1) )。 | 26/76 |
B500 | CHKBIT | x - x | 检查 x 是否为二进制数字(即零或一)。 | 26/76 |
B600 | FITSX | x c - x | 检查 x 是否为 c 位有符号整数,对于 0 <= c <= 1023 。 | 26/76 |
B601 | UFITSX | x c - x | 检查 x 是否为 c 位无符号整数,对于 0 <= c <= 1023 。 | 26/76 |
B602 | BITSIZE | x - c | 计算最小的 c >= 0 使得 x 适合于 c 位有符号整数(-2^(c-1) <= c < 2^(c-1) )。 | 26 |
B603 | UBITSIZE | x - c | 计算最小的 c >= 0 使得 x 适合于 c 位无符号整数(0 <= x < 2^c ),或抛出范围检查异常。 | 26 |
B608 | MIN | x y - x or y | 计算两个整数 x 和 y 的最小值。 | 26 |
B609 | MAX | x y - x or y | 计算两个整数 x 和 y 的最大值。 | 26 |
B60A | MINMAX INTSORT2 | x y - x y or y x | 排序两个整数。如果任一参数为 NaN s,静默版本的此操作返回两个 NaN s。 | 26 |
B60B | ABS | x - \|x\| | 计算整数 x 的绝对值。 | 26 |
静默算术原语
静默操作在其参数之一为 NaN
或在整数溢出的情况下返回 NaN
,而不是抛出异常。
静默操作如下所示带有 Q
前缀。另一种使操作变为静默的方法是在其前添加 QUIET
(即可以写 QUIET ADD
而不是 QADD
)。
整数比较原语的静默版本也可用(QUIET SGN
,QUIET LESS
等)。
xxxxxxx 操作码 | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift 语法 | xxxxxxxxxxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 | xxxx Gas |
---|---|---|---|---|
B7A0 | QADD | x y - x+y | 26 | |
B7A1 | QSUB | x y - x-y | 26 | |
B7A2 | QSUBR | x y - y-x | 26 | |
B7A3 | QNEGATE | x - -x | 26 | |
B7A4 | QINC | x - x+1 | 26 | |
B7A5 | QDEC | x - x-1 | 26 | |
B7A8 | QMUL | x y - x*y | 26 | |
B7A904 | QDIV | x y - q | 如果 y=0 则除法返回 NaN 。 | 34 |
B7A905 | QDIVR | x y - q’ | 34 | |
B7A906 | QDIVC | x y - q'' | 34 | |
B7A908 | QMOD | x y - r | 34 | |
B7A90C | QDIVMOD | x y - q r | 34 | |
B7A90D | QDIVMODR | x y - q' r' | 34 | |
B7A90E | QDIVMODC | x y - q'' r'' | 34 | |
B7A985 | QMULDIVR | x y z - q' | 34 | |
B7A98C | QMULDIVMOD | x y z - q r | 34 | |
B7AC | QLSHIFT | x y - x*2^y | 26 | |
B7AD | QRSHIFT | x y - floor(x/2^y) | 26 | |
B7AE | QPOW2 | y - 2^y | 26 | |
B7B0 | QAND | x y - x&y | 26 | |
B7B1 | QOR | x y - x\|y | 26 | |
B7B2 | QXOR | x y - x xor y | 26 | |
B7B3 | QNOT | x - ~x | 26 | |
B7B4cc | [cc+1] QFITS | x - x | 如果 x 不是 cc+1 位有符号整数,则用 NaN 替换 x ,否则保持不变。 | 34 |
B7B5cc | [cc+1] QUFITS | x - x | 如果 x 不是 cc+1 位无符号整数,则用 NaN 替换 x ,否则保持不变。 | 34 |
B7B600 | QFITSX | x c - x | 如果 x 不是 c 位有符号整数,则用 NaN 替换 x ,否则保持不变。 | 34 |
B7B601 | QUFITSX | x c - x | 如果 x 不是 c 位无符号整数,则用 NaN 替换 x ,否则保持不变。 | 34 |