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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [grfpu_ops.S] - Rev 2

Compare with Previous | Blame | View Log

/**********************************************************************/
/*  This file is a part of the GRFPU IP core testbench                */
/*  Copyright (C) 2004  Gaisler Research AB                           */
/*  ALL RIGHTS RESERVED                                               */
/*                                                                    */
/**********************************************************************/

/* #include "leon" */
        
        
!  %i0  : operand 1
!  %i1  : operand 1
!  %i2  : result
!  %o0  : 0 - OK, 1 - error             

        .text
        .align 4
        .global grfpu_fdivs, grfpu_fdivd, grfpu_sqrtd, grfpu_ttrap
        .global divident, divromtst
        .global grfpu_faddd
        .global grfpu_fmuld             
        .global grfpu_fstoi, grfpu_fdtoi, grfpu_fitos, grfpu_fitod
        .global grfpu_fstod, grfpu_fdtos
        .global grfpu_fnegs, grfpu_fmovs, grfpu_fabss
        .global grfpu_fcmpd, grfpu_fcmped, grfpu_fcmps, grfpu_fcmpes
        .global grfpu_fsubd, grfpu_fadds, grfpu_fsubs, grfpu_fmuls
        .global grfpu_fdivs, grfpu_fsqrts, initfpreg
        .global grfpc_dpdep_tst, grfpc_spdep_tst, grfpc_spdpdep_tst     
        .global get_tbr, fptrap
        
                                
grfpu_faddd:
        ldd     [%o0], %f0
        ldd     [%o1], %f2
        faddd   %f0, %f2, %f4
        retl            
        std     %f4, [%o2]


grfpu_fmuld:
        ldd     [%o0], %f0
        ldd     [%o1], %f2
        fmuld   %f0, %f2, %f4
        retl
        std     %f4, [%o2]              
                
        
grfpu_fdivd:    
        ldd  [%o0], %f0
        ldd  [%o1], %f2
        fdivd %f0, %f2, %f4             
        std  %f4, [%o2]         
        retl 
        nop

grfpu_sqrtd:    
        ldd [%o0], %f0  
        fsqrtd %f0, %f2
        std %f2, [%o1]
        retl
        nop

grfpu_ttrap:    
        nop; nop; nop; nop; nop; nop; nop; nop;
        nop; nop; nop; nop; nop; nop; nop; nop;
        nop; nop; nop; nop; nop; nop; nop; nop;
        nop; nop; nop; nop; nop; nop; nop; nop;
        fmovs %f0, %f0
        retl
        nop
                
divident:       
        ldd  [%o0], %f0         
        retl
        nop                                     

divromtst:      
        ldd     [%o0], %f2
        fdivd   %f0, %f2, %f4
        std     %f4, [%o1]              
        retl
        nop
                        
        
grfpu_fitod:
        set     dw, %o1
        st      %o0, [%o1]
        ld      [%o1], %f0
        fitod   %f0, %f2
        std     %f2, [%o1]
        retl
        ldd     [%o1], %o0

grfpu_fitos:
        set     dw, %o1
        st      %o0, [%o1]
        ld      [%o1], %f0
        fitos   %f0, %f2
        st      %f2, [%o1]
        retl
        ld      [%o1], %o0      

grfpu_fdtoi:    
        set     dw, %o2                                                         
        std     %o0, [%o2]
        ldd     [%o2], %f0
        fdtoi   %f0, %f2
        st      %f2, [%o2]
        retl    
        ld      [%o2], %o0
                        
grfpu_fstoi:    
        set     dw, %o2                                                         
        st      %o0, [%o2]
        ld      [%o2], %f0
        fstoi   %f0, %f2
        st      %f2, [%o2]
        retl    
        ld      [%o2], %o0

grfpu_fstod:    
        set     dw, %o2
        st      %o0, [%o2]
        ld      [%o2], %f0
        fstod   %f0, %f0
        std     %f0, [%o2]
        retl
        ldd     [%o2], %o0                              

grfpu_fdtos:    
        set     dw, %o2
        std     %o0, [%o2]
        ldd     [%o2], %f0
        fdtos   %f0, %f0
        st      %f0, [%o2]
        retl
        ld      [%o2], %o0                                                      

grfpu_fmovs:
        set     dw, %o2
        st      %o0, [%o2]
        ld      [%o2], %f5
        fmovs   %f5, %f6
        st      %f6, [%o2]
        retl
        ld      [%o2], %o0                      


grfpu_fnegs:
        set     dw, %o2
        st      %o0, [%o2]
        ld      [%o2], %f5
        fnegs   %f5, %f6
        st      %f6, [%o2]
        retl
        ld      [%o2], %o0

grfpu_fabss:
        set     dw, %o2
        st      %o0, [%o2]
        ld      [%o2], %f5
        fabss   %f5, %f6
        st      %f6, [%o2]
        retl
        ld      [%o2], %o0                              

grfpu_fcmpd:    
        set     dw, %o4
        std     %o0, [%o4]
        std     %o2, [%o4+8]
        ldd     [%o4], %f0
        ldd     [%o4+8], %f2
        fcmpd   %f0, %f2
        nop
        fbe,a   cmpd_end
        mov     0, %o0
        fbl,a   cmpd_end
        mov     1, %o0
        fbg,a   cmpd_end
        mov     2, %o0
        fbu,a   cmpd_end
        mov     3, %o0
        ta      0x0     !error
cmpd_end:
        retl
        nop


grfpu_fcmped:   
        set     dw, %o4
        std     %o0, [%o4]
        std     %o2, [%o4+8]
        ldd     [%o4], %f0
        ldd     [%o4+8], %f2
        fcmped  %f0, %f2
        nop
        fbe,a   cmpd_end
        mov     0, %o0
        fbl,a   cmpd_end
        mov     1, %o0
        fbg,a   cmpd_end
        mov     2, %o0
        fbu,a   cmpd_end
        mov     3, %o0
        ta      0x0     !error
                                                        

grfpu_fcmps:    
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fcmps   %f0, %f1
        nop
        fbe,a   cmpd_end
        mov     0, %o0
        fbl,a   cmpd_end
        mov     1, %o0
        fbg,a   cmpd_end
        mov     2, %o0
        fbu,a   cmpd_end
        mov     3, %o0
        ta      0x0     !error

grfpu_fcmpes:   
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fcmpes  %f0, %f1
        nop
        fbe,a   cmpd_end
        mov     0, %o0
        fbl,a   cmpd_end
        mov     1, %o0
        fbg,a   cmpd_end
        mov     2, %o0
        fbu,a   cmpd_end
        mov     3, %o0
        ta      0x0     !error  
        
grfpu_fsubd:    
        set     dw, %o4
        std     %o0, [%o4]
        std     %o2, [%o4+8]
        ldd     [%o4], %f0
        ldd     [%o4+8], %f2
        fsubd   %f0, %f2, %f4
        std     %f4, [%o4]
        retl
        ldd     [%o4], %o0
        
grfpu_fadds:    
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fadds   %f0, %f1, %f2
        st      %f2, [%o4]
        retl
        ld      [%o4], %o0
        
grfpu_fsubs:    
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fsubs   %f0, %f1, %f2
        st      %f2, [%o4]
        retl
        ld      [%o4], %o0

grfpu_fmuls:    
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fmuls   %f0, %f1, %f2
        st      %f2, [%o4]
        retl
        ld      [%o4], %o0                      

grfpu_fdivs:    
        set     dw, %o4
        st      %o0, [%o4]
        st      %o1, [%o4+8]
        ld      [%o4], %f0
        ld      [%o4+8], %f1
        fdivs   %f0, %f1, %f2
        st      %f2, [%o4]
        retl
        ld      [%o4], %o0

grfpu_fsqrts:   
        set     dw, %o4
        st      %o0, [%o4]
        ld      [%o4], %f0
        fsqrts  %f0, %f1
        st      %f1, [%o4]
        retl
        ld      [%o4], %o0                              

grfpc_dpdep_tst:        
        set     dpbuf, %o1
        ldd     [%o1+8], %f2
        ldd     [%o1], %f0
        faddd   %f0, %f0, %f4   ! 1 + 1 = 2
        fsubd   %f4, %f2, %f8   ! 2 - 3 = -1    
        fdivd   %f8, %f4, %f10  ! -1 / 2 = -0.5
        fmuld   %f10, %f2, %f10 ! -0.5 * 3 = -1.5         
        retl
        std     %f10, [%o0]

grfpc_spdep_tst:
        set     spbuf, %o1
        ld      [%o1], %f0
        ld      [%o1+4], %f1
        fadds   %f0, %f0, %f2   ! 1 + 1 = 2
        fsubs   %f2, %f1, %f3   ! 2 - 3 = -1
        fdivs   %f3, %f2, %f4   ! -1 / 2 = -0.5
        fmuls   %f4, %f1, %f4   ! -0.5 * 3 = -1.5
        retl
        st      %f4, [%o0]
        
grfpc_spdpdep_tst:
        set     dpbuf, %o1
        set     spbuf, %o2
        ld      [%o2], %f0
        ldd     [%o1+16], %f2                   
        fadds   %f0, %f0, %f1   ! 1 + 1 = 2
        fsubd   %f2, %f0, %f4   ! 
        fdivs   %f4, %f1, %f5   ! 
        fmuld   %f4, %f2, %f6   ! 
        fmuls   %f5, %f6, %f7
        fsqrtd  %f6, %f8
        retl
        std     %f8, [%o0]

initfpreg:
        set zbuf, %o0
        ldd [%o0], %f0
        ldd [%o0], %f2
        ldd [%o0], %f4
        ldd [%o0], %f6
        ldd [%o0], %f8
        ldd [%o0], %f10                                                 
        ldd [%o0], %f12
        ldd [%o0], %f14                                                 
        ldd [%o0], %f16
        ldd [%o0], %f18                                                 
        ldd [%o0], %f20
        ldd [%o0], %f22 
        ldd [%o0], %f24 
        ldd [%o0], %f26
        ldd [%o0], %f28
        ldd [%o0], %f30                 
        retl 
        nop
        
fptrap:
        set     fsr1, %l4
                
        set     tfsr, %l3       
        st      %fsr, [%l3]
        ld      [%l3], %l3
        srl     %l3, 14, %l0
        and     %l0, 7, %l0
        subcc   %l0, 2, %l0     ! %l0 = 0 if unfFPop trap, 1 otherwise
        set     0, %l7          ! %l7 = nr of instr. in FQ              
        !be     _skip
        !nop                    
        set     grfpufq-8, %l6
1:
        add     %l7, 1, %l7             
        add     %l6, 8, %l6
        std     %fq, [%l6]      
        st      %fsr, [%l4]
        ld      [%l4], %l5
        srl     %l5, 13, %l5
        andcc   %l5, 1, %l5
        bne     1b
        nop
        !std    %fq, [%l3]
        !jmpl   %l2, %g0
        !rett   %l2 + 4
        !subcc  %l0, %g0, %g0
        !be     _skip
        !nop
        
        addcc   %g0, %l0, %g0
        be      _skip           
        set     0xf07fffff, %l5
        and     %l3, %l5, %l3
        st      %l3, [%l4]
        ld      [%l4], %fsr      ! disable exceptions           
        set     grfpufq+4, %l5
        set     fpreex, %l6
2:      dec     %l7
        ld      [%l5], %l0
        st      %l0, [%l6]
        flush           
        nop; nop; nop; nop; nop;
        nop; nop; nop; nop; nop;        
        nop; nop; nop; nop; nop;
        nop; nop; nop; nop; nop;        
fpreex: .word 0
        subcc   %l7, %g0, %g0
        bne     2b
        add     %l5, 8, %l5
        st      %fsr, [%l4]
        ld      [%l4], %l3
        set     0x0f000000, %l5
        or      %l3, %l5, %l3
        st      %l3, [%l4]
        ld      [%l4], %fsr     ! enable exceptions
        jmpl    %l1, %g0
        rett    %l2             
        nop
_skip:
        jmpl    %l2, %g0
        rett    %l2 + 4 
        nop
        nop     
        
get_tbr:        
        retl
        mov %tbr, %o0                           
                
        .data
        .align 8
        .global tfsr, grfpufq
dw:     .word 0
        .word 0                         
        .word 0
        .word 0
        
zbuf:   .word 0
        .word 0         

dpbuf:  .word 0x3ff00000 
        .word 0x00000000
        .word 0x40080000 
        .word 0x00000000
        .word 0x3ff00000 
        .word 0x40000000
        .word 0x0        
        .word 0x0
spbuf:  .word 0x3f800000
        .word 0x40400000
        .word 0x0
        .word 0x0

tfsr:   .word 0
        .word 0
grfpufq:
        .word 0
        .word 0
        .word 0
        .word 0

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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