xor %ebx, %ebx
 
 .Lclear_regs:
+       /* Discard @regs.  The register is irrelevant, it just can't be RBX. */
+       pop %_ASM_AX
+
        /*
         * Clear all general purpose registers except RSP and RBX to prevent
         * speculative use of the guest's values, even those that are reloaded
         * via the stack.  In theory, an L1 cache miss when restoring registers
         * could lead to speculative execution with the guest's values.
         * Zeroing XORs are dirt cheap, i.e. the extra paranoia is essentially
-        * free.  RSP and RAX are exempt as RSP is restored by hardware during
+        * free.  RSP and RBX are exempt as RSP is restored by hardware during
         * VM-Exit and RBX is explicitly loaded with 0 or 1 to hold the return
         * value.
         */
        xor %r15d, %r15d
 #endif
 
-       /* "POP" @regs. */
-       add $WORD_SIZE, %_ASM_SP
-
        /*
         * IMPORTANT: RSB filling and SPEC_CTRL handling must be done before
         * the first unbalanced RET after vmexit!
        FILL_RETURN_BUFFER %_ASM_CX, RSB_CLEAR_LOOPS, X86_FEATURE_RSB_VMEXIT,\
                           X86_FEATURE_RSB_VMEXIT_LITE
 
-
        pop %_ASM_ARG2  /* @flags */
        pop %_ASM_ARG1  /* @vmx */