mirror of
https://github.com/netwide-assembler/nasm
synced 2026-08-26 16:23:04 -04:00
MOVDDUP tuple type uses a compression shift for the disp8 addressing scheme. The shift depends on the vector lenght and is defined as 8 for 128 bits, 32 for 256 bits and 64 for 512 bits. Current implementation doesn't work for the 128 bit vector case since the expression used evaluates to 16 instead of 8. Fix it with a special if check before the current expression is returned. Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
/* 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 */
|