diff options
Diffstat (limited to 'c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.S')
-rw-r--r-- | c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.S | 164 |
1 files changed, 0 insertions, 164 deletions
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.S b/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.S deleted file mode 100644 index a618aac311..0000000000 --- a/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.S +++ /dev/null @@ -1,164 +0,0 @@ -#include "fpsp-namespace.h" -// -// -// smovecr.sa 3.1 12/10/90 -// -// The entry point sMOVECR returns the constant at the -// offset given in the instruction field. -// -// Input: An offset in the instruction word. -// -// Output: The constant rounded to the user's rounding -// mode unchecked for overflow. -// -// Modified: fp0. -// -// -// Copyright (C) Motorola, Inc. 1990 -// All Rights Reserved -// -// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA -// The copyright notice above does not evidence any -// actual or intended publication of such source code. - -//SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package - - |section 8 - -#include "fpsp.defs" - - |xref nrm_set - |xref round - |xref PIRN - |xref PIRZRM - |xref PIRP - |xref SMALRN - |xref SMALRZRM - |xref SMALRP - |xref BIGRN - |xref BIGRZRM - |xref BIGRP - -FZERO: .long 00000000 -// -// FMOVECR -// - .global smovcr -smovcr: - bfextu CMDREG1B(%a6){#9:#7},%d0 //get offset - bfextu USER_FPCR(%a6){#26:#2},%d1 //get rmode -// -// check range of offset -// - tstb %d0 //if zero, offset is to pi - beqs PI_TBL //it is pi - cmpib #0x0a,%d0 //check range $01 - $0a - bles Z_VAL //if in this range, return zero - cmpib #0x0e,%d0 //check range $0b - $0e - bles SM_TBL //valid constants in this range - cmpib #0x2f,%d0 //check range $10 - $2f - bles Z_VAL //if in this range, return zero - cmpib #0x3f,%d0 //check range $30 - $3f - ble BG_TBL //valid constants in this range -Z_VAL: - fmoves FZERO,%fp0 - rts -PI_TBL: - tstb %d1 //offset is zero, check for rmode - beqs PI_RN //if zero, rn mode - cmpib #0x3,%d1 //check for rp - beqs PI_RP //if 3, rp mode -PI_RZRM: - leal PIRZRM,%a0 //rmode is rz or rm, load PIRZRM in a0 - bra set_finx -PI_RN: - leal PIRN,%a0 //rmode is rn, load PIRN in a0 - bra set_finx -PI_RP: - leal PIRP,%a0 //rmode is rp, load PIRP in a0 - bra set_finx -SM_TBL: - subil #0xb,%d0 //make offset in 0 - 4 range - tstb %d1 //check for rmode - beqs SM_RN //if zero, rn mode - cmpib #0x3,%d1 //check for rp - beqs SM_RP //if 3, rp mode -SM_RZRM: - leal SMALRZRM,%a0 //rmode is rz or rm, load SMRZRM in a0 - cmpib #0x2,%d0 //check if result is inex - ble set_finx //if 0 - 2, it is inexact - bra no_finx //if 3, it is exact -SM_RN: - leal SMALRN,%a0 //rmode is rn, load SMRN in a0 - cmpib #0x2,%d0 //check if result is inex - ble set_finx //if 0 - 2, it is inexact - bra no_finx //if 3, it is exact -SM_RP: - leal SMALRP,%a0 //rmode is rp, load SMRP in a0 - cmpib #0x2,%d0 //check if result is inex - ble set_finx //if 0 - 2, it is inexact - bra no_finx //if 3, it is exact -BG_TBL: - subil #0x30,%d0 //make offset in 0 - f range - tstb %d1 //check for rmode - beqs BG_RN //if zero, rn mode - cmpib #0x3,%d1 //check for rp - beqs BG_RP //if 3, rp mode -BG_RZRM: - leal BIGRZRM,%a0 //rmode is rz or rm, load BGRZRM in a0 - cmpib #0x1,%d0 //check if result is inex - ble set_finx //if 0 - 1, it is inexact - cmpib #0x7,%d0 //second check - ble no_finx //if 0 - 7, it is exact - bra set_finx //if 8 - f, it is inexact -BG_RN: - leal BIGRN,%a0 //rmode is rn, load BGRN in a0 - cmpib #0x1,%d0 //check if result is inex - ble set_finx //if 0 - 1, it is inexact - cmpib #0x7,%d0 //second check - ble no_finx //if 0 - 7, it is exact - bra set_finx //if 8 - f, it is inexact -BG_RP: - leal BIGRP,%a0 //rmode is rp, load SMRP in a0 - cmpib #0x1,%d0 //check if result is inex - ble set_finx //if 0 - 1, it is inexact - cmpib #0x7,%d0 //second check - ble no_finx //if 0 - 7, it is exact -// bra set_finx ;if 8 - f, it is inexact -set_finx: - orl #inx2a_mask,USER_FPSR(%a6) //set inex2/ainex -no_finx: - mulul #12,%d0 //use offset to point into tables - movel %d1,L_SCR1(%a6) //load mode for round call - bfextu USER_FPCR(%a6){#24:#2},%d1 //get precision - tstl %d1 //check if extended precision -// -// Precision is extended -// - bnes not_ext //if extended, do not call round - fmovemx (%a0,%d0),%fp0-%fp0 //return result in fp0 - rts -// -// Precision is single or double -// -not_ext: - swap %d1 //rnd prec in upper word of d1 - addl L_SCR1(%a6),%d1 //merge rmode in low word of d1 - movel (%a0,%d0),FP_SCR1(%a6) //load first word to temp storage - movel 4(%a0,%d0),FP_SCR1+4(%a6) //load second word - movel 8(%a0,%d0),FP_SCR1+8(%a6) //load third word - clrl %d0 //clear g,r,s - lea FP_SCR1(%a6),%a0 - btstb #sign_bit,LOCAL_EX(%a0) - sne LOCAL_SGN(%a0) //convert to internal ext. format - - bsr round //go round the mantissa - - bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format - beqs fin_fcr - bsetb #sign_bit,LOCAL_EX(%a0) -fin_fcr: - fmovemx (%a0),%fp0-%fp0 - rts - - |end |