OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [uClinux-2.0.x/] [arch/] [m68k/] [fpsp040/] [x_fline.S] - Blame information for rev 1775

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.