Blame sysdeps/mips/sys/asm.h

Packit 6c4009
/* Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ralf Baechle <ralf@gnu.org>.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library.  If not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#ifndef _SYS_ASM_H
Packit 6c4009
#define _SYS_ASM_H
Packit 6c4009
Packit 6c4009
#include <sgidefs.h>
Packit 6c4009
Packit 6c4009
#ifndef CAT
Packit 6c4009
# define __CAT(str1,str2) str1##str2
Packit 6c4009
# define CAT(str1,str2) __CAT(str1,str2)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Redefined as nonempty in the internal header.  */
Packit 6c4009
#define __mips_cfi_startproc /* Empty.  */
Packit 6c4009
#define __mips_cfi_endproc /* Empty.  */
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Macros to handle different pointer/register sizes for 32/64-bit code
Packit 6c4009
 *
Packit 6c4009
 * 64 bit address space isn't used yet, so we may use the R3000 32 bit
Packit 6c4009
 * defines for now.
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32
Packit 6c4009
# define PTR .word
Packit 6c4009
# define PTRSIZE 4
Packit 6c4009
# define PTRLOG 2
Packit 6c4009
#elif _MIPS_SIM == _ABI64
Packit 6c4009
# define PTR .dword
Packit 6c4009
# define PTRSIZE 8
Packit 6c4009
# define PTRLOG 3
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * PIC specific declarations
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_SIM == _ABIO32
Packit 6c4009
# ifdef __PIC__
Packit 6c4009
#  define CPRESTORE(register) \
Packit 6c4009
		.cprestore register
Packit 6c4009
#  define CPLOAD(register) \
Packit 6c4009
		.cpload register
Packit 6c4009
# else
Packit 6c4009
#  define CPRESTORE(register)
Packit 6c4009
#  define CPLOAD(register)
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# define CPADD(register) \
Packit 6c4009
		.cpadd	register
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Set gp when at 1st instruction
Packit 6c4009
 */
Packit 6c4009
# define SETUP_GP					\
Packit 6c4009
		.set noreorder;				\
Packit 6c4009
		.cpload $25;				\
Packit 6c4009
		.set reorder
Packit 6c4009
/* Set gp when not at 1st instruction */
Packit 6c4009
# define SETUP_GPX(r)					\
Packit 6c4009
		.set noreorder;				\
Packit 6c4009
		move r, $31;	 /* Save old ra.  */	\
Packit 6c4009
		bal 10f; /* Find addr of cpload.  */	\
Packit 6c4009
		nop;					\
Packit 6c4009
10:							\
Packit 6c4009
		.cpload $31;				\
Packit 6c4009
		move $31, r;				\
Packit 6c4009
		.set reorder
Packit 6c4009
# define SETUP_GPX_L(r, l)				\
Packit 6c4009
		.set noreorder;				\
Packit 6c4009
		move r, $31;	 /* Save old ra.  */	\
Packit 6c4009
		bal l;   /* Find addr of cpload.  */	\
Packit 6c4009
		nop;					\
Packit 6c4009
l:							\
Packit 6c4009
		.cpload $31;				\
Packit 6c4009
		move $31, r;				\
Packit 6c4009
		.set reorder
Packit 6c4009
# define SAVE_GP(x) \
Packit 6c4009
		.cprestore x /* Save gp trigger t9/jalr conversion.	 */
Packit 6c4009
# define SETUP_GP64(a, b)
Packit 6c4009
# define SETUP_GPX64(a, b)
Packit 6c4009
# define SETUP_GPX64_L(cp_reg, ra_save, l)
Packit 6c4009
# define RESTORE_GP64
Packit 6c4009
# define USE_ALT_CP(a)
Packit 6c4009
#else /* _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32 */
Packit 6c4009
/*
Packit 6c4009
 * For callee-saved gp calling convention:
Packit 6c4009
 */
Packit 6c4009
# define SETUP_GP
Packit 6c4009
# define SETUP_GPX(r)
Packit 6c4009
# define SETUP_GPX_L(r, l)
Packit 6c4009
# define SAVE_GP(x)
Packit 6c4009
Packit 6c4009
# define SETUP_GP64(gpoffset, proc) \
Packit 6c4009
		.cpsetup $25, gpoffset, proc
Packit 6c4009
# define SETUP_GPX64(cp_reg, ra_save)			\
Packit 6c4009
		move ra_save, $31; /* Save old ra.  */	\
Packit 6c4009
		.set noreorder;				\
Packit 6c4009
		bal 10f; /* Find addr of .cpsetup.  */	\
Packit 6c4009
		nop;					\
Packit 6c4009
10:							\
Packit 6c4009
		.set reorder;				\
Packit 6c4009
		.cpsetup $31, cp_reg, 10b;		\
Packit 6c4009
		move $31, ra_save
Packit 6c4009
# define SETUP_GPX64_L(cp_reg, ra_save, l)  \
Packit 6c4009
		move ra_save, $31; /* Save old ra.  */	\
Packit 6c4009
		.set noreorder;				\
Packit 6c4009
		bal l;   /* Find addr of .cpsetup.  */	\
Packit 6c4009
		nop;					\
Packit 6c4009
l:							\
Packit 6c4009
		.set reorder;				\
Packit 6c4009
		.cpsetup $31, cp_reg, l;		\
Packit 6c4009
		move $31, ra_save
Packit 6c4009
# define RESTORE_GP64 \
Packit 6c4009
		.cpreturn
Packit 6c4009
/* Use alternate register for context pointer.  */
Packit 6c4009
# define USE_ALT_CP(reg)	\
Packit 6c4009
		.cplocal reg
Packit 6c4009
#endif /* _MIPS_SIM != _ABIO32 */
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Stack Frame Definitions
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_SIM == _ABIO32
Packit 6c4009
# define NARGSAVE 4 /* Space for 4 argument registers must be allocated.  */
Packit 6c4009
#endif
Packit 6c4009
#if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
Packit 6c4009
# define NARGSAVE 0 /* No caller responsibilities.  */
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * LEAF - declare leaf routine
Packit 6c4009
 */
Packit 6c4009
#define	LEAF(symbol)                                    \
Packit 6c4009
		.globl	symbol;                         \
Packit 6c4009
		.align	2;                              \
Packit 6c4009
		.type	symbol,@function;               \
Packit 6c4009
		.ent	symbol,0;                       \
Packit 6c4009
symbol:		.frame	sp,0,ra;			\
Packit 6c4009
		__mips_cfi_startproc
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * NESTED - declare nested routine entry point
Packit 6c4009
 */
Packit 6c4009
#define	NESTED(symbol, framesize, rpc)                  \
Packit 6c4009
		.globl	symbol;                         \
Packit 6c4009
		.align	2;                              \
Packit 6c4009
		.type	symbol,@function;               \
Packit 6c4009
		.ent	symbol,0;                       \
Packit 6c4009
symbol:		.frame	sp, framesize, rpc;		\
Packit 6c4009
		__mips_cfi_startproc
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * END - mark end of function
Packit 6c4009
 */
Packit 6c4009
#ifndef END
Packit 6c4009
# define END(function)                                   \
Packit 6c4009
		__mips_cfi_endproc;			\
Packit 6c4009
		.end	function;		        \
Packit 6c4009
		.size	function,.-function
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * EXPORT - export definition of symbol
Packit 6c4009
 */
Packit 6c4009
#define	EXPORT(symbol)                                  \
Packit 6c4009
		.globl	symbol;                         \
Packit 6c4009
symbol:		__mips_cfi_startproc
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * ABS - export absolute symbol
Packit 6c4009
 */
Packit 6c4009
#define	ABS(symbol,value)                               \
Packit 6c4009
		.globl	symbol;                         \
Packit 6c4009
symbol		=	value
Packit 6c4009
Packit 6c4009
#define	PANIC(msg)                                      \
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	reorder;                        \
Packit 6c4009
		la	a0,8f;                          \
Packit 6c4009
		jal	panic;                          \
Packit 6c4009
9:		b	9b;                             \
Packit 6c4009
		.set	pop;				\
Packit 6c4009
		TEXT(msg)
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Print formated string
Packit 6c4009
 */
Packit 6c4009
#define PRINT(string)                                   \
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	reorder;                        \
Packit 6c4009
		la	a0,8f;                          \
Packit 6c4009
		jal	printk;                         \
Packit 6c4009
		.set	pop;				\
Packit 6c4009
		TEXT(string)
Packit 6c4009
Packit 6c4009
#define	TEXT(msg)                                       \
Packit 6c4009
		.data;                                  \
Packit 6c4009
8:		.asciiz	msg;                            \
Packit 6c4009
		.previous;
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Build text tables
Packit 6c4009
 */
Packit 6c4009
#define TTABLE(string)                                  \
Packit 6c4009
		.text;                                  \
Packit 6c4009
		.word	1f;                             \
Packit 6c4009
		.previous;                              \
Packit 6c4009
		.data;                                  \
Packit 6c4009
1:		.asciz	string;                         \
Packit 6c4009
		.previous
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * MIPS IV pref instruction.
Packit 6c4009
 * Use with .set noreorder only!
Packit 6c4009
 *
Packit 6c4009
 * MIPS IV implementations are free to treat this as a nop.  The R5000
Packit 6c4009
 * is one of them.  So we should have an option not to use this instruction.
Packit 6c4009
 */
Packit 6c4009
#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
Packit 6c4009
    (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
Packit 6c4009
# define PREF(hint,addr)                                 \
Packit 6c4009
		pref	hint,addr
Packit 6c4009
# define PREFX(hint,addr)                                \
Packit 6c4009
		prefx	hint,addr
Packit 6c4009
#else
Packit 6c4009
# define PREF(hint,addr)
Packit 6c4009
# define PREFX(hint,addr)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_ISA == _MIPS_ISA_MIPS1
Packit 6c4009
# define MOVN(rd,rs,rt)					\
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	reorder;			\
Packit 6c4009
		beqz	rt,9f;				\
Packit 6c4009
		move	rd,rs;				\
Packit 6c4009
		.set	pop;				\
Packit 6c4009
9:
Packit 6c4009
# define MOVZ(rd,rs,rt)					\
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	reorder;			\
Packit 6c4009
		bnez	rt,9f;				\
Packit 6c4009
		move	rd,rt;				\
Packit 6c4009
		.set	pop;				\
Packit 6c4009
9:
Packit 6c4009
#endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
Packit 6c4009
#if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
Packit 6c4009
# define MOVN(rd,rs,rt)					\
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	noreorder;			\
Packit 6c4009
		bnezl	rt,9f;				\
Packit 6c4009
		move	rd,rs;				\
Packit 6c4009
		.set	pop;				\
Packit 6c4009
9:
Packit 6c4009
# define MOVZ(rd,rs,rt)					\
Packit 6c4009
		.set	push;				\
Packit 6c4009
		.set	noreorder;			\
Packit 6c4009
		beqzl	rt,9f;				\
Packit 6c4009
		movz	rd,rs;				\
Packit 6c4009
		.set	pop;				\
Packit 6c4009
9:
Packit 6c4009
#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
Packit 6c4009
#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
Packit 6c4009
    (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
Packit 6c4009
# define MOVN(rd,rs,rt)					\
Packit 6c4009
		movn	rd,rs,rt
Packit 6c4009
# define MOVZ(rd,rs,rt)					\
Packit 6c4009
		movz	rd,rs,rt
Packit 6c4009
#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Stack alignment
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
Packit 6c4009
# define ALSZ	15
Packit 6c4009
# define ALMASK	~15
Packit 6c4009
#else
Packit 6c4009
# define ALSZ	7
Packit 6c4009
# define ALMASK	~7
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Size of a register
Packit 6c4009
 */
Packit 6c4009
#if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
Packit 6c4009
# define SZREG	8
Packit 6c4009
#else
Packit 6c4009
# define SZREG	4
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Use the following macros in assemblercode to load/store registers,
Packit 6c4009
 * pointers etc.
Packit 6c4009
 */
Packit 6c4009
#if (SZREG == 4)
Packit 6c4009
# define REG_S sw
Packit 6c4009
# define REG_L lw
Packit 6c4009
#else
Packit 6c4009
# define REG_S sd
Packit 6c4009
# define REG_L ld
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * How to add/sub/load/store/shift C int variables.
Packit 6c4009
 */
Packit 6c4009
#if (_MIPS_SZINT == 32)
Packit 6c4009
# define INT_ADD	add
Packit 6c4009
# define INT_ADDI	addi
Packit 6c4009
# define INT_ADDU	addu
Packit 6c4009
# define INT_ADDIU	addiu
Packit 6c4009
# define INT_SUB	sub
Packit 6c4009
# define INT_SUBI	subi
Packit 6c4009
# define INT_SUBU	subu
Packit 6c4009
# define INT_SUBIU	subu
Packit 6c4009
# define INT_L		lw
Packit 6c4009
# define INT_S		sw
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if (_MIPS_SZINT == 64)
Packit 6c4009
# define INT_ADD	dadd
Packit 6c4009
# define INT_ADDI	daddi
Packit 6c4009
# define INT_ADDU	daddu
Packit 6c4009
# define INT_ADDIU	daddiu
Packit 6c4009
# define INT_SUB	dsub
Packit 6c4009
# define INT_SUBI	dsubi
Packit 6c4009
# define INT_SUBU	dsubu
Packit 6c4009
# define INT_SUBIU	dsubu
Packit 6c4009
# define INT_L		ld
Packit 6c4009
# define INT_S		sd
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * How to add/sub/load/store/shift C long variables.
Packit 6c4009
 */
Packit 6c4009
#if (_MIPS_SZLONG == 32)
Packit 6c4009
# define LONG_ADD	add
Packit 6c4009
# define LONG_ADDI	addi
Packit 6c4009
# define LONG_ADDU	addu
Packit 6c4009
# define LONG_ADDIU	addiu
Packit 6c4009
# define LONG_SUB	sub
Packit 6c4009
# define LONG_SUBI	subi
Packit 6c4009
# define LONG_SUBU	subu
Packit 6c4009
# define LONG_SUBIU	subu
Packit 6c4009
# define LONG_L		lw
Packit 6c4009
# define LONG_S		sw
Packit 6c4009
# define LONG_SLL	sll
Packit 6c4009
# define LONG_SLLV	sllv
Packit 6c4009
# define LONG_SRL	srl
Packit 6c4009
# define LONG_SRLV	srlv
Packit 6c4009
# define LONG_SRA	sra
Packit 6c4009
# define LONG_SRAV	srav
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if (_MIPS_SZLONG == 64)
Packit 6c4009
# define LONG_ADD	dadd
Packit 6c4009
# define LONG_ADDI	daddi
Packit 6c4009
# define LONG_ADDU	daddu
Packit 6c4009
# define LONG_ADDIU	daddiu
Packit 6c4009
# define LONG_SUB	dsub
Packit 6c4009
# define LONG_SUBI	dsubi
Packit 6c4009
# define LONG_SUBU	dsubu
Packit 6c4009
# define LONG_SUBIU	dsubu
Packit 6c4009
# define LONG_L		ld
Packit 6c4009
# define LONG_S		sd
Packit 6c4009
# define LONG_SLL	dsll
Packit 6c4009
# define LONG_SLLV	dsllv
Packit 6c4009
# define LONG_SRL	dsrl
Packit 6c4009
# define LONG_SRLV	dsrlv
Packit 6c4009
# define LONG_SRA	dsra
Packit 6c4009
# define LONG_SRAV	dsrav
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * How to add/sub/load/store/shift pointers.
Packit 6c4009
 */
Packit 6c4009
#if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 32)
Packit 6c4009
# define PTR_ADD	add
Packit 6c4009
# define PTR_ADDI	addi
Packit 6c4009
# define PTR_ADDU	addu
Packit 6c4009
# define PTR_ADDIU	addiu
Packit 6c4009
# define PTR_SUB	sub
Packit 6c4009
# define PTR_SUBI	subi
Packit 6c4009
# define PTR_SUBU	subu
Packit 6c4009
# define PTR_SUBIU	subu
Packit 6c4009
# define PTR_L		lw
Packit 6c4009
# define PTR_LA		la
Packit 6c4009
# define PTR_S		sw
Packit 6c4009
# define PTR_SLL	sll
Packit 6c4009
# define PTR_SLLV	sllv
Packit 6c4009
# define PTR_SRL	srl
Packit 6c4009
# define PTR_SRLV	srlv
Packit 6c4009
# define PTR_SRA	sra
Packit 6c4009
# define PTR_SRAV	srav
Packit 6c4009
Packit 6c4009
# define PTR_SCALESHIFT	2
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if _MIPS_SIM == _ABIN32
Packit 6c4009
# define PTR_ADD	add
Packit 6c4009
# define PTR_ADDI	addi
Packit 6c4009
# define PTR_SUB	sub
Packit 6c4009
# define PTR_SUBI	subi
Packit 6c4009
#if !defined __mips_isa_rev || __mips_isa_rev < 6
Packit 6c4009
# define PTR_ADDU	add /* no u */
Packit 6c4009
# define PTR_ADDIU	addi /* no u */
Packit 6c4009
# define PTR_SUBU	sub /* no u */
Packit 6c4009
# define PTR_SUBIU	sub /* no u */
Packit 6c4009
#else
Packit 6c4009
# define PTR_ADDU       addu
Packit 6c4009
# define PTR_ADDIU      addiu
Packit 6c4009
# define PTR_SUBU       subu
Packit 6c4009
# define PTR_SUBIU      subu
Packit 6c4009
#endif
Packit 6c4009
# define PTR_L		lw
Packit 6c4009
# define PTR_LA		la
Packit 6c4009
# define PTR_S		sw
Packit 6c4009
# define PTR_SLL	sll
Packit 6c4009
# define PTR_SLLV	sllv
Packit 6c4009
# define PTR_SRL	srl
Packit 6c4009
# define PTR_SRLV	srlv
Packit 6c4009
# define PTR_SRA	sra
Packit 6c4009
# define PTR_SRAV	srav
Packit 6c4009
Packit 6c4009
# define PTR_SCALESHIFT	2
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 64 /* o64??? */) \
Packit 6c4009
    || _MIPS_SIM == _ABI64
Packit 6c4009
# define PTR_ADD	dadd
Packit 6c4009
# define PTR_ADDI	daddi
Packit 6c4009
# define PTR_ADDU	daddu
Packit 6c4009
# define PTR_ADDIU	daddiu
Packit 6c4009
# define PTR_SUB	dsub
Packit 6c4009
# define PTR_SUBI	dsubi
Packit 6c4009
# define PTR_SUBU	dsubu
Packit 6c4009
# define PTR_SUBIU	dsubu
Packit 6c4009
# define PTR_L		ld
Packit 6c4009
# define PTR_LA		dla
Packit 6c4009
# define PTR_S		sd
Packit 6c4009
# define PTR_SLL	dsll
Packit 6c4009
# define PTR_SLLV	dsllv
Packit 6c4009
# define PTR_SRL	dsrl
Packit 6c4009
# define PTR_SRLV	dsrlv
Packit 6c4009
# define PTR_SRA	dsra
Packit 6c4009
# define PTR_SRAV	dsrav
Packit 6c4009
Packit 6c4009
# define PTR_SCALESHIFT	3
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Some cp0 registers were extended to 64bit for MIPS III.
Packit 6c4009
 */
Packit 6c4009
#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \
Packit 6c4009
    (_MIPS_ISA == _MIPS_ISA_MIPS32)
Packit 6c4009
# define MFC0	mfc0
Packit 6c4009
# define MTC0	mtc0
Packit 6c4009
#endif
Packit 6c4009
#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
Packit 6c4009
    (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
Packit 6c4009
# define MFC0	dmfc0
Packit 6c4009
# define MTC0	dmtc0
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* The MIPS architectures do not have a uniform memory model.  Particular
Packit 6c4009
   platforms may provide additional guarantees - for instance, the R4000
Packit 6c4009
   LL and SC instructions implicitly perform a SYNC, and the 4K promises
Packit 6c4009
   strong ordering.
Packit 6c4009
Packit 6c4009
   However, in the absence of those guarantees, we must assume weak ordering
Packit 6c4009
   and SYNC explicitly where necessary.
Packit 6c4009
Packit 6c4009
   Some obsolete MIPS processors may not support the SYNC instruction.  This
Packit 6c4009
   applies to "true" MIPS I processors; most of the processors which compile
Packit 6c4009
   using MIPS I implement parts of MIPS II.  */
Packit 6c4009
Packit 6c4009
#ifndef MIPS_SYNC
Packit 6c4009
# define MIPS_SYNC	sync
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#endif /* sys/asm.h */