home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Headers / architecture / sparc / asm_help.h < prev    next >
Text File  |  1995-08-07  |  2KB  |  128 lines

  1. /* Copyright (c) 1995 NeXT Computer, Inc.  All rights reserved.
  2.  *
  3.  *    File:    architecture/sparc/asm_help.h
  4.  *    Author:    Umesh Vaishampayan, NeXT Computer, Inc.
  5.  *
  6.  *    This header file defines macros useful when writing assembly code
  7.  *    for the SPARC family processors.
  8.  *
  9.  * HISTORY
  10.  * 21-Jul-95  Umesh Vaishampayan (umeshv@next.com)
  11.  *    Created. [Ported from architecture/hppa/asm_help.h ]
  12.  *
  13.  */
  14.  
  15. #ifndef    _ARCH_SPARC_ASM_HELP_H_
  16. #define    _ARCH_SPARC_ASM_HELP_H_
  17.  
  18. #import <architecture/sparc/asm_linkage.h>
  19.  
  20.  
  21. #ifdef  __ASSEMBLER__
  22.  
  23. /*
  24.  * dynamic/PIC macros for routines which reference external symbols
  25.  */
  26.  
  27. /*
  28.  * the macros assume that %g4 is used as a scratch register
  29.  */
  30.  
  31. #if defined(__DYNAMIC__)
  32.  
  33. #define PICIFY(var) \
  34. 0: ;\
  35.     call    1f ; \
  36.     sethi    %hi(L ## var ## $non_lazy_ptr - 0b),%g6 ; \
  37. 1: ; \
  38.     or    %g6, %lo(L ## var ## $non_lazy_ptr - 0b), %g6 ; \
  39.     ld    [%g6 + %o7], %g6
  40.     
  41.     
  42. #define CALL_EXTERN_AGAIN(var)    \
  43.     PICIFY(var) ; \
  44.     jmpl    %g6,%o7 ; \
  45.     nop
  46.  
  47.  
  48. #define NON_LAZY_STUB(var)    \
  49. .non_lazy_symbol_pointer    ; \
  50. .align 2            ; \
  51. L ## var ## $non_lazy_ptr:    ; \
  52. .indirect_symbol var        ; \
  53. .long 0                ; \
  54. .text                ; \
  55. .align 2
  56.  
  57. #define CERROR        \
  58.     bcc    Lnoerr        ; \
  59.     nop            ; \
  60.     BRANCH_EXTERN(cerror)    ; \
  61. .text                ; \
  62. Lnoerr:    nop
  63.  
  64. #define    BRANCH_EXTERN(var)    \
  65.         mov    %o7,%g4 ; \
  66.         PICIFY(var)        ; \
  67.         jmp    %g6    ; \
  68.         mov    %g4,%o7 ; \
  69.         NON_LAZY_STUB(var)
  70.  
  71. #define CALL_EXTERN(var)    \
  72.         CALL_EXTERN_AGAIN(var)    ; \
  73.         NON_LAZY_STUB(var)
  74.  
  75. #define REG_TO_EXTERN(reg, var)    \
  76.     mov    %o7,%g4 ; \
  77.     PICIFY(var) ; \
  78.     mov    %g4,%o7 ; \
  79.     st    reg, [%g6] ; \
  80.     NON_LAZY_STUB(var)
  81.  
  82. #define LONG_CALL(name)    \
  83.     CALL_EXTERN(name)
  84.  
  85. #define EXTERN_TO_REG(reg, var) \
  86.     mov    %o7,%g4 ; \
  87.     PICIFY(var) ; \
  88.     mov    %g4,%o7 ; \
  89.     mov    %g6,reg ; \
  90.     NON_LAZY_STUB(var)
  91.  
  92. #else __DYNAMIC__
  93.  
  94. #define CERROR    \
  95.     bcc     Lnoerr                    ;\
  96.     sethi    %hi(cerror), %g6            ;\
  97.     or    %g6, %lo(cerror), %g6    ;\
  98.     jmp    %g6                ;\
  99. Lnoerr: nop
  100.                 
  101. #define BRANCH_EXTERN(var)        \
  102.     sethi    %hi(var), %g6    ; \
  103.     or    %g6, %lo(var), %g6    ; \
  104.     jmp    %g6 ; \
  105.     nop
  106.  
  107. #define CALL_EXTERN(var)        \
  108.     call    var ; \
  109.     nop
  110.  
  111. #define CALL_EXTERN_AGAIN(var)    \
  112.         CALL_EXTERN(var)
  113.  
  114. #define REG_TO_EXTERN(reg, var)    \
  115.         sethi    %hi(var),%g6    ; \
  116.         st    reg, [%g6 + %lo(var)]
  117.  
  118. #define LONG_CALL(name)    \
  119.     CALL_EXTERN(name)
  120.  
  121. #define EXTERN_TO_REG(reg, var) \
  122.     set var,reg
  123.  
  124. #endif    __DYNAMIC__
  125.  
  126. #endif  __ASSEMBLER__
  127. #endif    _ARCH_SPARC_ASM_HELP_H_
  128.