Skip to content

Commit 6310f91

Browse files
author
Thiadmer Riemersma
committed
Optimziations in Cortex M0 core; also added peephole optimziations in the compiler to remove useless arithmetic operations such as multiplying by 1).
Bug fix in OP_HALT opcode (for "sleep") on Cortex M0 code. "var" is now an equivalent for the "new" keyword. The "invalid symbol name" error may now also gives a reason why the name is invalid. Signed-off-by: Thiadmer Riemersma <[email protected]>
1 parent f4c3a2e commit 6310f91

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1963
-1487
lines changed

amx/amxexec_arm7.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
; License for the specific language governing permissions and limitations
3030
; under the License.
3131
;
32-
; $Id: amxexec_arm7.s 6974 2023-08-08 12:47:41Z thiadmer $
32+
; $Id: amxexec_arm7.s 7106 2024-02-14 21:02:03Z thiadmer $
3333

3434

3535
AREA amxexec_data, DATA, READONLY
@@ -299,7 +299,7 @@ opcodelist_size EQU .-amx_opcodelist
299299

300300
MACRO
301301
GETPARAM_P $rx ; the opcode/parameter pack should be in r12
302-
mov $rx, r12, ASR #16 ; $rx = r12 >> 16 (signed)
302+
mov $rx, r12, ASR #16 ; $rx = r12 >> 16 (signed shift)
303303
MEND
304304

305305
MACRO

amx/amxexec_arm7_gas.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
@ License for the specific language governing permissions and limitations
3030
@ under the License.
3131
@
32-
@ $Id: amxexec_arm7_gas.S 6979 2023-08-24 19:59:29Z thiadmer $
32+
@ $Id: amxexec_arm7_gas.S 7106 2024-02-14 21:02:03Z thiadmer $
3333

3434
.file "amxexec_arm7_gas.s"
3535
.syntax unified
@@ -344,7 +344,7 @@ amx_opcodelist:
344344
.endm
345345

346346
.macro GETPARAM_P rx @ the opcode/parameter pack should be in r12
347-
mov \rx, r12, ASR #16 @ \rx = r12 >> 16 (signed)
347+
mov \rx, r12, ASR #16 @ \rx = r12 >> 16 (signed shift)
348348
.endm
349349

350350
.macro JUMPREL cc, rtmp @ \cc = condition code, \rtmp = temp register to use

amx/amxexec_cortexm0_gas.s

Lines changed: 66 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@ machine.
1616
@
1717
@
18-
@ Copyright (c) CompuPhase, 2015-2023
18+
@ Copyright (c) CompuPhase, 2015-2024
1919
@
2020
@ Licensed under the Apache License, Version 2.0 (the "License"); you may not
2121
@ use this file except in compliance with the License. You may obtain a copy
@@ -29,7 +29,7 @@
2929
@ License for the specific language governing permissions and limitations
3030
@ under the License.
3131
@
32-
@ $Id: amxexec_cortexm0_gas.S 7009 2023-10-10 19:30:59Z thiadmer $
32+
@ $Id: amxexec_cortexm0_gas.S 7115 2024-02-26 21:45:03Z thiadmer $
3333

3434
.file "amxexec_cortexm0_gas.S"
3535
.syntax unified
@@ -348,7 +348,7 @@ amx_opcodelist:
348348
.endm
349349

350350
.macro GETPARAM_P rx @ the opcode/parameter pack should be in r3
351-
lsrs \rx, r3, #16 @ \rx = r3 >> 16 (signed)
351+
asrs \rx, r3, #16 @ \rx = r3 >> 16 (signed shift)
352352
.endm
353353

354354
.macro JUMPREL rtmp, cc=al @ \rtmp = temp register to use, \cc = condition
@@ -907,12 +907,11 @@ amx_opcodelist_size:
907907
NEXT
908908

909909
.OP_NOT: @ tested
910-
movs r2, #0 @ preset r2 = 0
911-
cmp r0, #0
912-
bne 1f @ originally r0 != 0 -> done (r0 == 0 now)
913-
movs r2, #1 @ r0 was 0 -> set to 1
914-
1:
915-
mov r0, r2
910+
@ see Hacker's Delight, ch. 2.12 x == 0 -> ~(x | -x)
911+
rsbs r2, r0, #0 @ r2 = #0 - PRI
912+
orrs r0, r0, r2 @ r0 = PRI | -PRI -- sign bit set if PRI != 0
913+
mvns r0, r0 @ r0 = ~(PRI | -PRI) -- sign bit set if PRI == 0
914+
lsrs r0, r0, #31 @ shift sign bit to bit 0
916915
NEXT
917916

918917
.OP_NEG: @ tested
@@ -924,57 +923,46 @@ amx_opcodelist_size:
924923
NEXT
925924

926925
.OP_EQ: @ tested
927-
movs r2, #1 @ preset r2 = 1
928-
cmp r0, r1
929-
beq 1f @ r0 == r1 -> done
930-
movs r2, #0 @ r0 != r1 -> set r2 = 0
931-
1:
932-
mov r0, r2
926+
@ see Hacker's Delight, ch. 2.12 x == y -> ~(x - y | y - x)
927+
subs r2, r0, r1 @ r2 = PRI - ALT -- sign bit set if PRI < ALT
928+
subs r0, r1, r0 @ r0 = ALT - PRI -- sign bit set if PRI > ALT
929+
orrs r0, r0, r2 @ r0 = (PRI - ALT) | (ALT - PRI) -- sign bit set if PRI != ALT
930+
mvns r0, r0 @ r0 = ~r0 -- sign bit set if PRI == ALT
931+
lsrs r0, r0, #31 @ shift sign bit to bit 0
933932
NEXT
934933

935934
.OP_NEQ: @ tested
936-
movs r2, #1 @ preset r2 = 1
937-
cmp r0, r1
938-
bne 1f @ r0 != r1 -> done
939-
movs r2, #0 @ r0 == r1 -> set r2 = 0
940-
1:
941-
mov r0, r2
935+
@ see Hacker's Delight, ch. 2.12 x != y -> x - y | y - x
936+
subs r2, r0, r1 @ r2 = PRI - ALT -- sign bit set if PRI < ALT
937+
subs r0, r1, r0 @ r0 = ALT - PRI -- sign bit set if PRI > ALT
938+
orrs r0, r0, r2 @ r0 = (PRI - ALT) | (ALT - PRI) -- sign bit set if PRI != ALT
939+
lsrs r0, r0, #31 @ shift sign bit to bit 0
942940
NEXT
943941

944942
.OP_SLESS: @ tested
945-
movs r2, #1 @ preset r2 = 1
946-
cmp r0, r1
947-
blt 1f @ r0 < r1 -> done
948-
movs r2, #0 @ r0 >= r1 -> set r2 = 0
949-
1:
950-
mov r0, r2
943+
@ see Hacker's Delight, ch. 2.12
944+
subs r2, r0, r1 @ r2 = PRI - ALT -- sign bit set if PRI < ALT
945+
lsrs r0, r2, #31 @ shift sign bit to bit 0
951946
NEXT
952947

953948
.OP_SLEQ: @ tested
954-
movs r2, #1 @ preset r2 = 1
955-
cmp r0, r1
956-
ble 1f @ r0 <= r1 -> done
957-
movs r2, #0 @ r0 > r1 -> set r2 = 0
958-
1:
959-
mov r0, r2
949+
@ see Hacker's Delight, ch. 2.12 x <= 0 -> x | (x - 1)
950+
subs r2, r0, r1 @ r2 = PRI - ALT -- sign bit set if PRI < ALT
951+
subs r0, r2, #1 @ r0 = (PRI - ALT) - 1 -- sign bit set if PRI == ALT
952+
orrs r0, r0, r2
953+
lsrs r0, r0, #31 @ shift sign bit to bit 0
960954
NEXT
961955

962956
.OP_SGRTR: @ tested
963-
movs r2, #1 @ preset r2 = 1
964-
cmp r0, r1
965-
bgt 1f @ r0 > r1 -> done
966-
movs r2, #0 @ r0 <= r1 -> set r2 = 0
967-
1:
968-
mov r0, r2
957+
subs r2, r1, r0 @ r2 = ALT - PRI -- sign bit set if PRI > ALT
958+
lsrs r0, r2, #31 @ shift sign bit to bit 0
969959
NEXT
970960

971961
.OP_SGEQ: @ tested
972-
movs r2, #1 @ preset r2 = 1
973-
cmp r0, r1
974-
bge 1f @ r0 >= r1 -> done
975-
movs r2, #0 @ r0 < r1 -> set r2 = 0
976-
1:
977-
mov r0, r2
962+
subs r2, r1, r0 @ r2 = ALT - PRI -- sign bit set if PRI > ALT
963+
subs r0, r2, #1 @ r0 = (ALT - PRI) - 1 -- sign bit set if PRI == ALT
964+
orrs r0, r0, r2
965+
lsrs r0, r0, #31 @ shift sign bit to bit 0
978966
NEXT
979967

980968
.OP_INC_PRI: @ tested
@@ -1125,8 +1113,8 @@ amx_opcodelist_size:
11251113
cmp r2, #0 @ pointer == NULL ?
11261114
beq 1f @ yes, skip storing it
11271115
str r0, [r2] @ no, store PRI at pointer address
1128-
GETPARAM r2 @ parameter = return code from function
11291116
1:
1117+
GETPARAM r2 @ parameter = return code from function
11301118
bl .amx_exit @ use BL instruction for longer jump range, r14 is unused by exit code
11311119

11321120
.OP_BOUNDS:
@@ -1586,23 +1574,23 @@ amx_opcodelist_size:
15861574
NEXT
15871575

15881576
.OP_EQ_C_PRI: @ tested
1577+
@ see Hacker's Delight, ch. 2.12 x == y -> ~(x - y | y - x)
15891578
GETPARAM r2
1590-
movs r3, #1 @ preset to "true"
1591-
cmp r0, r2
1592-
beq 1f
1593-
movs r3, #0
1594-
1:
1595-
mov r0, r3
1579+
subs r3, r0, r2 @ r3 = PRI - param -- sign bit set if PRI < param
1580+
subs r0, r2, r0 @ r0 = param - PRI -- sign bit set if PRI > param
1581+
orrs r0, r0, r3 @ r0 = (PRI - param) | (param - PRI) -- sign bit set if PRI != param
1582+
mvns r0, r0 @ r0 = ~r0 -- sign bit set if PRI == param
1583+
lsrs r0, r0, #31 @ shift sign bit to bit 0
15961584
NEXT
15971585

15981586
.OP_EQ_C_ALT:
1587+
@ see Hacker's Delight, ch. 2.12 x == y -> ~(x - y | y - x)
15991588
GETPARAM r2
1600-
movs r3, #1 @ preset to "true"
1601-
cmp r1, r2
1602-
beq 1f
1603-
movs r3, #0
1604-
1:
1605-
mov r0, r3
1589+
subs r3, r1, r2 @ r3 = ALT - param -- sign bit set if ALT < param
1590+
subs r0, r2, r1 @ r0 = param - ALT -- sign bit set if ALT > param
1591+
orrs r0, r0, r3 @ r0 = (ALT - param) | (param - ALT) -- sign bit set if ALT != param
1592+
mvns r0, r0 @ r0 = ~r0 -- sign bit set if ALT == param
1593+
lsrs r0, r0, #31 @ shift sign bit to bit 0
16061594
NEXT
16071595

16081596
.OP_INC: @ tested
@@ -1781,7 +1769,7 @@ amx_opcodelist_size:
17811769
@ packed opcodes
17821770
.ifndef _NO_PACKED_OPC
17831771

1784-
.OP_LOAD_P_PRI:
1772+
.OP_LOAD_P_PRI: @ tested
17851773
GETPARAM_P r2
17861774
ldr r0, [r5, r2]
17871775
NEXT
@@ -1791,7 +1779,7 @@ amx_opcodelist_size:
17911779
ldr r1, [r5, r2]
17921780
NEXT
17931781

1794-
.OP_LOAD_P_S_PRI:
1782+
.OP_LOAD_P_S_PRI: @ tested
17951783
GETPARAM_P r2
17961784
ldr r0, [r7, r2]
17971785
NEXT
@@ -1853,12 +1841,12 @@ amx_opcodelist_size:
18531841
subs r1, r1, r5 @ reverse relocate
18541842
NEXT
18551843

1856-
.OP_STOR_P:
1844+
.OP_STOR_P: @ tested
18571845
GETPARAM_P r2
18581846
str r0, [r5, r2]
18591847
NEXT
18601848

1861-
.OP_STOR_P_S:
1849+
.OP_STOR_P_S: @ tested
18621850
GETPARAM_P r2
18631851
str r0, [r7, r2]
18641852
NEXT
@@ -2031,7 +2019,7 @@ amx_opcodelist_size:
20312019
bgt 1b
20322020
NEXT
20332021

2034-
.OP_STACK_P:
2022+
.OP_STACK_P: @ tested
20352023
GETPARAM_P r2
20362024
adds r6, r6, r2 @ STK += param
20372025
subs r1, r6, r5 @ ALT = STK, reverse-relocated
@@ -2059,7 +2047,7 @@ amx_opcodelist_size:
20592047
lsls r1, r1, r2 @ ALT = ALT << param
20602048
NEXT
20612049

2062-
.OP_ADD_P_C:
2050+
.OP_ADD_P_C: @ tested
20632051
GETPARAM_P r2
20642052
adds r0, r0, r2 @ PRI += param
20652053
NEXT
@@ -2081,24 +2069,24 @@ amx_opcodelist_size:
20812069
str r3, [r7, r2]
20822070
NEXT
20832071

2084-
.OP_EQ_P_C_PRI:
2072+
.OP_EQ_P_C_PRI: @ tested
2073+
@ see Hacker's Delight, ch. 2.12 x == y -> ~(x - y | y - x)
20852074
GETPARAM_P r2
2086-
movs r3, #1 @ preset to "true"
2087-
cmp r0, r2
2088-
beq 1f
2089-
movs r3, #0
2090-
1:
2091-
mov r0, r3
2075+
subs r3, r0, r2 @ r3 = PRI - param -- sign bit set if PRI < param
2076+
subs r0, r2, r0 @ r0 = param - PRI -- sign bit set if PRI > param
2077+
orrs r0, r0, r3 @ r0 = (PRI - param) | (param - PRI) -- sign bit set if PRI != param
2078+
mvns r0, r0 @ r0 = ~r0 -- sign bit set if PRI == param
2079+
lsrs r0, r0, #31 @ shift sign bit to bit 0
20922080
NEXT
20932081

20942082
.OP_EQ_P_C_ALT:
2083+
@ see Hacker's Delight, ch. 2.12 x == y -> ~(x - y | y - x)
20952084
GETPARAM_P r2
2096-
movs r3, #1 @ preset to "true"
2097-
cmp r1, r2
2098-
beq 1f
2099-
movs r3, #0
2100-
1:
2101-
mov r0, r3
2085+
subs r3, r1, r2 @ r3 = ALT - param -- sign bit set if ALT < param
2086+
subs r0, r2, r1 @ r0 = param - ALT -- sign bit set if ALT > param
2087+
orrs r0, r0, r3 @ r0 = (ALT - param) | (param - ALT) -- sign bit set if ALT != param
2088+
mvns r0, r0 @ r0 = ~r0 -- sign bit set if ALT == param
2089+
lsrs r0, r0, #31 @ shift sign bit to bit 0
21022090
NEXT
21032091

21042092
.OP_INC_P:
@@ -2141,8 +2129,8 @@ amx_opcodelist_size:
21412129
cmp r2, #0 @ pointer == NULL ?
21422130
beq 1f @ yes, skip storing it
21432131
str r0, [r2] @ no, store PRI at pointer address
2144-
GETPARAM_P r2 @ parameter = return code from function
21452132
1:
2133+
GETPARAM_P r2 @ parameter = return code from function
21462134
bl .amx_exit @ use BL instruction for longer jump range, r14 is unused by exit code
21472135

21482136
.OP_BOUNDS_P:

amx/amxexec_thumb2.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
; License for the specific language governing permissions and limitations
3030
; under the License.
3131
;
32-
; $Id: amxexec_thumb2.s 6974 2023-08-08 12:47:41Z thiadmer $
32+
; $Id: amxexec_thumb2.s 7106 2024-02-14 21:02:03Z thiadmer $
3333

3434

3535
AREA amxexec_data, DATA, READONLY
@@ -299,7 +299,7 @@ opcodelist_size EQU .-amx_opcodelist
299299

300300
MACRO
301301
GETPARAM_P $rx ; the opcode/parameter pack should be in r12
302-
mov $rx, r12, ASR #16 ; $rx = r12 >> 16 (signed)
302+
mov $rx, r12, ASR #16 ; $rx = r12 >> 16 (signed shift)
303303
MEND
304304

305305
MACRO

amx/amxexec_thumb2_gas.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
@ License for the specific language governing permissions and limitations
3333
@ under the License.
3434
@
35-
@ $Id: amxexec_thumb2_gas.S 7006 2023-10-09 08:09:26Z thiadmer $
35+
@ $Id: amxexec_thumb2_gas.S 7106 2024-02-14 21:02:03Z thiadmer $
3636

3737
.file "amxexec_thumb2_gas.s"
3838
.syntax unified
@@ -348,7 +348,7 @@ amx_opcodelist:
348348
.endm
349349

350350
.macro GETPARAM_P rx @ the opcode/parameter pack should be in r12
351-
mov \rx, r12, ASR #16 @ \rx = r12 >> 16 (signed)
351+
mov \rx, r12, ASR #16 @ \rx = r12 >> 16 (signed shift)
352352
.endm
353353

354354
.macro JUMPREL rtmp, cc=al, icc=al @ \rtmp = temp register to use, \cc = condition

compiler/pawncc.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#endif
77
#include "svnrev.h"
88

9-
AppIcon ICON "../pawn.ico"
9+
AppIcon ICON "../bin/pawn.ico"
1010

1111
/* Version information
1212
*

0 commit comments

Comments
 (0)