1bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
2bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
3bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// File Name:  armCOMM_s.h
4bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// OpenMAX DL: v1.0.2
5bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Revision:   12290
6bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Date:       Wednesday, April 9, 2008
7bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
8bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
10bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
11bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
12bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// ARM optimized OpenMAX common header file
13bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
14bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
15bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Protect against multiple inclusion
16bebc99d6fa433c04139294a5057f8439d772dbd9James Dong IF :LNOT::DEF:ARMCOMM_S_H
17bebc99d6fa433c04139294a5057f8439d772dbd9James Dong GBLL ARMCOMM_S_H
18bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
19bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        REQUIRE8            ;// Requires 8-byte stack alignment
20bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        PRESERVE8           ;// Preserves 8-byte stack alignment
21bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
22bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL    ARM_ERRORCHECK
23bebc99d6fa433c04139294a5057f8439d772dbd9James DongARM_ERRORCHECK  SETL {FALSE}
24bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
25bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Globals
26bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
27bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _RRegList   ;// R saved register list
28bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _DRegList   ;// D saved register list
29bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _Variant    ;// Selected processor variant
30bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _CPU        ;// CPU name
31bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _Struct     ;// Structure name
32bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
33bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL    _InFunc     ;// Inside function assembly flag
34bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL    _SwLong     ;// Long switch flag
35bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
36bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _RBytes     ;// Number of register bytes on stack
37bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _SBytes     ;// Number of scratch bytes on stack
38bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _ABytes     ;// Stack offset of next argument
39bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _Workspace  ;// Stack offset of scratch workspace
40bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _F          ;// Function number
41bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _StOff      ;// Struct offset
42bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLA    _SwNum      ;// Switch number
43bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _32         ;// Suffix for 32 byte alignmnet
44bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLS    _16         ;// Suffix for 16 byte alignmnet
45bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
46bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_InFunc         SETL    {FALSE}
47bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes         SETA    0
48bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_F              SETA    0
49bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SwNum          SETA    0
50bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_32             SETS    "ALIGN32"
51bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_16             SETS    "ALIGN16"
52bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
53bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////////
54bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Override the tools settings of the CPU if the #define
55bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// USECPU is set, otherwise use the CPU defined by the
56bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// assembler settings.
57bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////////
58bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
59bebc99d6fa433c04139294a5057f8439d772dbd9James Dong       IF :DEF: OVERRIDECPU
60bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_CPU       SETS  OVERRIDECPU
61bebc99d6fa433c04139294a5057f8439d772dbd9James Dong       ELSE
62bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_CPU       SETS    {CPU}
63bebc99d6fa433c04139294a5057f8439d772dbd9James Dong       ENDIF
64bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
65bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
66bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
67bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////////
68bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Work out which code to build
69bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////////
70bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
71bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF :DEF:ARM1136JS:LOR::DEF:CortexA8:LOR::DEF:ARM_GENERIC
72bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            INFO 1,"Please switch to using M_VARIANTS"
73bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
74bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
75bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Define and reset all officially recongnised variants
76bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
77bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANTS
78bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT ARM926EJS
79bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT ARM1136JS
80bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT ARM1136JS_U
81bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT CortexA8
82bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT ARM7TDMI
83bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
84bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
85bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
86bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANT $var
87bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL $var
88bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL _ok$var
89bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$var    SETL {FALSE}
90bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
91bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
92bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
93bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Variant declaration
94bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
95bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Define a list of code variants supported by this
96bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// source file. This macro then chooses the most
97bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// appropriate variant to build for the currently configured
98bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// core.
99bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
100bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_VARIANTS $v0,$v1,$v2,$v3,$v4,$v5,$v6,$v7
102bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Set to TRUE variants that are supported
103bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANTS
104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v0
105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v1
106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v2
107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v3
108bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v4
109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v5
110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v6
111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $v7
112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Look for first available variant to match a CPU
114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// _M_TRY cpu, variant fall back list
115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Variant SETS ""
116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM926EJ-S,   ARM926EJS
117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1176JZ-S,  ARM1136JS
118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1176JZF-S, ARM1136JS
119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1156T2-S,  ARM1136JS
120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1156T2F-S, ARM1136JS
121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1136J-S,   ARM1136JS
122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM1136JF-S,  ARM1136JS
123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY MPCore,       ARM1136JS
124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY falcon-vfp, ARM1136JS
125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY falcon-full-neon, CortexA8
126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY Cortex-A8NoNeon, ARM1136JS
127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY Cortex-A8,    CortexA8, ARM1136JS
128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY Cortex-R4,    ARM1136JS
129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY ARM7TDMI
130bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Select the correct variant
132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DEF_VARIANTS
133bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _Variant=""
134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            INFO 1, "No match found for CPU '$_CPU'"
135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$_Variant   SETL {TRUE}
137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Register a variant as available
141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_VARIANT $var
143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$var"=""
144bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF :LNOT::DEF:_ok$var
147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            INFO 1, "Unrecognized variant '$var'"
148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$var    SETL {TRUE}
150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// For a given CPU, see if any of the variants supporting
153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// this CPU are available. The first available variant is
154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// chosen
155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY $cpu, $v0,$v1,$v2,$v3,$v4,$v5,$v6,$v7
157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$cpu"<>_CPU
158bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
159bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
160bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v0
161bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v1
162bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v2
163bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v3
164bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v4
165bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v5
166bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v6
167bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $v7
168bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Check a match was found
169bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _Variant=""
170bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            INFO 1, "No variant match found for CPU '$_CPU'"
171bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
172bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
173bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
174bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
175bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_TRY1 $var
176bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$var"=""
177bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
178bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
179bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_Variant=""):LAND:$var
180bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Variant SETS "$var"
181bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
182bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
183bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
184bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;////////////////////////////////////////////////////////
185bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Structure definition
186bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;////////////////////////////////////////////////////////
187bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
188bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Declare a structure of given name
189bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
190bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STRUCT $sname
191bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Struct SETS "$sname"
192bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_StOff  SETA 0
193bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
194bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
195bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Declare a structure field
196bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// The field is called $sname_$fname
197bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $size   = the size of each entry, must be power of 2
198bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $number = (if provided) the number of entries for an array
199bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
200bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_FIELD $fname, $size, $number
201bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_StOff:AND:($size-1))!=0
202bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_StOff      SETA _StOff + ($size - (_StOff:AND:($size-1)))
203bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
204bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$_Struct._$fname EQU _StOff
205bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$number"<>""
206bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_StOff      SETA _StOff + $size*$number
207bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
208bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_StOff      SETA _StOff + $size
209bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
210bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
211bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
212bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
213bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
214bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ENDSTRUCT
215bebc99d6fa433c04139294a5057f8439d772dbd9James Dongsizeof_$_Struct EQU _StOff
216bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Struct SETS ""
217bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
218bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
219bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//////////////////////////////////////////////////////////
220bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Switch and table macros
221bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//////////////////////////////////////////////////////////
222bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
223bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Start a relative switch table with register to switch on
224bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
225bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $v = the register to switch on
226bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $s = if specified must be "L" to indicate long
227bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//      this allows a greater range to the case code
228bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
229bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_SWITCH $v, $s
230bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT "$s"="":LOR:"$s"="L"
231bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SwLong SETL {FALSE}
232bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$s"="L"
233bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SwLong     SETL {TRUE}
234bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
235bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SwNum  SETA _SwNum+1
236bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF {CONFIG}=16
237bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Thumb
238bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF _SwLong
239bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                TBH [pc, $v, LSL#1]
240bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ELSE
241bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                TBB [pc, $v]
242bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
243bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Switch$_SwNum
244bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
245bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// ARM
246bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ADD pc, pc, $v, LSL #2
247bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            NOP
248bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
249bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
250bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
251bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Add a case to the switch statement
252bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
253bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_CASE  $label
254bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF {CONFIG}=16
255bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Thumb
256bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF _SwLong
257bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                DCW ($label - _Switch$_SwNum)/2
258bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ELSE
259bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                DCB ($label - _Switch$_SwNum)/2
260bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
261bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
262bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// ARM
263bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            B   $label
264bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
265bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
266bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
267bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// End of switch statement
268bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
269bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ENDSWITCH
270bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ALIGN 2
271bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
272bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
273bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
274bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;////////////////////////////////////////////////////////
275bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Data area allocation
276bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;////////////////////////////////////////////////////////
277bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
278bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Constant table allocator macro
279bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
280bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Creates a new section for each constant table
281bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name is symbol through which the table can be accessed.
282bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $align is the optional alignment of the table, log2 of
283bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//  the byte alignment - $align=4 is 16 byte aligned
284bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
285bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_TABLE  $name, $align
286bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
287bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$align"=""
288bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            AREA |.constdata|, READONLY, DATA
289bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
290bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// AREAs inherit the alignment of the first declaration.
291bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Therefore for each alignment size we must have an area
292bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// of a different name.
293bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            AREA constdata_a$align, READONLY, DATA, ALIGN=$align
294bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
295bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// We also force alignment incase we are tagging onto
296bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// an already started area.
297bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ALIGN (1<<$align)
298bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
299bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name
300bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
301bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
302bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////
303bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Macros to allocate space on the stack
304bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
305bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// These all assume that the stack is 8-byte aligned
306bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// at entry to the function, which means that the
307bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// 32-byte alignment macro needs to work in a
308bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// bit more of a special way...
309bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;/////////////////////////////////////////////////////
310bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
311bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
312bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
313bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
314bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 1-byte aligned area of name
315bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size $size bytes.
316bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
317bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC1  $name, $size
318bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
319bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F   EQU _SBytes
320bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size)
321bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
322bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
323bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 2-byte aligned area of name
324bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size $size bytes.
325bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
326bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC2  $name, $size
327bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
328bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes:AND:1)!=0
329bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (2 - (_SBytes:AND:1))
330bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
331bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F   EQU _SBytes
332bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size)
333bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
334bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
335bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 4-byte aligned area of name
336bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size $size bytes.
337bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
338bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC4  $name, $size
339bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
340bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes:AND:3)!=0
341bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (4 - (_SBytes:AND:3))
342bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
343bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F   EQU _SBytes
344bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size)
345bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
346bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
347bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 8-byte aligned area of name
348bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size $size bytes.
349bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
350bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC8  $name, $size
351bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
352bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes:AND:7)!=0
353bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (8 - (_SBytes:AND:7))
354bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
355bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F   EQU _SBytes
356bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size)
357bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
358bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
359bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
360bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 8-byte aligned area of name
361bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size ($size+16) bytes.
362bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// The extra 16 bytes are later used to align the pointer to 16 bytes
363bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
364bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
365bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC16  $name, $size
366bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
367bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes:AND:7)!=0
368bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (8 - (_SBytes:AND:7))
369bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
370bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F$_16   EQU (_SBytes + 8)
371bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size) + 8
372bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
373bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
374bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate 8-byte aligned area of name
375bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name size ($size+32) bytes.
376bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// The extra 32 bytes are later used to align the pointer to 32 bytes
377bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
378bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
379bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ALLOC32  $name, $size
380bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
381bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes:AND:7)!=0
382bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (8 - (_SBytes:AND:7))
383bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
384bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F$_32   EQU (_SBytes + 24)
385bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes SETA _SBytes + ($size) + 24
386bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
387bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
388bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
389bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
390bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
391bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Argument Declaration Macro
392bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
393bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Allocate an argument name $name
394bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// size $size bytes
395bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
396bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ARG     $name, $size
397bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT _InFunc
398bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name$_F    EQU _ABytes
399bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_ABytes SETA _ABytes + ($size)
400bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
401bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
402bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;///////////////////////////////////////////////
403bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Macros to access stacked variables
404bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;///////////////////////////////////////////////
405bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
406bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Macro to perform a data processing operation
407bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// with a constant second operand
408bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
409bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_OPC $op,$rd,$rn,$const
410bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLA    _sh
411bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLA    _cst
412bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_sh     SETA    0
413bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_cst    SETA    $const
414bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _cst=0
415bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $op $rd, $rn, #_cst
416bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
417bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
418bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        WHILE (_cst:AND:3)=0
419bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_cst        SETA _cst>>2
420bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_sh         SETA _sh+2
421bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        WEND
422bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $op $rd, $rn, #(_cst:AND:0x000000FF)<<_sh
423bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _cst>=256
424bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $op $rd, $rd, #(_cst:AND:0xFFFFFF00)<<_sh
425bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
426bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
427bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
428bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Macro to perform a data access operation
429bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Such as LDR or STR
430bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// The addressing mode is modified such that
431bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// 1. If no address is given then the name is taken
432bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//    as a stack offset
433bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// 2. If the addressing mode is not available for the
434bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//    state being assembled for (eg Thumb) then a suitable
435bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//    addressing mode is substituted.
436bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
437bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// On Entry:
438bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $i = Instruction to perform (eg "LDRB")
439bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $a = Required byte alignment
440bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $r = Register(s) to transfer (eg "r1")
441bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $a0,$a1,$a2. Addressing mode and condition. One of:
442bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     label {,cc}
443bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     [base]                    {,,,cc}
444bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     [base, offset]{!}         {,,cc}
445bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     [base, offset, shift]{!}  {,cc}
446bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     [base], offset            {,,cc}
447bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//     [base], offset, shift     {,cc}
448bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
449bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA $i,$a,$r,$a0,$a1,$a2,$a3
450bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$a0":LEFT:1="["
451bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF "$a1"=""
452bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                $i$a3   $r, $a0
453bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ELSE
454bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                IF "$a0":RIGHT:1="]"
455bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    IF "$a2"=""
456bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        _M_POSTIND $i$a3, "$r", $a0, $a1
457bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    ELSE
458bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        _M_POSTIND $i$a3, "$r", $a0, "$a1,$a2"
459bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    ENDIF
460bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                ELSE
461bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    IF "$a2"=""
462bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        _M_PREIND  $i$a3, "$r", $a0, $a1
463bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    ELSE
464bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                        _M_PREIND  $i$a3, "$r", $a0, "$a1,$a2"
465bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    ENDIF
466bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                ENDIF
467bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
468bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
469bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            LCLA    _Offset
470bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Offset     SETA    _Workspace + $a0$_F
471bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ASSERT  (_Offset:AND:($a-1))=0
472bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $i$a1   $r, [sp, #_Offset]
473bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
474bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
475bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
476bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Handle post indexed load/stores
477bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// op  reg, [base], offset
478bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
479bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_POSTIND $i,$r,$a0,$a1
480bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLS _base
481bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLS _offset
482bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF {CONFIG}=16 ;// Thumb
483bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_base       SETS ("$a0":LEFT:(:LEN:"$a0"-1)):RIGHT:(:LEN:"$a0"-2)   ;// remove []
484bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_offset     SETS "$a1"
485bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF _offset:LEFT:1="+"
486bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_offset         SETS _offset:RIGHT:(:LEN:_offset-1)
487bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
488bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $i  $r, $a0
489bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF _offset:LEFT:1="-"
490bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_offset         SETS _offset:RIGHT:(:LEN:_offset-1)
491bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                SUB $_base, $_base, $_offset
492bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ELSE
493bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                ADD $_base, $_base, $_offset
494bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
495bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE ;// ARM
496bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $i  $r, $a0, $a1
497bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
498bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
499bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
500bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Handle pre indexed load/store
501bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// op  reg, [base, offset]{!}
502bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
503bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_PREIND $i,$r,$a0,$a1
504bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLS _base
505bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLS _offset
506bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF ({CONFIG}=16):LAND:(("$a1":RIGHT:2)="]!")
507bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_base       SETS "$a0":RIGHT:(:LEN:("$a0")-1)
508bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_offset     SETS "$a1":LEFT:(:LEN:("$a1")-2)
509bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $i $r, [$_base, $_offset]
510bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ADD $_base, $_base, $_offset
511bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
512bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            $i  $r, $a0, $a1
513bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
514bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
515bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
516bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load unsigned byte from stack
517bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
518bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDRB  $r,$a0,$a1,$a2,$a3
519bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDRB",1,$r,$a0,$a1,$a2,$a3
520bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
521bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
522bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load signed byte from stack
523bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
524bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDRSB $r,$a0,$a1,$a2,$a3
525bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDRSB",1,$r,$a0,$a1,$a2,$a3
526bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
527bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
528bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Store byte to stack
529bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
530bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STRB  $r,$a0,$a1,$a2,$a3
531bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "STRB",1,$r,$a0,$a1,$a2,$a3
532bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
533bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
534bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load unsigned half word from stack
535bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
536bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDRH  $r,$a0,$a1,$a2,$a3
537bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDRH",2,$r,$a0,$a1,$a2,$a3
538bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
539bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
540bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load signed half word from stack
541bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
542bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDRSH $r,$a0,$a1,$a2,$a3
543bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDRSH",2,$r,$a0,$a1,$a2,$a3
544bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
545bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
546bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Store half word to stack
547bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
548bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STRH  $r,$a0,$a1,$a2,$a3
549bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "STRH",2,$r,$a0,$a1,$a2,$a3
550bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
551bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
552bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load word from stack
553bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
554bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDR   $r,$a0,$a1,$a2,$a3
555bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDR",4,$r,$a0,$a1,$a2,$a3
556bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
557bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
558bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Store word to stack
559bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
560bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STR   $r,$a0,$a1,$a2,$a3
561bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "STR",4,$r,$a0,$a1,$a2,$a3
562bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
563bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
564bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Load double word from stack
565bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
566bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_LDRD  $r0,$r1,$a0,$a1,$a2,$a3
567bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "LDRD",8,"$r0,$r1",$a0,$a1,$a2,$a3
568bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
569bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
570bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Store double word to stack
571bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
572bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STRD  $r0,$r1,$a0,$a1,$a2,$a3
573bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_DATA "STRD",8,"$r0,$r1",$a0,$a1,$a2,$a3
574bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
575bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
576bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Get absolute address of stack allocated location
577bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
578bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ADR   $a, $b, $cc
579bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_OPC  ADD$cc, $a, sp, (_Workspace + $b$_F)
580bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
581bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
582bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Get absolute address of stack allocated location and align the address to 16 bytes
583bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
584bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ADR16 $a, $b, $cc
585bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_OPC  ADD$cc, $a, sp, (_Workspace + $b$_F$_16)
586bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
587bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Now align $a to 16 bytes
588bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            BIC$cc  $a,$a,#0x0F
589bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
590bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
591bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Get absolute address of stack allocated location and align the address to 32 bytes
592bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
593bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_ADR32 $a, $b, $cc
594bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_OPC  ADD$cc, $a, sp, (_Workspace + $b$_F$_32)
595bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
596bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Now align $a to 32 bytes
597bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            BIC$cc  $a,$a,#0x1F
598bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
599bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
600bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//////////////////////////////////////////////////////////
601bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Function header and footer macros
602bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//////////////////////////////////////////////////////////
603bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
604bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Function Header Macro
605bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Generates the function prologue
606bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Note that functions should all be "stack-moves-once"
607bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// The FNSTART and FNEND macros should be the only places
608bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// where the stack moves.
609bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
610bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $name  = function name
611bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $rreg  = ""   don't stack any registers
612bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//          "lr" stack "lr" only
613bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//          "rN" stack registers "r4-rN,lr"
614bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $dreg  = ""   don't stack any D registers
615bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//          "dN" stack registers "d8-dN"
616bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
617bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Note: ARM Archicture procedure call standard AAPCS
618bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// states that r4-r11, sp, d8-d15 must be preserved by
619bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// a compliant function.
620bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
621bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_START $name, $rreg, $dreg
622bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT :LNOT:_InFunc
623bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT "$name"!=""
624bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_InFunc SETL {TRUE}
625bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes SETA 0
626bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_Workspace SETA 0
627bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
628bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Create an area for the function
629bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        AREA    |.text|, CODE
630bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        EXPORT  $name
631bebc99d6fa433c04139294a5057f8439d772dbd9James Dong$name   FUNCTION
632bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
633bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Save R registers
634bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_GETRREGLIST $rreg
635bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _RRegList<>""
636bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            STMFD   sp!, {$_RRegList, lr}
637bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
638bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
639bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Save D registers
640bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_GETDREGLIST  $dreg
641bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _DRegList<>""
642bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            VSTMFD  sp!, {$_DRegList}
643bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
644bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
645bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
646bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Ensure size claimed on stack is 8-byte aligned
647bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF ((_SBytes:AND:7)!=0)
648bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes     SETA _SBytes + (8 - (_SBytes:AND:7))
649bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
650bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
651bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF (_SBytes!=0)
652bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_OPC SUB, sp, sp, _SBytes
653bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
654bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
655bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
656bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_ABytes SETA _SBytes + _RBytes - _Workspace
657bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
658bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
659bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Print function name if debug enabled
660bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_PRINTF "$name\n",
661bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
662bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
663bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Work out a list of R saved registers
664bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
665bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_GETRREGLIST $rreg
666bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"=""
667bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS ""
668bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
669bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
670bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"="lr":LOR:"$rreg"="r4"
671bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS "r4"
672bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+8
673bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
674bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
675bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"="r5":LOR:"$rreg"="r6"
676bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS "r4-r6"
677bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+16
678bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
679bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
680bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"="r7":LOR:"$rreg"="r8"
681bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS "r4-r8"
682bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+24
683bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
684bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
685bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"="r9":LOR:"$rreg"="r10"
686bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS "r4-r10"
687bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+32
688bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
689bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
690bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$rreg"="r11":LOR:"$rreg"="r12"
691bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RRegList   SETS "r4-r12"
692bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+40
693bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
694bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
695bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        INFO 1, "Unrecognized saved r register limit '$rreg'"
696bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
697bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
698bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Work out a list of D saved registers
699bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
700bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_GETDREGLIST $dreg
701bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"=""
702bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS ""
703bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
704bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
705bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d8"
706bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8"
707bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+8
708bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
709bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
710bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d9"
711bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d9"
712bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+16
713bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
714bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
715bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d10"
716bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d10"
717bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+24
718bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
719bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
720bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d11"
721bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d11"
722bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+32
723bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
724bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
725bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d12"
726bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d12"
727bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+40
728bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
729bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
730bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d13"
731bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d13"
732bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+48
733bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
734bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
735bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d14"
736bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d14"
737bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+56
738bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
739bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
740bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$dreg"="d15"
741bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_DRegList   SETS "d8-d15"
742bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_RBytes     SETA _RBytes+64
743bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            MEXIT
744bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
745bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        INFO 1, "Unrecognized saved d register limit '$dreg'"
746bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
747bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
748bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Produce function return instructions
749bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
750bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_RET $cc
751bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _DRegList<>""
752bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            VPOP$cc {$_DRegList}
753bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
754bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _RRegList=""
755bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            BX$cc lr
756bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
757bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            LDM$cc.FD sp!, {$_RRegList, pc}
758bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
759bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
760bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
761bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Early Function Exit Macro
762bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// $cc = condition to exit with
763bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// (Example: M_EXIT EQ)
764bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
765bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_EXIT  $cc
766bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT  _InFunc
767bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF  _SBytes!=0
768bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Restore stack frame and exit
769bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            B$cc  _End$_F
770bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
771bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ;// Can return directly
772bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_RET $cc
773bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
774bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
775bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
776bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Function Footer Macro
777bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Generates the function epilogue
778bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
779bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_END
780bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ASSERT _InFunc
781bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_InFunc SETL {FALSE}
782bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_End$_F
783bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
784bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Restore the stack pointer to its original value on function entry
785bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF _SBytes!=0
786bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_OPC ADD, sp, sp, _SBytes
787bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
788bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_RET
789bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDFUNC
790bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
791bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Reset the global stack tracking variables back to their
792bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// initial values, and increment the function count
793bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_SBytes        SETA 0
794bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_F             SETA _F+1
795bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
796bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
797bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
798bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//==========================================================================
799bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Debug Macros
800bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//==========================================================================
801bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
802bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL    DEBUG_ON
803bebc99d6fa433c04139294a5057f8439d772dbd9James DongDEBUG_ON SETL   {FALSE}
804bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        GBLL    DEBUG_STALLS_ON
805bebc99d6fa433c04139294a5057f8439d772dbd9James DongDEBUG_STALLS_ON SETL {FALSE}
806bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
807bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//==========================================================================
808bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Debug call to printf
809bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//  M_PRINTF $format, $val0, $val1, $val2
810bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
811bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Examples:
812bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//  M_PRINTF "x=%08x\n", r0
813bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//
814bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// This macro preserves the value of all registers including the
815bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// flags.
816bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//==========================================================================
817bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
818bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
819bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_PRINTF  $format, $val0, $val1, $val2
820bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF DEBUG_ON
821bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
822bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IMPORT  printf
823bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LCLA    nArgs
824bebc99d6fa433c04139294a5057f8439d772dbd9James DongnArgs	SETA    0
825bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
826bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// save registers so we don't corrupt them
827bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        STMFD   sp!, {r0-r12, lr}
828bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
829bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Drop stack to give us some workspace
830bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SUB     sp, sp, #16
831bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
832bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Save registers we need to print to the stack
833bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$val2" <> ""
834bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ASSERT "$val1" <> ""
835bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            STR    $val2, [sp, #8]
836bebc99d6fa433c04139294a5057f8439d772dbd9James DongnArgs       SETA   nArgs+1
837bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
838bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$val1" <> ""
839bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ASSERT "$val0" <> ""
840bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            STR    $val1, [sp, #4]
841bebc99d6fa433c04139294a5057f8439d772dbd9James DongnArgs	    SETA   nArgs+1
842bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
843bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$val0"<>""
844bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            STR    $val0, [sp]
845bebc99d6fa433c04139294a5057f8439d772dbd9James DongnArgs	    SETA   nArgs+1
846bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
847bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
848bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Now we are safe to corrupt registers
849bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ADR     r0, %FT00
850bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF nArgs=1
851bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          LDR   r1, [sp]
852bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
853bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF nArgs=2
854bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          LDMIA sp, {r1,r2}
855bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
856bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF nArgs=3
857bebc99d6fa433c04139294a5057f8439d772dbd9James Dong          LDMIA sp, {r1,r2,r3}
858bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
859bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
860bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// print the values
861bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MRS     r4, cpsr        ;// preserve flags
862bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        BL      printf
863bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MSR     cpsr_f, r4      ;// restore flags
864bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        B       %FT01
865bebc99d6fa433c04139294a5057f8439d772dbd9James Dong00      ;// string to print
866bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        DCB     "$format", 0
867bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ALIGN
868bebc99d6fa433c04139294a5057f8439d772dbd9James Dong01      ;// Finished
869bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ADD     sp, sp, #16
870bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Restore registers
871bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LDMFD	sp!, {r0-r12,lr}
872bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
873bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF   ;// DEBUG_ON
874bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
875bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
876bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
877bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Stall Simulation Macro
878bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// Inserts a given number of NOPs for the currently
879bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;//  defined platform
880bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
881bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        M_STALL $plat1stall, $plat2stall, $plat3stall, $plat4stall, $plat5stall, $plat6stall
882bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF DEBUG_STALLS_ON
883bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat1stall
884bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat2stall
885bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat3stall
886bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat4stall
887bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat5stall
888bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            _M_STALL_SUB $plat6stall
889bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
890bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
891bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
892bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
893bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        _M_STALL_SUB $platstall
894bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF "$platstall"!=""
895bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            LCLA _pllen
896bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            LCLS _pl
897bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            LCLL _pllog
898bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_pllen      SETA :LEN:"$platstall"
899bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_pl         SETS "$platstall":LEFT:(_pllen - 2)
900bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            IF :DEF:$_pl
901bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                IF $_pl
902bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    LCLS _st
903bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    LCLA _stnum
904bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_st                 SETS "$platstall":RIGHT:1
905bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_stnum              SETA $_st
906bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    WHILE _stnum>0
907bebc99d6fa433c04139294a5057f8439d772dbd9James Dong			MOV sp, sp
908bebc99d6fa433c04139294a5057f8439d772dbd9James Dong_stnum                  SETA _stnum - 1
909bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                    WEND
910bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                ENDIF
911bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            ENDIF
912bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
913bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
914bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
915bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
916bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
917bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//==========================================================================
918bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// Endian Invarience Macros
919bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
920bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// The idea behind these macros is that if an array is
921bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// loaded as words then the SMUL00 macro will multiply
922bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// array elements 0 regardless of the endianess of the
923bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// system. For little endian SMUL00=SMULBB, for big
924bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;// endian SMUL00=SMULTT and similarly for other packed operations.
925bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//
926bebc99d6fa433c04139294a5057f8439d772dbd9James Dong;//==========================================================================
927bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
928bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
929bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4   $comli, $combi, $a, $b, $c, $d, $cc
930bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF {ENDIAN}="big"
931bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $combi.$cc $a, $b, $c, $d
932bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
933bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $comli.$cc $a, $b, $c, $d
934bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
935bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
936bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
937bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
938bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3   $comli, $combi, $a, $b, $c, $cc
939bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        IF {ENDIAN}="big"
940bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $combi.$cc $a, $b, $c
941bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ELSE
942bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        $comli.$cc $a, $b, $c
943bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ENDIF
944bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
945bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
946bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// SMLAxy macros
947bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
948bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
949bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA00  $a, $b, $c, $d, $cc
950bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABB, SMLATT, $a, $b, $c, $d, $cc
951bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
952bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
953bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
954bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA01  $a, $b, $c, $d, $cc
955bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABT, SMLATB, $a, $b, $c, $d, $cc
956bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
957bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
958bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
959bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA0B  $a, $b, $c, $d, $cc
960bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABB, SMLATB, $a, $b, $c, $d, $cc
961bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
962bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
963bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
964bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA0T  $a, $b, $c, $d, $cc
965bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABT, SMLATT, $a, $b, $c, $d, $cc
966bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
967bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
968bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
969bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA10  $a, $b, $c, $d, $cc
970bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATB, SMLABT, $a, $b, $c, $d, $cc
971bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
972bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
973bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
974bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA11  $a, $b, $c, $d, $cc
975bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATT, SMLABB, $a, $b, $c, $d, $cc
976bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
977bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
978bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
979bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA1B  $a, $b, $c, $d, $cc
980bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATB, SMLABB, $a, $b, $c, $d, $cc
981bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
982bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
983bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
984bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLA1T  $a, $b, $c, $d, $cc
985bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATT, SMLABT, $a, $b, $c, $d, $cc
986bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
987bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
988bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
989bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAB0  $a, $b, $c, $d, $cc
990bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABB, SMLABT, $a, $b, $c, $d, $cc
991bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
992bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
993bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
994bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAB1  $a, $b, $c, $d, $cc
995bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLABT, SMLABB, $a, $b, $c, $d, $cc
996bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
997bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
998bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
999bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAT0  $a, $b, $c, $d, $cc
1000bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATB, SMLATT, $a, $b, $c, $d, $cc
1001bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1002bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1003bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1004bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAT1  $a, $b, $c, $d, $cc
1005bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLATT, SMLATB, $a, $b, $c, $d, $cc
1006bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1007bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1008bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// SMULxy macros
1009bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1010bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1011bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL00  $a, $b, $c, $cc
1012bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBB, SMULTT, $a, $b, $c, $cc
1013bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1014bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1015bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1016bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL01  $a, $b, $c, $cc
1017bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBT, SMULTB, $a, $b, $c, $cc
1018bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1019bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1020bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1021bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL0B  $a, $b, $c, $cc
1022bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBB, SMULTB, $a, $b, $c, $cc
1023bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1024bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1025bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1026bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL0T  $a, $b, $c, $cc
1027bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBT, SMULTT, $a, $b, $c, $cc
1028bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1029bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1030bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1031bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL10  $a, $b, $c, $cc
1032bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTB, SMULBT, $a, $b, $c, $cc
1033bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1034bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1035bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1036bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL11  $a, $b, $c, $cc
1037bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTT, SMULBB, $a, $b, $c, $cc
1038bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1039bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1040bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1041bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL1B  $a, $b, $c, $cc
1042bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTB, SMULBB, $a, $b, $c, $cc
1043bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1044bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1045bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1046bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMUL1T  $a, $b, $c, $cc
1047bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTT, SMULBT, $a, $b, $c, $cc
1048bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1049bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1050bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1051bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULB0  $a, $b, $c, $cc
1052bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBB, SMULBT, $a, $b, $c, $cc
1053bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1054bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1055bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1056bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULB1  $a, $b, $c, $cc
1057bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULBT, SMULBB, $a, $b, $c, $cc
1058bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1059bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1060bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1061bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULT0  $a, $b, $c, $cc
1062bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTB, SMULTT, $a, $b, $c, $cc
1063bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1064bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1065bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1066bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULT1  $a, $b, $c, $cc
1067bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULTT, SMULTB, $a, $b, $c, $cc
1068bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1069bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1070bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// SMLAWx, SMULWx macros
1071bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1072bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1073bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAW0  $a, $b, $c, $d, $cc
1074bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLAWB, SMLAWT, $a, $b, $c, $d, $cc
1075bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1076bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1077bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1078bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAW1  $a, $b, $c, $d, $cc
1079bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLAWT, SMLAWB, $a, $b, $c, $d, $cc
1080bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1081bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1082bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1083bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULW0  $a, $b, $c, $cc
1084bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULWB, SMULWT, $a, $b, $c, $cc
1085bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1086bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1087bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1088bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMULW1  $a, $b, $c, $cc
1089bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI3 SMULWT, SMULWB, $a, $b, $c, $cc
1090bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1091bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1092bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        ;// SMLALxy macros
1093bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1094bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1095bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1096bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL00  $a, $b, $c, $d, $cc
1097bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBB, SMLALTT, $a, $b, $c, $d, $cc
1098bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1099bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1100bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL01  $a, $b, $c, $d, $cc
1102bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBT, SMLALTB, $a, $b, $c, $d, $cc
1103bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL0B  $a, $b, $c, $d, $cc
1107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBB, SMLALTB, $a, $b, $c, $d, $cc
1108bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL0T  $a, $b, $c, $d, $cc
1112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBT, SMLALTT, $a, $b, $c, $d, $cc
1113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL10  $a, $b, $c, $d, $cc
1117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTB, SMLALBT, $a, $b, $c, $d, $cc
1118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL11  $a, $b, $c, $d, $cc
1122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTT, SMLALBB, $a, $b, $c, $d, $cc
1123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL1B  $a, $b, $c, $d, $cc
1127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTB, SMLALBB, $a, $b, $c, $d, $cc
1128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1130bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLAL1T  $a, $b, $c, $d, $cc
1132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTT, SMLALBT, $a, $b, $c, $d, $cc
1133bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLALB0  $a, $b, $c, $d, $cc
1137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBB, SMLALBT, $a, $b, $c, $d, $cc
1138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLALB1  $a, $b, $c, $d, $cc
1142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALBT, SMLALBB, $a, $b, $c, $d, $cc
1143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1144bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLALT0  $a, $b, $c, $d, $cc
1147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTB, SMLALTT, $a, $b, $c, $d, $cc
1148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MACRO
1151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        SMLALT1  $a, $b, $c, $d, $cc
1152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        LIBI4 SMLALTT, SMLALTB, $a, $b, $c, $d, $cc
1153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        MEND
1154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong  ENDIF ;// ARMCOMM_S_H
1156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
1157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong  END
1158