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.

[参考译文] 编译器/MSP430FW423:编译器插入冗余指令

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/639628/compiler-msp430fw423-redundant-instruction-inserted-by-compiler

部件号:MSP430FW423

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

您好,

在优化过程中,我浏览了编译器生成的代码。 我看到了顺序:

  some函数( uint16_t参数):

MOV.W  R12,R15

SWPB  R12

MOV.B  R12,R12 <<<???

为什么编译器插入MOV?

我怀疑这是解决硅错误[?]的方法。

此致,
Piotr

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

    Piotr Romaniuk 说:
    为什么编译器插入MOV?[/QUOT]

    我不确定。  可能是编译器错误地发出了额外的MOV.B.  请按照如何 提交编译器测试用例一文中的说明提交测试用例。 我将针对编译器提交一个性能错误,我们将看到它的结果。

    谢谢,此致,

    -George

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

    [报价用户="Piotr Romaniuk"]

    SWPB  R12

    MOV.B  R12,R12 <<<???

    为什么编译器插入MOV?

    [/报价]由于它是MOV.B指令,我认为它具有清除R12寄存器中的高位字节的效果。 假设前面的指令是SWPB R12,它交换R12中的高低字节,SWPB R12和MOV.B R12,R12的组合可能是代码的一部分,它将(>>个无符号16位值转换为8位。

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

    [报价用户="Chester Gillon)]鉴于前面的指令是SWPB R12 (交换R12中的高字节和低字节),SWPB R12和MOV.B R12的组合, R12可能是代码的一部分,它将(>>)一个无符号16位值右移8位。使用MSP430编译器v 16.9 6在优化级别为零时编译以下函数(寄存器优化):

    uINT16_t右移(连接uint16_t输入)
    {
    返回>> 8;
    }
    

    生成的汇编程序使用SWPB R12和 MOV.B R12,R12指令执行了8位的右移:

    ;*****************************************************************
    ;*函数名称: right_shift *
    ;* *;*
    注册表已修改 :SP,SR,R12 *;*
    使用的注册表 :SP,SR,R12 *;*
    本地帧大小:0 args + 0 Auto + 0 Save = 0 byte. *
    ;*********************************************************************************
    右移:
    ;*---------------------------------- *
    	.dwcfi	cif_offset,2
    	.dwcfi	save_reg_to_mem,16,-2
    	.dwpsn	文件"../MSP430FW423_right_shift_main.c",第12行,第5列,is_stmt,ISA 0
    SWPB R12. ;[]|12|
    MOV.B R12,R12 ;[]|12|
    	.dwpsn	文件"../MSP430FW423_right_shift_main.c",第13行,第1列,is_stmt,ISA 0
    $C$DW3美元	.dwtag DW_TI_BRANCH
    	.dwattr $C$DW3美元,DW_AT_LOW_PC(0x00).DW3美元
    	,TR_DW_Dw_3美元
    
    RET ;[]
    ;[] 

    因此 ,需要MOV.B R12,R12指令,而不是冗余指令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢切斯特的解释。
    我有分歧的.B指令,我认为它们只处理寄存器的低字节,而不接触高字节。
    正如您所指出的,它们清除了高字节。

    此致,
    Piotr