From patchwork Tue Apr 18 13:45:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 55697 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7CBB63858426 for ; Tue, 18 Apr 2023 13:47:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7CBB63858426 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1681825633; bh=sVuZaD8WZ2VlrJg0hrA2RhHALyzfLToBD+URfSrbA60=; h=To:CC:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=YpW4u8uvS4aaRJyj70+D03iD8R7QIb4vLfIROLTSyHDx4IXHpAqFH3k2rzxKLg12M yjQimYYfdz1Q/gNx9KpoSCKCOx5m7ZmvXAWLEtqFaG4c7nGM6QmlpUpXq2ii4THQgt 2+Ns+07EmEE1upTZwKSAGRs2xBMOFUWzizKx2gkA= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02on2066.outbound.protection.outlook.com [40.107.247.66]) by sourceware.org (Postfix) with ESMTPS id 437ED3858D1E for ; Tue, 18 Apr 2023 13:46:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 437ED3858D1E Received: from DB7PR02CA0028.eurprd02.prod.outlook.com (2603:10a6:10:52::41) by GV2PR08MB8074.eurprd08.prod.outlook.com (2603:10a6:150:76::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 13:46:33 +0000 Received: from DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:52:cafe::f1) by DB7PR02CA0028.outlook.office365.com (2603:10a6:10:52::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 13:46:33 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT025.mail.protection.outlook.com (100.127.142.226) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 13:46:33 +0000 Received: ("Tessian outbound e13c2446394c:v136"); Tue, 18 Apr 2023 13:46:33 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 0441429ad2b94b9b X-CR-MTA-TID: 64aa7808 Received: from ee9eb71f5b8f.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 3AF46422-342B-41FA-9C05-FEB211167FA6.1; Tue, 18 Apr 2023 13:46:26 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ee9eb71f5b8f.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 18 Apr 2023 13:46:26 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k1CDKdzqiOQGDBjGWMJvVj8Q9VP8e9JKyfqgzTHWWbbIIUKILAPNDkibb2KF+hZdkacWK9V2H1OUPj9+4kxvUUTv77uT8M/fRPJrH3U3/GOz6f3II6XBtsMeW8XBENkgAzHFxMCLbCfc8xDuKb8sYmNkYr+cwtJirGvU0SnOlk4fuBf5PibDL4YqoYS7p1XhL6Bc5P8DjdR/FKVXImEgFXMUE3D7P8NZN46pw6Zqc8eQZDdWdhNrbAR0C1Fi9RSLx5yrSqmBgP3kTNDAMhQG0/F3sKMRaxEKlHihrO1urHmdeUKj5f4KkqgMZ52Z9oZhLN3q76F5gxVEV16XKKLfhw== 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=sVuZaD8WZ2VlrJg0hrA2RhHALyzfLToBD+URfSrbA60=; b=eBFORY9XVkQoazidrwfhJnbw2onOkypEFIjHY8rg32I7sy90bz7VEfgNIHzUjHPR+TuF325qWJRk0LpTL93DJFqn8QJG3cefOxTZDSUSHe9SVgFXzeNirTxnzdmhJV2f8li/+0Ksp5wvQNP7FqCuBoJFytnQVtlq7tWbNM2WdxKdQ83r2mdU0zbnCQ9SNh+PTJ6UJvKM2Pai5+vQG3fBSzjxNBzqRmVq7dWnapb4W+RRiJjPjnZ5fSfZUv00RNcWP9SuEs3t+6Ung9bTvphCu+A3EtSA9iOZ/GjBPqD7Oeo96ULcteGiDSYgWFWAvEwESmEShsFRRsXFAYbtciAlSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none Received: from AS9PR06CA0288.eurprd06.prod.outlook.com (2603:10a6:20b:45a::19) by AS8PR08MB9429.eurprd08.prod.outlook.com (2603:10a6:20b:5ef::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 13:46:24 +0000 Received: from AM7EUR03FT041.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:45a:cafe::ed) by AS9PR06CA0288.outlook.office365.com (2603:10a6:20b:45a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 13:46:24 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (40.67.248.234) by AM7EUR03FT041.mail.protection.outlook.com (100.127.140.233) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 13:46:24 +0000 Received: from AZ-NEU-EX03.Arm.com (10.251.24.31) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 18 Apr 2023 13:46:23 +0000 Received: from e129018.arm.com (10.57.54.117) by mail.arm.com (10.251.24.31) with Microsoft SMTP Server id 15.1.2507.23 via Frontend Transport; Tue, 18 Apr 2023 13:46:23 +0000 To: , , , CC: Christophe Lyon Subject: [PATCH 00/22] arm: New framework for MVE intrinsics Date: Tue, 18 Apr 2023 15:45:46 +0200 Message-ID: <20230418134608.244751-1-christophe.lyon@arm.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: AM7EUR03FT041:EE_|AS8PR08MB9429:EE_|DBAEUR03FT025:EE_|GV2PR08MB8074:EE_ X-MS-Office365-Filtering-Correlation-Id: e9090d50-3d1f-40e0-0893-08db40135250 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: VShfV6N6J3cWwClQlH6FFGWjbGIjuztgIRR+u7GDqvzdkhvvNFs/N/2FftWzv0cFRHgOgSsm7fNb52Hj6tvvtiJTASeNX+ha+oWi9TaSVn8YUmA45kKIHFcS1QJANaKgOv62oL2gKWfIwWHkfRyYSV9gtzio0ibLV8QAgn5mo5Zs170YasFcUPKq8KWvcSWCvo4Ct/AJfAoADk2sO6JM9kfIN/c/dmCeKHNdTYWPhj6cBXSCNvLEHqUv1TWMusg1GlsL0t/jksaiH+QqKKBVivGRKbRyX++mz7vWRIKTAG0gQeVEgNTKjpw8SpOHUusd46UILgvGCoUtyei48g6SqLTW4mRyJ0LYBfD4Uz6WuSZOPgnQFqt9IOb/vGqKaWDnHxqYovh1YbRQ2mUJiFLTWE3Z+bqbummWY9CDkmbxNrieHfQ5k7/UibnL3471F4yQmZoq5uIEsI9rfVsIBjI6fE+ZwHrws7uL/qIDe8nC2lY/2wOwul/TnN2/J//U1pnXZVxTFdO192lFqDZJLHf8Sfv0T2mF1X0Z5pZw6wllIh/62t5bgDuuyXXk4rF+G0EX7aaF3a4nXjPiS63vxK3zMPDoQA4/5i85OeNkBkxdmQD63MYkIc9CIgmIwKW6B7C0PdqqqgIOGqmJOXkyq5c11eOlda10L0SCF4jN7YGk+DI+VvvlplaQ9M3Naf0taSXC X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230028)(4636009)(396003)(346002)(39860400002)(136003)(376002)(451199021)(46966006)(36840700001)(336012)(83380400001)(426003)(26005)(1076003)(36756003)(86362001)(47076005)(82310400005)(186003)(356005)(2906002)(44832011)(2616005)(5660300002)(36860700001)(7696005)(6666004)(8676002)(8936002)(478600001)(81166007)(110136005)(41300700001)(82740400003)(316002)(70586007)(40480700001)(70206006)(4326008)(6636002)(36900700001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB9429 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 59d7fce0-eba8-4a8b-0f43-08db40134cf7 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dOciw5xjaYfV+OxSPO5tGJ0TFbg9wFD3pixZa2Taj3VKFuNYfTu/i513pduo+X0tyrmSrjpBG74Q2L3MND24ydeGTd0nVxlMQqe5WIi4C4jZrHk+H1PvHqo4zYwHYrmRvejN5oX91BaHCJtTL7manWZE1ACHE4K/E0tS8nxH81/6CaQIh0sPfyvlC3aBI8IEm7ELAVRi9uC0EfnqJ/2L0NUwDRDNn+ZZFiRsQeFLjpbSiiG8R8JUcyh9Ep2E10I1B/9LEBc8lZ6DQQEsB6vQYMWZfGZGAKyT/Rvkwv8yfDRcne0QouFIOnPrLaNOiBzwZFw0O3SsDJLdb8Od+/bHeogN/zdF6BCQgaM65HSzNReN/PXRj/ezVHrAXFazXwX1tgMGEwDoii2KtTlbm+OGI5Q/wWEcCtCop6rxpKvGCLTAHGdN89hEPwZs7MqcUhAzNAKGzHjgZZRVoDRLNLodlfxnL7b2YAZ61S1a0wNcCU88bfPaqiW/VAKqS/YBushylaOtpXvAGSxjdtkQbhCWCnoB/22Z0bEshwvL3Ua1ElIJOk5PhkudQG5wZSW5TxXzkVoeNdJS5KP76RZQShA8olmgQtpLKWH9q0b84T6Jl0p4You35v0uogIzhXrf6MH8t8AQhaX7ZdqdY/I2j7wLa/s6Kpho77F956qVBqYr1cLSbEDB8xJ/7QiewJZt7Fs1 X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(13230028)(4636009)(396003)(39860400002)(136003)(376002)(346002)(451199021)(46966006)(36840700001)(40470700004)(478600001)(6666004)(8936002)(8676002)(316002)(41300700001)(82740400003)(4326008)(6636002)(70586007)(70206006)(40480700001)(81166007)(110136005)(40460700003)(186003)(2906002)(1076003)(336012)(426003)(26005)(86362001)(83380400001)(36756003)(47076005)(82310400005)(2616005)(36860700001)(5660300002)(7696005)(44832011); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2023 13:46:33.2433 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e9090d50-3d1f-40e0-0893-08db40135250 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8074 X-Spam-Status: No, score=-6.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, KAM_DMARC_NONE, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Christophe Lyon via Gcc-patches From: Christophe Lyon Reply-To: Christophe Lyon Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi, This is the beginning of a long patch series to change the way Arm MVE intrinsics are implemented. The goal is to get rid of arm_mve.h, which takes a long time to parse and compile. Roughly speaking, it's about using a framework very similar to what is implemented for AArch64/SVE intrinsics. I haven't converted all the intrinsics yet, but I think it would be good to start the conversion when stage-1 reopens. * Factorizing names One of the main implementation differences I noticed between SVE and MVE is that mve.md provides only full builtin names at the moment, and makes almost no use of "parameterized names" (https://gcc.gnu.org/onlinedocs/gccint/Parameterized-Names.html#Parameterized-Names). Without this, we'd need the builtin expander to use a large switch/case of the form: switch (code) case VADDQ_S: insn_code = code_for_mve_vaddq_s (...) case VADDQ_U: insn_code = code_for_mve_vaddq_u (...) case VSUBQ_S: insn_code = code_for_mve_vsubq_s (...) case VSUBQ_U: insn_code = code_for_mve_vsubq_u (...) .... so part of the work (which I called "factorize" in the commit messages) is about replacing (define_insn "mve_vaddq_n_" with (define_insn "@mve_q_n_" with the help of a new iterator (mve_insn). Doing so makes it more obvious that some patterns are identical, except for the instruction name. I took this opportunity to merge them, so for instance I have a patch which merges add, sub and mul patterns. Although not strictly necessary for the MVE intrinsics restructuring work, this is a good opportunity to reduce such code duplication (I did notice a few bugs during that process, which led me to post a few small patches in the past months). Note that identical patterns will probably remain after the series, they can be merged later if we want. This factorization also implies the introduction of new iterators, but also means that several existing ones become useless. These patches do not remove them because it's a bit painful to reorder patches which remove lines at some "random" places, leading to merge conflicts. It's much simpler to write a big cleanup patch at the end of the serie to remove all such useless iterators at once. * Intrinsic re-implementation After intrinsic names have been factorized, the actual re-implementation patch is small: - add 1 line in each of arm-mve-builtins-base.{cc,def,h} describing the intrinsic shape/signature, types and predicates involved, RTX/unspec codes - remove the intrinsic definitions from arm_mve.h The full series of ~140 patches is organized like this: - patches 1 and 2 introduce the new framework - new implementation of vreinterpretq - new implementation of vuninitialized - patch groups of varying size, consisting in: - add a new "shape" if needed (e.g. unary, binary, ternary, ....) - add framework support functions if needed - factorize a set of intrinsics (at minimum, just make use of parameterized-names) - actual re-implementation of the intrinsics I kept patches small so the incremental progress is easy to follow and check. I'll submit the patches in small groups, this first one will make sure we agree on the implementation. Tested on arm-eabi with -mthumb/-mfloat-abi=hard/-march=armv8.1-m.main+mve. To help reviewers, I suggest to compare arm-mve-builtins.cc with aarch64-sve-builtins.cc. Christophe Lyon (22): arm: move builtin function codes into general numberspace arm: [MVE intrinsics] Add new framework arm: [MVE intrinsics] Rework vreinterpretq arm: [MVE intrinsics] Rework vuninitialized arm: [MVE intrinsics] add binary_opt_n shape arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn arm: [MVE intrinsics] factorize vadd vsubq vmulq arm: [MVE intrinsics] rework vaddq vmulq vsubq arm: [MVE intrinsics] add binary shape arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq arm: [MVE intrinsics] rework vandq veorq arm: [MVE intrinsics] add binary_orrq shape arm: [MVE intrinsics] rework vorrq arm: [MVE intrinsics] add unspec_mve_function_exact_insn arm: [MVE intrinsics] add create shape arm: [MVE intrinsics] factorize vcreateq arm: [MVE intrinsics] rework vcreateq arm: [MVE intrinsics] factorize several binary_m operations arm: [MVE intrinsics] factorize several binary _n operations arm: [MVE intrinsics] factorize several binary _m_n operations arm: [MVE intrinsics] factorize several binary operations arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq vqdmulhq vrhaddq vrmulhq gcc/config.gcc | 2 +- gcc/config/arm/arm-builtins.cc | 237 +- gcc/config/arm/arm-builtins.h | 1 + gcc/config/arm/arm-c.cc | 42 +- gcc/config/arm/arm-mve-builtins-base.cc | 163 + gcc/config/arm/arm-mve-builtins-base.def | 50 + gcc/config/arm/arm-mve-builtins-base.h | 47 + gcc/config/arm/arm-mve-builtins-functions.h | 387 + gcc/config/arm/arm-mve-builtins-shapes.cc | 529 ++ gcc/config/arm/arm-mve-builtins-shapes.h | 47 + gcc/config/arm/arm-mve-builtins.cc | 2013 ++++- gcc/config/arm/arm-mve-builtins.def | 40 +- gcc/config/arm/arm-mve-builtins.h | 672 +- gcc/config/arm/arm-protos.h | 24 + gcc/config/arm/arm.cc | 27 + gcc/config/arm/arm_mve.h | 7581 +---------------- gcc/config/arm/arm_mve_builtins.def | 6 - gcc/config/arm/arm_mve_types.h | 1430 ---- gcc/config/arm/iterators.md | 240 +- gcc/config/arm/mve.md | 1747 +--- gcc/config/arm/predicates.md | 4 + gcc/config/arm/t-arm | 32 +- gcc/config/arm/unspecs.md | 1 + gcc/config/arm/vec-common.md | 8 +- gcc/testsuite/g++.target/arm/mve.exp | 8 +- .../arm/mve/general-c++/nomve_fp_1.c | 15 + .../arm/mve/general-c++/vreinterpretq_1.C | 25 + .../gcc.target/arm/mve/general-c/nomve_fp_1.c | 15 + .../arm/mve/general-c/vreinterpretq_1.c | 25 + 29 files changed, 4926 insertions(+), 10492 deletions(-) create mode 100644 gcc/config/arm/arm-mve-builtins-base.cc create mode 100644 gcc/config/arm/arm-mve-builtins-base.def create mode 100644 gcc/config/arm/arm-mve-builtins-base.h create mode 100644 gcc/config/arm/arm-mve-builtins-functions.h create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.cc create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.h create mode 100644 gcc/testsuite/g++.target/arm/mve/general-c++/nomve_fp_1.c create mode 100644 gcc/testsuite/g++.target/arm/mve/general-c++/vreinterpretq_1.C create mode 100644 gcc/testsuite/gcc.target/arm/mve/general-c/nomve_fp_1.c create mode 100644 gcc/testsuite/gcc.target/arm/mve/general-c/vreinterpretq_1.c