ftp.nice.ch/pub/next/developer/languages/c/egcs.1.1.1.1beta.I.b.tar.gz#/lib/gcc-lib/i386-next-nextstep3/egcs-2.91.60/include/architecture/sparc/asm_help.h

This is asm_help.h in view mode; [Download] [Up]

/* Copyright (c) 1995 NeXT Computer, Inc.  All rights reserved.
 *
 *	File:	architecture/sparc/asm_help.h
 *	Author:	Umesh Vaishampayan, NeXT Computer, Inc.
 *
 *	This header file defines macros useful when writing assembly code
 *	for the SPARC family processors.
 *
 * HISTORY
 * 21-Jul-95  Umesh Vaishampayan (umeshv@next.com)
 *	Created. [Ported from architecture/hppa/asm_help.h ]
 *
 */

#ifndef	_ARCH_SPARC_ASM_HELP_H_
#define	_ARCH_SPARC_ASM_HELP_H_

#import <architecture/sparc/asm_linkage.h>


#ifdef  __ASSEMBLER__

/*
 * dynamic/PIC macros for routines which reference external symbols
 */

/*
 * the macros assume that %g4 is used as a scratch register
 */

#if defined(__DYNAMIC__)

#define PICIFY(var) \
0: ;\
	call	1f ; \
	sethi	%hi(L ## var ## $non_lazy_ptr - 0b),%g6 ; \
1: ; \
	or	%g6, %lo(L ## var ## $non_lazy_ptr - 0b), %g6 ; \
	ld	[%g6 + %o7], %g6
	
	
#define CALL_EXTERN_AGAIN(var)	\
	PICIFY(var) ; \
	jmpl	%g6,%o7 ; \
	nop


#define NON_LAZY_STUB(var)	\
.non_lazy_symbol_pointer	; \
.align 2			; \
L ## var ## $non_lazy_ptr:	; \
.indirect_symbol var		; \
.long 0				; \
.text				; \
.align 2

#define CERROR		\
	bcc	Lnoerr		; \
	nop			; \
	BRANCH_EXTERN(cerror)	; \
.text				; \
Lnoerr:	nop

#define	BRANCH_EXTERN(var)	\
		mov	%o7,%g4 ; \
        PICIFY(var)		; \
        jmp	%g6	; \
		mov	%g4,%o7 ; \
        NON_LAZY_STUB(var)

#define CALL_EXTERN(var)	\
        CALL_EXTERN_AGAIN(var)	; \
        NON_LAZY_STUB(var)

#define REG_TO_EXTERN(reg, var)	\
	mov	%o7,%g4 ; \
	PICIFY(var) ; \
	mov	%g4,%o7 ; \
	st	reg, [%g6] ; \
    NON_LAZY_STUB(var)

#define LONG_CALL(name)	\
    CALL_EXTERN(name)

#define EXTERN_TO_REG(reg, var) \
	mov	%o7,%g4 ; \
	PICIFY(var) ; \
	mov	%g4,%o7 ; \
	mov	%g6,reg ; \
	NON_LAZY_STUB(var)

#else

#define CERROR	\
	bcc 	Lnoerr					;\
	sethi	%hi(cerror), %g6			;\
	or	%g6, %lo(cerror), %g6	;\
	jmp	%g6				;\
Lnoerr: nop
				
#define BRANCH_EXTERN(var)		\
	sethi	%hi(var), %g6	; \
	or	%g6, %lo(var), %g6	; \
	jmp	%g6 ; \
	nop

#define CALL_EXTERN(var)		\
	call	var ; \
	nop

#define CALL_EXTERN_AGAIN(var)	\
        CALL_EXTERN(var)

#define REG_TO_EXTERN(reg, var)	\
        sethi	%hi(var),%g6	; \
        st	reg, [%g6 + %lo(var)]

#define LONG_CALL(name)	\
    CALL_EXTERN(name)

#define EXTERN_TO_REG(reg, var) \
	set var,reg

#endif

#endif
#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.