Remix.run Logo
x86 prefixes and escape opcodes flowchart(soc.me)
75 points by gaul 10 hours ago | 26 comments
jxors 3 hours ago | parent | next [-]

This flowchart hides the most awful parts (IMO) of x86 prefixes: some combinations of prefixes are invalid but still parsed and executed, like combining two segment overrides, or placing a legacy prefix after a REX prefix.

The CPU also doesn't care if you use prefixes that aren't valid for a specific instruction, for example a REP on a non-repeatable instruction. The LOCK prefix is the only prefix that makes the sane choice to reject invalid combinations, rather than silently accept them.

Also, the (E)VEX prefix doesn't behave like the other prefixes: it must be placed last, and can therefore only appear once. All other prefixes can be repeated.

peterfirefly 2 hours ago | parent | next [-]

> The CPU also doesn't care if you use prefixes that aren't valid for a specific instruction, for example a REP on a non-repeatable instruction.

This is one of the reasons why the x86 could be extended so much. PAUSE is just REP NOP, for example. Segment prefixes in front of conditional branches were used as static branch prediction hints (which I believe have returned in some newer Intel CPUs). Useful if you want to make a hint on newer CPUs that is harmless on older CPUs.

Some prefixes have become part of the encoding for certain SIMD instructions, but that is a different case because those prefixes aren't hints.

vardump 3 hours ago | parent | prev [-]

I wonder whether there are some prefixes that cause (some) CPUs to execute the instruction a lot slower.

debugnik 8 hours ago | parent | prev | next [-]

This site redirects to HN when it notices HN in the referrer.

koito17 an hour ago | parent | next [-]

The fact sites do evil things with these headers is why I configure Firefox with

  network.http.referer.XOriginTrimmingPolicy
set to 2. It "breaks" sites, but often in good ways (such as the site in TFA).
bArray an hour ago | parent | prev | next [-]

Copy the URL and manually paste it into a new tab, no referrer then.

st_goliath 6 hours ago | parent | prev | next [-]

If you have JavaScript enabled, that is. JWZ at least does the redirect on the server side.

The following is pulled in from `https://soc.me/assets/js/turnBack.js`:

    const undesirables = [
      "news.ycombinator.com/",
      // "reddit.com/", // disable temporaily
      "lobste.rs/"
    ] ;

    if (undesirables.find(site => document.referrer.includes(site))) {
      window.location.replace(document.referrer);
    }
I wonder why Reddit is "temporarily not undesirable".
mechazawa 3 hours ago | parent | next [-]

Why are they undesirable though

self_awareness 42 minutes ago | parent | prev [-]

Git history doesn't explain it unfortunately

https://github.com/soc/soc.me/blame/main/assets/js/turnBack....

Although, when we inspect author's profile on lobste.rs, we'll see that he's banned:

https://lobste.rs/~soc [Banned 4 years ago by pushcx: Troll.]

Maybe he's banned from HN as well. And this 'undesirables' is a method of taking some kind of revenge.

trashb 5 hours ago | parent | prev | next [-]

This is an interesting way to prevent the hug of death. I wonder what the author's reasoning is, also would it really be effective?

debugnik 4 hours ago | parent [-]

I doubt it, the redirect is client-side, I got a flash of the page before the redirect.

philjackson 3 hours ago | parent [-]

If anything, it's going to at least double its traffic this way when people click again assuming they hit back somehow.

therein 6 hours ago | parent | prev | next [-]

Wow, I didn't even notice because I have extensions that strip the referrer header. Excellent.

chimpontherun 7 hours ago | parent | prev [-]

open in new tab

yellowapple 5 hours ago | parent [-]

That doesn't seem to clear the referrer, at least on Firefox. Gotta go a step further and outright copy/paste the URL into an already-created tab.

high_na_euv 2 hours ago | parent [-]

Open in private works

st_goliath 5 hours ago | parent | prev | next [-]

Fun little tidbit: The 0x40-0x4f range used for the REX prefix actually clashes with the single-byte encodings for increment/decrement.

When AMD designed the 64 bit extension, they had run out of available single-byte opcodes to use as a prefix and decided to re-use those. The INC/DEC instructions are still available in 64 bit mode, but not in their single-byte encodings.

TheAdamist 38 minutes ago | parent [-]

Which clever code can utilize to determine which mode its running in and branch appropriately depending if the inc/dec were executed or not.

dataflow 41 minutes ago | parent | prev | next [-]

There's EVEX2 now. It's hard to keep up...

adrian_b 4 hours ago | parent | prev | next [-]

On that page, there is a link to another interesting page on the same site:

https://soc.me/interfaces/intels-original-64bit-extensions-f...

where there are links to a couple of patents filed by Intel in 2000, about a 64-bit extension of the x86 ISA, which had been implemented in Pentium 4, but which had been nonetheless disabled and hidden from the users, in order to not compete with Itanium.

The page explains the content of the patents.

As already mentioned by another poster, at least on Firefox you have to open a tab and then copy this link there, to avoid being identified as an "undesirable" :-)

dagenix 8 hours ago | parent | prev | next [-]

https://archive.ph/ZMsnQ

tucnak 7 hours ago | parent | prev | next [-]

I respect the disobedience.

snvzz 7 hours ago | parent | prev [-]

This is in no small part why x86 code density is awful despite variable size encoding.

themafia 6 hours ago | parent [-]

Awful compared to what?

I've seen benchmarks that go both ways in terms of a "winner" but in terms of overall variance there seems to be very little. There are some cases where ARM64 or RISCV do better and there are some cases where x86_64 does better. I can't see code density being a relevant factor when picking one ISA over another.

We've got good compilers now anyways.. outside of power consumption.. the ISA wars are dead.

whobre 37 minutes ago | parent | next [-]

Compared to VAX, of course…

bell-cot 4 hours ago | parent | prev [-]

Technically, code density still matters - because both L1 cache memory and L1 instruction fetch misses are very expensive.

But as you point out, code density gets far less attention in tech circles these days. And higher-level decision makers rightfully focus on higher-level system performance metrics.