11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| x_unsupp.sa 3.3 7/1/91 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| fpsp_unsupp --- FPSP handler for unsupported data type exception 51da177e4SLinus Torvalds| 61da177e4SLinus Torvalds| Trap vector #55 (See table 8-1 Mc68030 User's manual). 71da177e4SLinus Torvalds| Invoked when the user program encounters a data format (packed) that 81da177e4SLinus Torvalds| hardware does not support or a data type (denormalized numbers or un- 91da177e4SLinus Torvalds| normalized numbers). 101da177e4SLinus Torvalds| Normalizes denorms and unnorms, unpacks packed numbers then stores 111da177e4SLinus Torvalds| them back into the machine to let the 040 finish the operation. 121da177e4SLinus Torvalds| 131da177e4SLinus Torvalds| Unsupp calls two routines: 141da177e4SLinus Torvalds| 1. get_op - gets the operand(s) 151da177e4SLinus Torvalds| 2. res_func - restore the function back into the 040 or 161da177e4SLinus Torvalds| if fmove.p fpm,<ea> then pack source (fpm) 171da177e4SLinus Torvalds| and store in users memory <ea>. 181da177e4SLinus Torvalds| 191da177e4SLinus Torvalds| Input: Long fsave stack frame 201da177e4SLinus Torvalds| 211da177e4SLinus Torvalds| 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds| Copyright (C) Motorola, Inc. 1990 241da177e4SLinus Torvalds| All Rights Reserved 251da177e4SLinus Torvalds| 26*e00d82d0SMatt Waddel| For details on the license for this file, please see the 27*e00d82d0SMatt Waddel| file, README, in this same directory. 281da177e4SLinus Torvalds 291da177e4SLinus TorvaldsX_UNSUPP: |idnt 2,1 | Motorola 040 Floating Point Software Package 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds |section 8 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds#include "fpsp.h" 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds |xref get_op 361da177e4SLinus Torvalds |xref res_func 371da177e4SLinus Torvalds |xref gen_except 381da177e4SLinus Torvalds |xref fpsp_fmt_error 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds .global fpsp_unsupp 411da177e4SLinus Torvaldsfpsp_unsupp: 421da177e4SLinus Torvalds| 431da177e4SLinus Torvalds link %a6,#-LOCAL_SIZE 441da177e4SLinus Torvalds fsave -(%a7) 451da177e4SLinus Torvalds moveml %d0-%d1/%a0-%a1,USER_DA(%a6) 461da177e4SLinus Torvalds fmovemx %fp0-%fp3,USER_FP0(%a6) 471da177e4SLinus Torvalds fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6) 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds moveb (%a7),VER_TMP(%a6) |save version number 511da177e4SLinus Torvalds moveb (%a7),%d0 |test for valid version num 521da177e4SLinus Torvalds andib #0xf0,%d0 |test for $4x 531da177e4SLinus Torvalds cmpib #VER_4,%d0 |must be $4x or exit 541da177e4SLinus Torvalds bnel fpsp_fmt_error 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds fmovel #0,%FPSR |clear all user status bits 571da177e4SLinus Torvalds fmovel #0,%FPCR |clear all user control bits 581da177e4SLinus Torvalds| 591da177e4SLinus Torvalds| The following lines are used to ensure that the FPSR 601da177e4SLinus Torvalds| exception byte and condition codes are clear before proceeding, 611da177e4SLinus Torvalds| except in the case of fmove, which leaves the cc's intact. 621da177e4SLinus Torvalds| 631da177e4SLinus Torvaldsunsupp_con: 641da177e4SLinus Torvalds movel USER_FPSR(%a6),%d1 651da177e4SLinus Torvalds btst #5,CMDREG1B(%a6) |looking for fmove out 661da177e4SLinus Torvalds bne fmove_con 671da177e4SLinus Torvalds andl #0xFF00FF,%d1 |clear all but aexcs and qbyte 681da177e4SLinus Torvalds bras end_fix 691da177e4SLinus Torvaldsfmove_con: 701da177e4SLinus Torvalds andl #0x0FFF40FF,%d1 |clear all but cc's, snan bit, aexcs, and qbyte 711da177e4SLinus Torvaldsend_fix: 721da177e4SLinus Torvalds movel %d1,USER_FPSR(%a6) 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds st UFLG_TMP(%a6) |set flag for unsupp data 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds bsrl get_op |everything okay, go get operand(s) 771da177e4SLinus Torvalds bsrl res_func |fix up stack frame so can restore it 781da177e4SLinus Torvalds clrl -(%a7) 791da177e4SLinus Torvalds moveb VER_TMP(%a6),(%a7) |move idle fmt word to top of stack 801da177e4SLinus Torvalds bral gen_except 811da177e4SLinus Torvalds| 821da177e4SLinus Torvalds |end 83