x86/svm: Improve code generation from cpu_has_svm_feature()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 12 Feb 2019 18:33:30 +0000 (18:33 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 15 Mar 2019 17:53:25 +0000 (17:53 +0000)
Taking svm_feature_flags by pointer and using test_bit() results in generated
code which loads svm_feature_flags into a 32bit register, then does a bitwise
operation.

The logic can be expressed in terms of a straight bitwise operation, resulting
in the following minor improvement.

  add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-136 (-136)
  Function                                     old     new   delta
  svm_nested_features_on_efer_update           281     273      -8
  svm_create_vmcb                             1404    1388     -16
  svm_vmexit_handler                          6271    6239     -32
  start_svm                                    818     738     -80
  Total: Before=3347569, After=3347433, chg -0.00%

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
xen/include/asm-x86/hvm/svm/svm.h

index 49dca39e0b7fcc4530ebe1ea25a80debd5335a75..6e688a8e101429aa8b2587f2f213acff4aac4c4a 100644 (file)
@@ -21,7 +21,6 @@
 #define __ASM_X86_HVM_SVM_H__
 
 #include <xen/types.h>
-#include <xen/bitmap.h>
 
 #define svm_vmload(x)     svm_vmload_pa(__pa(x))
 #define svm_vmsave(x)     svm_vmsave_pa(__pa(x))
@@ -77,7 +76,7 @@ extern u32 svm_feature_flags;
 #define SVM_FEATURE_VLOADSAVE     15 /* virtual vmload/vmsave */
 #define SVM_FEATURE_VGIF          16 /* Virtual GIF */
 
-#define cpu_has_svm_feature(f) test_bit(f, &svm_feature_flags)
+#define cpu_has_svm_feature(f) (svm_feature_flags & (1u << (f)))
 #define cpu_has_svm_npt       cpu_has_svm_feature(SVM_FEATURE_NPT)
 #define cpu_has_svm_lbrv      cpu_has_svm_feature(SVM_FEATURE_LBRV)
 #define cpu_has_svm_svml      cpu_has_svm_feature(SVM_FEATURE_SVML)