gzio: Optimize by removing division.
This commit is contained in:
parent
67a6a9512a
commit
7ba066419a
1 changed files with 17 additions and 1 deletions
|
@ -1161,6 +1161,19 @@ grub_gzio_open (grub_file_t io, const char *name __attribute__ ((unused)))
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_uint8_t
|
||||||
|
mod_31 (grub_uint16_t v)
|
||||||
|
{
|
||||||
|
/* At most 2 iterations for any number that
|
||||||
|
we can get here.
|
||||||
|
In any case faster than real division. */
|
||||||
|
while (v > 0x1f)
|
||||||
|
v = (v & 0x1f) + (v >> 5);
|
||||||
|
if (v == 0x1f)
|
||||||
|
return 0;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
test_zlib_header (grub_gzio_t gzio)
|
test_zlib_header (grub_gzio_t gzio)
|
||||||
{
|
{
|
||||||
|
@ -1178,7 +1191,10 @@ test_zlib_header (grub_gzio_t gzio)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cmf * 256U + flg) % 31U)
|
/* Usually it would be: (cmf * 256 + flg) % 31 != 0. */
|
||||||
|
/* But 256 == 8 (31). */
|
||||||
|
/* By multiplying by 4 and using 32 == 1 (31). We get our formula. */
|
||||||
|
if (mod_31 (cmf + flg * 4) != 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, N_("unsupported gzip format"));
|
grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, N_("unsupported gzip format"));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue