blob: 46797adc0ddd4991b4a9e0cdcccd8f4c08cbf5cc [file] [edit]
/* 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 */