From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web08.4100.1650329488560202508 for ; Mon, 18 Apr 2022 17:51:29 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=Qd5MtIin; spf=pass (domain: intel.com, ip: 134.134.136.31, mailfrom: jiewen.yao@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650329488; x=1681865488; h=from:to:subject:date:message-id:references:in-reply-to: content-transfer-encoding:mime-version; bh=CXLlMCyXCrvAtPPxkDI785ZeWYnxvR/MAPjphAb1fm0=; b=Qd5MtIinLHb696HGfNMWQtMuEza0IWCq3/weQLEIv9CGNweb62sIsFIr Xe0gUjPvsuA+0zDRBJWfRRdn1eHeOBZIlynARTlbRL9FKWcs32TBIqc21 jjA+iDsvYDU9J0faF0pyVudfq1xQMRf2isPdKUAmUflwrYe74FLpFP5KU kU4Fg9+7KlmnJWwvnEcCaqEVXf+81gcMkDSQSsv7RVrtd4xWJHHmkmaHf Rjgrwvyv74w+CWiO4dPJ+TuRqeC9luMUMSplNbOtvqMUxEa5BP8Jbbxj3 5jbFleITzx4FdB5MeY4km5ZOE2DvM187IGu+PHZi0p1djhVRW5u5SvbOX Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10321"; a="324085090" X-IronPort-AV: E=Sophos;i="5.90,271,1643702400"; d="scan'208";a="324085090" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Apr 2022 17:51:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,271,1643702400"; d="scan'208";a="509937976" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by orsmga003.jf.intel.com with ESMTP; 18 Apr 2022 17:51:27 -0700 Received: from orsmsx608.amr.corp.intel.com (10.22.229.21) by ORSMSX601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.27; Mon, 18 Apr 2022 17:51:27 -0700 Received: from orsmsx603.amr.corp.intel.com (10.22.229.16) by ORSMSX608.amr.corp.intel.com (10.22.229.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.27; Mon, 18 Apr 2022 17:51:27 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.27 via Frontend Transport; Mon, 18 Apr 2022 17:51:27 -0700 Received: from NAM04-BN8-obe.outbound.protection.outlook.com (104.47.74.42) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2308.27; Mon, 18 Apr 2022 17:51:27 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=I6sYGPBS9ZGWppXJ45V7r9N1Lw1+0/1+YrH1IV44QA/pS8K+81AGNuknr+qq6XRAc/oqX6+DE42LnakyDqMzk7BvIMb7eA6muX2F3RI4TV19HjnM4TcYUMuL/bzSYJKBXYqxQQ73O7vKGbu4OYODqqsyuwzLIpyfwvnzil3M55A4WGOh7NeyRF057k8Xam7C5DqFLCvcFImdCZjtlowIOztHkPDLOpO1sscS0BkkRUDyCzKBB7TMj8pARpttIvuWUaNWH0eVJCLbLTjwIquZd6tgeS5g4aVAQTtvz4rm5PwbqEUkJfe1D0F+iYHs+4MuiR0/LPMi2dIyHR1DOMTPJQ== 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=3BJy10L7WJJUM1A2qrLtnfQo7RezRqsq10GR3p1fMsU=; b=FQWNPTquxTHXhOn3Ie5veI3RCNf8iJ8JlqzXjtYY56v8AbLCQFR1uBjdy560RQs/JrPVQjoipIeNRWWNbG9BByxtkiaol8ODVAiRSDXuNxthMey/TEAaKIY5UhMlvYsxsgCRGk1V+55ZL/s8MYF7LQ1Wjg3qy6oqOHUBUeZWJ9/vHPRCSVZ8NyjsxVVXYvWh6p8lZPKwkkJCWhwpDgG5aLFlyeAlqNC/SV+o5YSFZpb2Gqjg9rf7rp2AdByhm53F/DwAsUjCNuomRK2A5ZiFYhoWPrNxQumd8WiE+jbiCQA88jbOlpF0ado0isMl1NZGrqoKogA1IbUvn2Lj9JaLZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from MW4PR11MB5872.namprd11.prod.outlook.com (2603:10b6:303:169::14) by MWHPR1101MB2286.namprd11.prod.outlook.com (2603:10b6:301:5b::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5164.20; Tue, 19 Apr 2022 00:51:24 +0000 Received: from MW4PR11MB5872.namprd11.prod.outlook.com ([fe80::198e:ea23:c83b:b93a]) by MW4PR11MB5872.namprd11.prod.outlook.com ([fe80::198e:ea23:c83b:b93a%4]) with mapi id 15.20.5164.025; Tue, 19 Apr 2022 00:51:24 +0000 From: "Yao, Jiewen" To: "devel@edk2.groups.io" , "Li, Yi1" Subject: Re: [edk2-devel] [PATCH 1/4] CryptoPkg: Add instrinsics to support building ECC on IA32 windows Thread-Topic: [edk2-devel] [PATCH 1/4] CryptoPkg: Add instrinsics to support building ECC on IA32 windows Thread-Index: AQHYUyTMZDSdSetm/E+bZ2YmsWk5Eaz2aFIw Date: Tue, 19 Apr 2022 00:51:24 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.6.401.20 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 4f3684ab-e4d5-4c8e-d344-08da219eba58 x-ms-traffictypediagnostic: MWHPR1101MB2286:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: BZRYMWnnBeQRzr9tRqhgFam+4LpvFpzVhWJkQAb26VggKll2H542dPizWHYNzGQq9oH4Oj4Su4rf1CLGP84Pvi5T5GGvMzbgRDVyFmpoKjzJfyjIlgtF0TSgDWVqqFGkSMbrM5ADy/rsMvbNw3JpEDqImC0pxnGGWh7VDn2z9pRVSl7mhPQ+dc6BP1saP0pz4TB1BPFuHV/J3GZjg11CaO8VPtmNaU+srZYi6LHFeU8CBOHhhfXy/xeqP8qgfydVH2xh9wsn+5c8YmVUZpoyAR+51s+LslpX1f+3kqO39Uq2lfMz+j2HGFxRvJmRhF+whWNU5y/qSwEYWfixAE0MAnUX93kfYEWT3PNvU2d6qAf2++2hPhjfubOiImQksjvP1dd53KmTiNyHRgEKPe+DmTAUEC9IYh7gyqa3ELIuYLCnOaUX8kxvsDjObdXvPTthv3OcokUAVraqsmldsVknTK+WX3r6rW6ULAjwlxWIrfVf002X8CNoHY0ulbOZdMrHBfFipfNoBxLxHcwFWj2gIFXugaakZiLw4GzmLFxhqXqJnihM7zmk39danq5ROw2sCeoItHww9nedAKDHd/bas5KgCmgaoIpwBuuzTIFbWQou9mf9Vq0mYjo+I5loGIiEIeLfOycM3a9t7yaGWtby7i7Ixjd4Jv7S+xvGNd5HT7rqSs8BKPDwC5hfpio6a6gchd6Q81JrLxVApZ5tWpLQdaRZ0fou+ZohUslMUWZuqqoKAe5If8K77yBTSwoaUwyGixcpZb1rYhKnAdOxmMqsF68E8wURxuLFSyVWw81QBtq/ZOkrEVqrWJJKulR2AYfs4K6IydPYTaa2KLiDT5spbA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW4PR11MB5872.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(83380400001)(5660300002)(122000001)(52536014)(110136005)(82960400001)(71200400001)(8936002)(9686003)(6636002)(316002)(19627235002)(86362001)(53546011)(6506007)(7696005)(26005)(66446008)(64756008)(8676002)(66476007)(38100700002)(186003)(38070700005)(508600001)(45080400002)(966005)(55016003)(66946007)(33656002)(66556008)(2906002)(76116006);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?FrfEZmi5Nv4UaW9IgqNl5zsS3qjrUacyBolPb+YyMdDv1ipWRCRc56LMwUN7?= =?us-ascii?Q?rH9NC/Xe0sVgbeNecJuAuaJaNjaZTECDwszfVdXAOgr0OboXNj8Ab+L6Wgtx?= =?us-ascii?Q?j12wAnFn2Jtdb6YubawLBBUiUAhtDbom15/WO7+2K87yL+D5d/BIvly6afXP?= =?us-ascii?Q?0gl58YRcHS4C+ykxic2N56XM7s1s939ZGksPWytgxvg2bhF2651PWZeJHecM?= =?us-ascii?Q?h5gJTwy5J2S6irXnxwKO6IYQKHUHOflnT0Pe1lRULkmzsSeB92RMgFxnlbGW?= =?us-ascii?Q?NRD4fm8jmQ5VWrT6hAN5mCAy2rW3vEW6ZQJMutISZ+4SjI+Xzgg3QohLrq69?= =?us-ascii?Q?rNLUoYlie7u2nkZ19V2bMqr1499H1vjjDocrOKNG7KrghBEzYsvy6jHy6OcR?= =?us-ascii?Q?5UxrtCfUPnjNwMm+wogIoYPkiokLOAPkU0DvESuSn+6PNAS965Db/aIrJVjC?= =?us-ascii?Q?ETQNQf7+fg6lmsFDCUgPoXDvPMXtmVyHjfE5LuYKZDPCA64xn83joMhHSeF4?= =?us-ascii?Q?dGvWs/osxoRaARauHW3Tf31QoPWY1hEE7Kagln9zprX192R9AFv3R4ssn8eY?= =?us-ascii?Q?zmE0BneV8LE3IXDVlYmmzFAHPG0ONyeyHK2c770t8jk85+YVvibNt8viDaJv?= =?us-ascii?Q?FYMGDO9xVOIP//OXWpaZlRGLNTwIKXWb5eaGZdx9ZAhn7Nd+FmxHWXDOqklc?= =?us-ascii?Q?oRBtxBxUk3pujRe4NF+JF0Bg196dRzE6rYgiyv3MnNML7ZU1SGTgRwBZVQ+l?= =?us-ascii?Q?YoJDtXzhLuXkyNIVn9A8/PN8UnqJxeC7u7Y2yGGsxr76iFH1PMXhE4DxAlMz?= =?us-ascii?Q?WCzZqdNFLe4md3rF3+KXUoyLkQUMN+q/WcgOIIw8PlJ1H6u1J38B0yMVDRn2?= =?us-ascii?Q?czYsLbZ8iQtnYypdm9uHzxJAWQk/u6odGS20Zfisfgvuarzm/W2UDBsy/2Kj?= =?us-ascii?Q?aqsBWzZ+xOqU6gHohxAPlozrFWMTS690+dS0peO66xyuwjIvP/kQxzv84jGZ?= =?us-ascii?Q?k1+rDzJCsJQ1R/kVij7uEIRk9HVeQjpJoIYKy/oLGmGVv2lSI42o6jCFRkUN?= =?us-ascii?Q?WLUPcAXY8AmPhAP+iJ3z9tFBPKMiWZK/yj0bQ9PWAlvAnTYedfNtnngKeaak?= =?us-ascii?Q?jBRm+iOK3GPbsgOzpBKs4Z1SjvQpNdcibYLSURZFdKTnEoOapEkfSROKMuZW?= =?us-ascii?Q?/Ao0vm858RsImvkmRTHZAPfUZ2j37sjsfELDIR64fi+QrhYC4l7U3kfOxoba?= =?us-ascii?Q?k3Q7nptTJ4xb8Jux6j5qOiALzbEkMkEwivsios3yPOytNRl1INvwFdIE4B30?= =?us-ascii?Q?YIzPRlJQz1T+d9B1zzQjq+SfH+/xQg9sBZ2HmssZtEhVDtzZd4vHkk3ngLHj?= =?us-ascii?Q?991ym0mmN6Z1nXx86aWOEdzSmR272uu6mHqHOcGF6FZRwVlm6Gl9llr7UWys?= =?us-ascii?Q?IhmVfDjkHneeODoiB8Spm/5CqOkU7MzkZ1LLWz5mBhnD2LrIaDQfc81gnnMI?= =?us-ascii?Q?UrSQoQI3QekNqCkZ/V/C8oblR5VNfcYq61xMyj+w6oT0nU3DviNDWznHD4c+?= =?us-ascii?Q?x+ctyKjT0rZ9azlx3rI5inlRUsE7LiGaUSGskB0Xp5bOSYm4WAv8dDOKe45I?= =?us-ascii?Q?cIFWVS88pjjeWm00tjUgAtxHxnoaEPt2udz74lRooOBrfz8TD5x6pKrLLa7j?= =?us-ascii?Q?We3DTWLJ5jVFxyVFmShT3+hyL0AWmvDzEWHi7sYf3zLLjbRKsysIfreEG1Jx?= =?us-ascii?Q?sSX8IeZNKg=3D=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW4PR11MB5872.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f3684ab-e4d5-4c8e-d344-08da219eba58 X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Apr 2022 00:51:24.0655 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: H5cDvWIZpSt1xIuQcirATRMyuu5XuRP1H2fEfhj5Q1I3FytsbTAtWV/siJ++2LoQBpO/X6d9x377YAzuZ9LS9g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR1101MB2286 Return-Path: jiewen.yao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi I am confused. This patch set has already been merged. Why it is sent again? Have you rebased to latest tree, before you send out patch? Thank you Yao Jiewen > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of yi1 li > Sent: Monday, April 18, 2022 9:03 PM > To: devel@edk2.groups.io > Cc: Li, Yi1 > Subject: [edk2-devel] [PATCH 1/4] CryptoPkg: Add instrinsics to support b= uilding > ECC on IA32 windows >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3679 >=20 > This dependency is needed to build openssl lib with ECC ciphers > under IA32 Windows and adds implementation for _allmul and _allshr > instrinsics. >=20 > It is taken from Project Mu: > microsoft/mu_basecore@b55b341 >=20 > Signed-off-by: yi1 li > --- > .../Library/IntrinsicLib/Ia32/MathLlmul.asm | 98 +++++++++++++++++++ > .../Library/IntrinsicLib/Ia32/MathLlshr.asm | 78 +++++++++++++++ > .../Library/IntrinsicLib/IntrinsicLib.inf | 2 + > 3 files changed, 178 insertions(+) > create mode 100644 CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm > create mode 100644 CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm >=20 > diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm > b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm > new file mode 100644 > index 000000000000..341ea8a7bc0d > --- /dev/null > +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm > @@ -0,0 +1,98 @@ > +;*** > +;llmul.asm - long multiply routine > +; > +; Copyright (c) Microsoft Corporation. All rights reserved. > +; SPDX-License-Identifier: BSD-2-Clause-Patent > +; > +;Purpose: > +; Defines long multiply routine > +; Both signed and unsigned routines are the same, since multiply's > +; work out the same in 2's complement > +; creates the following routine: > +; __allmul > +; > +;Original Implemenation: MSVC 14.12.25827 > +; > +;*************************************************************** > **************** > + .686 > + .model flat,C > + .code > + > + > +;*** > +;llmul - long multiply routine > +; > +;Purpose: > +; Does a long multiply (same for signed/unsigned) > +; Parameters are not changed. > +; > +;Entry: > +; Parameters are passed on the stack: > +; 1st pushed: multiplier (QWORD) > +; 2nd pushed: multiplicand (QWORD) > +; > +;Exit: > +; EDX:EAX - product of multiplier and multiplicand > +; NOTE: parameters are removed from the stack > +; > +;Uses: > +; ECX > +; > +;Exceptions: > +; > +;*************************************************************** > **************** > +_allmul PROC NEAR > + > +A EQU [esp + 4] ; stack address of a > +B EQU [esp + 12] ; stack address of b > + > +HIGH_PART EQU [4] ; > +LOW_PART EQU [0] > + > +; > +; AHI, BHI : upper 32 bits of A and B > +; ALO, BLO : lower 32 bits of A and B > +; > +; ALO * BLO > +; ALO * BHI > +; + BLO * AHI > +; --------------------- > +; > + > + mov eax,HIGH_PART(A) > + mov ecx,HIGH_PART(B) > + or ecx,eax ;test for both high dwords zero. > + mov ecx,LOW_PART(B) > + jnz short hard ;both are zero, just mult ALO and BLO > + > + mov eax,LOW_PART(A) > + mul ecx > + > + ret 16 ; callee restores the stack > + > +hard: > + push ebx > + > +; must redefine A and B since esp has been altered > + > +A2 EQU [esp + 8] ; stack address of a > +B2 EQU [esp + 16] ; stack address of b > + > + mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO > + mov ebx,eax ;save result > + > + mov eax,LOW_PART(A2) > + mul dword ptr HIGH_PART(B2) ;ALO * BHI > + add ebx,eax ;ebx =3D ((ALO * BHI) + (AHI * BLO)) > + > + mov eax,LOW_PART(A2);ecx =3D BLO > + mul ecx ;so edx:eax =3D ALO*BLO > + add edx,ebx ;now edx has all the LO*HI stuff > + > + pop ebx > + > + ret 16 ; callee restores the stack > + > +_allmul ENDP > + > + end > diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm > b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm > new file mode 100644 > index 000000000000..ab8294580f16 > --- /dev/null > +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm > @@ -0,0 +1,78 @@ > +;*** > +;llshr.asm - long shift right > +; > +; Copyright (c) Microsoft Corporation. All rights reserved. > +; SPDX-License-Identifier: BSD-2-Clause-Patent > +; > +;Purpose: > +; define signed long shift right routine > +; __allshr > +; > +;Original Implemenation: MSVC 14.12.25827 > +; > +;*************************************************************** > **************** > + .686 > + .model flat,C > + .code > + > + > + > +;*** > +;llshr - long shift right > +; > +;Purpose: > +; Does a signed Long Shift Right > +; Shifts a long right any number of bits. > +; > +;Entry: > +; EDX:EAX - long value to be shifted > +; CL - number of bits to shift by > +; > +;Exit: > +; EDX:EAX - shifted value > +; > +;Uses: > +; CL is destroyed. > +; > +;Exceptions: > +; > +;*************************************************************** > **************** > +_allshr PROC NEAR > + > +; > +; Handle shifts of 64 bits or more (if shifting 64 bits or more, the res= ult > +; depends only on the high order bit of edx). > +; > + cmp cl,64 > + jae short RETSIGN > + > +; > +; Handle shifts of between 0 and 31 bits > +; > + cmp cl, 32 > + jae short MORE32 > + shrd eax,edx,cl > + sar edx,cl > + ret > + > +; > +; Handle shifts of between 32 and 63 bits > +; > +MORE32: > + mov eax,edx > + sar edx,31 > + and cl,31 > + sar eax,cl > + ret > + > +; > +; Return double precision 0 or -1, depending on the sign of edx > +; > +RETSIGN: > + sar edx,31 > + mov eax,edx > + ret > + > +_allshr ENDP > + > + end > diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > index fcbb93316cf7..86e74b57b109 100644 > --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > @@ -30,6 +30,8 @@ > Ia32/MathLShiftS64.c | MSFT > Ia32/MathRShiftU64.c | MSFT > Ia32/MathFtol.c | MSFT > + Ia32/MathLlmul.asm | MSFT > + Ia32/MathLlshr.asm | MSFT >=20 > Ia32/MathLShiftS64.c | INTEL > Ia32/MathRShiftU64.c | INTEL > -- > 2.33.0.windows.2 >=20 >=20 >=20 >=20 >=20