Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/branches/SMLNJ/src/runtime/mach-dep/ALPHA32.prim.asm
ViewVC logotype

Diff of /sml/branches/SMLNJ/src/runtime/mach-dep/ALPHA32.prim.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3, Sat Oct 4 23:33:46 1997 UTC revision 8, Sun Jan 18 01:01:29 1998 UTC
# Line 639  Line 639 
639   *      OVERFLOW/UNDERFLOW - (add,div,sub,mul) as appropriate   *      OVERFLOW/UNDERFLOW - (add,div,sub,mul) as appropriate
640   *   *
641   * floor raises integer overflow if the float is out of 32-bit range,   * floor raises integer overflow if the float is out of 32-bit range,
642   * so the float is tested before conversion, to make sure it is in (31-bit)   * Does not check for out-of-range ;  it's up to the ML code to do that first. */
  * range */  
643  #ifdef NEW_FLOOR  #ifdef NEW_FLOOR
644                  DATA                  DATA
645                  .align 3                  .align 3
 floor_MAXINT:   .t_floating  1073741823.0  
 floor_MININT:   .t_floating -1073741824.0  
646  floor_MAXFLOAT: .quad 0x4330080000000000  floor_MAXFLOAT: .quad 0x4330080000000000
 ovfl_MAXINT: .long 0x7fffffff  
647    
648                  .text                  .text
649    
# Line 655  Line 651 
651                                          /* check for overflow */                                          /* check for overflow */
652          ldgp    gp, 0(STDLINK)          ldgp    gp, 0(STDLINK)
653          ldt     $f0, 0(STDARG)          ldt     $f0, 0(STDARG)
         ldt     $f1, floor_MAXINT  
         cmptle  $f0, $f1, $f1           /* f > maxint then overflow */  
         fbeq    $f1, floor_overflow  
         ldt     $f1, floor_MININT  
         cmptlt  $f0, $f1, $f1           /* f < minint then overflow */  
         fbne    $f1, floor_overflow  
654    
655          subq    $30, 16, $30            /* allocate stack space */          subq    $30, 16, $30            /* allocate stack space */
656                                  /* Do floor; neat thing is that this works                                  /* Do floor; neat thing is that this works
# Line 676  Line 666 
666          addq    $30, 16, $30          addq    $30, 16, $30
667          CONTINUE          CONTINUE
668    
 floor_overflow:  
         ldl     ATMP1, ovfl_MAXINT  
         addlv   ATMP1, ATMP1, ATMP1  
         trapb  
669  #else /* !NEW_FLOOR */  #else /* !NEW_FLOOR */
670                  DATA                  DATA
671                  .align 3                  .align 3
 floor_MAXINT:   .t_floating  1073741823.0  
 floor_MININT:   .t_floating -1073741824.0  
672  floor_HALF:     .t_floating  0.5  floor_HALF:     .t_floating  0.5
 ovfl_MAXINT: .long 0x7fffffff  
673    
674                  .text                  .text
675    
# Line 697  Line 680 
680          fblt    $f0, floor_negative_arg          fblt    $f0, floor_negative_arg
681    
682  floor_positive_arg:  floor_positive_arg:
                                         /* check for overflow */  
         ldt     $f1, floor_MAXINT  
         cmptle  $f0, $f1, $f1           /* f > maxint then overflow */  
         fbeq    $f1, floor_overflow  
   
683          cvttqc  $f0, $f1          cvttqc  $f0, $f1
684          stt     $f1, 0($30)          stt     $f1, 0($30)
685          ldl     ATMP1, 0($30)          ldl     ATMP1, 0($30)
# Line 711  Line 689 
689          addq    $30, 16, $30          addq    $30, 16, $30
690          CONTINUE          CONTINUE
691    
 /*  Alternative positive argument code - saves a load and compare.  
   
         cvttqvc $f0, $f1  
         cvtqlv  $f1, $f1  
         sts     $f1, 0($30)  
         ldl     ATMP1, 0($30)  
         addlv   ATMP1, ATMP1, ATMP1  
         addl    ATMP1, 1, STDARG  
   
         addq    $30, 16, $30  
         CONTINUE  
 */  
692    
693  floor_negative_arg:  floor_negative_arg:
                                         /* check for underflow */  
         ldt     $f1, floor_MININT  
         cmptlt  $f0, $f1, $f1           /* f < minint then overflow */  
         fbne    $f1, floor_overflow  
694    
695          /* cvttqm (x) = cvttq (2*x - 0.5) / 2 */          /* cvttqm (x) = cvttq (2*x - 0.5) / 2 */
696          /* cvttq (x-0.5) loses for odd integers which IEEE round to evens */          /* cvttq (x-0.5) loses for odd integers which IEEE round to evens */
# Line 745  Line 707 
707          addq    $30, 16, $30          addq    $30, 16, $30
708          CONTINUE          CONTINUE
709    
 floor_overflow:  
         addq    $30, 16, $30  
         ldl     ATMP1, ovfl_MAXINT  
         addlv   ATMP1, ATMP1, ATMP1  
         trapb  
710  #endif  #endif
711    
712    

Legend:
Removed from v.3  
changed lines
  Added in v.8

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0