Changeset 11190


Ignore:
Timestamp:
Oct 21, 2008, 11:24:27 PM (11 years ago)
Author:
gb
Message:

(Untested) support for winapi/pascal-style callbacks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/x86-spentry32.s

    r11172 r11190  
    42204220        __(subl $24,%esp)
    42214221        __(movl $0,-16(%ebp)) /* No FP result */
     4222        __(movl %eax,%ecx)    /* extract args-discard count */
     4223        __(shrl $32,%ecx)
     4224        __(andl $0xff000000,%eax)
     4225        __(movl %ecx,-12(ebp))
    42224226        /* If the C stack is 16-byte aligned by convention,
    42234227           it should still be, and this'll be a NOP. */
     
    42284232        __(push %ebx)
    42294233        __(push %ebp)
    4230        
    42314234        __(box_fixnum(%eax,%esi))       /* put callback index in arg_y */
    42324235        __(ref_global(get_tcr,%eax))
     
    42814284        __(pop %edi)
    42824285        __(cmpb $1,-16(%ebp))
    4283         __(movl -12(%ebp),%ecx) /* magic value for ObjC bridge */
     4286        __(movl -12(%ebp),%ecx) /* magic value for ObjC bridge or winapi */
    42844287        __(jae 1f)
    42854288        __(movl -8(%ebp),%eax)
    42864289        __(movl -4(%ebp),%edx)
    42874290        __(leave)
    4288         __(ret)
     4291        __ifdef([WIN_32])
     4292         __(testl %ecx,%ecx)
     4293         __(jne local_label(winapi_return)
     4294         __(repret)
     4295        __else
     4296         __(ret)
     4297        __endif
    428942981:      __(jne 2f)
    42904299        /* single float return in x87 */
    42914300        __(flds -8(%ebp))
    42924301        __(leave)
    4293         __(ret)
     4302        __ifdef([WIN_32])
     4303         __(testl %ecx,%ecx)
     4304         __(jne local_label(winapi_return)
     4305         __(repret)
     4306        __else
     4307         __(ret)
     4308        __endif
    429443092:      /* double-float return in x87 */
    42954310        __(fldl -8(%ebp))
    42964311        __(leave)
    4297         __(ret)         
     4312        __ifdef([WIN_32])
     4313         __(testl %ecx,%ecx)
     4314         __(jne local_label(winapi_return)
     4315         __(repret)
     4316        __else
     4317         __(ret)
     4318        __endif
     4319        __ifdef([WIN_32])
     4320local_label(winapi_return):             
     4321         /* %ecx is non-zero and contains count of arg words to pop */
     4322          __(popl (%esp,%ecx,4))
     4323          __(leal -4(%esp,%ecx,4),%esp)
     4324          __(ret)
     4325        __endif
    42984326_endsubp(callback)
    42994327
Note: See TracChangeset for help on using the changeset viewer.