<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59577>59577</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [avr] Wrong code: Incorrect resolution of operand modifier
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          sprintersb
      </td>
    </tr>
</table>

<pre>
    Compile with
` --target=avr -mmcu=atmega8 -Os -c`
the following C code:
```c
void func (void)
{
    __asm volatile ("ldi r16, -hi8(0x3ff)");
}
```
Resulting disassembly from `x.o` reads:
```none
Disassembly of section .text:

00000000 <func>:
   0:   0c ef           ldi     r16, 0xFC       ; 252
   2:   08 95   ret
```
which is wrong: It's `hi8(0x3ff) = 0x3` and `-0x3 = -hi8(0x3ff) = 0xfd` in 2's complement.

What the assembler appears to be computing is `hi8(-(val))`, at least that's what follows from code for address computations  into static arrays like in:
```c
extern int var[];
// Link with -Wl,--defsym,var=0x3ff
void func (int n)
{
 return var[n];
}
```
where `x.s` reads:
```
func:
        lsl     r24
        rol     r25
        subi    r24, -lo8(var) ; should be lo8(-(x))
        sbci    r25, -hi8(var) ; should be hi8(-(x))
        ...
```
Notice that the semantically correct expressions are `lo8(-x)` and `hi8(-x)` because you want to subtract the negative of a 16-bit value, cf. for example what avr-gcc is doing.

Strangely, that offset computation is correct even when the negation produces a borrow from bit 7 to bit 8.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8lU2PozgTgH-NcykRERO-Djl0J2-kkV7tSruHPo6MKcA7xo5sk5B_vypM0t0zPYtaNK7Udz0FwnvVG8QDy19ZftqIKQzWHfzFKRPQ-WbT2PZ-ONrxojTCTYWBpSeWvrAihSQJwvUYWHYSVwfJOMqJnsOIvagg-dNDIlmRRoswIHRWa3tTpocjSNsiy16e7uKfjOerVS10k5HAeEUHxutVs3yNDwAA378LP8LVahEoPcYrxrluFbhdwfgRkkFVjFfpnHUdeeCc7tnrw9Xpp-jx-Bf6SQfKslVeeI9jo-_QOTsCK9J5a6l4h6L1v-ZvrMEoOn2wtR14lEFZA9uAc3i3W-7pegHLjlQ0y_731ACAdDnUqQTsIF4srXWrWFqvhabz-chSKg14zp-WfLWsoM7JxmH4suLboOQAysPNWdOz7AW-BcZLT_V-biGw7ATpnFELhGlJIUnnbBEnX6p2LekqA3zxKO140TiiCduPLXgbRABCZO0ZOhCXCwrnIVhocLGblqGoD2klhIfQy2xrKocfQQTQKDy5E7GKGzmP7Pk4R4IPOutAtK1D71f3gkbkAZQJFjwdJQjnxN2DVj8QlPktsTgHdIYs4SpcXKd30viZ8TP8X5kfyw5B8qYZPyZJi52_j4wfySY7xdb9ugHk1XyxAg7D5Mwa0HyK-Bu2bwM6jBj7_8A4HiOLT1Rr7TVBxPdPibNRkj8lfmrUqkQLqG21jMhFIF7BD3bSLU00_kQTnNf5PX00Uq1u35f4Sx_vFPzsY7vdflnTHzYoiQsbC28eR2GCkkLrO0jrHMoAOF-IigUGEfu1ZjtHzh7sr_Ef0galmDzC3U5wEyYQu35qghMyRjPYi6CuSG8EAbsiaRTxoiekSmW3XaDEWdCSRG7F1SW9lIR9a5XpP63N38EJ06O-k_lSk-06j-Ejz2T5LOyKBm4Dmg_ZWAMXZ9tJogcBjXXO3uKWUHLlsn8qQLUG3rSHrK2zWmzwsCvKXVaVZV5uhgOvBO72dcax6MQ-q_dyV-SpKPeyzDrOdxt14CnnO76rdhXnWblt5L4sii7N97Joi2bP9imOQumt1tdxa12_Ud5PeMjrvCw3WjSo_eNL5Q6klDRT79k-1coH_24WVNDLN01cHctP8EavtccXB76ZRzscequnpQW2A3tBR3Mdbas6hW4zOX0YQrgsC7KscK_CMDVbaUfGzxRu_ZdcnP0HZWD8vKTsGT8vWf8bAAD__6yoKX0">