首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误:操作数必须是[d0,d15]范围内的寄存器

错误:操作数必须是[d0,d15]范围内的寄存器
EN

Stack Overflow用户
提问于 2019-05-17 15:52:16
回答 1查看 279关注 0票数 -1

最近我在尝试优化卷积运算时遇到一些问题,错误是:操作数必须是range d0,d15 "vmla.s32 q8,q12,%f18 \n“中的寄存器。

K0_0123,k0_4567..都是int32x4_t向量,我只是不知道如何修复这个错误。

代码语言:javascript
复制
                          "0:                             \n"
                            "pld        [%5, #128]          \n"
                            "vld1.s32   {d14-d15}, [%5]     \n" 
                            "pld        [%6, #128]          \n" 
                            "vld1.s32   {d16-d17}, [%6]     \n"   
                            "pld        [%7, #128]          \n" 
                            "vld1.s32   {d18-d19}, [%7]     \n" 
                            "pld        [%8, #128]          \n"                               
                            "vld1.s32   {d20-d21}, [%8]     \n"                                                                                                                                         

                            "pld        [%1, #64]          \n"
                            "vld1.u8    {d8}, [%1]         \n" 
                            "vmovl.u8   q4, d8             \n" 
                            "vext.16    q5, q4,  q4, #1    \n" 
                            "vext.16    q6, q4,  q4, #2    \n" 
            "vmovl.s32  q4, d8         \n"
            "vmovl.s32  q11, d10           \n"
            "vmovl.s32  q12, d12           \n"

                            "vmla.s32  q7, q4,  %e18[0]   \n"                           
                            "vmla.s32  q7, q11, %e18[1]   \n"
                            "vmla.s32  q7, q12, %f18[0]   \n"                              

                            "vmla.s32  q9, q4,  %e21[0]   \n"
                            "vmla.s32  q9, q11, %e21[1]   \n"

                            "vst1.s32   {d14-d15}, [%5]!   \n"
                            "vst1.s32   {d16-d17}, [%6]!   \n"
                            "vst1.s32   {d18-d19}, [%7]!   \n"
                            "vst1.s32   {d20-d21}, [%8]!   \n"

                            "add         %1, #4            \n"
                            "add         %2, #4            \n"
                            "add         %3, #4            \n"
                            "add         %4, #4            \n"
                            "subs        %0, #1            \n"
                            "bne      0b                   \n"
                            :"=r"(iOutImg_N),           // %0
                             "=r"(r0),                  // %1
                             "=r"(r1),                  // %2
                             "=r"(r2),                  // %3
                             "=r"(r3),                  // %4
                             "=r"(piOutPtr0),           // %5
                             "=r"(piOutPtr0n),          // %6
                             "=r"(piOutPtr1),           // %7
                             "=r"(piOutPtr1n)           // %8                                        
                            :"0"(iOutImg_N),
                             "1"(r0),
                             "2"(r1),
                             "3"(r2),
                             "4"(r3),
                             "5"(piOutPtr0),
                             "6"(piOutPtr0n),
                             "7"(piOutPtr1),
                             "8"(piOutPtr1n),
                             "w"(k0_0123),           // %18                      
                             "w"(k0_4567),               // %19
                             "w"(k0_8xxx),           // %20
             "w"(k1_0123),               // %21
             "w"(k1_4567),               // %22
                 "w"(k1_8xxx)          // %23                                
                            :"cc", "memory", "q4", "q5", "q6", "q7", "q8" ,"q9", "q10", "q11", "q12"
EN

回答 1

Stack Overflow用户

发布于 2019-05-17 22:07:29

对于矢量标量乘法,根据定义,32位标量容器必须是d0 - d15 。(它是16位标量的d0 - d7 )

这是一个物理限制,VTBL指令的行为与此类似。

我不认为有更多关于这些限制的说明,但我可能错了。

此外,除非有必要,否则您应该避免使用q4-q7,因为它们必须在使用之前保留在堆栈上,然后按照AAPCS的定义进行恢复。请改用q0-q3。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56181990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档