When calculating the difference between two pointers (TOK_PDIV), the AArch64 and RISC-V64 backends used unsigned division instructions (udiv/divu). This patch moves TOK_PDIV to use signed division instructions (sdiv/div) for both backends, ensuring correct behavior as per the C standard.
Unified · Split
| @@ -1756,6 +1756,7 @@ static void arm64_gen_opil(int op, uint32_t l) · 1755 unmodified lines | ||
| 1756 | 1756 | o(0x4b000000 | l << 31 | x | a << 5 | b << 16); // sub |
| 1757 | 1757 | break; |
| 1758 | 1758 | case '/': |
| 1759 | + case TOK_PDIV: | |
| 1759 | 1760 | o(0x1ac00c00 | l << 31 | x | a << 5 | b << 16); // sdiv |
| 1760 | 1761 | break; |
| 1761 | 1762 | case '^': |
| @@ -1798,7 +1799,6 @@ static void arm64_gen_opil(int op, uint32_t l) · 36 unmodified lines | ||
| 1798 | 1799 | o(0x1ac02400 | l << 31 | x | a << 5 | b << 16); // lsr |
| 1799 | 1800 | break; |
| 1800 | 1801 | case TOK_UDIV: |
| 1801 | − case TOK_PDIV: | |
| 1802 | 1802 | o(0x1ac00800 | l << 31 | x | a << 5 | b << 16); // udiv |
| 1803 | 1803 | break; |
| 1804 | 1804 | case TOK_UGE: |
| @@ -1110,6 +1110,7 @@ static void gen_opil(int op, int ll) · 1109 unmodified lines | ||
| 1110 | 1110 | ER(0x33 | ll, 0, d, a, b, 1); // mul d, a, b |
| 1111 | 1111 | break; |
| 1112 | 1112 | case '/': |
| 1113 | + case TOK_PDIV: | |
| 1113 | 1114 | ER(0x33 | ll, 4, d, a, b, 1); // div d, a, b |
| 1114 | 1115 | break; |
| 1115 | 1116 | case '&': |
| @@ -1127,7 +1128,6 @@ static void gen_opil(int op, int ll) · 11 unmodified lines | ||
| 1127 | 1128 | case TOK_UMOD: |
| 1128 | 1129 | ER(0x33 | ll, 7, d, a, b, 1); // remu d, a, b |
| 1129 | 1130 | break; |
| 1130 | − case TOK_PDIV: | |
| 1131 | 1131 | case TOK_UDIV: |
| 1132 | 1132 | ER(0x33 | ll, 5, d, a, b, 1); // divu d, a, b |
| 1133 | 1133 | break; |