]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Correct the maximum shift amount for shifted operands
authorPhilipp Tomsich <philipp.tomsich@vrull.eu>
Sat, 28 Jan 2023 23:07:09 +0000 (00:07 +0100)
committerPhilipp Tomsich <philipp.tomsich@vrull.eu>
Sat, 28 Jan 2023 23:07:58 +0000 (00:07 +0100)
The aarch64 ISA specification allows a left shift amount to be applied
after extension in the range of 0 to 4 (encoded in the imm3 field).

This is true for at least the following instructions:

 * ADD (extend register)
 * ADDS (extended register)
 * SUB (extended register)

The result of this patch can be seen, when compiling the following code:

uint64_t myadd(uint64_t a, uint64_t b)
{
    return a+(((uint8_t)b)<<4);
}

Without the patch the following sequence will be generated:

0000000000000000 <myadd>:
   0: d37c1c21  ubfiz x1, x1, #4, #8
   4: 8b000020  add x0, x1, x0
   8: d65f03c0  ret

With the patch the ubfiz will be merged into the add instruction:

0000000000000000 <myadd>:
   0: 8b211000  add x0, x0, w1, uxtb #4
   4: d65f03c0  ret

gcc/ChangeLog:

* config/aarch64/aarch64.cc (aarch64_uxt_size): fix an
off-by-one in checking the permissible shift-amount.

gcc/config/aarch64/aarch64.cc

index 089c1c8584550588807276fc551b77f22e1a3a5d..17c1e23e5b54133cdd50adc8c4d2d90c3f1991c0 100644 (file)
@@ -13022,7 +13022,7 @@ aarch64_output_casesi (rtx *operands)
 int
 aarch64_uxt_size (int shift, HOST_WIDE_INT mask)
 {
-  if (shift >= 0 && shift <= 3)
+  if (shift >= 0 && shift <= 4)
     {
       int size;
       for (size = 8; size <= 32; size *= 2)