Changeset 8832


Ignore:
Timestamp:
Mar 20, 2008, 1:17:22 AM (12 years ago)
Author:
rme
Message:

makes64/gets64 uses mm0 for the unboxed 64 bits.

syscall2 subprim and vinsn, used when a syscall returns a doubleword

Location:
branches/ia32-0319
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32-0319/compiler/X86/X8632/x8632-arch.lisp

    r8426 r8832  
    928928         (defx8632subprim .SPrestorecontext)
    929929         (defx8632subprim .SPlexpr-entry)
    930          (defx8632subprim .SPpoweropen-syscall)
     930         (defx8632subprim .SPsyscall2)
    931931         (defx8632subprim .SPbuiltin-plus)
    932932         (defx8632subprim .SPbuiltin-minus)
  • branches/ia32-0319/compiler/X86/X8632/x8632-vinsns.lisp

    r8824 r8832  
    16421642(define-x8632-subprim-call-vinsn (syscall)  .SPsyscall)
    16431643
     1644(define-x8632-subprim-call-vinsn (syscall2)  .SPsyscall2)
     1645
    16441646(define-x8632-subprim-call-vinsn (gets64) .SPgets64)
    16451647
  • branches/ia32-0319/compiler/X86/x862.lisp

    r8829 r8832  
    90079007    (unless simple-foreign-args
    90089008      (x862-vpop-register seg ($ x8632::arg_z)))
    9009     (! syscall)
     9009    (case resultspec
     9010      ((:unsigned-doubleword :signed-doubleword)
     9011       (! syscall2))                    ;copies doubleword result into %mm0
     9012      (t
     9013       (! syscall)))
    90109014    (x862-close-undo)
    90119015    (when vreg
     
    90139017            ((eq resultspec :unsigned-doubleword)
    90149018             (ensuring-node-target (target vreg)
    9015                ;; xxx -- need to ensure that edx is marked as an imm reg
    90169019               (! makeu64)
    90179020               (x862-copy-register seg target ($ *x862-arg-z*))))
    90189021            ((eq resultspec :signed-doubleword)
    90199022             (ensuring-node-target (target vreg)
    9020                ;; xxx -- need to ensure that edx is marked as an imm reg
    90219023               (! makes64)
    90229024               (x862-copy-register seg target ($ *x862-arg-z*))))
  • branches/ia32-0319/lisp-kernel/x86-spentry32.s

    r8828 r8832  
    996996_endsubp(makes32)
    997997
     998/* Make a lisp integer out of the unboxed 64-bit word in %mm0. */
     999/* This is a little clumsy, but the alternative requires callers to */
     1000/* have already marked %edx as an imm reg (or else store it in memory
     1001/* somewhere), and I'm nervous about */
     1002/* splitting up the mark-as-imm/mark-as-node between two separate */
     1003/* pieces of code. */
    9981004_spentry(makes64)
    999         __(int $3)
     1005        __(movq %mm0,%mm2)
     1006        __(pshufw $0x4e,%mm0,%mm1)      /* swap hi/lo halves */
     1007        __(psrad $31,%mm0)      /* propagate sign */
     1008        __(pcmpeqd %mm0,%mm1)   /* all ones if equal */
     1009        __(movd %mm1,%imm0)
     1010        __(cmpb $-1,%imm0_b)    /* upper half just sign extension? */
     1011        __(jne 1f)
     1012        __(movd %mm2,%imm0)
    10001013        __(jmp _SPmakes32)
     10141:      __(movl $two_digit_bignum_header,%imm0)
     1015        __(movd %imm0,%mm0)
     1016        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
     1017        __(movq %mm2,misc_data_offset(%arg_z))
     1018        __(ret)
    10011019_endsubp(makes64)
    10021020
    1003 /* xxx make lisp integer out of mm0? */
    1004 /* Make a lisp integer (probably a bignum) out of the %edx:%eax pair. */
    1005 /* We assume that the node_regs_mask in the TCR has been set to mark */
    1006 /* %edx an immediate register. */
    1007 _startfn(C(makes64))
    1008         __(movd %eax,%mm1)
    1009         __(sarl $31,%eax)
    1010         __(cmpl %eax,%edx)      /* upper bits just sign extension? */
    1011         __(movd %mm1,%eax)
    1012         __(jne 1f)      /* no, make a bignum */
    1013         __(mark_as_node(%edx))
    1014         __(jmp _SPmakes32)
    1015 1:      __(movl $two_digit_bignum_header,%eax)
    1016         __(movd %eax,%mm0)
    1017         __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
    1018         __(movd %mm1,misc_data_offset(%arg_z))
    1019         __(movl %edx,misc_data_offset+4(%arg_z))
    1020         __(mark_as_node(%edx))
    1021         __(ret)
    1022 _endfn
    1023 
    1024 
    10251021_spentry(syscall)
     1022        __(int $3)
     1023        /* Save lisp registers */
     1024        __(push %ebp)
     1025        __(movl %esp,%ebp)
     1026        __(push %temp0)
     1027        __(push %temp1)
     1028        __(push %arg_y)
     1029        __(push %arg_z)
     1030        __(push %fn)
     1031        __(movl %esp,%rcontext:tcr.save_vsp)
     1032        __(movl %ebp,%rcontext:tcr.save_ebp)
     1033        __(movl $TCR_STATE_FOREIGN,%rcontext:tcr.valence)
     1034        __(movl %rcontext:tcr.foreign_sp,%esp)
     1035        __(emms)
     1036        __(pop %ebp)            /* backlink */
     1037        __(unbox_fixnum(%arg_z,%eax))   /* syscall number */
     1038        __(movl $local_label(back_from_sysenter),%edx)
     1039        __(push %edx)
     1040        __(movl %esp,%ecx)
     1041        __(sysenter)
     1042local_label(back_from_sysenter):
     1043        __(jnc 0f)
     1044        __(neg %eax)
     10450:     
     1046        __(movl %ebp,%esp)
     1047        __(movl %esp,%rcontext:tcr.foreign_sp)
     1048        __(zero_node_regs)
     1049        __(pxor %fpzero,%fpzero)
     1050        __(movl %rcontext:tcr.save_vsp,%esp)
     1051        __(movl %rcontext:tcr.save_ebp,%ebp)
     1052        __(movl $TCR_STATE_LISP,%rcontext:tcr.valence)
     1053        __(pop %fn)
     1054        __(pop %arg_z)
     1055        __(pop %arg_y)
     1056        __(pop %temp1)
     1057        __(check_pending_interrupt(%temp0))
     1058        __(push %temp0)
     1059        __(leave)
     1060        __(ret)
     1061_endsubp(syscall)
     1062
     1063/* Make system call that returns a doubleword result in %edx:%eax and */
     1064/* copy the result into %mm0. */
     1065_spentry(syscall2)
    10261066        __(int $3)
    10271067        /* Save lisp registers */
     
    10451085        __(jnc 0f)
    10461086        __(neg %eax)
    1047 0:     
     1087        __(movl $-1,%edx)
     10880:
     1089        /* just use memory rather than screwing around with */
     1090        /* movd %eax,%mm0, movd %edx,%mm1, psllq $32,%mm1, por %mm1,%mm0 */
     1091        __(push %edx)
     1092        __(push %eax)
     1093        __(movq (%esp),%mm0)
    10481094        __(movl %ebp,%esp)
    10491095        __(movl %esp,%rcontext:tcr.foreign_sp)
     
    10611107        __(leave)
    10621108        __(ret)
    1063 _endsubp(syscall)
     1109_endsubp(syscall2)
     1110
    10641111
    10651112_spentry(mkcatch1v)
     
    23202367        __(cmpl $two_digit_bignum_header,%imm0)
    23212368        __(jne 9f)
    2322         __(movl misc_data_offset(%arg_z),%imm0)
     2369        __(movl misc_data_offset+4(%arg_z),%imm0)
    23232370        __(testl %imm0,%imm0)
    23242371        __(js 9f)
    2325         __(repret)
     2372        __(movq misc_data_offset(%arg_z),%mm0)
     2373        __(ret)
    232623743:      __(movl misc_data_offset(%arg_z),%imm0)
    23272375        __(cmpl $0,misc_data_offset+8(%arg_z))
    23282376        __(jne 9f)
     2377        __(movq misc_data_offset(%arg_z),%mm0)
    23292378        __(repret)
    233023799:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
     
    25412590        __(unbox_fixnum(%arg_y,%edx))
    25422591        __(imul %edx)
    2543         /* SPmakes64 expects that %edx will be marked as an imm reg */
    2544         __(jmp C(makes64))
     2592        __(movd %eax,%mm0)
     2593        __(movd %edx,%mm1)
     2594        __(mark_as_node(%edx))
     2595        __(psllq $32,%mm1)
     2596        __(por %mm1,%mm0)
     2597        __(jmp _SPmakes64)
    254525982:      __(jump_builtin(_builtin_times,2))
    25462599_endsubp(builtin_times)
     
    28202873        __(jne 4f)
    28212874        /* left-shift by 32 bits exactly */
    2822         __(mark_as_imm(%edx)) /* aka temp1 (makes64 will undo this) */
    2823         __(unbox_fixnum(%arg_y,%edx))
    2824         __(xorl %imm0,%imm0)
    2825         __(jmp C(makes64))
     2875        __(unbox_fixnum(%arg_y,%imm0))
     2876        __(movd %imm0,%mm0)
     2877        __(psllq $32,%mm0)
     2878        __(jmp _SPmakes64)
    282628794:      /* left-shift by 1..31 bits. Safe to move shift count to %cl */
    2827         __(movzbl %imm0_b,%ecx)
    2828         __(unbox_fixnum(%arg_y,%imm0))
    2829         __(mark_as_imm(%edx)) /* aka temp1 (makes64 will undo this) */
    2830         __(movl %imm0,%edx)
    2831         __(sarl $31,%edx)       /* propagate sign */
    2832         __(shld %cl,%imm0,%edx)
    2833         __(shl %cl,%imm0)
    2834         __(jmp C(makes64))
     2880        __(movd %imm0,%mm1)     /* shift count */
     2881        __(unbox_fixnum(%arg_y,%imm0))
     2882        __(movd %imm0,%mm0)
     2883        __(sarl $31,%imm0)      /* propagate sign */
     2884        __(movd %imm0,%mm2)
     2885        __(pshufw $0x4e,%mm2,%mm2) /* swap hi/lo halves */
     2886        __(por %mm2,%mm0)
     2887        __(psllq %mm1,%mm0)
     2888        __(jmp _SPmakes64)
    283528899:
    28362890        __(jump_builtin(_builtin_ash,2))
     
    30443098_endsubp(poweropen_ffcallX)
    30453099
    3046 _spentry(poweropen_syscall)
    3047         __(int $3)
    3048 _endsubp(poweropen_syscall)
    3049 
    30503100_spentry(eabi_ff_call)
    30513101        __(int $3)
  • branches/ia32-0319/lisp-kernel/x86-spjump32.s

    r8208 r8832  
    127127        _spjump(restorecontext)
    128128        _spjump(lexpr_entry)
    129         _spjump(poweropen_syscall)
     129        _spjump(syscall2)
    130130        _spjump(builtin_plus)
    131131        _spjump(builtin_minus)
Note: See TracChangeset for help on using the changeset viewer.