11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| x_fline.sa 3.3 1/10/91 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| fpsp_fline --- FPSP handler for fline exception 51da177e4SLinus Torvalds| 61da177e4SLinus Torvalds| First determine if the exception is one of the unimplemented 71da177e4SLinus Torvalds| floating point instructions. If so, let fpsp_unimp handle it. 81da177e4SLinus Torvalds| Next, determine if the instruction is an fmovecr with a non-zero 91da177e4SLinus Torvalds| <ea> field. If so, handle here and return. Otherwise, it 101da177e4SLinus Torvalds| must be a real F-line exception. 111da177e4SLinus Torvalds| 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds| Copyright (C) Motorola, Inc. 1990 141da177e4SLinus Torvalds| All Rights Reserved 151da177e4SLinus Torvalds| 16e00d82d0SMatt Waddel| For details on the license for this file, please see the 17e00d82d0SMatt Waddel| file, README, in this same directory. 181da177e4SLinus Torvalds 191da177e4SLinus TorvaldsX_FLINE: |idnt 2,1 | Motorola 040 Floating Point Software Package 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds |section 8 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds#include "fpsp.h" 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds |xref real_fline 261da177e4SLinus Torvalds |xref fpsp_unimp 271da177e4SLinus Torvalds |xref uni_2 281da177e4SLinus Torvalds |xref mem_read 291da177e4SLinus Torvalds |xref fpsp_fmt_error 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds .global fpsp_fline 321da177e4SLinus Torvaldsfpsp_fline: 331da177e4SLinus Torvalds| 341da177e4SLinus Torvalds| check for unimplemented vector first. Use EXC_VEC-4 because 351da177e4SLinus Torvalds| the equate is valid only after a 'link a6' has pushed one more 361da177e4SLinus Torvalds| long onto the stack. 371da177e4SLinus Torvalds| 381da177e4SLinus Torvalds cmpw #UNIMP_VEC,EXC_VEC-4(%a7) 391da177e4SLinus Torvalds beql fpsp_unimp 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds| 421da177e4SLinus Torvalds| fmovecr with non-zero <ea> handling here 431da177e4SLinus Torvalds| 441da177e4SLinus Torvalds subl #4,%a7 |4 accounts for 2-word difference 451da177e4SLinus Torvalds| ;between six word frame (unimp) and 461da177e4SLinus Torvalds| ;four word frame 471da177e4SLinus Torvalds link %a6,#-LOCAL_SIZE 481da177e4SLinus Torvalds fsave -(%a7) 491da177e4SLinus Torvalds moveml %d0-%d1/%a0-%a1,USER_DA(%a6) 501da177e4SLinus Torvalds moveal EXC_PC+4(%a6),%a0 |get address of fline instruction 511da177e4SLinus Torvalds leal L_SCR1(%a6),%a1 |use L_SCR1 as scratch 521da177e4SLinus Torvalds movel #4,%d0 531da177e4SLinus Torvalds addl #4,%a6 |to offset the sub.l #4,a7 above so that 541da177e4SLinus Torvalds| ;a6 can point correctly to the stack frame 551da177e4SLinus Torvalds| ;before branching to mem_read 561da177e4SLinus Torvalds bsrl mem_read 571da177e4SLinus Torvalds subl #4,%a6 581da177e4SLinus Torvalds movel L_SCR1(%a6),%d0 |d0 contains the fline and command word 591da177e4SLinus Torvalds bfextu %d0{#4:#3},%d1 |extract coprocessor id 601da177e4SLinus Torvalds cmpib #1,%d1 |check if cpid=1 611da177e4SLinus Torvalds bne not_mvcr |exit if not 621da177e4SLinus Torvalds bfextu %d0{#16:#6},%d1 631da177e4SLinus Torvalds cmpib #0x17,%d1 |check if it is an FMOVECR encoding 641da177e4SLinus Torvalds bne not_mvcr 651da177e4SLinus Torvalds| ;if an FMOVECR instruction, fix stack 661da177e4SLinus Torvalds| ;and go to FPSP_UNIMP 671da177e4SLinus Torvaldsfix_stack: 681da177e4SLinus Torvalds cmpib #VER_40,(%a7) |test for orig unimp frame 691da177e4SLinus Torvalds bnes ck_rev 701da177e4SLinus Torvalds subl #UNIMP_40_SIZE-4,%a7 |emulate an orig fsave 711da177e4SLinus Torvalds moveb #VER_40,(%a7) 721da177e4SLinus Torvalds moveb #UNIMP_40_SIZE-4,1(%a7) 731da177e4SLinus Torvalds clrw 2(%a7) 741da177e4SLinus Torvalds bras fix_con 751da177e4SLinus Torvaldsck_rev: 761da177e4SLinus Torvalds cmpib #VER_41,(%a7) |test for rev unimp frame 771da177e4SLinus Torvalds bnel fpsp_fmt_error |if not $40 or $41, exit with error 781da177e4SLinus Torvalds subl #UNIMP_41_SIZE-4,%a7 |emulate a rev fsave 791da177e4SLinus Torvalds moveb #VER_41,(%a7) 801da177e4SLinus Torvalds moveb #UNIMP_41_SIZE-4,1(%a7) 811da177e4SLinus Torvalds clrw 2(%a7) 821da177e4SLinus Torvaldsfix_con: 831da177e4SLinus Torvalds movew EXC_SR+4(%a6),EXC_SR(%a6) |move stacked sr to new position 841da177e4SLinus Torvalds movel EXC_PC+4(%a6),EXC_PC(%a6) |move stacked pc to new position 851da177e4SLinus Torvalds fmovel EXC_PC(%a6),%FPIAR |point FPIAR to fline inst 861da177e4SLinus Torvalds movel #4,%d1 871da177e4SLinus Torvalds addl %d1,EXC_PC(%a6) |increment stacked pc value to next inst 881da177e4SLinus Torvalds movew #0x202c,EXC_VEC(%a6) |reformat vector to unimp 891da177e4SLinus Torvalds clrl EXC_EA(%a6) |clear the EXC_EA field 901da177e4SLinus Torvalds movew %d0,CMDREG1B(%a6) |move the lower word into CMDREG1B 911da177e4SLinus Torvalds clrl E_BYTE(%a6) 921da177e4SLinus Torvalds bsetb #UFLAG,T_BYTE(%a6) 931da177e4SLinus Torvalds moveml USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers 941da177e4SLinus Torvalds bral uni_2 951da177e4SLinus Torvalds 961da177e4SLinus Torvaldsnot_mvcr: 971da177e4SLinus Torvalds moveml USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers 981da177e4SLinus Torvalds frestore (%a7)+ 991da177e4SLinus Torvalds unlk %a6 1001da177e4SLinus Torvalds addl #4,%a7 1011da177e4SLinus Torvalds bral real_fline 1021da177e4SLinus Torvalds 1031da177e4SLinus Torvalds |end 104