#ifndef _ASM_H_
#define _ASM_H_
#ifndef _LOCORE
#define _LOCORE
#endif
#include <machine/frame.h>
#ifdef __ELF__
#define _C_LABEL(name) name
#else
#ifdef __STDC__
#define _C_LABEL(name) _ ## name
#else
#define _C_LABEL(name) _name
#endif
#endif
#define _ASM_LABEL(name) name
#ifdef __PIC__
#ifdef __arch64__
#define PIC_PROLOGUE(dest,tmp) \
mov %o7, tmp; \
sethi %hi(_GLOBAL_OFFSET_TABLE_-4),dest; \
call 0f; \
or dest,%lo(_GLOBAL_OFFSET_TABLE_+4),dest; \
0: \
add dest,%o7,dest; \
mov tmp, %o7
#else
#define PIC_PROLOGUE(dest,tmp) \
mov %o7,tmp; 3: call 4f; nop; 4: \
sethi %hi(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
or dest,%lo(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
add dest,%o7,dest; mov tmp,%o7
#endif
#ifdef __arch64__
#define PICCY_SET(var,dest,tmp) \
3: rd %pc, tmp; add tmp,(var-3b),dest
#else
#define PICCY_SET(var,dest,tmp) \
mov %o7,tmp; 3: call 4f; nop; 4: \
add %o7,(var-3b),dest; mov tmp,%o7
#endif
#else
#define PIC_PROLOGUE(dest,tmp)
#define PICCY_OFFSET(var,dest,tmp)
#endif
#define FTYPE(x) .type x,@function
#define OTYPE(x) .type x,@object
#define _ENTRY(name) \
.align 4; .globl name; FTYPE(name); name:
#ifdef GPROF
#ifdef __ELF__
#ifdef __arch64__
#define _PROF_PROLOGUE \
.data; .align 8; 1: .word 0; .word 0; \
.text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call _mcount; \
or %o0,%lo(1b),%o0; restore
#else
#define _PROF_PROLOGUE \
.data; .align 4; 1: .long 0; \
.text; save %sp,-96,%sp; sethi %hi(1b),%o0; call _mcount; \
or %o0,%lo(1b),%o0; restore
#endif
#else
#ifdef __arch64__
#define _PROF_PROLOGUE \
.data; .align 8; 1: .word 0; .word 0; \
.text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call mcount; \
or %o0,%lo(1b),%o0; restore
#else
#define _PROF_PROLOGUE \
.data; .align 4; 1: .long 0; \
.text; save %sp,-96,%sp; sethi %hi(1b),%o0; call mcount; \
or %o0,%lo(1b),%o0; restore
#endif
#endif
#else
#define _PROF_PROLOGUE
#endif
#define ENTRY(name) _ENTRY(_C_LABEL(name)); _PROF_PROLOGUE
#define ENTRY_NOPROFILE(name) _ENTRY(_C_LABEL(name))
#define ASENTRY(name) _ENTRY(_ASM_LABEL(name)); _PROF_PROLOGUE
#define FUNC(name) ASENTRY(name)
#define RODATA(name) .align 4; .text; .globl _C_LABEL(name); \
OTYPE(_C_LABEL(name)); _C_LABEL(name):
#define END(y) .size y, . - y
#define ASMSTR .asciz
#ifdef __ELF__
#ifdef _NETBSD_REVISIONID
#define RCSID(x) .pushsection ".ident","MS",@progbits,1; \
.asciz x; \
.ascii "$"; .ascii "NetBSD: "; .ascii __FILE__; \
.ascii " "; .ascii _NETBSD_REVISIONID; \
.asciz " $"; \
.popsection
#else
#define RCSID(x) .pushsection ".ident","MS",@progbits,1; \
.asciz x; \
.popsection
#endif
#else
#define RCSID(name) .asciz name
#endif
#ifdef NO_KERNEL_RCSIDS
#define __KERNEL_RCSID(_n, _s)
#else
#define __KERNEL_RCSID(_n, _s) RCSID(_s)
#endif
#ifdef __ELF__
#define WEAK_ALIAS(alias,sym) \
.weak alias; \
alias = sym
#endif
#define STRONG_ALIAS(alias,sym) \
.globl alias; \
alias = sym
#ifdef __ELF__
#ifdef __STDC__
#define WARN_REFERENCES(sym,msg) \
.pushsection .gnu.warning. ## sym; \
.ascii msg; \
.popsection
#else
#define WARN_REFERENCES(sym,msg) \
.pushsection .gnu.warning.sym; \
.ascii msg; \
.popsection
#endif
#else
#ifdef __STDC__
#define __STRING(x) #x
#define WARN_REFERENCES(sym,msg) \
.stabs msg ## ,30,0,0,0 ; \
.stabs __STRING(_ ## sym) ## ,1,0,0,0
#else
#define __STRING(x) "x"
#define WARN_REFERENCES(sym,msg) \
.stabs msg,30,0,0,0 ; \
.stabs __STRING(_sym),1,0,0,0
#endif
#endif
#ifdef __arch64__
#define INCR64X(what,r0,r1) \
sethi %hi(what), r0; \
ldx [r0 + %lo(what)], r1; \
inc r1; \
stx r1, [r0 + %lo(what)]
#define INCR64(what) INCR64X(what,%o0,%o1)
#else
#define INCR64X(what,r0,r1,r2) \
sethi %hi(what), r2; \
ldd [r2 + %lo(what)], r0; \
inccc r1; \
addx r0, 0, r0; \
std r0, [r2 + %lo(what)]
#define INCR64(what) INCR64X(what,%o0,%o1,%l7)
#endif
#endif