lib1funcs.S 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330
  1. /* libgcc routines for NEC V850.
  2. Copyright (C) 1996-2022 Free Software Foundation, Inc.
  3. This file is part of GCC.
  4. GCC is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by the
  6. Free Software Foundation; either version 3, or (at your option) any
  7. later version.
  8. This file is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. Under Section 7 of GPL version 3, you are granted additional
  13. permissions described in the GCC Runtime Library Exception, version
  14. 3.1, as published by the Free Software Foundation.
  15. You should have received a copy of the GNU General Public License and
  16. a copy of the GCC Runtime Library Exception along with this program;
  17. see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
  18. <http://www.gnu.org/licenses/>. */
  19. #ifdef L_mulsi3
  20. .text
  21. .globl ___mulsi3
  22. .type ___mulsi3,@function
  23. ___mulsi3:
  24. #ifdef __v850__
  25. /*
  26. #define SHIFT 12
  27. #define MASK ((1 << SHIFT) - 1)
  28. #define STEP(i, j) \
  29. ({ \
  30. short a_part = (a >> (i)) & MASK; \
  31. short b_part = (b >> (j)) & MASK; \
  32. int res = (((int) a_part) * ((int) b_part)); \
  33. res; \
  34. })
  35. int
  36. __mulsi3 (unsigned a, unsigned b)
  37. {
  38. return STEP (0, 0) +
  39. ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
  40. ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
  41. << (2 * SHIFT));
  42. }
  43. */
  44. mov r6, r14
  45. movea lo(32767), r0, r10
  46. and r10, r14
  47. mov r7, r15
  48. and r10, r15
  49. shr 15, r6
  50. mov r6, r13
  51. and r10, r13
  52. shr 15, r7
  53. mov r7, r12
  54. and r10, r12
  55. shr 15, r6
  56. shr 15, r7
  57. mov r14, r10
  58. mulh r15, r10
  59. mov r14, r11
  60. mulh r12, r11
  61. mov r13, r16
  62. mulh r15, r16
  63. mulh r14, r7
  64. mulh r15, r6
  65. add r16, r11
  66. mulh r13, r12
  67. shl 15, r11
  68. add r11, r10
  69. add r12, r7
  70. add r6, r7
  71. shl 30, r7
  72. add r7, r10
  73. jmp [r31]
  74. #endif /* __v850__ */
  75. #if defined(__v850e__) || defined(__v850ea__) || defined(__v850e2__) || defined(__v850e2v3__) || defined(__v850e3v5__)
  76. /* This routine is almost unneccesarry because gcc
  77. generates the MUL instruction for the RTX mulsi3.
  78. But if someone wants to link his application with
  79. previsously compiled v850 objects then they will
  80. need this function. */
  81. /* It isn't good to put the inst sequence as below;
  82. mul r7, r6,
  83. mov r6, r10, r0
  84. In this case, there is a RAW hazard between them.
  85. MUL inst takes 2 cycle in EX stage, then MOV inst
  86. must wait 1cycle. */
  87. mov r7, r10
  88. mul r6, r10, r0
  89. jmp [r31]
  90. #endif /* __v850e__ */
  91. .size ___mulsi3,.-___mulsi3
  92. #endif /* L_mulsi3 */
  93. #ifdef L_udivsi3
  94. .text
  95. .global ___udivsi3
  96. .type ___udivsi3,@function
  97. ___udivsi3:
  98. #ifdef __v850__
  99. mov 1,r12
  100. mov 0,r10
  101. cmp r6,r7
  102. bnl .L12
  103. movhi hi(-2147483648),r0,r13
  104. cmp r0,r7
  105. blt .L12
  106. .L4:
  107. shl 1,r7
  108. shl 1,r12
  109. cmp r6,r7
  110. bnl .L12
  111. cmp r0,r12
  112. be .L8
  113. mov r7,r19
  114. and r13,r19
  115. be .L4
  116. br .L12
  117. .L9:
  118. cmp r7,r6
  119. bl .L10
  120. sub r7,r6
  121. or r12,r10
  122. .L10:
  123. shr 1,r12
  124. shr 1,r7
  125. .L12:
  126. cmp r0,r12
  127. bne .L9
  128. .L8:
  129. jmp [r31]
  130. #else /* defined(__v850e__) */
  131. /* See comments at end of __mulsi3. */
  132. mov r6, r10
  133. divu r7, r10, r0
  134. jmp [r31]
  135. #endif /* __v850e__ */
  136. .size ___udivsi3,.-___udivsi3
  137. #endif
  138. #ifdef L_divsi3
  139. .text
  140. .globl ___divsi3
  141. .type ___divsi3,@function
  142. ___divsi3:
  143. #ifdef __v850__
  144. add -8,sp
  145. st.w r31,4[sp]
  146. st.w r22,0[sp]
  147. mov 1,r22
  148. tst r7,r7
  149. bp .L3
  150. subr r0,r7
  151. subr r0,r22
  152. .L3:
  153. tst r6,r6
  154. bp .L4
  155. subr r0,r6
  156. subr r0,r22
  157. .L4:
  158. jarl ___udivsi3,r31
  159. cmp r0,r22
  160. bp .L7
  161. subr r0,r10
  162. .L7:
  163. ld.w 0[sp],r22
  164. ld.w 4[sp],r31
  165. add 8,sp
  166. jmp [r31]
  167. #else /* defined(__v850e__) */
  168. /* See comments at end of __mulsi3. */
  169. mov r6, r10
  170. div r7, r10, r0
  171. jmp [r31]
  172. #endif /* __v850e__ */
  173. .size ___divsi3,.-___divsi3
  174. #endif
  175. #ifdef L_umodsi3
  176. .text
  177. .globl ___umodsi3
  178. .type ___umodsi3,@function
  179. ___umodsi3:
  180. #ifdef __v850__
  181. add -12,sp
  182. st.w r31,8[sp]
  183. st.w r7,4[sp]
  184. st.w r6,0[sp]
  185. jarl ___udivsi3,r31
  186. ld.w 4[sp],r7
  187. mov r10,r6
  188. jarl ___mulsi3,r31
  189. ld.w 0[sp],r6
  190. subr r6,r10
  191. ld.w 8[sp],r31
  192. add 12,sp
  193. jmp [r31]
  194. #else /* defined(__v850e__) */
  195. /* See comments at end of __mulsi3. */
  196. divu r7, r6, r10
  197. jmp [r31]
  198. #endif /* __v850e__ */
  199. .size ___umodsi3,.-___umodsi3
  200. #endif /* L_umodsi3 */
  201. #ifdef L_modsi3
  202. .text
  203. .globl ___modsi3
  204. .type ___modsi3,@function
  205. ___modsi3:
  206. #ifdef __v850__
  207. add -12,sp
  208. st.w r31,8[sp]
  209. st.w r7,4[sp]
  210. st.w r6,0[sp]
  211. jarl ___divsi3,r31
  212. ld.w 4[sp],r7
  213. mov r10,r6
  214. jarl ___mulsi3,r31
  215. ld.w 0[sp],r6
  216. subr r6,r10
  217. ld.w 8[sp],r31
  218. add 12,sp
  219. jmp [r31]
  220. #else /* defined(__v850e__) */
  221. /* See comments at end of __mulsi3. */
  222. div r7, r6, r10
  223. jmp [r31]
  224. #endif /* __v850e__ */
  225. .size ___modsi3,.-___modsi3
  226. #endif /* L_modsi3 */
  227. #ifdef L_save_2
  228. .text
  229. .align 2
  230. .globl __save_r2_r29
  231. .type __save_r2_r29,@function
  232. /* Allocate space and save registers 2, 20 .. 29 on the stack. */
  233. /* Called via: jalr __save_r2_r29,r10. */
  234. __save_r2_r29:
  235. #ifdef __EP__
  236. mov ep,r1
  237. addi -44,sp,sp
  238. mov sp,ep
  239. sst.w r29,0[ep]
  240. sst.w r28,4[ep]
  241. sst.w r27,8[ep]
  242. sst.w r26,12[ep]
  243. sst.w r25,16[ep]
  244. sst.w r24,20[ep]
  245. sst.w r23,24[ep]
  246. sst.w r22,28[ep]
  247. sst.w r21,32[ep]
  248. sst.w r20,36[ep]
  249. sst.w r2,40[ep]
  250. mov r1,ep
  251. #else
  252. addi -44,sp,sp
  253. st.w r29,0[sp]
  254. st.w r28,4[sp]
  255. st.w r27,8[sp]
  256. st.w r26,12[sp]
  257. st.w r25,16[sp]
  258. st.w r24,20[sp]
  259. st.w r23,24[sp]
  260. st.w r22,28[sp]
  261. st.w r21,32[sp]
  262. st.w r20,36[sp]
  263. st.w r2,40[sp]
  264. #endif
  265. jmp [r10]
  266. .size __save_r2_r29,.-__save_r2_r29
  267. /* Restore saved registers, deallocate stack and return to the user. */
  268. /* Called via: jr __return_r2_r29. */
  269. .align 2
  270. .globl __return_r2_r29
  271. .type __return_r2_r29,@function
  272. __return_r2_r29:
  273. #ifdef __EP__
  274. mov ep,r1
  275. mov sp,ep
  276. sld.w 0[ep],r29
  277. sld.w 4[ep],r28
  278. sld.w 8[ep],r27
  279. sld.w 12[ep],r26
  280. sld.w 16[ep],r25
  281. sld.w 20[ep],r24
  282. sld.w 24[ep],r23
  283. sld.w 28[ep],r22
  284. sld.w 32[ep],r21
  285. sld.w 36[ep],r20
  286. sld.w 40[ep],r2
  287. addi 44,sp,sp
  288. mov r1,ep
  289. #else
  290. ld.w 0[sp],r29
  291. ld.w 4[sp],r28
  292. ld.w 8[sp],r27
  293. ld.w 12[sp],r26
  294. ld.w 16[sp],r25
  295. ld.w 20[sp],r24
  296. ld.w 24[sp],r23
  297. ld.w 28[sp],r22
  298. ld.w 32[sp],r21
  299. ld.w 36[sp],r20
  300. ld.w 40[sp],r2
  301. addi 44,sp,sp
  302. #endif
  303. jmp [r31]
  304. .size __return_r2_r29,.-__return_r2_r29
  305. #endif /* L_save_2 */
  306. #ifdef L_save_20
  307. .text
  308. .align 2
  309. .globl __save_r20_r29
  310. .type __save_r20_r29,@function
  311. /* Allocate space and save registers 20 .. 29 on the stack. */
  312. /* Called via: jalr __save_r20_r29,r10. */
  313. __save_r20_r29:
  314. #ifdef __EP__
  315. mov ep,r1
  316. addi -40,sp,sp
  317. mov sp,ep
  318. sst.w r29,0[ep]
  319. sst.w r28,4[ep]
  320. sst.w r27,8[ep]
  321. sst.w r26,12[ep]
  322. sst.w r25,16[ep]
  323. sst.w r24,20[ep]
  324. sst.w r23,24[ep]
  325. sst.w r22,28[ep]
  326. sst.w r21,32[ep]
  327. sst.w r20,36[ep]
  328. mov r1,ep
  329. #else
  330. addi -40,sp,sp
  331. st.w r29,0[sp]
  332. st.w r28,4[sp]
  333. st.w r27,8[sp]
  334. st.w r26,12[sp]
  335. st.w r25,16[sp]
  336. st.w r24,20[sp]
  337. st.w r23,24[sp]
  338. st.w r22,28[sp]
  339. st.w r21,32[sp]
  340. st.w r20,36[sp]
  341. #endif
  342. jmp [r10]
  343. .size __save_r20_r29,.-__save_r20_r29
  344. /* Restore saved registers, deallocate stack and return to the user. */
  345. /* Called via: jr __return_r20_r29. */
  346. .align 2
  347. .globl __return_r20_r29
  348. .type __return_r20_r29,@function
  349. __return_r20_r29:
  350. #ifdef __EP__
  351. mov ep,r1
  352. mov sp,ep
  353. sld.w 0[ep],r29
  354. sld.w 4[ep],r28
  355. sld.w 8[ep],r27
  356. sld.w 12[ep],r26
  357. sld.w 16[ep],r25
  358. sld.w 20[ep],r24
  359. sld.w 24[ep],r23
  360. sld.w 28[ep],r22
  361. sld.w 32[ep],r21
  362. sld.w 36[ep],r20
  363. addi 40,sp,sp
  364. mov r1,ep
  365. #else
  366. ld.w 0[sp],r29
  367. ld.w 4[sp],r28
  368. ld.w 8[sp],r27
  369. ld.w 12[sp],r26
  370. ld.w 16[sp],r25
  371. ld.w 20[sp],r24
  372. ld.w 24[sp],r23
  373. ld.w 28[sp],r22
  374. ld.w 32[sp],r21
  375. ld.w 36[sp],r20
  376. addi 40,sp,sp
  377. #endif
  378. jmp [r31]
  379. .size __return_r20_r29,.-__return_r20_r29
  380. #endif /* L_save_20 */
  381. #ifdef L_save_21
  382. .text
  383. .align 2
  384. .globl __save_r21_r29
  385. .type __save_r21_r29,@function
  386. /* Allocate space and save registers 21 .. 29 on the stack. */
  387. /* Called via: jalr __save_r21_r29,r10. */
  388. __save_r21_r29:
  389. #ifdef __EP__
  390. mov ep,r1
  391. addi -36,sp,sp
  392. mov sp,ep
  393. sst.w r29,0[ep]
  394. sst.w r28,4[ep]
  395. sst.w r27,8[ep]
  396. sst.w r26,12[ep]
  397. sst.w r25,16[ep]
  398. sst.w r24,20[ep]
  399. sst.w r23,24[ep]
  400. sst.w r22,28[ep]
  401. sst.w r21,32[ep]
  402. mov r1,ep
  403. #else
  404. addi -36,sp,sp
  405. st.w r29,0[sp]
  406. st.w r28,4[sp]
  407. st.w r27,8[sp]
  408. st.w r26,12[sp]
  409. st.w r25,16[sp]
  410. st.w r24,20[sp]
  411. st.w r23,24[sp]
  412. st.w r22,28[sp]
  413. st.w r21,32[sp]
  414. #endif
  415. jmp [r10]
  416. .size __save_r21_r29,.-__save_r21_r29
  417. /* Restore saved registers, deallocate stack and return to the user. */
  418. /* Called via: jr __return_r21_r29. */
  419. .align 2
  420. .globl __return_r21_r29
  421. .type __return_r21_r29,@function
  422. __return_r21_r29:
  423. #ifdef __EP__
  424. mov ep,r1
  425. mov sp,ep
  426. sld.w 0[ep],r29
  427. sld.w 4[ep],r28
  428. sld.w 8[ep],r27
  429. sld.w 12[ep],r26
  430. sld.w 16[ep],r25
  431. sld.w 20[ep],r24
  432. sld.w 24[ep],r23
  433. sld.w 28[ep],r22
  434. sld.w 32[ep],r21
  435. addi 36,sp,sp
  436. mov r1,ep
  437. #else
  438. ld.w 0[sp],r29
  439. ld.w 4[sp],r28
  440. ld.w 8[sp],r27
  441. ld.w 12[sp],r26
  442. ld.w 16[sp],r25
  443. ld.w 20[sp],r24
  444. ld.w 24[sp],r23
  445. ld.w 28[sp],r22
  446. ld.w 32[sp],r21
  447. addi 36,sp,sp
  448. #endif
  449. jmp [r31]
  450. .size __return_r21_r29,.-__return_r21_r29
  451. #endif /* L_save_21 */
  452. #ifdef L_save_22
  453. .text
  454. .align 2
  455. .globl __save_r22_r29
  456. .type __save_r22_r29,@function
  457. /* Allocate space and save registers 22 .. 29 on the stack. */
  458. /* Called via: jalr __save_r22_r29,r10. */
  459. __save_r22_r29:
  460. #ifdef __EP__
  461. mov ep,r1
  462. addi -32,sp,sp
  463. mov sp,ep
  464. sst.w r29,0[ep]
  465. sst.w r28,4[ep]
  466. sst.w r27,8[ep]
  467. sst.w r26,12[ep]
  468. sst.w r25,16[ep]
  469. sst.w r24,20[ep]
  470. sst.w r23,24[ep]
  471. sst.w r22,28[ep]
  472. mov r1,ep
  473. #else
  474. addi -32,sp,sp
  475. st.w r29,0[sp]
  476. st.w r28,4[sp]
  477. st.w r27,8[sp]
  478. st.w r26,12[sp]
  479. st.w r25,16[sp]
  480. st.w r24,20[sp]
  481. st.w r23,24[sp]
  482. st.w r22,28[sp]
  483. #endif
  484. jmp [r10]
  485. .size __save_r22_r29,.-__save_r22_r29
  486. /* Restore saved registers, deallocate stack and return to the user. */
  487. /* Called via: jr __return_r22_r29. */
  488. .align 2
  489. .globl __return_r22_r29
  490. .type __return_r22_r29,@function
  491. __return_r22_r29:
  492. #ifdef __EP__
  493. mov ep,r1
  494. mov sp,ep
  495. sld.w 0[ep],r29
  496. sld.w 4[ep],r28
  497. sld.w 8[ep],r27
  498. sld.w 12[ep],r26
  499. sld.w 16[ep],r25
  500. sld.w 20[ep],r24
  501. sld.w 24[ep],r23
  502. sld.w 28[ep],r22
  503. addi 32,sp,sp
  504. mov r1,ep
  505. #else
  506. ld.w 0[sp],r29
  507. ld.w 4[sp],r28
  508. ld.w 8[sp],r27
  509. ld.w 12[sp],r26
  510. ld.w 16[sp],r25
  511. ld.w 20[sp],r24
  512. ld.w 24[sp],r23
  513. ld.w 28[sp],r22
  514. addi 32,sp,sp
  515. #endif
  516. jmp [r31]
  517. .size __return_r22_r29,.-__return_r22_r29
  518. #endif /* L_save_22 */
  519. #ifdef L_save_23
  520. .text
  521. .align 2
  522. .globl __save_r23_r29
  523. .type __save_r23_r29,@function
  524. /* Allocate space and save registers 23 .. 29 on the stack. */
  525. /* Called via: jalr __save_r23_r29,r10. */
  526. __save_r23_r29:
  527. #ifdef __EP__
  528. mov ep,r1
  529. addi -28,sp,sp
  530. mov sp,ep
  531. sst.w r29,0[ep]
  532. sst.w r28,4[ep]
  533. sst.w r27,8[ep]
  534. sst.w r26,12[ep]
  535. sst.w r25,16[ep]
  536. sst.w r24,20[ep]
  537. sst.w r23,24[ep]
  538. mov r1,ep
  539. #else
  540. addi -28,sp,sp
  541. st.w r29,0[sp]
  542. st.w r28,4[sp]
  543. st.w r27,8[sp]
  544. st.w r26,12[sp]
  545. st.w r25,16[sp]
  546. st.w r24,20[sp]
  547. st.w r23,24[sp]
  548. #endif
  549. jmp [r10]
  550. .size __save_r23_r29,.-__save_r23_r29
  551. /* Restore saved registers, deallocate stack and return to the user. */
  552. /* Called via: jr __return_r23_r29. */
  553. .align 2
  554. .globl __return_r23_r29
  555. .type __return_r23_r29,@function
  556. __return_r23_r29:
  557. #ifdef __EP__
  558. mov ep,r1
  559. mov sp,ep
  560. sld.w 0[ep],r29
  561. sld.w 4[ep],r28
  562. sld.w 8[ep],r27
  563. sld.w 12[ep],r26
  564. sld.w 16[ep],r25
  565. sld.w 20[ep],r24
  566. sld.w 24[ep],r23
  567. addi 28,sp,sp
  568. mov r1,ep
  569. #else
  570. ld.w 0[sp],r29
  571. ld.w 4[sp],r28
  572. ld.w 8[sp],r27
  573. ld.w 12[sp],r26
  574. ld.w 16[sp],r25
  575. ld.w 20[sp],r24
  576. ld.w 24[sp],r23
  577. addi 28,sp,sp
  578. #endif
  579. jmp [r31]
  580. .size __return_r23_r29,.-__return_r23_r29
  581. #endif /* L_save_23 */
  582. #ifdef L_save_24
  583. .text
  584. .align 2
  585. .globl __save_r24_r29
  586. .type __save_r24_r29,@function
  587. /* Allocate space and save registers 24 .. 29 on the stack. */
  588. /* Called via: jalr __save_r24_r29,r10. */
  589. __save_r24_r29:
  590. #ifdef __EP__
  591. mov ep,r1
  592. addi -24,sp,sp
  593. mov sp,ep
  594. sst.w r29,0[ep]
  595. sst.w r28,4[ep]
  596. sst.w r27,8[ep]
  597. sst.w r26,12[ep]
  598. sst.w r25,16[ep]
  599. sst.w r24,20[ep]
  600. mov r1,ep
  601. #else
  602. addi -24,sp,sp
  603. st.w r29,0[sp]
  604. st.w r28,4[sp]
  605. st.w r27,8[sp]
  606. st.w r26,12[sp]
  607. st.w r25,16[sp]
  608. st.w r24,20[sp]
  609. #endif
  610. jmp [r10]
  611. .size __save_r24_r29,.-__save_r24_r29
  612. /* Restore saved registers, deallocate stack and return to the user. */
  613. /* Called via: jr __return_r24_r29. */
  614. .align 2
  615. .globl __return_r24_r29
  616. .type __return_r24_r29,@function
  617. __return_r24_r29:
  618. #ifdef __EP__
  619. mov ep,r1
  620. mov sp,ep
  621. sld.w 0[ep],r29
  622. sld.w 4[ep],r28
  623. sld.w 8[ep],r27
  624. sld.w 12[ep],r26
  625. sld.w 16[ep],r25
  626. sld.w 20[ep],r24
  627. addi 24,sp,sp
  628. mov r1,ep
  629. #else
  630. ld.w 0[sp],r29
  631. ld.w 4[sp],r28
  632. ld.w 8[sp],r27
  633. ld.w 12[sp],r26
  634. ld.w 16[sp],r25
  635. ld.w 20[sp],r24
  636. addi 24,sp,sp
  637. #endif
  638. jmp [r31]
  639. .size __return_r24_r29,.-__return_r24_r29
  640. #endif /* L_save_24 */
  641. #ifdef L_save_25
  642. .text
  643. .align 2
  644. .globl __save_r25_r29
  645. .type __save_r25_r29,@function
  646. /* Allocate space and save registers 25 .. 29 on the stack. */
  647. /* Called via: jalr __save_r25_r29,r10. */
  648. __save_r25_r29:
  649. #ifdef __EP__
  650. mov ep,r1
  651. addi -20,sp,sp
  652. mov sp,ep
  653. sst.w r29,0[ep]
  654. sst.w r28,4[ep]
  655. sst.w r27,8[ep]
  656. sst.w r26,12[ep]
  657. sst.w r25,16[ep]
  658. mov r1,ep
  659. #else
  660. addi -20,sp,sp
  661. st.w r29,0[sp]
  662. st.w r28,4[sp]
  663. st.w r27,8[sp]
  664. st.w r26,12[sp]
  665. st.w r25,16[sp]
  666. #endif
  667. jmp [r10]
  668. .size __save_r25_r29,.-__save_r25_r29
  669. /* Restore saved registers, deallocate stack and return to the user. */
  670. /* Called via: jr __return_r25_r29. */
  671. .align 2
  672. .globl __return_r25_r29
  673. .type __return_r25_r29,@function
  674. __return_r25_r29:
  675. #ifdef __EP__
  676. mov ep,r1
  677. mov sp,ep
  678. sld.w 0[ep],r29
  679. sld.w 4[ep],r28
  680. sld.w 8[ep],r27
  681. sld.w 12[ep],r26
  682. sld.w 16[ep],r25
  683. addi 20,sp,sp
  684. mov r1,ep
  685. #else
  686. ld.w 0[ep],r29
  687. ld.w 4[ep],r28
  688. ld.w 8[ep],r27
  689. ld.w 12[ep],r26
  690. ld.w 16[ep],r25
  691. addi 20,sp,sp
  692. #endif
  693. jmp [r31]
  694. .size __return_r25_r29,.-__return_r25_r29
  695. #endif /* L_save_25 */
  696. #ifdef L_save_26
  697. .text
  698. .align 2
  699. .globl __save_r26_r29
  700. .type __save_r26_r29,@function
  701. /* Allocate space and save registers 26 .. 29 on the stack. */
  702. /* Called via: jalr __save_r26_r29,r10. */
  703. __save_r26_r29:
  704. #ifdef __EP__
  705. mov ep,r1
  706. add -16,sp
  707. mov sp,ep
  708. sst.w r29,0[ep]
  709. sst.w r28,4[ep]
  710. sst.w r27,8[ep]
  711. sst.w r26,12[ep]
  712. mov r1,ep
  713. #else
  714. add -16,sp
  715. st.w r29,0[sp]
  716. st.w r28,4[sp]
  717. st.w r27,8[sp]
  718. st.w r26,12[sp]
  719. #endif
  720. jmp [r10]
  721. .size __save_r26_r29,.-__save_r26_r29
  722. /* Restore saved registers, deallocate stack and return to the user. */
  723. /* Called via: jr __return_r26_r29. */
  724. .align 2
  725. .globl __return_r26_r29
  726. .type __return_r26_r29,@function
  727. __return_r26_r29:
  728. #ifdef __EP__
  729. mov ep,r1
  730. mov sp,ep
  731. sld.w 0[ep],r29
  732. sld.w 4[ep],r28
  733. sld.w 8[ep],r27
  734. sld.w 12[ep],r26
  735. addi 16,sp,sp
  736. mov r1,ep
  737. #else
  738. ld.w 0[sp],r29
  739. ld.w 4[sp],r28
  740. ld.w 8[sp],r27
  741. ld.w 12[sp],r26
  742. addi 16,sp,sp
  743. #endif
  744. jmp [r31]
  745. .size __return_r26_r29,.-__return_r26_r29
  746. #endif /* L_save_26 */
  747. #ifdef L_save_27
  748. .text
  749. .align 2
  750. .globl __save_r27_r29
  751. .type __save_r27_r29,@function
  752. /* Allocate space and save registers 27 .. 29 on the stack. */
  753. /* Called via: jalr __save_r27_r29,r10. */
  754. __save_r27_r29:
  755. add -12,sp
  756. st.w r29,0[sp]
  757. st.w r28,4[sp]
  758. st.w r27,8[sp]
  759. jmp [r10]
  760. .size __save_r27_r29,.-__save_r27_r29
  761. /* Restore saved registers, deallocate stack and return to the user. */
  762. /* Called via: jr __return_r27_r29. */
  763. .align 2
  764. .globl __return_r27_r29
  765. .type __return_r27_r29,@function
  766. __return_r27_r29:
  767. ld.w 0[sp],r29
  768. ld.w 4[sp],r28
  769. ld.w 8[sp],r27
  770. add 12,sp
  771. jmp [r31]
  772. .size __return_r27_r29,.-__return_r27_r29
  773. #endif /* L_save_27 */
  774. #ifdef L_save_28
  775. .text
  776. .align 2
  777. .globl __save_r28_r29
  778. .type __save_r28_r29,@function
  779. /* Allocate space and save registers 28,29 on the stack. */
  780. /* Called via: jalr __save_r28_r29,r10. */
  781. __save_r28_r29:
  782. add -8,sp
  783. st.w r29,0[sp]
  784. st.w r28,4[sp]
  785. jmp [r10]
  786. .size __save_r28_r29,.-__save_r28_r29
  787. /* Restore saved registers, deallocate stack and return to the user. */
  788. /* Called via: jr __return_r28_r29. */
  789. .align 2
  790. .globl __return_r28_r29
  791. .type __return_r28_r29,@function
  792. __return_r28_r29:
  793. ld.w 0[sp],r29
  794. ld.w 4[sp],r28
  795. add 8,sp
  796. jmp [r31]
  797. .size __return_r28_r29,.-__return_r28_r29
  798. #endif /* L_save_28 */
  799. #ifdef L_save_29
  800. .text
  801. .align 2
  802. .globl __save_r29
  803. .type __save_r29,@function
  804. /* Allocate space and save register 29 on the stack. */
  805. /* Called via: jalr __save_r29,r10. */
  806. __save_r29:
  807. add -4,sp
  808. st.w r29,0[sp]
  809. jmp [r10]
  810. .size __save_r29,.-__save_r29
  811. /* Restore saved register 29, deallocate stack and return to the user. */
  812. /* Called via: jr __return_r29. */
  813. .align 2
  814. .globl __return_r29
  815. .type __return_r29,@function
  816. __return_r29:
  817. ld.w 0[sp],r29
  818. add 4,sp
  819. jmp [r31]
  820. .size __return_r29,.-__return_r29
  821. #endif /* L_save_28 */
  822. #ifdef L_save_2c
  823. .text
  824. .align 2
  825. .globl __save_r2_r31
  826. .type __save_r2_r31,@function
  827. /* Allocate space and save registers 20 .. 29, 31 on the stack. */
  828. /* Also allocate space for the argument save area. */
  829. /* Called via: jalr __save_r2_r31,r10. */
  830. __save_r2_r31:
  831. #ifdef __EP__
  832. mov ep,r1
  833. addi -48,sp,sp
  834. mov sp,ep
  835. sst.w r29,0[ep]
  836. sst.w r28,4[ep]
  837. sst.w r27,8[ep]
  838. sst.w r26,12[ep]
  839. sst.w r25,16[ep]
  840. sst.w r24,20[ep]
  841. sst.w r23,24[ep]
  842. sst.w r22,28[ep]
  843. sst.w r21,32[ep]
  844. sst.w r20,36[ep]
  845. sst.w r2,40[ep]
  846. sst.w r31,44[ep]
  847. mov r1,ep
  848. #else
  849. addi -48,sp,sp
  850. st.w r29,0[sp]
  851. st.w r28,4[sp]
  852. st.w r27,8[sp]
  853. st.w r26,12[sp]
  854. st.w r25,16[sp]
  855. st.w r24,20[sp]
  856. st.w r23,24[sp]
  857. st.w r22,28[sp]
  858. st.w r21,32[sp]
  859. st.w r20,36[sp]
  860. st.w r2,40[sp]
  861. st.w r31,44[sp]
  862. #endif
  863. jmp [r10]
  864. .size __save_r2_r31,.-__save_r2_r31
  865. /* Restore saved registers, deallocate stack and return to the user. */
  866. /* Called via: jr __return_r20_r31. */
  867. .align 2
  868. .globl __return_r2_r31
  869. .type __return_r2_r31,@function
  870. __return_r2_r31:
  871. #ifdef __EP__
  872. mov ep,r1
  873. mov sp,ep
  874. sld.w 0[ep],r29
  875. sld.w 4[ep],r28
  876. sld.w 8[ep],r27
  877. sld.w 12[ep],r26
  878. sld.w 16[ep],r25
  879. sld.w 20[ep],r24
  880. sld.w 24[ep],r23
  881. sld.w 28[ep],r22
  882. sld.w 32[ep],r21
  883. sld.w 36[ep],r20
  884. sld.w 40[ep],r2
  885. sld.w 44[ep],r31
  886. addi 48,sp,sp
  887. mov r1,ep
  888. #else
  889. ld.w 44[sp],r29
  890. ld.w 40[sp],r28
  891. ld.w 36[sp],r27
  892. ld.w 32[sp],r26
  893. ld.w 28[sp],r25
  894. ld.w 24[sp],r24
  895. ld.w 20[sp],r23
  896. ld.w 16[sp],r22
  897. ld.w 12[sp],r21
  898. ld.w 8[sp],r20
  899. ld.w 4[sp],r2
  900. ld.w 0[sp],r31
  901. addi 48,sp,sp
  902. #endif
  903. jmp [r31]
  904. .size __return_r2_r31,.-__return_r2_r31
  905. #endif /* L_save_2c */
  906. #ifdef L_save_20c
  907. .text
  908. .align 2
  909. .globl __save_r20_r31
  910. .type __save_r20_r31,@function
  911. /* Allocate space and save registers 20 .. 29, 31 on the stack. */
  912. /* Also allocate space for the argument save area. */
  913. /* Called via: jalr __save_r20_r31,r10. */
  914. __save_r20_r31:
  915. #ifdef __EP__
  916. mov ep,r1
  917. addi -44,sp,sp
  918. mov sp,ep
  919. sst.w r29,0[ep]
  920. sst.w r28,4[ep]
  921. sst.w r27,8[ep]
  922. sst.w r26,12[ep]
  923. sst.w r25,16[ep]
  924. sst.w r24,20[ep]
  925. sst.w r23,24[ep]
  926. sst.w r22,28[ep]
  927. sst.w r21,32[ep]
  928. sst.w r20,36[ep]
  929. sst.w r31,40[ep]
  930. mov r1,ep
  931. #else
  932. addi -44,sp,sp
  933. st.w r29,0[sp]
  934. st.w r28,4[sp]
  935. st.w r27,8[sp]
  936. st.w r26,12[sp]
  937. st.w r25,16[sp]
  938. st.w r24,20[sp]
  939. st.w r23,24[sp]
  940. st.w r22,28[sp]
  941. st.w r21,32[sp]
  942. st.w r20,36[sp]
  943. st.w r31,40[sp]
  944. #endif
  945. jmp [r10]
  946. .size __save_r20_r31,.-__save_r20_r31
  947. /* Restore saved registers, deallocate stack and return to the user. */
  948. /* Called via: jr __return_r20_r31. */
  949. .align 2
  950. .globl __return_r20_r31
  951. .type __return_r20_r31,@function
  952. __return_r20_r31:
  953. #ifdef __EP__
  954. mov ep,r1
  955. mov sp,ep
  956. sld.w 0[ep],r29
  957. sld.w 4[ep],r28
  958. sld.w 8[ep],r27
  959. sld.w 12[ep],r26
  960. sld.w 16[ep],r25
  961. sld.w 20[ep],r24
  962. sld.w 24[ep],r23
  963. sld.w 28[ep],r22
  964. sld.w 32[ep],r21
  965. sld.w 36[ep],r20
  966. sld.w 40[ep],r31
  967. addi 44,sp,sp
  968. mov r1,ep
  969. #else
  970. ld.w 0[sp],r29
  971. ld.w 4[sp],r28
  972. ld.w 8[sp],r27
  973. ld.w 12[sp],r26
  974. ld.w 16[sp],r25
  975. ld.w 20[sp],r24
  976. ld.w 24[sp],r23
  977. ld.w 28[sp],r22
  978. ld.w 32[sp],r21
  979. ld.w 36[sp],r20
  980. ld.w 40[sp],r31
  981. addi 44,sp,sp
  982. #endif
  983. jmp [r31]
  984. .size __return_r20_r31,.-__return_r20_r31
  985. #endif /* L_save_20c */
  986. #ifdef L_save_21c
  987. .text
  988. .align 2
  989. .globl __save_r21_r31
  990. .type __save_r21_r31,@function
  991. /* Allocate space and save registers 21 .. 29, 31 on the stack. */
  992. /* Also allocate space for the argument save area. */
  993. /* Called via: jalr __save_r21_r31,r10. */
  994. __save_r21_r31:
  995. #ifdef __EP__
  996. mov ep,r1
  997. addi -40,sp,sp
  998. mov sp,ep
  999. sst.w r29,0[ep]
  1000. sst.w r28,4[ep]
  1001. sst.w r27,8[ep]
  1002. sst.w r26,12[ep]
  1003. sst.w r25,16[ep]
  1004. sst.w r24,20[ep]
  1005. sst.w r23,24[ep]
  1006. sst.w r22,28[ep]
  1007. sst.w r21,32[ep]
  1008. sst.w r31,36[ep]
  1009. mov r1,ep
  1010. jmp [r10]
  1011. #else
  1012. addi -40,sp,sp
  1013. st.w r29,0[sp]
  1014. st.w r28,4[sp]
  1015. st.w r27,8[sp]
  1016. st.w r26,12[sp]
  1017. st.w r25,16[sp]
  1018. st.w r24,20[sp]
  1019. st.w r23,24[sp]
  1020. st.w r22,28[sp]
  1021. st.w r21,32[sp]
  1022. st.w r31,36[sp]
  1023. jmp [r10]
  1024. #endif
  1025. .size __save_r21_r31,.-__save_r21_r31
  1026. /* Restore saved registers, deallocate stack and return to the user. */
  1027. /* Called via: jr __return_r21_r31. */
  1028. .align 2
  1029. .globl __return_r21_r31
  1030. .type __return_r21_r31,@function
  1031. __return_r21_r31:
  1032. #ifdef __EP__
  1033. mov ep,r1
  1034. mov sp,ep
  1035. sld.w 0[ep],r29
  1036. sld.w 4[ep],r28
  1037. sld.w 8[ep],r27
  1038. sld.w 12[ep],r26
  1039. sld.w 16[ep],r25
  1040. sld.w 20[ep],r24
  1041. sld.w 24[ep],r23
  1042. sld.w 28[ep],r22
  1043. sld.w 32[ep],r21
  1044. sld.w 36[ep],r31
  1045. addi 40,sp,sp
  1046. mov r1,ep
  1047. #else
  1048. ld.w 0[sp],r29
  1049. ld.w 4[sp],r28
  1050. ld.w 8[sp],r27
  1051. ld.w 12[sp],r26
  1052. ld.w 16[sp],r25
  1053. ld.w 20[sp],r24
  1054. ld.w 24[sp],r23
  1055. ld.w 28[sp],r22
  1056. ld.w 32[sp],r21
  1057. ld.w 36[sp],r31
  1058. addi 40,sp,sp
  1059. #endif
  1060. jmp [r31]
  1061. .size __return_r21_r31,.-__return_r21_r31
  1062. #endif /* L_save_21c */
  1063. #ifdef L_save_22c
  1064. .text
  1065. .align 2
  1066. .globl __save_r22_r31
  1067. .type __save_r22_r31,@function
  1068. /* Allocate space and save registers 22 .. 29, 31 on the stack. */
  1069. /* Also allocate space for the argument save area. */
  1070. /* Called via: jalr __save_r22_r31,r10. */
  1071. __save_r22_r31:
  1072. #ifdef __EP__
  1073. mov ep,r1
  1074. addi -36,sp,sp
  1075. mov sp,ep
  1076. sst.w r29,0[ep]
  1077. sst.w r28,4[ep]
  1078. sst.w r27,8[ep]
  1079. sst.w r26,12[ep]
  1080. sst.w r25,16[ep]
  1081. sst.w r24,20[ep]
  1082. sst.w r23,24[ep]
  1083. sst.w r22,28[ep]
  1084. sst.w r31,32[ep]
  1085. mov r1,ep
  1086. #else
  1087. addi -36,sp,sp
  1088. st.w r29,0[sp]
  1089. st.w r28,4[sp]
  1090. st.w r27,8[sp]
  1091. st.w r26,12[sp]
  1092. st.w r25,16[sp]
  1093. st.w r24,20[sp]
  1094. st.w r23,24[sp]
  1095. st.w r22,28[sp]
  1096. st.w r31,32[sp]
  1097. #endif
  1098. jmp [r10]
  1099. .size __save_r22_r31,.-__save_r22_r31
  1100. /* Restore saved registers, deallocate stack and return to the user. */
  1101. /* Called via: jr __return_r22_r31. */
  1102. .align 2
  1103. .globl __return_r22_r31
  1104. .type __return_r22_r31,@function
  1105. __return_r22_r31:
  1106. #ifdef __EP__
  1107. mov ep,r1
  1108. mov sp,ep
  1109. sld.w 0[ep],r29
  1110. sld.w 4[ep],r28
  1111. sld.w 8[ep],r27
  1112. sld.w 12[ep],r26
  1113. sld.w 16[ep],r25
  1114. sld.w 20[ep],r24
  1115. sld.w 24[ep],r23
  1116. sld.w 28[ep],r22
  1117. sld.w 32[ep],r31
  1118. addi 36,sp,sp
  1119. mov r1,ep
  1120. #else
  1121. ld.w 0[sp],r29
  1122. ld.w 4[sp],r28
  1123. ld.w 8[sp],r27
  1124. ld.w 12[sp],r26
  1125. ld.w 16[sp],r25
  1126. ld.w 20[sp],r24
  1127. ld.w 24[sp],r23
  1128. ld.w 28[sp],r22
  1129. ld.w 32[sp],r31
  1130. addi 36,sp,sp
  1131. #endif
  1132. jmp [r31]
  1133. .size __return_r22_r31,.-__return_r22_r31
  1134. #endif /* L_save_22c */
  1135. #ifdef L_save_23c
  1136. .text
  1137. .align 2
  1138. .globl __save_r23_r31
  1139. .type __save_r23_r31,@function
  1140. /* Allocate space and save registers 23 .. 29, 31 on the stack. */
  1141. /* Also allocate space for the argument save area. */
  1142. /* Called via: jalr __save_r23_r31,r10. */
  1143. __save_r23_r31:
  1144. #ifdef __EP__
  1145. mov ep,r1
  1146. addi -32,sp,sp
  1147. mov sp,ep
  1148. sst.w r29,0[ep]
  1149. sst.w r28,4[ep]
  1150. sst.w r27,8[ep]
  1151. sst.w r26,12[ep]
  1152. sst.w r25,16[ep]
  1153. sst.w r24,20[ep]
  1154. sst.w r23,24[ep]
  1155. sst.w r31,28[ep]
  1156. mov r1,ep
  1157. #else
  1158. addi -32,sp,sp
  1159. st.w r29,0[sp]
  1160. st.w r28,4[sp]
  1161. st.w r27,8[sp]
  1162. st.w r26,12[sp]
  1163. st.w r25,16[sp]
  1164. st.w r24,20[sp]
  1165. st.w r23,24[sp]
  1166. st.w r31,28[sp]
  1167. #endif
  1168. jmp [r10]
  1169. .size __save_r23_r31,.-__save_r23_r31
  1170. /* Restore saved registers, deallocate stack and return to the user. */
  1171. /* Called via: jr __return_r23_r31. */
  1172. .align 2
  1173. .globl __return_r23_r31
  1174. .type __return_r23_r31,@function
  1175. __return_r23_r31:
  1176. #ifdef __EP__
  1177. mov ep,r1
  1178. mov sp,ep
  1179. sld.w 0[ep],r29
  1180. sld.w 4[ep],r28
  1181. sld.w 8[ep],r27
  1182. sld.w 12[ep],r26
  1183. sld.w 16[ep],r25
  1184. sld.w 20[ep],r24
  1185. sld.w 24[ep],r23
  1186. sld.w 28[ep],r31
  1187. addi 32,sp,sp
  1188. mov r1,ep
  1189. #else
  1190. ld.w 0[sp],r29
  1191. ld.w 4[sp],r28
  1192. ld.w 8[sp],r27
  1193. ld.w 12[sp],r26
  1194. ld.w 16[sp],r25
  1195. ld.w 20[sp],r24
  1196. ld.w 24[sp],r23
  1197. ld.w 28[sp],r31
  1198. addi 32,sp,sp
  1199. #endif
  1200. jmp [r31]
  1201. .size __return_r23_r31,.-__return_r23_r31
  1202. #endif /* L_save_23c */
  1203. #ifdef L_save_24c
  1204. .text
  1205. .align 2
  1206. .globl __save_r24_r31
  1207. .type __save_r24_r31,@function
  1208. /* Allocate space and save registers 24 .. 29, 31 on the stack. */
  1209. /* Also allocate space for the argument save area. */
  1210. /* Called via: jalr __save_r24_r31,r10. */
  1211. __save_r24_r31:
  1212. #ifdef __EP__
  1213. mov ep,r1
  1214. addi -28,sp,sp
  1215. mov sp,ep
  1216. sst.w r29,0[ep]
  1217. sst.w r28,4[ep]
  1218. sst.w r27,8[ep]
  1219. sst.w r26,12[ep]
  1220. sst.w r25,16[ep]
  1221. sst.w r24,20[ep]
  1222. sst.w r31,24[ep]
  1223. mov r1,ep
  1224. #else
  1225. addi -28,sp,sp
  1226. st.w r29,0[sp]
  1227. st.w r28,4[sp]
  1228. st.w r27,8[sp]
  1229. st.w r26,12[sp]
  1230. st.w r25,16[sp]
  1231. st.w r24,20[sp]
  1232. st.w r31,24[sp]
  1233. #endif
  1234. jmp [r10]
  1235. .size __save_r24_r31,.-__save_r24_r31
  1236. /* Restore saved registers, deallocate stack and return to the user. */
  1237. /* Called via: jr __return_r24_r31. */
  1238. .align 2
  1239. .globl __return_r24_r31
  1240. .type __return_r24_r31,@function
  1241. __return_r24_r31:
  1242. #ifdef __EP__
  1243. mov ep,r1
  1244. mov sp,ep
  1245. sld.w 0[ep],r29
  1246. sld.w 4[ep],r28
  1247. sld.w 8[ep],r27
  1248. sld.w 12[ep],r26
  1249. sld.w 16[ep],r25
  1250. sld.w 20[ep],r24
  1251. sld.w 24[ep],r31
  1252. addi 28,sp,sp
  1253. mov r1,ep
  1254. #else
  1255. ld.w 0[sp],r29
  1256. ld.w 4[sp],r28
  1257. ld.w 8[sp],r27
  1258. ld.w 12[sp],r26
  1259. ld.w 16[sp],r25
  1260. ld.w 20[sp],r24
  1261. ld.w 24[sp],r31
  1262. addi 28,sp,sp
  1263. #endif
  1264. jmp [r31]
  1265. .size __return_r24_r31,.-__return_r24_r31
  1266. #endif /* L_save_24c */
  1267. #ifdef L_save_25c
  1268. .text
  1269. .align 2
  1270. .globl __save_r25_r31
  1271. .type __save_r25_r31,@function
  1272. /* Allocate space and save registers 25 .. 29, 31 on the stack. */
  1273. /* Also allocate space for the argument save area. */
  1274. /* Called via: jalr __save_r25_r31,r10. */
  1275. __save_r25_r31:
  1276. #ifdef __EP__
  1277. mov ep,r1
  1278. addi -24,sp,sp
  1279. mov sp,ep
  1280. sst.w r29,0[ep]
  1281. sst.w r28,4[ep]
  1282. sst.w r27,8[ep]
  1283. sst.w r26,12[ep]
  1284. sst.w r25,16[ep]
  1285. sst.w r31,20[ep]
  1286. mov r1,ep
  1287. #else
  1288. addi -24,sp,sp
  1289. st.w r29,0[sp]
  1290. st.w r28,4[sp]
  1291. st.w r27,8[sp]
  1292. st.w r26,12[sp]
  1293. st.w r25,16[sp]
  1294. st.w r31,20[sp]
  1295. #endif
  1296. jmp [r10]
  1297. .size __save_r25_r31,.-__save_r25_r31
  1298. /* Restore saved registers, deallocate stack and return to the user. */
  1299. /* Called via: jr __return_r25_r31. */
  1300. .align 2
  1301. .globl __return_r25_r31
  1302. .type __return_r25_r31,@function
  1303. __return_r25_r31:
  1304. #ifdef __EP__
  1305. mov ep,r1
  1306. mov sp,ep
  1307. sld.w 0[ep],r29
  1308. sld.w 4[ep],r28
  1309. sld.w 8[ep],r27
  1310. sld.w 12[ep],r26
  1311. sld.w 16[ep],r25
  1312. sld.w 20[ep],r31
  1313. addi 24,sp,sp
  1314. mov r1,ep
  1315. #else
  1316. ld.w 0[sp],r29
  1317. ld.w 4[sp],r28
  1318. ld.w 8[sp],r27
  1319. ld.w 12[sp],r26
  1320. ld.w 16[sp],r25
  1321. ld.w 20[sp],r31
  1322. addi 24,sp,sp
  1323. #endif
  1324. jmp [r31]
  1325. .size __return_r25_r31,.-__return_r25_r31
  1326. #endif /* L_save_25c */
  1327. #ifdef L_save_26c
  1328. .text
  1329. .align 2
  1330. .globl __save_r26_r31
  1331. .type __save_r26_r31,@function
  1332. /* Allocate space and save registers 26 .. 29, 31 on the stack. */
  1333. /* Also allocate space for the argument save area. */
  1334. /* Called via: jalr __save_r26_r31,r10. */
  1335. __save_r26_r31:
  1336. #ifdef __EP__
  1337. mov ep,r1
  1338. addi -20,sp,sp
  1339. mov sp,ep
  1340. sst.w r29,0[ep]
  1341. sst.w r28,4[ep]
  1342. sst.w r27,8[ep]
  1343. sst.w r26,12[ep]
  1344. sst.w r31,16[ep]
  1345. mov r1,ep
  1346. #else
  1347. addi -20,sp,sp
  1348. st.w r29,0[sp]
  1349. st.w r28,4[sp]
  1350. st.w r27,8[sp]
  1351. st.w r26,12[sp]
  1352. st.w r31,16[sp]
  1353. #endif
  1354. jmp [r10]
  1355. .size __save_r26_r31,.-__save_r26_r31
  1356. /* Restore saved registers, deallocate stack and return to the user. */
  1357. /* Called via: jr __return_r26_r31. */
  1358. .align 2
  1359. .globl __return_r26_r31
  1360. .type __return_r26_r31,@function
  1361. __return_r26_r31:
  1362. #ifdef __EP__
  1363. mov ep,r1
  1364. mov sp,ep
  1365. sld.w 0[ep],r29
  1366. sld.w 4[ep],r28
  1367. sld.w 8[ep],r27
  1368. sld.w 12[ep],r26
  1369. sld.w 16[ep],r31
  1370. addi 20,sp,sp
  1371. mov r1,ep
  1372. #else
  1373. ld.w 0[sp],r29
  1374. ld.w 4[sp],r28
  1375. ld.w 8[sp],r27
  1376. ld.w 12[sp],r26
  1377. ld.w 16[sp],r31
  1378. addi 20,sp,sp
  1379. #endif
  1380. jmp [r31]
  1381. .size __return_r26_r31,.-__return_r26_r31
  1382. #endif /* L_save_26c */
  1383. #ifdef L_save_27c
  1384. .text
  1385. .align 2
  1386. .globl __save_r27_r31
  1387. .type __save_r27_r31,@function
  1388. /* Allocate space and save registers 27 .. 29, 31 on the stack. */
  1389. /* Also allocate space for the argument save area. */
  1390. /* Called via: jalr __save_r27_r31,r10. */
  1391. __save_r27_r31:
  1392. #ifdef __EP__
  1393. mov ep,r1
  1394. addi -16,sp,sp
  1395. mov sp,ep
  1396. sst.w r29,0[ep]
  1397. sst.w r28,4[ep]
  1398. sst.w r27,8[ep]
  1399. sst.w r31,12[ep]
  1400. mov r1,ep
  1401. #else
  1402. addi -16,sp,sp
  1403. st.w r29,0[sp]
  1404. st.w r28,4[sp]
  1405. st.w r27,8[sp]
  1406. st.w r31,12[sp]
  1407. #endif
  1408. jmp [r10]
  1409. .size __save_r27_r31,.-__save_r27_r31
  1410. /* Restore saved registers, deallocate stack and return to the user. */
  1411. /* Called via: jr __return_r27_r31. */
  1412. .align 2
  1413. .globl __return_r27_r31
  1414. .type __return_r27_r31,@function
  1415. __return_r27_r31:
  1416. #ifdef __EP__
  1417. mov ep,r1
  1418. mov sp,ep
  1419. sld.w 0[ep],r29
  1420. sld.w 4[ep],r28
  1421. sld.w 8[ep],r27
  1422. sld.w 12[ep],r31
  1423. addi 16,sp,sp
  1424. mov r1,ep
  1425. #else
  1426. ld.w 0[sp],r29
  1427. ld.w 4[sp],r28
  1428. ld.w 8[sp],r27
  1429. ld.w 12[sp],r31
  1430. addi 16,sp,sp
  1431. #endif
  1432. jmp [r31]
  1433. .size __return_r27_r31,.-__return_r27_r31
  1434. #endif /* L_save_27c */
  1435. #ifdef L_save_28c
  1436. .text
  1437. .align 2
  1438. .globl __save_r28_r31
  1439. .type __save_r28_r31,@function
  1440. /* Allocate space and save registers 28 .. 29, 31 on the stack. */
  1441. /* Also allocate space for the argument save area. */
  1442. /* Called via: jalr __save_r28_r31,r10. */
  1443. __save_r28_r31:
  1444. addi -12,sp,sp
  1445. st.w r29,0[sp]
  1446. st.w r28,4[sp]
  1447. st.w r31,8[sp]
  1448. jmp [r10]
  1449. .size __save_r28_r31,.-__save_r28_r31
  1450. /* Restore saved registers, deallocate stack and return to the user. */
  1451. /* Called via: jr __return_r28_r31. */
  1452. .align 2
  1453. .globl __return_r28_r31
  1454. .type __return_r28_r31,@function
  1455. __return_r28_r31:
  1456. ld.w 0[sp],r29
  1457. ld.w 4[sp],r28
  1458. ld.w 8[sp],r31
  1459. addi 12,sp,sp
  1460. jmp [r31]
  1461. .size __return_r28_r31,.-__return_r28_r31
  1462. #endif /* L_save_28c */
  1463. #ifdef L_save_29c
  1464. .text
  1465. .align 2
  1466. .globl __save_r29_r31
  1467. .type __save_r29_r31,@function
  1468. /* Allocate space and save registers 29 & 31 on the stack. */
  1469. /* Also allocate space for the argument save area. */
  1470. /* Called via: jalr __save_r29_r31,r10. */
  1471. __save_r29_r31:
  1472. addi -8,sp,sp
  1473. st.w r29,0[sp]
  1474. st.w r31,4[sp]
  1475. jmp [r10]
  1476. .size __save_r29_r31,.-__save_r29_r31
  1477. /* Restore saved registers, deallocate stack and return to the user. */
  1478. /* Called via: jr __return_r29_r31. */
  1479. .align 2
  1480. .globl __return_r29_r31
  1481. .type __return_r29_r31,@function
  1482. __return_r29_r31:
  1483. ld.w 0[sp],r29
  1484. ld.w 4[sp],r31
  1485. addi 8,sp,sp
  1486. jmp [r31]
  1487. .size __return_r29_r31,.-__return_r29_r31
  1488. #endif /* L_save_29c */
  1489. #ifdef L_save_31c
  1490. .text
  1491. .align 2
  1492. .globl __save_r31
  1493. .type __save_r31,@function
  1494. /* Allocate space and save register 31 on the stack. */
  1495. /* Also allocate space for the argument save area. */
  1496. /* Called via: jalr __save_r31,r10. */
  1497. __save_r31:
  1498. addi -4,sp,sp
  1499. st.w r31,0[sp]
  1500. jmp [r10]
  1501. .size __save_r31,.-__save_r31
  1502. /* Restore saved registers, deallocate stack and return to the user. */
  1503. /* Called via: jr __return_r31. */
  1504. .align 2
  1505. .globl __return_r31
  1506. .type __return_r31,@function
  1507. __return_r31:
  1508. ld.w 0[sp],r31
  1509. addi 4,sp,sp
  1510. jmp [r31]
  1511. .size __return_r31,.-__return_r31
  1512. #endif /* L_save_31c */
  1513. #ifdef L_save_interrupt
  1514. .text
  1515. .align 2
  1516. .globl __save_interrupt
  1517. .type __save_interrupt,@function
  1518. /* Save registers r1, r4 on stack and load up with expected values. */
  1519. /* Note, 20 bytes of stack have already been allocated. */
  1520. /* Called via: jalr __save_interrupt,r10. */
  1521. __save_interrupt:
  1522. /* add -20,sp ; st.w r11,16[sp] ; st.w r10,12[sp] ; */
  1523. st.w ep,0[sp]
  1524. st.w gp,4[sp]
  1525. st.w r1,8[sp]
  1526. movhi hi(__ep),r0,ep
  1527. movea lo(__ep),ep,ep
  1528. movhi hi(__gp),r0,gp
  1529. movea lo(__gp),gp,gp
  1530. jmp [r10]
  1531. .size __save_interrupt,.-__save_interrupt
  1532. /* Restore saved registers, deallocate stack and return from the interrupt. */
  1533. /* Called via: jr __return_interrupt. */
  1534. .align 2
  1535. .globl __return_interrupt
  1536. .type __return_interrupt,@function
  1537. __return_interrupt:
  1538. ld.w 0[sp],ep
  1539. ld.w 4[sp],gp
  1540. ld.w 8[sp],r1
  1541. ld.w 12[sp],r10
  1542. ld.w 16[sp],r11
  1543. addi 20,sp,sp
  1544. reti
  1545. .size __return_interrupt,.-__return_interrupt
  1546. #endif /* L_save_interrupt */
  1547. #ifdef L_save_all_interrupt
  1548. .text
  1549. .align 2
  1550. .globl __save_all_interrupt
  1551. .type __save_all_interrupt,@function
  1552. /* Save all registers except for those saved in __save_interrupt. */
  1553. /* Allocate enough stack for all of the registers & 16 bytes of space. */
  1554. /* Called via: jalr __save_all_interrupt,r10. */
  1555. __save_all_interrupt:
  1556. addi -104,sp,sp
  1557. #ifdef __EP__
  1558. mov ep,r1
  1559. mov sp,ep
  1560. sst.w r31,100[ep]
  1561. sst.w r2,96[ep]
  1562. sst.w gp,92[ep]
  1563. sst.w r6,88[ep]
  1564. sst.w r7,84[ep]
  1565. sst.w r8,80[ep]
  1566. sst.w r9,76[ep]
  1567. sst.w r11,72[ep]
  1568. sst.w r12,68[ep]
  1569. sst.w r13,64[ep]
  1570. sst.w r14,60[ep]
  1571. sst.w r15,56[ep]
  1572. sst.w r16,52[ep]
  1573. sst.w r17,48[ep]
  1574. sst.w r18,44[ep]
  1575. sst.w r19,40[ep]
  1576. sst.w r20,36[ep]
  1577. sst.w r21,32[ep]
  1578. sst.w r22,28[ep]
  1579. sst.w r23,24[ep]
  1580. sst.w r24,20[ep]
  1581. sst.w r25,16[ep]
  1582. sst.w r26,12[ep]
  1583. sst.w r27,8[ep]
  1584. sst.w r28,4[ep]
  1585. sst.w r29,0[ep]
  1586. mov r1,ep
  1587. #else
  1588. st.w r31,100[sp]
  1589. st.w r2,96[sp]
  1590. st.w gp,92[sp]
  1591. st.w r6,88[sp]
  1592. st.w r7,84[sp]
  1593. st.w r8,80[sp]
  1594. st.w r9,76[sp]
  1595. st.w r11,72[sp]
  1596. st.w r12,68[sp]
  1597. st.w r13,64[sp]
  1598. st.w r14,60[sp]
  1599. st.w r15,56[sp]
  1600. st.w r16,52[sp]
  1601. st.w r17,48[sp]
  1602. st.w r18,44[sp]
  1603. st.w r19,40[sp]
  1604. st.w r20,36[sp]
  1605. st.w r21,32[sp]
  1606. st.w r22,28[sp]
  1607. st.w r23,24[sp]
  1608. st.w r24,20[sp]
  1609. st.w r25,16[sp]
  1610. st.w r26,12[sp]
  1611. st.w r27,8[sp]
  1612. st.w r28,4[sp]
  1613. st.w r29,0[sp]
  1614. #endif
  1615. jmp [r10]
  1616. .size __save_all_interrupt,.-__save_all_interrupt
  1617. .globl __restore_all_interrupt
  1618. .type __restore_all_interrupt,@function
  1619. /* Restore all registers saved in __save_all_interrupt and
  1620. deallocate the stack space. */
  1621. /* Called via: jalr __restore_all_interrupt,r10. */
  1622. __restore_all_interrupt:
  1623. #ifdef __EP__
  1624. mov ep,r1
  1625. mov sp,ep
  1626. sld.w 100[ep],r31
  1627. sld.w 96[ep],r2
  1628. sld.w 92[ep],gp
  1629. sld.w 88[ep],r6
  1630. sld.w 84[ep],r7
  1631. sld.w 80[ep],r8
  1632. sld.w 76[ep],r9
  1633. sld.w 72[ep],r11
  1634. sld.w 68[ep],r12
  1635. sld.w 64[ep],r13
  1636. sld.w 60[ep],r14
  1637. sld.w 56[ep],r15
  1638. sld.w 52[ep],r16
  1639. sld.w 48[ep],r17
  1640. sld.w 44[ep],r18
  1641. sld.w 40[ep],r19
  1642. sld.w 36[ep],r20
  1643. sld.w 32[ep],r21
  1644. sld.w 28[ep],r22
  1645. sld.w 24[ep],r23
  1646. sld.w 20[ep],r24
  1647. sld.w 16[ep],r25
  1648. sld.w 12[ep],r26
  1649. sld.w 8[ep],r27
  1650. sld.w 4[ep],r28
  1651. sld.w 0[ep],r29
  1652. mov r1,ep
  1653. #else
  1654. ld.w 100[sp],r31
  1655. ld.w 96[sp],r2
  1656. ld.w 92[sp],gp
  1657. ld.w 88[sp],r6
  1658. ld.w 84[sp],r7
  1659. ld.w 80[sp],r8
  1660. ld.w 76[sp],r9
  1661. ld.w 72[sp],r11
  1662. ld.w 68[sp],r12
  1663. ld.w 64[sp],r13
  1664. ld.w 60[sp],r14
  1665. ld.w 56[sp],r15
  1666. ld.w 52[sp],r16
  1667. ld.w 48[sp],r17
  1668. ld.w 44[sp],r18
  1669. ld.w 40[sp],r19
  1670. ld.w 36[sp],r20
  1671. ld.w 32[sp],r21
  1672. ld.w 28[sp],r22
  1673. ld.w 24[sp],r23
  1674. ld.w 20[sp],r24
  1675. ld.w 16[sp],r25
  1676. ld.w 12[sp],r26
  1677. ld.w 8[sp],r27
  1678. ld.w 4[sp],r28
  1679. ld.w 0[sp],r29
  1680. #endif
  1681. addi 104,sp,sp
  1682. jmp [r10]
  1683. .size __restore_all_interrupt,.-__restore_all_interrupt
  1684. #endif /* L_save_all_interrupt */
  1685. #if defined __V850_CALLT__
  1686. #if defined(__v850e__) || defined(__v850e1__) || defined(__v850e2__) || defined(__v850e2v3__) || defined(__v850e3v5__)
  1687. #ifdef L_callt_save_r2_r29
  1688. /* Put these functions into the call table area. */
  1689. .call_table_text
  1690. /* Allocate space and save registers 2, 20 .. 29 on the stack. */
  1691. /* Called via: callt ctoff(__callt_save_r2_r29). */
  1692. .align 2
  1693. .L_save_r2_r29:
  1694. add -4, sp
  1695. st.w r2, 0[sp]
  1696. prepare {r20 - r29}, 0
  1697. ctret
  1698. /* Restore saved registers, deallocate stack and return to the user. */
  1699. /* Called via: callt ctoff(__callt_return_r2_r29). */
  1700. .align 2
  1701. .L_return_r2_r29:
  1702. dispose 0, {r20-r29}
  1703. ld.w 0[sp], r2
  1704. add 4, sp
  1705. jmp [r31]
  1706. /* Place the offsets of the start of these routines into the call table. */
  1707. .call_table_data
  1708. .global __callt_save_r2_r29
  1709. .type __callt_save_r2_r29,@function
  1710. __callt_save_r2_r29: .short ctoff(.L_save_r2_r29)
  1711. .global __callt_return_r2_r29
  1712. .type __callt_return_r2_r29,@function
  1713. __callt_return_r2_r29: .short ctoff(.L_return_r2_r29)
  1714. #endif /* L_callt_save_r2_r29. */
  1715. #ifdef L_callt_save_r2_r31
  1716. /* Put these functions into the call table area. */
  1717. .call_table_text
  1718. /* Allocate space and save registers 2 and 20 .. 29, 31 on the stack. */
  1719. /* Also allocate space for the argument save area. */
  1720. /* Called via: callt ctoff(__callt_save_r2_r31). */
  1721. .align 2
  1722. .L_save_r2_r31:
  1723. add -4, sp
  1724. st.w r2, 0[sp]
  1725. prepare {r20 - r29, r31}, 0
  1726. ctret
  1727. /* Restore saved registers, deallocate stack and return to the user. */
  1728. /* Called via: callt ctoff(__callt_return_r2_r31). */
  1729. .align 2
  1730. .L_return_r2_r31:
  1731. dispose 0, {r20 - r29, r31}
  1732. ld.w 0[sp], r2
  1733. addi 4, sp, sp
  1734. jmp [r31]
  1735. /* Place the offsets of the start of these routines into the call table. */
  1736. .call_table_data
  1737. .global __callt_save_r2_r31
  1738. .type __callt_save_r2_r31,@function
  1739. __callt_save_r2_r31: .short ctoff(.L_save_r2_r31)
  1740. .global __callt_return_r2_r31
  1741. .type __callt_return_r2_r31,@function
  1742. __callt_return_r2_r31: .short ctoff(.L_return_r2_r31)
  1743. #endif /* L_callt_save_r2_r31 */
  1744. #ifdef L_callt_save_interrupt
  1745. /* Put these functions into the call table area. */
  1746. .call_table_text
  1747. /* Save registers r1, ep, gp, r10 on stack and load up with expected values. */
  1748. /* Called via: callt ctoff(__callt_save_interrupt). */
  1749. .align 2
  1750. .L_save_interrupt:
  1751. /* SP has already been moved before callt ctoff(_save_interrupt). */
  1752. /* R1,R10,R11,ctpc,ctpsw has alread been saved bofore callt ctoff(_save_interrupt). */
  1753. /* addi -28, sp, sp */
  1754. /* st.w r1, 24[sp] */
  1755. /* st.w r10, 12[sp] */
  1756. /* st.w r11, 16[sp] */
  1757. /* stsr ctpc, r10 */
  1758. /* st.w r10, 20[sp] */
  1759. /* stsr ctpsw, r10 */
  1760. /* st.w r10, 24[sp] */
  1761. st.w ep, 0[sp]
  1762. st.w gp, 4[sp]
  1763. st.w r1, 8[sp]
  1764. mov hilo(__ep),ep
  1765. mov hilo(__gp),gp
  1766. ctret
  1767. .call_table_text
  1768. /* Restore saved registers, deallocate stack and return from the interrupt. */
  1769. /* Called via: callt ctoff(__callt_restore_interrupt). */
  1770. .align 2
  1771. .globl __return_interrupt
  1772. .type __return_interrupt,@function
  1773. .L_return_interrupt:
  1774. ld.w 24[sp], r1
  1775. ldsr r1, ctpsw
  1776. ld.w 20[sp], r1
  1777. ldsr r1, ctpc
  1778. ld.w 16[sp], r11
  1779. ld.w 12[sp], r10
  1780. ld.w 8[sp], r1
  1781. ld.w 4[sp], gp
  1782. ld.w 0[sp], ep
  1783. addi 28, sp, sp
  1784. reti
  1785. /* Place the offsets of the start of these routines into the call table. */
  1786. .call_table_data
  1787. .global __callt_save_interrupt
  1788. .type __callt_save_interrupt,@function
  1789. __callt_save_interrupt: .short ctoff(.L_save_interrupt)
  1790. .global __callt_return_interrupt
  1791. .type __callt_return_interrupt,@function
  1792. __callt_return_interrupt: .short ctoff(.L_return_interrupt)
  1793. #endif /* L_callt_save_interrupt */
  1794. #ifdef L_callt_save_all_interrupt
  1795. /* Put these functions into the call table area. */
  1796. .call_table_text
  1797. /* Save all registers except for those saved in __save_interrupt. */
  1798. /* Allocate enough stack for all of the registers & 16 bytes of space. */
  1799. /* Called via: callt ctoff(__callt_save_all_interrupt). */
  1800. .align 2
  1801. .L_save_all_interrupt:
  1802. addi -60, sp, sp
  1803. #ifdef __EP__
  1804. mov ep, r1
  1805. mov sp, ep
  1806. sst.w r2, 56[ep]
  1807. sst.w r5, 52[ep]
  1808. sst.w r6, 48[ep]
  1809. sst.w r7, 44[ep]
  1810. sst.w r8, 40[ep]
  1811. sst.w r9, 36[ep]
  1812. sst.w r11, 32[ep]
  1813. sst.w r12, 28[ep]
  1814. sst.w r13, 24[ep]
  1815. sst.w r14, 20[ep]
  1816. sst.w r15, 16[ep]
  1817. sst.w r16, 12[ep]
  1818. sst.w r17, 8[ep]
  1819. sst.w r18, 4[ep]
  1820. sst.w r19, 0[ep]
  1821. mov r1, ep
  1822. #else
  1823. st.w r2, 56[sp]
  1824. st.w r5, 52[sp]
  1825. st.w r6, 48[sp]
  1826. st.w r7, 44[sp]
  1827. st.w r8, 40[sp]
  1828. st.w r9, 36[sp]
  1829. st.w r11, 32[sp]
  1830. st.w r12, 28[sp]
  1831. st.w r13, 24[sp]
  1832. st.w r14, 20[sp]
  1833. st.w r15, 16[sp]
  1834. st.w r16, 12[sp]
  1835. st.w r17, 8[sp]
  1836. st.w r18, 4[sp]
  1837. st.w r19, 0[sp]
  1838. #endif
  1839. prepare {r20 - r29, r31}, 0
  1840. ctret
  1841. /* Restore all registers saved in __save_all_interrupt
  1842. deallocate the stack space. */
  1843. /* Called via: callt ctoff(__callt_restore_all_interrupt). */
  1844. .align 2
  1845. .L_restore_all_interrupt:
  1846. dispose 0, {r20 - r29, r31}
  1847. #ifdef __EP__
  1848. mov ep, r1
  1849. mov sp, ep
  1850. sld.w 0 [ep], r19
  1851. sld.w 4 [ep], r18
  1852. sld.w 8 [ep], r17
  1853. sld.w 12[ep], r16
  1854. sld.w 16[ep], r15
  1855. sld.w 20[ep], r14
  1856. sld.w 24[ep], r13
  1857. sld.w 28[ep], r12
  1858. sld.w 32[ep], r11
  1859. sld.w 36[ep], r9
  1860. sld.w 40[ep], r8
  1861. sld.w 44[ep], r7
  1862. sld.w 48[ep], r6
  1863. sld.w 52[ep], r5
  1864. sld.w 56[ep], r2
  1865. mov r1, ep
  1866. #else
  1867. ld.w 0 [sp], r19
  1868. ld.w 4 [sp], r18
  1869. ld.w 8 [sp], r17
  1870. ld.w 12[sp], r16
  1871. ld.w 16[sp], r15
  1872. ld.w 20[sp], r14
  1873. ld.w 24[sp], r13
  1874. ld.w 28[sp], r12
  1875. ld.w 32[sp], r11
  1876. ld.w 36[sp], r9
  1877. ld.w 40[sp], r8
  1878. ld.w 44[sp], r7
  1879. ld.w 48[sp], r6
  1880. ld.w 52[sp], r5
  1881. ld.w 56[sp], r2
  1882. #endif
  1883. addi 60, sp, sp
  1884. ctret
  1885. /* Place the offsets of the start of these routines into the call table. */
  1886. .call_table_data
  1887. .global __callt_save_all_interrupt
  1888. .type __callt_save_all_interrupt,@function
  1889. __callt_save_all_interrupt: .short ctoff(.L_save_all_interrupt)
  1890. .global __callt_restore_all_interrupt
  1891. .type __callt_restore_all_interrupt,@function
  1892. __callt_restore_all_interrupt: .short ctoff(.L_restore_all_interrupt)
  1893. #endif /* L_callt_save_all_interrupt */
  1894. #define MAKE_CALLT_FUNCS( START ) \
  1895. .call_table_text ;\
  1896. .align 2 ;\
  1897. /* Allocate space and save registers START .. r29 on the stack. */ ;\
  1898. /* Called via: callt ctoff(__callt_save_START_r29). */ ;\
  1899. .L_save_##START##_r29: ;\
  1900. prepare { START - r29 }, 0 ;\
  1901. ctret ;\
  1902. ;\
  1903. /* Restore saved registers, deallocate stack and return. */ ;\
  1904. /* Called via: callt ctoff(__return_START_r29). */ ;\
  1905. .align 2 ;\
  1906. .L_return_##START##_r29: ;\
  1907. dispose 0, { START - r29 }, r31 ;\
  1908. ;\
  1909. /* Place the offsets of the start of these funcs into the call table. */;\
  1910. .call_table_data ;\
  1911. ;\
  1912. .global __callt_save_##START##_r29 ;\
  1913. .type __callt_save_##START##_r29,@function ;\
  1914. __callt_save_##START##_r29: .short ctoff(.L_save_##START##_r29 ) ;\
  1915. ;\
  1916. .global __callt_return_##START##_r29 ;\
  1917. .type __callt_return_##START##_r29,@function ;\
  1918. __callt_return_##START##_r29: .short ctoff(.L_return_##START##_r29 )
  1919. #define MAKE_CALLT_CFUNCS( START ) \
  1920. .call_table_text ;\
  1921. .align 2 ;\
  1922. /* Allocate space and save registers START .. r31 on the stack. */ ;\
  1923. /* Called via: callt ctoff(__callt_save_START_r31c). */ ;\
  1924. .L_save_##START##_r31c: ;\
  1925. prepare { START - r29, r31}, 0 ;\
  1926. ctret ;\
  1927. ;\
  1928. /* Restore saved registers, deallocate stack and return. */ ;\
  1929. /* Called via: callt ctoff(__return_START_r31c). */ ;\
  1930. .align 2 ;\
  1931. .L_return_##START##_r31c: ;\
  1932. dispose 0, { START - r29, r31}, r31 ;\
  1933. ;\
  1934. /* Place the offsets of the start of these funcs into the call table. */;\
  1935. .call_table_data ;\
  1936. ;\
  1937. .global __callt_save_##START##_r31c ;\
  1938. .type __callt_save_##START##_r31c,@function ;\
  1939. __callt_save_##START##_r31c: .short ctoff(.L_save_##START##_r31c ) ;\
  1940. ;\
  1941. .global __callt_return_##START##_r31c ;\
  1942. .type __callt_return_##START##_r31c,@function ;\
  1943. __callt_return_##START##_r31c: .short ctoff(.L_return_##START##_r31c )
  1944. #ifdef L_callt_save_20
  1945. MAKE_CALLT_FUNCS (r20)
  1946. #endif
  1947. #ifdef L_callt_save_21
  1948. MAKE_CALLT_FUNCS (r21)
  1949. #endif
  1950. #ifdef L_callt_save_22
  1951. MAKE_CALLT_FUNCS (r22)
  1952. #endif
  1953. #ifdef L_callt_save_23
  1954. MAKE_CALLT_FUNCS (r23)
  1955. #endif
  1956. #ifdef L_callt_save_24
  1957. MAKE_CALLT_FUNCS (r24)
  1958. #endif
  1959. #ifdef L_callt_save_25
  1960. MAKE_CALLT_FUNCS (r25)
  1961. #endif
  1962. #ifdef L_callt_save_26
  1963. MAKE_CALLT_FUNCS (r26)
  1964. #endif
  1965. #ifdef L_callt_save_27
  1966. MAKE_CALLT_FUNCS (r27)
  1967. #endif
  1968. #ifdef L_callt_save_28
  1969. MAKE_CALLT_FUNCS (r28)
  1970. #endif
  1971. #ifdef L_callt_save_29
  1972. MAKE_CALLT_FUNCS (r29)
  1973. #endif
  1974. #ifdef L_callt_save_20c
  1975. MAKE_CALLT_CFUNCS (r20)
  1976. #endif
  1977. #ifdef L_callt_save_21c
  1978. MAKE_CALLT_CFUNCS (r21)
  1979. #endif
  1980. #ifdef L_callt_save_22c
  1981. MAKE_CALLT_CFUNCS (r22)
  1982. #endif
  1983. #ifdef L_callt_save_23c
  1984. MAKE_CALLT_CFUNCS (r23)
  1985. #endif
  1986. #ifdef L_callt_save_24c
  1987. MAKE_CALLT_CFUNCS (r24)
  1988. #endif
  1989. #ifdef L_callt_save_25c
  1990. MAKE_CALLT_CFUNCS (r25)
  1991. #endif
  1992. #ifdef L_callt_save_26c
  1993. MAKE_CALLT_CFUNCS (r26)
  1994. #endif
  1995. #ifdef L_callt_save_27c
  1996. MAKE_CALLT_CFUNCS (r27)
  1997. #endif
  1998. #ifdef L_callt_save_28c
  1999. MAKE_CALLT_CFUNCS (r28)
  2000. #endif
  2001. #ifdef L_callt_save_29c
  2002. MAKE_CALLT_CFUNCS (r29)
  2003. #endif
  2004. #ifdef L_callt_save_31c
  2005. .call_table_text
  2006. .align 2
  2007. /* Allocate space and save register r31 on the stack. */
  2008. /* Called via: callt ctoff(__callt_save_r31c). */
  2009. .L_callt_save_r31c:
  2010. prepare {r31}, 0
  2011. ctret
  2012. /* Restore saved registers, deallocate stack and return. */
  2013. /* Called via: callt ctoff(__return_r31c). */
  2014. .align 2
  2015. .L_callt_return_r31c:
  2016. dispose 0, {r31}, r31
  2017. /* Place the offsets of the start of these funcs into the call table. */
  2018. .call_table_data
  2019. .global __callt_save_r31c
  2020. .type __callt_save_r31c,@function
  2021. __callt_save_r31c: .short ctoff(.L_callt_save_r31c)
  2022. .global __callt_return_r31c
  2023. .type __callt_return_r31c,@function
  2024. __callt_return_r31c: .short ctoff(.L_callt_return_r31c)
  2025. #endif
  2026. #endif /* __v850e__ + */
  2027. #endif /* __V850_CALLT__ */
  2028. /* libgcc2 routines for NEC V850. */
  2029. /* Double Integer Arithmetical Operation. */
  2030. #ifdef L_negdi2
  2031. .text
  2032. .global ___negdi2
  2033. .type ___negdi2, @function
  2034. ___negdi2:
  2035. not r6, r10
  2036. add 1, r10
  2037. setf l, r6
  2038. not r7, r11
  2039. add r6, r11
  2040. jmp [lp]
  2041. .size ___negdi2,.-___negdi2
  2042. #endif
  2043. #ifdef L_cmpdi2
  2044. .text
  2045. .global ___cmpdi2
  2046. .type ___cmpdi2,@function
  2047. ___cmpdi2:
  2048. # Signed comparison bitween each high word.
  2049. cmp r9, r7
  2050. be .L_cmpdi_cmp_low
  2051. setf ge, r10
  2052. setf gt, r6
  2053. add r6, r10
  2054. jmp [lp]
  2055. .L_cmpdi_cmp_low:
  2056. # Unsigned comparigon bitween each low word.
  2057. cmp r8, r6
  2058. setf nl, r10
  2059. setf h, r6
  2060. add r6, r10
  2061. jmp [lp]
  2062. .size ___cmpdi2, . - ___cmpdi2
  2063. #endif
  2064. #ifdef L_ucmpdi2
  2065. .text
  2066. .global ___ucmpdi2
  2067. .type ___ucmpdi2,@function
  2068. ___ucmpdi2:
  2069. cmp r9, r7 # Check if each high word are same.
  2070. bne .L_ucmpdi_check_psw
  2071. cmp r8, r6 # Compare the word.
  2072. .L_ucmpdi_check_psw:
  2073. setf nl, r10 #
  2074. setf h, r6 #
  2075. add r6, r10 # Add the result of comparison NL and comparison H.
  2076. jmp [lp]
  2077. .size ___ucmpdi2, . - ___ucmpdi2
  2078. #endif
  2079. #ifdef L_muldi3
  2080. .text
  2081. .global ___muldi3
  2082. .type ___muldi3,@function
  2083. ___muldi3:
  2084. #ifdef __v850__
  2085. jarl __save_r26_r31, r10
  2086. addi 16, sp, sp
  2087. mov r6, r28
  2088. shr 15, r28
  2089. movea lo(32767), r0, r14
  2090. and r14, r28
  2091. mov r8, r10
  2092. shr 15, r10
  2093. and r14, r10
  2094. mov r6, r19
  2095. shr 30, r19
  2096. mov r7, r12
  2097. shl 2, r12
  2098. or r12, r19
  2099. and r14, r19
  2100. mov r8, r13
  2101. shr 30, r13
  2102. mov r9, r12
  2103. shl 2, r12
  2104. or r12, r13
  2105. and r14, r13
  2106. mov r7, r11
  2107. shr 13, r11
  2108. and r14, r11
  2109. mov r9, r31
  2110. shr 13, r31
  2111. and r14, r31
  2112. mov r7, r29
  2113. shr 28, r29
  2114. and r14, r29
  2115. mov r9, r12
  2116. shr 28, r12
  2117. and r14, r12
  2118. and r14, r6
  2119. and r14, r8
  2120. mov r6, r14
  2121. mulh r8, r14
  2122. mov r6, r16
  2123. mulh r10, r16
  2124. mov r6, r18
  2125. mulh r13, r18
  2126. mov r6, r15
  2127. mulh r31, r15
  2128. mulh r12, r6
  2129. mov r28, r17
  2130. mulh r10, r17
  2131. add -16, sp
  2132. mov r28, r12
  2133. mulh r8, r12
  2134. add r17, r18
  2135. mov r28, r17
  2136. mulh r31, r17
  2137. add r12, r16
  2138. mov r28, r12
  2139. mulh r13, r12
  2140. add r17, r6
  2141. mov r19, r17
  2142. add r12, r15
  2143. mov r19, r12
  2144. mulh r8, r12
  2145. mulh r10, r17
  2146. add r12, r18
  2147. mov r19, r12
  2148. mulh r13, r12
  2149. add r17, r15
  2150. mov r11, r13
  2151. mulh r8, r13
  2152. add r12, r6
  2153. mov r11, r12
  2154. mulh r10, r12
  2155. add r13, r15
  2156. mulh r29, r8
  2157. add r12, r6
  2158. mov r16, r13
  2159. shl 15, r13
  2160. add r14, r13
  2161. mov r18, r12
  2162. shl 30, r12
  2163. mov r13, r26
  2164. add r12, r26
  2165. shr 15, r14
  2166. movhi hi(131071), r0, r12
  2167. movea lo(131071), r12, r13
  2168. and r13, r14
  2169. mov r16, r12
  2170. and r13, r12
  2171. add r12, r14
  2172. mov r18, r12
  2173. shl 15, r12
  2174. and r13, r12
  2175. add r12, r14
  2176. shr 17, r14
  2177. shr 17, r16
  2178. add r14, r16
  2179. shl 13, r15
  2180. shr 2, r18
  2181. add r18, r15
  2182. add r15, r16
  2183. mov r16, r27
  2184. add r8, r6
  2185. shl 28, r6
  2186. add r6, r27
  2187. mov r26, r10
  2188. mov r27, r11
  2189. jr __return_r26_r31
  2190. #else /* defined(__v850e__) */
  2191. /* (Ahi << 32 + Alo) * (Bhi << 32 + Blo) */
  2192. /* r7 r6 r9 r8 */
  2193. mov r8, r10
  2194. mulu r7, r8, r0 /* Ahi * Blo */
  2195. mulu r6, r9, r0 /* Alo * Bhi */
  2196. mulu r6, r10, r11 /* Alo * Blo */
  2197. add r8, r11
  2198. add r9, r11
  2199. jmp [r31]
  2200. #endif /* defined(__v850e__) */
  2201. .size ___muldi3, . - ___muldi3
  2202. #endif