【问题标题】:MIPS floating-point: swc1 vs. s.sMIPS 浮点:swc1 与 s.s
【发布时间】:2009-07-22 14:45:07
【问题描述】:

我正在做一些涉及MIPS 汇编的工作,并且我不断遇到这四个浮点加载/存储伪指令:l.sl.ds.ss.d。我在网上找到了一些文档,发现有四个“实际”指令似乎做同样的事情:lwc1ldc1swc1sdc1

我唯一的问题是,有什么区别?据我所知,两组指令的作用完全相同。伪代码的存在可能只是因为它们更易于阅读吗?

提前感谢您的任何见解。

【问题讨论】:

    标签: assembly floating-point mips


    【解决方案1】:

    我唯一的问题是,有什么区别?据我所知,两组指令的作用完全相同。

    是的,你是对的。可能出现的唯一区别是伪指令被翻译成多个“真实”指令时。

    伪字的存在仅仅是因为它们更容易阅读吗?

    再次,是的。这就是他们存在的原因。它们给人一种更具表现力的指令集的错觉。引用Computer organization and design / Patterson & Hennessy:

    ... 汇编器还可以将机器语言指令的常见变体视为它们本身的指令。硬件不需要执行这些指令;然而,它们在汇编语言中的出现简化了翻译和编程。 ...

    鉴于你的例子,说得更“清楚”:

    l.s $f2, 24(t1)       # Load Single contained in 24(t1) to $f2
    

    lwc1 $f2, 24(t1)      # Load Word into Coprocessor 1 from 24(t1) to $f2
    

    以及您可以更好地理解:

    move $7, $18        # move contents of $18 to $7
    

    add $7, $18, $0
    

    对我来说,只是借助助记符来获得更好易读的代码。

    【讨论】:

      【解决方案2】:

      其实我觉得,

      LWC1 is Load Word to Co-processor 1
      LDC1 is Load Double Word to Co-processor 1
      

      等等……


      你猜怎么着,我打开了一个专利页面,试图记住这些。

      US Patent 5555384 - 通过将一条冲突指令延迟到与第三条非冲突指令相同的流水线阶段来重新调度已发出的冲突指令

      FPC 20 实现了两种类型的加载指令:
      LWC1(加载字协处理器 1,如图 4 所示)和
      LDC1(加载双字协处理器 1,如图 8 所示)。

      LWC1 将 32 位字从内存子系统加载到 FPC 通用寄存器中。
      LDC1 将来自内存子系统的 64 位双字加载到 FPC 通用寄存器中。

      这证实了这一点。
      (顺便说一句:不要费心搜索这里提到的数字,除非你 可以访问该网站)。

      【讨论】:

      • 谢谢,但我已经明白了(这些都列在官方文档中)。也许我应该更清楚一点,但我的问题是每个加载/存储单/双指令的伪指令版本与实际版本(lwc1 vs l.s,ldc1 vs l.d等)之间的区别。
      • 我认为伪代码和指令集名称的原因是为了在 ISA 的变体中伪代码的简单性和可移植性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多