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/X86.prim.asm
ViewVC logotype

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

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

revision 28, Thu Mar 12 01:05:57 1998 UTC revision 29, Thu Mar 12 01:05:59 1998 UTC
# Line 172  Line 172 
172   1:;                                                                    \   1:;                                                                    \
173          jb      9f;                                                     \          jb      9f;                                                     \
174          lea     1b, temp;               /* temp holds resume address */ \          lea     1b, temp;               /* temp holds resume address */ \
175          movl    $maskval, mask;                                         \          movl    IMMED(maskval), mask;                                   \
176          jmp     via CSYM(saveregs);                                             \          jmp     via CSYM(saveregs);                                             \
177   9:   9:
178    
# Line 182  Line 182 
182    
183  ML_CODE_HDR(sigh_return_a)  ML_CODE_HDR(sigh_return_a)
184          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
185          movl    $REQ_SIG_RETURN, request_w          movl    IMMED(REQ_SIG_RETURN), request_w
186          movl    $RET_MASK, mask          movl    IMMED(RET_MASK), mask
187          jmp     CSYM(set_request)          jmp     CSYM(set_request)
188    
189  /* sigh_resume:  /* sigh_resume:
# Line 193  Line 193 
193    
194  ENTRY(sigh_resume)  ENTRY(sigh_resume)
195          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
196          movl    $REQ_SIG_RESUME, request_w          movl    IMMED(REQ_SIG_RESUME), request_w
197  /*      movl    $RET_MASK, mask  /*      movl    IMMED(RET_MASK), mask
198   */   */
199          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
200          jmp     CSYM(set_request)          jmp     CSYM(set_request)
201    
202  /* pollh_return_a:  /* pollh_return_a:
# Line 204  Line 204 
204   */   */
205  ML_CODE_HDR(pollh_return_a)  ML_CODE_HDR(pollh_return_a)
206          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
207          movl    $REQ_POLL_RETURN, request_w          movl    IMMED(REQ_POLL_RETURN), request_w
208          movl    $RET_MASK, mask          movl    IMMED(RET_MASK), mask
209          jmp     CSYM(set_request)          jmp     CSYM(set_request)
210    
211  /* pollh_resume:  /* pollh_resume:
# Line 213  Line 213 
213   */   */
214  ENTRY(pollh_resume)  ENTRY(pollh_resume)
215          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
216          movl    $REQ_POLL_RESUME, request_w          movl    IMMED(REQ_POLL_RESUME), request_w
217  /*      movl    $RET_MASK, mask  /*      movl    IMMED(RET_MASK), mask
218   */   */
219          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
220          jmp     CSYM(set_request)          jmp     CSYM(set_request)
221    
222  ML_CODE_HDR(handle_a)  ML_CODE_HDR(handle_a)
223          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
224          movl    $REQ_EXN, request_w          movl    IMMED(REQ_EXN), request_w
225          movl    $EXN_MASK, mask          movl    IMMED(EXN_MASK), mask
226          jmp     CSYM(set_request)          jmp     CSYM(set_request)
227    
228  ML_CODE_HDR(return_a)  ML_CODE_HDR(return_a)
229          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
230          movl    $REQ_RETURN, request_w          movl    IMMED(REQ_RETURN), request_w
231          movl    $RET_MASK, mask          movl    IMMED(RET_MASK), mask
232          jmp     CSYM(set_request)          jmp     CSYM(set_request)
233    
234  /* Request a fault.  The floating point coprocessor must be reset  /* Request a fault.  The floating point coprocessor must be reset
# Line 240  Line 240 
240  ENTRY(request_fault)  ENTRY(request_fault)
241          call    CSYM(FPEEnable)          /* Doesn't trash any general regs. */          call    CSYM(FPEEnable)          /* Doesn't trash any general regs. */
242          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
243          movl    $REQ_FAULT, request_w          movl    IMMED(REQ_FAULT), request_w
244          movl    $EXN_MASK, mask          movl    IMMED(EXN_MASK), mask
245          jmp     CSYM(set_request)          jmp     CSYM(set_request)
246    
247  /* bind_cfun : (string * string) -> c_function  /* bind_cfun : (string * string) -> c_function
# Line 249  Line 249 
249  ML_CODE_HDR(bind_cfun_a)  ML_CODE_HDR(bind_cfun_a)
250          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
251          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
252          movl    $REQ_BIND_CFUN, request_w          movl    IMMED(REQ_BIND_CFUN), request_w
253          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
254          jmp     CSYM(set_request)          jmp     CSYM(set_request)
255    
256  ML_CODE_HDR(build_literals_a)  ML_CODE_HDR(build_literals_a)
257          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
258          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
259          movl    $REQ_BUILD_LITERALS, request_w          movl    IMMED(REQ_BUILD_LITERALS), request_w
260          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
261          jmp     CSYM(set_request)          jmp     CSYM(set_request)
262    
263  ML_CODE_HDR(callc_a)  ML_CODE_HDR(callc_a)
264          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
265          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
266          movl    $REQ_CALLC, request_w          movl    IMMED(REQ_CALLC), request_w
267          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
268          /* fall into set_request */          /* fall into set_request */
269    
270  ENTRY(set_request)  ENTRY(set_request)
# Line 277  Line 277 
277  #define temp2 allocptr  #define temp2 allocptr
278          /* note that we have left ML code */          /* note that we have left ML code */
279          movl    VProcOffMSP(temp),temp2          movl    VProcOffMSP(temp),temp2
280          movl    $0, InMLOffVSP(temp2)          movl    IMMED(0), InMLOffVSP(temp2)
281    
282  #if (CALLEESAVE > 0)  #if (CALLEESAVE > 0)
283          movl    misc1, MiscRegOffMSP(0)(temp)          movl    misc1, MiscRegOffMSP(0)(temp)
# Line 330  Line 330 
330          movl    request_w,creturn          movl    request_w,creturn
331    
332          /* Pop the stack frame and return to run_ml(). */          /* Pop the stack frame and return to run_ml(). */
333          addl    $ML_FRAME_SIZE, %esp          addl    IMMED(ML_FRAME_SIZE), %esp
334          CALLEE_RESTORE          CALLEE_RESTORE
335          ret          ret
336    
# Line 351  Line 351 
351          /* check if polling enabled (PollFreq > 0) */          /* check if polling enabled (PollFreq > 0) */
352          lea     CSYM(_PollFreq0),pfreq          /* load contents of ref */          lea     CSYM(_PollFreq0),pfreq          /* load contents of ref */
353          movl    4(pfreq),pfreq          movl    4(pfreq),pfreq
354          shrl    $1,pfreq                        /* strip integer tag */          shrl    IMMED(1),pfreq                  /* strip integer tag */
355          jz      check_for_gc                    /* go check for real gc */          jz      check_for_gc                    /* go check for real gc */
356          cmpl    $0,InPollHandlerOffMSP(temp)    /* if we're in the handler */          cmpl    IMMED(0),InPollHandlerOffMSP(temp)    /* if we're in the handler */
357          jne     reset_limit                     /* ignore poll events */          jne     reset_limit                     /* ignore poll events */
358          lea     CSYM(_PollEvent0),tmpR          /* load contents of ref */          lea     CSYM(_PollEvent0),tmpR          /* load contents of ref */
359          movl    4(tmpR),tmpR          movl    4(tmpR),tmpR
360          shrl    $1,tmpR          shrl    IMMED(1),tmpR
361          jz      reset_limit                     /* check for poll event */          jz      reset_limit                     /* check for poll event */
362          /* event occurred, so set ml_pollHandlerPending */          /* event occurred, so set ml_pollHandlerPending */
363          movl    $1,PollPendingOffMSP(temp)          movl    IMMED(1),PollPendingOffMSP(temp)
364          jmp     do_gc           /* and handle event in the C runtime */          jmp     do_gc           /* and handle event in the C runtime */
365    
366  reset_limit:    /* reset limit ptr */  reset_limit:    /* reset limit ptr */
367          shll    $POLL_GRAIN_BITS,pfreq          /* mult by POLL_GRAIN_CPSI */          shll    IMMED(POLL_GRAIN_BITS),pfreq            /* mult by POLL_GRAIN_CPSI */
368          movl    allocptr,limitptr          movl    allocptr,limitptr
369          addl    pfreq,limitptr          addl    pfreq,limitptr
370  #undef  pfreq  #undef  pfreq
# Line 376  Line 376 
376          ja      ok_limit          ja      ok_limit
377          movl    tmpR,limitptr          movl    tmpR,limitptr
378  ok_limit:  ok_limit:
379          addl    $-4096,limitptr          addl    IMMED(-4096),limitptr
380          cmpl    limitptr,allocptr          cmpl    limitptr,allocptr
381          jge     do_gc                   /* gc *//* should be a common case */          jge     do_gc                   /* gc *//* should be a common case */
382          addl    $4096,limitptr          addl    IMMED(4096),limitptr
383          /* since a signal also sets limitptr == allocptr to force a trap, */          /* since a signal also sets limitptr == allocptr to force a trap, */
384          /* we need to disambiguate poll-events/signals here */          /* we need to disambiguate poll-events/signals here */
385  #define vsp     misc2  #define vsp     misc2
386          movl    $0,tmpR          movl    IMMED(0),tmpR
387          addl    PollPendingOffMSP(temp),tmpR          addl    PollPendingOffMSP(temp),tmpR
388          movl    VProcOffMSP(temp),vsp          movl    VProcOffMSP(temp),vsp
389          addl    NPendingOffVSP(vsp),tmpR          addl    NPendingOffVSP(vsp),tmpR
# Line 419  Line 419 
419    
420          /* note that we have left ML code */          /* note that we have left ML code */
421          movl    VProcOffMSP(temp),temp2          movl    VProcOffMSP(temp),temp2
422          movl    $0, InMLOffVSP(temp2)          movl    IMMED(0), InMLOffVSP(temp2)
423    
424          /* vregs */          /* vregs */
425  #ifdef VREGS  #ifdef VREGS
# Line 453  Line 453 
453  #undef  temp2  #undef  temp2
454    
455          /* Pop the stack frame and return to run_ml(). */          /* Pop the stack frame and return to run_ml(). */
456          movl    $REQ_GC,creturn          movl    IMMED(REQ_GC),creturn
457          addl    $ML_FRAME_SIZE, %esp          addl    IMMED(ML_FRAME_SIZE), %esp
458          CALLEE_RESTORE          CALLEE_RESTORE
459          ret          ret
460    
# Line 464  Line 464 
464    
465  #define temp2   %ebx  #define temp2   %ebx
466          /* Allocate and initialize the ML stack frame. */          /* Allocate and initialize the ML stack frame. */
467          subl    $ML_FRAME_SIZE, %esp          subl    IMMED(ML_FRAME_SIZE), %esp
468          MOVE(   tempmem_w,  temp2, tempmem)          MOVE(   tempmem_w,  temp2, tempmem)
469          MOVE(   tempmem2_w, temp2, tempmem2)          MOVE(   tempmem2_w, temp2, tempmem2)
470          MOVE(   ExnPtrOffMSP(temp),  temp2, exncont)          MOVE(   ExnPtrOffMSP(temp),  temp2, exncont)
# Line 517  Line 517 
517          /* note that we're entering ML */          /* note that we're entering ML */
518          movl    VProcOffMSP(temp),temp  /* temp is now vsp */          movl    VProcOffMSP(temp),temp  /* temp is now vsp */
519  #define vsp     temp  #define vsp     temp
520          movl    $1,InMLOffVSP(vsp)          movl    IMMED(1),InMLOffVSP(vsp)
521    
522          /* handle signals */          /* handle signals */
523          movl    NPendingSysOffVSP(vsp),tmpreg          movl    NPendingSysOffVSP(vsp),tmpreg
524          addl    NPendingOffVSP(vsp),tmpreg          addl    NPendingOffVSP(vsp),tmpreg
525          cmpl    $0,tmpreg          cmpl    IMMED(0),tmpreg
526  #undef  tmpreg  #undef  tmpreg
527          jne     pending          jne     pending
528    
# Line 536  Line 536 
536          jmpl    temp                  /* Jump to ML code. */          jmpl    temp                  /* Jump to ML code. */
537    
538  pending:  pending:
539          cmpl    $0,InSigHandlerOffVSP(vsp)   /* Currently handling signal? */          cmpl    IMMED(0),InSigHandlerOffVSP(vsp)   /* Currently handling signal? */
540          jne     restore_and_jmp_ml          jne     restore_and_jmp_ml
541          movl    $1,HandlerPendingOffVSP(vsp) /* handler trap is now pending */          movl    IMMED(1),HandlerPendingOffVSP(vsp) /* handler trap is now pending */
542    
543          /* must restore here because limitptr is on stack */          /* must restore here because limitptr is on stack */
544          popl    temp                    /* restore temp to msp */          popl    temp                    /* restore temp to msp */
# Line 557  Line 557 
557  ML_CODE_HDR(array_a)  ML_CODE_HDR(array_a)
558          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
559          movl    0(stdarg),temp               /* desired length into temp */          movl    0(stdarg),temp               /* desired length into temp */
560          sarl    $1,temp                      /* untagged */          sarl    IMMED(1),temp                        /* untagged */
561          cmpl    $SMALL_OBJ_SZW,temp          cmpl    IMMED(SMALL_OBJ_SZW),temp
562          jge     3f          jge     3f
563    
564  #define tmpreg  misc1  #define tmpreg  misc1
565          pushl   tmpreg          pushl   tmpreg
566    
567          movl    temp,tmpreg                  /* build descriptor in tmpreg */          movl    temp,tmpreg                  /* build descriptor in tmpreg */
568          sall    $TAG_SHIFTW,tmpreg          sall    IMMED(TAG_SHIFTW),tmpreg
569          orl     $MAKE_TAG(DTAG_array),tmpreg          orl     IMMED(MAKE_TAG(DTAG_array)),tmpreg
570          movl    tmpreg,0(allocptr)           /* write descriptor */          movl    tmpreg,0(allocptr)           /* write descriptor */
571          addl    $4,allocptr          addl    IMMED(4),allocptr
572          movl    4(stdarg),tmpreg             /* initial values */          movl    4(stdarg),tmpreg             /* initial values */
573          movl    allocptr,stdarg              /* stdarg gets ptr to new array */          movl    allocptr,stdarg              /* stdarg gets ptr to new array */
574          sall    $2,temp                      /* length in bytes */          sall    IMMED(2),temp                        /* length in bytes */
575          addl    allocptr,temp          addl    allocptr,temp
576          xchgl   tmpreg,temp                  /* tmpreg is end of array */          xchgl   tmpreg,temp                  /* tmpreg is end of array */
577  2:                                           /* loop: */  2:                                           /* loop: */
# Line 585  Line 585 
585          CONTINUE          CONTINUE
586  3:  3:
587          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
588          movl    $REQ_ALLOC_ARRAY, request_w          movl    IMMED(REQ_ALLOC_ARRAY), request_w
589          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
590          jmp     CSYM(set_request)          jmp     CSYM(set_request)
591    
592    
# Line 594  Line 594 
594  ML_CODE_HDR(create_r_a)  ML_CODE_HDR(create_r_a)
595          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
596          movl    stdarg,temp               /* desired length into temp */          movl    stdarg,temp               /* desired length into temp */
597          sarl    $1,temp                   /* untagged */          sarl    IMMED(1),temp                     /* untagged */
598          shll    $1,temp                   /* size in words */          shll    IMMED(1),temp                     /* size in words */
599          cmpl    $SMALL_OBJ_SZW,temp          cmpl    IMMED(SMALL_OBJ_SZW),temp
600          jge     2f          jge     2f
601    
602  #define tmpreg  misc1  #define tmpreg  misc1
603          pushl   tmpreg          pushl   tmpreg
604    
605          shrl    $1,temp                   /* size in reals */          shrl    IMMED(1),temp                     /* size in reals */
606          movl    temp,tmpreg                  /* build descriptor in tmpreg */          movl    temp,tmpreg                  /* build descriptor in tmpreg */
607          sall    $TAG_SHIFTW,tmpreg          sall    IMMED(TAG_SHIFTW),tmpreg
608          orl     $MAKE_TAG(DTAG_realdarray),tmpreg          orl     IMMED(MAKE_TAG(DTAG_realdarray)),tmpreg
609          movl    tmpreg,0(allocptr)           /* write descriptor */          movl    tmpreg,0(allocptr)           /* write descriptor */
610          addl    $4,allocptr          addl    IMMED(4),allocptr
611          movl    allocptr,stdarg              /* stdarg gets ptr to new array */          movl    allocptr,stdarg              /* stdarg gets ptr to new array */
612          sall    $3,temp                      /* length in bytes */          sall    IMMED(3),temp                        /* length in bytes */
613          addl    temp,allocptr                /* adjust allocptr past array */          addl    temp,allocptr                /* adjust allocptr past array */
614    
615          popl    tmpreg          popl    tmpreg
# Line 617  Line 617 
617          CONTINUE          CONTINUE
618  2:  2:
619          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
620          movl    $REQ_ALLOC_REALDARRAY, request_w          movl    IMMED(REQ_ALLOC_REALDARRAY), request_w
621          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
622          jmp     CSYM(set_request)          jmp     CSYM(set_request)
623    
624    
# Line 626  Line 626 
626  ML_CODE_HDR(create_b_a)  ML_CODE_HDR(create_b_a)
627          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
628          movl    stdarg,temp                  /* the length */          movl    stdarg,temp                  /* the length */
629          sarl    $1,temp                      /* untagged */          sarl    IMMED(1),temp                        /* untagged */
630          addl    $3,temp                      /* round */          addl    IMMED(3),temp                        /* round */
631          sarl    $2,temp                      /* to words */          sarl    IMMED(2),temp                        /* to words */
632          cmpl    $SMALL_OBJ_SZW,temp          cmpl    IMMED(SMALL_OBJ_SZW),temp
633          jge     2f          jge     2f
634    
635  #define tmpreg  misc1  #define tmpreg  misc1
636          pushl   tmpreg          pushl   tmpreg
637    
638          movl    stdarg,tmpreg                /* build descriptor in tmpreg */          movl    stdarg,tmpreg                /* build descriptor in tmpreg */
639          sarl    $1,tmpreg          sarl    IMMED(1),tmpreg
640          sall    $TAG_SHIFTW,tmpreg          sall    IMMED(TAG_SHIFTW),tmpreg
641          orl     $MAKE_TAG(DTAG_bytearray),tmpreg          orl     IMMED(MAKE_TAG(DTAG_bytearray)),tmpreg
642          movl    tmpreg,0(allocptr)           /* write descriptor */          movl    tmpreg,0(allocptr)           /* write descriptor */
643          addl    $4,allocptr          addl    IMMED(4),allocptr
644          movl    allocptr,stdarg              /* stdarg gets ptr to new str */          movl    allocptr,stdarg              /* stdarg gets ptr to new str */
645          sall    $2,temp                      /* length in bytes (untagged) */          sall    IMMED(2),temp                        /* length in bytes (untagged) */
646          addl    temp,allocptr                /* allocptr += total length */          addl    temp,allocptr                /* allocptr += total length */
647    
648          popl    tmpreg          popl    tmpreg
# Line 651  Line 651 
651          CONTINUE          CONTINUE
652  2:  2:
653          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
654          movl    $REQ_ALLOC_BYTEARRAY, request_w          movl    IMMED(REQ_ALLOC_BYTEARRAY), request_w
655          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
656          jmp     CSYM(set_request)          jmp     CSYM(set_request)
657    
658    
# Line 660  Line 660 
660  ML_CODE_HDR(create_s_a)  ML_CODE_HDR(create_s_a)
661          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
662          movl    stdarg,temp                  /* the length */          movl    stdarg,temp                  /* the length */
663          sarl    $1,temp                      /* untagged */          sarl    IMMED(1),temp                        /* untagged */
664          addl    $4,temp                      /* round */          addl    IMMED(4),temp                        /* round */
665          sarl    $2,temp                      /* to words */          sarl    IMMED(2),temp                        /* to words */
666          cmpl    $SMALL_OBJ_SZW,temp          cmpl    IMMED(SMALL_OBJ_SZW),temp
667          jge     2f          jge     2f
668    
669  #define tmpreg  misc1  #define tmpreg  misc1
670          pushl   tmpreg          pushl   tmpreg
671    
672          movl    stdarg,tmpreg                /* build descriptor in tmpreg */          movl    stdarg,tmpreg                /* build descriptor in tmpreg */
673          sarl    $1,tmpreg          sarl    IMMED(1),tmpreg
674          sall    $TAG_SHIFTW,tmpreg          sall    IMMED(TAG_SHIFTW),tmpreg
675          orl     $MAKE_TAG(DTAG_string),tmpreg          orl     IMMED(MAKE_TAG(DTAG_string)),tmpreg
676          movl    tmpreg,0(allocptr)           /* write descriptor */          movl    tmpreg,0(allocptr)           /* write descriptor */
677          addl    $4,allocptr          addl    IMMED(4),allocptr
678          movl    allocptr,stdarg              /* stdarg gets ptr to new str */          movl    allocptr,stdarg              /* stdarg gets ptr to new str */
679          sall    $2,temp                      /* length in bytes (untagged) */          sall    IMMED(2),temp                        /* length in bytes (untagged) */
680          addl    temp,allocptr                /* allocptr += total length */          addl    temp,allocptr                /* allocptr += total length */
681          movl    $0,-4(allocptr)              /* for fast strcmp */          movl    IMMED(0),-4(allocptr)                /* for fast strcmp */
682    
683          popl    tmpreg          popl    tmpreg
684  #undef  tmpreg  #undef  tmpreg
# Line 686  Line 686 
686          CONTINUE          CONTINUE
687  2:  2:
688          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
689          movl    $REQ_ALLOC_STRING, request_w          movl    IMMED(REQ_ALLOC_STRING), request_w
690          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
691          jmp     CSYM(set_request)          jmp     CSYM(set_request)
692    
693  /* create_v_a : int * 'a list -> 'a vector  /* create_v_a : int * 'a list -> 'a vector
# Line 697  Line 697 
697  ML_CODE_HDR(create_v_a)  ML_CODE_HDR(create_v_a)
698          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
699          movl    0(stdarg),temp               /* desired length into temp */          movl    0(stdarg),temp               /* desired length into temp */
700          sarl    $1,temp                      /* untagged */          sarl    IMMED(1),temp                        /* untagged */
701          cmpl    $SMALL_OBJ_SZW,temp          cmpl    IMMED(SMALL_OBJ_SZW),temp
702          jge     3f          jge     3f
703    
704  #define tmpreg  misc1  #define tmpreg  misc1
705          pushl   tmpreg          pushl   tmpreg
706    
707          movl    temp,tmpreg                  /* build descriptor in tmpreg */          movl    temp,tmpreg                  /* build descriptor in tmpreg */
708          sall    $TAG_SHIFTW,tmpreg          sall    IMMED(TAG_SHIFTW),tmpreg
709          orl     $MAKE_TAG(DTAG_vector),tmpreg          orl     IMMED(MAKE_TAG(DTAG_vector)),tmpreg
710          movl    tmpreg,0(allocptr)           /* write descriptor */          movl    tmpreg,0(allocptr)           /* write descriptor */
711          addl    $4,allocptr          addl    IMMED(4),allocptr
712          movl    4(stdarg),tmpreg             /* list of initial values */          movl    4(stdarg),tmpreg             /* list of initial values */
713          movl    allocptr,stdarg              /* stdarg gets ptr to new array */          movl    allocptr,stdarg              /* stdarg gets ptr to new array */
714  2:                                           /* loop: */  2:                                           /* loop: */
715          movl    0(tmpreg),temp                  /* temp <- hd(tmpreg) */          movl    0(tmpreg),temp                  /* temp <- hd(tmpreg) */
716          stosl                                   /* 0(allocptr++) <- temp */          stosl                                   /* 0(allocptr++) <- temp */
717          movl    4(tmpreg),tmpreg                /* tmpreg <- tl(tmpreg) */          movl    4(tmpreg),tmpreg                /* tmpreg <- tl(tmpreg) */
718          cmpl    $ML_nil,tmpreg                  /* end of list */          cmpl    IMMED(ML_nil),tmpreg                    /* end of list */
719          jne     2b          jne     2b
720    
721          popl    tmpreg          popl    tmpreg
# Line 724  Line 724 
724          CONTINUE          CONTINUE
725  3:  3:
726          movl    mlstate_ptr, temp          movl    mlstate_ptr, temp
727          movl    $REQ_ALLOC_VECTOR, request_w          movl    IMMED(REQ_ALLOC_VECTOR), request_w
728          movl    $FUN_MASK, mask          movl    IMMED(FUN_MASK), mask
729          jmp     CSYM(set_request)          jmp     CSYM(set_request)
730    
731  /* try_lock: spin_lock -> bool.  /* try_lock: spin_lock -> bool.
# Line 737  Line 737 
737  #  error multiple processors not supported  #  error multiple processors not supported
738  #else /* (MAX_PROCS == 1) */  #else /* (MAX_PROCS == 1) */
739          movl    (stdarg), temp          /* Get old value of lock. */          movl    (stdarg), temp          /* Get old value of lock. */
740          movl    $1, (stdarg)            /* Set the lock to ML_false. */          movl    IMMED(1), (stdarg)              /* Set the lock to ML_false. */
741          movl    temp, stdarg            /* Return old value of lock. */          movl    temp, stdarg            /* Return old value of lock. */
742          CONTINUE          CONTINUE
743  #endif  #endif
# Line 748  Line 748 
748  #if (MAX_PROCS > 1)  #if (MAX_PROCS > 1)
749  #  error multiple processors not supported  #  error multiple processors not supported
750  #else /* (MAX_PROCS == 1) */  #else /* (MAX_PROCS == 1) */
751          movl    $3, (stdarg)            /* Store ML_true into lock. */          movl    IMMED(3), (stdarg)              /* Store ML_true into lock. */
752          movl    $1, stdarg              /* Return unit. */          movl    IMMED(1), stdarg                /* Return unit. */
753          CONTINUE          CONTINUE
754  #endif  #endif
755    
# Line 785  Line 785 
785   */   */
786  ENTRY(FPEEnable)  ENTRY(FPEEnable)
787          finit          finit
788          subl    $4, %esp        /* Temp space.  Keep stack aligned. */          subl    IMMED(4), %esp  /* Temp space.  Keep stack aligned. */
789          fstcw   (%esp)          /* Store FP control word. */          fstcw   (%esp)          /* Store FP control word. */
790          andw    $0xf0c0, (%esp) /* Keep undefined fields, clear others. */          andw    IMMED(0xf0c0), (%esp)   /* Keep undefined fields, clear others. */
791          orw     $0x023f, (%esp) /* Set fields (see above). */          orw     IMMED(0x023f), (%esp)   /* Set fields (see above). */
792          fldcw   (%esp)          /* Install new control word. */          fldcw   (%esp)          /* Install new control word. */
793          addl    $4, %esp          addl    IMMED(4), %esp
794          fldz                    /* Push a zero onto the register stack. */          fldz                    /* Push a zero onto the register stack. */
795          fld     %st             /* Copy it 6 times. */          fld     %st             /* Copy it 6 times. */
796          fld     %st          fld     %st
# Line 802  Line 802 
802    
803  #if (defined(OPSYS_LINUX) || defined(OPSYS_SOLARIS))  #if (defined(OPSYS_LINUX) || defined(OPSYS_SOLARIS))
804  ENTRY(fegetround)  ENTRY(fegetround)
805          subl    $4, %esp        /* allocate temporary space */          subl    IMMED(4), %esp  /* allocate temporary space */
806          fstcw   (%esp)          /* store fp control word */          fstcw   (%esp)          /* store fp control word */
807          sarl    $10,(%esp)      /* rounding mode is at bit 10 and 11 */          sarl    IMMED(10),(%esp)        /* rounding mode is at bit 10 and 11 */
808          andl    $3, (%esp)      /* mask two bits */          andl    IMMED(3), (%esp)        /* mask two bits */
809          movl    (%esp),%eax     /* return rounding mode */          movl    (%esp),%eax     /* return rounding mode */
810          addl    $4, %esp        /* deallocate space */          addl    IMMED(4), %esp  /* deallocate space */
811          ret          ret
812    
813  ENTRY(fesetround)  ENTRY(fesetround)
814          subl    $4, %esp        /* allocate temporary space */          subl    IMMED(4), %esp  /* allocate temporary space */
815          fstcw   (%esp)          /* store fp control word */          fstcw   (%esp)          /* store fp control word */
816          andw    $0xf3ff, (%esp) /* Clear rounding field. */          andw    IMMED(0xf3ff), (%esp)   /* Clear rounding field. */
817          movl    8(%esp), %eax   /* new rounding mode */          movl    8(%esp), %eax   /* new rounding mode */
818          sall    $10, %eax       /* move to right place */          sall    IMMED(10), %eax /* move to right place */
819          orl     %eax,(%esp)     /* new control word */          orl     %eax,(%esp)     /* new control word */
820          fldcw   (%esp)          /* load new control word */          fldcw   (%esp)          /* load new control word */
821          addl    $4, %esp        /* deallocate space */          addl    IMMED(4), %esp  /* deallocate space */
822          ret          ret
823  #endif  #endif
824    
# Line 841  Line 841 
841  ML_CODE_HDR(floor_a)  ML_CODE_HDR(floor_a)
842          fstcw   old_controlwd           /* Get FP control word. */          fstcw   old_controlwd           /* Get FP control word. */
843          movw    old_controlwd, %ax          movw    old_controlwd, %ax
844          andw    $0xf3ff, %ax            /* Clear rounding field. */          andw    IMMED(0xf3ff), %ax              /* Clear rounding field. */
845          orw     $0x0400, %ax            /* Round towards neg. infinity. */          orw     IMMED(0x0400), %ax              /* Round towards neg. infinity. */
846          movw    %ax, new_controlwd          movw    %ax, new_controlwd
847          fldcw   new_controlwd           /* Install new control word. */          fldcw   new_controlwd           /* Install new control word. */
848    
849          fldl    (stdarg)                /* Load argument. */          fldl    (stdarg)                /* Load argument. */
850          subl    $4, %esp          subl    IMMED(4), %esp
851          fistpl  (%esp)                  /* Round, store, and pop. */          fistpl  (%esp)                  /* Round, store, and pop. */
852          popl    stdarg          popl    stdarg
853          sall    $1, stdarg              /* Tag the resulting integer. */          sall    IMMED(1), stdarg                /* Tag the resulting integer. */
854          incl    stdarg          incl    stdarg
855    
856          fldcw   old_controlwd           /* Restore old FP control word. */          fldcw   old_controlwd           /* Restore old FP control word. */
# Line 862  Line 862 
862   */   */
863  ML_CODE_HDR(logb_a)  ML_CODE_HDR(logb_a)
864          movl    4(stdarg),temp          /* msb for little endian arch */          movl    4(stdarg),temp          /* msb for little endian arch */
865          sarl    $20, temp               /* throw out 20 bits */          sarl    IMMED(20), temp         /* throw out 20 bits */
866          andl    $0x7ff,temp             /* clear all but 11 low bits */          andl    IMMED(0x7ff),temp               /* clear all but 11 low bits */
867          subl    $1023, temp             /* unbias */          subl    IMMED(1023), temp               /* unbias */
868          sall    $1, temp                /* room for tag bit */          sall    IMMED(1), temp          /* room for tag bit */
869          addl    $1, temp                /* tag bit */          addl    IMMED(1), temp          /* tag bit */
870          movl    temp, stdarg          movl    temp, stdarg
871          CONTINUE          CONTINUE
872    
# Line 880  Line 880 
880  ML_CODE_HDR(scalb_a)  ML_CODE_HDR(scalb_a)
881          CHECKLIMIT(FUN_MASK)          CHECKLIMIT(FUN_MASK)
882          pushl   4(stdarg)               /* Get copy of scalar. */          pushl   4(stdarg)               /* Get copy of scalar. */
883          sarl    $1, (%esp)              /* Untag it. */          sarl    IMMED(1), (%esp)                /* Untag it. */
884          fildl   (%esp)                  /* Load it ... */          fildl   (%esp)                  /* Load it ... */
885          fstp    %st(1)                  /* ... into 1st FP reg. */          fstp    %st(1)                  /* ... into 1st FP reg. */
886          addl    $4, %esp                /* Discard copy of scalar. */          addl    IMMED(4), %esp          /* Discard copy of scalar. */
887    
888          movl    (stdarg), temp          /* Get pointer to real. */          movl    (stdarg), temp          /* Get pointer to real. */
889          fldl    (temp)                  /* Load it into temp. */          fldl    (temp)                  /* Load it into temp. */
890    
891          fscale                          /* Multiply exponent by scalar. */          fscale                          /* Multiply exponent by scalar. */
892          movl    $DESC_reald, (allocptr)          movl    IMMED(DESC_reald), (allocptr)
893          fstpl   4(allocptr)             /* Store resulting float. */          fstpl   4(allocptr)             /* Store resulting float. */
894          addl    $4, allocptr            /* Allocate word for tag. */          addl    IMMED(4), allocptr              /* Allocate word for tag. */
895          movl    allocptr, stdarg        /* Return a pointer to the float. */          movl    allocptr, stdarg        /* Return a pointer to the float. */
896          addl    $8, allocptr            /* Allocate room for float. */          addl    IMMED(8), allocptr              /* Allocate room for float. */
897          CONTINUE          CONTINUE
898    
899  /* end of X86.prim.asm */  /* end of X86.prim.asm */

Legend:
Removed from v.28  
changed lines
  Added in v.29

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