KVM/x86: Use assembly instruction mnemonics instead of .byte streams
authorUros Bizjak <ubizjak@gmail.com>
Thu, 11 Oct 2018 17:40:44 +0000 (19:40 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Oct 2018 22:30:08 +0000 (00:30 +0200)
commit4b1e54786e4862d3110bbfb27999c2c795013007
tree9e4b56d5d8d8635c2f120318ce2bc3b46a365db0
parent5ebb272b2ea7e02911a03a893f8d922d49f9bb4a
KVM/x86: Use assembly instruction mnemonics instead of .byte streams

Recently the minimum required version of binutils was changed to 2.20,
which supports all VMX instruction mnemonics. The patch removes
all .byte #defines and uses real instruction mnemonics instead.

The compiler is now able to pass memory operand to the instruction,
so there is no need for memory clobber anymore. Also, the compiler
adds CC register clobber automatically to all extended asm clauses,
so the patch also removes explicit CC clobber.

The immediate benefit of the patch is removal of many unnecesary
register moves, resulting in 1434 saved bytes in vmx.o:

   text    data     bss     dec     hex filename
 151257   18246    8500  178003   2b753 vmx.o
 152691   18246    8500  179437   2bced vmx-old.o

Some examples of improvement include removal of unneeded moves
of %rsp to %rax in front of invept and invvpid instructions:

    a57e: b9 01 00 00 00        mov    $0x1,%ecx
    a583: 48 89 04 24           mov    %rax,(%rsp)
    a587: 48 89 e0              mov    %rsp,%rax
    a58a: 48 c7 44 24 08 00 00  movq   $0x0,0x8(%rsp)
    a591: 00 00
    a593: 66 0f 38 80 08        invept (%rax),%rcx

to:

    a45c: 48 89 04 24           mov    %rax,(%rsp)
    a460: b8 01 00 00 00        mov    $0x1,%eax
    a465: 48 c7 44 24 08 00 00  movq   $0x0,0x8(%rsp)
    a46c: 00 00
    a46e: 66 0f 38 80 04 24     invept (%rsp),%rax

and the ability to use more optimal registers and memory operands
in the instruction:

    8faa: 48 8b 44 24 28        mov    0x28(%rsp),%rax
    8faf: 4c 89 c2              mov    %r8,%rdx
    8fb2: 0f 79 d0              vmwrite %rax,%rdx

to:

    8e7c: 44 0f 79 44 24 28     vmwrite 0x28(%rsp),%r8

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/virtext.h
arch/x86/include/asm/vmx.h
arch/x86/kvm/vmx.c