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/trunk/src/runtime/mach-dep/ALPHA32.prim.asm
ViewVC logotype

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

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

revision 8, Sun Jan 18 01:01:29 1998 UTC revision 223, Sat Apr 17 16:27:01 1999 UTC
# Line 503  Line 503 
503   */   */
504  ML_CODE_HDR(array_a)  ML_CODE_HDR(array_a)
505          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
506          ldl     ATMP1,0(STDARG)     /* atmp1 := length (tagged int) */  
507          sra     ATMP1,1             /* atmp1 := length (untagged int) */          ldl     ATMP1,0(STDARG)             /* tmp1 := length in words */
508          subq    ATMP1,SMALL_OBJ_SZW,ATMP3          sra     ATMP1,1,ATMP2               /* tmp2 := length (untagged) */
509          bgt     ATMP3,1f                    /* is this a small object? */          subl    ATMP2,SMALL_OBJ_SZW,ATMP3   /* is this a small object? */
510          sll     ATMP1,TAG_SHIFTW,ATMP3    /* build descriptor in atmp3 */          bgt     ATMP3,2f                    /* branch if large object */
511          or      ATMP3,MAKE_TAG(DTAG_array),ATMP3  
512            ldl     STDARG,4(STDARG)            /* initial value */
513            sll     ATMP2,TAG_SHIFTW,ATMP3      /* build descriptor in tmp3 */
514            or      ATMP3,MAKE_TAG(DTAG_arr_data),ATMP3
515          stl     ATMP3,0(ALLOCPTR)           /* store descriptor */          stl     ATMP3,0(ALLOCPTR)           /* store descriptor */
516          addq    ALLOCPTR,4                  /* allocptr++ */          addq    ALLOCPTR,4                  /* allocptr++ */
517          ldl     ATMP2,4(STDARG)     /* atmp2 := initial value */          mov     ALLOCPTR,ATMP3              /* array data ptr in tmp3 */
518          mov     ALLOCPTR,STDARG  1:
519          sll     ATMP1,2,ATMP1               /* atmp1 := length in bytes */          stl     STDARG,0(ALLOCPTR)          /* initialize array */
520          addq    ATMP1,ALLOCPTR      /* atmp1 is end of array */          subl    ATMP2, 1, ATMP2
521  2:                                          /* loop: */          addq    ALLOCPTR,4
522          stl     ATMP2,0(ALLOCPTR)               /* store next element */          bne     ATMP2,1b
523    
524            /* allocate array header */
525            mov     DESC_polyarr,ATMP2          /* descriptor in tmp2 */
526            stl     ATMP2,0(ALLOCPTR)           /* store descriptor */
527          addq    ALLOCPTR,4                      /* allocptr++ */          addq    ALLOCPTR,4                      /* allocptr++ */
528          subq    ALLOCPTR,ATMP1,ATMP4          mov     ALLOCPTR,STDARG             /* result = header addr */
529          bne     ATMP4,2b                        /* if (allocptr != end) goto loop */          stl     ATMP3, 0(ALLOCPTR)          /* store pointer to data */
530                                              /* end loop */          stl     ATMP1, 4(ALLOCPTR)
531            addq    ALLOCPTR,8
532          CONTINUE          CONTINUE
533    
534  1:      /* off-line allocation of big arrays */  2:      /* off-line allocation of big arrays */
535          mov     FUN_MASK,PTRTMP          mov     FUN_MASK,PTRTMP
536          mov     REQ_ALLOC_ARRAY,ATMP1          mov     REQ_ALLOC_ARRAY,ATMP1
537          br      set_request          br      set_request
# Line 533  Line 541 
541   */   */
542  ML_CODE_HDR(create_r_a)  ML_CODE_HDR(create_r_a)
543          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
544          sra     STDARG,1,ATMP1      /* atmp1 = length (untagged int) */  
545          sll     ATMP1,1,ATMP2               /* atmp2 = length in words */          sra     STDARG,1,ATMP2              /* atmp2 = length (untagged int) */
546            sll     ATMP2,1,ATMP2               /* atmp2 = length in words */
547          subl    ATMP2,SMALL_OBJ_SZW,ATMP3          subl    ATMP2,SMALL_OBJ_SZW,ATMP3
548          bgt     ATMP3,1f                    /* is this a small object? */          bgt     ATMP3,1f                    /* is this a small object? */
549          sll     ATMP1,TAG_SHIFTW,ATMP3    /* build descriptor in atmp3 */          /* allocate the data object */
550          or      ATMP3,MAKE_TAG(DTAG_realdarray),ATMP3          sll     ATMP2,TAG_SHIFTW,ATMP1      /* build data descriptor in tmp1 */
551            or      ATMP1, MAKE_TAG(DTAG_raw64),ATMP1
552  #ifdef ALIGN_REALDS  #ifdef ALIGN_REALDS
553          or      ALLOCPTR,4,ALLOCPTR         /* tag is unaligned, so that the */          or      ALLOCPTR,4,ALLOCPTR         /* tag is unaligned, so that the */
554                                              /* first element is 8-byte aligned */                                              /* first element is 8-byte aligned */
555  #endif  #endif
556          stl     ATMP3,0(ALLOCPTR)          stl     ATMP1,0(ALLOCPTR)           /* store the descriptor */
557          addq    ALLOCPTR,4,STDARG           /* pointer to new realarray */          addq    ALLOCPTR,4                  /* allocptr++ */
558          sll     ATMP2,2             /* atmp2 = length in bytes (no tag) */          mov     ALLOCPTR,ATMP3              /* tmp3 = data object */
559          addq    ATMP2,4             /* plus tag */          sll     ATMP2, 2, ATMP2             /* tmp2 = length in bytes */
560          addq    ALLOCPTR,ATMP2      /* allocptr += total length */          addq    ALLOCPTR, ATMP2,ALLOCPTR    /* allocptr += length */
561            /* allocate the header object */
562            mov     DESC_real64arr,ATMP1
563            stl     ATMP1,0(ALLOCPTR)           /* header descriptor */
564            addq    ALLOCPTR,4                  /* allocptr++ */
565            stl     ATMP3,0(ALLOCPTR)           /* header data field */
566            stl     STDARG,4(ALLOCPTR)          /* header length field */
567            mov     ALLOCPTR,STDARG             /* stdarg = header object */
568            addq    ALLOCPTR,8
569          CONTINUE          CONTINUE
570    
571  1:      /* off-line allocation of big realarrays */  1:      /* off-line allocation of big realarrays */
# Line 560  Line 578 
578   */   */
579  ML_CODE_HDR(create_b_a)  ML_CODE_HDR(create_b_a)
580          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
581          sra     STDARG,1,ATMP1      /* atmp1 = length (untagged int) */  
582          addq    ATMP1,3,ATMP2               /* atmp2 = length in words */          sra     STDARG,1,ATMP2            /* atmp2 = length (untagged int) */
583            addq    ATMP2,3,ATMP2             /* atmp2 = length in words */
584          sra     ATMP2,2          sra     ATMP2,2
585          subq    ATMP2,SMALL_OBJ_SZW,ATMP3 /* is this a small object? */          subq    ATMP2,SMALL_OBJ_SZW,ATMP3 /* is this a small object? */
586          bgt     ATMP3,1f          bgt     ATMP3,1f
587          sll     ATMP1,TAG_SHIFTW,ATMP3    /* build descriptor in atmp3 */          /* allocate the data object */
588          or      ATMP3,MAKE_TAG(DTAG_bytearray),ATMP3          sll     ATMP2,TAG_SHIFTW,ATMP1    /* build descriptor in atmp1 */
589          stl     ATMP3,0(ALLOCPTR)          or      ATMP1,MAKE_TAG(DTAG_raw32),ATMP1
590          addq    ALLOCPTR,4,STDARG           /* pointer to new bytearray */          stl     ATMP1,0(ALLOCPTR)         /* store the data descriptor */
591          sll     ATMP2,2             /* atmp2 = length in bytes (no tag) */          addq    ALLOCPTR,4                /* allocptr++ */
592          addq    ATMP2,4             /* plus tag */          mov     ALLOCPTR,ATMP3            /* tmp3 = data object */
593            sll     ATMP2,2                   /* tmp2 = length in bytes */
594          addq    ALLOCPTR,ATMP2,ALLOCPTR  /* allocptr += total length */          addq    ALLOCPTR,ATMP2,ALLOCPTR  /* allocptr += total length */
595            /* allocate the header object */
596            mov     DESC_word8arr,ATMP1       /* header descriptor */
597            stl     ATMP1,0(ALLOCPTR)
598            addq    ALLOCPTR,4                /* allocptr++ */
599            stl     ATMP3,0(ALLOCPTR)         /* header data field */
600            stl     STDARG,4(ALLOCPTR)        /* header length field */
601            mov     ALLOCPTR,STDARG           /* stdarg = header object */
602            addq    ALLOCPTR,8                /* allocptr += 2 */
603          CONTINUE          CONTINUE
604  1:                                      /* off-line allocation of big bytearrays */  1:                                      /* off-line allocation of big bytearrays */
605          mov     FUN_MASK,PTRTMP          mov     FUN_MASK,PTRTMP
# Line 583  Line 611 
611   */   */
612  ML_CODE_HDR(create_s_a)  ML_CODE_HDR(create_s_a)
613          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
614          sra     STDARG,1,ATMP1      /* atmp1 = length (untagged int) */  
615          addq    ATMP1,4,ATMP2               /* atmp2 = length in words */          sra     STDARG,1,ATMP2                  /* tmp2 = length (untagged int) */
616            addq    ATMP2,4,ATMP2                   /* atmp2 = length in words */
617          sra     ATMP2,2          sra     ATMP2,2
618          subq    ATMP2,SMALL_OBJ_SZW,ATMP3          subq    ATMP2,SMALL_OBJ_SZW,ATMP3
619          bgt     ATMP3,1f                    /* is this a small object? */          bgt     ATMP3,1f                    /* is this a small object? */
620          sll     ATMP1,TAG_SHIFTW,ATMP3    /* build descriptor in atmp3 */  
621          or      ATMP3,MAKE_TAG(DTAG_string),ATMP3          sll     ATMP2,TAG_SHIFTW,ATMP1          /* build descriptor in atmp3 */
622          stl     ATMP3,0(ALLOCPTR)          or      ATMP1,MAKE_TAG(DTAG_raw32),ATMP1
623          addq    ALLOCPTR,4,STDARG           /* pointer to new string */          stl     ATMP1,0(ALLOCPTR)               /* store the data descriptor */
624          sll     ATMP2,2             /* atmp2 = length in bytes (no tag) */          addq    ALLOCPTR,4                      /* allocptr++ */
625          addq    ATMP2,4             /* plus tag */          mov     ALLOCPTR,ATMP3                  /* tmp3 = data object */
626          addq    ALLOCPTR,ATMP2      /* allocptr += total length */          sll     ATMP2,2                         /* tmp2 = length in bytes */
627            addq    ALLOCPTR,ATMP2,ALLOCPTR         /* allocptr += total length */
628          stl     zero,-4(ALLOCPTR)           /* store zero in last word */          stl     zero,-4(ALLOCPTR)           /* store zero in last word */
629            /* Allocate the header object */
630            mov     DESC_string, ATMP1              /* header descriptor */
631            stl     ATMP1,0(ALLOCPTR)
632            addq    ALLOCPTR,4                      /* allocptr++ */
633            stl     ATMP3,0(ALLOCPTR)               /* header data field */
634            stl     STDARG,4(ALLOCPTR)              /* heder length field */
635            mov     ALLOCPTR,STDARG                 /* stdarg = header object */
636            addq    ALLOCPTR,8
637          CONTINUE          CONTINUE
638  1:                                      /* off-line allocation of big strings */  1:                                      /* off-line allocation of big strings */
639          mov     FUN_MASK,PTRTMP          mov     FUN_MASK,PTRTMP
# Line 608  Line 646 
646   */   */
647  ML_CODE_HDR(create_v_a)  ML_CODE_HDR(create_v_a)
648          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
649          ldl     ATMP1,0(STDARG)     /* atmp1 := length (tagged int) */  
650          sra     ATMP1,1             /* atmp1 := length (untagged) */          ldl     ATMP1,0(STDARG)         /* tmp1 := length (tagged int) */
651          subq    ATMP1,SMALL_OBJ_SZW,ATMP2          sra     ATMP1,1,ATMP2           /* tmp2 := length (untagged) */
652          bgt     ATMP2,1f            /* is this a small object? */          subq    ATMP2,SMALL_OBJ_SZW,ATMP3
653          sll     ATMP1,TAG_SHIFTW,ATMP2    /* build descriptor in atmp2 */          bgt     ATMP3,1f                /* is this a small object? */
654          or      ATMP2,MAKE_TAG(DTAG_vector),ATMP2  
655            sll     ATMP2,TAG_SHIFTW,ATMP2  /* build descriptor in tmp2 */
656            or      ATMP2,MAKE_TAG(DTAG_vec_data),ATMP2
657          stl     ATMP2,0(ALLOCPTR)           /* store descriptor */          stl     ATMP2,0(ALLOCPTR)           /* store descriptor */
658          addq    ALLOCPTR,4                  /* allocptr++ */          addq    ALLOCPTR,4                  /* allocptr++ */
659          ldl     ATMP2,4(STDARG)     /* atmp2 := list */          ldl     ATMP2,4(STDARG)     /* atmp2 := list */
660          mov     ALLOCPTR,STDARG     /* stdarg := vector */          mov     ALLOCPTR,STDARG     /* stdarg := vector */
         mov     ML_nil,ATMP3  
661  2:                                          /* loop: */  2:                                          /* loop: */
662          ldl     ATMP1,0(ATMP2)          /* atmp1 := hd(atmp2) */          ldl     ATMP3,0(ATMP2)          /* tmp3 := hd(tmp2) */
663          ldl     ATMP2,4(ATMP2)          /* atmp2 := tl(atmp2) */          ldl     ATMP2,4(ATMP2)          /* tmp2 := tl(tmp2) */
664          stl     ATMP1,0(ALLOCPTR)               /* store word in vector */          stl     ATMP3,0(ALLOCPTR)       /* store word in vector */
665          addq    ALLOCPTR,4                      /* allocptr++ */          addq    ALLOCPTR,4              /* allocptr++ */
666          subq    ATMP2,ATMP3,ATMP4          cmpeq   ATMP2,ML_nil,ATMP3      /* tmp3 := 1 if tmp2=ML_nil */
667          bne     ATMP4,2b                        /* if (atmp2 <> nil) goto loop */          beq     ATMP3, 2b
668                                              /* end loop */         /* allocate header object */
669            mov     DESC_polyvec,ATMP3      /* descriptor in tmp3 */
670            stl     ATMP3,0(ALLOCPTR)       /* store descriptor */
671            addq    ALLOCPTR,4              /* allocptr++ */
672            stl     STDARG,0(ALLOCPTR)      /* header data field */
673            stl     ATMP1,4(ALLOCPTR)       /* header length */
674            mov     ALLOCPTR, STDARG        /* result = header object */
675            addq    ALLOCPTR, 8             /* allocptr += 2 */
676          CONTINUE          CONTINUE
677    
678  1:      /* off-line allocation for large vectors */  1:      /* off-line allocation for large vectors */

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

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