mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 15:28:30 +00:00
Add a turfwar hilbert decoration
This commit is contained in:
parent
a6586cafb2
commit
6dcdf91458
9 changed files with 186 additions and 81 deletions
65
third_party/xed/x86ild.greg.c
vendored
65
third_party/xed/x86ild.greg.c
vendored
|
@ -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++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue