1/* 2Copyright (c) 1990 The Regents of the University of California. 3All rights reserved. 4 5Redistribution and use in source and binary forms are permitted 6provided that the above copyright notice and this paragraph are 7duplicated in all such forms and that any documentation, 8and/or other materials related to such 9distribution and use acknowledge that the software was developed 10by the University of California, Berkeley. The name of the 11University may not be used to endorse or promote products derived 12from this software without specific prior written permission. 13THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17/* We want to pretend we're in SHmedia mode, even when assembling for 18 SHcompact. */ 19#include <picolibc.h> 20 21#if __SH5__ == 32 && ! __SHMEDIA__ 22# undef __SHMEDIA__ 23# define __SHMEDIA__ 1 24#endif 25 26#if __SHMEDIA__ 27 .mode SHmedia 28#endif 29 30#include "asm.h" 31 32ENTRY(setjmp) 33#if __SH5__ 34 ptabs r18, tr0 35 gettr tr5, r5 36 gettr tr6, r6 37 gettr tr7, r7 38 st.q r2, 0*8, r18 39 st.q r2, 1*8, r10 40 st.q r2, 2*8, r11 41 st.q r2, 3*8, r12 42 st.q r2, 4*8, r13 43 st.q r2, 5*8, r14 44 st.q r2, 6*8, r15 45 st.q r2, 7*8, r28 46 st.q r2, 8*8, r29 47 st.q r2, 9*8, r30 48 st.q r2, 10*8, r31 49 st.q r2, 11*8, r32 50 st.q r2, 12*8, r33 51 st.q r2, 13*8, r34 52 st.q r2, 14*8, r35 53 st.q r2, 15*8, r44 54 st.q r2, 16*8, r45 55 st.q r2, 17*8, r46 56 st.q r2, 18*8, r47 57 st.q r2, 19*8, r48 58 st.q r2, 20*8, r49 59 st.q r2, 21*8, r50 60 st.q r2, 22*8, r51 61 st.q r2, 23*8, r52 62 st.q r2, 24*8, r53 63 st.q r2, 25*8, r54 64 st.q r2, 26*8, r55 65 st.q r2, 27*8, r56 66 st.q r2, 28*8, r57 67 st.q r2, 29*8, r58 68 st.q r2, 30*8, r59 69 st.q r2, 31*8, r5 70 st.q r2, 32*8, r6 71 st.q r2, 33*8, r7 72#if ! __SH4_NOFPU__ 73 fst.d r2, 34*8, dr12 74 fst.d r2, 35*8, dr14 75 fst.d r2, 36*8, dr36 76 fst.d r2, 37*8, dr38 77 fst.d r2, 38*8, dr40 78 fst.d r2, 39*8, dr42 79 fst.d r2, 40*8, dr44 80 fst.d r2, 41*8, dr46 81 fst.d r2, 42*8, dr48 82 fst.d r2, 43*8, dr50 83 fst.d r2, 44*8, dr52 84 fst.d r2, 45*8, dr54 85 fst.d r2, 46*8, dr56 86 fst.d r2, 47*8, dr58 87 fst.d r2, 48*8, dr60 88 fst.d r2, 49*8, dr62 89#endif 90 movi 0, r2 91 blink tr0, r63 92#else 93#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) 94 add #(13*4),r4 95#else 96 add #(9*4),r4 97#endif 98 99 sts.l pr,@-r4 100 101#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) 102 fmov.s fr15,@-r4 ! call saved floating point registers 103 fmov.s fr14,@-r4 104 fmov.s fr13,@-r4 105 fmov.s fr12,@-r4 106#endif 107 108 mov.l r15,@-r4 ! call saved integer registers 109 mov.l r14,@-r4 110 mov.l r13,@-r4 111 mov.l r12,@-r4 112 113 mov.l r11,@-r4 114 mov.l r10,@-r4 115 mov.l r9,@-r4 116 mov.l r8,@-r4 117 118 rts 119 mov #0,r0 120#endif /* __SH5__ */ 121 122ENTRY(longjmp) 123#if __SH5__ 124 ld.q r2, 0*8, r18 125 ptabs r18, tr0 126 ld.q r2, 1*8, r10 127 ld.q r2, 2*8, r11 128 ld.q r2, 3*8, r12 129 ld.q r2, 4*8, r13 130 ld.q r2, 5*8, r14 131 ld.q r2, 6*8, r15 132 ld.q r2, 7*8, r28 133 ld.q r2, 8*8, r29 134 ld.q r2, 9*8, r30 135 ld.q r2, 10*8, r31 136 ld.q r2, 11*8, r32 137 ld.q r2, 12*8, r33 138 ld.q r2, 13*8, r34 139 ld.q r2, 14*8, r35 140 ld.q r2, 15*8, r44 141 ld.q r2, 16*8, r45 142 ld.q r2, 17*8, r46 143 ld.q r2, 18*8, r47 144 ld.q r2, 19*8, r48 145 ld.q r2, 20*8, r49 146 ld.q r2, 21*8, r50 147 ld.q r2, 22*8, r51 148 ld.q r2, 23*8, r52 149 ld.q r2, 24*8, r53 150 ld.q r2, 25*8, r54 151 ld.q r2, 26*8, r55 152 ld.q r2, 27*8, r56 153 ld.q r2, 28*8, r57 154 ld.q r2, 29*8, r58 155 ld.q r2, 30*8, r59 156 ld.q r2, 31*8, r5 157 ld.q r2, 32*8, r6 158 ld.q r2, 33*8, r7 159 ptabs r5, tr5 160 ptabs r6, tr6 161 ptabs r7, tr7 162#if ! __SH4_NOFPU__ 163 fld.d r2, 34*8, dr12 164 fld.d r2, 35*8, dr14 165 fld.d r2, 36*8, dr36 166 fld.d r2, 37*8, dr38 167 fld.d r2, 38*8, dr40 168 fld.d r2, 39*8, dr42 169 fld.d r2, 40*8, dr44 170 fld.d r2, 41*8, dr46 171 fld.d r2, 42*8, dr48 172 fld.d r2, 43*8, dr50 173 fld.d r2, 44*8, dr52 174 fld.d r2, 45*8, dr54 175 fld.d r2, 46*8, dr56 176 fld.d r2, 47*8, dr58 177 fld.d r2, 48*8, dr60 178 fld.d r2, 49*8, dr62 179#endif 180 movi 1, r2 181 cmvne r3, r3, r2 182 blink tr0, r63 183#else 184 mov.l @r4+,r8 185 mov.l @r4+,r9 186 mov.l @r4+,r10 187 mov.l @r4+,r11 188 189 mov.l @r4+,r12 190 mov.l @r4+,r13 191 mov.l @r4+,r14 192 mov.l @r4+,r15 193 194#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) 195 fmov.s @r4+,fr12 ! call saved floating point registers 196 fmov.s @r4+,fr13 197 fmov.s @r4+,fr14 198 fmov.s @r4+,fr15 199#endif 200 201 lds.l @r4+,pr 202 203 mov r5,r0 204 tst r0,r0 205 bf retr4 206 movt r0 207retr4: rts 208 nop 209#endif /* __SH5__ */ 210