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