ошибка: операнд должен быть регистром в диапазоне [d0, d15] - PullRequest
0 голосов
/ 17 мая 2019

В последнее время у меня возникают некоторые проблемы при попытке оптимизировать операцию извлечения error ошибка: операнд должен быть регистром в диапазоне [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 Ответ

2 голосов
/ 17 мая 2019

Для векторно-скалярных умножений 32-битный скалярный контейнер должен быть d0 - d15 по определению .(Это d0 - d7 для 16-битных скаляров)

Это физическое ограничение, и инструкции VTBL ведут себя аналогично.

Я не думаю, что есть больше инструкций с этими ограничениями, но яможет быть ошибочным.

И, кроме того, вы должны избегать использования q4-q7, если в этом нет необходимости, так как они должны быть сохранены в стеке перед использованием и восстановлены впоследствии, как определено в AAPCS.Вместо этого используйте q0-q3.

...