~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/m68k/math-emu/fp_movem.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * fp_movem.S
  3  *
  4  * Copyright Roman Zippel, 1997.  All rights reserved.
  5  *
  6  * Redistribution and use in source and binary forms, with or without
  7  * modification, are permitted provided that the following conditions
  8  * are met:
  9  * 1. Redistributions of source code must retain the above copyright
 10  *    notice, and the entire permission notice in its entirety,
 11  *    including the disclaimer of warranties.
 12  * 2. Redistributions in binary form must reproduce the above copyright
 13  *    notice, this list of conditions and the following disclaimer in the
 14  *    documentation and/or other materials provided with the distribution.
 15  * 3. The name of the author may not be used to endorse or promote
 16  *    products derived from this software without specific prior
 17  *    written permission.
 18  *
 19  * ALTERNATIVELY, this product may be distributed under the terms of
 20  * the GNU General Public License, in which case the provisions of the GPL are
 21  * required INSTEAD OF the above restrictions.  (This clause is
 22  * necessary due to a potential bad interaction between the GPL and
 23  * the restrictions contained in a BSD-style copyright.)
 24  *
 25  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 26  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 27  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 28  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 29  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 30  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 33  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 35  * OF THE POSSIBILITY OF SUCH DAMAGE.
 36  */
 37 
 38 #include "fp_emu.h"
 39 #include "fp_decode.h"
 40 
 41 | set flags for decode macros for fmovem
 42 do_fmovem=1
 43 
 44         .globl  fp_fmovem_fp, fp_fmovem_cr
 45 
 46 | %d1 contains the mask and count of the register list
 47 | for other register usage see fp_decode.h
 48 
 49 fp_fmovem_fp:
 50         printf  PDECODE,"fmovem.x "
 51         | get register list and count them
 52         btst    #11,%d2
 53         jne     1f
 54         bfextu  %d2{#24,#8},%d0         | static register list
 55         jra     2f
 56 1:      bfextu  %d2{#25,#3},%d0         | dynamic register list
 57         jsr     fp_get_data_reg
 58 2:      move.l  %d0,%d1
 59         swap    %d1
 60         jra     2f
 61 1:      addq.w  #1,%d1                  | count the # of registers in
 62 2:      lsr.b   #1,%d0                  | register list and keep it in %d1
 63         jcs     1b
 64         jne     2b
 65         printf  PDECODE,"#%08x",1,%d1
 66 #ifdef FPU_EMU_DEBUG
 67         btst    #12,%d2
 68         jne     1f
 69         printf  PDECODE,"-"             | decremental move
 70         jra     2f
 71 1:      printf  PDECODE,"+"             | incremental move
 72 2:      btst    #13,%d2
 73         jeq     1f
 74         printf  PDECODE,"->"            | fpu -> cpu
 75         jra     2f
 76 1:      printf  PDECODE,"<-"            | fpu <- cpu
 77 2:
 78 #endif
 79 
 80         | decode address mode
 81         fp_decode_addr_mode
 82 
 83         .long   fp_ill, fp_ill
 84         .long   fpr_indirect, fpr_postinc
 85         .long   fpr_predecr, fpr_disp16
 86         .long   fpr_extmode0, fpr_extmode1
 87 
 88         | addressing mode: address register indirect
 89 fpr_indirect:
 90         fp_mode_addr_indirect
 91         jra     fpr_do_movem
 92 
 93         | addressing mode: address register indirect with postincrement
 94 fpr_postinc:
 95         fp_mode_addr_indirect_postinc
 96         jra     fpr_do_movem
 97 
 98 fpr_predecr:
 99         fp_mode_addr_indirect_predec
100         jra     fpr_do_movem
101 
102         | addressing mode: address register/programm counter indirect
103         |                  with 16bit displacement
104 fpr_disp16:
105         fp_mode_addr_indirect_disp16
106         jra     fpr_do_movem
107 
108 fpr_extmode0:
109         fp_mode_addr_indirect_extmode0
110         jra     fpr_do_movem
111 
112 fpr_extmode1:
113         fp_decode_addr_reg
114         jmp     ([0f:w,%pc,%d0*4])
115 
116         .align  4
117 0:
118         .long   fpr_absolute_short, fpr_absolute_long
119         .long   fpr_disp16, fpr_extmode0
120         .long   fp_ill, fp_ill
121         .long   fp_ill, fp_ill
122 
123 fpr_absolute_short:
124         fp_mode_abs_short
125         jra     fpr_do_movem
126 
127 fpr_absolute_long:
128         fp_mode_abs_long
129 |       jra     fpr_do_movem
130 
131 fpr_do_movem:
132         swap    %d1                     | get fpu register list
133         lea     (FPD_FPREG,FPDATA),%a1
134         moveq   #12,%d0
135         btst    #12,%d2
136         jne     1f
137         lea     (-12,%a1,%d0*8),%a1
138         neg.l   %d0
139 1:      btst    #13,%d2
140         jne     4f
141         | move register from memory into fpu
142         jra     3f
143 1:      printf  PMOVEM,"(%p>%p)",2,%a0,%a1
144         getuser.l (%a0)+,%d2,fp_err_ua1,%a0
145         lsr.l   #8,%d2
146         lsr.l   #7,%d2
147         lsr.w   #1,%d2
148         move.l  %d2,(%a1)+
149         getuser.l (%a0)+,%d2,fp_err_ua1,%a0
150         move.l  %d2,(%a1)+
151         getuser.l (%a0),%d2,fp_err_ua1,%a0
152         move.l  %d2,(%a1)
153         subq.l  #8,%a0
154         subq.l  #8,%a1
155         add.l   %d0,%a0
156 2:      add.l   %d0,%a1
157 3:      lsl.b   #1,%d1
158         jcs     1b
159         jne     2b
160         jra     5f
161         | move register from fpu into memory
162 1:      printf  PMOVEM,"(%p>%p)",2,%a1,%a0
163         move.l  (%a1)+,%d2
164         lsl.w   #1,%d2
165         lsl.l   #7,%d2
166         lsl.l   #8,%d2
167         putuser.l %d2,(%a0)+,fp_err_ua1,%a0
168         move.l  (%a1)+,%d2
169         putuser.l %d2,(%a0)+,fp_err_ua1,%a0
170         move.l  (%a1),%d2
171         putuser.l %d2,(%a0),fp_err_ua1,%a0
172         subq.l  #8,%a1
173         subq.l  #8,%a0
174         add.l   %d0,%a0
175 2:      add.l   %d0,%a1
176 4:      lsl.b   #1,%d1
177         jcs     1b
178         jne     2b
179 5:
180         printf  PDECODE,"\n"
181 #if 0
182         lea     (FPD_FPREG,FPDATA),%a0
183         printf  PMOVEM,"fp:"
184         printx  PMOVEM,%a0@(0)
185         printx  PMOVEM,%a0@(12)
186         printf  PMOVEM,"\n   "
187         printx  PMOVEM,%a0@(24)
188         printx  PMOVEM,%a0@(36)
189         printf  PMOVEM,"\n   "
190         printx  PMOVEM,%a0@(48)
191         printx  PMOVEM,%a0@(60)
192         printf  PMOVEM,"\n   "
193         printx  PMOVEM,%a0@(72)
194         printx  PMOVEM,%a0@(84)
195         printf  PMOVEM,"\n"
196 #endif
197         jra     fp_end
198 
199 | set flags for decode macros for fmovem control register
200 do_fmovem=1
201 do_fmovem_cr=1
202 
203 fp_fmovem_cr:
204         printf  PDECODE,"fmovem.cr "
205         | get register list and count them
206         bfextu  %d2{#19,#3},%d0
207         move.l  %d0,%d1
208         swap    %d1
209         jra     2f
210 1:      addq.w  #1,%d1
211 2:      lsr.l   #1,%d0
212         jcs     1b
213         jne     2b
214         printf  PDECODE,"#%08x",1,%d1
215 #ifdef FPU_EMU_DEBUG
216         btst    #13,%d2
217         jeq     1f
218         printf  PDECODE,"->"            | fpu -> cpu
219         jra     2f
220 1:      printf  PDECODE,"<-"            | fpu <- cpu
221 2:
222 #endif
223 
224         | decode address mode
225         fp_decode_addr_mode
226 
227         .long   fpc_data, fpc_addr
228         .long   fpc_indirect, fpc_postinc
229         .long   fpc_predecr, fpc_disp16
230         .long   fpc_extmode0, fpc_extmode1
231 
232 fpc_data:
233         fp_mode_data_direct
234         move.w  %d0,%d1
235         bfffo   %d2{#19,#3},%d0
236         sub.w   #19,%d0
237         lea     (FPD_FPCR,FPDATA,%d0.w*4),%a1
238         btst    #13,%d2
239         jne     1f
240         move.w  %d1,%d0
241         jsr     fp_get_data_reg
242         move.l  %d0,(%a1)
243         jra     fpc_movem_fin
244 1:      move.l  (%a1),%d0
245         jsr     fp_put_data_reg
246         jra     fpc_movem_fin
247 
248 fpc_addr:
249         fp_decode_addr_reg
250         printf  PDECODE,"a%d",1,%d0
251         btst    #13,%d2
252         jne     1f
253         jsr     fp_get_addr_reg
254         move.l  %a0,(FPD_FPIAR,FPDATA)
255         jra     fpc_movem_fin
256 1:      move.l  (FPD_FPIAR,FPDATA),%a0
257         jsr     fp_put_addr_reg
258         jra     fpc_movem_fin
259 
260 fpc_indirect:
261         fp_mode_addr_indirect
262         jra     fpc_do_movem
263 
264 fpc_postinc:
265         fp_mode_addr_indirect_postinc
266         jra     fpc_do_movem
267 
268 fpc_predecr:
269         fp_mode_addr_indirect_predec
270         jra     fpc_do_movem
271 
272 fpc_disp16:
273         fp_mode_addr_indirect_disp16
274         jra     fpc_do_movem
275 
276 fpc_extmode0:
277         fp_mode_addr_indirect_extmode0
278         jra     fpc_do_movem
279 
280 fpc_extmode1:
281         fp_decode_addr_reg
282         jmp     ([0f:w,%pc,%d0*4])
283 
284         .align  4
285 0:
286         .long   fpc_absolute_short, fpc_absolute_long
287         .long   fpc_disp16, fpc_extmode0
288         .long   fpc_immediate, fp_ill
289         .long   fp_ill, fp_ill
290 
291 fpc_absolute_short:
292         fp_mode_abs_short
293         jra     fpc_do_movem
294 
295 fpc_absolute_long:
296         fp_mode_abs_long
297         jra     fpc_do_movem
298 
299 fpc_immediate:
300         fp_get_pc %a0
301         lea     (%a0,%d1.w*4),%a1
302         fp_put_pc %a1
303         printf  PDECODE,"#imm"
304 |       jra     fpc_do_movem
305 #if 0
306         swap    %d1
307         lsl.l   #5,%d1
308         lea     (FPD_FPCR,FPDATA),%a0
309         jra     3f
310 1:      move.l  %d0,(%a0)
311 2:      addq.l  #4,%a0
312 3:      lsl.b   #1,%d1
313         jcs     1b
314         jne     2b
315         jra     fpc_movem_fin
316 #endif
317 
318 fpc_do_movem:
319         swap    %d1                     | get fpu register list
320         lsl.l   #5,%d1
321         lea     (FPD_FPCR,FPDATA),%a1
322 1:      btst    #13,%d2
323         jne     4f
324 
325         | move register from memory into fpu
326         jra     3f
327 1:      printf  PMOVEM,"(%p>%p)",2,%a0,%a1
328         getuser.l (%a0)+,%d0,fp_err_ua1,%a0
329         move.l  %d0,(%a1)
330 2:      addq.l  #4,%a1
331 3:      lsl.b   #1,%d1
332         jcs     1b
333         jne     2b
334         jra     fpc_movem_fin
335 
336         | move register from fpu into memory
337 1:      printf  PMOVEM,"(%p>%p)",2,%a1,%a0
338         move.l  (%a1),%d0
339         putuser.l %d0,(%a0)+,fp_err_ua1,%a0
340 2:      addq.l  #4,%a1
341 4:      lsl.b   #1,%d1
342         jcs     1b
343         jne     2b
344 
345 fpc_movem_fin:
346         and.l   #0x0000fff0,(FPD_FPCR,FPDATA)
347         and.l   #0x0ffffff8,(FPD_FPSR,FPDATA)
348         move.l  (FPD_FPCR,FPDATA),%d0
349         lsr.l   #4,%d0
350         moveq   #3,%d1
351         and.l   %d0,%d1
352         move.w  %d1,(FPD_RND,FPDATA)
353         lsr.l   #2,%d0
354         moveq   #3,%d1
355         and.l   %d0,%d1
356         move.w  %d1,(FPD_PREC,FPDATA)
357         printf  PDECODE,"\n"
358 #if 0
359         printf  PMOVEM,"fpcr : %08x\n",1,FPDATA@(FPD_FPCR)
360         printf  PMOVEM,"fpsr : %08x\n",1,FPDATA@(FPD_FPSR)
361         printf  PMOVEM,"fpiar: %08x\n",1,FPDATA@(FPD_FPIAR)
362         clr.l   %d0
363         move.w  (FPD_PREC,FPDATA),%d0
364         printf  PMOVEM,"prec : %04x\n",1,%d0
365         move.w  (FPD_RND,FPDATA),%d0
366         printf  PMOVEM,"rnd  : %04x\n",1,%d0
367 #endif
368         jra     fp_end

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php