diff options
Diffstat (limited to 'dynasm/dasm_ppc.h')
-rw-r--r-- | dynasm/dasm_ppc.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/dynasm/dasm_ppc.h b/dynasm/dasm_ppc.h index 699d5c31..6e7cc7ab 100644 --- a/dynasm/dasm_ppc.h +++ b/dynasm/dasm_ppc.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** DynASM PPC encoding engine. | 2 | ** DynASM PPC/PPC64 encoding engine. |
3 | ** Copyright (C) 2005-2020 Mike Pall. All rights reserved. | 3 | ** Copyright (C) 2005-2020 Mike Pall. All rights reserved. |
4 | ** Released under the MIT license. See dynasm.lua for full copyright notice. | 4 | ** Released under the MIT license. See dynasm.lua for full copyright notice. |
5 | */ | 5 | */ |
@@ -21,7 +21,7 @@ enum { | |||
21 | /* The following actions need a buffer position. */ | 21 | /* The following actions need a buffer position. */ |
22 | DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, | 22 | DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, |
23 | /* The following actions also have an argument. */ | 23 | /* The following actions also have an argument. */ |
24 | DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, | 24 | DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMSH, |
25 | DASM__MAX | 25 | DASM__MAX |
26 | }; | 26 | }; |
27 | 27 | ||
@@ -244,6 +244,10 @@ void dasm_put(Dst_DECL, int start, ...) | |||
244 | #endif | 244 | #endif |
245 | b[pos++] = n; | 245 | b[pos++] = n; |
246 | break; | 246 | break; |
247 | case DASM_IMMSH: | ||
248 | CK((n >> 6) == 0, RANGE_I); | ||
249 | b[pos++] = n; | ||
250 | break; | ||
247 | } | 251 | } |
248 | } | 252 | } |
249 | } | 253 | } |
@@ -299,7 +303,7 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
299 | case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; | 303 | case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; |
300 | case DASM_REL_LG: case DASM_REL_PC: pos++; break; | 304 | case DASM_REL_LG: case DASM_REL_PC: pos++; break; |
301 | case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; | 305 | case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; |
302 | case DASM_IMM: pos++; break; | 306 | case DASM_IMM: case DASM_IMMSH: pos++; break; |
303 | } | 307 | } |
304 | } | 308 | } |
305 | stop: (void)0; | 309 | stop: (void)0; |
@@ -367,6 +371,9 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
367 | case DASM_IMM: | 371 | case DASM_IMM: |
368 | cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); | 372 | cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); |
369 | break; | 373 | break; |
374 | case DASM_IMMSH: | ||
375 | cp[-1] |= (ins & 1) ? ((n&31)<<11)|((n&32)>>4) : ((n&31)<<6)|(n&32); | ||
376 | break; | ||
370 | default: *cp++ = ins; break; | 377 | default: *cp++ = ins; break; |
371 | } | 378 | } |
372 | } | 379 | } |