From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56520) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNl3H-0005lF-Lm for qemu-devel@nongnu.org; Tue, 17 Feb 2015 11:31:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YNl3D-0001rZ-DD for qemu-devel@nongnu.org; Tue, 17 Feb 2015 11:31:11 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44209) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNl3D-0001rO-5e for qemu-devel@nongnu.org; Tue, 17 Feb 2015 11:31:07 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1HGV6PI009443 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 17 Feb 2015 11:31:06 -0500 From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Date: Tue, 17 Feb 2015 17:30:52 +0100 Message-Id: <1424190653-29139-4-git-send-email-rkrcmar@redhat.com> In-Reply-To: <1424190653-29139-1-git-send-email-rkrcmar@redhat.com> References: <1424190653-29139-1-git-send-email-rkrcmar@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 3/4] 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 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 --- v2: new =20 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 92f2d5025d70..94ff52a959d4 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 644b46dcddf3..1b5cffb4033b 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 dbe7412bd88c..c2250d1ba574 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 2.3.0