|
|
1.1 ! root 1: .data ! 2: .asciz "@(#)Faints.s 1.1 86/02/03 Copyr 1985 Sun Micro" ! 3: .even ! 4: .text ! 5: ! 6: | Copyright (c) 1985 by Sun Microsystems, Inc. ! 7: ! 8: #include "fpcrtdefs.h" ! 9: ! 10: /* ! 11: Faints: single precision round integral toward zero. ! 12: ! 13: */ ! 14: ! 15: RTENTRY(Farints) ! 16: movel d0,d1 | d1 gets (x). ! 17: bclr #31,d1 | d1 gets (abs(x)). ! 18: cmpl #0x3f800000,d1 ! 19: bges 2f | Branch if abs(x) >= 1.0. ! 20: andl #0x80000000,d0 | Isolate sign of x. ! 21: cmpl #0x3f000000,d1 ! 22: bles 6f | Branch if abs(x) =< 0.5. ! 23: orl #0x3f800000,d0 | Make signed 1.0. ! 24: 6: ! 25: jra Farintsdone ! 26: 2: ! 27: cmpl #0x4b000000,d1 ! 28: blts 3f | Branch if 1 <= |x| < 2**23. ! 29: Farintsbig: ! 30: cmpl #0x7f800000,d1 ! 31: bles Farintsdone | Branch if x is finite or infinity. ! 32: bset #22,d0 | Convert quiet to signalling. ! 33: bras Farintsdone ! 34: 3: ! 35: roll #8,d1 ! 36: roll #1,d1 ! 37: andw #0xff,d1 | d1 gets biased exponent. ! 38: subw #0x7f+22,d1 | d1 gets unbiased exponent - 22. ! 39: negw d1 | d1 gets 22-exp = bit number. ! 40: movel d2,a0 ! 41: clrl d2 ! 42: bset d1,d2 | Set round bit. ! 43: addl d2,d0 | Add round bit. ! 44: lsll #1,d2 | Make 2**0 bit. ! 45: subql #1,d2 | Fraction bit mask. ! 46: andl d0,d2 | d1 gets rounded fraction field. ! 47: bnes 2f | Branch if not ambiguous case. ! 48: addqw #1,d1 | Make bit number for 2**0. ! 49: bclr d1,d0 | Force round to even. ! 50: 2: ! 51: eorl d2,d0 | Clear fraction field. ! 52: Farintsrestored2: ! 53: movel a0,d2 ! 54: Farintsdone: ! 55: RET ! 56: ! 57: RTENTRY(Fanints) ! 58: movel d0,d1 | d1 gets (x). ! 59: bclr #31,d1 | d1 gets (abs(x)). ! 60: cmpl #0x3f800000,d1 ! 61: bges 2f | Branch if abs(x) >= 1.0. ! 62: andl #0x80000000,d0 | Isolate sign of x. ! 63: cmpl #0x3f000000,d1 ! 64: blts 6f | Branch if abs(x) < 0.5. ! 65: orl #0x3f800000,d0 | Make signed 1.0. ! 66: 6: ! 67: jra Farintsdone ! 68: 2: ! 69: cmpl #0x4b000000,d1 ! 70: bges Farintsbig | Branch if 1 <= |x| < 2**23. ! 71: roll #8,d1 ! 72: roll #1,d1 ! 73: andw #0xff,d1 | d1 gets biased exponent. ! 74: subw #0x7f+22,d1 | d1 gets unbiased exponent - 22. ! 75: negw d1 | d1 gets 22-exp = bit number. ! 76: movel d2,a0 ! 77: clrl d2 ! 78: bset d1,d2 | Set round bit. ! 79: addl d2,d0 | Add round bit. ! 80: lsll #1,d2 | Make 2**0 bit. ! 81: subql #1,d2 | Fraction bit mask. ! 82: notl d2 ! 83: andl d2,d0 ! 84: bras Farintsrestored2 ! 85: ! 86: RTENTRY(Faints) ! 87: movel d0,d1 | d1 gets (x). ! 88: bclr #31,d1 | d1 gets (abs(x)). ! 89: cmpl #0x3f800000,d1 ! 90: bges 2f | Branch if abs(x) >= 1.0. ! 91: andl #0x80000000,d0 | Isolate sign of x. ! 92: jra Farintsdone ! 93: 2: ! 94: cmpl #0x4b000000,d1 ! 95: jge Farintsbig | Branch if 1 <= |x| < 2**23. ! 96: roll #8,d1 ! 97: roll #1,d1 ! 98: andw #0xff,d1 | d1 gets biased exponent. ! 99: subw #0x7f+23,d1 | d1 gets unbiased exponent - 23. ! 100: negw d1 | d1 gets 23-exp = bit number. ! 101: movel d2,a0 ! 102: clrl d2 ! 103: bset d1,d2 | Set 2**0 bit. ! 104: subql #1,d2 | Fraction bit mask. ! 105: notl d2 ! 106: andl d2,d0 ! 107: jra Farintsrestored2 ! 108: ! 109: RTENTRY(Ffloors) ! 110: movel d0,sp@- | Save x. ! 111: jbsr Faints | d0 gets aint(x). ! 112: movel sp@+,d1 | d1 gets x. ! 113: bpls Ffloorsdone | Branch if x is positive. ! 114: cmpl d0,d1 ! 115: beqs Ffloorsdone | Return x if x = aint(x). ! 116: movel #0xbf800000,d1 | d1 gets -1. ! 117: jbsr Fadds | d0 gets aint(x)-1. ! 118: Ffloorsdone: ! 119: RET ! 120: ! 121: RTENTRY(Fceils) ! 122: movel d0,sp@- | Save x. ! 123: jbsr Faints | d0 gets aint(x). ! 124: movel sp@+,d1 | d1 gets x. ! 125: bmis Fceilsdone | Branch if x is negative. ! 126: cmpl d0,d1 ! 127: beqs Fceilsdone | Return x if x = aint(x). ! 128: movel #0x3f800000,d1 | d1 gets +1. ! 129: jbsr Fadds | d0 gets aint(x)+1. ! 130: Fceilsdone: ! 131: RET
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.