Merge tag 'powerpc-4.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[cascardo/linux.git] / tools / testing / selftests / powerpc / fpu_asm.h
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 */