0001
0002 #ifndef _SELFTESTS_POWERPC_BASIC_ASM_H
0003 #define _SELFTESTS_POWERPC_BASIC_ASM_H
0004
0005 #include <ppc-asm.h>
0006 #include <asm/unistd.h>
0007
0008 #ifdef __powerpc64__
0009 #define PPC_LL ld
0010 #define PPC_STL std
0011 #define PPC_STLU stdu
0012 #else
0013 #define PPC_LL lwz
0014 #define PPC_STL stw
0015 #define PPC_STLU stwu
0016 #endif
0017
0018 #define LOAD_REG_IMMEDIATE(reg, expr) \
0019 lis reg, (expr)@highest; \
0020 ori reg, reg, (expr)@higher; \
0021 rldicr reg, reg, 32, 31; \
0022 oris reg, reg, (expr)@high; \
0023 ori reg, reg, (expr)@l;
0024
0025
0026
0027
0028
0029
0030 #ifdef __powerpc64__
0031
0032
0033 #if defined(_CALL_ELF) && _CALL_ELF == 2
0034 #define STACK_FRAME_MIN_SIZE 32
0035 #define STACK_FRAME_TOC_POS 24
0036 #define __STACK_FRAME_PARAM(_param) (32 + ((_param)*8))
0037 #define __STACK_FRAME_LOCAL(_num_params, _var_num) \
0038 ((STACK_FRAME_PARAM(_num_params)) + ((_var_num)*8))
0039
0040 #else
0041 #define STACK_FRAME_MIN_SIZE 112
0042 #define STACK_FRAME_TOC_POS 40
0043 #define __STACK_FRAME_PARAM(i) (48 + ((i)*8))
0044
0045
0046
0047
0048
0049 #define __STACK_FRAME_LOCAL(_num_params, _var_num) \
0050 (112 + ((_var_num)*8))
0051
0052
0053 #endif
0054
0055
0056 #define STACK_FRAME_LR_POS 16
0057 #define STACK_FRAME_CR_POS 8
0058
0059 #else
0060
0061 #define STACK_FRAME_MIN_SIZE 16
0062 #define STACK_FRAME_LR_POS 4
0063
0064 #define __STACK_FRAME_PARAM(_param) (STACK_FRAME_MIN_SIZE + ((_param)*4))
0065 #define __STACK_FRAME_LOCAL(_num_params, _var_num) \
0066 ((STACK_FRAME_PARAM(_num_params)) + ((_var_num)*4))
0067
0068 #endif
0069
0070
0071 #define STACK_FRAME_PARAM(var) __STACK_FRAME_PARAM(var)
0072
0073
0074 #define STACK_FRAME_LOCAL(num_params, var) \
0075 __STACK_FRAME_LOCAL(num_params, var)
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087 #define PUSH_BASIC_STACK(_extra) \
0088 mflr r0; \
0089 PPC_STL r0, STACK_FRAME_LR_POS(%r1); \
0090 PPC_STLU %r1, -(((_extra + 15) & ~15) + STACK_FRAME_MIN_SIZE)(%r1);
0091
0092 #define POP_BASIC_STACK(_extra) \
0093 addi %r1, %r1, (((_extra + 15) & ~15) + STACK_FRAME_MIN_SIZE); \
0094 PPC_LL r0, STACK_FRAME_LR_POS(%r1); \
0095 mtlr r0;
0096
0097 .macro OP_REGS op, reg_width, start_reg, end_reg, base_reg, base_reg_offset=0, skip=0
0098 .set i, \start_reg
0099 .rept (\end_reg - \start_reg + 1)
0100 \op i, (\reg_width * (i - \skip) + \base_reg_offset)(\base_reg)
0101 .set i, i + 1
0102 .endr
0103 .endm
0104
0105 #endif