1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* Copyright (c) 1996 NeXT Software, Inc. All rights reserved. 29 * 30 * File: architecture/ppc/reg_help.h 31 * Author: Doug Mitchell, NeXT Computer, Inc. 32 * 33 * m98k-specific macros and inlines for defining machine registers. 34 * 35 * HISTORY 36 * 05-Nov-92 Doug Mitchell at NeXT 37 * Created. 38 * 39 * 29-Dec-96 Umesh Vaishampayan (umeshv@NeXT.com) 40 * Ported from m98k. Removed dependency on nrw directory. 41 * Merged code from architecture/nrw/reg_help.h. 42 * Moved Register Usage #defines from asm_help.h in here. 43 */ 44 45#ifndef _ARCH_PPC_REG_HELP_H_ 46#define _ARCH_PPC_REG_HELP_H_ 47 48#if defined(__ASSEMBLER__) 49/* 50 * GRF Register Usage Aliases 51 */ 52#define zt r0 // architecturally 0 for mem refs only! 53 // real reg other inst, caller-saved 54#define sp r1 // stack pointer, callee-saved 55#define toc r2 // tbl of contents, callee-saved 56#define a0 r3 // arg 0, return value 0, caller saved 57#define a1 r4 // arg 1, return value 1, caller saved 58#define a2 r5 // .... 59#define a3 r6 60#define a4 r7 61#define a5 r8 62#define a6 r9 63#define a7 r10 // arg 7, return value 7, caller saved 64#define ep r11 // environment ptr, caller saved 65#define at r12 // assembler temp, caller saved 66#define s17 r13 // callee-saved 17 67#define s16 r14 68#define s15 r15 69#define s14 r16 70#define s13 r17 71#define s12 r18 72#define s11 r19 73#define s10 r20 74#define s9 r21 75#define s8 r22 76#define s7 r23 77#define s6 r24 78#define s5 r25 79#define s4 r26 80#define s3 r27 81#define s2 r28 82#define s1 r29 // .... 83#define s0 r30 // callee-saved 0 84#define fp r31 // frame-pointer, callee-saved 85 86/* 87 * Conversion of GRF aliases to register numbers 88 */ 89#define GRF_ZT 0 // architecturally 0 for mem refs only! 90 // real reg other inst, caller-saved 91#define GRF_SP 1 // stack pointer, callee-saved 92#define GRF_TOC 2 // tbl of contents, callee-saved 93#define GRF_A0 3 // arg 0, return value 0, caller saved 94#define GRF_A1 4 // arg 1, return value 1, caller saved 95#define GRF_A2 5 // .... 96#define GRF_A3 6 97#define GRF_A4 7 98#define GRF_A5 8 99#define GRF_A6 9 100#define GRF_A7 10 // arg 7, return value 7, caller saved 101#define GRF_EP 11 // environment ptr, caller saved 102#define GRF_AT 12 // assembler temp, caller saved 103#define GRF_S17 13 // callee-saved 17 104#define GRF_S16 14 105#define GRF_S15 15 106#define GRF_S14 16 107#define GRF_S13 17 108#define GRF_S12 18 109#define GRF_S11 19 110#define GRF_S10 20 111#define GRF_S9 21 112#define GRF_S8 22 113#define GRF_S7 23 114#define GRF_S6 24 115#define GRF_S5 25 116#define GRF_S4 26 117#define GRF_S3 27 118#define GRF_S2 28 119#define GRF_S1 29 // .... 120#define GRF_S0 30 // callee-saved 0 121#define GRF_FP 31 // frame pointer, callee-saved 122 123/* 124 * FPF Register names 125 */ 126#define ft0 f0 // scratch reg, caller-saved 127#define fa0 f1 // fp arg 0, return 0, caller-saved 128#define fa1 f2 // fp arg 1, caller-saved 129#define fa2 f3 // fp arg 2, caller-saved 130#define fa3 f4 131#define fa4 f5 132#define fa5 f6 133#define fa6 f7 134#define fa7 f8 135#define fa8 f9 136#define fa9 f10 137#define fa10 f11 138#define fa11 f12 139#define fa12 f13 // fp arg 12, caller-saved 140#define fs17 f14 // callee-saved 17 141#define fs16 f15 142#define fs15 f16 143#define fs14 f17 144#define fs13 f18 145#define fs12 f19 146#define fs11 f20 147#define fs10 f21 148#define fs9 f22 149#define fs8 f23 150#define fs7 f24 151#define fs6 f25 152#define fs5 f26 153#define fs4 f27 154#define fs3 f28 155#define fs2 f29 156#define fs1 f30 157#define fs0 f31 // callee-saved 0 158 159/* 160 * Conversion of FPF aliases to register numbers 161 */ 162#define FPF_FT0 0 // scratch reg, caller-saved 163#define FPF_FA0 1 // fp arg 0, return 0, caller-saved 164#define FPF_FA1 2 // fp arg 1, caller-saved 165#define FPF_FA2 3 // fp arg 2, caller-saved 166#define FPF_FA3 4 167#define FPF_FA4 5 168#define FPF_FA5 6 169#define FPF_FA6 7 170#define FPF_FA7 8 171#define FPF_FA8 9 172#define FPF_FA9 10 173#define FPF_FA10 11 174#define FPF_FA11 12 175#define FPF_FA12 13 // fp arg 12, caller-saved 176#define FPF_FS17 14 // callee-saved 17 177#define FPF_FS16 15 178#define FPF_FS15 16 179#define FPF_FS14 17 180#define FPF_FS13 18 181#define FPF_FS12 19 182#define FPF_FS11 20 183#define FPF_FS10 21 184#define FPF_FS9 22 185#define FPF_FS8 23 186#define FPF_FS7 24 187#define FPF_FS6 25 188#define FPF_FS5 26 189#define FPF_FS4 27 190#define FPF_FS3 28 191#define FPF_FS2 29 192#define FPF_FS1 30 193#define FPF_FS0 31 // callee-saved 0 194 195#endif /* __ASSEMBLER__ */ 196 197 198/* Bitfield definition aid */ 199#define BITS_WIDTH(msb, lsb) ((msb)-(lsb)+1) 200#define BIT_WIDTH(pos) (1) /* mostly to record the position */ 201 202/* Mask creation */ 203#define MKMASK(width, offset) (((unsigned)-1)>>(32-(width))<<(offset)) 204#define BITSMASK(msb, lsb) MKMASK(BITS_WIDTH(msb, lsb), lsb & 0x1f) 205#define BITMASK(pos) MKMASK(BIT_WIDTH(pos), pos & 0x1f) 206 207/* Register addresses */ 208#if __ASSEMBLER__ 209# define REG_ADDR(type, addr) (addr) 210#else /* ! __ASSEMBLER__ */ 211# define REG_ADDR(type, addr) (*(volatile type *)(addr)) 212#endif /* __ASSEMBLER__ */ 213 214/* Cast a register to be an unsigned */ 215/* CAUTION : non naturally aligned foo can result into alignment traps 216 * use at own risk. 217 */ 218#define CONTENTS(foo) (*(unsigned *) &(foo)) 219 220/* STRINGIFY -- perform all possible substitutions, then stringify */ 221#define __STR(x) #x /* just a helper macro */ 222#define STRINGIFY(x) __STR(x) 223 224/* 225 * Stack pointer must always be a multiple of 16 226 */ 227#define STACK_INCR 16 228#define ROUND_FRAME(x) ((((unsigned)(x)) + STACK_INCR - 1) & ~(STACK_INCR-1)) 229 230#endif /* _ARCH_PPC_REG_HELP_H_ */ 231