#ifndef _PPC_ASM_H_
#define _PPC_ASM_H_
#ifdef __ELF__
#define __NO_UNDERSCORES__ 1
#define __ASMNL__ ;
#else
#define __ASMNL__ @
#endif
#ifdef ASSEMBLER
#ifdef __ELF__
#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
#define f0 0
#define f1 1
#define f2 2
#define f3 3
#define f4 4
#define f5 5
#define f6 6
#define f7 7
#define f8 8
#define f9 9
#define f10 10
#define f11 11
#define f12 12
#define f13 13
#define f14 14
#define f15 15
#define f16 16
#define f17 17
#define f18 18
#define f19 19
#define f20 20
#define f21 21
#define f22 22
#define f23 23
#define f24 24
#define f25 25
#define f26 26
#define f27 27
#define f28 28
#define f29 29
#define f30 30
#define f31 31
#define sr0 0
#define sr1 1
#define sr2 2
#define sr3 3
#define sr4 4
#define sr5 5
#define sr6 6
#define sr7 7
#define sr8 8
#define sr9 9
#define sr10 10
#define sr11 11
#define sr12 12
#define sr13 13
#define sr14 14
#define sr15 15
#define sr16 16
#define sr17 17
#define sr18 18
#define sr19 19
#define sr20 20
#define sr21 21
#define sr22 22
#define sr23 23
#define sr24 24
#define sr25 25
#define sr26 26
#define sr27 27
#define sr28 28
#define sr29 29
#define sr30 30
#define sr31 31
#endif
#define ARG0 r3
#define ARG1 r4
#define ARG2 r5
#define ARG3 r6
#define ARG4 r7
#define ARG5 r8
#define ARG6 r9
#define ARG7 r10
#define tmp0 r0
#define tmp1 r1
#define tmp2 r2
#define tmp3 r3
#define dmiss 976
#define dcmp 977
#define hash1 978
#define hash2 979
#define imiss 980
#define icmp 981
#define rpa 982
#define iabr 1010
#define pir 1023
#define mq 0
#define IBAT0U 528
#define IBAT0L 529
#define IBAT1U 530
#define IBAT1L 531
#define IBAT2U 532
#define IBAT2L 533
#define IBAT3U 534
#define IBAT3L 535
#define ibat0u 528
#define ibat0l 529
#define ibat1u 530
#define ibat1l 531
#define ibat2u 532
#define ibat2l 533
#define ibat3u 534
#define ibat3l 535
#define DBAT0U 536
#define DBAT0L 537
#define DBAT1U 538
#define DBAT1L 539
#define DBAT2U 540
#define DBAT2L 541
#define DBAT3U 542
#define DBAT3L 543
#define dbat0u 536
#define dbat0l 537
#define dbat1u 538
#define dbat1l 539
#define dbat2u 540
#define dbat2l 541
#define dbat3u 542
#define dbat3l 543
#define HID0 1008
#define hid0 1008
#define HID1 1009
#define hid1 1009
#define SDR1 25
#define sprg0 272
#define sprg1 273
#define sprg2 274
#define sprg3 275
#define ppcDAR 19
#define ppcdar 19
#define srr0 26
#define srr1 27
#define CR0 0
#define CR1 1
#define CR2 2
#define CR3 3
#define CR4 4
#define CR5 5
#define CR6 6
#define CR7 7
#ifdef __ELF__
#define cr0 0
#define cr1 1
#define cr2 2
#define cr3 3
#define cr4 4
#define cr5 5
#define cr6 6
#define cr7 7
#endif
#define cr0_lt 0
#define cr0_gt 1
#define cr0_eq 2
#define cr0_so 3
#define cr0_un 3
#ifndef __ELF__
#define HIGH_CADDR(x) ha16(x)
#define HIGH_ADDR(x) hi16(x)
#define LOW_ADDR(x) lo16(x)
#else
#define HIGH_CADDR(x) x@ha
#define HIGH_ADDR(x) x@h
#define LOW_ADDR(x) x@l
#endif
#endif
#define TAG_NO_FRAME_USED 0x00000000
#define FM_BACKPTR 0
#ifdef __ELF__
#define FM_LR_SAVE 4
#define FM_SIZE 16
#define FM_ARG0 8
#else
#define FM_CR_SAVE 4
#define FM_LR_SAVE 8
#define FM_SIZE 72
#define FM_ARG0 56
#endif
#define FM_ELF_ARG0 8
#define FM_MACHO_ARG0 56
#define MACHO_SYSCALL_BEGIN 0x2000
#define PK_SYSCALL_BEGIN 0x7000
#ifdef __ELF__
#define FM_REDZONE 0
#else
#define FM_REDZONE 224
#endif
#define COPYIN_ARG0_OFFSET FM_ARG0
#ifdef MACH_KERNEL_BUILD
#include <mach_kdb.h>
#else
#define MACH_KDB 0
#endif
#define BREAKPOINT_TRAP twge r2,r2
#ifndef __LANGUAGE_ASSEMBLY
#define ALIGN 2
#endif
#ifndef FALIGN
#define FALIGN 2
#endif
#define LB(x,n) n
#if __STDC__
#ifndef __NO_UNDERSCORES__
#define LCL(x) L ## x
#define EXT(x) _ ## x
#define LEXT(x) _ ## x ## :
#else
#define LCL(x) .L ## x
#define EXT(x) x
#define LEXT(x) x ## :
#endif
#define LBc(x,n) n ## :
#define LBb(x,n) n ## b
#define LBf(x,n) n ## f
#else
#ifndef __NO_UNDERSCORES__
#define LCL(x) Lx
#define EXT(x) _x
#define LEXT(x) _x:
#else
#define LCL(x) .Lx
#define EXT(x) x
#define LEXT(x) x:
#endif
#define LBc(x,n) n:
#define LBb(x,n) nb
#define LBf(x,n) nf
#endif
#define String .asciz
#define Value .word
#define Times(a,b) (a*b)
#define Divide(a,b) (a/b)
#define data16 .byte 0x66
#define addr16 .byte 0x67
#if !GPROF
#define MCOUNT
#elif defined(__SHARED__)
#define MCOUNT ; .data;\
.align ALIGN;\
LBc(x, 8) .long 0;\
.text;\
Gpush;\
Gload;\
leal Gotoff(LBb(x,8)),%edx;\
Egaddr(%eax,_mcount_ptr);\
Gpop;\
call *(%eax);
#else
#define MCOUNT ; .data;\
.align ALIGN;\
LBc(x, 8) .long 0;\
.text;\
movl $LBb(x,8),%edx;\
call *EXT(_mcount_ptr);
#endif
#ifdef __ELF__
#define ELF_FUNC(x) .type x,@function
#define ELF_DATA(x) .type x,@object
#define ELF_SIZE(x,s) .size x,s
#else
#define ELF_FUNC(x)
#define ELF_DATA(x)
#define ELF_SIZE(x,s)
#endif
#ifdef __ELF__
#define Entry(x,tag) .globl EXT(x); ELF_FUNC(EXT(x)); .long tag;.align FALIGN; LEXT(x)
#define ENTRY(x,tag) Entry(x,tag) MCOUNT
#define ENTRY2(x,y,tag) .globl EXT(x); .globl EXT(y); \
ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
.align FALIGN; LEXT(x); LEXT(y) \
MCOUNT
#if __STDC__
#define ASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
#else
#define ASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
#endif
#define DATA(x) .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
#else
#define Entry(x,tag) .text@.align FALIGN@ .globl EXT(x)@ LEXT(x)
#define ENTRY(x,tag) Entry(x,tag)@MCOUNT
#define ENTRY2(x,y,tag) .text@ .align FALIGN@ .globl EXT(x)@ .globl EXT(y)@ \
LEXT(x)@ LEXT(y) @\
MCOUNT
#if __STDC__
#define ASENTRY(x) .globl x @ .align FALIGN; x ## @ MCOUNT
#else
#define ASENTRY(x) .globl x @ .align FALIGN; x @ MCOUNT
#endif
#define DATA(x) .globl EXT(x) @ .align ALIGN @ LEXT(x)
#endif
#define End(x) ELF_SIZE(x,.-x)
#define END(x) End(EXT(x))
#define ENDDATA(x) END(x)
#define Enddata(x) End(x)
#ifndef __NO_UNDERSCORES__
#define CC_SYM_PREFIX "_"
#else
#define CC_SYM_PREFIX ""
#endif
#endif