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