1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * test helper assembly functions
5 * Copyright (C) 2016 Simon Guo, IBM Corporation.
6 * Copyright 2022 Michael Ellerman, IBM Corporation.
10 #define GPR_SIZE __SIZEOF_LONG__
12 #define NUM_GPRS (32 - FIRST_GPR)
13 #define STACK_SIZE (NUM_GPRS * GPR_SIZE)
15 // gpr_child_loop(int *read_flag, int *write_flag,
16 // unsigned long *gpr_buf, double *fpr_buf);
17 FUNC_START(gpr_child_loop)
22 PUSH_BASIC_STACK(STACK_SIZE)
24 // Save non-volatile GPRs
25 OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
27 // Load GPRs with expected values
28 OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
30 // Load FPRs with expected values
31 OP_REGS lfd, 8, 0, 31, r6
33 // Signal to parent that we're ready
37 // Wait for parent to finish
40 beq 1b // Loop while flag is zero
42 // Save GPRs back to caller buffer
43 OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
46 OP_REGS stfd, 8, 0, 31, r6
48 // Reload non-volatile GPRs
49 OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
51 POP_BASIC_STACK(STACK_SIZE)