| /* Replace functions for the ARC relocs. | |
| Copyright (C) 2015-2025 Free Software Foundation, Inc. | |
| This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and | |
| the GNU Binutils. | |
| GAS/GDB is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3, or (at your option) | |
| any later version. | |
| GAS/GDB is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GAS or GDB; see the file COPYING3. If not, write to | |
| the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, | |
| MA 02110-1301, USA. */ | |
| /* mask = 00000000000000000000000000000000. */ | |
| #ifndef REPLACE_none | |
| #define REPLACE_none | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_none (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x00; | |
| return insn; | |
| } | |
| #endif /* REPLACE_none */ | |
| /* mask = 11111111. */ | |
| #ifndef REPLACE_bits8 | |
| #define REPLACE_bits8 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_bits8 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xff; | |
| insn |= ((value >> 0) & 0x00ff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_bits8 */ | |
| /* mask = 1111111111111111. */ | |
| #ifndef REPLACE_bits16 | |
| #define REPLACE_bits16 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_bits16 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffff; | |
| insn |= ((value >> 0) & 0xffff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_bits16 */ | |
| /* mask = 111111111111111111111111. */ | |
| #ifndef REPLACE_bits24 | |
| #define REPLACE_bits24 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffffff; | |
| insn |= ((value >> 0) & 0xffffff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_bits24 */ | |
| /* Special 24 bit replace for big endian. */ | |
| /* mask = 111111111111111111111111. */ | |
| #ifndef REPLACE_bits24_be | |
| #define REPLACE_bits24_be | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_bits24_be (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffffff00; | |
| insn |= ((value >> 0) & 0xffffff) << 8; | |
| return insn; | |
| } | |
| #endif /* REPLACE_bits24_be */ | |
| /* mask = 11111111111111111111111111111111. */ | |
| #ifndef REPLACE_word32 | |
| #define REPLACE_word32 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_word32 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffffffff; | |
| insn |= ((value >> 0) & 0xffffffff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_word32 */ | |
| /* mask = 0000000000000000000000000000000011111111111111111111111111111111. */ | |
| #ifndef REPLACE_limm | |
| #define REPLACE_limm | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_limm (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffffffff; | |
| insn |= ((value >> 0) & 0xffffffff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_limm */ | |
| /* mask = 000000000000000011111111111111111111111111111111. */ | |
| #ifndef REPLACE_limms | |
| #define REPLACE_limms | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_limms (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xffffffff; | |
| insn |= ((value >> 0) & 0xffffffff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_limms */ | |
| /* mask = 00000111111111102222222222000000. */ | |
| #ifndef REPLACE_disp21h | |
| #define REPLACE_disp21h | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp21h (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7feffc0; | |
| insn |= ((value >> 0) & 0x03ff) << 17; | |
| insn |= ((value >> 10) & 0x03ff) << 6; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp21h */ | |
| /* mask = 00000111111111002222222222000000. */ | |
| #ifndef REPLACE_disp21w | |
| #define REPLACE_disp21w | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp21w (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7fcffc0; | |
| insn |= ((value >> 0) & 0x01ff) << 18; | |
| insn |= ((value >> 9) & 0x03ff) << 6; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp21w */ | |
| /* mask = 00000111111111102222222222003333. */ | |
| #ifndef REPLACE_disp25h | |
| #define REPLACE_disp25h | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp25h (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7feffcf; | |
| insn |= ((value >> 0) & 0x03ff) << 17; | |
| insn |= ((value >> 10) & 0x03ff) << 6; | |
| insn |= ((value >> 20) & 0x000f) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp25h */ | |
| /* mask = 00000111111111002222222222003333. */ | |
| #ifndef REPLACE_disp25w | |
| #define REPLACE_disp25w | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp25w (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7fcffcf; | |
| insn |= ((value >> 0) & 0x01ff) << 18; | |
| insn |= ((value >> 9) & 0x03ff) << 6; | |
| insn |= ((value >> 19) & 0x000f) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp25w */ | |
| /* mask = 00000000000000000000000111111111. */ | |
| #ifndef REPLACE_disp9 | |
| #define REPLACE_disp9 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp9 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x1ff; | |
| insn |= ((value >> 0) & 0x01ff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp9 */ | |
| /* mask = 00000000111111112000000000000000. */ | |
| #ifndef REPLACE_disp9ls | |
| #define REPLACE_disp9ls | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp9ls (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xff8000; | |
| insn |= ((value >> 0) & 0x00ff) << 16; | |
| insn |= ((value >> 8) & 0x0001) << 15; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp9ls */ | |
| /* mask = 0000000111111111. */ | |
| #ifndef REPLACE_disp9s | |
| #define REPLACE_disp9s | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp9s (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x1ff; | |
| insn |= ((value >> 0) & 0x01ff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp9s */ | |
| /* mask = 0000011111111111. */ | |
| #ifndef REPLACE_disp13s | |
| #define REPLACE_disp13s | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp13s (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7ff; | |
| insn |= ((value >> 0) & 0x07ff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp13s */ | |
| /* mask = 0000022222200111. */ | |
| #ifndef REPLACE_disp9s1 | |
| #define REPLACE_disp9s1 | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp9s1 (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0x7e7; | |
| insn |= ((value >> 0) & 0x0007) << 0; | |
| insn |= ((value >> 3) & 0x003f) << 5; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp9s1 */ | |
| /* mask = 00000000000000000000111111222222. */ | |
| #ifndef REPLACE_disp12s | |
| #define REPLACE_disp12s | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_disp12s (unsigned insn, int value ATTRIBUTE_UNUSED) | |
| { | |
| insn = insn & ~0xfff; | |
| insn |= ((value >> 0) & 0x003f) << 6; | |
| insn |= ((value >> 6) & 0x003f) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_disp12s */ | |
| /* mask = 0000001111111111. */ | |
| #ifndef REPLACE_jli | |
| #define REPLACE_jli | |
| ATTRIBUTE_UNUSED static unsigned | |
| replace_jli (unsigned insn, int value) | |
| { | |
| insn = insn & ~0x3ff; | |
| insn |= ((value >> 0) & 0x03ff) << 0; | |
| return insn; | |
| } | |
| #endif /* REPLACE_jli */ |