From nobody Sat May 30 19:26:49 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1776952652203916.5786033945952; Thu, 23 Apr 2026 06:57:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wFuY2-0005e4-KC; Thu, 23 Apr 2026 09:56:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuX4-0005Wa-Kc for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:56:02 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuWt-0000cC-AH for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:55:48 -0400 Received: from h205.csg.ci.i.u-tokyo.ac.jp (h205.csg.ci.i.u-tokyo.ac.jp [133.11.54.205]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 63NDtV0M080520 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 23 Apr 2026 22:55:32 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=oydcHHZwPJ6rnQhHZzNlvgB8smp76GOsqhnu1TBs65U=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1776952532; v=1; b=SplkzpvccfgF2rrjSYeFv3wooJTOzNAiA+rJGoc4weoj85i4ugTavO44LL3zCEbR 558HrWBAGUSMkbyh2yIFXdxcWtkiB0F2EJiWK1tNk+wQJPdHn0HjzA3QHuGVJc2S SYC5pi2xbd2FF8j5NkBK+IvQm571kk+GtgHpcOpC5UuNJ04IlJCAqvoMjZmyzOse BQbdzpEAOXwS36H7Ed/j8mmmLTFBQ3NHaAOhZql3qs5VV4CfyZ2fNhJCelwoYcpn Fe6QqciMfjslERxRe5ye9iVoakDGs+H7WKgOdtCiDOcLvqv7ubEidy2dplriF5Yn VYD2V15nQYg08FSdRRVIog== From: Akihiko Odaki Date: Thu, 23 Apr 2026 22:55:21 +0900 Subject: [PATCH 1/3] audio: Avoid unsigned sample wraparound MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-audio-v1-1-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> References: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1776952654880154100 When !defined(SIGNED), nv - HALF will wrap around if nv < HALF because nv and HALF are unsigned. Fix it by casting nv to mixeng_real, which is signed. Signed-off-by: Akihiko Odaki Acked-by: Marc-Andr=C3=A9 Lureau --- audio/mixeng_template.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index bc8509e423f6..881653c44bfb 100644 --- a/audio/mixeng_template.h +++ b/audio/mixeng_template.h @@ -43,13 +43,13 @@ static inline mixeng_real glue (conv_, ET) (IN_T v) #ifdef SIGNED return nv * (2.f / ((mixeng_real)IN_MAX - IN_MIN)); #else - return (nv - HALF) * (2.f / (mixeng_real)IN_MAX); + return ((mixeng_real)nv - HALF) * (2.f / (mixeng_real)IN_MAX); #endif #else /* !RECIPROCAL */ #ifdef SIGNED return nv / (((mixeng_real)IN_MAX - IN_MIN) / 2.f); #else - return (nv - HALF) / ((mixeng_real)IN_MAX / 2.f); + return ((mixeng_real)nv - HALF) / ((mixeng_real)IN_MAX / 2.f); #endif #endif } --=20 2.53.0 From nobody Sat May 30 19:26:49 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1776952651659437.24157354461477; Thu, 23 Apr 2026 06:57:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wFuXu-0005c7-Hw; Thu, 23 Apr 2026 09:56:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuX6-0005Wf-EH for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:56:06 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuWu-0000cN-IL for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:55:49 -0400 Received: from h205.csg.ci.i.u-tokyo.ac.jp (h205.csg.ci.i.u-tokyo.ac.jp [133.11.54.205]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 63NDtV0N080520 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 23 Apr 2026 22:55:32 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=NJ8Xrq7/Gr7dXbQuNBgr3d2k02Fayw0AHQFCtvpC830=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1776952532; v=1; b=GclSL17061g855ue3rXOR6amc/B3nq3XfO9xZ8kr6JMX9tCpn0TXWlow0rLDnssP 8EyP/Ss2FR3jRoPKHTyXasb2+VOsp0yRVm+Rda3pzX9EVdMRbXfv5c25OCX0ryml 0k6A+Q85CsKD7HGr/hUXGpyKX9XU/X/4XMi9ln/4ZUtQylNxetA2OsL7ePyF6V/Q 5oHPiWRak/N5SPvMoHxcKY1L3fGGPrJAXE2oSyYtNxB7BTrDexqs01fU+oHQAGeT nM6GcVUW/ph4ehtbUFaA1JPJ7YxX0GcxA6R6H2qJUIHCidOkZDq10NQjEzbDNzk1 AAuGnMvdyYfdXsjV0mcv0g== From: Akihiko Odaki Date: Thu, 23 Apr 2026 22:55:22 +0900 Subject: [PATCH 2/3] audio: Clamp unsigned sample conversion MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-audio-v1-2-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> References: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1776952654718154100 clip_*_uint32_t() returns 0 when v =3D=3D 1.f because it computes the result as (IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) + HALF): - (v * ((mixeng_real)IN_MAX / 2.f)) + HALF =3D=3D 0x100000000.f, which does not fit in uint32_t. - (v * ((mixeng_real)IN_MAX / 2.f)) =3D=3D 0x80000000.f - ((mixeng_real)IN_MAX / 2.f) =3D=3D 0x80000000.f - (mixeng_real)IN_MAX =3D=3D 0x100000000.f because 0xffffffff cannot be represented exactly in float. - HALF =3D=3D 0x7fffffff, which is implicitly converted to 0x80000000.f. Clamp the result to avoid the overflow. Signed-off-by: Akihiko Odaki Acked-by: Marc-Andr=C3=A9 Lureau --- audio/mixeng_template.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index 881653c44bfb..5b0014bdd9af 100644 --- a/audio/mixeng_template.h +++ b/audio/mixeng_template.h @@ -65,7 +65,9 @@ static inline IN_T glue (clip_, ET) (mixeng_real v) #ifdef SIGNED return ENDIAN_CONVERT((IN_T)(v * (((mixeng_real)IN_MAX - IN_MIN) / 2.f= ))); #else - return ENDIAN_CONVERT((IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) + HALF)= ); + return ENDIAN_CONVERT(MIN((int64_t)((v * ((mixeng_real)IN_MAX / 2.f)) + + HALF), + IN_MAX)); #endif } =20 --=20 2.53.0 From nobody Sat May 30 19:26:49 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1776952627009370.7658614852868; Thu, 23 Apr 2026 06:57:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wFuXr-0005bO-9A; Thu, 23 Apr 2026 09:56:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuX4-0005Wb-Kz for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:56:02 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wFuWt-0000cF-AI for qemu-devel@nongnu.org; Thu, 23 Apr 2026 09:55:48 -0400 Received: from h205.csg.ci.i.u-tokyo.ac.jp (h205.csg.ci.i.u-tokyo.ac.jp [133.11.54.205]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 63NDtV0O080520 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 23 Apr 2026 22:55:32 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=LUD9ZuzLWd1LWP0Ys4/Osg9bdyCbmhuDYF4cvOBc8QE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1776952532; v=1; b=pq+a8bAK82rf1L8dNOlY+konlInhbzmOmh9OIngw9P8/A/NGl8jKANTryNWNlrXv i7VRHyxujS+MCkoukwzfs7DAkG8+cBFLDIpSR7QsL09mAzXC0OQiDVpIzi9BOp0i srIeE8mAVMLyQJHVw0zkk/CNGk/cTAH1RTfM5w8/48Zr+niJnKxlAePOVaCtWGpS RyPQGb35vymwCF9rYyONtLaTxNeqJwktVDdRL1/0gdr486oWDmABsj2zXmtfLVmK zunU8ue1HXum5JX9XxK4aB9UQ2iftObrlY2i+RJfoczAC5hYPILeCUL4KgyaFoqX LgWIYwcykpyJyWFZost5cA== From: Akihiko Odaki Date: Thu, 23 Apr 2026 22:55:23 +0900 Subject: [PATCH 3/3] audio: Use unsigned PCM bias MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-audio-v1-3-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> References: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260423-audio-v1-0-e1d6b65c76f9@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1776952632010154100 Clang warns for the uint32_t clip_ instantiations because HALF cannot be represented with mixeng_real: [1115/2559] Compiling C object libqemuaudio.a.p/audio_mixeng.c.o In file included from ../../qemu/audio/mixeng.c:147: ../../qemu/audio/mixeng_template.h:68:70: warning: implicit conversion from= 'unsigned int' to 'float' changes value from 2147483647 to 2147483648 [-Wi= mplicit-const-int-float-conversion] 68 | return ENDIAN_CONVERT((IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) = + HALF)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~^~~~~~ ../../qemu/audio/mixeng_template.h:31:22: note: expanded from macro 'HALF' 31 | #define HALF (IN_MAX >> 1) | ^ ../../qemu/audio/mixeng.c:146:28: note: expanded from macro 'ENDIAN_CONVERT' 146 | #define ENDIAN_CONVERT(v) (v) | ^ In file included from ../../qemu/audio/mixeng.c:152: ../../qemu/audio/mixeng_template.h:68:70: warning: implicit conversion from= 'unsigned int' to 'float' changes value from 2147483647 to 2147483648 [-Wi= mplicit-const-int-float-conversion] 68 | return ENDIAN_CONVERT((IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) = + HALF)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~^~~~~~ ../../qemu/audio/mixeng_template.h:31:22: note: expanded from macro 'HALF' 31 | #define HALF (IN_MAX >> 1) | ^ ../../qemu/audio/mixeng.c:151:36: note: expanded from macro 'ENDIAN_CONVERT' 151 | #define ENDIAN_CONVERT(v) bswap32 (v) | ~~~~~~~~~^~ /Users/person/v/qemu/include/qemu/bswap.h:10:39: note: expanded from macro = 'bswap32' 10 | #define bswap32(_x) __builtin_bswap32(_x) | ^~ 2 warnings generated. HALF is not the right value here anyway. IN_MAX is odd, so the integer sample range has two middle codes. Unsigned PCM normally uses the upper middle code as the "bias": 0x80, 0x8000, or 0x80000000. HALF is instead defined as the lower middle code: 0x7f, 0x7fff, or 0x7fffffff. Replace HALF with BIAS, defined as the upper middle code. This fixes the warnings, since the value can be exactly represented with mixeng_real. Signed-off-by: Akihiko Odaki Acked-by: Marc-Andr=C3=A9 Lureau --- audio/mixeng_template.h | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index 5b0014bdd9af..6db742188eda 100644 --- a/audio/mixeng_template.h +++ b/audio/mixeng_template.h @@ -28,7 +28,7 @@ */ =20 #ifndef SIGNED -#define HALF (IN_MAX >> 1) +#define BIAS ((IN_T)1 << (SHIFT - 1)) #endif =20 #define ET glue (ENDIAN_CONVERSION, glue (glue (glue (_, ITYPE), BSIZE), _= t)) @@ -43,13 +43,13 @@ static inline mixeng_real glue (conv_, ET) (IN_T v) #ifdef SIGNED return nv * (2.f / ((mixeng_real)IN_MAX - IN_MIN)); #else - return ((mixeng_real)nv - HALF) * (2.f / (mixeng_real)IN_MAX); + return ((mixeng_real)nv - BIAS) * (1.f / BIAS); #endif #else /* !RECIPROCAL */ #ifdef SIGNED return nv / (((mixeng_real)IN_MAX - IN_MIN) / 2.f); #else - return ((mixeng_real)nv - HALF) / ((mixeng_real)IN_MAX / 2.f); + return ((mixeng_real)nv - BIAS) / BIAS; #endif #endif } @@ -65,9 +65,7 @@ static inline IN_T glue (clip_, ET) (mixeng_real v) #ifdef SIGNED return ENDIAN_CONVERT((IN_T)(v * (((mixeng_real)IN_MAX - IN_MIN) / 2.f= ))); #else - return ENDIAN_CONVERT(MIN((int64_t)((v * ((mixeng_real)IN_MAX / 2.f)) + - HALF), - IN_MAX)); + return ENDIAN_CONVERT(MIN((int64_t)(v * BIAS) + BIAS, IN_MAX)); #endif } =20 @@ -79,7 +77,7 @@ static inline int64_t glue (conv_, ET) (IN_T v) #ifdef SIGNED return ((int64_t) nv) << (32 - SHIFT); #else - return ((int64_t) nv - HALF) << (32 - SHIFT); + return ((int64_t) nv - BIAS) << (32 - SHIFT); #endif } =20 @@ -94,7 +92,7 @@ static inline IN_T glue (clip_, ET) (int64_t v) #ifdef SIGNED return ENDIAN_CONVERT ((IN_T) (v >> (32 - SHIFT))); #else - return ENDIAN_CONVERT ((IN_T) ((v >> (32 - SHIFT)) + HALF)); + return ENDIAN_CONVERT((IN_T)((v >> (32 - SHIFT)) + BIAS)); #endif } #endif @@ -150,5 +148,5 @@ static void glue (glue (clip_, ET), _from_mono) } =20 #undef ET -#undef HALF +#undef BIAS #undef IN_T --=20 2.53.0