root/sys/arch/hppa/include/asm.h
/*      $OpenBSD: asm.h,v 1.19 2017/06/23 09:55:10 mpi Exp $    */

/* 
 * Copyright (c) 1990,1991,1994 The University of Utah and
 * the Computer Systems Laboratory (CSL).  All rights reserved.
 *
 * Permission to use, copy, modify and distribute this software is hereby
 * granted provided that (1) source code retains these copyright, permission,
 * and disclaimer notices, and (2) redistributions including binaries
 * reproduce the notices in supporting documentation, and (3) all advertising
 * materials mentioning features or use of this software display the following
 * acknowledgement: ``This product includes software developed by the
 * Computer Systems Laboratory at the University of Utah.''
 *
 * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
 * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
 * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * CSL requests users of this software to return to csl-dist@cs.utah.edu any
 * improvements that they make and grant CSL redistribution rights.
 *
 *      Utah $Hdr: asm.h 1.8 94/12/14$
 */

#ifndef _MACHINE_ASM_H_
#define _MACHINE_ASM_H_

/*
 *      hppa assembler definitions
 */

/*
 * Hardware General Registers
 */
r0      .reg    %r0
r1      .reg    %r1
r2      .reg    %r2
r3      .reg    %r3
r4      .reg    %r4
r5      .reg    %r5
r6      .reg    %r6
r7      .reg    %r7
r8      .reg    %r8
r9      .reg    %r9
r10     .reg    %r10
r11     .reg    %r11
r12     .reg    %r12
r13     .reg    %r13
r14     .reg    %r14
r15     .reg    %r15
r16     .reg    %r16
r17     .reg    %r17
r18     .reg    %r18
r19     .reg    %r19
r20     .reg    %r20
r21     .reg    %r21
r22     .reg    %r22
r23     .reg    %r23
r24     .reg    %r24
r25     .reg    %r25
r26     .reg    %r26
r27     .reg    %r27
r28     .reg    %r28
r29     .reg    %r29
r30     .reg    %r30
r31     .reg    %r31

/*
 * Hardware Space Registers
 */
sr0     .reg    %sr0
sr1     .reg    %sr1
sr2     .reg    %sr2
sr3     .reg    %sr3
sr4     .reg    %sr4
sr5     .reg    %sr5
sr6     .reg    %sr6
sr7     .reg    %sr7

/*
 * Hardware Floating Point Registers
 */
fr0     .reg    %fr0
fr1     .reg    %fr1
fr2     .reg    %fr2
fr3     .reg    %fr3
fr4     .reg    %fr4
fr5     .reg    %fr5
fr6     .reg    %fr6
fr7     .reg    %fr7
fr8     .reg    %fr8
fr9     .reg    %fr9
fr10    .reg    %fr10
fr11    .reg    %fr11
fr12    .reg    %fr12
fr13    .reg    %fr13
fr14    .reg    %fr14
fr15    .reg    %fr15
fr16    .reg    %fr16
fr17    .reg    %fr17
fr18    .reg    %fr18
fr19    .reg    %fr19
fr20    .reg    %fr20
fr21    .reg    %fr21
fr22    .reg    %fr22
fr23    .reg    %fr23
fr24    .reg    %fr24
fr25    .reg    %fr25
fr26    .reg    %fr26
fr27    .reg    %fr27
fr28    .reg    %fr28
fr29    .reg    %fr29
fr30    .reg    %fr30
fr31    .reg    %fr31

/*
 * Hardware Control Registers
 */
cr0     .reg    %cr0
cr8     .reg    %cr8
cr9     .reg    %cr9
cr10    .reg    %cr10
cr11    .reg    %cr11
cr12    .reg    %cr12
cr13    .reg    %cr13
cr14    .reg    %cr14
cr15    .reg    %cr15
cr16    .reg    %cr16
cr17    .reg    %cr17
cr18    .reg    %cr18
cr19    .reg    %cr19
cr20    .reg    %cr20
cr21    .reg    %cr21
cr22    .reg    %cr22
cr23    .reg    %cr23
cr24    .reg    %cr24
cr25    .reg    %cr25
cr26    .reg    %cr26
cr27    .reg    %cr27
cr28    .reg    %cr28
cr29    .reg    %cr29
cr30    .reg    %cr30
cr31    .reg    %cr31

rctr    .reg    %cr0
pidr1   .reg    %cr8
pidr2   .reg    %cr9
ccr     .reg    %cr10
sar     .reg    %cr11
pidr3   .reg    %cr12
pidr4   .reg    %cr13
iva     .reg    %cr14
eiem    .reg    %cr15
itmr    .reg    %cr16
pcsq    .reg    %cr17
pcoq    .reg    %cr18
iir     .reg    %cr19
isr     .reg    %cr20
ior     .reg    %cr21
ipsw    .reg    %cr22
eirr    .reg    %cr23
tr0     .reg    %cr24
vtop    .reg    %cr25
tr1     .reg    %cr25
tr2     .reg    %cr26
tr3     .reg    %cr27
tr4     .reg    %cr28
tr5     .reg    %cr29
tr6     .reg    %cr30
tr7     .reg    %cr31

/*
 * Calling Convention
 */
rp      .reg    %r2
arg3    .reg    %r23
arg2    .reg    %r24
arg1    .reg    %r25
arg0    .reg    %r26
dp      .reg    %r27
ret0    .reg    %r28
ret1    .reg    %r29
sl      .reg    %r29
sp      .reg    %r30

/*
 * Temporary registers
 */
t1      .reg    %r22
t2      .reg    %r21
t3      .reg    %r20
t4      .reg    %r19

/*
 * Temporary space registers
 */
ts1     .reg    %sr2

/*
 * Space Registers - SW Conventions
 */
sret    .reg    %sr1    ; return value
sarg    .reg    %sr1    ; argument

/*
 * Floating Point Registers - SW Conventions
 */
farg0   .reg    %fr5
farg1   .reg    %fr6
farg2   .reg    %fr7
farg3   .reg    %fr8
fret    .reg    %fr4

/*
 * Temporary floating point registers
 */
tf1     .reg    %fr11
tf2     .reg    %fr10
tf3     .reg    %fr9
tf4     .reg    %fr8

#ifdef __STDC__
#define __CONCAT(a,b)   a ## b
#else
#define __CONCAT(a,b)   a/**/b
#endif

#if defined(PROF) || defined(GPROF)
#define _PROF_PROLOGUE !\
1:                                              !\
        stw     rp, HPPA_FRAME_CRP(sr0,sp)      !\
        stw     arg0, HPPA_FRAME_ARG(0)(sr0,sp) !\
        stw     arg1, HPPA_FRAME_ARG(1)(sr0,sp) !\
        stw     arg2, HPPA_FRAME_ARG(2)(sr0,sp) !\
        stw     arg3, HPPA_FRAME_ARG(3)(sr0,sp) !\
        ldo     HPPA_FRAME_SIZE(sp), sp         !\
        copy    rp, arg0                        !\
        bl      2f, arg1                        !\
        depi    0, 31, 2, arg1                  !\
2:                                              !\
        bl      _mcount, rp                     !\
         ldo    1b - 2b(arg1), arg1             !\
        ldo     -HPPA_FRAME_SIZE(sp), sp        !\
        ldw     HPPA_FRAME_ARG(3)(sr0,sp), arg3 !\
        ldw     HPPA_FRAME_ARG(2)(sr0,sp), arg2 !\
        ldw     HPPA_FRAME_ARG(1)(sr0,sp), arg1 !\
        ldw     HPPA_FRAME_ARG(0)(sr0,sp), arg0 !\
        ldw     HPPA_FRAME_CRP(sr0,sp) ,rp
#else
#define _PROF_PROLOGUE
#endif

#define LEAF_ENTRY(x) ! .text ! .align  4       !\
        .export x, entry ! .label x ! .proc     !\
        .callinfo frame=0,no_calls,save_rp      !\
        .entry ! _PROF_PROLOGUE

#define ENTRY(x,n) ! .text ! .align 4                   !\
        .export x, entry ! .label x ! .proc             !\
        .callinfo frame=n,calls, save_rp, save_sp       !\
        .entry ! _PROF_PROLOGUE

#define ALTENTRY(x) ! .export x, entry ! .label  x
#define EXIT(x) ! .exit ! .procend ! .size   x, .-x

#define BSS(n,s)        ! .data ! .label n ! .comm s

#define STRONG_ALIAS(alias,sym) ! .global alias ! .set alias, sym
#define WEAK_ALIAS(alias,sym) ! .weak alias ! .set alias, sym

#endif /* _MACHINE_ASM_H_ */