1a9643ea8Slogwang /* $NetBSD: asm.h,v 1.29 2000/12/14 21:29:51 jeffs Exp $ */ 2a9643ea8Slogwang 3a9643ea8Slogwang /* 4*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause 5*22ce4affSfengbojiang * 6a9643ea8Slogwang * Copyright (c) 1992, 1993 7a9643ea8Slogwang * The Regents of the University of California. All rights reserved. 8a9643ea8Slogwang * 9a9643ea8Slogwang * This code is derived from software contributed to Berkeley by 10a9643ea8Slogwang * Ralph Campbell. 11a9643ea8Slogwang * 12a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 13a9643ea8Slogwang * modification, are permitted provided that the following conditions 14a9643ea8Slogwang * are met: 15a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 17a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 18a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 19a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 20*22ce4affSfengbojiang * 3. Neither the name of the University nor the names of its contributors 21a9643ea8Slogwang * may be used to endorse or promote products derived from this software 22a9643ea8Slogwang * without specific prior written permission. 23a9643ea8Slogwang * 24a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34a9643ea8Slogwang * SUCH DAMAGE. 35a9643ea8Slogwang * 36a9643ea8Slogwang * @(#)machAsmDefs.h 8.1 (Berkeley) 6/10/93 37a9643ea8Slogwang * JNPR: asm.h,v 1.10 2007/08/09 11:23:32 katta 38a9643ea8Slogwang * $FreeBSD$ 39a9643ea8Slogwang */ 40a9643ea8Slogwang 41a9643ea8Slogwang /* 42a9643ea8Slogwang * machAsmDefs.h -- 43a9643ea8Slogwang * 44a9643ea8Slogwang * Macros used when writing assembler programs. 45a9643ea8Slogwang * 46a9643ea8Slogwang * Copyright (C) 1989 Digital Equipment Corporation. 47a9643ea8Slogwang * Permission to use, copy, modify, and distribute this software and 48a9643ea8Slogwang * its documentation for any purpose and without fee is hereby granted, 49a9643ea8Slogwang * provided that the above copyright notice appears in all copies. 50a9643ea8Slogwang * Digital Equipment Corporation makes no representations about the 51a9643ea8Slogwang * suitability of this software for any purpose. It is provided "as is" 52a9643ea8Slogwang * without express or implied warranty. 53a9643ea8Slogwang * 54a9643ea8Slogwang * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAsmDefs.h, 55a9643ea8Slogwang * v 1.2 89/08/15 18:28:24 rab Exp SPRITE (DECWRL) 56a9643ea8Slogwang */ 57a9643ea8Slogwang 58a9643ea8Slogwang #ifndef _MACHINE_ASM_H_ 59a9643ea8Slogwang #define _MACHINE_ASM_H_ 60a9643ea8Slogwang 61*22ce4affSfengbojiang #include <machine/abi.h> 62a9643ea8Slogwang #include <machine/regdef.h> 63a9643ea8Slogwang #include <machine/endian.h> 64a9643ea8Slogwang #include <machine/cdefs.h> 65a9643ea8Slogwang 66a9643ea8Slogwang #undef __FBSDID 67a9643ea8Slogwang #if !defined(lint) && !defined(STRIP_FBSDID) 68a9643ea8Slogwang #define __FBSDID(s) .ident s 69a9643ea8Slogwang #else 70a9643ea8Slogwang #define __FBSDID(s) /* nothing */ 71a9643ea8Slogwang #endif 72a9643ea8Slogwang 73a9643ea8Slogwang /* 74a9643ea8Slogwang * Define -pg profile entry code. 75a9643ea8Slogwang * Must always be noreorder, must never use a macro instruction 76a9643ea8Slogwang * Final addiu to t9 must always equal the size of this _KERN_MCOUNT 77a9643ea8Slogwang */ 78a9643ea8Slogwang #define _KERN_MCOUNT \ 79a9643ea8Slogwang .set push; \ 80a9643ea8Slogwang .set noreorder; \ 81a9643ea8Slogwang .set noat; \ 82a9643ea8Slogwang subu sp,sp,16; \ 83a9643ea8Slogwang sw t9,12(sp); \ 84a9643ea8Slogwang move AT,ra; \ 85a9643ea8Slogwang lui t9,%hi(_mcount); \ 86a9643ea8Slogwang addiu t9,t9,%lo(_mcount); \ 87a9643ea8Slogwang jalr t9; \ 88a9643ea8Slogwang nop; \ 89a9643ea8Slogwang lw t9,4(sp); \ 90a9643ea8Slogwang addiu sp,sp,8; \ 91a9643ea8Slogwang addiu t9,t9,40; \ 92a9643ea8Slogwang .set pop; 93a9643ea8Slogwang 94a9643ea8Slogwang #ifdef GPROF 95a9643ea8Slogwang #define MCOUNT _KERN_MCOUNT 96a9643ea8Slogwang #else 97a9643ea8Slogwang #define MCOUNT 98a9643ea8Slogwang #endif 99a9643ea8Slogwang 100a9643ea8Slogwang #define _C_LABEL(x) x 101a9643ea8Slogwang 102a9643ea8Slogwang #ifdef USE_AENT 103a9643ea8Slogwang #define AENT(x) \ 104a9643ea8Slogwang .aent x, 0 105a9643ea8Slogwang #else 106a9643ea8Slogwang #define AENT(x) 107a9643ea8Slogwang #endif 108a9643ea8Slogwang 109a9643ea8Slogwang /* 110a9643ea8Slogwang * WARN_REFERENCES: create a warning if the specified symbol is referenced 111a9643ea8Slogwang */ 112a9643ea8Slogwang #define WARN_REFERENCES(_sym,_msg) \ 113a9643ea8Slogwang .section .gnu.warning. ## _sym ; .ascii _msg ; .text 114a9643ea8Slogwang 115a9643ea8Slogwang #ifdef __ELF__ 116a9643ea8Slogwang # define _C_LABEL(x) x 117a9643ea8Slogwang #else 118a9643ea8Slogwang # define _C_LABEL(x) _ ## x 119a9643ea8Slogwang #endif 120a9643ea8Slogwang 121a9643ea8Slogwang /* 122a9643ea8Slogwang * WEAK_ALIAS: create a weak alias. 123a9643ea8Slogwang */ 124a9643ea8Slogwang #define WEAK_ALIAS(alias,sym) \ 125a9643ea8Slogwang .weak alias; \ 126a9643ea8Slogwang alias = sym 127a9643ea8Slogwang 128a9643ea8Slogwang /* 129a9643ea8Slogwang * STRONG_ALIAS: create a strong alias. 130a9643ea8Slogwang */ 131a9643ea8Slogwang #define STRONG_ALIAS(alias,sym) \ 132a9643ea8Slogwang .globl alias; \ 133a9643ea8Slogwang alias = sym 134a9643ea8Slogwang 135a9643ea8Slogwang #define GLOBAL(sym) \ 136a9643ea8Slogwang .globl sym; sym: 137a9643ea8Slogwang 138a9643ea8Slogwang #define ENTRY(sym) \ 139a9643ea8Slogwang .text; .globl sym; .ent sym; sym: 140a9643ea8Slogwang 141a9643ea8Slogwang #define ASM_ENTRY(sym) \ 142a9643ea8Slogwang .text; .globl sym; .type sym,@function; sym: 143a9643ea8Slogwang 144a9643ea8Slogwang /* 145a9643ea8Slogwang * LEAF 146a9643ea8Slogwang * A leaf routine does 147a9643ea8Slogwang * - call no other function, 148a9643ea8Slogwang * - never use any register that callee-saved (S0-S8), and 149a9643ea8Slogwang * - not use any local stack storage. 150a9643ea8Slogwang */ 151a9643ea8Slogwang #define LEAF(x) \ 152a9643ea8Slogwang .globl _C_LABEL(x); \ 153a9643ea8Slogwang .ent _C_LABEL(x), 0; \ 154a9643ea8Slogwang _C_LABEL(x): ; \ 155a9643ea8Slogwang .frame sp, 0, ra; \ 156a9643ea8Slogwang MCOUNT 157a9643ea8Slogwang 158a9643ea8Slogwang /* 159a9643ea8Slogwang * LEAF_NOPROFILE 160a9643ea8Slogwang * No profilable leaf routine. 161a9643ea8Slogwang */ 162a9643ea8Slogwang #define LEAF_NOPROFILE(x) \ 163a9643ea8Slogwang .globl _C_LABEL(x); \ 164a9643ea8Slogwang .ent _C_LABEL(x), 0; \ 165a9643ea8Slogwang _C_LABEL(x): ; \ 166a9643ea8Slogwang .frame sp, 0, ra 167a9643ea8Slogwang 168a9643ea8Slogwang /* 169a9643ea8Slogwang * XLEAF 170a9643ea8Slogwang * declare alternate entry to leaf routine 171a9643ea8Slogwang */ 172a9643ea8Slogwang #define XLEAF(x) \ 173a9643ea8Slogwang .globl _C_LABEL(x); \ 174a9643ea8Slogwang AENT (_C_LABEL(x)); \ 175a9643ea8Slogwang _C_LABEL(x): 176a9643ea8Slogwang 177a9643ea8Slogwang /* 178a9643ea8Slogwang * NESTED 179a9643ea8Slogwang * A function calls other functions and needs 180a9643ea8Slogwang * therefore stack space to save/restore registers. 181a9643ea8Slogwang */ 182a9643ea8Slogwang #define NESTED(x, fsize, retpc) \ 183a9643ea8Slogwang .globl _C_LABEL(x); \ 184a9643ea8Slogwang .ent _C_LABEL(x), 0; \ 185a9643ea8Slogwang _C_LABEL(x): ; \ 186a9643ea8Slogwang .frame sp, fsize, retpc; \ 187a9643ea8Slogwang MCOUNT 188a9643ea8Slogwang 189a9643ea8Slogwang /* 190a9643ea8Slogwang * NESTED_NOPROFILE(x) 191a9643ea8Slogwang * No profilable nested routine. 192a9643ea8Slogwang */ 193a9643ea8Slogwang #define NESTED_NOPROFILE(x, fsize, retpc) \ 194a9643ea8Slogwang .globl _C_LABEL(x); \ 195a9643ea8Slogwang .ent _C_LABEL(x), 0; \ 196a9643ea8Slogwang _C_LABEL(x): ; \ 197a9643ea8Slogwang .frame sp, fsize, retpc 198a9643ea8Slogwang 199a9643ea8Slogwang /* 200a9643ea8Slogwang * XNESTED 201a9643ea8Slogwang * declare alternate entry point to nested routine. 202a9643ea8Slogwang */ 203a9643ea8Slogwang #define XNESTED(x) \ 204a9643ea8Slogwang .globl _C_LABEL(x); \ 205a9643ea8Slogwang AENT (_C_LABEL(x)); \ 206a9643ea8Slogwang _C_LABEL(x): 207a9643ea8Slogwang 208a9643ea8Slogwang /* 209a9643ea8Slogwang * END 210a9643ea8Slogwang * Mark end of a procedure. 211a9643ea8Slogwang */ 212a9643ea8Slogwang #define END(x) \ 213a9643ea8Slogwang .end _C_LABEL(x) 214a9643ea8Slogwang 215a9643ea8Slogwang /* 216a9643ea8Slogwang * IMPORT -- import external symbol 217a9643ea8Slogwang */ 218a9643ea8Slogwang #define IMPORT(sym, size) \ 219a9643ea8Slogwang .extern _C_LABEL(sym),size 220a9643ea8Slogwang 221a9643ea8Slogwang /* 222a9643ea8Slogwang * EXPORT -- export definition of symbol 223a9643ea8Slogwang */ 224a9643ea8Slogwang #define EXPORT(x) \ 225a9643ea8Slogwang .globl _C_LABEL(x); \ 226a9643ea8Slogwang _C_LABEL(x): 227a9643ea8Slogwang 228a9643ea8Slogwang /* 229a9643ea8Slogwang * VECTOR 230a9643ea8Slogwang * exception vector entrypoint 231a9643ea8Slogwang * XXX: regmask should be used to generate .mask 232a9643ea8Slogwang */ 233a9643ea8Slogwang #define VECTOR(x, regmask) \ 234a9643ea8Slogwang .ent _C_LABEL(x),0; \ 235a9643ea8Slogwang EXPORT(x); \ 236a9643ea8Slogwang 237a9643ea8Slogwang #define VECTOR_END(x) \ 238a9643ea8Slogwang EXPORT(x ## End); \ 239a9643ea8Slogwang END(x) 240a9643ea8Slogwang 241a9643ea8Slogwang /* 242a9643ea8Slogwang * Macros to panic and printf from assembly language. 243a9643ea8Slogwang */ 244a9643ea8Slogwang #define PANIC(msg) \ 245a9643ea8Slogwang PTR_LA a0, 9f; \ 246a9643ea8Slogwang jal _C_LABEL(panic); \ 247a9643ea8Slogwang nop; \ 248a9643ea8Slogwang MSG(msg) 249a9643ea8Slogwang 250a9643ea8Slogwang #define PANIC_KSEG0(msg, reg) PANIC(msg) 251a9643ea8Slogwang 252a9643ea8Slogwang #define PRINTF(msg) \ 253a9643ea8Slogwang PTR_LA a0, 9f; \ 254a9643ea8Slogwang jal _C_LABEL(printf); \ 255a9643ea8Slogwang nop; \ 256a9643ea8Slogwang MSG(msg) 257a9643ea8Slogwang 258a9643ea8Slogwang #define MSG(msg) \ 259a9643ea8Slogwang .rdata; \ 260a9643ea8Slogwang 9: .asciiz msg; \ 261a9643ea8Slogwang .text 262a9643ea8Slogwang 263a9643ea8Slogwang #define ASMSTR(str) \ 264a9643ea8Slogwang .asciiz str; \ 265a9643ea8Slogwang .align 3 266a9643ea8Slogwang 267a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64) 268a9643ea8Slogwang #define ALSK 7 /* stack alignment */ 269a9643ea8Slogwang #define ALMASK -7 /* stack alignment */ 270a9643ea8Slogwang #define SZFPREG 4 271a9643ea8Slogwang #define FP_L lwc1 272a9643ea8Slogwang #define FP_S swc1 273a9643ea8Slogwang #else 274a9643ea8Slogwang #define ALSK 15 /* stack alignment */ 275a9643ea8Slogwang #define ALMASK -15 /* stack alignment */ 276a9643ea8Slogwang #define SZFPREG 8 277a9643ea8Slogwang #define FP_L ldc1 278a9643ea8Slogwang #define FP_S sdc1 279a9643ea8Slogwang #endif 280a9643ea8Slogwang 281a9643ea8Slogwang /* 282a9643ea8Slogwang * Endian-independent assembly-code aliases for unaligned memory accesses. 283a9643ea8Slogwang */ 284a9643ea8Slogwang #if _BYTE_ORDER == _LITTLE_ENDIAN 285a9643ea8Slogwang # define LWHI lwr 286a9643ea8Slogwang # define LWLO lwl 287a9643ea8Slogwang # define SWHI swr 288a9643ea8Slogwang # define SWLO swl 289a9643ea8Slogwang # if SZREG == 4 290a9643ea8Slogwang # define REG_LHI lwr 291a9643ea8Slogwang # define REG_LLO lwl 292a9643ea8Slogwang # define REG_SHI swr 293a9643ea8Slogwang # define REG_SLO swl 294a9643ea8Slogwang # else 295a9643ea8Slogwang # define REG_LHI ldr 296a9643ea8Slogwang # define REG_LLO ldl 297a9643ea8Slogwang # define REG_SHI sdr 298a9643ea8Slogwang # define REG_SLO sdl 299a9643ea8Slogwang # endif 300a9643ea8Slogwang #endif 301a9643ea8Slogwang 302a9643ea8Slogwang #if _BYTE_ORDER == _BIG_ENDIAN 303a9643ea8Slogwang # define LWHI lwl 304a9643ea8Slogwang # define LWLO lwr 305a9643ea8Slogwang # define SWHI swl 306a9643ea8Slogwang # define SWLO swr 307a9643ea8Slogwang # if SZREG == 4 308a9643ea8Slogwang # define REG_LHI lwl 309a9643ea8Slogwang # define REG_LLO lwr 310a9643ea8Slogwang # define REG_SHI swl 311a9643ea8Slogwang # define REG_SLO swr 312a9643ea8Slogwang # else 313a9643ea8Slogwang # define REG_LHI ldl 314a9643ea8Slogwang # define REG_LLO ldr 315a9643ea8Slogwang # define REG_SHI sdl 316a9643ea8Slogwang # define REG_SLO sdr 317a9643ea8Slogwang # endif 318a9643ea8Slogwang #endif 319a9643ea8Slogwang 320a9643ea8Slogwang /* 321a9643ea8Slogwang * While it would be nice to be compatible with the SGI 322a9643ea8Slogwang * REG_L and REG_S macros, because they do not take parameters, it 323a9643ea8Slogwang * is impossible to use them with the _MIPS_SIM_ABIX32 model. 324a9643ea8Slogwang * 325a9643ea8Slogwang * These macros hide the use of mips3 instructions from the 326a9643ea8Slogwang * assembler to prevent the assembler from generating 64-bit style 327a9643ea8Slogwang * ABI calls. 328a9643ea8Slogwang */ 329a9643ea8Slogwang #if _MIPS_SZPTR == 32 330a9643ea8Slogwang #define PTR_ADD add 331a9643ea8Slogwang #define PTR_ADDI addi 332a9643ea8Slogwang #define PTR_ADDU addu 333a9643ea8Slogwang #define PTR_ADDIU addiu 334a9643ea8Slogwang #define PTR_SUB add 335a9643ea8Slogwang #define PTR_SUBI subi 336a9643ea8Slogwang #define PTR_SUBU subu 337a9643ea8Slogwang #define PTR_SUBIU subu 338a9643ea8Slogwang #define PTR_L lw 339a9643ea8Slogwang #define PTR_LA la 340a9643ea8Slogwang #define PTR_LI li 341a9643ea8Slogwang #define PTR_S sw 342a9643ea8Slogwang #define PTR_SLL sll 343a9643ea8Slogwang #define PTR_SLLV sllv 344a9643ea8Slogwang #define PTR_SRL srl 345a9643ea8Slogwang #define PTR_SRLV srlv 346a9643ea8Slogwang #define PTR_SRA sra 347a9643ea8Slogwang #define PTR_SRAV srav 348a9643ea8Slogwang #define PTR_LL ll 349a9643ea8Slogwang #define PTR_SC sc 350a9643ea8Slogwang #define PTR_WORD .word 351a9643ea8Slogwang #define PTR_SCALESHIFT 2 352a9643ea8Slogwang #else /* _MIPS_SZPTR == 64 */ 353a9643ea8Slogwang #define PTR_ADD dadd 354a9643ea8Slogwang #define PTR_ADDI daddi 355a9643ea8Slogwang #define PTR_ADDU daddu 356a9643ea8Slogwang #define PTR_ADDIU daddiu 357a9643ea8Slogwang #define PTR_SUB dadd 358a9643ea8Slogwang #define PTR_SUBI dsubi 359a9643ea8Slogwang #define PTR_SUBU dsubu 360a9643ea8Slogwang #define PTR_SUBIU dsubu 361a9643ea8Slogwang #define PTR_L ld 362a9643ea8Slogwang #define PTR_LA dla 363a9643ea8Slogwang #define PTR_LI dli 364a9643ea8Slogwang #define PTR_S sd 365a9643ea8Slogwang #define PTR_SLL dsll 366a9643ea8Slogwang #define PTR_SLLV dsllv 367a9643ea8Slogwang #define PTR_SRL dsrl 368a9643ea8Slogwang #define PTR_SRLV dsrlv 369a9643ea8Slogwang #define PTR_SRA dsra 370a9643ea8Slogwang #define PTR_SRAV dsrav 371a9643ea8Slogwang #define PTR_LL lld 372a9643ea8Slogwang #define PTR_SC scd 373a9643ea8Slogwang #define PTR_WORD .dword 374a9643ea8Slogwang #define PTR_SCALESHIFT 3 375a9643ea8Slogwang #endif /* _MIPS_SZPTR == 64 */ 376a9643ea8Slogwang 377a9643ea8Slogwang #if _MIPS_SZINT == 32 378a9643ea8Slogwang #define INT_ADD add 379a9643ea8Slogwang #define INT_ADDI addi 380a9643ea8Slogwang #define INT_ADDU addu 381a9643ea8Slogwang #define INT_ADDIU addiu 382a9643ea8Slogwang #define INT_SUB add 383a9643ea8Slogwang #define INT_SUBI subi 384a9643ea8Slogwang #define INT_SUBU subu 385a9643ea8Slogwang #define INT_SUBIU subu 386a9643ea8Slogwang #define INT_L lw 387a9643ea8Slogwang #define INT_LA la 388a9643ea8Slogwang #define INT_S sw 389a9643ea8Slogwang #define INT_SLL sll 390a9643ea8Slogwang #define INT_SLLV sllv 391a9643ea8Slogwang #define INT_SRL srl 392a9643ea8Slogwang #define INT_SRLV srlv 393a9643ea8Slogwang #define INT_SRA sra 394a9643ea8Slogwang #define INT_SRAV srav 395a9643ea8Slogwang #define INT_LL ll 396a9643ea8Slogwang #define INT_SC sc 397a9643ea8Slogwang #define INT_WORD .word 398a9643ea8Slogwang #define INT_SCALESHIFT 2 399a9643ea8Slogwang #else 400a9643ea8Slogwang #define INT_ADD dadd 401a9643ea8Slogwang #define INT_ADDI daddi 402a9643ea8Slogwang #define INT_ADDU daddu 403a9643ea8Slogwang #define INT_ADDIU daddiu 404a9643ea8Slogwang #define INT_SUB dadd 405a9643ea8Slogwang #define INT_SUBI dsubi 406a9643ea8Slogwang #define INT_SUBU dsubu 407a9643ea8Slogwang #define INT_SUBIU dsubu 408a9643ea8Slogwang #define INT_L ld 409a9643ea8Slogwang #define INT_LA dla 410a9643ea8Slogwang #define INT_S sd 411a9643ea8Slogwang #define INT_SLL dsll 412a9643ea8Slogwang #define INT_SLLV dsllv 413a9643ea8Slogwang #define INT_SRL dsrl 414a9643ea8Slogwang #define INT_SRLV dsrlv 415a9643ea8Slogwang #define INT_SRA dsra 416a9643ea8Slogwang #define INT_SRAV dsrav 417a9643ea8Slogwang #define INT_LL lld 418a9643ea8Slogwang #define INT_SC scd 419a9643ea8Slogwang #define INT_WORD .dword 420a9643ea8Slogwang #define INT_SCALESHIFT 3 421a9643ea8Slogwang #endif 422a9643ea8Slogwang 423a9643ea8Slogwang #if _MIPS_SZLONG == 32 424a9643ea8Slogwang #define LONG_ADD add 425a9643ea8Slogwang #define LONG_ADDI addi 426a9643ea8Slogwang #define LONG_ADDU addu 427a9643ea8Slogwang #define LONG_ADDIU addiu 428a9643ea8Slogwang #define LONG_SUB add 429a9643ea8Slogwang #define LONG_SUBI subi 430a9643ea8Slogwang #define LONG_SUBU subu 431a9643ea8Slogwang #define LONG_SUBIU subu 432a9643ea8Slogwang #define LONG_L lw 433a9643ea8Slogwang #define LONG_LA la 434a9643ea8Slogwang #define LONG_S sw 435a9643ea8Slogwang #define LONG_SLL sll 436a9643ea8Slogwang #define LONG_SLLV sllv 437a9643ea8Slogwang #define LONG_SRL srl 438a9643ea8Slogwang #define LONG_SRLV srlv 439a9643ea8Slogwang #define LONG_SRA sra 440a9643ea8Slogwang #define LONG_SRAV srav 441a9643ea8Slogwang #define LONG_LL ll 442a9643ea8Slogwang #define LONG_SC sc 443a9643ea8Slogwang #define LONG_WORD .word 444a9643ea8Slogwang #define LONG_SCALESHIFT 2 445a9643ea8Slogwang #else 446a9643ea8Slogwang #define LONG_ADD dadd 447a9643ea8Slogwang #define LONG_ADDI daddi 448a9643ea8Slogwang #define LONG_ADDU daddu 449a9643ea8Slogwang #define LONG_ADDIU daddiu 450a9643ea8Slogwang #define LONG_SUB dadd 451a9643ea8Slogwang #define LONG_SUBI dsubi 452a9643ea8Slogwang #define LONG_SUBU dsubu 453a9643ea8Slogwang #define LONG_SUBIU dsubu 454a9643ea8Slogwang #define LONG_L ld 455a9643ea8Slogwang #define LONG_LA dla 456a9643ea8Slogwang #define LONG_S sd 457a9643ea8Slogwang #define LONG_SLL dsll 458a9643ea8Slogwang #define LONG_SLLV dsllv 459a9643ea8Slogwang #define LONG_SRL dsrl 460a9643ea8Slogwang #define LONG_SRLV dsrlv 461a9643ea8Slogwang #define LONG_SRA dsra 462a9643ea8Slogwang #define LONG_SRAV dsrav 463a9643ea8Slogwang #define LONG_LL lld 464a9643ea8Slogwang #define LONG_SC scd 465a9643ea8Slogwang #define LONG_WORD .dword 466a9643ea8Slogwang #define LONG_SCALESHIFT 3 467a9643ea8Slogwang #endif 468a9643ea8Slogwang 469a9643ea8Slogwang #if SZREG == 4 470a9643ea8Slogwang #define REG_L lw 471a9643ea8Slogwang #define REG_S sw 472a9643ea8Slogwang #define REG_LI li 473a9643ea8Slogwang #define REG_ADDU addu 474a9643ea8Slogwang #define REG_SLL sll 475a9643ea8Slogwang #define REG_SLLV sllv 476a9643ea8Slogwang #define REG_SRL srl 477a9643ea8Slogwang #define REG_SRLV srlv 478a9643ea8Slogwang #define REG_SRA sra 479a9643ea8Slogwang #define REG_SRAV srav 480a9643ea8Slogwang #define REG_LL ll 481a9643ea8Slogwang #define REG_SC sc 482a9643ea8Slogwang #define REG_SCALESHIFT 2 483a9643ea8Slogwang #else 484a9643ea8Slogwang #define REG_L ld 485a9643ea8Slogwang #define REG_S sd 486a9643ea8Slogwang #define REG_LI dli 487a9643ea8Slogwang #define REG_ADDU daddu 488a9643ea8Slogwang #define REG_SLL dsll 489a9643ea8Slogwang #define REG_SLLV dsllv 490a9643ea8Slogwang #define REG_SRL dsrl 491a9643ea8Slogwang #define REG_SRLV dsrlv 492a9643ea8Slogwang #define REG_SRA dsra 493a9643ea8Slogwang #define REG_SRAV dsrav 494a9643ea8Slogwang #define REG_LL lld 495a9643ea8Slogwang #define REG_SC scd 496a9643ea8Slogwang #define REG_SCALESHIFT 3 497a9643ea8Slogwang #endif 498a9643ea8Slogwang 499a9643ea8Slogwang #if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2 || \ 500a9643ea8Slogwang _MIPS_ISA == _MIPS_ISA_MIPS32 501a9643ea8Slogwang #define MFC0 mfc0 502a9643ea8Slogwang #define MTC0 mtc0 503a9643ea8Slogwang #endif 504a9643ea8Slogwang #if _MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4 || \ 505a9643ea8Slogwang _MIPS_ISA == _MIPS_ISA_MIPS64 506a9643ea8Slogwang #define MFC0 dmfc0 507a9643ea8Slogwang #define MTC0 dmtc0 508a9643ea8Slogwang #endif 509a9643ea8Slogwang 510a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64) 511a9643ea8Slogwang 512a9643ea8Slogwang #ifdef __ABICALLS__ 513a9643ea8Slogwang #define CPRESTORE(r) .cprestore r 514a9643ea8Slogwang #define CPLOAD(r) .cpload r 515a9643ea8Slogwang #else 516a9643ea8Slogwang #define CPRESTORE(r) /* not needed */ 517a9643ea8Slogwang #define CPLOAD(r) /* not needed */ 518a9643ea8Slogwang #endif 519a9643ea8Slogwang 520a9643ea8Slogwang #define SETUP_GP \ 521a9643ea8Slogwang .set push; \ 522a9643ea8Slogwang .set noreorder; \ 523a9643ea8Slogwang .cpload t9; \ 524a9643ea8Slogwang .set pop 525a9643ea8Slogwang #define SETUP_GPX(r) \ 526a9643ea8Slogwang .set push; \ 527a9643ea8Slogwang .set noreorder; \ 528a9643ea8Slogwang move r,ra; /* save old ra */ \ 529a9643ea8Slogwang bal 7f; \ 530a9643ea8Slogwang nop; \ 531a9643ea8Slogwang 7: .cpload ra; \ 532a9643ea8Slogwang move ra,r; \ 533a9643ea8Slogwang .set pop 534a9643ea8Slogwang #define SETUP_GPX_L(r,lbl) \ 535a9643ea8Slogwang .set push; \ 536a9643ea8Slogwang .set noreorder; \ 537a9643ea8Slogwang move r,ra; /* save old ra */ \ 538a9643ea8Slogwang bal lbl; \ 539a9643ea8Slogwang nop; \ 540a9643ea8Slogwang lbl: .cpload ra; \ 541a9643ea8Slogwang move ra,r; \ 542a9643ea8Slogwang .set pop 543a9643ea8Slogwang #define SAVE_GP(x) .cprestore x 544a9643ea8Slogwang 545a9643ea8Slogwang #define SETUP_GP64(a,b) /* n32/n64 specific */ 546a9643ea8Slogwang #define SETUP_GP64_R(a,b) /* n32/n64 specific */ 547a9643ea8Slogwang #define SETUP_GPX64(a,b) /* n32/n64 specific */ 548a9643ea8Slogwang #define SETUP_GPX64_L(a,b,c) /* n32/n64 specific */ 549a9643ea8Slogwang #define RESTORE_GP64 /* n32/n64 specific */ 550a9643ea8Slogwang #define USE_ALT_CP(a) /* n32/n64 specific */ 551a9643ea8Slogwang #endif /* __mips_o32 || __mips_o64 */ 552a9643ea8Slogwang 553a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64) 554a9643ea8Slogwang #define REG_PROLOGUE .set push 555a9643ea8Slogwang #define REG_EPILOGUE .set pop 556a9643ea8Slogwang #endif 557a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64) 558a9643ea8Slogwang #define REG_PROLOGUE .set push ; .set mips3 559a9643ea8Slogwang #define REG_EPILOGUE .set pop 560a9643ea8Slogwang #endif 561a9643ea8Slogwang 562a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64) 563a9643ea8Slogwang #define SETUP_GP /* o32 specific */ 564a9643ea8Slogwang #define SETUP_GPX(r) /* o32 specific */ 565a9643ea8Slogwang #define SETUP_GPX_L(r,lbl) /* o32 specific */ 566a9643ea8Slogwang #define SAVE_GP(x) /* o32 specific */ 567a9643ea8Slogwang #define SETUP_GP64(a,b) .cpsetup $25, a, b 568a9643ea8Slogwang #define SETUP_GPX64(a,b) \ 569a9643ea8Slogwang .set push; \ 570a9643ea8Slogwang move b,ra; \ 571a9643ea8Slogwang .set noreorder; \ 572a9643ea8Slogwang bal 7f; \ 573a9643ea8Slogwang nop; \ 574a9643ea8Slogwang 7: .set pop; \ 575a9643ea8Slogwang .cpsetup ra, a, 7b; \ 576a9643ea8Slogwang move ra,b 577a9643ea8Slogwang #define SETUP_GPX64_L(a,b,c) \ 578a9643ea8Slogwang .set push; \ 579a9643ea8Slogwang move b,ra; \ 580a9643ea8Slogwang .set noreorder; \ 581a9643ea8Slogwang bal c; \ 582a9643ea8Slogwang nop; \ 583a9643ea8Slogwang c: .set pop; \ 584a9643ea8Slogwang .cpsetup ra, a, c; \ 585a9643ea8Slogwang move ra,b 586a9643ea8Slogwang #define RESTORE_GP64 .cpreturn 587a9643ea8Slogwang #define USE_ALT_CP(a) .cplocal a 588a9643ea8Slogwang #endif /* __mips_n32 || __mips_n64 */ 589a9643ea8Slogwang 590a9643ea8Slogwang #define GET_CPU_PCPU(reg) \ 591a9643ea8Slogwang PTR_L reg, _C_LABEL(pcpup); 592a9643ea8Slogwang 593a9643ea8Slogwang /* 594a9643ea8Slogwang * Description of the setjmp buffer 595a9643ea8Slogwang * 596a9643ea8Slogwang * word 0 magic number (dependant on creator) 597a9643ea8Slogwang * 1 RA 598a9643ea8Slogwang * 2 S0 599a9643ea8Slogwang * 3 S1 600a9643ea8Slogwang * 4 S2 601a9643ea8Slogwang * 5 S3 602a9643ea8Slogwang * 6 S4 603a9643ea8Slogwang * 7 S5 604a9643ea8Slogwang * 8 S6 605a9643ea8Slogwang * 9 S7 606a9643ea8Slogwang * 10 SP 607a9643ea8Slogwang * 11 S8 608a9643ea8Slogwang * 12 GP (dependent on ABI) 609a9643ea8Slogwang * 13 signal mask (dependant on magic) 610a9643ea8Slogwang * 14 (con't) 611a9643ea8Slogwang * 15 (con't) 612a9643ea8Slogwang * 16 (con't) 613a9643ea8Slogwang * 614a9643ea8Slogwang * The magic number number identifies the jmp_buf and 615a9643ea8Slogwang * how the buffer was created as well as providing 616a9643ea8Slogwang * a sanity check 617a9643ea8Slogwang * 618a9643ea8Slogwang */ 619a9643ea8Slogwang 620a9643ea8Slogwang #define _JB_MAGIC__SETJMP 0xBADFACED 621a9643ea8Slogwang #define _JB_MAGIC_SETJMP 0xFACEDBAD 622a9643ea8Slogwang 623a9643ea8Slogwang /* Valid for all jmp_buf's */ 624a9643ea8Slogwang 625a9643ea8Slogwang #define _JB_MAGIC 0 626a9643ea8Slogwang #define _JB_REG_RA 1 627a9643ea8Slogwang #define _JB_REG_S0 2 628a9643ea8Slogwang #define _JB_REG_S1 3 629a9643ea8Slogwang #define _JB_REG_S2 4 630a9643ea8Slogwang #define _JB_REG_S3 5 631a9643ea8Slogwang #define _JB_REG_S4 6 632a9643ea8Slogwang #define _JB_REG_S5 7 633a9643ea8Slogwang #define _JB_REG_S6 8 634a9643ea8Slogwang #define _JB_REG_S7 9 635a9643ea8Slogwang #define _JB_REG_SP 10 636a9643ea8Slogwang #define _JB_REG_S8 11 637a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64) 638a9643ea8Slogwang #define _JB_REG_GP 12 639a9643ea8Slogwang #endif 640a9643ea8Slogwang 641a9643ea8Slogwang /* Only valid with the _JB_MAGIC_SETJMP magic */ 642a9643ea8Slogwang 643a9643ea8Slogwang #define _JB_SIGMASK 13 644a9643ea8Slogwang #define __JB_SIGMASK_REMAINDER 14 /* sigmask_t is 128-bits */ 645a9643ea8Slogwang 646a9643ea8Slogwang #define _JB_FPREG_F20 15 647a9643ea8Slogwang #define _JB_FPREG_F21 16 648a9643ea8Slogwang #define _JB_FPREG_F22 17 649a9643ea8Slogwang #define _JB_FPREG_F23 18 650a9643ea8Slogwang #define _JB_FPREG_F24 19 651a9643ea8Slogwang #define _JB_FPREG_F25 20 652a9643ea8Slogwang #define _JB_FPREG_F26 21 653a9643ea8Slogwang #define _JB_FPREG_F27 22 654a9643ea8Slogwang #define _JB_FPREG_F28 23 655a9643ea8Slogwang #define _JB_FPREG_F29 24 656a9643ea8Slogwang #define _JB_FPREG_F30 25 657a9643ea8Slogwang #define _JB_FPREG_F31 26 658a9643ea8Slogwang #define _JB_FPREG_FCSR 27 659a9643ea8Slogwang 660a9643ea8Slogwang /* 661a9643ea8Slogwang * Various macros for dealing with TLB hazards 662a9643ea8Slogwang * (a) why so many? 663a9643ea8Slogwang * (b) when to use? 664a9643ea8Slogwang * (c) why not used everywhere? 665a9643ea8Slogwang */ 666a9643ea8Slogwang /* 667a9643ea8Slogwang * Assume that w alaways need nops to escape CP0 hazard 668a9643ea8Slogwang * TODO: Make hazard delays configurable. Stuck with 5 cycles on the moment 669a9643ea8Slogwang * For more info on CP0 hazards see Chapter 7 (p.99) of "MIPS32 Architecture 670a9643ea8Slogwang * For Programmers Volume III: The MIPS32 Privileged Resource Architecture" 671a9643ea8Slogwang */ 672a9643ea8Slogwang #if defined(CPU_NLM) 673a9643ea8Slogwang #define HAZARD_DELAY sll $0,3 674a9643ea8Slogwang #define ITLBNOPFIX sll $0,3 675a9643ea8Slogwang #elif defined(CPU_RMI) 676a9643ea8Slogwang #define HAZARD_DELAY 677a9643ea8Slogwang #define ITLBNOPFIX 678a9643ea8Slogwang #elif defined(CPU_MIPS74K) 679a9643ea8Slogwang #define HAZARD_DELAY sll $0,$0,3 680a9643ea8Slogwang #define ITLBNOPFIX sll $0,$0,3 681a9643ea8Slogwang #else 682a9643ea8Slogwang #define ITLBNOPFIX nop;nop;nop;nop;nop;nop;nop;nop;nop;sll $0,$0,3; 683a9643ea8Slogwang #define HAZARD_DELAY nop;nop;nop;nop;sll $0,$0,3; 684a9643ea8Slogwang #endif 685a9643ea8Slogwang 686a9643ea8Slogwang #endif /* !_MACHINE_ASM_H_ */ 687