【问题标题】:error: operand must be a register in range [d0, d15]错误:操作数必须是 [d0, d15] 范围内的寄存器
【发布时间】:2019-10-04 12:35:57
【问题描述】:

最近我在尝试优化一个conv操作时遇到了一些问题,错误是: 操作数必须是 [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"

【问题讨论】:

    标签: gcc arm simd inline-assembly neon


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2019-12-05
      • 2023-01-21
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多