【问题标题】:VM - reducing number of instructions for different types?VM - 减少不同类型的指令数量?
【发布时间】:2013-08-10 14:58:01
【问题描述】:

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

所以我想知道是否有一些指令可以不管下面的类型如何操作,所以我可以减少数量并为将来迫切需要的更多指令腾出空间,因为我不想超过指令的一个字节。

【问题讨论】:

    标签: types instructions vm-implementation


    【解决方案1】:

    而不是 ADDSUB 等。对于每种数据类型,为什么不让它们在“寄存器”上操作,并为所有数据类型设置 MOV 类似指令,这些指令将归零/符号扩展其余部分(如果有的话)登记册。

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

    【讨论】:

      【解决方案2】:

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

      真正的处理器如何做到这一点是有一个操作码,然后是一种告诉处理器使用哪种操作数的操作数代码。例如,你可能会说

      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 位寄存器的一部分。

      【讨论】:

      • 所以也许我废弃 8 位和 16 位操作并使用 32 位和 64 位值,并且只在需要的时间和地点转换为字节或短,32 位和 6 位操作占用与 8 位和还是16。对于无符号我什至不需要转换,只需使用相同的地址但更少的位。
      【解决方案3】:

      Java VM 通过仅支持 ADDSUB 等类型 long (64) 、double(64 fp) 和 int (32) 来解决此问题。然后它提供了一些转换指令,将 32 位类型转换为 16 位和 8 位(有符号和无符号)。

      当然,这种方法只有在所需的转换操作的数量少于如果你有一个特殊的ADDSUBMULDIV 等时,这种方法才有优势每种类型。

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

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

      如果您对 jvm 是如何做到这一点感兴趣的,请查看jvm spec

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 2017-12-08
        相关资源
        最近更新 更多