root/arch/m68k/fpsp040/smovecr.S

/* [previous][next][first][last][top][bottom][index][help] */
   1 |
   2 |       smovecr.sa 3.1 12/10/90
   3 |
   4 |       The entry point sMOVECR returns the constant at the
   5 |       offset given in the instruction field.
   6 |
   7 |       Input: An offset in the instruction word.
   8 |
   9 |       Output: The constant rounded to the user's rounding
  10 |               mode unchecked for overflow.
  11 |
  12 |       Modified: fp0.
  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 
  22 |SMOVECR        idnt    2,1 | Motorola 040 Floating Point Software Package
  23 
  24         |section 8
  25 
  26         .include "fpsp.h"
  27 
  28         |xref   nrm_set
  29         |xref   round
  30         |xref   PIRN
  31         |xref   PIRZRM
  32         |xref   PIRP
  33         |xref   SMALRN
  34         |xref   SMALRZRM
  35         |xref   SMALRP
  36         |xref   BIGRN
  37         |xref   BIGRZRM
  38         |xref   BIGRP
  39 
  40 FZERO:  .long   00000000
  41 |
  42 |       FMOVECR 
  43 |
  44         .global smovcr
  45 smovcr:
  46         bfextu  CMDREG1B(%a6){#9:#7},%d0 |get offset
  47         bfextu  USER_FPCR(%a6){#26:#2},%d1 |get rmode
  48 |
  49 | check range of offset
  50 |
  51         tstb    %d0             |if zero, offset is to pi
  52         beqs    PI_TBL          |it is pi
  53         cmpib   #0x0a,%d0               |check range $01 - $0a
  54         bles    Z_VAL           |if in this range, return zero
  55         cmpib   #0x0e,%d0               |check range $0b - $0e
  56         bles    SM_TBL          |valid constants in this range
  57         cmpib   #0x2f,%d0               |check range $10 - $2f
  58         bles    Z_VAL           |if in this range, return zero 
  59         cmpib   #0x3f,%d0               |check range $30 - $3f
  60         ble     BG_TBL          |valid constants in this range
  61 Z_VAL:
  62         fmoves  FZERO,%fp0
  63         rts
  64 PI_TBL:
  65         tstb    %d1             |offset is zero, check for rmode
  66         beqs    PI_RN           |if zero, rn mode
  67         cmpib   #0x3,%d1                |check for rp
  68         beqs    PI_RP           |if 3, rp mode
  69 PI_RZRM:
  70         leal    PIRZRM,%a0      |rmode is rz or rm, load PIRZRM in a0
  71         bra     set_finx
  72 PI_RN:
  73         leal    PIRN,%a0                |rmode is rn, load PIRN in a0
  74         bra     set_finx
  75 PI_RP:
  76         leal    PIRP,%a0                |rmode is rp, load PIRP in a0
  77         bra     set_finx
  78 SM_TBL:
  79         subil   #0xb,%d0                |make offset in 0 - 4 range
  80         tstb    %d1             |check for rmode
  81         beqs    SM_RN           |if zero, rn mode
  82         cmpib   #0x3,%d1                |check for rp
  83         beqs    SM_RP           |if 3, rp mode
  84 SM_RZRM:
  85         leal    SMALRZRM,%a0    |rmode is rz or rm, load SMRZRM in a0
  86         cmpib   #0x2,%d0                |check if result is inex
  87         ble     set_finx        |if 0 - 2, it is inexact
  88         bra     no_finx         |if 3, it is exact
  89 SM_RN:
  90         leal    SMALRN,%a0      |rmode is rn, load SMRN in a0
  91         cmpib   #0x2,%d0                |check if result is inex
  92         ble     set_finx        |if 0 - 2, it is inexact
  93         bra     no_finx         |if 3, it is exact
  94 SM_RP:
  95         leal    SMALRP,%a0      |rmode is rp, load SMRP in a0
  96         cmpib   #0x2,%d0                |check if result is inex
  97         ble     set_finx        |if 0 - 2, it is inexact
  98         bra     no_finx         |if 3, it is exact
  99 BG_TBL:
 100         subil   #0x30,%d0               |make offset in 0 - f range
 101         tstb    %d1             |check for rmode
 102         beqs    BG_RN           |if zero, rn mode
 103         cmpib   #0x3,%d1                |check for rp
 104         beqs    BG_RP           |if 3, rp mode
 105 BG_RZRM:
 106         leal    BIGRZRM,%a0     |rmode is rz or rm, load BGRZRM in a0
 107         cmpib   #0x1,%d0                |check if result is inex
 108         ble     set_finx        |if 0 - 1, it is inexact
 109         cmpib   #0x7,%d0                |second check
 110         ble     no_finx         |if 0 - 7, it is exact
 111         bra     set_finx        |if 8 - f, it is inexact
 112 BG_RN:
 113         leal    BIGRN,%a0       |rmode is rn, load BGRN in a0
 114         cmpib   #0x1,%d0                |check if result is inex
 115         ble     set_finx        |if 0 - 1, it is inexact
 116         cmpib   #0x7,%d0                |second check
 117         ble     no_finx         |if 0 - 7, it is exact
 118         bra     set_finx        |if 8 - f, it is inexact
 119 BG_RP:
 120         leal    BIGRP,%a0       |rmode is rp, load SMRP in a0
 121         cmpib   #0x1,%d0                |check if result is inex
 122         ble     set_finx        |if 0 - 1, it is inexact
 123         cmpib   #0x7,%d0                |second check
 124         ble     no_finx         |if 0 - 7, it is exact
 125 |       bra     set_finx        ;if 8 - f, it is inexact
 126 set_finx:
 127         orl     #inx2a_mask,USER_FPSR(%a6) |set inex2/ainex
 128 no_finx:
 129         mulul   #12,%d0                 |use offset to point into tables
 130         movel   %d1,L_SCR1(%a6)         |load mode for round call
 131         bfextu  USER_FPCR(%a6){#24:#2},%d1      |get precision
 132         tstl    %d1                     |check if extended precision
 133 |
 134 | Precision is extended
 135 |
 136         bnes    not_ext                 |if extended, do not call round
 137         fmovemx (%a0,%d0),%fp0-%fp0             |return result in fp0
 138         rts
 139 |
 140 | Precision is single or double
 141 |
 142 not_ext:
 143         swap    %d1                     |rnd prec in upper word of d1
 144         addl    L_SCR1(%a6),%d1         |merge rmode in low word of d1
 145         movel   (%a0,%d0),FP_SCR1(%a6)  |load first word to temp storage
 146         movel   4(%a0,%d0),FP_SCR1+4(%a6)       |load second word
 147         movel   8(%a0,%d0),FP_SCR1+8(%a6)       |load third word
 148         clrl    %d0                     |clear g,r,s
 149         lea     FP_SCR1(%a6),%a0
 150         btstb   #sign_bit,LOCAL_EX(%a0)
 151         sne     LOCAL_SGN(%a0)          |convert to internal ext. format
 152         
 153         bsr     round                   |go round the mantissa
 154 
 155         bfclr   LOCAL_SGN(%a0){#0:#8}   |convert back to IEEE ext format
 156         beqs    fin_fcr
 157         bsetb   #sign_bit,LOCAL_EX(%a0)
 158 fin_fcr:
 159         fmovemx (%a0),%fp0-%fp0
 160         rts
 161 
 162         |end

/* [previous][next][first][last][top][bottom][index][help] */