This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/BEAGLEBN:TI PRU 调用惯例 ABI 的阐述

Guru**** 2616675 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/650176/compiler-beaglebn-clarification-for-ti-pru-calling-convention-abi

器件型号:BEAGLEBN

工具/软件:TI C/C++编译器

您好!

 根据 SPRUHV7A 文档的第6.4.1.1节"寄存器中传递的参数布局"、大小为64位或更小的结构在寄存器中传递。

但是、对于 此 C 代码段、使用 clpru 版本 v2.1.5:

struct S7{char a[7];};
char test_struct_pass (struct S7 s)
{
返回 s.a[2];
} 

我得到以下汇编:

|test_struct_pass |:
;*---------------------------------------------- *
子部分 R2、R2、0x02 ;[ALU_PRU]
SBBO R13.B2、R2、0、2 ;[ALU_PRU]
LBBO &R13.B2、R2、2、7 ;[ALU_PRU]|10| s、s
LBBO R13.B2、R2、0、2 ;[ALU_PRU]
添加 R2、R2、0x02 ;[ALU_PRU]
JMP r3.w2. ;[ALU_PRU]

我阅读文档的方式是、我希望生成以下代码:

|test_struct_pass |:
;*---------------------------------------------- *
MOV R14.b0、R14.B2
JMP r3.w2. ;[ALU_PRU]

如果确认上述差异、TI 将更新哪些文档或工具链?

谢谢、
Dimitar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您将此问题通知我们。  生成的代码正确。  该结构在寄存器中传递。  但是、在函数内部、部分内容会复制到本地帧上的临时点。  这不是最佳选择。  因此、我在 SDOWP 系统中提交了 CodeGen-4131。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。  它不会报告编译器中的错误、但会请求改进生成的汇编代码。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哪些指令复制了 R14.b0中的 R14.B2? 请参阅下面的备注。

    |test_struct_pass |:
    ;*---------------------------------------------- *
    子部分 R2、R2、0x02 ;分配堆栈空间
    SBBO R13.B2、R2、0、2 ;保存 R13.B2和 R13.B3
    LBBO &R13.B2、R2、2、7 ;从栈上传递的参数加载 R14.b0和 s.a[2]
    LBBO R13.B2、R2、0、2 ;恢复 R13.B2和 R13.B3
    添加 R2、R2、0x02 ;释放堆栈空间
    JMP r3.w2. ; 

    此致、
    Dimitar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dimitar、

    George 对呼叫约定不正确。 调用惯例仅在大小为8、16、32或64位的寄存器中传递结构。 由于您的结构是56位、因此它不符合条件。 在本例中、该结构在栈上传递。 指令 LBBO &R13.B2、R2、2、7将 s.a[2]加载到 r14.b0中。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的澄清。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有一个问题- 24位呢? 我看到它在寄存器中传递:

    struct s3{char a[3];};
    char test_struct_pass3 (struct s3 s)
    {
    返回 s.a[2];
    } 

    |TEST_STRUCT_Pass3||:
    ;*------------------------------------------ *
    MOV r14.b0、r14.b2 ;[ALU_PRU]|5|
    JMP r3.w2. ;[ALU_PRU] 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你是对的。  这个3字节结构在寄存器中传递。  这与编译器手册不一致。   CodeGen-4178在 SDOWP 系统中归档、因此可以解决此问题。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治