162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2015, Cyril Bur, IBM Corp.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "basic_asm.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/* POS MUST BE 16 ALIGNED! */
962306a36Sopenharmony_ci#define PUSH_VMX(pos,reg) \
1062306a36Sopenharmony_ci	li	reg,pos; \
1162306a36Sopenharmony_ci	stvx	v20,reg,%r1; \
1262306a36Sopenharmony_ci	addi	reg,reg,16; \
1362306a36Sopenharmony_ci	stvx	v21,reg,%r1; \
1462306a36Sopenharmony_ci	addi	reg,reg,16; \
1562306a36Sopenharmony_ci	stvx	v22,reg,%r1; \
1662306a36Sopenharmony_ci	addi	reg,reg,16; \
1762306a36Sopenharmony_ci	stvx	v23,reg,%r1; \
1862306a36Sopenharmony_ci	addi	reg,reg,16; \
1962306a36Sopenharmony_ci	stvx	v24,reg,%r1; \
2062306a36Sopenharmony_ci	addi	reg,reg,16; \
2162306a36Sopenharmony_ci	stvx	v25,reg,%r1; \
2262306a36Sopenharmony_ci	addi	reg,reg,16; \
2362306a36Sopenharmony_ci	stvx	v26,reg,%r1; \
2462306a36Sopenharmony_ci	addi	reg,reg,16; \
2562306a36Sopenharmony_ci	stvx	v27,reg,%r1; \
2662306a36Sopenharmony_ci	addi	reg,reg,16; \
2762306a36Sopenharmony_ci	stvx	v28,reg,%r1; \
2862306a36Sopenharmony_ci	addi	reg,reg,16; \
2962306a36Sopenharmony_ci	stvx	v29,reg,%r1; \
3062306a36Sopenharmony_ci	addi	reg,reg,16; \
3162306a36Sopenharmony_ci	stvx	v30,reg,%r1; \
3262306a36Sopenharmony_ci	addi	reg,reg,16; \
3362306a36Sopenharmony_ci	stvx	v31,reg,%r1;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* POS MUST BE 16 ALIGNED! */
3662306a36Sopenharmony_ci#define POP_VMX(pos,reg) \
3762306a36Sopenharmony_ci	li	reg,pos; \
3862306a36Sopenharmony_ci	lvx	v20,reg,%r1; \
3962306a36Sopenharmony_ci	addi	reg,reg,16; \
4062306a36Sopenharmony_ci	lvx	v21,reg,%r1; \
4162306a36Sopenharmony_ci	addi	reg,reg,16; \
4262306a36Sopenharmony_ci	lvx	v22,reg,%r1; \
4362306a36Sopenharmony_ci	addi	reg,reg,16; \
4462306a36Sopenharmony_ci	lvx	v23,reg,%r1; \
4562306a36Sopenharmony_ci	addi	reg,reg,16; \
4662306a36Sopenharmony_ci	lvx	v24,reg,%r1; \
4762306a36Sopenharmony_ci	addi	reg,reg,16; \
4862306a36Sopenharmony_ci	lvx	v25,reg,%r1; \
4962306a36Sopenharmony_ci	addi	reg,reg,16; \
5062306a36Sopenharmony_ci	lvx	v26,reg,%r1; \
5162306a36Sopenharmony_ci	addi	reg,reg,16; \
5262306a36Sopenharmony_ci	lvx	v27,reg,%r1; \
5362306a36Sopenharmony_ci	addi	reg,reg,16; \
5462306a36Sopenharmony_ci	lvx	v28,reg,%r1; \
5562306a36Sopenharmony_ci	addi	reg,reg,16; \
5662306a36Sopenharmony_ci	lvx	v29,reg,%r1; \
5762306a36Sopenharmony_ci	addi	reg,reg,16; \
5862306a36Sopenharmony_ci	lvx	v30,reg,%r1; \
5962306a36Sopenharmony_ci	addi	reg,reg,16; \
6062306a36Sopenharmony_ci	lvx	v31,reg,%r1;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/*
6362306a36Sopenharmony_ci * Careful this will 'clobber' vmx (by design)
6462306a36Sopenharmony_ci * Don't call this from C
6562306a36Sopenharmony_ci */
6662306a36Sopenharmony_ciFUNC_START(load_vmx)
6762306a36Sopenharmony_ci	li	r5,0
6862306a36Sopenharmony_ci	lvx	v20,r5,r3
6962306a36Sopenharmony_ci	addi	r5,r5,16
7062306a36Sopenharmony_ci	lvx	v21,r5,r3
7162306a36Sopenharmony_ci	addi	r5,r5,16
7262306a36Sopenharmony_ci	lvx	v22,r5,r3
7362306a36Sopenharmony_ci	addi	r5,r5,16
7462306a36Sopenharmony_ci	lvx	v23,r5,r3
7562306a36Sopenharmony_ci	addi	r5,r5,16
7662306a36Sopenharmony_ci	lvx	v24,r5,r3
7762306a36Sopenharmony_ci	addi	r5,r5,16
7862306a36Sopenharmony_ci	lvx	v25,r5,r3
7962306a36Sopenharmony_ci	addi	r5,r5,16
8062306a36Sopenharmony_ci	lvx	v26,r5,r3
8162306a36Sopenharmony_ci	addi	r5,r5,16
8262306a36Sopenharmony_ci	lvx	v27,r5,r3
8362306a36Sopenharmony_ci	addi	r5,r5,16
8462306a36Sopenharmony_ci	lvx	v28,r5,r3
8562306a36Sopenharmony_ci	addi	r5,r5,16
8662306a36Sopenharmony_ci	lvx	v29,r5,r3
8762306a36Sopenharmony_ci	addi	r5,r5,16
8862306a36Sopenharmony_ci	lvx	v30,r5,r3
8962306a36Sopenharmony_ci	addi	r5,r5,16
9062306a36Sopenharmony_ci	lvx	v31,r5,r3
9162306a36Sopenharmony_ci	blr
9262306a36Sopenharmony_ciFUNC_END(load_vmx)
93