最近,当我尝试优化转换操作时遇到一些问题,错误是: 操作数必须是[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"
答案 0 :(得分:2)
对于矢量标量乘法,根据定义,32位标量容器必须为d0-d15。 (对于16位标量,它是d0-d7)
这是物理上的限制,minSdkVersion=16
指令的行为类似。
我认为没有更多关于这些限制的说明,但我可能是错的。