The function AArch64TargetLowering::LowerFixedLengthVectorIntDivideToSVE

previously assumed the operands were full vectors, but this is not

always true. This function would produce bogus if the division operands

are not full vectors, resulting in miscompiles when dividing 8-bit or

16-bit vectors.

The fix is to perform an extend + div + truncate for non-full vectors,

instead of the usual unpacking and unzipping logic. This is an additive

change which reduces the non-full integer vector divisions to a pattern

recognised by the existing lowering logic.

For future reference, an example of code that would miscompile before

this patch is below:

1 int8_t foo(unsigned N, int8_t *a, int8_t *b, int8_t *c) { 2 int8_t result = 0; 3 for (int i = 0; i < N; ++i) { 4 result += (a[i] / b[i]) / c[i]; 5 } 6 return result; 7 }