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.

[参考译文] 编译器/TMS320C6748:TI RTS库中的divu.asm函数中使用多个分支指令

Guru**** 2607645 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/634188/compiler-tms320c6748-multiple-branch-instructions-usage-in-divu-asm-function-from-ti-rts-lib

部件号:TMS320C6748

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

您好,  

我想弄清楚为什么这样使用下面代码片段中的分支指令。 分支 位于每个执行数据包的末尾,它应该与执行数据包中的其他指令并行执行,并且不会有条件地执行。 我想这在充分利用管道时是常见的,所有分支指令都执行,但只有一个真正被使用。 请您帮助我了解这种棘手的分行指令用法。  

	CMBGTU	B4,	A4,	B2	;gt = den > num
||	sub	A0,	B0,	A0	;quotient_shift = 32 - I
||	SHL	A2,	A6,	A2	;FIRST_DIV <= I
||	B	loop			;

[B1]	零	B2			;num32 && gt||
[B2]	MV	B2,	B1		;!(num32 &&!gt)
||[B2]	SHRU	A2,	1,	A2	;FIRST_DIV >>=1||
	B	循环			;

[B2]	SHRU				
				
					

					
			B4,1,B4;IF (编号32和gt) den >> 1|||[!B1] SUB A4,B4,A4;IF (编号32和!gt) num == den || B loop;[!B1] SHRU B4,1,B4;IF (编号32和!gt) den >> 1||[B2],A4,SUB		;[b2] SUB,A4; 如果(num32&&gt) num -= den
||	CMMPLT	B0,	7,	B2	;检查负环计数器
||	子	B0,	7,	B1	;生成环计数
器||	B	环			;

[B2]	zero	b1			;zero negative loop counter
||[B0]	SUBC	A4,	B4,	A4	;num = subc (num,den)
||[B0]	sub	b0,	1,	b0	;I-||
	B	loop			;

loop:
[B0]	subc	A4,	B4,	A4	;num = subc (num,den)
||[B0]	sub	b0			,b0,b0,b1,b0,b0
||[B1]	子	B1,	1,	B1	;I-||[B1]
	B	循环			;对于 

(代码取自TI 7.4 库C6000编译器v.RTS.12中的divu.asm文件)。  

谢谢!

Karel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个通过管道传递的软件循环。 这确实很难理解。 解释它的工作方式超出了论坛的范围,但我将为您提供一个快速直观的图片。 仅查看前5个执行数据包中的分支。 请注意,它们都是分支循环的。 execute数据包at loop是通过管道传递的软件内核。 分支指令有5个延迟插槽,因此前几个分支在另一个分支被添加到管道之前不会完成执行,因此您最终会同时出现多个分支指令。 将发生的情况是,在第一个分支出现之前,将在循环中执行one execute数据包。 然后,出现分支,PC返回回路,以便再次执行EXECUTE数据包。 然后出现第二个分支,PC再次处于循环状态。 因此,拥有多个“在运行中”分支是一个可爱的小窍门,可以反复执行一个执行数据包,就好像它是一个零开销循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您帮助我更好地理解。 现在,它有点清楚了。