Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22037

Intel x86 0x2E/0x3E Prefix Branch Prediction actually used?

$
0
0

In the latest Intel software dev manual it describes two opcode prefixes:

Group 2 > Branch Hints    0x2E: Branch Not Taken    0x3E: Branch Taken

These allow for explicit branch prediction of Jump instructions (opcodes likeJxx)

I remember reading a couple of years ago that on x86 explicit branch prediction was essentially a no-op in the context of gccs branch prediciton intrinsics.

I am now unclear if these x86 branch hints are a new feature or whether they are essentially no-ops in practice.

Can anyone clear this up?

(That is: Does gccs branch prediction functions generate these x86 branch hints? - and do current Intel CPUs not ignore them? - and when did this happen?)

Update:

I created a quick test program:

int main(int argc, char** argv){    if (__builtin_expect(argc,0))        return 1;    if (__builtin_expect(argc == 2, 1))        return 2;    return 3;}

Disassembles to the following:

00000000004004cc <main>:  4004cc:   55                      push   %rbp  4004cd:   48 89 e5                mov    %rsp,%rbp  4004d0:   89 7d fc                mov    %edi,-0x4(%rbp)  4004d3:   48 89 75 f0             mov    %rsi,-0x10(%rbp)  4004d7:   8b 45 fc                mov    -0x4(%rbp),%eax  4004da:   48 98                   cltq     4004dc:   48 85 c0                test   %rax,%rax  4004df:   74 07                   je     4004e8 <main+0x1c>  4004e1:   b8 01 00 00 00          mov    $0x1,%eax  4004e6:   eb 1b                   jmp    400503 <main+0x37>  4004e8:   83 7d fc 02             cmpl   $0x2,-0x4(%rbp)  4004ec:   0f 94 c0                sete   %al  4004ef:   0f b6 c0                movzbl %al,%eax  4004f2:   48 85 c0                test   %rax,%rax  4004f5:   74 07                   je     4004fe <main+0x32>  4004f7:   b8 02 00 00 00          mov    $0x2,%eax  4004fc:   eb 05                   jmp    400503 <main+0x37>  4004fe:   b8 03 00 00 00          mov    $0x3,%eax  400503:   5d                      pop    %rbp  400504:   c3                      retq     400505:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)  40050c:   00 00 00   40050f:   90                      nop

I don't see 2E or 3E ? Maybe gcc has elided them for some reason?


Viewing all articles
Browse latest Browse all 22037

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>