source: rtems/bsps/m68k/shared/fpsp/x_fline.S @ b82a4b4

5
Last change on this file since b82a4b4 was 3cf2bf63, checked in by Sebastian Huber <sebastian.huber@…>, on 03/26/18 at 10:17:06

bsps/m68k: Move fpsp support to bsps

This patch is a part of the BSP source reorganization.

Update #3285.

  • Property mode set to 100644
File size: 3.0 KB
Line 
1#include "fpsp-namespace.h"
2//
3//
4//      x_fline.sa 3.3 1/10/91
5//
6//      fpsp_fline --- FPSP handler for fline exception
7//
8//      First determine if the exception is one of the unimplemented
9//      floating point instructions.  If so, let fpsp_unimp handle it.
10//      Next, determine if the instruction is an fmovecr with a non-zero
11//      <ea> field.  If so, handle here and return.  Otherwise, it
12//      must be a real F-line exception.
13//
14
15//              Copyright (C) Motorola, Inc. 1990
16//                      All Rights Reserved
17//
18//      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
19//      The copyright notice above does not evidence any
20//      actual or intended publication of such source code.
21
22X_FLINE:        //idnt    2,1 | Motorola 040 Floating Point Software Package
23
24        |section        8
25
26#include "fpsp.defs"
27
28        |xref   real_fline
29        |xref   fpsp_unimp
30        |xref   uni_2
31        |xref   mem_read
32        |xref   fpsp_fmt_error
33
34        .global fpsp_fline
35fpsp_fline:
36//
37//      check for unimplemented vector first.  Use EXC_VEC-4 because
38//      the equate is valid only after a 'link a6' has pushed one more
39//      long onto the stack.
40//
41        cmpw    #UNIMP_VEC,EXC_VEC-4(%a7)
42        beql    fpsp_unimp
43
44//
45//      fmovecr with non-zero <ea> handling here
46//
47        subl    #4,%a7          //4 accounts for 2-word difference
48//                              ;between six word frame (unimp) and
49//                              ;four word frame
50        link    %a6,#-LOCAL_SIZE
51        fsave   -(%a7)
52        moveml  %d0-%d1/%a0-%a1,USER_DA(%a6)
53        moveal  EXC_PC+4(%a6),%a0       //get address of fline instruction
54        leal    L_SCR1(%a6),%a1 //use L_SCR1 as scratch
55        movel   #4,%d0
56        addl    #4,%a6          //to offset the sub.l #4,a7 above so that
57//                              ;a6 can point correctly to the stack frame
58//                              ;before branching to mem_read
59        bsrl    mem_read
60        subl    #4,%a6
61        movel   L_SCR1(%a6),%d0 //d0 contains the fline and command word
62        bfextu  %d0{#4:#3},%d1  //extract coprocessor id
63        cmpib   #1,%d1          //check if cpid=1
64        bne     not_mvcr        //exit if not
65        bfextu  %d0{#16:#6},%d1
66        cmpib   #0x17,%d1               //check if it is an FMOVECR encoding
67        bne     not_mvcr
68//                              ;if an FMOVECR instruction, fix stack
69//                              ;and go to FPSP_UNIMP
70fix_stack:
71        cmpib   #VER_40,(%a7)   //test for orig unimp frame
72        bnes    ck_rev
73        subl    #UNIMP_40_SIZE-4,%a7 //emulate an orig fsave
74        moveb   #VER_40,(%a7)
75        moveb   #UNIMP_40_SIZE-4,1(%a7)
76        clrw    2(%a7)
77        bras    fix_con
78ck_rev:
79        cmpib   #VER_41,(%a7)   //test for rev unimp frame
80        bnel    fpsp_fmt_error  //if not $40 or $41, exit with error
81        subl    #UNIMP_41_SIZE-4,%a7 //emulate a rev fsave
82        moveb   #VER_41,(%a7)
83        moveb   #UNIMP_41_SIZE-4,1(%a7)
84        clrw    2(%a7)
85fix_con:
86        movew   EXC_SR+4(%a6),EXC_SR(%a6) //move stacked sr to new position
87        movel   EXC_PC+4(%a6),EXC_PC(%a6) //move stacked pc to new position
88        fmovel  EXC_PC(%a6),%FPIAR //point FPIAR to fline inst
89        movel   #4,%d1
90        addl    %d1,EXC_PC(%a6) //increment stacked pc value to next inst
91        movew   #0x202c,EXC_VEC(%a6) //reformat vector to unimp
92        clrl    EXC_EA(%a6)     //clear the EXC_EA field
93        movew   %d0,CMDREG1B(%a6) //move the lower word into CMDREG1B
94        clrl    E_BYTE(%a6)
95        bsetb   #UFLAG,T_BYTE(%a6)
96        moveml  USER_DA(%a6),%d0-%d1/%a0-%a1 //restore data registers
97        bral    uni_2
98
99not_mvcr:
100        moveml  USER_DA(%a6),%d0-%d1/%a0-%a1 //restore data registers
101        frestore (%a7)+
102        unlk    %a6
103        addl    #4,%a7
104        bral    real_fline
105
106        |end
Note: See TracBrowser for help on using the repository browser.