Types VM-减少不同类型的指令数?

Types VM-减少不同类型的指令数?,types,instructions,vm-implementation,Types,Instructions,Vm Implementation,我正在开发一个实验性的VM,为了安全起见,现在我有一个单独的指令用于每个类型的所有数据类型操作。例如,对于8、16、32和64位有符号和无符号整数,以及浮点、双精度和长双精度,我有一条ADD指令。这是一次操作的11个说明。现在确实有些操作只支持某些类型,但即便如此,我最终还是得到了大量的说明和很少的可用空间 因此,我想知道一些指令是否可以在不考虑底层类型的情况下运行,这样我就可以减少数量并为将来急需的更多指令腾出空间,因为我不希望指令超过一个字节。而不是使用ADD,SUB等。。对于每种数据类型,

我正在开发一个实验性的VM,为了安全起见,现在我有一个单独的指令用于每个类型的所有数据类型操作。例如,对于8、16、32和64位有符号和无符号整数,以及浮点、双精度和长双精度,我有一条ADD指令。这是一次操作的11个说明。现在确实有些操作只支持某些类型,但即便如此,我最终还是得到了大量的说明和很少的可用空间


因此,我想知道一些指令是否可以在不考虑底层类型的情况下运行,这样我就可以减少数量并为将来急需的更多指令腾出空间,因为我不希望指令超过一个字节。

而不是使用
ADD
SUB
等。。对于每种数据类型,为什么不让它们在“寄存器”上运行,并对所有数据类型使用
MOV
like指令,这些数据类型将调零/符号扩展寄存器的其余部分(如果有的话)


这当然是假设你的虚拟机中有类似的东西。您可能需要在问题中添加更多信息。

您没有太多选择,除非每个表达式在运行时都携带自己的类型信息

真正的处理器是这样做的:先有一个操作码,然后是一种操作数代码,告诉处理器使用哪种操作数。例如,你可以说

enum Operator {
    Add,
    Sub,
    And,
    ...
};
enum Operand {
    Memory,
    Immediate,
    Reg1,
    Reg2,
    ...
};
struct Instruction {
    Operator op;
    Operand lhs;
    Operand rhs;
};
此外,有些指令(如add和sub)不需要知道有符号和无符号之间的区别。这是2的补码的优点之一


通常,每个寄存器的宽度是固定的(例如,x86为32位),如果要对最低的8位进行操作,则首先用and操作屏蔽其他24位。当然,在x86上,我认为在某些情况下,您仍然可以使用8位、16位寄存器来引用32位寄存器的一部分。

Java虚拟机通过只支持某些操作来解决这个问题,如
ADD
SUB
类型
long
(64)、
double
(64 fp)和
int
(32)。然后,它提供大量转换指令,将32位类型转换为16位和8位(有符号和无符号)

当然,这种方法只有在所需转换操作的数量少于每种类型的特殊
ADD
SUB
MUL
DIV
等操作的数量时才是有利的

如果需要添加两个16位变量,则使用
16_to_32
指令将它们移动到32位寄存器,并执行32位
ADD_32
。然后取结果,用一个
32_to_16
位操作将其转换为16位变量,该操作会截断结果以适合16位变量

然后,您的
x_to_y
指令可以处理有符号或无符号转换所需的符号扩展或零扩展


如果您对jvm是如何做到这一点感兴趣,请看一下。

因此,我可能会放弃8位和16位操作,使用32位和64位值,并且仅在需要时和需要时转换为字节或短,32位和6位操作占用的时间与8位和16位操作占用的时间相同。对于unsigned,我甚至不需要强制转换,只需要使用相同的地址,但更少的位。