最近我在尝试优化卷积运算时遇到一些问题,错误是:操作数必须是range d0,d15 "vmla.s32 q8,q12,%f18 \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"
发布于 2019-05-17 22:07:29
对于矢量标量乘法,根据定义,32位标量容器必须是d0 - d15 。(它是16位标量的d0 - d7 )
这是一个物理限制,VTBL
指令的行为与此类似。
我不认为有更多关于这些限制的说明,但我可能错了。
此外,除非有必要,否则您应该避免使用q4-q7,因为它们必须在使用之前保留在堆栈上,然后按照AAPCS
的定义进行恢复。请改用q0-q3。
https://stackoverflow.com/questions/56181990
复制相似问题