From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56967) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YTAKA-0008At-53 for qemu-devel@nongnu.org; Wed, 04 Mar 2015 09:30:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YTAK5-00047d-Pq for qemu-devel@nongnu.org; Wed, 04 Mar 2015 09:30:58 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36074) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YTAK5-00045v-Dh for qemu-devel@nongnu.org; Wed, 04 Mar 2015 09:30:53 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t24EUqc5029679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 4 Mar 2015 09:30:52 -0500 From: Gerd Hoffmann Date: Wed, 4 Mar 2015 15:30:45 +0100 Message-Id: <1425479449-11480-4-git-send-email-kraxel@redhat.com> In-Reply-To: <1425479449-11480-1-git-send-email-kraxel@redhat.com> References: <1425479449-11480-1-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 3/7] qxl: refactor rounding up to a nearest power of 2 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= From: Radim Kr=C4=8Dm=C3=A1=C5=99 We already have pow2floor, mirror it and use instead of a function with similar results (same in used domain), to clarify our intent. Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 Signed-off-by: Gerd Hoffmann --- hw/display/qxl.c | 23 +++++------------------ include/qemu-common.h | 3 +++ util/cutils.c | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 92f2d50..94ff52a 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -300,19 +300,6 @@ void qxl_spice_reset_cursor(PCIQXLDevice *qxl) qxl->ssd.cursor =3D cursor_builtin_hidden(); } =20 - -static inline uint32_t msb_mask(uint32_t val) -{ - uint32_t mask; - - do { - mask =3D ~(val - 1) & val; - val &=3D ~mask; - } while (mask < val); - - return mask; -} - static ram_addr_t qxl_rom_size(void) { uint32_t required_rom_size =3D sizeof(QXLRom) + sizeof(QXLModes) + @@ -1921,10 +1908,10 @@ static void qxl_init_ramsize(PCIQXLDevice *qxl) qxl->vram32_size =3D 4096; qxl->vram_size =3D 4096; } - qxl->vgamem_size =3D msb_mask(qxl->vgamem_size * 2 - 1); - qxl->vga.vram_size =3D msb_mask(qxl->vga.vram_size * 2 - 1); - qxl->vram32_size =3D msb_mask(qxl->vram32_size * 2 - 1); - qxl->vram_size =3D msb_mask(qxl->vram_size * 2 - 1); + qxl->vgamem_size =3D pow2ceil(qxl->vgamem_size); + qxl->vga.vram_size =3D pow2ceil(qxl->vga.vram_size); + qxl->vram32_size =3D pow2ceil(qxl->vram32_size); + qxl->vram_size =3D pow2ceil(qxl->vram_size); } =20 static int qxl_init_common(PCIQXLDevice *qxl) @@ -1956,7 +1943,7 @@ static int qxl_init_common(PCIQXLDevice *qxl) break; case 4: /* qxl-4 */ pci_device_rev =3D QXL_REVISION_STABLE_V12; - io_size =3D msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); + io_size =3D pow2ceil(QXL_IO_RANGE_SIZE); break; default: error_report("Invalid revision %d for qxl device (max %d)", diff --git a/include/qemu-common.h b/include/qemu-common.h index 644b46d..1b5cffb 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -418,6 +418,9 @@ static inline bool is_power_of_2(uint64_t value) /* round down to the nearest power of 2*/ int64_t pow2floor(int64_t value); =20 +/* round up to the nearest power of 2 (0 if overflow) */ +uint64_t pow2ceil(uint64_t value); + #include "qemu/module.h" =20 /* diff --git a/util/cutils.c b/util/cutils.c index dbe7412..c2250d1 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -483,6 +483,20 @@ int64_t pow2floor(int64_t value) return value; } =20 +/* round up to the nearest power of 2 (0 if overflow) */ +uint64_t pow2ceil(uint64_t value) +{ + uint8_t nlz =3D clz64(value); + + if (is_power_of_2(value)) { + return value; + } + if (!nlz) { + return 0; + } + return 1ULL << (64 - nlz); +} + /* * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) * Input is limited to 14-bit numbers --=20 1.8.3.1