| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* Copyright 1996-2024 The NASM Authors - All Rights Reserved */ |
| |
| /* |
| * disp8.h header file for disp8.c |
| */ |
| |
| #ifndef NASM_DISP8_H |
| #define NASM_DISP8_H |
| |
| #include "nasm.h" |
| |
| /* |
| * Find shift value for compressed displacement (disp8 << shift) |
| */ |
| static inline unsigned int get_disp8_shift(const insn *ins) |
| { |
| bool evex_b; |
| unsigned int evex_w; |
| unsigned int vectlen; |
| enum ttypes tuple = ins->evex_tuple; |
| |
| if (likely(!tuple)) |
| return 0; |
| |
| evex_b = !!(ins->evex & EVEX_B); |
| evex_w = !!(ins->evex & EVEX_W); |
| /* XXX: consider RC/SAE here?! */ |
| vectlen = getfield(EVEX_LL, ins->evex); |
| |
| switch (tuple) { |
| /* Full, half vector unless broadcast */ |
| case FV: |
| return evex_b ? 2 + evex_w : vectlen + 4; |
| case HV: |
| return evex_b ? 2 + evex_w : vectlen + 3; |
| |
| /* Full vector length */ |
| case FVM: |
| return vectlen + 4; |
| |
| /* Fixed tuple lengths */ |
| case T1S8: |
| return 0; |
| case T1S16: |
| return 1; |
| case T1F32: |
| return 2; |
| case T1F64: |
| return 3; |
| case M128: |
| return 4; |
| |
| /* One scalar */ |
| case T1S: |
| return 2 + evex_w; |
| |
| /* 2, 4, 8 32/64-bit elements */ |
| case T2: |
| return 3 + evex_w; |
| case T4: |
| return 4 + evex_w; |
| case T8: |
| return 5 + evex_w; |
| |
| /* Half, quarter, eigth mem */ |
| case HVM: |
| return vectlen + 3; |
| case QVM: |
| return vectlen + 2; |
| case OVM: |
| return vectlen + 1; |
| |
| /* MOVDDUP */ |
| case DUP: |
| /* |
| * 128-bit vector case doesn't follow the same formula as 256- and |
| * 512-bit vectors. |
| */ |
| if (!vectlen) |
| return 3; |
| return vectlen + 4; |
| |
| default: |
| return 0; |
| } |
| } |
| |
| #endif /* NASM_DISP8_H */ |