1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle 3*4882a593Smuzhiyun * Copyright (C) 1999 by Silicon Graphics, Inc. 4*4882a593Smuzhiyun * Copyright (C) 2001 MIPS Technologies, Inc. 5*4882a593Smuzhiyun * Copyright (C) 2002 Maciej W. Rozycki 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Some useful macros for MIPS assembler code 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Some of the routines below contain useless nops that will be optimized 10*4882a593Smuzhiyun * away by gas in -O mode. These nops are however required to fill delay 11*4882a593Smuzhiyun * slots in noreorder mode. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun #ifndef __ASM_ASM_H 16*4882a593Smuzhiyun #define __ASM_ASM_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <asm/sgidefs.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #ifndef CAT 21*4882a593Smuzhiyun #ifdef __STDC__ 22*4882a593Smuzhiyun #define __CAT(str1, str2) str1##str2 23*4882a593Smuzhiyun #else 24*4882a593Smuzhiyun #define __CAT(str1, str2) str1/**/str2 25*4882a593Smuzhiyun #endif 26*4882a593Smuzhiyun #define CAT(str1, str2) __CAT(str1, str2) 27*4882a593Smuzhiyun #endif 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* 30*4882a593Smuzhiyun * PIC specific declarations 31*4882a593Smuzhiyun * Not used for the kernel but here seems to be the right place. 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun #ifdef __PIC__ 34*4882a593Smuzhiyun #define CPRESTORE(register) \ 35*4882a593Smuzhiyun .cprestore register 36*4882a593Smuzhiyun #define CPADD(register) \ 37*4882a593Smuzhiyun .cpadd register 38*4882a593Smuzhiyun #define CPLOAD(register) \ 39*4882a593Smuzhiyun .cpload register 40*4882a593Smuzhiyun #else 41*4882a593Smuzhiyun #define CPRESTORE(register) 42*4882a593Smuzhiyun #define CPADD(register) 43*4882a593Smuzhiyun #define CPLOAD(register) 44*4882a593Smuzhiyun #endif 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define ENTRY(symbol) \ 47*4882a593Smuzhiyun .globl symbol; \ 48*4882a593Smuzhiyun .type symbol, @function; \ 49*4882a593Smuzhiyun .ent symbol, 0; \ 50*4882a593Smuzhiyun symbol: 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * LEAF - declare leaf routine 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun #define LEAF(symbol) \ 56*4882a593Smuzhiyun .globl symbol; \ 57*4882a593Smuzhiyun .align 2; \ 58*4882a593Smuzhiyun .type symbol, @function; \ 59*4882a593Smuzhiyun .ent symbol, 0; \ 60*4882a593Smuzhiyun .section .text.symbol, "x"; \ 61*4882a593Smuzhiyun symbol: .frame sp, 0, ra 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * NESTED - declare nested routine entry point 65*4882a593Smuzhiyun */ 66*4882a593Smuzhiyun #define NESTED(symbol, framesize, rpc) \ 67*4882a593Smuzhiyun .globl symbol; \ 68*4882a593Smuzhiyun .align 2; \ 69*4882a593Smuzhiyun .type symbol, @function; \ 70*4882a593Smuzhiyun .ent symbol, 0; \ 71*4882a593Smuzhiyun .section .text.symbol, "x"; \ 72*4882a593Smuzhiyun symbol: .frame sp, framesize, rpc 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* 75*4882a593Smuzhiyun * END - mark end of function 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun #define END(function) \ 78*4882a593Smuzhiyun .end function; \ 79*4882a593Smuzhiyun .size function, .-function 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* 82*4882a593Smuzhiyun * EXPORT - export definition of symbol 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun #define EXPORT(symbol) \ 85*4882a593Smuzhiyun .globl symbol; \ 86*4882a593Smuzhiyun symbol: 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* 89*4882a593Smuzhiyun * FEXPORT - export definition of a function symbol 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun #define FEXPORT(symbol) \ 92*4882a593Smuzhiyun .globl symbol; \ 93*4882a593Smuzhiyun .type symbol, @function; \ 94*4882a593Smuzhiyun symbol: 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* 97*4882a593Smuzhiyun * ABS - export absolute symbol 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun #define ABS(symbol,value) \ 100*4882a593Smuzhiyun .globl symbol; \ 101*4882a593Smuzhiyun symbol = value 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define PANIC(msg) \ 104*4882a593Smuzhiyun .set push; \ 105*4882a593Smuzhiyun .set reorder; \ 106*4882a593Smuzhiyun PTR_LA a0, 8f; \ 107*4882a593Smuzhiyun jal panic; \ 108*4882a593Smuzhiyun 9: b 9b; \ 109*4882a593Smuzhiyun .set pop; \ 110*4882a593Smuzhiyun TEXT(msg) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* 113*4882a593Smuzhiyun * Print formatted string 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun #ifdef CONFIG_PRINTK 116*4882a593Smuzhiyun #define PRINT(string) \ 117*4882a593Smuzhiyun .set push; \ 118*4882a593Smuzhiyun .set reorder; \ 119*4882a593Smuzhiyun PTR_LA a0, 8f; \ 120*4882a593Smuzhiyun jal printk; \ 121*4882a593Smuzhiyun .set pop; \ 122*4882a593Smuzhiyun TEXT(string) 123*4882a593Smuzhiyun #else 124*4882a593Smuzhiyun #define PRINT(string) 125*4882a593Smuzhiyun #endif 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define TEXT(msg) \ 128*4882a593Smuzhiyun .pushsection .data; \ 129*4882a593Smuzhiyun 8: .asciiz msg; \ 130*4882a593Smuzhiyun .popsection; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* 133*4882a593Smuzhiyun * Build text tables 134*4882a593Smuzhiyun */ 135*4882a593Smuzhiyun #define TTABLE(string) \ 136*4882a593Smuzhiyun .pushsection .text; \ 137*4882a593Smuzhiyun .word 1f; \ 138*4882a593Smuzhiyun .popsection \ 139*4882a593Smuzhiyun .pushsection .data; \ 140*4882a593Smuzhiyun 1: .asciiz string; \ 141*4882a593Smuzhiyun .popsection 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* 144*4882a593Smuzhiyun * MIPS IV pref instruction. 145*4882a593Smuzhiyun * Use with .set noreorder only! 146*4882a593Smuzhiyun * 147*4882a593Smuzhiyun * MIPS IV implementations are free to treat this as a nop. The R5000 148*4882a593Smuzhiyun * is one of them. So we should have an option not to use this instruction. 149*4882a593Smuzhiyun */ 150*4882a593Smuzhiyun #ifdef CONFIG_CPU_HAS_PREFETCH 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define PREF(hint, addr) \ 153*4882a593Smuzhiyun .set push; \ 154*4882a593Smuzhiyun .set arch=r5000; \ 155*4882a593Smuzhiyun pref hint, addr; \ 156*4882a593Smuzhiyun .set pop 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define PREFE(hint, addr) \ 159*4882a593Smuzhiyun .set push; \ 160*4882a593Smuzhiyun .set mips0; \ 161*4882a593Smuzhiyun .set eva; \ 162*4882a593Smuzhiyun prefe hint, addr; \ 163*4882a593Smuzhiyun .set pop 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define PREFX(hint, addr) \ 166*4882a593Smuzhiyun .set push; \ 167*4882a593Smuzhiyun .set arch=r5000; \ 168*4882a593Smuzhiyun prefx hint, addr; \ 169*4882a593Smuzhiyun .set pop 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #else /* !CONFIG_CPU_HAS_PREFETCH */ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define PREF(hint, addr) 174*4882a593Smuzhiyun #define PREFE(hint, addr) 175*4882a593Smuzhiyun #define PREFX(hint, addr) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #endif /* !CONFIG_CPU_HAS_PREFETCH */ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* 180*4882a593Smuzhiyun * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs. 181*4882a593Smuzhiyun */ 182*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS1) 183*4882a593Smuzhiyun #define MOVN(rd, rs, rt) \ 184*4882a593Smuzhiyun .set push; \ 185*4882a593Smuzhiyun .set reorder; \ 186*4882a593Smuzhiyun beqz rt, 9f; \ 187*4882a593Smuzhiyun move rd, rs; \ 188*4882a593Smuzhiyun .set pop; \ 189*4882a593Smuzhiyun 9: 190*4882a593Smuzhiyun #define MOVZ(rd, rs, rt) \ 191*4882a593Smuzhiyun .set push; \ 192*4882a593Smuzhiyun .set reorder; \ 193*4882a593Smuzhiyun bnez rt, 9f; \ 194*4882a593Smuzhiyun move rd, rs; \ 195*4882a593Smuzhiyun .set pop; \ 196*4882a593Smuzhiyun 9: 197*4882a593Smuzhiyun #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */ 198*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) 199*4882a593Smuzhiyun #define MOVN(rd, rs, rt) \ 200*4882a593Smuzhiyun .set push; \ 201*4882a593Smuzhiyun .set noreorder; \ 202*4882a593Smuzhiyun bnezl rt, 9f; \ 203*4882a593Smuzhiyun move rd, rs; \ 204*4882a593Smuzhiyun .set pop; \ 205*4882a593Smuzhiyun 9: 206*4882a593Smuzhiyun #define MOVZ(rd, rs, rt) \ 207*4882a593Smuzhiyun .set push; \ 208*4882a593Smuzhiyun .set noreorder; \ 209*4882a593Smuzhiyun beqzl rt, 9f; \ 210*4882a593Smuzhiyun move rd, rs; \ 211*4882a593Smuzhiyun .set pop; \ 212*4882a593Smuzhiyun 9: 213*4882a593Smuzhiyun #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */ 214*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \ 215*4882a593Smuzhiyun (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64) 216*4882a593Smuzhiyun #define MOVN(rd, rs, rt) \ 217*4882a593Smuzhiyun movn rd, rs, rt 218*4882a593Smuzhiyun #define MOVZ(rd, rs, rt) \ 219*4882a593Smuzhiyun movz rd, rs, rt 220*4882a593Smuzhiyun #endif /* MIPS IV, MIPS V, MIPS32 or MIPS64 */ 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* 223*4882a593Smuzhiyun * Stack alignment 224*4882a593Smuzhiyun */ 225*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32) 226*4882a593Smuzhiyun #define ALSZ 7 227*4882a593Smuzhiyun #define ALMASK ~7 228*4882a593Smuzhiyun #endif 229*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) 230*4882a593Smuzhiyun #define ALSZ 15 231*4882a593Smuzhiyun #define ALMASK ~15 232*4882a593Smuzhiyun #endif 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* 235*4882a593Smuzhiyun * Macros to handle different pointer/register sizes for 32/64-bit code 236*4882a593Smuzhiyun */ 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* 239*4882a593Smuzhiyun * Size of a register 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun #ifdef __mips64 242*4882a593Smuzhiyun #define SZREG 8 243*4882a593Smuzhiyun #else 244*4882a593Smuzhiyun #define SZREG 4 245*4882a593Smuzhiyun #endif 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* 248*4882a593Smuzhiyun * Use the following macros in assemblercode to load/store registers, 249*4882a593Smuzhiyun * pointers etc. 250*4882a593Smuzhiyun */ 251*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32) 252*4882a593Smuzhiyun #define REG_S sw 253*4882a593Smuzhiyun #define REG_L lw 254*4882a593Smuzhiyun #define REG_SUBU subu 255*4882a593Smuzhiyun #define REG_ADDU addu 256*4882a593Smuzhiyun #endif 257*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) 258*4882a593Smuzhiyun #define REG_S sd 259*4882a593Smuzhiyun #define REG_L ld 260*4882a593Smuzhiyun #define REG_SUBU dsubu 261*4882a593Smuzhiyun #define REG_ADDU daddu 262*4882a593Smuzhiyun #endif 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* 265*4882a593Smuzhiyun * How to add/sub/load/store/shift C int variables. 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun #if (_MIPS_SZINT == 32) 268*4882a593Smuzhiyun #define INT_ADD add 269*4882a593Smuzhiyun #define INT_ADDU addu 270*4882a593Smuzhiyun #define INT_ADDI addi 271*4882a593Smuzhiyun #define INT_ADDIU addiu 272*4882a593Smuzhiyun #define INT_SUB sub 273*4882a593Smuzhiyun #define INT_SUBU subu 274*4882a593Smuzhiyun #define INT_L lw 275*4882a593Smuzhiyun #define INT_S sw 276*4882a593Smuzhiyun #define INT_SLL sll 277*4882a593Smuzhiyun #define INT_SLLV sllv 278*4882a593Smuzhiyun #define INT_SRL srl 279*4882a593Smuzhiyun #define INT_SRLV srlv 280*4882a593Smuzhiyun #define INT_SRA sra 281*4882a593Smuzhiyun #define INT_SRAV srav 282*4882a593Smuzhiyun #endif 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #if (_MIPS_SZINT == 64) 285*4882a593Smuzhiyun #define INT_ADD dadd 286*4882a593Smuzhiyun #define INT_ADDU daddu 287*4882a593Smuzhiyun #define INT_ADDI daddi 288*4882a593Smuzhiyun #define INT_ADDIU daddiu 289*4882a593Smuzhiyun #define INT_SUB dsub 290*4882a593Smuzhiyun #define INT_SUBU dsubu 291*4882a593Smuzhiyun #define INT_L ld 292*4882a593Smuzhiyun #define INT_S sd 293*4882a593Smuzhiyun #define INT_SLL dsll 294*4882a593Smuzhiyun #define INT_SLLV dsllv 295*4882a593Smuzhiyun #define INT_SRL dsrl 296*4882a593Smuzhiyun #define INT_SRLV dsrlv 297*4882a593Smuzhiyun #define INT_SRA dsra 298*4882a593Smuzhiyun #define INT_SRAV dsrav 299*4882a593Smuzhiyun #endif 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* 302*4882a593Smuzhiyun * How to add/sub/load/store/shift C long variables. 303*4882a593Smuzhiyun */ 304*4882a593Smuzhiyun #if (_MIPS_SZLONG == 32) 305*4882a593Smuzhiyun #define LONG_ADD add 306*4882a593Smuzhiyun #define LONG_ADDU addu 307*4882a593Smuzhiyun #define LONG_ADDI addi 308*4882a593Smuzhiyun #define LONG_ADDIU addiu 309*4882a593Smuzhiyun #define LONG_SUB sub 310*4882a593Smuzhiyun #define LONG_SUBU subu 311*4882a593Smuzhiyun #define LONG_L lw 312*4882a593Smuzhiyun #define LONG_S sw 313*4882a593Smuzhiyun #define LONG_SP swp 314*4882a593Smuzhiyun #define LONG_SLL sll 315*4882a593Smuzhiyun #define LONG_SLLV sllv 316*4882a593Smuzhiyun #define LONG_SRL srl 317*4882a593Smuzhiyun #define LONG_SRLV srlv 318*4882a593Smuzhiyun #define LONG_SRA sra 319*4882a593Smuzhiyun #define LONG_SRAV srav 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun #define LONG .word 322*4882a593Smuzhiyun #define LONGSIZE 4 323*4882a593Smuzhiyun #define LONGMASK 3 324*4882a593Smuzhiyun #define LONGLOG 2 325*4882a593Smuzhiyun #endif 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #if (_MIPS_SZLONG == 64) 328*4882a593Smuzhiyun #define LONG_ADD dadd 329*4882a593Smuzhiyun #define LONG_ADDU daddu 330*4882a593Smuzhiyun #define LONG_ADDI daddi 331*4882a593Smuzhiyun #define LONG_ADDIU daddiu 332*4882a593Smuzhiyun #define LONG_SUB dsub 333*4882a593Smuzhiyun #define LONG_SUBU dsubu 334*4882a593Smuzhiyun #define LONG_L ld 335*4882a593Smuzhiyun #define LONG_S sd 336*4882a593Smuzhiyun #define LONG_SP sdp 337*4882a593Smuzhiyun #define LONG_SLL dsll 338*4882a593Smuzhiyun #define LONG_SLLV dsllv 339*4882a593Smuzhiyun #define LONG_SRL dsrl 340*4882a593Smuzhiyun #define LONG_SRLV dsrlv 341*4882a593Smuzhiyun #define LONG_SRA dsra 342*4882a593Smuzhiyun #define LONG_SRAV dsrav 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun #define LONG .dword 345*4882a593Smuzhiyun #define LONGSIZE 8 346*4882a593Smuzhiyun #define LONGMASK 7 347*4882a593Smuzhiyun #define LONGLOG 3 348*4882a593Smuzhiyun #endif 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* 351*4882a593Smuzhiyun * How to add/sub/load/store/shift pointers. 352*4882a593Smuzhiyun */ 353*4882a593Smuzhiyun #if (_MIPS_SZPTR == 32) 354*4882a593Smuzhiyun #define PTR_ADD add 355*4882a593Smuzhiyun #define PTR_ADDU addu 356*4882a593Smuzhiyun #define PTR_ADDI addi 357*4882a593Smuzhiyun #define PTR_ADDIU addiu 358*4882a593Smuzhiyun #define PTR_SUB sub 359*4882a593Smuzhiyun #define PTR_SUBU subu 360*4882a593Smuzhiyun #define PTR_L lw 361*4882a593Smuzhiyun #define PTR_S sw 362*4882a593Smuzhiyun #define PTR_LA la 363*4882a593Smuzhiyun #define PTR_LI li 364*4882a593Smuzhiyun #define PTR_SLL sll 365*4882a593Smuzhiyun #define PTR_SLLV sllv 366*4882a593Smuzhiyun #define PTR_SRL srl 367*4882a593Smuzhiyun #define PTR_SRLV srlv 368*4882a593Smuzhiyun #define PTR_SRA sra 369*4882a593Smuzhiyun #define PTR_SRAV srav 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define PTR_SCALESHIFT 2 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun #define PTR .word 374*4882a593Smuzhiyun #define PTRSIZE 4 375*4882a593Smuzhiyun #define PTRLOG 2 376*4882a593Smuzhiyun #endif 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun #if (_MIPS_SZPTR == 64) 379*4882a593Smuzhiyun #define PTR_ADD dadd 380*4882a593Smuzhiyun #define PTR_ADDU daddu 381*4882a593Smuzhiyun #define PTR_ADDI daddi 382*4882a593Smuzhiyun #define PTR_ADDIU daddiu 383*4882a593Smuzhiyun #define PTR_SUB dsub 384*4882a593Smuzhiyun #define PTR_SUBU dsubu 385*4882a593Smuzhiyun #define PTR_L ld 386*4882a593Smuzhiyun #define PTR_S sd 387*4882a593Smuzhiyun #define PTR_LA dla 388*4882a593Smuzhiyun #define PTR_LI dli 389*4882a593Smuzhiyun #define PTR_SLL dsll 390*4882a593Smuzhiyun #define PTR_SLLV dsllv 391*4882a593Smuzhiyun #define PTR_SRL dsrl 392*4882a593Smuzhiyun #define PTR_SRLV dsrlv 393*4882a593Smuzhiyun #define PTR_SRA dsra 394*4882a593Smuzhiyun #define PTR_SRAV dsrav 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun #define PTR_SCALESHIFT 3 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun #define PTR .dword 399*4882a593Smuzhiyun #define PTRSIZE 8 400*4882a593Smuzhiyun #define PTRLOG 3 401*4882a593Smuzhiyun #endif 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /* 404*4882a593Smuzhiyun * Some cp0 registers were extended to 64bit for MIPS III. 405*4882a593Smuzhiyun */ 406*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32) 407*4882a593Smuzhiyun #define MFC0 mfc0 408*4882a593Smuzhiyun #define MTC0 mtc0 409*4882a593Smuzhiyun #endif 410*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) 411*4882a593Smuzhiyun #define MFC0 dmfc0 412*4882a593Smuzhiyun #define MTC0 dmtc0 413*4882a593Smuzhiyun #endif 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun #define SSNOP sll zero, zero, 1 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun #ifdef CONFIG_SGI_IP28 418*4882a593Smuzhiyun /* Inhibit speculative stores to volatile (e.g.DMA) or invalid addresses. */ 419*4882a593Smuzhiyun #include <asm/cacheops.h> 420*4882a593Smuzhiyun #define R10KCBARRIER(addr) cache CACHE_BARRIER, addr; 421*4882a593Smuzhiyun #else 422*4882a593Smuzhiyun #define R10KCBARRIER(addr) 423*4882a593Smuzhiyun #endif 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun #endif /* __ASM_ASM_H */ 426