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.

[参考译文] 编译器/TMS320F2.8377万D:以C语言访问I16TOF32指令

Guru**** 2553450 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/586058/compiler-tms320f28377d-accessing-the-i16tof32-instruction-in-c

部件号:TMS320F2.8377万D

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

我想访问C中的I16TOF32指令。int到float类型转换会导致加载到ACC,以执行从16位到32位的符号扩展,移动到浮点寄存器,然后使用I32TOF32转换为float。 下面是C2000 16.9 .2.LTS编译器在完全优化级别的汇编输出片段(它已将循环展开2倍)。

MOVB XAR6,#24

MOVL XAR5,#_b
MOVL XAR4,#_A
SETC SXM
RPTB $C$L2,AR6
;重复块开始
MOV ACC,* XAR4++
MOV32 R0H,附件  
MOV ACC,* XAR4++
MOV32 R3H,附件  
无操作
无操作
无操作
I32TOF32 R1H,R0H
I32TOF32 R0H,R3H
MOV32 * XAR5++,R1H
MOV32 * XAR5++,R0H
;重复块结束
$C$L2:

对于我的用例而言,编译器生成的代码太慢(每2个输出11个周期,而手动编码流水线汇编则为每2个输出2个周期)。 是否有办法强制编译器发出I16TOF32而不使用内联汇编(因为它关闭了某些/大多数优化),也不需要在汇编中重写我的算法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    编译器能够生成I16TOF32,如下面的代码片段所示。 我不明白为什么不为您的循环生成它,因为它显然在执行16位负载。 能否向我展示一个演示该问题的可编译C测试案例? 请包括完整的命令行选项。 另外,您使用的是哪个版本的编译器? (这与CCS版本不同。)

    % cat foo.c.
    浮点stof (短*x){返回*x;}
    % cl2000 --float_support=fpu32 -O0 -k
    % grep F32 foo.asm
    I16TOF32 R0H,*+XAR4[0]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用C2000编译器v 16.9 .2.LTS。 我主要关注矢量运算,因此是紧密循环。

     

    % cat i16tof32_v_Attempt1.c

    void i16tof32(Float *y, const short *x, short num){  while (num--)*y++=(Float)*x+;}  

    %"C:/ti/ccsv6/tools/compiler/ti-CGT-C2000_VCU_support=v28 16.9 -ml -mt --CLA_support=clip1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -o3 --opt_of_diag=cret1 -fu_model_fu_-fu/fp=tip_fu/fccupdip_-fu_-fu_-fu_-fu_-fu/fccupdip=t_-f_-frubdip_-f_-f_-f_-f_-fccp_-fccp_-fr.k_-fccp=t_-fccp_-fccp_-fccp_-frub_-fccp_-f_- 16.9

    % cat i16_to_F32_v_Attempt1.asm

    ;*******************************************************

    ;* TMS320C2000 C/C++代码根           PC v 16.9 2.LTS *

    ;*创建日期/时间:2017年4月4日星期二11:34:07         *

    ;*******************************************************

    compiler_opts --abi=coffabi --cla_support=cla1 --diag_wrap=off --float_support=fpu32 --hll_source=on --mem_model:code=flat --mem_model:data=large --object_format=coff --silit_version=28 --symdebug:none --tMU_support

    ASGXAR2,FP

    ; C:\\Users\\rist-1\\AppData\\Local\\Temp\\4.0042万 16.9 C:\\Users\\rist-1\\AppData\\Local\\4.0044万 opt2000.exe

    ; 16.9 C:\ccsv6\tools\compiler\ti-CGT-C2000_SDCX.2.LTS\bin\ac2000.exe -2000. -@C:\\Users\\rist-1\\AppData\\Local\\Temp\\40.0412万

    .sect ".text"

    单击

    global _i16tof32_v_Attempt1.

    ;*******************************************************

    ;* FNAME:_i16tof32_v_Attempt1.      FR大小: 0      *

    ;*                               *

    ;*函数环境                     *

    ;*                               *

    ;*函数属性                     *

    ;*               0参数, 0自动, 0 SOE  *

    ;*******************************************************

    _i16tof32_v_Attempt1:

    ;***3---------------   如果(!num )转到g7;

        CMBB   AL,#0         ;[CPU_]|3|

        B     $C$L3,EQ        ;[CPU_]|3|

        ;发生分支;[]|3|

    ;***3---------------   D1美元 =编号和1;

    ;***3---------------   如果(num < 2)转到G5;

        和   AH,AL,#0x0001     ;[CPU_]|3|

        CMBB   AL,#2         ;[CPU_]|3|

        B     $C$L2,LT        ;[CPU_]|3|

        ;发生分支;[]|3|

    ;***---------------    l1美元 =(num>>>1)-1;

    ;***---------------    #pragma must迭代(116383,1)

    ;***---------------    //以下循环按因子展开(2)

    ;***---------------    #pragma loop_flags(4102u)

    ;***--------------- G4:

    ;***3---------------   *y++=(浮动)*x++;

    ;***3---------------   *y++=(浮动)*x++;

    ;***3---------------   如果(--L1美元)!=(-1))转到G4;

        ASR   AL,1.          ;[CPU_]

        ADDB   AL,#-1         ;[CPU_]

        MOVZ   AR6,铝         ;[CPU_]

        RPTB   $C$L2,AR6       ;[CPU_]|3|

        ;重复块开始;[]

    $C$L1:   

        MOVX   TL,*XAR5++       ;[CPU_]|3|

        MOV32  R0H,XT         ;[CPU_]|3|

        MOVX   TL,*XAR5++       ;[CPU_]|3|

        MOV32  R3H,XT         ;[CPU_]|3|

        NOP   ;[CPU_]

        NOP   ;[CPU_]

        NOP   ;[CPU_]

        I32TOF32 R1H,R0H        ;[CPU_]|3|

        I32TOF32 R0H,R3H        ;[CPU_]|3|

        MOV32  * XAR4++,R1H      ;[CPU_]|3|

        MOV32  * XAR4++,R0H      ;[CPU_]|3|

        ;重复块结束;[]

    $C$L2:   

    ;***--------------- G5:

    ;***---------------    如果(d1美元<=0)转到G7;

        CMBB   AH,#0         ;[CPU_]

        B     $C$L3,Leq       ;[CPU_]

        ;发生分支;[]

    ;未滚动循环的剥离循环迭代:

    ;***3---------------   *y =(浮点)*x;

    ;***--------------- G7:

    ;***---------------    返回;

        I16TOF32 R0H,*+XAR5[0]     ;[CPU_]|3|

        NOP   ;[CPU_]

        MOV32  *+ XAR4[0],R0H     ;[CPU_]|3|

    $C$L3:   

        LRTR  ;[CPU_]

        ;出现返回;[]

    请注意,编译器如何针对可能的尾随输入发出正确的指令。

    我还测试了您关于取消函数内指针引用的建议,结果令人震惊

    % cat i16tof32_v_Attempt2

    静态内嵌浮点stof1(const short *x){ return (Float)*x;}

    void i16tof32_v_Attempt2(Float *y, const short *x, short num){   while (num--)*y++= stof1(x++);}  

    %"C:/ti/ccsv6/tools/compiler/ti-CGT-C2000_VCU_support=v28 16.9 -ml -mt --CLA_support=clip1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -o3 --opt_of_diag=cret1 --fu_support=fu_fuel_32-t_support=turb_intran_fu_fu/fuip=t=tfu_reim_-fu/fccupdip=-f_-fu_-fu_-fp=t_-fccupdip_-fccf_-f_-fccf_-fr.k_-fccf_-f_-fccfccp_-f_-fccf_-fccf_-fcc 16.9

    % cat i16tof32_v_Attempt2.asm

    ;*******************************************************

    ;* TMS320C2000 C/C++代码根           PC v 16.9 2.LTS *

    ;*创建日期/时间:2017年4月4日星期二11:34:17         *

    ;*******************************************************

    compiler_opts --abi=coffabi --cla_support=cla1 --diag_wrap=off --float_support=fpu32 --hll_source=on --mem_model:code=flat --mem_model:data=large --object_format=coff --silit_version=28 --symdebug:none --tMU_support

    ASGXAR2,FP

    ; C:\\Users\\rist-1\\AppData\\Local\\Temp\\9.3762万 16.9 C:\\Users\\rist-1\\AppData\\Temp\\9.3762万 C:\\AppData\\Local\\Temp\\9.3764万 opt2000.exe

    ; C:\ccsv6\tools\compiler\ti-CGT-C2000_C2000<xmt-block0>2000 16.9 .2.LTS\bin\ac2000.exe -@C:\\Users\\rist-1\\AppData\\Local\\Temp\\93.7612万

    .sect ".text"

    单击

    global _i16tof32_v_Attempt2.

    ;*******************************************************

    ;* FNAME:_i16tof32_v_Attempt2.      FR大小: 0      *

    ;*                               *

    ;*函数环境                     *

    ;*                               *

    ;*函数属性                     *

    ;*               0参数, 0自动, 0 SOE  *

    ;*******************************************************

    _i16tof32_v_Attempt2:

    ;***5 ---------------------------   如果(!num )转到g7;

        CMBB   AL,#0         ;[CPU_]|5|

        B     $C$L3,EQ        ;[CPU_]|5|

        ;发生分支;[]|5|

    ;***5 ---------------------------   D1美元 =编号和1;

    ;***5 ---------------------------   如果(num < 2)转到G5;

        和   AH,AL,#0x0001     ;[CPU_]|5|

        CMBB   AL,#2         ;[CPU_]|5|

        B     $C$L2,LT        ;[CPU_]|5|

        ;发生分支;[]|5|

    ;***---------------    l1美元 =(num>>>1)-1;

    ;***---------------    #pragma must迭代(116383,1)

    ;***---------------    //以下循环按因子展开(2)

    ;***---------------    #pragma loop_flags(4102u)

    ;***--------------- G4:

    ;***1----------------   *y++=(浮动)*x++; //[0]

    ;***1----------------   x = x; //[0]

    ;***1----------------   +x; //[0]

    ;***1----------------   *y++=(浮点)*x; //[0]

    ;***5 ---------------------------   如果(--L1美元)!=(-1))转到G4;

        ASR   AL,1.          ;[CPU_]

        ADDB   AL,#-1         ;[CPU_]

        MOVZ   AR6,铝         ;[CPU_]

        RPTB   $C$L2,AR6       ;[CPU_]|5|

        ;重复块开始;[]

    $C$L1:   

        MOVX   TL,*XAR5++       ;[CPU_]|1|

        MOV32  R0H,XT         ;[CPU_]|1|

        NOP   ;[CPU_]

        NOP   ;[CPU_]

        NOP   ;[CPU_]

        NOP   ;[CPU_]

        I32TOF32 R1H,R0H        ;[CPU_]|1|

        NOP   ;[CPU_]

        MOV32  * XAR4++,R1H      ;[CPU_]|1|

        MOV32  * XAR4++,R0H      ;[CPU_]|1|

        ;重复块结束;[]

    $C$L2:   

    ;***--------------- G5:

    ;***---------------    如果(d1美元<=0)转到G7;

        CMBB   AH,#0         ;[CPU_]

        B     $C$L3,Leq       ;[CPU_]

        ;发生分支;[]

    ;未滚动循环的剥离循环迭代:

    ;***1----------------   *y =(浮点)*x; //[0]

    ;***--------------- G7:

    ;***---------------    返回;

        I16TOF32 R0H,*+XAR5[0]     ;[CPU_]|1|

        NOP   ;[CPU_]

        MOV32  *+ XAR4[0],R0H     ;[CPU_]|1|

    $C$L3:   

        LRTR  ;[CPU_]

        ;出现返回;[]

    ;*内联函数引用:

    ;*[0] stof1.

    注意第二次尝试的汇编输出如何错误地将符号扩展整数推入输出。 这是一个我将独立提出的错误。

    我希望编译器生成的代码更类似于以下内容(未经过测试,但大部分方法都经过测试):

    global _i16tof32_v_Hand _optimized
    .sect文本
    单击
    _i16tof32_v_Hand优化:

    TBIT @AL,#0

    SB SKip_1,NTC
    I16TOF32 R0H,* XAR5++
    LSR AL,1号
    MOV32 * XAR4++,R0H

    跳过_1;
    TBIT @AL,#0
    SB init_loop,NTC
    I16TOF32 R0H,* XAR5++
    I16TOF32 R1H,* XAR5++
    MOV32 * XAR4++,R0H
    MOV32 * XAR4++,R1H

    INIT_LOOP:
    LSR AL,1号
    SB END_LOOP,EQ

    ADDB AL,#-1
    RPTB END_LOOP,@AL

    I16TOF32 R0H,* XAR5++
    I16TOF32 R1H,* XAR5++
    MOV32 * XAR4++,R0H
    MOV32 * XAR4++,R1H
    I16TOF32 R0H,* XAR5++
    I16TOF32 R1H,* XAR5++
    MOV32 * XAR4++,R0H
    MOV32 * XAR4++,R1H
    结束循环:

    LRETR

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

    感谢您提供测试案例。  这是一个性能错误。  我已提交CodeGen-2179以跟踪此问题。

    修复此问题后,编译器将生成:

    _i16tof32:
    CMBB AL,#0
    B $C$L3,EQ
    ;发生分支
    和 Ah,AL,#0x0001
    CMBB AL,#2
    B $C$L2,LT
    ;发生分支
    ASR AL,1.
    ADDB AL,#-1
    MOVZ AR6,AL
    RPTB $C$L2,AR6
    ;重复块开始于
    $C$L1:
    I16TOF32 R1H,* XAR5++
    I16TOF32 R0H,*XAR5++
    MOV32. * XAR4++,R1H
    MOV32. * XAR4++,R0H
    无操作
    ;重复块结束
    $C$L2:
    CMBB 啊,#0
    B $C$L3,Leq
    ;发生branchcc
    ;未滚动循环的去皮循环迭代:
    I16TOF32 R0H,*+XAR5[0]
    无操作
    MOV32. *+XAR4[0],R0H
    $C$L3:
    LRETR
    ;出现返回