11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| x_snan.sa 3.3 7/1/91 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| fpsp_snan --- FPSP handler for signalling NAN exception 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| SNAN for float -> integer conversions (integer conversion of 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| an SNAN) is a non-maskable run-time exception. 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| For trap disabled the 040 does the following: 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| If the dest data format is s, d, or x, then the SNAN bit in the NAN 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| is set to one and the resulting non-signaling NAN (truncated if 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| necessary) is transferred to the dest. If the dest format is b, w, 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| or l, then garbage is written to the dest (actually the upper 32 bits 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| of the mantissa are sent to the integer unit). 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| For trap enabled the 040 does the following: 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| If the inst is move_out, then the results are the same as for trap 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| disabled with the exception posted. If the instruction is not move_ 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| out, the dest. is not modified, and the exception is posted. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Copyright (C) Motorola, Inc. 1990 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| All Rights Reserved 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 25e00d82d07fb112446586d225763d3572e64b7abfMatt Waddel| For details on the license for this file, please see the 26e00d82d07fb112446586d225763d3572e64b7abfMatt Waddel| file, README, in this same directory. 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsX_SNAN: |idnt 2,1 | Motorola 040 Floating Point Software Package 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |section 8 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "fpsp.h" 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref get_fline 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref mem_write 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref real_snan 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref real_inex 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref fpsp_done 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |xref reg_dest 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .global fpsp_snan 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsfpsp_snan: 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds link %a6,#-LOCAL_SIZE 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fsave -(%a7) 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveml %d0-%d1/%a0-%a1,USER_DA(%a6) 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmovemx %fp0-%fp3,USER_FP0(%a6) 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6) 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Check if trap enabled 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds btstb #snan_bit,FPCR_ENABLE(%a6) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes ena |If enabled, then branch 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl move_out |else SNAN disabled 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| It is possible to have an inex1 exception with the 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| snan. If the inex enable bit is set in the FPCR, and either 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| inex2 or inex1 occurred, we must clean up and branch to the 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| real inex handler. 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsck_inex: 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb FPCR_ENABLE(%a6),%d0 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds andb FPSR_EXCEPT(%a6),%d0 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds andib #0x3,%d0 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beq end_snan 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Inexact enabled and reported, and we must take an inexact exception. 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstake_inex: 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb #INEX_VEC,EXC_VEC+1(%a6) 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveml USER_DA(%a6),%d0-%d1/%a0-%a1 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmovemx USER_FP0(%a6),%fp0-%fp3 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frestore (%a7)+ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unlk %a6 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral real_inex 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| SNAN is enabled. Check if inst is move_out. 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Make any corrections to the 040 output as necessary. 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsena: 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds btstb #5,CMDREG1B(%a6) |if set, inst is move out 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beq not_out 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl move_out 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsreport_snan: 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb (%a7),VER_TMP(%a6) 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpib #VER_40,(%a7) |test for orig unimp frame 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes ck_rev 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveql #13,%d0 |need to zero 14 lwords 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bras rep_con 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsck_rev: 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveql #11,%d0 |need to zero 12 lwords 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsrep_con: 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds clrl (%a7) 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsloop1: 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds clrl -(%a7) |clear and dec a7 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbra %d0,loop1 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb VER_TMP(%a6),(%a7) |format a busy frame 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb #BUSY_SIZE-4,1(%a7) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel USER_FPSR(%a6),FPSR_SHADOW(%a6) 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds orl #sx_mask,E_BYTE(%a6) 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveml USER_DA(%a6),%d0-%d1/%a0-%a1 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmovemx USER_FP0(%a6),%fp0-%fp3 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frestore (%a7)+ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unlk %a6 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral real_snan 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Exit snan handler by expanding the unimp frame into a busy frame 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsend_snan: 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bclrb #E1,E_BYTE(%a6) 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb (%a7),VER_TMP(%a6) 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpib #VER_40,(%a7) |test for orig unimp frame 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes ck_rev2 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveql #13,%d0 |need to zero 14 lwords 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bras rep_con2 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsck_rev2: 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveql #11,%d0 |need to zero 12 lwords 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsrep_con2: 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds clrl (%a7) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsloop2: 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds clrl -(%a7) |clear and dec a7 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbra %d0,loop2 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb VER_TMP(%a6),(%a7) |format a busy frame 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveb #BUSY_SIZE-4,1(%a7) |write busy size 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel USER_FPSR(%a6),FPSR_SHADOW(%a6) 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds orl #sx_mask,E_BYTE(%a6) 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds moveml USER_DA(%a6),%d0-%d1/%a0-%a1 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmovemx USER_FP0(%a6),%fp0-%fp3 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds frestore (%a7)+ 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unlk %a6 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral fpsp_done 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Move_out 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmove_out: 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel EXC_EA(%a6),%a0 |get <ea> from exc frame 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bfextu CMDREG1B(%a6){#3:#3},%d0 |move rx field to d0{2:0} 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpil #0,%d0 |check for long 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs sto_long |branch if move_out long 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpil #4,%d0 |check for word 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs sto_word |branch if move_out word 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpil #6,%d0 |check for byte 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs sto_byte |branch if move_out byte 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Not byte, word or long 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rts 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Get the 32 most significant bits of etemp mantissa 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssto_long: 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel ETEMP_HI(%a6),%d1 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel #4,%d0 |load byte count 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Set signalling nan bit 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsetl #30,%d1 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Store to the users destination address 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tstl %a0 |check if <ea> is 0 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs wrt_dn |destination is a data register 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d1,-(%a7) |move the snan onto the stack 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a0,%a1 |load dest addr into a1 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a7,%a0 |load src addr of snan into a0 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl mem_write |write snan to user memory 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel (%a7)+,%d1 |clear off stack 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rts 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Get the 16 most significant bits of etemp mantissa 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssto_word: 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel ETEMP_HI(%a6),%d1 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel #2,%d0 |load byte count 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Set signalling nan bit 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsetl #30,%d1 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Store to the users destination address 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tstl %a0 |check if <ea> is 0 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs wrt_dn |destination is a data register 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d1,-(%a7) |move the snan onto the stack 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a0,%a1 |load dest addr into a1 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a7,%a0 |point to low word 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl mem_write |write snan to user memory 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel (%a7)+,%d1 |clear off stack 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rts 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Get the 8 most significant bits of etemp mantissa 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssto_byte: 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel ETEMP_HI(%a6),%d1 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel #1,%d0 |load byte count 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Set signalling nan bit 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsetl #30,%d1 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Store to the users destination address 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tstl %a0 |check if <ea> is 0 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs wrt_dn |destination is a data register 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d1,-(%a7) |move the snan onto the stack 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a0,%a1 |load dest addr into a1 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %a7,%a0 |point to source byte 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl mem_write |write snan to user memory 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel (%a7)+,%d1 |clear off stack 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rts 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| wrt_dn --- write to a data register 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| We get here with D1 containing the data to write and D0 the 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| number of bytes to write: 1=byte,2=word,4=long. 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswrt_dn: 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d1,L_SCR1(%a6) |data 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d0,-(%a7) |size 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsrl get_fline |returns fline word in d0 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel %d0,%d1 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds andil #0x7,%d1 |d1 now holds register number 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel (%sp)+,%d0 |get original size 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpil #4,%d0 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs wrt_long 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpil #2,%d0 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes wrt_byte 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswrt_word: 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds orl #0x8,%d1 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral reg_dest 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswrt_long: 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds orl #0x10,%d1 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral reg_dest 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswrt_byte: 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bral reg_dest 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| Check if it is a src nan or dst nan 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds| 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnot_out: 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movel DTAG(%a6),%d0 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bfextu %d0{#0:#3},%d0 |isolate dtag in lsbs 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cmpib #3,%d0 |check for nan in destination 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes issrc |destination nan has priority 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdst_nan: 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds btstb #6,FPTEMP_HI(%a6) |check if dest nan is an snan 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bnes issrc |no, so check source for snan 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movew FPTEMP_EX(%a6),%d0 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bras cont 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsissrc: 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds movew ETEMP_EX(%a6),%d0 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldscont: 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds btstl #15,%d0 |test for sign of snan 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds beqs clr_neg 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsetb #neg_bit,FPSR_CC(%a6) 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bra report_snan 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsclr_neg: 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bclrb #neg_bit,FPSR_CC(%a6) 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bra report_snan 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds |end 277