15
15
@ machine.
16
16
@
17
17
@
18
- @ Copyright (c) CompuPhase , 2015 - 2023
18
+ @ Copyright (c) CompuPhase , 2015 - 2024
19
19
@
20
20
@ Licensed under the Apache License , Version 2 . 0 (the "License" ) ; you may not
21
21
@ use this file except in compliance with the License. You may obtain a copy
29
29
@ License for the specific language governing permissions and limitations
30
30
@ under the License.
31
31
@
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 $
33
33
34
34
.file "amxexec_cortexm0_gas.S"
35
35
.syntax unified
@@ -348,7 +348,7 @@ amx_opcodelist:
348
348
.endm
349
349
350
350
.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 )
352
352
.endm
353
353
354
354
.macro JUMPREL rtmp , cc= al @ \rtmp = temp register to use , \cc = condition
@@ -907,12 +907,11 @@ amx_opcodelist_size:
907
907
NEXT
908
908
909
909
.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
916
915
NEXT
917
916
918
917
.OP_NEG: @ tested
@@ -924,57 +923,46 @@ amx_opcodelist_size:
924
923
NEXT
925
924
926
925
.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
933
932
NEXT
934
933
935
934
.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
942
940
NEXT
943
941
944
942
.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
951
946
NEXT
952
947
953
948
.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
960
954
NEXT
961
955
962
956
.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
969
959
NEXT
970
960
971
961
.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
978
966
NEXT
979
967
980
968
.OP_INC_PRI: @ tested
@@ -1125,8 +1113,8 @@ amx_opcodelist_size:
1125
1113
cmp r2 , # 0 @ pointer == NULL ?
1126
1114
beq 1f @ yes , skip storing it
1127
1115
str r0 , [ r2 ] @ no , store PRI at pointer address
1128
- GETPARAM r2 @ parameter = return code from function
1129
1116
1 :
1117
+ GETPARAM r2 @ parameter = return code from function
1130
1118
bl .amx_exit @ use BL instruction for longer jump range , r14 is unused by exit code
1131
1119
1132
1120
.OP_BOUNDS:
@@ -1586,23 +1574,23 @@ amx_opcodelist_size:
1586
1574
NEXT
1587
1575
1588
1576
.OP_EQ_C_PRI: @ tested
1577
+ @ see Hacker's Delight , ch . 2 . 12 x == y - > ~(x - y | y - x)
1589
1578
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
1596
1584
NEXT
1597
1585
1598
1586
.OP_EQ_C_ALT:
1587
+ @ see Hacker's Delight , ch . 2 . 12 x == y - > ~(x - y | y - x)
1599
1588
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
1606
1594
NEXT
1607
1595
1608
1596
.OP_INC: @ tested
@@ -1781,7 +1769,7 @@ amx_opcodelist_size:
1781
1769
@ packed opcodes
1782
1770
.ifndef _NO_PACKED_OPC
1783
1771
1784
- .OP_LOAD_P_PRI:
1772
+ .OP_LOAD_P_PRI: @ tested
1785
1773
GETPARAM_P r2
1786
1774
ldr r0 , [ r5 , r2 ]
1787
1775
NEXT
@@ -1791,7 +1779,7 @@ amx_opcodelist_size:
1791
1779
ldr r1 , [ r5 , r2 ]
1792
1780
NEXT
1793
1781
1794
- .OP_LOAD_P_S_PRI:
1782
+ .OP_LOAD_P_S_PRI: @ tested
1795
1783
GETPARAM_P r2
1796
1784
ldr r0 , [ r7 , r2 ]
1797
1785
NEXT
@@ -1853,12 +1841,12 @@ amx_opcodelist_size:
1853
1841
subs r1 , r1 , r5 @ reverse relocate
1854
1842
NEXT
1855
1843
1856
- .OP_STOR_P:
1844
+ .OP_STOR_P: @ tested
1857
1845
GETPARAM_P r2
1858
1846
str r0 , [ r5 , r2 ]
1859
1847
NEXT
1860
1848
1861
- .OP_STOR_P_S:
1849
+ .OP_STOR_P_S: @ tested
1862
1850
GETPARAM_P r2
1863
1851
str r0 , [ r7 , r2 ]
1864
1852
NEXT
@@ -2031,7 +2019,7 @@ amx_opcodelist_size:
2031
2019
bgt 1b
2032
2020
NEXT
2033
2021
2034
- .OP_STACK_P:
2022
+ .OP_STACK_P: @ tested
2035
2023
GETPARAM_P r2
2036
2024
adds r6 , r6 , r2 @ STK + = param
2037
2025
subs r1 , r6 , r5 @ ALT = STK , reverse - relocated
@@ -2059,7 +2047,7 @@ amx_opcodelist_size:
2059
2047
lsls r1 , r1 , r2 @ ALT = ALT << param
2060
2048
NEXT
2061
2049
2062
- .OP_ADD_P_C:
2050
+ .OP_ADD_P_C: @ tested
2063
2051
GETPARAM_P r2
2064
2052
adds r0 , r0 , r2 @ PRI + = param
2065
2053
NEXT
@@ -2081,24 +2069,24 @@ amx_opcodelist_size:
2081
2069
str r3 , [ r7 , r2 ]
2082
2070
NEXT
2083
2071
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)
2085
2074
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
2092
2080
NEXT
2093
2081
2094
2082
.OP_EQ_P_C_ALT:
2083
+ @ see Hacker's Delight , ch . 2 . 12 x == y - > ~(x - y | y - x)
2095
2084
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
2102
2090
NEXT
2103
2091
2104
2092
.OP_INC_P:
@@ -2141,8 +2129,8 @@ amx_opcodelist_size:
2141
2129
cmp r2 , # 0 @ pointer == NULL ?
2142
2130
beq 1f @ yes , skip storing it
2143
2131
str r0 , [ r2 ] @ no , store PRI at pointer address
2144
- GETPARAM_P r2 @ parameter = return code from function
2145
2132
1 :
2133
+ GETPARAM_P r2 @ parameter = return code from function
2146
2134
bl .amx_exit @ use BL instruction for longer jump range , r14 is unused by exit code
2147
2135
2148
2136
.OP_BOUNDS_P:
0 commit comments