From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id gBQ1Irj13WETWQAAWB0awg (envelope-from ) for ; Tue, 11 Jan 2022 16:25:12 -0500 Received: by simark.ca (Postfix, from userid 112) id 8716C1F0E7; Tue, 11 Jan 2022 16:25:12 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id B5D7A1F0E7 for ; Tue, 11 Jan 2022 16:25:11 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5B3CC393A412 for ; Tue, 11 Jan 2022 21:25:11 +0000 (GMT) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70092.outbound.protection.outlook.com [40.107.7.92]) by sourceware.org (Postfix) with ESMTPS id 267E1393A42A for ; Tue, 11 Jan 2022 21:24:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 267E1393A42A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=syrmia.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=syrmia.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=m6KEA0R38vG6uNaSWYiUS9odOOp24OuwcvZTTY1ppMF1mJnrcj20BNELcXGCngsyPt5BrvSjb7ovlVm48UGxcIPVK7lwnVX9KnXdjyI8P3JxqhtMgTDIGtwjPSh+w07SUQRa67QSeABrhGdp8RG1feTIoUGEzoqZKN1oH7hnGQNDfyzYXDU6zJggrw0R9WL0MFptteQBY3tdLpuXnvCSQwlKlLeNjyWit0LrvhSSpc4tdB5n8rQG2/y2z1u4W6PgTp5Qun5UQysYnMrKKnxhtF2vKMDE1Um1sdSBFD3NJsEDZ95zcugtijHIhkt7BCBYgFMliyAlpayeIkL16LHvRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eB+K9UCZmsPz9Dw7NKRSS8TbKkKCpmlvsG33YSnGDWY=; b=GguoxoCAtkop3RWWh/PziV8YzZrPD4nwLLuW54LcoQLH/Uq+P/mBrLcUIVTjk3Yrz8lhFDeCAWBoQnpLmf+IGo/b/2vSL/x6UUcUxpj02RuZ+FrHrkS3t0F0PLhtxj+j57LfxfyshWrdn/XHBKjd2K6+i21ULU8EwtN4D87FO3F8DCiJBz+O5HXXPlzKX7N3J4k+FV6x30P3bGEks28wA+6BffjmGsb7w8xJicRSoOs3uMpLuW9Vpx1bdapuvWpYSRfIESqDFxAGOJl1u9K9o9w5kUOLi5eNppkwEasMYpbp4J7DKheaAK203nEAS1qDEXUB1D3Hxl6U8sPsT1I6zg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=syrmia.com; dmarc=pass action=none header.from=syrmia.com; dkim=pass header.d=syrmia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syrmia.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eB+K9UCZmsPz9Dw7NKRSS8TbKkKCpmlvsG33YSnGDWY=; b=JLBcO4cr+/q2+lnMSSHx9b/cgPT8jXMlDDgFs94pItS+v4cT953gmap7eSPg/NSLKKS7uA1qVPFSZ04GXWaRXXcI1C1Zg06Q4nfH+qjDdzLGDbfUYCyOgt76hvSHSEYWvHiK3uQpnrPxbAakSafb42UVDljxi98zrSAfnlNLif8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=syrmia.com; Received: from VI1PR03MB4208.eurprd03.prod.outlook.com (2603:10a6:803:51::25) by PA4PR03MB7278.eurprd03.prod.outlook.com (2603:10a6:102:10e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4867.9; Tue, 11 Jan 2022 21:24:26 +0000 Received: from VI1PR03MB4208.eurprd03.prod.outlook.com ([fe80::cc1b:e71f:5d70:48a3]) by VI1PR03MB4208.eurprd03.prod.outlook.com ([fe80::cc1b:e71f:5d70:48a3%3]) with mapi id 15.20.4888.010; Tue, 11 Jan 2022 21:24:26 +0000 From: Dragan Mladjenovic To: gdb-patches@sourceware.org Subject: [PATCH v3 2/4] sim: Factor out NaN handling in floating point operations Date: Tue, 11 Jan 2022 22:24:04 +0100 Message-Id: <20220111212406.32312-3-Dragan.Mladjenovic@syrmia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111212406.32312-1-Dragan.Mladjenovic@syrmia.com> References: <20220111212406.32312-1-Dragan.Mladjenovic@syrmia.com> Content-Type: text/plain X-ClientProxiedBy: VI1P193CA0003.EURP193.PROD.OUTLOOK.COM (2603:10a6:800:bd::13) To VI1PR03MB4208.eurprd03.prod.outlook.com (2603:10a6:803:51::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dc451d8d-a403-4ad4-a15c-08d9d548be73 X-MS-TrafficTypeDiagnostic: PA4PR03MB7278:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1360; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HqhdV1gCLOnh3EQTW+vVorSAAa6Avii7lq+qhSkDshVkgPpOgh6q+5Kbr27qjKLBjgV1bhpZ7KC3tu3l/rFWZAVqj0syBwvEii5cZ/3wHDDcnawahw89nFiJXacRKw7AIuTQR4kFtRFFZ4CnSb+JLy9AbkGx0BdLzxuzgzRVdi1ouC8MJHw4r3l+OmZwEvvYH14BVzq6JQ/QLQ1QHI2MrRlPVy3dNpsnH5e/aASv9WczM29v55RJKQ482/Agkx1Wr6jAxHO0TbNsUCP5DeAHIqfiZcdOG/FnhopDrNbKfAS2YWrk3ejFr7NOl6QcmWGmduZhOhO5xjeFGF8SglbxF4rP4UjbTwNlNiAhhQFOfOJnGnJQWhKy2jw00cGdUOa0bkbu78iykQbuPLJ76842UIK/+/TkKSRLadH9hMs/to98N3EFxV6WDK4gwJRFzL3VoIYwbK89QC5IdiyhIGMHoPqbRhvR5J0L4g1KpH5yJqnhaybMFuKEdIYtShwCbhFURjfj9w/9iKTsPMMu3MRRPnf/FIkxEc2dQfDGkvbjBi9vVwwC49DjGRhFj8I3KvAgF2pqVvekufPCosJdLkAqHT52umWk5oDvi0Bb1NTGK1Be0uVIX/iRgGcn0qgfTszq71bKvMvURhP+vbzS7sgYZwKJXeqvTzbOGSP+hoA7shzs2qgTP8Azv9anRcA0306oifBRNhgd0AlS41a4OK3RlA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR03MB4208.eurprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(39830400003)(396003)(346002)(366004)(136003)(376002)(83380400001)(5660300002)(36756003)(4326008)(8936002)(66556008)(186003)(54906003)(1076003)(26005)(6666004)(316002)(6506007)(66946007)(86362001)(6486002)(6512007)(8676002)(2616005)(66476007)(6916009)(38100700002)(52116002)(38350700002)(508600001)(2906002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xvH8xSdQKsIBR6KyJURMtEGHxghaixtB6QSR2Vogqppyli/0SqCwGOTTntbk?= =?us-ascii?Q?aynm3Z1d3zFk5F+cu6EF2yYo0moh3gRZcshRHvBIoZcaLjD5yFqgEOXASgPZ?= =?us-ascii?Q?H7bkaMBtCnqSdMKFXWLDgIu5c2GkL8ysB7N+3Gbr8Fj7bGP+baPob0MG+Qts?= =?us-ascii?Q?0zrnezNGN2+JwNBnvoA/7r8uUlLBawaFhg4QN6vTjt7n1QVhmLWjat0MSack?= =?us-ascii?Q?edctHHHXTq0pd2WbeCu8S/Cd/h5GNe+JMY9hi6aUIamXzN3eOWF84lHpbpyu?= =?us-ascii?Q?KHVjTFVv2pMLMU/PWRxOn+76clXEeyFkPv25vDCrawyb646VQsVLHW5YyMia?= =?us-ascii?Q?N243b6srFRVkx5sHnjTnDFnrCpAcRxmL15RrxlRDp+w7VtvYd+/oA8B371rj?= =?us-ascii?Q?peNoxBzEMUOx8CtlXhINIEycTZ8DamrqUlsfCDM+b9rBCwcxc8NI+vZ1dfYC?= =?us-ascii?Q?1BWaMEBZVwU9rNUS/TTy54ghPcH8jEZjOD/8fXm4cQgHO3ihrI7sTjOHhmr1?= =?us-ascii?Q?ckm0DfrW/lSnVrSevK/hI1uer21midtYy/K2TYYl+ec8VCQqClQrXdzBx3sp?= =?us-ascii?Q?YSxcaR4LENmrIsGKJLojp5FBcQQOfE8FJuO3qrGd2jMeGd2WWxqS0u/7+M0Y?= =?us-ascii?Q?nJa9GOlbOatOhumfdAMASlefPIODiyJkGMneWQXOE4YU/oKRFej3MgWhHaw1?= =?us-ascii?Q?z3OPjfnaVKk4UkCK+uHIkE45ldHqIqPJ33T7OCuDSW3xluUCIzLD1uBj+tp7?= =?us-ascii?Q?kfQmCua5LvDzMLQDtwgW1ybax2P1yH4X/pibcROufs8uCoMZ+wTmkLj0B2MB?= =?us-ascii?Q?K5VoFeHOmugE2I4iI5KKLFAHiyfakCkk1t2Zdim3dHCSQfMFV+zTgPNgjBxY?= =?us-ascii?Q?6adUE90Xd9OEcSIf1+1GbuwkBArKHulXpyC+2kzrO39djUvi2YqluRDQfsZZ?= =?us-ascii?Q?d8KaVL49Mp0AgqTAxFXRGFXhCjisbmD24/Ooq6zi895iTXJsNlr7TG/LBrzB?= =?us-ascii?Q?eA/nRDTgqq0t4veCbAJAre30RlxNgiLStzdyP7V8wbCCyZ9vRcWyZw5FKa7S?= =?us-ascii?Q?hqF8cVfZaGpcRb6j/vkQGt4F0bStS2uEj4wjqeFMjWt6l1XyqchQme9zZwQl?= =?us-ascii?Q?pVXP+ESVT+2h131W4248z8wooNkPoIu5Au5YiOq5YkByJNt7rvYZTNV/mIc/?= =?us-ascii?Q?VN+sFpN9obLU/HY7hrSzfwIH/3NQfppGYRAfzlYwdi1F6KyvQFbCmJLsODHV?= =?us-ascii?Q?yBiyOkA/lwwWWfPCeTqpXKyv0CM/Rh+9mb7OPWubQ4iivcNXQJnQoAlYy7OE?= =?us-ascii?Q?LViJYFkEPXMMIyXZt24DwF+U0JS7/iEW9mdqXoDGv8/zOXj2EAPb9DQGrmjg?= =?us-ascii?Q?P5/wFkz/HrCyt/x/i+n7h8fgLtUCEZ1VmkhixBQTloV5L4+p6dK0tsfuTJ1r?= =?us-ascii?Q?TslBUwVnXhreZJlBwAljyhbc9Y51nIeFicS0cFQ7taGH+iKgtROvQBr6v9Cv?= =?us-ascii?Q?Li/HCcU8HMm2P6Qexw8sLtX8DeJxkodbfX4BOFmKAAj0J/hzkgVY8Z/lhTfd?= =?us-ascii?Q?VeNnYZMU0tbSYJ62BUa0seP0ZT1uHnx1RV/AtK5ie3rH6FZg8VIBrvSEuTSr?= =?us-ascii?Q?+FcbXvxOeXQ/9sUZAf7xM+mkwGEJCWE23wvd5HUT5qS2FMQ17nDn3huseiJ4?= =?us-ascii?Q?opFo+w=3D=3D?= X-OriginatorOrg: syrmia.com X-MS-Exchange-CrossTenant-Network-Message-Id: dc451d8d-a403-4ad4-a15c-08d9d548be73 X-MS-Exchange-CrossTenant-AuthSource: VI1PR03MB4208.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2022 21:24:26.0652 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 19214a73-c1ab-4e19-8f59-14bdcb09a66e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: qSKwQMf5uNn+PvZ7yizLoVgh5zGiyA7ibaF2CmiExpX6nVO6ONbKbMboELJMwsH96GSouGE/SjPh0sLfAaQoxp+oqDhPO/v4DENSv5auD3U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR03MB7278 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Chao-ying Fu , Faraz Shahbazker , "Maciej W . Rozycki" Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" From: Faraz Shahbazker 2022-01-10 Faraz Shahbazker sim/common/ChangeLog: * sim-fpu.c (sim_fpu_op_nan): New. (sim_fpu_add): Factor out NaN operand handling with a call to sim_fpu_op_nan. (sim_fpu_sub, sim_fpu_mul, sim_fpu_div): Likewise. (sim_fpu_rem, sim_fpu_max, sim_fpu_min): Likewise. * sim-fpu.h (sim_fpu_op_nan): New declaration. --- sim/common/sim-fpu.c | 189 +++++++------------------------------------ sim/common/sim-fpu.h | 7 ++ 2 files changed, 38 insertions(+), 158 deletions(-) Changes from v2: Fix Werror failures. diff --git a/sim/common/sim-fpu.c b/sim/common/sim-fpu.c index 13af3eb7477..9e6abf01391 100644 --- a/sim/common/sim-fpu.c +++ b/sim/common/sim-fpu.c @@ -986,7 +986,24 @@ sim_fpu_round_64 (sim_fpu *f, return do_round (f, 1, round, denorm); } +/* NaN handling for binary operations. */ +INLINE_SIM_FPU (int) +sim_fpu_op_nan (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) +{ + if (sim_fpu_is_snan (l) || sim_fpu_is_snan (r)) + { + *f = sim_fpu_is_snan (l) ? *l : *r; + f->class = sim_fpu_class_qnan; + return sim_fpu_status_invalid_snan; + } + ASSERT (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)); + if (sim_fpu_is_qnan (l)) + *f = *l; + else /* if (sim_fpu_is_qnan (r)) */ + *f = *r; + return 0; +} /* Arithmetic ops */ @@ -995,28 +1012,8 @@ sim_fpu_add (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_infinity (r) @@ -1144,28 +1141,8 @@ sim_fpu_sub (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_infinity (r) @@ -1298,28 +1275,8 @@ sim_fpu_mul (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_zero (r)) @@ -1423,30 +1380,8 @@ sim_fpu_div (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_infinity (r)) @@ -1556,30 +1491,8 @@ sim_fpu_rem (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { *f = sim_fpu_qnan; @@ -1639,28 +1552,8 @@ sim_fpu_max (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_infinity (r) @@ -1722,28 +1615,8 @@ sim_fpu_min (sim_fpu *f, const sim_fpu *l, const sim_fpu *r) { - if (sim_fpu_is_snan (l)) - { - *f = *l; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_snan (r)) - { - *f = *r; - f->class = sim_fpu_class_qnan; - return sim_fpu_status_invalid_snan; - } - if (sim_fpu_is_qnan (l)) - { - *f = *l; - return 0; - } - if (sim_fpu_is_qnan (r)) - { - *f = *r; - return 0; - } + if (sim_fpu_is_nan (l) || sim_fpu_is_nan (r)) + return sim_fpu_op_nan (f, l, r); if (sim_fpu_is_infinity (l)) { if (sim_fpu_is_infinity (r) diff --git a/sim/common/sim-fpu.h b/sim/common/sim-fpu.h index bcbe6ea16f2..34a56efae22 100644 --- a/sim/common/sim-fpu.h +++ b/sim/common/sim-fpu.h @@ -248,6 +248,13 @@ INLINE_SIM_FPU (int) sim_fpu_sqrt (sim_fpu *f, +/* NaN handling. */ + +INLINE_SIM_FPU (int) sim_fpu_op_nan (sim_fpu *f, + const sim_fpu *l, const sim_fpu *r); + + + /* Conversion of integer <-> floating point. */ INLINE_SIM_FPU (int) sim_fpu_i32to (sim_fpu *f, int32_t i, -- 2.17.1