cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

asmmacro.h (14639B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 2003 Ralf Baechle
      7 */
      8#ifndef _ASM_ASMMACRO_H
      9#define _ASM_ASMMACRO_H
     10
     11#include <asm/hazards.h>
     12#include <asm/asm-offsets.h>
     13#include <asm/msa.h>
     14
     15#ifdef CONFIG_32BIT
     16#include <asm/asmmacro-32.h>
     17#endif
     18#ifdef CONFIG_64BIT
     19#include <asm/asmmacro-64.h>
     20#endif
     21
     22/* preprocessor replaces the fp in ".set fp=64" with $30 otherwise */
     23#undef fp
     24
     25/*
     26 * Helper macros for generating raw instruction encodings.
     27 */
     28#ifdef CONFIG_CPU_MICROMIPS
     29	.macro	insn32_if_mm enc
     30	.insn
     31	.hword ((\enc) >> 16)
     32	.hword ((\enc) & 0xffff)
     33	.endm
     34
     35	.macro	insn_if_mips enc
     36	.endm
     37#else
     38	.macro	insn32_if_mm enc
     39	.endm
     40
     41	.macro	insn_if_mips enc
     42	.insn
     43	.word (\enc)
     44	.endm
     45#endif
     46
     47#ifdef CONFIG_CPU_HAS_DIEI
     48	.macro	local_irq_enable reg=t0
     49	ei
     50	irq_enable_hazard
     51	.endm
     52
     53	.macro	local_irq_disable reg=t0
     54	di
     55	irq_disable_hazard
     56	.endm
     57#else /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
     58	.macro	local_irq_enable reg=t0
     59	mfc0	\reg, CP0_STATUS
     60	ori	\reg, \reg, 1
     61	mtc0	\reg, CP0_STATUS
     62	irq_enable_hazard
     63	.endm
     64
     65	.macro	local_irq_disable reg=t0
     66#ifdef CONFIG_PREEMPTION
     67	lw      \reg, TI_PRE_COUNT($28)
     68	addi    \reg, \reg, 1
     69	sw      \reg, TI_PRE_COUNT($28)
     70#endif
     71	mfc0	\reg, CP0_STATUS
     72	ori	\reg, \reg, 1
     73	xori	\reg, \reg, 1
     74	mtc0	\reg, CP0_STATUS
     75	irq_disable_hazard
     76#ifdef CONFIG_PREEMPTION
     77	lw      \reg, TI_PRE_COUNT($28)
     78	addi    \reg, \reg, -1
     79	sw      \reg, TI_PRE_COUNT($28)
     80#endif
     81	.endm
     82#endif  /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
     83
     84	.macro	fpu_save_16even thread tmp=t0
     85	.set	push
     86	SET_HARDFLOAT
     87	cfc1	\tmp, fcr31
     88	sdc1	$f0,  THREAD_FPR0(\thread)
     89	sdc1	$f2,  THREAD_FPR2(\thread)
     90	sdc1	$f4,  THREAD_FPR4(\thread)
     91	sdc1	$f6,  THREAD_FPR6(\thread)
     92	sdc1	$f8,  THREAD_FPR8(\thread)
     93	sdc1	$f10, THREAD_FPR10(\thread)
     94	sdc1	$f12, THREAD_FPR12(\thread)
     95	sdc1	$f14, THREAD_FPR14(\thread)
     96	sdc1	$f16, THREAD_FPR16(\thread)
     97	sdc1	$f18, THREAD_FPR18(\thread)
     98	sdc1	$f20, THREAD_FPR20(\thread)
     99	sdc1	$f22, THREAD_FPR22(\thread)
    100	sdc1	$f24, THREAD_FPR24(\thread)
    101	sdc1	$f26, THREAD_FPR26(\thread)
    102	sdc1	$f28, THREAD_FPR28(\thread)
    103	sdc1	$f30, THREAD_FPR30(\thread)
    104	sw	\tmp, THREAD_FCR31(\thread)
    105	.set	pop
    106	.endm
    107
    108	.macro	fpu_save_16odd thread
    109	.set	push
    110	.set	mips64r2
    111	.set	fp=64
    112	SET_HARDFLOAT
    113	sdc1	$f1,  THREAD_FPR1(\thread)
    114	sdc1	$f3,  THREAD_FPR3(\thread)
    115	sdc1	$f5,  THREAD_FPR5(\thread)
    116	sdc1	$f7,  THREAD_FPR7(\thread)
    117	sdc1	$f9,  THREAD_FPR9(\thread)
    118	sdc1	$f11, THREAD_FPR11(\thread)
    119	sdc1	$f13, THREAD_FPR13(\thread)
    120	sdc1	$f15, THREAD_FPR15(\thread)
    121	sdc1	$f17, THREAD_FPR17(\thread)
    122	sdc1	$f19, THREAD_FPR19(\thread)
    123	sdc1	$f21, THREAD_FPR21(\thread)
    124	sdc1	$f23, THREAD_FPR23(\thread)
    125	sdc1	$f25, THREAD_FPR25(\thread)
    126	sdc1	$f27, THREAD_FPR27(\thread)
    127	sdc1	$f29, THREAD_FPR29(\thread)
    128	sdc1	$f31, THREAD_FPR31(\thread)
    129	.set	pop
    130	.endm
    131
    132	.macro	fpu_save_double thread status tmp
    133#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
    134    defined(CONFIG_CPU_MIPSR5) || defined(CONFIG_CPU_MIPSR6)
    135	sll	\tmp, \status, 5
    136	bgez	\tmp, 10f
    137	fpu_save_16odd \thread
    13810:
    139#endif
    140	fpu_save_16even \thread \tmp
    141	.endm
    142
    143	.macro	fpu_restore_16even thread tmp=t0
    144	.set	push
    145	SET_HARDFLOAT
    146	lw	\tmp, THREAD_FCR31(\thread)
    147	ldc1	$f0,  THREAD_FPR0(\thread)
    148	ldc1	$f2,  THREAD_FPR2(\thread)
    149	ldc1	$f4,  THREAD_FPR4(\thread)
    150	ldc1	$f6,  THREAD_FPR6(\thread)
    151	ldc1	$f8,  THREAD_FPR8(\thread)
    152	ldc1	$f10, THREAD_FPR10(\thread)
    153	ldc1	$f12, THREAD_FPR12(\thread)
    154	ldc1	$f14, THREAD_FPR14(\thread)
    155	ldc1	$f16, THREAD_FPR16(\thread)
    156	ldc1	$f18, THREAD_FPR18(\thread)
    157	ldc1	$f20, THREAD_FPR20(\thread)
    158	ldc1	$f22, THREAD_FPR22(\thread)
    159	ldc1	$f24, THREAD_FPR24(\thread)
    160	ldc1	$f26, THREAD_FPR26(\thread)
    161	ldc1	$f28, THREAD_FPR28(\thread)
    162	ldc1	$f30, THREAD_FPR30(\thread)
    163	ctc1	\tmp, fcr31
    164	.set	pop
    165	.endm
    166
    167	.macro	fpu_restore_16odd thread
    168	.set	push
    169	.set	mips64r2
    170	.set	fp=64
    171	SET_HARDFLOAT
    172	ldc1	$f1,  THREAD_FPR1(\thread)
    173	ldc1	$f3,  THREAD_FPR3(\thread)
    174	ldc1	$f5,  THREAD_FPR5(\thread)
    175	ldc1	$f7,  THREAD_FPR7(\thread)
    176	ldc1	$f9,  THREAD_FPR9(\thread)
    177	ldc1	$f11, THREAD_FPR11(\thread)
    178	ldc1	$f13, THREAD_FPR13(\thread)
    179	ldc1	$f15, THREAD_FPR15(\thread)
    180	ldc1	$f17, THREAD_FPR17(\thread)
    181	ldc1	$f19, THREAD_FPR19(\thread)
    182	ldc1	$f21, THREAD_FPR21(\thread)
    183	ldc1	$f23, THREAD_FPR23(\thread)
    184	ldc1	$f25, THREAD_FPR25(\thread)
    185	ldc1	$f27, THREAD_FPR27(\thread)
    186	ldc1	$f29, THREAD_FPR29(\thread)
    187	ldc1	$f31, THREAD_FPR31(\thread)
    188	.set	pop
    189	.endm
    190
    191	.macro	fpu_restore_double thread status tmp
    192#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
    193    defined(CONFIG_CPU_MIPSR5) || defined(CONFIG_CPU_MIPSR6)
    194	sll	\tmp, \status, 5
    195	bgez	\tmp, 10f				# 16 register mode?
    196
    197	fpu_restore_16odd \thread
    19810:
    199#endif
    200	fpu_restore_16even \thread \tmp
    201	.endm
    202
    203#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \
    204    defined(CONFIG_CPU_MIPSR6)
    205	.macro	_EXT	rd, rs, p, s
    206	ext	\rd, \rs, \p, \s
    207	.endm
    208#else /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
    209	.macro	_EXT	rd, rs, p, s
    210	srl	\rd, \rs, \p
    211	andi	\rd, \rd, (1 << \s) - 1
    212	.endm
    213#endif /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR5 && !CONFIG_CPU_MIPSR6 */
    214
    215/*
    216 * Temporary until all gas have MT ASE support
    217 */
    218	.macro	DMT	reg=0
    219	.word	0x41600bc1 | (\reg << 16)
    220	.endm
    221
    222	.macro	EMT	reg=0
    223	.word	0x41600be1 | (\reg << 16)
    224	.endm
    225
    226	.macro	DVPE	reg=0
    227	.word	0x41600001 | (\reg << 16)
    228	.endm
    229
    230	.macro	EVPE	reg=0
    231	.word	0x41600021 | (\reg << 16)
    232	.endm
    233
    234	.macro	MFTR	rt=0, rd=0, u=0, sel=0
    235	 .word	0x41000000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
    236	.endm
    237
    238	.macro	MTTR	rt=0, rd=0, u=0, sel=0
    239	 .word	0x41800000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
    240	.endm
    241
    242#ifdef TOOLCHAIN_SUPPORTS_MSA
    243	.macro	_cfcmsa	rd, cs
    244	.set	push
    245	.set	mips32r2
    246	.set	fp=64
    247	.set	msa
    248	cfcmsa	\rd, $\cs
    249	.set	pop
    250	.endm
    251
    252	.macro	_ctcmsa	cd, rs
    253	.set	push
    254	.set	mips32r2
    255	.set	fp=64
    256	.set	msa
    257	ctcmsa	$\cd, \rs
    258	.set	pop
    259	.endm
    260
    261	.macro	ld_b	wd, off, base
    262	.set	push
    263	.set	mips32r2
    264	.set	fp=64
    265	.set	msa
    266	ld.b	$w\wd, \off(\base)
    267	.set	pop
    268	.endm
    269
    270	.macro	ld_h	wd, off, base
    271	.set	push
    272	.set	mips32r2
    273	.set	fp=64
    274	.set	msa
    275	ld.h	$w\wd, \off(\base)
    276	.set	pop
    277	.endm
    278
    279	.macro	ld_w	wd, off, base
    280	.set	push
    281	.set	mips32r2
    282	.set	fp=64
    283	.set	msa
    284	ld.w	$w\wd, \off(\base)
    285	.set	pop
    286	.endm
    287
    288	.macro	ld_d	wd, off, base
    289	.set	push
    290	.set	mips32r2
    291	.set	fp=64
    292	.set	msa
    293	ld.d	$w\wd, \off(\base)
    294	.set	pop
    295	.endm
    296
    297	.macro	st_b	wd, off, base
    298	.set	push
    299	.set	mips32r2
    300	.set	fp=64
    301	.set	msa
    302	st.b	$w\wd, \off(\base)
    303	.set	pop
    304	.endm
    305
    306	.macro	st_h	wd, off, base
    307	.set	push
    308	.set	mips32r2
    309	.set	fp=64
    310	.set	msa
    311	st.h	$w\wd, \off(\base)
    312	.set	pop
    313	.endm
    314
    315	.macro	st_w	wd, off, base
    316	.set	push
    317	.set	mips32r2
    318	.set	fp=64
    319	.set	msa
    320	st.w	$w\wd, \off(\base)
    321	.set	pop
    322	.endm
    323
    324	.macro	st_d	wd, off, base
    325	.set	push
    326	.set	mips32r2
    327	.set	fp=64
    328	.set	msa
    329	st.d	$w\wd, \off(\base)
    330	.set	pop
    331	.endm
    332
    333	.macro	copy_s_w	ws, n
    334	.set	push
    335	.set	mips32r2
    336	.set	fp=64
    337	.set	msa
    338	copy_s.w $1, $w\ws[\n]
    339	.set	pop
    340	.endm
    341
    342	.macro	copy_s_d	ws, n
    343	.set	push
    344	.set	mips64r2
    345	.set	fp=64
    346	.set	msa
    347	copy_s.d $1, $w\ws[\n]
    348	.set	pop
    349	.endm
    350
    351	.macro	insert_w	wd, n
    352	.set	push
    353	.set	mips32r2
    354	.set	fp=64
    355	.set	msa
    356	insert.w $w\wd[\n], $1
    357	.set	pop
    358	.endm
    359
    360	.macro	insert_d	wd, n
    361	.set	push
    362	.set	mips64r2
    363	.set	fp=64
    364	.set	msa
    365	insert.d $w\wd[\n], $1
    366	.set	pop
    367	.endm
    368#else
    369
    370	/*
    371	 * Temporary until all toolchains in use include MSA support.
    372	 */
    373	.macro	_cfcmsa	rd, cs
    374	.set	push
    375	.set	noat
    376	SET_HARDFLOAT
    377	insn_if_mips 0x787e0059 | (\cs << 11)
    378	insn32_if_mm 0x587e0056 | (\cs << 11)
    379	move	\rd, $1
    380	.set	pop
    381	.endm
    382
    383	.macro	_ctcmsa	cd, rs
    384	.set	push
    385	.set	noat
    386	SET_HARDFLOAT
    387	move	$1, \rs
    388	insn_if_mips 0x783e0819 | (\cd << 6)
    389	insn32_if_mm 0x583e0816 | (\cd << 6)
    390	.set	pop
    391	.endm
    392
    393	.macro	ld_b	wd, off, base
    394	.set	push
    395	.set	noat
    396	SET_HARDFLOAT
    397	PTR_ADDU $1, \base, \off
    398	insn_if_mips 0x78000820 | (\wd << 6)
    399	insn32_if_mm 0x58000807 | (\wd << 6)
    400	.set	pop
    401	.endm
    402
    403	.macro	ld_h	wd, off, base
    404	.set	push
    405	.set	noat
    406	SET_HARDFLOAT
    407	PTR_ADDU $1, \base, \off
    408	insn_if_mips 0x78000821 | (\wd << 6)
    409	insn32_if_mm 0x58000817 | (\wd << 6)
    410	.set	pop
    411	.endm
    412
    413	.macro	ld_w	wd, off, base
    414	.set	push
    415	.set	noat
    416	SET_HARDFLOAT
    417	PTR_ADDU $1, \base, \off
    418	insn_if_mips 0x78000822 | (\wd << 6)
    419	insn32_if_mm 0x58000827 | (\wd << 6)
    420	.set	pop
    421	.endm
    422
    423	.macro	ld_d	wd, off, base
    424	.set	push
    425	.set	noat
    426	SET_HARDFLOAT
    427	PTR_ADDU $1, \base, \off
    428	insn_if_mips 0x78000823 | (\wd << 6)
    429	insn32_if_mm 0x58000837 | (\wd << 6)
    430	.set	pop
    431	.endm
    432
    433	.macro	st_b	wd, off, base
    434	.set	push
    435	.set	noat
    436	SET_HARDFLOAT
    437	PTR_ADDU $1, \base, \off
    438	insn_if_mips 0x78000824 | (\wd << 6)
    439	insn32_if_mm 0x5800080f | (\wd << 6)
    440	.set	pop
    441	.endm
    442
    443	.macro	st_h	wd, off, base
    444	.set	push
    445	.set	noat
    446	SET_HARDFLOAT
    447	PTR_ADDU $1, \base, \off
    448	insn_if_mips 0x78000825 | (\wd << 6)
    449	insn32_if_mm 0x5800081f | (\wd << 6)
    450	.set	pop
    451	.endm
    452
    453	.macro	st_w	wd, off, base
    454	.set	push
    455	.set	noat
    456	SET_HARDFLOAT
    457	PTR_ADDU $1, \base, \off
    458	insn_if_mips 0x78000826 | (\wd << 6)
    459	insn32_if_mm 0x5800082f | (\wd << 6)
    460	.set	pop
    461	.endm
    462
    463	.macro	st_d	wd, off, base
    464	.set	push
    465	.set	noat
    466	SET_HARDFLOAT
    467	PTR_ADDU $1, \base, \off
    468	insn_if_mips 0x78000827 | (\wd << 6)
    469	insn32_if_mm 0x5800083f | (\wd << 6)
    470	.set	pop
    471	.endm
    472
    473	.macro	copy_s_w	ws, n
    474	.set	push
    475	.set	noat
    476	SET_HARDFLOAT
    477	insn_if_mips 0x78b00059 | (\n << 16) | (\ws << 11)
    478	insn32_if_mm 0x58b00056 | (\n << 16) | (\ws << 11)
    479	.set	pop
    480	.endm
    481
    482	.macro	copy_s_d	ws, n
    483	.set	push
    484	.set	noat
    485	SET_HARDFLOAT
    486	insn_if_mips 0x78b80059 | (\n << 16) | (\ws << 11)
    487	insn32_if_mm 0x58b80056 | (\n << 16) | (\ws << 11)
    488	.set	pop
    489	.endm
    490
    491	.macro	insert_w	wd, n
    492	.set	push
    493	.set	noat
    494	SET_HARDFLOAT
    495	insn_if_mips 0x79300819 | (\n << 16) | (\wd << 6)
    496	insn32_if_mm 0x59300816 | (\n << 16) | (\wd << 6)
    497	.set	pop
    498	.endm
    499
    500	.macro	insert_d	wd, n
    501	.set	push
    502	.set	noat
    503	SET_HARDFLOAT
    504	insn_if_mips 0x79380819 | (\n << 16) | (\wd << 6)
    505	insn32_if_mm 0x59380816 | (\n << 16) | (\wd << 6)
    506	.set	pop
    507	.endm
    508#endif
    509
    510#ifdef TOOLCHAIN_SUPPORTS_MSA
    511#define FPR_BASE_OFFS	THREAD_FPR0
    512#define FPR_BASE	$1
    513#else
    514#define FPR_BASE_OFFS	0
    515#define FPR_BASE	\thread
    516#endif
    517
    518	.macro	msa_save_all	thread
    519	.set	push
    520	.set	noat
    521#ifdef TOOLCHAIN_SUPPORTS_MSA
    522	PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
    523#endif
    524	st_d	 0, THREAD_FPR0  - FPR_BASE_OFFS, FPR_BASE
    525	st_d	 1, THREAD_FPR1  - FPR_BASE_OFFS, FPR_BASE
    526	st_d	 2, THREAD_FPR2  - FPR_BASE_OFFS, FPR_BASE
    527	st_d	 3, THREAD_FPR3  - FPR_BASE_OFFS, FPR_BASE
    528	st_d	 4, THREAD_FPR4  - FPR_BASE_OFFS, FPR_BASE
    529	st_d	 5, THREAD_FPR5  - FPR_BASE_OFFS, FPR_BASE
    530	st_d	 6, THREAD_FPR6  - FPR_BASE_OFFS, FPR_BASE
    531	st_d	 7, THREAD_FPR7  - FPR_BASE_OFFS, FPR_BASE
    532	st_d	 8, THREAD_FPR8  - FPR_BASE_OFFS, FPR_BASE
    533	st_d	 9, THREAD_FPR9  - FPR_BASE_OFFS, FPR_BASE
    534	st_d	10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
    535	st_d	11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
    536	st_d	12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
    537	st_d	13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
    538	st_d	14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
    539	st_d	15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
    540	st_d	16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
    541	st_d	17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
    542	st_d	18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
    543	st_d	19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
    544	st_d	20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
    545	st_d	21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
    546	st_d	22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
    547	st_d	23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
    548	st_d	24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
    549	st_d	25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
    550	st_d	26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
    551	st_d	27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
    552	st_d	28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
    553	st_d	29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
    554	st_d	30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
    555	st_d	31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
    556	SET_HARDFLOAT
    557	_cfcmsa	$1, MSA_CSR
    558	sw	$1, THREAD_MSA_CSR(\thread)
    559	.set	pop
    560	.endm
    561
    562	.macro	msa_restore_all	thread
    563	.set	push
    564	.set	noat
    565	SET_HARDFLOAT
    566	lw	$1, THREAD_MSA_CSR(\thread)
    567	_ctcmsa	MSA_CSR, $1
    568#ifdef TOOLCHAIN_SUPPORTS_MSA
    569	PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
    570#endif
    571	ld_d	 0, THREAD_FPR0  - FPR_BASE_OFFS, FPR_BASE
    572	ld_d	 1, THREAD_FPR1  - FPR_BASE_OFFS, FPR_BASE
    573	ld_d	 2, THREAD_FPR2  - FPR_BASE_OFFS, FPR_BASE
    574	ld_d	 3, THREAD_FPR3  - FPR_BASE_OFFS, FPR_BASE
    575	ld_d	 4, THREAD_FPR4  - FPR_BASE_OFFS, FPR_BASE
    576	ld_d	 5, THREAD_FPR5  - FPR_BASE_OFFS, FPR_BASE
    577	ld_d	 6, THREAD_FPR6  - FPR_BASE_OFFS, FPR_BASE
    578	ld_d	 7, THREAD_FPR7  - FPR_BASE_OFFS, FPR_BASE
    579	ld_d	 8, THREAD_FPR8  - FPR_BASE_OFFS, FPR_BASE
    580	ld_d	 9, THREAD_FPR9  - FPR_BASE_OFFS, FPR_BASE
    581	ld_d	10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
    582	ld_d	11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
    583	ld_d	12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
    584	ld_d	13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
    585	ld_d	14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
    586	ld_d	15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
    587	ld_d	16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
    588	ld_d	17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
    589	ld_d	18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
    590	ld_d	19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
    591	ld_d	20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
    592	ld_d	21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
    593	ld_d	22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
    594	ld_d	23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
    595	ld_d	24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
    596	ld_d	25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
    597	ld_d	26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
    598	ld_d	27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
    599	ld_d	28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
    600	ld_d	29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
    601	ld_d	30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
    602	ld_d	31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
    603	.set pop
    604	.endm
    605
    606#undef FPR_BASE_OFFS
    607#undef FPR_BASE
    608
    609	.macro	msa_init_upper wd
    610#ifdef CONFIG_64BIT
    611	insert_d \wd, 1
    612#else
    613	insert_w \wd, 2
    614	insert_w \wd, 3
    615#endif
    616	.endm
    617
    618	.macro	msa_init_all_upper
    619	.set	push
    620	.set	noat
    621	SET_HARDFLOAT
    622	not	$1, zero
    623	msa_init_upper	0
    624	msa_init_upper	1
    625	msa_init_upper	2
    626	msa_init_upper	3
    627	msa_init_upper	4
    628	msa_init_upper	5
    629	msa_init_upper	6
    630	msa_init_upper	7
    631	msa_init_upper	8
    632	msa_init_upper	9
    633	msa_init_upper	10
    634	msa_init_upper	11
    635	msa_init_upper	12
    636	msa_init_upper	13
    637	msa_init_upper	14
    638	msa_init_upper	15
    639	msa_init_upper	16
    640	msa_init_upper	17
    641	msa_init_upper	18
    642	msa_init_upper	19
    643	msa_init_upper	20
    644	msa_init_upper	21
    645	msa_init_upper	22
    646	msa_init_upper	23
    647	msa_init_upper	24
    648	msa_init_upper	25
    649	msa_init_upper	26
    650	msa_init_upper	27
    651	msa_init_upper	28
    652	msa_init_upper	29
    653	msa_init_upper	30
    654	msa_init_upper	31
    655	.set	pop
    656	.endm
    657
    658#endif /* _ASM_ASMMACRO_H */