[PATCH] D42962: [ARM] Allow 64- and 128-bit types with 't' inline asm constraint

Pablo Barrio via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 13 07:08:38 PST 2018

pbarrio added a comment.

There is still the possibility that someone tries to use 't' for a vector of two doubles. Only single-precision is allowed in vector operations for 32-bit architectures, so doing something like this would be illegal:

\_\_asm\_\_ ("vadd.f64 %0, %1, %2" : "=t" (res) : "t" (a), "t" (b));

like @rengolin pointed out earlier on.

In this case, the constraint handling code will happily allocate a Q register, but the compiler will fail with the following:

<inline asm>:1:6: error: invalid operand for instruction

  vadd.f64 q0, q0, q1

I think we don't need a new test for this case because this is already taken care of by the MC testing of instruction encodings.

Besides, I would argue that someone trying to pass a vector of doubles to vadd.f64 (or any other 32-bit ARM vector instruction) is doing something incorrect, but this is not a problem of the register constraint itself. Note that this problem also predates this patch, as the 'w' constraint also suffers from it.

Does this sound reasonable?



More information about the llvm-commits mailing list