1ed8eb4c2Schristos /* Replace functions for the ARC relocs. 2*6881a400Schristos Copyright (C) 2015-2022 Free Software Foundation, Inc. 3ed8eb4c2Schristos 4ed8eb4c2Schristos This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and 5ed8eb4c2Schristos the GNU Binutils. 6ed8eb4c2Schristos 7ed8eb4c2Schristos GAS/GDB is free software; you can redistribute it and/or modify 8ed8eb4c2Schristos it under the terms of the GNU General Public License as published by 9ed8eb4c2Schristos the Free Software Foundation; either version 3, or (at your option) 10ed8eb4c2Schristos any later version. 11ed8eb4c2Schristos 12ed8eb4c2Schristos GAS/GDB is distributed in the hope that it will be useful, 13ed8eb4c2Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 14ed8eb4c2Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15ed8eb4c2Schristos GNU General Public License for more details. 16ed8eb4c2Schristos 17ed8eb4c2Schristos You should have received a copy of the GNU General Public License 18ed8eb4c2Schristos along with GAS or GDB; see the file COPYING3. If not, write to 19ed8eb4c2Schristos the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, 20ed8eb4c2Schristos MA 02110-1301, USA. */ 21ed8eb4c2Schristos 22ed8eb4c2Schristos /* mask = 00000000000000000000000000000000. */ 23ed8eb4c2Schristos #ifndef REPLACE_none 24ed8eb4c2Schristos #define REPLACE_none 25ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 26ed8eb4c2Schristos replace_none (unsigned insn, int value ATTRIBUTE_UNUSED) 27ed8eb4c2Schristos { 28ed8eb4c2Schristos insn = insn & ~0x00; 29ed8eb4c2Schristos 30ed8eb4c2Schristos return insn; 31ed8eb4c2Schristos } 32ed8eb4c2Schristos 33ed8eb4c2Schristos #endif /* REPLACE_none */ 34ed8eb4c2Schristos 35ed8eb4c2Schristos /* mask = 11111111. */ 36ed8eb4c2Schristos #ifndef REPLACE_bits8 37ed8eb4c2Schristos #define REPLACE_bits8 38ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 39ed8eb4c2Schristos replace_bits8 (unsigned insn, int value ATTRIBUTE_UNUSED) 40ed8eb4c2Schristos { 41ed8eb4c2Schristos insn = insn & ~0xff; 42ed8eb4c2Schristos insn |= ((value >> 0) & 0x00ff) << 0; 43ed8eb4c2Schristos 44ed8eb4c2Schristos return insn; 45ed8eb4c2Schristos } 46ed8eb4c2Schristos 47ed8eb4c2Schristos #endif /* REPLACE_bits8 */ 48ed8eb4c2Schristos 49ed8eb4c2Schristos /* mask = 1111111111111111. */ 50ed8eb4c2Schristos #ifndef REPLACE_bits16 51ed8eb4c2Schristos #define REPLACE_bits16 52ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 53ed8eb4c2Schristos replace_bits16 (unsigned insn, int value ATTRIBUTE_UNUSED) 54ed8eb4c2Schristos { 55ed8eb4c2Schristos insn = insn & ~0xffff; 56ed8eb4c2Schristos insn |= ((value >> 0) & 0xffff) << 0; 57ed8eb4c2Schristos 58ed8eb4c2Schristos return insn; 59ed8eb4c2Schristos } 60ed8eb4c2Schristos 61ed8eb4c2Schristos #endif /* REPLACE_bits16 */ 62ed8eb4c2Schristos 63ed8eb4c2Schristos /* mask = 111111111111111111111111. */ 64ed8eb4c2Schristos #ifndef REPLACE_bits24 65ed8eb4c2Schristos #define REPLACE_bits24 66ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 67ed8eb4c2Schristos replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED) 68ed8eb4c2Schristos { 69ed8eb4c2Schristos insn = insn & ~0xffffff; 70ed8eb4c2Schristos insn |= ((value >> 0) & 0xffffff) << 0; 71ed8eb4c2Schristos 72ed8eb4c2Schristos return insn; 73ed8eb4c2Schristos } 74ed8eb4c2Schristos 75ed8eb4c2Schristos #endif /* REPLACE_bits24 */ 76ed8eb4c2Schristos 77ed8eb4c2Schristos /* Special 24 bit replace for big endian. */ 78ed8eb4c2Schristos /* mask = 111111111111111111111111. */ 79ed8eb4c2Schristos #ifndef REPLACE_bits24_be 80ed8eb4c2Schristos #define REPLACE_bits24_be 81ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 82ed8eb4c2Schristos replace_bits24_be (unsigned insn, int value ATTRIBUTE_UNUSED) 83ed8eb4c2Schristos { 84ed8eb4c2Schristos insn = insn & ~0xffffff00; 85ed8eb4c2Schristos insn |= ((value >> 0) & 0xffffff) << 8; 86ed8eb4c2Schristos 87ed8eb4c2Schristos return insn; 88ed8eb4c2Schristos } 89ed8eb4c2Schristos 90ed8eb4c2Schristos #endif /* REPLACE_bits24_be */ 91ed8eb4c2Schristos 92ed8eb4c2Schristos /* mask = 11111111111111111111111111111111. */ 93ed8eb4c2Schristos #ifndef REPLACE_word32 94ed8eb4c2Schristos #define REPLACE_word32 95ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 96ed8eb4c2Schristos replace_word32 (unsigned insn, int value ATTRIBUTE_UNUSED) 97ed8eb4c2Schristos { 98ed8eb4c2Schristos insn = insn & ~0xffffffff; 99ed8eb4c2Schristos insn |= ((value >> 0) & 0xffffffff) << 0; 100ed8eb4c2Schristos 101ed8eb4c2Schristos return insn; 102ed8eb4c2Schristos } 103ed8eb4c2Schristos 104ed8eb4c2Schristos #endif /* REPLACE_word32 */ 105ed8eb4c2Schristos 106ed8eb4c2Schristos /* mask = 0000000000000000000000000000000011111111111111111111111111111111. */ 107ed8eb4c2Schristos #ifndef REPLACE_limm 108ed8eb4c2Schristos #define REPLACE_limm 109ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 110ed8eb4c2Schristos replace_limm (unsigned insn, int value ATTRIBUTE_UNUSED) 111ed8eb4c2Schristos { 112ed8eb4c2Schristos insn = insn & ~0xffffffff; 113ed8eb4c2Schristos insn |= ((value >> 0) & 0xffffffff) << 0; 114ed8eb4c2Schristos 115ed8eb4c2Schristos return insn; 116ed8eb4c2Schristos } 117ed8eb4c2Schristos 118ed8eb4c2Schristos #endif /* REPLACE_limm */ 119ed8eb4c2Schristos 120ed8eb4c2Schristos /* mask = 000000000000000011111111111111111111111111111111. */ 121ed8eb4c2Schristos #ifndef REPLACE_limms 122ed8eb4c2Schristos #define REPLACE_limms 123ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 124ed8eb4c2Schristos replace_limms (unsigned insn, int value ATTRIBUTE_UNUSED) 125ed8eb4c2Schristos { 126ed8eb4c2Schristos insn = insn & ~0xffffffff; 127ed8eb4c2Schristos insn |= ((value >> 0) & 0xffffffff) << 0; 128ed8eb4c2Schristos 129ed8eb4c2Schristos return insn; 130ed8eb4c2Schristos } 131ed8eb4c2Schristos 132ed8eb4c2Schristos #endif /* REPLACE_limms */ 133ed8eb4c2Schristos 134ed8eb4c2Schristos /* mask = 00000111111111102222222222000000. */ 135ed8eb4c2Schristos #ifndef REPLACE_disp21h 136ed8eb4c2Schristos #define REPLACE_disp21h 137ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 138ed8eb4c2Schristos replace_disp21h (unsigned insn, int value ATTRIBUTE_UNUSED) 139ed8eb4c2Schristos { 140ed8eb4c2Schristos insn = insn & ~0x7feffc0; 141ed8eb4c2Schristos insn |= ((value >> 0) & 0x03ff) << 17; 142ed8eb4c2Schristos insn |= ((value >> 10) & 0x03ff) << 6; 143ed8eb4c2Schristos 144ed8eb4c2Schristos return insn; 145ed8eb4c2Schristos } 146ed8eb4c2Schristos 147ed8eb4c2Schristos #endif /* REPLACE_disp21h */ 148ed8eb4c2Schristos 149ed8eb4c2Schristos /* mask = 00000111111111002222222222000000. */ 150ed8eb4c2Schristos #ifndef REPLACE_disp21w 151ed8eb4c2Schristos #define REPLACE_disp21w 152ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 153ed8eb4c2Schristos replace_disp21w (unsigned insn, int value ATTRIBUTE_UNUSED) 154ed8eb4c2Schristos { 155ed8eb4c2Schristos insn = insn & ~0x7fcffc0; 156ed8eb4c2Schristos insn |= ((value >> 0) & 0x01ff) << 18; 157ed8eb4c2Schristos insn |= ((value >> 9) & 0x03ff) << 6; 158ed8eb4c2Schristos 159ed8eb4c2Schristos return insn; 160ed8eb4c2Schristos } 161ed8eb4c2Schristos 162ed8eb4c2Schristos #endif /* REPLACE_disp21w */ 163ed8eb4c2Schristos 164ed8eb4c2Schristos /* mask = 00000111111111102222222222003333. */ 165ed8eb4c2Schristos #ifndef REPLACE_disp25h 166ed8eb4c2Schristos #define REPLACE_disp25h 167ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 168ed8eb4c2Schristos replace_disp25h (unsigned insn, int value ATTRIBUTE_UNUSED) 169ed8eb4c2Schristos { 170ed8eb4c2Schristos insn = insn & ~0x7feffcf; 171ed8eb4c2Schristos insn |= ((value >> 0) & 0x03ff) << 17; 172ed8eb4c2Schristos insn |= ((value >> 10) & 0x03ff) << 6; 173ed8eb4c2Schristos insn |= ((value >> 20) & 0x000f) << 0; 174ed8eb4c2Schristos 175ed8eb4c2Schristos return insn; 176ed8eb4c2Schristos } 177ed8eb4c2Schristos 178ed8eb4c2Schristos #endif /* REPLACE_disp25h */ 179ed8eb4c2Schristos 180ed8eb4c2Schristos /* mask = 00000111111111002222222222003333. */ 181ed8eb4c2Schristos #ifndef REPLACE_disp25w 182ed8eb4c2Schristos #define REPLACE_disp25w 183ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 184ed8eb4c2Schristos replace_disp25w (unsigned insn, int value ATTRIBUTE_UNUSED) 185ed8eb4c2Schristos { 186ed8eb4c2Schristos insn = insn & ~0x7fcffcf; 187ed8eb4c2Schristos insn |= ((value >> 0) & 0x01ff) << 18; 188ed8eb4c2Schristos insn |= ((value >> 9) & 0x03ff) << 6; 189ed8eb4c2Schristos insn |= ((value >> 19) & 0x000f) << 0; 190ed8eb4c2Schristos 191ed8eb4c2Schristos return insn; 192ed8eb4c2Schristos } 193ed8eb4c2Schristos 194ed8eb4c2Schristos #endif /* REPLACE_disp25w */ 195ed8eb4c2Schristos 196ed8eb4c2Schristos /* mask = 00000000000000000000000111111111. */ 197ed8eb4c2Schristos #ifndef REPLACE_disp9 198ed8eb4c2Schristos #define REPLACE_disp9 199ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 200ed8eb4c2Schristos replace_disp9 (unsigned insn, int value ATTRIBUTE_UNUSED) 201ed8eb4c2Schristos { 202ed8eb4c2Schristos insn = insn & ~0x1ff; 203ed8eb4c2Schristos insn |= ((value >> 0) & 0x01ff) << 0; 204ed8eb4c2Schristos 205ed8eb4c2Schristos return insn; 206ed8eb4c2Schristos } 207ed8eb4c2Schristos 208ed8eb4c2Schristos #endif /* REPLACE_disp9 */ 209ed8eb4c2Schristos 210ed8eb4c2Schristos /* mask = 00000000111111112000000000000000. */ 211ed8eb4c2Schristos #ifndef REPLACE_disp9ls 212ed8eb4c2Schristos #define REPLACE_disp9ls 213ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 214ed8eb4c2Schristos replace_disp9ls (unsigned insn, int value ATTRIBUTE_UNUSED) 215ed8eb4c2Schristos { 216ed8eb4c2Schristos insn = insn & ~0xff8000; 217ed8eb4c2Schristos insn |= ((value >> 0) & 0x00ff) << 16; 218ed8eb4c2Schristos insn |= ((value >> 8) & 0x0001) << 15; 219ed8eb4c2Schristos 220ed8eb4c2Schristos return insn; 221ed8eb4c2Schristos } 222ed8eb4c2Schristos 223ed8eb4c2Schristos #endif /* REPLACE_disp9ls */ 224ed8eb4c2Schristos 225ed8eb4c2Schristos /* mask = 0000000111111111. */ 226ed8eb4c2Schristos #ifndef REPLACE_disp9s 227ed8eb4c2Schristos #define REPLACE_disp9s 228ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 229ed8eb4c2Schristos replace_disp9s (unsigned insn, int value ATTRIBUTE_UNUSED) 230ed8eb4c2Schristos { 231ed8eb4c2Schristos insn = insn & ~0x1ff; 232ed8eb4c2Schristos insn |= ((value >> 0) & 0x01ff) << 0; 233ed8eb4c2Schristos 234ed8eb4c2Schristos return insn; 235ed8eb4c2Schristos } 236ed8eb4c2Schristos 237ed8eb4c2Schristos #endif /* REPLACE_disp9s */ 238ed8eb4c2Schristos 239ed8eb4c2Schristos /* mask = 0000011111111111. */ 240ed8eb4c2Schristos #ifndef REPLACE_disp13s 241ed8eb4c2Schristos #define REPLACE_disp13s 242ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 243ed8eb4c2Schristos replace_disp13s (unsigned insn, int value ATTRIBUTE_UNUSED) 244ed8eb4c2Schristos { 245ed8eb4c2Schristos insn = insn & ~0x7ff; 246ed8eb4c2Schristos insn |= ((value >> 0) & 0x07ff) << 0; 247ed8eb4c2Schristos 248ed8eb4c2Schristos return insn; 249ed8eb4c2Schristos } 250ed8eb4c2Schristos 251ed8eb4c2Schristos #endif /* REPLACE_disp13s */ 252ed8eb4c2Schristos 253ed8eb4c2Schristos /* mask = 0000022222200111. */ 254ed8eb4c2Schristos #ifndef REPLACE_disp9s1 255ed8eb4c2Schristos #define REPLACE_disp9s1 256ed8eb4c2Schristos ATTRIBUTE_UNUSED static unsigned 257ed8eb4c2Schristos replace_disp9s1 (unsigned insn, int value ATTRIBUTE_UNUSED) 258ed8eb4c2Schristos { 259ed8eb4c2Schristos insn = insn & ~0x7e7; 260ed8eb4c2Schristos insn |= ((value >> 0) & 0x0007) << 0; 261ed8eb4c2Schristos insn |= ((value >> 3) & 0x003f) << 5; 262ed8eb4c2Schristos 263ed8eb4c2Schristos return insn; 264ed8eb4c2Schristos } 265ed8eb4c2Schristos 266ed8eb4c2Schristos #endif /* REPLACE_disp9s1 */ 267699b0f92Schristos 268699b0f92Schristos /* mask = 00000000000000000000111111222222. */ 269699b0f92Schristos #ifndef REPLACE_disp12s 270699b0f92Schristos #define REPLACE_disp12s 271699b0f92Schristos ATTRIBUTE_UNUSED static unsigned 272699b0f92Schristos replace_disp12s (unsigned insn, int value ATTRIBUTE_UNUSED) 273699b0f92Schristos { 274699b0f92Schristos insn = insn & ~0xfff; 275699b0f92Schristos insn |= ((value >> 0) & 0x003f) << 6; 276699b0f92Schristos insn |= ((value >> 6) & 0x003f) << 0; 277699b0f92Schristos return insn; 278699b0f92Schristos } 279699b0f92Schristos 280699b0f92Schristos #endif /* REPLACE_disp12s */ 2817f2ac410Schristos 2827f2ac410Schristos /* mask = 0000001111111111. */ 2837f2ac410Schristos #ifndef REPLACE_jli 2847f2ac410Schristos #define REPLACE_jli 2857f2ac410Schristos ATTRIBUTE_UNUSED static unsigned 2867f2ac410Schristos replace_jli (unsigned insn, int value) 2877f2ac410Schristos { 2887f2ac410Schristos insn = insn & ~0x3ff; 2897f2ac410Schristos insn |= ((value >> 0) & 0x03ff) << 0; 2907f2ac410Schristos 2917f2ac410Schristos return insn; 2927f2ac410Schristos } 2937f2ac410Schristos 2947f2ac410Schristos #endif /* REPLACE_jli */ 295