selftests/powerpc: Rework FPU stack placement macros and move to header file
authorCyril Bur <cyrilbur@gmail.com>
Fri, 23 Sep 2016 06:18:14 +0000 (16:18 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 4 Oct 2016 09:10:11 +0000 (20:10 +1100)
The FPU regs are placed at the top of the stack frame. Currently the
position expected to be passed to the macro. The macros now should be
passed the stack frame size and from there they can calculate where to
put the regs, this makes the use simpler.

Also move them to a header file to be used in an different area of the
powerpc selftests

Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
tools/testing/selftests/powerpc/fpu_asm.h [new file with mode: 0644]
tools/testing/selftests/powerpc/math/fpu_asm.S

diff --git a/tools/testing/selftests/powerpc/fpu_asm.h b/tools/testing/selftests/powerpc/fpu_asm.h
new file mode 100644 (file)
index 0000000..6a387d2
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016, Cyril Bur, IBM Corp.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _SELFTESTS_POWERPC_FPU_ASM_H
+#define _SELFTESTS_POWERPC_FPU_ASM_H
+#include "basic_asm.h"
+
+#define PUSH_FPU(stack_size) \
+       stfd    f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
+       stfd    f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
+       stfd    f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
+       stfd    f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
+       stfd    f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
+       stfd    f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
+       stfd    f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
+       stfd    f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
+       stfd    f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
+       stfd    f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
+       stfd    f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
+       stfd    f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
+       stfd    f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
+       stfd    f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
+       stfd    f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
+       stfd    f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
+       stfd    f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
+       stfd    f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);
+
+#define POP_FPU(stack_size) \
+       lfd     f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
+       lfd     f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
+       lfd     f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
+       lfd     f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
+       lfd     f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
+       lfd     f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
+       lfd     f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
+       lfd     f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
+       lfd     f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
+       lfd     f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
+       lfd     f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
+       lfd     f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
+       lfd     f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
+       lfd     f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
+       lfd     f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
+       lfd     f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
+       lfd     f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
+       lfd     f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);
+
+/*
+ * Careful calling this, it will 'clobber' fpu (by design)
+ * Don't call this from C
+ */
+FUNC_START(load_fpu)
+       lfd     f14,0(r3)
+       lfd     f15,8(r3)
+       lfd     f16,16(r3)
+       lfd     f17,24(r3)
+       lfd     f18,32(r3)
+       lfd     f19,40(r3)
+       lfd     f20,48(r3)
+       lfd     f21,56(r3)
+       lfd     f22,64(r3)
+       lfd     f23,72(r3)
+       lfd     f24,80(r3)
+       lfd     f25,88(r3)
+       lfd     f26,96(r3)
+       lfd     f27,104(r3)
+       lfd     f28,112(r3)
+       lfd     f29,120(r3)
+       lfd     f30,128(r3)
+       lfd     f31,136(r3)
+       blr
+FUNC_END(load_fpu)
+
+#endif /* _SELFTESTS_POWERPC_FPU_ASM_H */
index f3711d8..241f067 100644 (file)
@@ -8,70 +8,7 @@
  */
 
 #include "../basic_asm.h"
-
-#define PUSH_FPU(pos) \
-       stfd    f14,pos(sp); \
-       stfd    f15,pos+8(sp); \
-       stfd    f16,pos+16(sp); \
-       stfd    f17,pos+24(sp); \
-       stfd    f18,pos+32(sp); \
-       stfd    f19,pos+40(sp); \
-       stfd    f20,pos+48(sp); \
-       stfd    f21,pos+56(sp); \
-       stfd    f22,pos+64(sp); \
-       stfd    f23,pos+72(sp); \
-       stfd    f24,pos+80(sp); \
-       stfd    f25,pos+88(sp); \
-       stfd    f26,pos+96(sp); \
-       stfd    f27,pos+104(sp); \
-       stfd    f28,pos+112(sp); \
-       stfd    f29,pos+120(sp); \
-       stfd    f30,pos+128(sp); \
-       stfd    f31,pos+136(sp);
-
-#define POP_FPU(pos) \
-       lfd     f14,pos(sp); \
-       lfd     f15,pos+8(sp); \
-       lfd     f16,pos+16(sp); \
-       lfd     f17,pos+24(sp); \
-       lfd     f18,pos+32(sp); \
-       lfd     f19,pos+40(sp); \
-       lfd     f20,pos+48(sp); \
-       lfd     f21,pos+56(sp); \
-       lfd     f22,pos+64(sp); \
-       lfd     f23,pos+72(sp); \
-       lfd     f24,pos+80(sp); \
-       lfd     f25,pos+88(sp); \
-       lfd     f26,pos+96(sp); \
-       lfd     f27,pos+104(sp); \
-       lfd     f28,pos+112(sp); \
-       lfd     f29,pos+120(sp); \
-       lfd     f30,pos+128(sp); \
-       lfd     f31,pos+136(sp);
-
-# Careful calling this, it will 'clobber' fpu (by design)
-# Don't call this from C
-FUNC_START(load_fpu)
-       lfd     f14,0(r3)
-       lfd     f15,8(r3)
-       lfd     f16,16(r3)
-       lfd     f17,24(r3)
-       lfd     f18,32(r3)
-       lfd     f19,40(r3)
-       lfd     f20,48(r3)
-       lfd     f21,56(r3)
-       lfd     f22,64(r3)
-       lfd     f23,72(r3)
-       lfd     f24,80(r3)
-       lfd     f25,88(r3)
-       lfd     f26,96(r3)
-       lfd     f27,104(r3)
-       lfd     f28,112(r3)
-       lfd     f29,120(r3)
-       lfd     f30,128(r3)
-       lfd     f31,136(r3)
-       blr
-FUNC_END(load_fpu)
+#include "../fpu_asm.h"
 
 FUNC_START(check_fpu)
        mr r4,r3
@@ -138,9 +75,9 @@ FUNC_START(test_fpu)
        # r4 holds pointer to the pid
        # f14-f31 are non volatiles
        PUSH_BASIC_STACK(256)
+       PUSH_FPU(256)
        std     r3,STACK_FRAME_PARAM(0)(sp) # Address of darray
        std r4,STACK_FRAME_PARAM(1)(sp) # Address of pid
-       PUSH_FPU(STACK_FRAME_LOCAL(2,0))
 
        bl load_fpu
        nop
@@ -155,7 +92,7 @@ FUNC_START(test_fpu)
        bl check_fpu
        nop
 
-       POP_FPU(STACK_FRAME_LOCAL(2,0))
+       POP_FPU(256)
        POP_BASIC_STACK(256)
        blr
 FUNC_END(test_fpu)
@@ -166,10 +103,10 @@ FUNC_END(test_fpu)
 # registers while running is not zero.
 FUNC_START(preempt_fpu)
        PUSH_BASIC_STACK(256)
+       PUSH_FPU(256)
        std r3,STACK_FRAME_PARAM(0)(sp) # double *darray
        std r4,STACK_FRAME_PARAM(1)(sp) # int *threads_starting
        std r5,STACK_FRAME_PARAM(2)(sp) # int *running
-       PUSH_FPU(STACK_FRAME_LOCAL(3,0))
 
        bl load_fpu
        nop
@@ -192,7 +129,7 @@ FUNC_START(preempt_fpu)
        cmpwi r5,0
        bne 2b
 
-3:     POP_FPU(STACK_FRAME_LOCAL(3,0))
+3:     POP_FPU(256)
        POP_BASIC_STACK(256)
        blr
 FUNC_END(preempt_fpu)