1*28b48a07SMax Filippov /* 2*28b48a07SMax Filippov * This header file contains assembly-language definitions (assembly 3*28b48a07SMax Filippov * macros, etc.) for this specific Xtensa processor's TIE extensions 4*28b48a07SMax Filippov * and options. It is customized to this Xtensa processor configuration. 5*28b48a07SMax Filippov * This file is autogenerated, please do not edit. 6*28b48a07SMax Filippov * 7*28b48a07SMax Filippov * Copyright (C) 1999-2015 Cadence Design Systems Inc. 8*28b48a07SMax Filippov * 9*28b48a07SMax Filippov * SPDX-License-Identifier: GPL-2.0+ 10*28b48a07SMax Filippov */ 11*28b48a07SMax Filippov 12*28b48a07SMax Filippov #ifndef _XTENSA_CORE_TIE_ASM_H 13*28b48a07SMax Filippov #define _XTENSA_CORE_TIE_ASM_H 14*28b48a07SMax Filippov 15*28b48a07SMax Filippov /* Selection parameter values for save-area save/restore macros: */ 16*28b48a07SMax Filippov /* Option vs. TIE: */ 17*28b48a07SMax Filippov #define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ 18*28b48a07SMax Filippov #define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ 19*28b48a07SMax Filippov #define XTHAL_SAS_ANYOT 0x0003 /* both of the above */ 20*28b48a07SMax Filippov /* Whether used automatically by compiler: */ 21*28b48a07SMax Filippov #define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ 22*28b48a07SMax Filippov #define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ 23*28b48a07SMax Filippov #define XTHAL_SAS_ANYCC 0x000C /* both of the above */ 24*28b48a07SMax Filippov /* ABI handling across function calls: */ 25*28b48a07SMax Filippov #define XTHAL_SAS_CALR 0x0010 /* caller-saved */ 26*28b48a07SMax Filippov #define XTHAL_SAS_CALE 0x0020 /* callee-saved */ 27*28b48a07SMax Filippov #define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ 28*28b48a07SMax Filippov #define XTHAL_SAS_ANYABI 0x0070 /* all of the above three */ 29*28b48a07SMax Filippov /* Misc */ 30*28b48a07SMax Filippov #define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ 31*28b48a07SMax Filippov #define XTHAL_SAS3(optie,ccuse,abi) ( ((optie) & XTHAL_SAS_ANYOT) \ 32*28b48a07SMax Filippov | ((ccuse) & XTHAL_SAS_ANYCC) \ 33*28b48a07SMax Filippov | ((abi) & XTHAL_SAS_ANYABI) ) 34*28b48a07SMax Filippov 35*28b48a07SMax Filippov 36*28b48a07SMax Filippov /* 37*28b48a07SMax Filippov * Macro to store all non-coprocessor (extra) custom TIE and optional state 38*28b48a07SMax Filippov * (not including zero-overhead loop registers). 39*28b48a07SMax Filippov * Required parameters: 40*28b48a07SMax Filippov * ptr Save area pointer address register (clobbered) 41*28b48a07SMax Filippov * (register must contain a 4 byte aligned address). 42*28b48a07SMax Filippov * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS 43*28b48a07SMax Filippov * registers are clobbered, the remaining are unused). 44*28b48a07SMax Filippov * Optional parameters: 45*28b48a07SMax Filippov * continue If macro invoked as part of a larger store sequence, set to 1 46*28b48a07SMax Filippov * if this is not the first in the sequence. Defaults to 0. 47*28b48a07SMax Filippov * ofs Offset from start of larger sequence (from value of first ptr 48*28b48a07SMax Filippov * in sequence) at which to store. Defaults to next available space 49*28b48a07SMax Filippov * (or 0 if <continue> is 0). 50*28b48a07SMax Filippov * select Select what category(ies) of registers to store, as a bitmask 51*28b48a07SMax Filippov * (see XTHAL_SAS_xxx constants). Defaults to all registers. 52*28b48a07SMax Filippov * alloc Select what category(ies) of registers to allocate; if any 53*28b48a07SMax Filippov * category is selected here that is not in <select>, space for 54*28b48a07SMax Filippov * the corresponding registers is skipped without doing any store. 55*28b48a07SMax Filippov */ 56*28b48a07SMax Filippov .macro xchal_ncp_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 57*28b48a07SMax Filippov xchal_sa_start \continue, \ofs 58*28b48a07SMax Filippov // Optional caller-saved registers used by default by the compiler: 59*28b48a07SMax Filippov .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) 60*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1016, 4, 4 61*28b48a07SMax Filippov rsr.ACCLO \at1 // MAC16 option 62*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+0 63*28b48a07SMax Filippov rsr.ACCHI \at1 // MAC16 option 64*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+4 65*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 66*28b48a07SMax Filippov .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 67*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1016, 4, 4 68*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 69*28b48a07SMax Filippov .endif 70*28b48a07SMax Filippov // Optional caller-saved registers not used by default by the compiler: 71*28b48a07SMax Filippov .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) 72*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1004, 4, 4 73*28b48a07SMax Filippov rsr.SCOMPARE1 \at1 // conditional store option 74*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+0 75*28b48a07SMax Filippov rsr.M0 \at1 // MAC16 option 76*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+4 77*28b48a07SMax Filippov rsr.M1 \at1 // MAC16 option 78*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+8 79*28b48a07SMax Filippov rsr.M2 \at1 // MAC16 option 80*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+12 81*28b48a07SMax Filippov rsr.M3 \at1 // MAC16 option 82*28b48a07SMax Filippov s32i \at1, \ptr, .Lxchal_ofs_+16 83*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 20 84*28b48a07SMax Filippov .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 85*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1004, 4, 4 86*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 20 87*28b48a07SMax Filippov .endif 88*28b48a07SMax Filippov .endm // xchal_ncp_store 89*28b48a07SMax Filippov 90*28b48a07SMax Filippov /* 91*28b48a07SMax Filippov * Macro to load all non-coprocessor (extra) custom TIE and optional state 92*28b48a07SMax Filippov * (not including zero-overhead loop registers). 93*28b48a07SMax Filippov * Required parameters: 94*28b48a07SMax Filippov * ptr Save area pointer address register (clobbered) 95*28b48a07SMax Filippov * (register must contain a 4 byte aligned address). 96*28b48a07SMax Filippov * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS 97*28b48a07SMax Filippov * registers are clobbered, the remaining are unused). 98*28b48a07SMax Filippov * Optional parameters: 99*28b48a07SMax Filippov * continue If macro invoked as part of a larger load sequence, set to 1 100*28b48a07SMax Filippov * if this is not the first in the sequence. Defaults to 0. 101*28b48a07SMax Filippov * ofs Offset from start of larger sequence (from value of first ptr 102*28b48a07SMax Filippov * in sequence) at which to load. Defaults to next available space 103*28b48a07SMax Filippov * (or 0 if <continue> is 0). 104*28b48a07SMax Filippov * select Select what category(ies) of registers to load, as a bitmask 105*28b48a07SMax Filippov * (see XTHAL_SAS_xxx constants). Defaults to all registers. 106*28b48a07SMax Filippov * alloc Select what category(ies) of registers to allocate; if any 107*28b48a07SMax Filippov * category is selected here that is not in <select>, space for 108*28b48a07SMax Filippov * the corresponding registers is skipped without doing any load. 109*28b48a07SMax Filippov */ 110*28b48a07SMax Filippov .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 111*28b48a07SMax Filippov xchal_sa_start \continue, \ofs 112*28b48a07SMax Filippov // Optional caller-saved registers used by default by the compiler: 113*28b48a07SMax Filippov .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) 114*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1016, 4, 4 115*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+0 116*28b48a07SMax Filippov wsr.ACCLO \at1 // MAC16 option 117*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+4 118*28b48a07SMax Filippov wsr.ACCHI \at1 // MAC16 option 119*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 120*28b48a07SMax Filippov .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 121*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1016, 4, 4 122*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 123*28b48a07SMax Filippov .endif 124*28b48a07SMax Filippov // Optional caller-saved registers not used by default by the compiler: 125*28b48a07SMax Filippov .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) 126*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1004, 4, 4 127*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+0 128*28b48a07SMax Filippov wsr.SCOMPARE1 \at1 // conditional store option 129*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+4 130*28b48a07SMax Filippov wsr.M0 \at1 // MAC16 option 131*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+8 132*28b48a07SMax Filippov wsr.M1 \at1 // MAC16 option 133*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+12 134*28b48a07SMax Filippov wsr.M2 \at1 // MAC16 option 135*28b48a07SMax Filippov l32i \at1, \ptr, .Lxchal_ofs_+16 136*28b48a07SMax Filippov wsr.M3 \at1 // MAC16 option 137*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 20 138*28b48a07SMax Filippov .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 139*28b48a07SMax Filippov xchal_sa_align \ptr, 0, 1004, 4, 4 140*28b48a07SMax Filippov .set .Lxchal_ofs_, .Lxchal_ofs_ + 20 141*28b48a07SMax Filippov .endif 142*28b48a07SMax Filippov .endm // xchal_ncp_load 143*28b48a07SMax Filippov 144*28b48a07SMax Filippov 145*28b48a07SMax Filippov #define XCHAL_NCP_NUM_ATMPS 1 146*28b48a07SMax Filippov 147*28b48a07SMax Filippov #define XCHAL_SA_NUM_ATMPS 1 148*28b48a07SMax Filippov 149*28b48a07SMax Filippov #endif /*_XTENSA_CORE_TIE_ASM_H*/ 150*28b48a07SMax Filippov 151