工具/软件:TI C/C++编译器
您好,
在优化过程中,我浏览了编译器生成的代码。 我看到了顺序:
some函数( uint16_t参数):
MOV.W R12,R15
SWPB R12
MOV.B R12,R12 <<<???
为什么编译器插入MOV?
我怀疑这是解决硅错误[?]的方法。
此致,
Piotr
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.
工具/软件: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指令,而不是冗余指令。