代码之家  ›  专栏  ›  技术社区  ›  mahju

PowerPC转向可变SPR

  •  3
  • mahju  · 技术社区  · 14 年前

    我正在给一个C程序写一个汇编宏,由于我对这个很不熟悉,我在某些方面遇到了困难。 我正在尝试编写一个宏,用于将数据从通用寄存器移动到专用寄存器。

    # SPR is constant, rA is the value to be written
    mtspr SPR, rA
    

    # rA contains the number of the SPR, and rB the value to be moved.
    AWESOMEmtspr rA, rB
    

    有没有一个原因,没有这样的宏可用,我将如何使自己?

    ---- 编辑: ----

    3 回复  |  直到 14 年前
        1
  •  4
  •   TMN    14 年前

    不能这样做的原因是指令体系结构不接受寄存器间接作为寄存器参数的寻址模式。老实说,我从来没有见过这样的机器架构,因为寄存器的数量通常很小,所以寄存器被编码为指令本身的一部分。如果您真的不喜欢现有的解决方案,您可以尝试自己合成指令(获取基本操作码,查看寄存器说明符的位置和/或适当的值),然后执行它。根据您的操作系统和编译器,这可能是不可能的(自修改代码通常是禁忌)。

    如果在汇编中编写跳转表,代码会更干净吗?可能传入SPR说明符(假设它是一个基于零的整数,或者可以强制为一个),将其向左移动以将偏移量放入跳转表,然后跳转到表中,这将是一个

    MTPSR PSRx, val
    RET
    MTPSR PSRx+1, val
    RET
    

    我不知道什么对你来说是“清洁剂”,只是觉得我会把它扔掉。请注意,您可能需要使用NOPs来对齐所有内容,我没有PowerPC手册,因此我不知道指令大小或对齐要求是什么。

        2
  •  1
  •   David Winant    13 年前

    我使用stringizer宏找到了一个相当优雅的解决方案:

    #定义字符串化到字符串

    #定义tostring

    #定义mfspr(rn)({无符号int rval\ asm volatile(“mfspr%0”,字符串化(rn)\ :“=r”(rval));右旋;})

    这是PowerPC的U-Boot代码。

        3
  •  0
  •   Paul R    14 年前

    这看起来是一件奇怪的事情,但是如果你确信你出于某种原因需要这么做,那么你需要实现一个跳转表或者一系列的条件来测试rA并跳转到相应的硬编码 mtspr 说明。您还需要考虑如何处理无效的SPR编号。

    推荐文章