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