Add a turfwar hilbert decoration

This commit is contained in:
Justine Tunney 2023-01-03 18:28:35 -08:00
parent a6586cafb2
commit 6dcdf91458
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
9 changed files with 186 additions and 81 deletions

43
third_party/xed/avx.h vendored
View file

@ -1,43 +0,0 @@
#ifndef COSMOPOLITAN_THIRD_PARTY_XED_AVX_H_
#define COSMOPOLITAN_THIRD_PARTY_XED_AVX_H_
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
union XedAvxC4Payload1 {
struct {
unsigned map : 5;
unsigned b_inv : 1;
unsigned x_inv : 1;
unsigned r_inv : 1;
unsigned pad : 24;
} s;
unsigned u32;
};
union XedAvxC4Payload2 {
struct {
unsigned pp : 2;
unsigned l : 1;
unsigned vvv210 : 3;
unsigned v3 : 1;
unsigned w : 1;
unsigned pad : 24;
} s;
unsigned u32;
};
union XedAvxC5Payload {
struct {
unsigned pp : 2;
unsigned l : 1;
unsigned vvv210 : 3;
unsigned v3 : 1;
unsigned r_inv : 1;
unsigned pad : 24;
} s;
unsigned u32;
};
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_XED_AVX_H_ */

View file

@ -23,7 +23,6 @@
#include "libc/macros.internal.h"
#include "libc/runtime/runtime.h"
#include "libc/str/str.h"
#include "third_party/xed/avx.h"
#include "third_party/xed/avx512.h"
#include "third_party/xed/private.h"
#include "third_party/xed/x86.h"
@ -846,27 +845,32 @@ privileged static void xed_evex_imm_scanner(struct XedDecodedInst *d) {
}
privileged static void xed_vex_c4_scanner(struct XedDecodedInst *d) {
uint8_t n;
xed_bits_t length, max_bytes;
union XedAvxC4Payload1 c4byte1;
union XedAvxC4Payload2 c4byte2;
unsigned length, b1, b2;
if (xed_is_bound_instruction(d)) return;
length = d->length;
max_bytes = d->op.max_bytes;
length++;
if (length + 2 < max_bytes) {
c4byte1.u32 = d->bytes[length];
c4byte2.u32 = d->bytes[length + 1];
d->op.rexr = ~c4byte1.s.r_inv & 1;
d->op.rexx = ~c4byte1.s.x_inv & 1;
d->op.rexb = (xed3_mode_64b(d) & ~c4byte1.s.b_inv) & 1;
d->op.rexw = c4byte2.s.w & 1;
d->op.vexdest3 = c4byte2.s.v3;
d->op.vexdest210 = c4byte2.s.vvv210;
d->op.vl = c4byte2.s.l;
d->op.vex_prefix = kXed.vex_prefix_recoding[c4byte2.s.pp];
d->op.map = c4byte1.s.map;
if ((c4byte1.s.map & 0x3) == XED_ILD_MAP3) {
if (length + 2 < d->op.max_bytes) {
// map: 5-bit
// rex.b: 1-bit
// rex.x: 1-bit
// rex.r: 1-bit
b1 = d->bytes[length];
d->op.rexr = !(b1 & 128);
d->op.rexx = !(b1 & 64);
d->op.rexb = xed3_mode_64b(d) & !(b1 & 32);
// prefix: 2-bit → {none, osz, rep3, rep2}
// vector_length: 1-bit → {xmm, ymm}
// vexdest210: 3-bit
// vexdest3: 1-bit
// rex.w: 1-bit
b2 = d->bytes[length + 1];
d->op.rexw = !!(b2 & 128);
d->op.vexdest3 = !!(b2 & 64);
d->op.vexdest210 = (b2 >> 3) & 7;
d->op.vl = !!(b2 & 4);
d->op.vex_prefix = kXed.vex_prefix_recoding[b2 & 3];
d->op.map = b1 & 31;
if ((b1 & 3) == XED_ILD_MAP3) {
d->op.imm_width = xed_bytes2bits(1);
}
d->op.vexvalid = 1;
@ -880,19 +884,22 @@ privileged static void xed_vex_c4_scanner(struct XedDecodedInst *d) {
}
privileged static void xed_vex_c5_scanner(struct XedDecodedInst *d) {
xed_bits_t max_bytes, length;
union XedAvxC5Payload c5byte1;
unsigned length, b;
length = d->length;
max_bytes = d->op.max_bytes;
if (xed_is_bound_instruction(d)) return;
length++;
if (length + 1 < max_bytes) {
c5byte1.u32 = d->bytes[length];
d->op.rexr = ~c5byte1.s.r_inv & 1;
d->op.vexdest3 = c5byte1.s.v3;
d->op.vexdest210 = c5byte1.s.vvv210;
d->op.vl = c5byte1.s.l;
d->op.vex_prefix = kXed.vex_prefix_recoding[c5byte1.s.pp];
if (length + 1 < d->op.max_bytes) {
// prefix: 2-bit → {none, osz, rep3, rep2}
// vector_length: 1-bit → {xmm, ymm}
// vexdest210: 3-bit
// vexdest3: 1-bit
// rex.r: 1-bit
b = d->bytes[length];
d->op.rexr = !(b & 128);
d->op.vexdest3 = !!(b & 64);
d->op.vexdest210 = (b >> 3) & 7;
d->op.vl = (b >> 2) & 1;
d->op.vex_prefix = kXed.vex_prefix_recoding[b & 3];
d->op.map = XED_ILD_MAP1;
d->op.vexvalid = 1;
length++;