xen/vpci: Improve code generation in mask_write()

The use of __clear_bit() forces dmask to be spilled to the stack, and
interferes with the compiler heuristcs for some upcoming improvements to the
ffs() code generation.

First, shrink dmask to just the active vectors by making out the upper bits.
This replaces the "i < msi->vectors" part of the loop condition.

Next, use a simple while() loop with "clear bottom bit" expressed in plane C,
which affords the optimiser a far better understanding of what the loop is
doing.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
Andrew Cooper committed 2024-03-19 18:29:37 +00:00
1 parent 131892e0dc
commit 188fa82305
1 file changed
+6 -4
+6 -4
View File
@@ -169,13 +169,15 @@ static void cf_check mask_write(
if ( msi->enabled )
{
unsigned int i;
/* Skip changes to vectors which aren't enabled. */
dmask &= (~0U >> (32 - msi->vectors));
for ( i = ffs(dmask) - 1; dmask && i < msi->vectors;
i = ffs(dmask) - 1 )
while ( dmask )
{
unsigned int i = ffs(dmask) - 1;
vpci_msi_arch_mask(msi, pdev, i, (val >> i) & 1);
__clear_bit(i, &dmask);
dmask &= (dmask - 1);
}
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.