xref: /nrf52832-nimble/rt-thread/libcpu/mips/common/mips_asm.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : mips_asm.h
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
5*10465441SEvalZero  *
6*10465441SEvalZero  *  This program is free software; you can redistribute it and/or modify
7*10465441SEvalZero  *  it under the terms of the GNU General Public License as published by
8*10465441SEvalZero  *  the Free Software Foundation; either version 2 of the License, or
9*10465441SEvalZero  *  (at your option) any later version.
10*10465441SEvalZero  *
11*10465441SEvalZero  *  This program is distributed in the hope that it will be useful,
12*10465441SEvalZero  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*10465441SEvalZero  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*10465441SEvalZero  *  GNU General Public License for more details.
15*10465441SEvalZero  *
16*10465441SEvalZero  *  You should have received a copy of the GNU General Public License along
17*10465441SEvalZero  *  with this program; if not, write to the Free Software Foundation, Inc.,
18*10465441SEvalZero  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19*10465441SEvalZero  *
20*10465441SEvalZero  * Change Logs:
21*10465441SEvalZero  * Date           Author       Notes
22*10465441SEvalZero  * 2016��9��7��     Urey         the first version
23*10465441SEvalZero  */
24*10465441SEvalZero 
25*10465441SEvalZero #ifndef _MIPS_ASM_H_
26*10465441SEvalZero #define _MIPS_ASM_H_
27*10465441SEvalZero 
28*10465441SEvalZero 
29*10465441SEvalZero /* ********************************************************************* */
30*10465441SEvalZero /* Interface macro & data definition */
31*10465441SEvalZero 
32*10465441SEvalZero #ifdef __ASSEMBLY__
33*10465441SEvalZero 
34*10465441SEvalZero /******** ASSEMBLER SPECIFIC DEFINITIONS ********/
35*10465441SEvalZero 
36*10465441SEvalZero #ifdef  __ghs__
37*10465441SEvalZero #define ALIGN(x) .##align (1 << (x))
38*10465441SEvalZero #else
39*10465441SEvalZero #define ALIGN(x) .##align (x)
40*10465441SEvalZero #endif
41*10465441SEvalZero 
42*10465441SEvalZero #ifdef __ghs__
43*10465441SEvalZero #define SET_MIPS3()
44*10465441SEvalZero #define SET_MIPS0()
45*10465441SEvalZero #define SET_PUSH()
46*10465441SEvalZero #define SET_POP()
47*10465441SEvalZero #else
48*10465441SEvalZero #define SET_MIPS3() .##set mips3
49*10465441SEvalZero #define SET_MIPS0() .##set mips0
50*10465441SEvalZero #define SET_PUSH()  .##set push
51*10465441SEvalZero #define SET_POP()   .##set pop
52*10465441SEvalZero #endif
53*10465441SEvalZero 
54*10465441SEvalZero /*  Different assemblers have different requirements for how to
55*10465441SEvalZero  *  indicate that the next section is bss :
56*10465441SEvalZero  *
57*10465441SEvalZero  *  Some use :   .bss
58*10465441SEvalZero  *  Others use : .section bss
59*10465441SEvalZero  *
60*10465441SEvalZero  *  We select which to use based on _BSS_OLD_, which may be defined
61*10465441SEvalZero  *  in makefile.
62*10465441SEvalZero  */
63*10465441SEvalZero #ifdef _BSS_OLD_
64*10465441SEvalZero #define BSS	.##section bss
65*10465441SEvalZero #else
66*10465441SEvalZero #define BSS	.##bss
67*10465441SEvalZero #endif
68*10465441SEvalZero 
69*10465441SEvalZero #define LEAF(name)\
70*10465441SEvalZero   		.##text;\
71*10465441SEvalZero   		.##globl	name;\
72*10465441SEvalZero   		.##ent	name;\
73*10465441SEvalZero name:
74*10465441SEvalZero 
75*10465441SEvalZero 
76*10465441SEvalZero #define SLEAF(name)\
77*10465441SEvalZero   		.##text;\
78*10465441SEvalZero   		.##ent	name;\
79*10465441SEvalZero name:
80*10465441SEvalZero 
81*10465441SEvalZero 
82*10465441SEvalZero #ifdef __ghs__
83*10465441SEvalZero #define END(name)\
84*10465441SEvalZero   		.##end	name
85*10465441SEvalZero #else
86*10465441SEvalZero #define END(name)\
87*10465441SEvalZero   		.##size name,.-name;\
88*10465441SEvalZero   		.##end	name
89*10465441SEvalZero #endif
90*10465441SEvalZero 
91*10465441SEvalZero 
92*10465441SEvalZero #define EXTERN(name)
93*10465441SEvalZero 
94*10465441SEvalZero #else
95*10465441SEvalZero 
96*10465441SEvalZero #define U64 unsigned long long
97*10465441SEvalZero #define U32 unsigned int
98*10465441SEvalZero #define U16 unsigned short
99*10465441SEvalZero #define U8  unsigned char
100*10465441SEvalZero #define S64 signed long long
101*10465441SEvalZero #define S32 int
102*10465441SEvalZero #define S16 short int
103*10465441SEvalZero #define S8  signed char
104*10465441SEvalZero //#define bool U8
105*10465441SEvalZero 
106*10465441SEvalZero #ifndef _SIZE_T_
107*10465441SEvalZero #define _SIZE_T_
108*10465441SEvalZero #ifdef __ghs__
109*10465441SEvalZero    typedef unsigned int size_t;
110*10465441SEvalZero #else
111*10465441SEvalZero    typedef unsigned long size_t;
112*10465441SEvalZero #endif
113*10465441SEvalZero #endif
114*10465441SEvalZero 
115*10465441SEvalZero /* Sets the result on bPort */
116*10465441SEvalZero #define BIT_SET(bPort,bBitMask)        (bPort |= bBitMask)
117*10465441SEvalZero #define BIT_CLR(bPort,bBitMask)        (bPort &= ~bBitMask)
118*10465441SEvalZero 
119*10465441SEvalZero /* Returns the result */
120*10465441SEvalZero #define GET_BIT_SET(bPort,bBitMask)    (bPort | bBitMask)
121*10465441SEvalZero #define GET_BIT_CLR(bPort,bBitMask)    (bPort & ~bBitMask)
122*10465441SEvalZero 
123*10465441SEvalZero /* Returns 0 if the condition is False & a non-zero value if it is True */
124*10465441SEvalZero #define TEST_BIT_SET(bPort,bBitMask)   (bPort & bBitMask)
125*10465441SEvalZero #define TEST_BIT_CLR(bPort,bBitMask)   ((~bPort) & bBitMask)
126*10465441SEvalZero 
127*10465441SEvalZero /* Split union definitions */
128*10465441SEvalZero typedef union tunSU16
129*10465441SEvalZero {
130*10465441SEvalZero         U16 hwHW;
131*10465441SEvalZero         struct tst2U8
132*10465441SEvalZero         {
133*10465441SEvalZero                 U8 bB0;
134*10465441SEvalZero                 U8 bB1;
135*10465441SEvalZero         }st2U8;
136*10465441SEvalZero }tunSU16;
137*10465441SEvalZero 
138*10465441SEvalZero typedef union tunSU32
139*10465441SEvalZero {
140*10465441SEvalZero         U32 wW;
141*10465441SEvalZero         struct tst2U16
142*10465441SEvalZero         {
143*10465441SEvalZero                 U16 hwHW0;
144*10465441SEvalZero                 U16 hwHW1;
145*10465441SEvalZero         }st2U16;
146*10465441SEvalZero         struct tst4U8
147*10465441SEvalZero         {
148*10465441SEvalZero                 U8 bB0;
149*10465441SEvalZero                 U8 bB1;
150*10465441SEvalZero                 U8 bB2;
151*10465441SEvalZero                 U8 bB3;
152*10465441SEvalZero         }st4U8;
153*10465441SEvalZero }tunSU32;
154*10465441SEvalZero 
155*10465441SEvalZero #endif /* #ifdef __ASSEMBLY__ */
156*10465441SEvalZero 
157*10465441SEvalZero 
158*10465441SEvalZero /******** DEFINITIONS FOR BOTH ASSEMBLER AND C ********/
159*10465441SEvalZero 
160*10465441SEvalZero 
161*10465441SEvalZero #define  NO_ERR             0x00000000     /* operation completed successfully */
162*10465441SEvalZero #define  ERR                0xffffffff     /* operation completed not successfully */
163*10465441SEvalZero 
164*10465441SEvalZero #define False 0
165*10465441SEvalZero #define True !False
166*10465441SEvalZero 
167*10465441SEvalZero #ifndef NULL
168*10465441SEvalZero #define NULL		      	((void *)0)
169*10465441SEvalZero #endif//NULL
170*10465441SEvalZero 
171*10465441SEvalZero #ifndef MIN
172*10465441SEvalZero #define MIN(x,y)           ((x) < (y) ? (x) : (y))
173*10465441SEvalZero #endif//MIN
174*10465441SEvalZero 
175*10465441SEvalZero #ifndef MAX
176*10465441SEvalZero #define MAX(x,y)      		((x) > (y) ? (x) : (y))
177*10465441SEvalZero #endif//MAX
178*10465441SEvalZero 
179*10465441SEvalZero #define MAXUINT(w)	(\
180*10465441SEvalZero 		((w) == sizeof(U8))  ? 0xFFU :\
181*10465441SEvalZero 		((w) == sizeof(U16)) ? 0xFFFFU :\
182*10465441SEvalZero 		((w) == sizeof(U32)) ? 0xFFFFFFFFU : 0\
183*10465441SEvalZero 		        )
184*10465441SEvalZero 
185*10465441SEvalZero #define MAXINT(w)	(\
186*10465441SEvalZero 		((w) == sizeof(S8))  ? 0x7F :\
187*10465441SEvalZero 		((w) == sizeof(S16)) ? 0x7FFF :\
188*10465441SEvalZero 		((w) == sizeof(S32)) ? 0x7FFFFFFF : 0\
189*10465441SEvalZero 		        )
190*10465441SEvalZero 
191*10465441SEvalZero #define MSK(n)			  ((1 << (n)) - 1)
192*10465441SEvalZero 
193*10465441SEvalZero #define KUSEG_MSK		  0x80000000
194*10465441SEvalZero #define KSEG_MSK		  0xE0000000
195*10465441SEvalZero 
196*10465441SEvalZero #define KUSEGBASE		  0x00000000
197*10465441SEvalZero #define KSEG0BASE		  0x80000000
198*10465441SEvalZero #define KSEG1BASE		  0xA0000000
199*10465441SEvalZero #define KSSEGBASE		  0xC0000000
200*10465441SEvalZero #define KSEG3BASE		  0xE0000000
201*10465441SEvalZero 
202*10465441SEvalZero /*  Below macros perform the following functions :
203*10465441SEvalZero  *
204*10465441SEvalZero  *  KSEG0    : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG0.
205*10465441SEvalZero  *  KSEG1    : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG1.
206*10465441SEvalZero  *  PHYS     : Converts KSEG0/1 or physical addr (below 0.5GB) to physical address.
207*10465441SEvalZero  *  KSSEG    : Not relevant for converting, but used for determining range.
208*10465441SEvalZero  *  KSEG3    : Not relevant for converting, but used for determining range.
209*10465441SEvalZero  *  KUSEG    : Not relevant for converting, but used for determining range.
210*10465441SEvalZero  *  KSEG0A   : Same as KSEG0 but operates on register rather than constant.
211*10465441SEvalZero  *  KSEG1A   : Same as KSEG1 but operates on register rather than constant.
212*10465441SEvalZero  *  PHYSA    : Same as PHYS  but operates on register rather than constant.
213*10465441SEvalZero  *  CACHED   : Alias for KSEG0 macro .
214*10465441SEvalZero  *	       (Note that KSEG0 cache attribute is determined by K0
215*10465441SEvalZero  *	       field of Config register, but this is typically cached).
216*10465441SEvalZero  *  UNCACHED : Alias for KSEG1 macro .
217*10465441SEvalZero  */
218*10465441SEvalZero #ifdef __ASSEMBLY__
219*10465441SEvalZero #define KSEG0(addr)     (((addr) & ~KSEG_MSK)  | KSEG0BASE)
220*10465441SEvalZero #define KSEG1(addr)     (((addr) & ~KSEG_MSK)  | KSEG1BASE)
221*10465441SEvalZero #define KSSEG(addr)     (((addr) & ~KSEG_MSK)  | KSSEGBASE)
222*10465441SEvalZero #define KSEG3(addr)     (((addr) & ~KSEG_MSK)  | KSEG3BASE)
223*10465441SEvalZero #define KUSEG(addr)     (((addr) & ~KUSEG_MSK) | KUSEGBASE)
224*10465441SEvalZero #define PHYS(addr)      ( (addr) & ~KSEG_MSK)
225*10465441SEvalZero #define KSEG0A(reg) 	and reg, ~KSEG_MSK; or reg, KSEG0BASE
226*10465441SEvalZero #define KSEG1A(reg) 	and reg, ~KSEG_MSK; or reg, KSEG1BASE
227*10465441SEvalZero #define PHYSA(reg)	and reg, ~KSEG_MSK
228*10465441SEvalZero #else
229*10465441SEvalZero #define KSEG0(addr)     (((U32)(addr) & ~KSEG_MSK)  | KSEG0BASE)
230*10465441SEvalZero #define KSEG1(addr)     (((U32)(addr) & ~KSEG_MSK)  | KSEG1BASE)
231*10465441SEvalZero #define KSSEG(addr)	(((U32)(addr) & ~KSEG_MSK)  | KSSEGBASE)
232*10465441SEvalZero #define KSEG3(addr)	(((U32)(addr) & ~KSEG_MSK)  | KSEG3BASE)
233*10465441SEvalZero #define KUSEG(addr)	(((U32)(addr) & ~KUSEG_MSK) | KUSEGBASE)
234*10465441SEvalZero #define PHYS(addr) 	((U32)(addr)  & ~KSEG_MSK)
235*10465441SEvalZero #endif
236*10465441SEvalZero 
237*10465441SEvalZero #define CACHED(addr)	KSEG0(addr)
238*10465441SEvalZero #define UNCACHED(addr)	KSEG1(addr)
239*10465441SEvalZero 
240*10465441SEvalZero 
241*10465441SEvalZero #ifdef __ASSEMBLY__
242*10465441SEvalZero /* Macroes to access variables at constant addresses
243*10465441SEvalZero  * Compensates for signed 16 bit displacement
244*10465441SEvalZero  * Typical use:	li	a0, HIKSEG1(ATLAS_ASCIIWORD)
245*10465441SEvalZero  *		sw	v1, LO_OFFS(ATLAS_ASCIIWORD)(a0)
246*10465441SEvalZero  */
247*10465441SEvalZero #define HIKSEG0(addr)	((KSEG0(addr) + 0x8000) & 0xffff0000)
248*10465441SEvalZero #define HIKSEG1(addr)	((KSEG1(addr) + 0x8000) & 0xffff0000)
249*10465441SEvalZero #define HI_PART(addr)	(((addr) + 0x8000) & 0xffff0000)
250*10465441SEvalZero #define LO_OFFS(addr)	((addr) & 0xffff)
251*10465441SEvalZero #endif
252*10465441SEvalZero 
253*10465441SEvalZero 
254*10465441SEvalZero /* Most/Least significant 32 bit from 64 bit double word */
255*10465441SEvalZero #define HI32(data64)		  ((U32)(data64 >> 32))
256*10465441SEvalZero #define LO32(data64)		  ((U32)(data64 & 0xFFFFFFFF))
257*10465441SEvalZero 
258*10465441SEvalZero #if ((!defined(__ASSEMBLY__)) && (!defined(__LANGUAGE_ASSEMBLY)))
259*10465441SEvalZero #define REG8( addr )		  (*(volatile U8 *) (addr))
260*10465441SEvalZero #define REG16( addr )		  (*(volatile U16 *)(addr))
261*10465441SEvalZero #define REG32( addr )		  (*(volatile U32 *)(addr))
262*10465441SEvalZero #define REG64( addr )		  (*(volatile U64 *)(addr))
263*10465441SEvalZero #endif
264*10465441SEvalZero 
265*10465441SEvalZero /* Register field mapping */
266*10465441SEvalZero #define REGFIELD(reg, rfld)	  (((reg) & rfld##_MSK) >> rfld##_SHF)
267*10465441SEvalZero 
268*10465441SEvalZero /* absolute register address, access 					*/
269*10465441SEvalZero #define	REGA(addr)		  REG32(addr)
270*10465441SEvalZero 
271*10465441SEvalZero /* physical register address, access: base address + offsett		*/
272*10465441SEvalZero #define	REGP(base,phys)	REG32( (U32)(base) + (phys) )
273*10465441SEvalZero 
274*10465441SEvalZero /* relative register address, access: base address + offsett		*/
275*10465441SEvalZero #define REG(base,offs)  REG32( (U32)(base) + offs##_##OFS )
276*10465441SEvalZero 
277*10465441SEvalZero /* relative register address, access: base address + offsett		*/
278*10465441SEvalZero #define REG_8(base,offs)  REG8( (U32)(base) + offs##_##OFS )
279*10465441SEvalZero 
280*10465441SEvalZero /* relative register address, access: base address + offsett		*/
281*10465441SEvalZero #define REG_16(base,offs)  REG16( (U32)(base) + offs##_##OFS )
282*10465441SEvalZero 
283*10465441SEvalZero /* relative register address, access: base address + offsett		*/
284*10465441SEvalZero #define REG_64(base,offs)  REG64( (U32)(base) + offs##_##OFS )
285*10465441SEvalZero 
286*10465441SEvalZero /**************************************
287*10465441SEvalZero  * Macroes not used by YAMON any more
288*10465441SEvalZero  * (kept for backwards compatibility)
289*10465441SEvalZero  */
290*10465441SEvalZero /* register read field							*/
291*10465441SEvalZero #define	REGARD(addr,fld)	((REGA(addr) & addr##_##fld##_##MSK) 	\
292*10465441SEvalZero 			 >> addr##_##fld##_##SHF)
293*10465441SEvalZero 
294*10465441SEvalZero /* register write numeric field value					*/
295*10465441SEvalZero #define	REGAWRI(addr,fld,intval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\
296*10465441SEvalZero 				 | ((intval) << addr##_##fld##_##SHF))
297*10465441SEvalZero 
298*10465441SEvalZero /* register write enumerated field value				*/
299*10465441SEvalZero #define	REGAWRE(addr,fld,enumval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\
300*10465441SEvalZero 			| ((addr##_##fld##_##enumval) << addr##_##fld##_##SHF))
301*10465441SEvalZero 
302*10465441SEvalZero 
303*10465441SEvalZero /* Examples:
304*10465441SEvalZero  *
305*10465441SEvalZero  *	exccode = REGARD(CPU_CAUSE,EXC);
306*10465441SEvalZero  *
307*10465441SEvalZero  *	REGA(SDR_CONTROL) = REGAWRI(OSG_CONTROL,TMO,17)
308*10465441SEvalZero  *			 | REGAWRE(OSG_CONTROL,DTYPE,PC1);
309*10465441SEvalZero  */
310*10465441SEvalZero 
311*10465441SEvalZero 
312*10465441SEvalZero /* register read field							*/
313*10465441SEvalZero #define	REGRD(base,offs,fld) ((REG(base,offs) & offs##_##fld##_##MSK) 	\
314*10465441SEvalZero 			 >> offs##_##fld##_##SHF)
315*10465441SEvalZero 
316*10465441SEvalZero /* register write numeric field value					*/
317*10465441SEvalZero #define	REGWRI(base,offs,fld,intval)((REG(base,offs)& ~(offs##_##fld##_##MSK))\
318*10465441SEvalZero                                  | (((intval) << offs##_##fld##_##SHF) & offs##_##fld##_##MSK))
319*10465441SEvalZero 
320*10465441SEvalZero /* register write enumerated field value				*/
321*10465441SEvalZero #define	REGWRE(base,offs,fld,enumval)((REG(base,offs) & ~(offs##_##fld##_##MSK))\
322*10465441SEvalZero 				| ((offs##_##fld##_##enumval) << offs##_##fld##_##SHF))
323*10465441SEvalZero 
324*10465441SEvalZero 
325*10465441SEvalZero /* physical register read field							*/
326*10465441SEvalZero #define	REGPRD(base,phys,fld) ((REGP(base,phys) & phys##_##fld##_##MSK) 	\
327*10465441SEvalZero 			 >> phys##_##fld##_##SHF)
328*10465441SEvalZero 
329*10465441SEvalZero /* physical register write numeric field value					*/
330*10465441SEvalZero #define	REGPWRI(base,phys,fld,intval)((REGP(base,phys)& ~(phys##_##fld##_##MSK))\
331*10465441SEvalZero 				 | ((intval) << phys##_##fld##_##SHF))
332*10465441SEvalZero 
333*10465441SEvalZero /* physical register write enumerated field value				*/
334*10465441SEvalZero #define	REGPWRE(base,phys,fld,enumval)((REGP(base,phys) & ~(phys##_##fld##_##MSK))\
335*10465441SEvalZero 				| ((phys##_##fld##_##enumval) << phys##_##fld##_##SHF))
336*10465441SEvalZero /*
337*10465441SEvalZero  * End of macroes not used by YAMON any more
338*10465441SEvalZero  *********************************************/
339*10465441SEvalZero 
340*10465441SEvalZero /* Endian related macros */
341*10465441SEvalZero 
342*10465441SEvalZero #define SWAP_BYTEADDR32( addr )   ( (addr) ^ 0x3 )
343*10465441SEvalZero #define SWAP_U16ADDR32( addr ) ( (addr) ^ 0x2 )
344*10465441SEvalZero 
345*10465441SEvalZero /* Set byte address to little endian format */
346*10465441SEvalZero #ifdef EL
347*10465441SEvalZero #define SWAP_BYTEADDR_EL(addr) 	  addr
348*10465441SEvalZero #else
349*10465441SEvalZero #define SWAP_BYTEADDR_EL(addr)    SWAP_BYTEADDR32( addr )
350*10465441SEvalZero #endif
351*10465441SEvalZero 
352*10465441SEvalZero /* Set byte address to big endian format */
353*10465441SEvalZero #ifdef EB
354*10465441SEvalZero #define SWAP_BYTEADDR_EB(addr) 	  addr
355*10465441SEvalZero #else
356*10465441SEvalZero #define SWAP_BYTEADDR_EB(addr)    SWAP_BYTEADDR32( addr )
357*10465441SEvalZero #endif
358*10465441SEvalZero 
359*10465441SEvalZero /* Set U16 address to little endian format */
360*10465441SEvalZero #ifdef EL
361*10465441SEvalZero #define SWAP_U16ADDR_EL(addr)  addr
362*10465441SEvalZero #else
363*10465441SEvalZero #define SWAP_U16ADDR_EL(addr)  SWAP_U16ADDR32( addr )
364*10465441SEvalZero #endif
365*10465441SEvalZero 
366*10465441SEvalZero /* Set U16 address to big endian format */
367*10465441SEvalZero #ifdef EB
368*10465441SEvalZero #define SWAP_U16ADDR_EB(addr)  addr
369*10465441SEvalZero #else
370*10465441SEvalZero #define SWAP_U16ADDR_EB(addr)  SWAP_U16ADDR32( addr )
371*10465441SEvalZero #endif
372*10465441SEvalZero 
373*10465441SEvalZero #ifdef EL
374*10465441SEvalZero #define REGW32LE(addr, data)      REG32(addr) = (data)
375*10465441SEvalZero #define REGR32LE(addr, data)      (data)      = REG32(addr)
376*10465441SEvalZero #else
377*10465441SEvalZero #define REGW32LE(addr, data)      REG32(addr) = SWAPEND32(data)
378*10465441SEvalZero #define REGR32LE(addr, data)      (data)      = REG32(addr), (data) = SWAPEND32(data)
379*10465441SEvalZero #endif
380*10465441SEvalZero 
381*10465441SEvalZero /* Set of 'LE'-macros, convert by BE: */
382*10465441SEvalZero #ifdef EL
383*10465441SEvalZero #define CPU_TO_LE32( value ) (value)
384*10465441SEvalZero #define LE32_TO_CPU( value ) (value)
385*10465441SEvalZero 
386*10465441SEvalZero #define CPU_TO_LE16( value ) (value)
387*10465441SEvalZero #define LE16_TO_CPU( value ) (value)
388*10465441SEvalZero #else
389*10465441SEvalZero #define CPU_TO_LE32( value ) ( (                ((U32)value)  << 24) |   \
390*10465441SEvalZero                                ((0x0000FF00UL & ((U32)value)) <<  8) |   \
391*10465441SEvalZero                                ((0x00FF0000UL & ((U32)value)) >>  8) |   \
392*10465441SEvalZero                                (                ((U32)value)  >> 24)   )
393*10465441SEvalZero #define LE32_TO_CPU( value ) CPU_TO_LE32( value )
394*10465441SEvalZero 
395*10465441SEvalZero #define CPU_TO_LE16( value ) ( ((U16)(((U16)value)  << 8)) |   \
396*10465441SEvalZero                                ((U16)(((U16)value)  >> 8))   )
397*10465441SEvalZero #define LE16_TO_CPU( value ) CPU_TO_LE16( value )
398*10465441SEvalZero #endif
399*10465441SEvalZero 
400*10465441SEvalZero /* Set of 'BE'-macros, convert by LE: */
401*10465441SEvalZero #ifdef EB
402*10465441SEvalZero #define CPU_TO_BE32( value ) (value)
403*10465441SEvalZero #define BE32_TO_CPU( value ) (value)
404*10465441SEvalZero 
405*10465441SEvalZero #define CPU_TO_BE16( value ) (value)
406*10465441SEvalZero #define BE16_TO_CPU( value ) (value)
407*10465441SEvalZero #else
408*10465441SEvalZero #define CPU_TO_BE32( value ) ( (                ((U32)value)  << 24) |   \
409*10465441SEvalZero                                ((0x0000FF00UL & ((U32)value)) <<  8) |   \
410*10465441SEvalZero                                ((0x00FF0000UL & ((U32)value)) >>  8) |   \
411*10465441SEvalZero                                (                ((U32)value)  >> 24)   )
412*10465441SEvalZero #define BE32_TO_CPU( value ) CPU_TO_BE32( value )
413*10465441SEvalZero 
414*10465441SEvalZero #define CPU_TO_BE16( value ) ( ((U16)(((U16)value)  << 8)) |   \
415*10465441SEvalZero                                ((U16)(((U16)value)  >> 8))   )
416*10465441SEvalZero #define BE16_TO_CPU( value ) CPU_TO_BE16( value )
417*10465441SEvalZero #endif
418*10465441SEvalZero 
419*10465441SEvalZero 
420*10465441SEvalZero /* Control characters */
421*10465441SEvalZero #define CTRL_A          ('A'-0x40)
422*10465441SEvalZero #define CTRL_B          ('B'-0x40)
423*10465441SEvalZero #define CTRL_C          ('C'-0x40)
424*10465441SEvalZero #define CTRL_D          ('D'-0x40)
425*10465441SEvalZero #define CTRL_E          ('E'-0x40)
426*10465441SEvalZero #define CTRL_F          ('F'-0x40)
427*10465441SEvalZero #define CTRL_H          ('H'-0x40)
428*10465441SEvalZero #define CTRL_K          ('K'-0x40)
429*10465441SEvalZero #define CTRL_N          ('N'-0x40)
430*10465441SEvalZero #define CTRL_P          ('P'-0x40)
431*10465441SEvalZero #define CTRL_U          ('U'-0x40)
432*10465441SEvalZero #define BACKSPACE       0x08
433*10465441SEvalZero #define DEL             0x7F
434*10465441SEvalZero #define TAB             0x09
435*10465441SEvalZero #define CR              0x0D /* Enter Key */
436*10465441SEvalZero #define LF              0x0A
437*10465441SEvalZero #define ESC             0x1B
438*10465441SEvalZero #define SP              0x20
439*10465441SEvalZero #define CSI             0x9B
440*10465441SEvalZero 
441*10465441SEvalZero 
442*10465441SEvalZero /* DEF2STR(x) converts #define symbol to string */
443*10465441SEvalZero #define DEF2STR1(x) #x
444*10465441SEvalZero #define DEF2STR(x)  DEF2STR1(x)
445*10465441SEvalZero 
446*10465441SEvalZero 
447*10465441SEvalZero #endif /* _MIPS_ASM_H_ */
448