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