xref: /linux/tools/testing/selftests/powerpc/include/fpu_asm.h (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1 /*
2  * Copyright 2016, Cyril Bur, IBM Corp.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  */
9 
10 #ifndef _SELFTESTS_POWERPC_FPU_ASM_H
11 #define _SELFTESTS_POWERPC_FPU_ASM_H
12 #include "basic_asm.h"
13 
14 #define PUSH_FPU(stack_size) \
15 	stfd	f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
16 	stfd	f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
17 	stfd	f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
18 	stfd	f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
19 	stfd	f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
20 	stfd	f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
21 	stfd	f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
22 	stfd	f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
23 	stfd	f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
24 	stfd	f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
25 	stfd	f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
26 	stfd	f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
27 	stfd	f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
28 	stfd	f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
29 	stfd	f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
30 	stfd	f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
31 	stfd	f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
32 	stfd	f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);
33 
34 #define POP_FPU(stack_size) \
35 	lfd	f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
36 	lfd	f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
37 	lfd	f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
38 	lfd	f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
39 	lfd	f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
40 	lfd	f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
41 	lfd	f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
42 	lfd	f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
43 	lfd	f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
44 	lfd	f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
45 	lfd	f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
46 	lfd	f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
47 	lfd	f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
48 	lfd	f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
49 	lfd	f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
50 	lfd	f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
51 	lfd	f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
52 	lfd	f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);
53 
54 /*
55  * Careful calling this, it will 'clobber' fpu (by design)
56  * Don't call this from C
57  */
58 FUNC_START(load_fpu)
59 	lfd	f14,0(r3)
60 	lfd	f15,8(r3)
61 	lfd	f16,16(r3)
62 	lfd	f17,24(r3)
63 	lfd	f18,32(r3)
64 	lfd	f19,40(r3)
65 	lfd	f20,48(r3)
66 	lfd	f21,56(r3)
67 	lfd	f22,64(r3)
68 	lfd	f23,72(r3)
69 	lfd	f24,80(r3)
70 	lfd	f25,88(r3)
71 	lfd	f26,96(r3)
72 	lfd	f27,104(r3)
73 	lfd	f28,112(r3)
74 	lfd	f29,120(r3)
75 	lfd	f30,128(r3)
76 	lfd	f31,136(r3)
77 	blr
78 FUNC_END(load_fpu)
79 
80 #endif /* _SELFTESTS_POWERPC_FPU_ASM_H */
81