151 lines
3.1 KiB
C
151 lines
3.1 KiB
C
/* -*- asm -*-
|
|
*
|
|
* Creation Date: <2001/02/03 19:38:07 samuel>
|
|
* Time-stamp: <2003/07/08 18:55:50 samuel>
|
|
*
|
|
* <asmdefs.h>
|
|
*
|
|
* Common assembly definitions
|
|
*
|
|
* Copyright (C) 2001, 2002, 2003 Samuel Rydh (samuel@ibrium.se)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation
|
|
*
|
|
*/
|
|
|
|
#ifndef _H_ASMDEFS
|
|
#define _H_ASMDEFS
|
|
|
|
/************************************************************************/
|
|
/* High/low halfword compatibility macros */
|
|
/************************************************************************/
|
|
|
|
#ifndef __darwin__
|
|
#define ha16( v ) (v)##@ha
|
|
#define hi16( v ) (v)##@h
|
|
#define lo16( v ) (v)##@l
|
|
#endif
|
|
#define HA(v) ha16(v)
|
|
#define HI(v) hi16(v)
|
|
#define LO(v) lo16(v)
|
|
|
|
/* from Linux: include/asm-powerpc/ppc_asm.h */
|
|
/*
|
|
* Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan.
|
|
*/
|
|
|
|
/* General Purpose Registers (GPRs) */
|
|
|
|
#define r0 0
|
|
#define r1 1
|
|
#define r2 2
|
|
#define r3 3
|
|
#define r4 4
|
|
#define r5 5
|
|
#define r6 6
|
|
#define r7 7
|
|
#define r8 8
|
|
#define r9 9
|
|
#define r10 10
|
|
#define r11 11
|
|
#define r12 12
|
|
#define r13 13
|
|
#define r14 14
|
|
#define r15 15
|
|
#define r16 16
|
|
#define r17 17
|
|
#define r18 18
|
|
#define r19 19
|
|
#define r20 20
|
|
#define r21 21
|
|
#define r22 22
|
|
#define r23 23
|
|
#define r24 24
|
|
#define r25 25
|
|
#define r26 26
|
|
#define r27 27
|
|
#define r28 28
|
|
#define r29 29
|
|
#define r30 30
|
|
#define r31 31
|
|
|
|
/************************************************************************/
|
|
/* MISC */
|
|
/************************************************************************/
|
|
|
|
#ifdef __powerpc64__
|
|
|
|
#define LOAD_REG_IMMEDIATE(D, x) \
|
|
lis (D), (x)@highest ; \
|
|
ori (D), (D), (x)@higher ; \
|
|
sldi (D), (D), 32 ; \
|
|
oris (D), (D), (x)@h ; \
|
|
ori (D), (D), (x)@l
|
|
|
|
#define LOAD_REG_FUNC(D, x) \
|
|
LOAD_REG_IMMEDIATE((D), (x)) ; \
|
|
ld (D), 0(D)
|
|
|
|
#else
|
|
|
|
#define LOAD_REG_IMMEDIATE(D, x) \
|
|
lis (D), HA(x) ; \
|
|
addi (D), (D), LO(x)
|
|
|
|
#define LOAD_REG_FUNC(D, x) \
|
|
LOAD_REG_IMMEDIATE((D), (x))
|
|
|
|
#endif
|
|
|
|
#ifdef __powerpc64__
|
|
#define PPC_LL ld
|
|
#define PPC_STL std
|
|
#define PPC_STLU stdu
|
|
#define RFI rfid
|
|
#define MTMSRD(r) mtmsrd r
|
|
#define DATA_LONG(x) .quad x
|
|
#define BRANCH_LABEL(name) . ## name
|
|
#define PPC_LR_STKOFF 16
|
|
#else
|
|
#define PPC_LL lwz
|
|
#define PPC_STL stw
|
|
#define PPC_STLU stwu
|
|
#define RFI rfi
|
|
#define MTMSRD(r) mtmsr r
|
|
#define DATA_LONG(x) .long x
|
|
#define BRANCH_LABEL(name) name
|
|
#define PPC_LR_STKOFF 4
|
|
#endif
|
|
|
|
#ifndef __darwin__
|
|
#define GLOBL( name ) .globl name ; name
|
|
#define EXTERN( name ) name
|
|
#else
|
|
/* an underscore is needed on Darwin */
|
|
#define GLOBL( name ) .globl _##name ; name: ; _##name
|
|
#define EXTERN( name ) _##name
|
|
#endif
|
|
|
|
#if defined(__powerpc64__) && !defined(__darwin__)
|
|
#define _GLOBAL(name) \
|
|
.align 2 ; \
|
|
.section ".opd", "aw" ; \
|
|
.globl name ; \
|
|
.globl .##name ; \
|
|
name: \
|
|
.quad .##name ; \
|
|
.quad .TOC.@tocbase ; \
|
|
.quad 0 ; \
|
|
.previous ; \
|
|
.type .##name, @function ; \
|
|
.##name
|
|
#else
|
|
#define _GLOBAL(name) \
|
|
GLOBL(name)
|
|
#endif
|
|
|
|
#define BIT(n) (1<<(31-(n)))
|
|
|
|
#endif /* _H_ASMDEFS */
|