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

时间:2019-05-17 07:52:16

标签: gcc arm simd inline-assembly neon

最近,当我尝试优化转换操作时遇到一些问题,错误是:            操作数必须是[d0,d15]范围内的寄存器               “ vmla.s32 q8,q12,%f18 [0] \ n”

k0_0123,k0_4567 ..都是int32x4_t向量,我只是不知道如何解决此错误

                          "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"

1 个答案:

答案 0 :(得分:2)

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

这是物理上的限制,minSdkVersion=16指令的行为类似。

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