From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Permerror (SPF Permanent Error: Void lookup limit of 2 exceeded) identity=mailfrom; client-ip=2a01:111:f400:fe02::625; helo=eur01-db5-obe.outbound.protection.outlook.com; envelope-from=pankaj.bansal@nxp.com; receiver=edk2-devel@lists.01.org Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0625.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe02::625]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 940FA2243693C for ; Fri, 23 Feb 2018 03:10:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=utDI1P0HLQTF9BzvcpsF2+0c66I+JAYAETDAJhekI+Y=; b=h7a+xo7LUnsXkTpXliPrtCmxQdXXjZWheWM7liG2i2CPBAwKr/CnTYyc8fHdyO5Ouz2FjSee3Yscj3MfHNOCGL2X2/ThhhioIeAsgWOigsDrkF1In5AMpcQUzdhlW/1K7L+SUDheRtaLa/aRCkKaTu3Gw7WIpV6WPPDngr77ry8= Received: from AM0PR0402MB3940.eurprd04.prod.outlook.com (52.133.40.140) by AM0PR0402MB3652.eurprd04.prod.outlook.com (52.133.38.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.527.15; Fri, 23 Feb 2018 11:16:26 +0000 Received: from AM0PR0402MB3940.eurprd04.prod.outlook.com ([fe80::4815:8101:2a92:25ea]) by AM0PR0402MB3940.eurprd04.prod.outlook.com ([fe80::4815:8101:2a92:25ea%13]) with mapi id 15.20.0506.023; Fri, 23 Feb 2018 11:16:26 +0000 From: Pankaj Bansal To: "Gao, Liming" , "edk2-devel@lists.01.org" CC: "Kinney, Michael D" Thread-Topic: [RFC] MdePkg/BaseLib: Change BitField functions. Thread-Index: AQHToZVOQewKy+TSDEeGa3mFQGqLrKOsyRvwgAUfboCAAACwgA== Date: Fri, 23 Feb 2018 11:16:26 +0000 Message-ID: References: <1518173996-26906-1-git-send-email-pankaj.bansal@nxp.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E1CEF81@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E1CEF81@SHSMSX104.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.88.169.1] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM0PR0402MB3652; 7:tAeF+8rsCvNm8nW3lyIwxirBgpsrDk/krJa7zEE85sf5OlVtav299r2cJ75TEXrm4qfod26xQckIo5lNVST/PHGQQAK7t+g8qXnnzmhdmUi7czqTDwXOsV2cokBKf47J2i6nDq0nxK7BFhfHpjLqY0tetuoHUhPX6Pe/IrXIqwRlDvRv7R5ZSv3aLP4HbWPRz/cwR4TdLGLfiE9mY/eReQWTYm63LkZog/A63KSsBtZr/xiL+VmwF1blVBxfHyjM x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 46b26af1-014c-4fc5-3759-08d57aaee159 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(3008032)(2017052603307)(7153060)(7193020); SRVR:AM0PR0402MB3652; x-ms-traffictypediagnostic: AM0PR0402MB3652: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(185117386973197)(162533806227266)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040501)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(3231190)(944501161)(52105095)(10201501046)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(20161123564045)(20161123558120)(6072148)(201708071742011); SRVR:AM0PR0402MB3652; BCL:0; PCL:0; RULEID:; SRVR:AM0PR0402MB3652; x-forefront-prvs: 0592A9FDE6 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(376002)(346002)(39380400002)(396003)(366004)(53474002)(189003)(199004)(13464003)(53754006)(5660300001)(97736004)(5250100002)(8936002)(114624004)(2906002)(2501003)(3846002)(186003)(55016002)(4326008)(305945005)(53546011)(14454004)(6506007)(26005)(229853002)(7736002)(2950100002)(2900100001)(33656002)(106356001)(3280700002)(6346003)(81156014)(102836004)(6436002)(66066001)(25786009)(76176011)(86362001)(74316002)(7696005)(81166006)(6116002)(8676002)(9686003)(99286004)(105586002)(6246003)(316002)(3660700001)(110136005)(53946003)(68736007)(53936002)(478600001)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR0402MB3652; H:AM0PR0402MB3940.eurprd04.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) authentication-results: spf=none (sender IP is ) smtp.mailfrom=pankaj.bansal@nxp.com; x-microsoft-antispam-message-info: Ovq71KBH7PILu827oNntWVIlHJFDMTeGaQwKZ9cddH0NyRSsn0J3P5z8hjq/mRUvC1EV1AyBKj/8Fh2FV2veYLCoF7FmQrWwovSKgo7BSzaFG+t+DdRw6ZaJw5O8Yv6tZLJf8MdZQa6fkdeYcPJBHZ5s0rAt5Iq3Bbw2f28/qRU= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 46b26af1-014c-4fc5-3759-08d57aaee159 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Feb 2018 11:16:26.5318 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0402MB3652 Subject: Re: [RFC] MdePkg/BaseLib: Change BitField functions. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 23 Feb 2018 11:10:28 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Liming Gao, Thanks for your comments. I am not able to understand the full purpose of the BitField functions. Can you please help me to understand. As per my understanding : BitFieldAnd32 (Operand, StartBit, EndBit, AndData) : We want to calculate the bitwise and (&) between Operand's bits (StartBit t= o EndBit, both inclusive) and AndData's bits (Startbit to Endbit, both incl= usive). If this is the case, then why is there a restriction on AndData ? (If AndDa= ta is larger than the bitmask value range specified by StartBit and EndBit,= then ASSERT().) How these functions are intended to be used ? Thanks & Regards, Pankaj Bansal > -----Original Message----- > From: Gao, Liming [mailto:liming.gao@intel.com] > Sent: Friday, February 23, 2018 4:33 PM > To: Pankaj Bansal ; edk2-devel@lists.01.org > Cc: Kinney, Michael D > Subject: RE: [RFC] MdePkg/BaseLib: Change BitField functions. >=20 > Pankaj: > OrData, AndData and Value are the bit field value specified by StartBit= and > EndBit. They are not the full value. They must be adjusted to the full va= lue, > then calculated with Operand. >=20 > And, we use LShit() or RShit() function for 64bit operand, because we f= ind > VS compiler may generate the intrinsic function when >> or << is used 64b= it > operand on 32bit arch. >=20 > Thanks > Liming > >-----Original Message----- > >From: Pankaj Bansal [mailto:pankaj.bansal@nxp.com] > >Sent: Tuesday, February 20, 2018 12:50 PM > >To: edk2-devel@lists.01.org > >Cc: Gao, Liming ; Kinney, Michael D > > > >Subject: RE: [RFC] MdePkg/BaseLib: Change BitField functions. > > > >Hi everybody, > > > >Any comments on this change ? > > > >> -----Original Message----- > >> From: Pankaj Bansal > >> Sent: Friday, February 09, 2018 4:30 PM > >> To: edk2-devel@lists.01.org > >> Cc: Pankaj Bansal ; Michael D Kinney > >> ; Liming Gao > >> Subject: [RFC] MdePkg/BaseLib: Change BitField functions. > >> > >> The bit field functions in MdePkg are not working as expected. > >> The restrictions on Value parameter such that Value should not be > >> greater than the bitmask value range specified by StartBit and EndBit > >> doesn't seem > >to > >> make sense. > >> > >> Also the restriction on End bit to not be equal to start bit > >> prohibits single bit change. > >> > >> This is an attempt to correct these limitations. > >> > >> Cc: Michael D Kinney > >> Cc: Liming Gao > >> Contributed-under: TianoCore Contribution Agreement 1.1 > >> Signed-off-by: Pankaj Bansal > >> --- > >> > >> Notes: > >> This is a RFC patch. > >> > >> MdePkg/Library/BaseLib/BitField.c | 179 ++++++++++++++-------------- > >> 1 file changed, 89 insertions(+), 90 deletions(-) > >> > >> diff --git a/MdePkg/Library/BaseLib/BitField.c > >> b/MdePkg/Library/BaseLib/BitField.c > >> index eb9e276..2b5be52 100644 > >> --- a/MdePkg/Library/BaseLib/BitField.c > >> +++ b/MdePkg/Library/BaseLib/BitField.c > >> @@ -2,6 +2,8 @@ > >> Bit field functions of BaseLib. > >> > >> Copyright (c) 2006 - 2013, Intel Corporation. All rights > >> reserved.
> >> + Copyright 2018 NXP > >> + > >> This program and the accompanying materials > >> are licensed and made available under the terms and conditions of > >> the BSD License > >> which accompanies this distribution. The full text of the license > >> may be found at @@ -14,6 +16,12 @@ > >> > >> #include "BaseLibInternals.h" > >> > >> +#define BITMASK_UNITN(StartBit, EndBit) \ > >> + (((MAX_UINTN) << (StartBit)) & (MAX_UINTN >> ((sizeof (UINTN) * > >> +8) > >> +- 1 - (EndBit)))) > >> + > >> +#define BITMASK_UNIT64(StartBit, EndBit) \ > >> + (((MAX_UINT64) << (StartBit)) & (MAX_UINT64 >> ((sizeof (UINT64) > >> +* > >> +8) - 1 - (EndBit)))) > >> + > >> /** > >> Worker function that returns a bit field from Operand. > >> > >> @@ -34,11 +42,9 @@ InternalBaseLibBitFieldReadUint ( > >> IN UINTN EndBit > >> ) > >> { > >> - // > >> - // ~((UINTN)-2 << EndBit) is a mask in which bit[0] thru > >> bit[EndBit] > >> - // are 1's while bit[EndBit + 1] thru the most significant bit are = 0's. > >> - // > >> - return (Operand & ~((UINTN)-2 << EndBit)) >> StartBit; > >> + UINTN Mask =3D BITMASK_UNITN (StartBit, EndBit); > >> + > >> + return ( (Operand & Mask) >> StartBit); > >> } > >> > >> /** > >> @@ -68,19 +74,9 @@ InternalBaseLibBitFieldOrUint ( > >> IN UINTN OrData > >> ) > >> { > >> - // > >> - // Higher bits in OrData those are not used must be zero. > >> - // > >> - // EndBit - StartBit + 1 might be 32 while the result right > >> shifting 32 on a 32bit integer is undefined, > >> - // So the logic is updated to right shift (EndBit - StartBit) bits > >> and compare the last bit directly. > >> - // > >> - ASSERT ((OrData >> (EndBit - StartBit)) =3D=3D ((OrData >> (EndBit = - > >> StartBit)) & 1)); > >> - > >> - // > >> - // ~((UINTN)-2 << EndBit) is a mask in which bit[0] thru > >> bit[EndBit] > >> - // are 1's while bit[EndBit + 1] thru the most significant bit are = 0's. > >> - // > >> - return Operand | ((OrData << StartBit) & ~((UINTN) -2 << EndBit)); > >> + UINTN Mask =3D BITMASK_UNITN (StartBit, EndBit); > >> + > >> + return ( ( (Operand | OrData) & Mask) | (Operand & ~Mask)); > >> } > >> > >> /** > >> @@ -110,19 +106,38 @@ InternalBaseLibBitFieldAndUint ( > >> IN UINTN AndData > >> ) > >> { > >> - // > >> - // Higher bits in AndData those are not used must be zero. > >> - // > >> - // EndBit - StartBit + 1 might be 32 while the result right > >> shifting 32 on a 32bit integer is undefined, > >> - // So the logic is updated to right shift (EndBit - StartBit) bits > >> and compare the last bit directly. > >> - // > >> - ASSERT ((AndData >> (EndBit - StartBit)) =3D=3D ((AndData >> (EndBi= t - > >StartBit)) > >> & 1)); > >> - > >> - // > >> - // ~((UINTN)-2 << EndBit) is a mask in which bit[0] thru > >> bit[EndBit] > >> - // are 1's while bit[EndBit + 1] thru the most significant bit are = 0's. > >> - // > >> - return Operand & ~((~AndData << StartBit) & ~((UINTN)-2 << > >> EndBit)); > >> + UINTN Mask =3D BITMASK_UNITN (StartBit, EndBit); > >> + > >> + return ( ( (Operand & AndData) & Mask) | (Operand & ~Mask)); } > >> + > >> +/** > >> + Worker function that writes a bit field to an value, and returns th= e > result. > >> + > >> + Writes Value to the bit field specified by the StartBit and the > >> + EndBit in Operand. All other bits in Operand are preserved. The > >> + new 8-bit value is returned. > >> + > >> + @param Operand Operand on which to perform the bitfield > operation. > >> + @param StartBit The ordinal of the least significant bit in the b= it field. > >> + @param EndBit The ordinal of the most significant bit in the bi= t field. > >> + @param Value The new value of the bit field. > >> + > >> + @return The new value. > >> + > >> +**/ > >> +UINTN > >> +EFIAPI > >> +InternalBaseLibBitFieldWriteUint ( > >> + IN UINTN Operand, > >> + IN UINTN StartBit, > >> + IN UINTN EndBit, > >> + IN UINTN Value > >> + ) > >> +{ > >> + UINTN Mask =3D BITMASK_UNITN (StartBit, EndBit); > >> + > >> + return ( (Value & Mask) | (Operand & ~Mask)); > >> } > >> > >> /** > >> @@ -153,7 +168,7 @@ BitFieldRead8 ( > >> ) > >> { > >> ASSERT (EndBit < 8); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT8)InternalBaseLibBitFieldReadUint (Operand, StartBit, > >> EndBit); } > >> > >> @@ -190,8 +205,8 @@ BitFieldWrite8 ( > >> ) > >> { > >> ASSERT (EndBit < 8); > >> - ASSERT (StartBit <=3D EndBit); > >> - return BitFieldAndThenOr8 (Operand, StartBit, EndBit, 0, Value); > >> + ASSERT (StartBit < EndBit); > >> + return (UINT8)InternalBaseLibBitFieldWriteUint (Operand, StartBit, > >> + EndBit, > >> Value); > >> } > >> > >> /** > >> @@ -228,7 +243,7 @@ BitFieldOr8 ( > >> ) > >> { > >> ASSERT (EndBit < 8); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT8)InternalBaseLibBitFieldOrUint (Operand, StartBit, > >> EndBit, OrData); } > >> > >> @@ -266,7 +281,7 @@ BitFieldAnd8 ( > >> ) > >> { > >> ASSERT (EndBit < 8); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT8)InternalBaseLibBitFieldAndUint (Operand, StartBit, > >> EndBit, AndData); } > >> > >> @@ -275,7 +290,7 @@ BitFieldAnd8 ( > >> bitwise OR, and returns the result. > >> > >> Performs a bitwise AND between the bit field specified by StartBit > >> and EndBit > >> - in Operand and the value specified by AndData, followed by a > >> bitwise > >> + in Operand and the value specified by AndData, followed by a > >> + bitwise > >> OR with value specified by OrData. All other bits in Operand are > >> preserved. The new 8-bit value is returned. > >> > >> @@ -308,7 +323,7 @@ BitFieldAndThenOr8 ( > >> ) > >> { > >> ASSERT (EndBit < 8); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return BitFieldOr8 ( > >> BitFieldAnd8 (Operand, StartBit, EndBit, AndData), > >> StartBit, > >> @@ -345,7 +360,7 @@ BitFieldRead16 ( > >> ) > >> { > >> ASSERT (EndBit < 16); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT16)InternalBaseLibBitFieldReadUint (Operand, StartBit, > >EndBit); > >> } > >> > >> @@ -382,8 +397,8 @@ BitFieldWrite16 ( > >> ) > >> { > >> ASSERT (EndBit < 16); > >> - ASSERT (StartBit <=3D EndBit); > >> - return BitFieldAndThenOr16 (Operand, StartBit, EndBit, 0, Value); > >> + ASSERT (StartBit < EndBit); > >> + return (UINT16)InternalBaseLibBitFieldWriteUint (Operand, > >> + StartBit, > >> EndBit, Value); > >> } > >> > >> /** > >> @@ -420,7 +435,7 @@ BitFieldOr16 ( > >> ) > >> { > >> ASSERT (EndBit < 16); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT16)InternalBaseLibBitFieldOrUint (Operand, StartBit, > >> EndBit, OrData); } > >> > >> @@ -458,7 +473,7 @@ BitFieldAnd16 ( > >> ) > >> { > >> ASSERT (EndBit < 16); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT16)InternalBaseLibBitFieldAndUint (Operand, StartBit, > >> EndBit, AndData); } > >> > >> @@ -467,7 +482,7 @@ BitFieldAnd16 ( > >> bitwise OR, and returns the result. > >> > >> Performs a bitwise AND between the bit field specified by StartBit > >> and EndBit > >> - in Operand and the value specified by AndData, followed by a > >> bitwise > >> + in Operand and the value specified by AndData, followed by a > >> + bitwise > >> OR with value specified by OrData. All other bits in Operand are > >> preserved. The new 16-bit value is returned. > >> > >> @@ -500,7 +515,7 @@ BitFieldAndThenOr16 ( > >> ) > >> { > >> ASSERT (EndBit < 16); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return BitFieldOr16 ( > >> BitFieldAnd16 (Operand, StartBit, EndBit, AndData), > >> StartBit, > >> @@ -537,7 +552,7 @@ BitFieldRead32 ( > >> ) > >> { > >> ASSERT (EndBit < 32); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT32)InternalBaseLibBitFieldReadUint (Operand, StartBit, > >EndBit); > >> } > >> > >> @@ -574,8 +589,8 @@ BitFieldWrite32 ( > >> ) > >> { > >> ASSERT (EndBit < 32); > >> - ASSERT (StartBit <=3D EndBit); > >> - return BitFieldAndThenOr32 (Operand, StartBit, EndBit, 0, Value); > >> + ASSERT (StartBit < EndBit); > >> + return (UINT32)InternalBaseLibBitFieldWriteUint (Operand, > >> + StartBit, > >> EndBit, Value); > >> } > >> > >> /** > >> @@ -612,7 +627,7 @@ BitFieldOr32 ( > >> ) > >> { > >> ASSERT (EndBit < 32); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT32)InternalBaseLibBitFieldOrUint (Operand, StartBit, > >> EndBit, OrData); } > >> > >> @@ -650,7 +665,7 @@ BitFieldAnd32 ( > >> ) > >> { > >> ASSERT (EndBit < 32); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return (UINT32)InternalBaseLibBitFieldAndUint (Operand, StartBit, > >> EndBit, AndData); } > >> > >> @@ -659,7 +674,7 @@ BitFieldAnd32 ( > >> bitwise OR, and returns the result. > >> > >> Performs a bitwise AND between the bit field specified by StartBit > >> and EndBit > >> - in Operand and the value specified by AndData, followed by a > >> bitwise > >> + in Operand and the value specified by AndData, followed by a > >> + bitwise > >> OR with value specified by OrData. All other bits in Operand are > >> preserved. The new 32-bit value is returned. > >> > >> @@ -692,7 +707,7 @@ BitFieldAndThenOr32 ( > >> ) > >> { > >> ASSERT (EndBit < 32); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return BitFieldOr32 ( > >> BitFieldAnd32 (Operand, StartBit, EndBit, AndData), > >> StartBit, > >> @@ -729,8 +744,11 @@ BitFieldRead64 ( > >> ) > >> { > >> ASSERT (EndBit < 64); > >> - ASSERT (StartBit <=3D EndBit); > >> - return RShiftU64 (Operand & ~LShiftU64 ((UINT64)-2, EndBit), > >> StartBit); > >> + ASSERT (StartBit < EndBit); > >> + > >> + UINT64 Mask =3D BITMASK_UNIT64 (StartBit, EndBit); > >> + > >> + return ( (Operand & Mask) >> StartBit); > >> } > >> > >> /** > >> @@ -766,8 +784,11 @@ BitFieldWrite64 ( > >> ) > >> { > >> ASSERT (EndBit < 64); > >> - ASSERT (StartBit <=3D EndBit); > >> - return BitFieldAndThenOr64 (Operand, StartBit, EndBit, 0, Value); > >> + ASSERT (StartBit < EndBit); > >> + > >> + UINT64 Mask =3D BITMASK_UNIT64 (StartBit, EndBit); > >> + > >> + return ( (Value & Mask) | (Operand & ~Mask)); > >> } > >> > >> /** > >> @@ -803,23 +824,12 @@ BitFieldOr64 ( > >> IN UINT64 OrData > >> ) > >> { > >> - UINT64 Value1; > >> - UINT64 Value2; > >> - > >> ASSERT (EndBit < 64); > >> - ASSERT (StartBit <=3D EndBit); > >> - // > >> - // Higher bits in OrData those are not used must be zero. > >> - // > >> - // EndBit - StartBit + 1 might be 64 while the result right > >> shifting 64 on > >> RShiftU64() API is invalid, > >> - // So the logic is updated to right shift (EndBit - StartBit) bits > >> and compare the last bit directly. > >> - // > >> - ASSERT (RShiftU64 (OrData, EndBit - StartBit) =3D=3D (RShiftU64 > >> (OrData, > >EndBit > >> - StartBit) & 1)); > >> - > >> - Value1 =3D LShiftU64 (OrData, StartBit); > >> - Value2 =3D LShiftU64 ((UINT64) - 2, EndBit); > >> - > >> - return Operand | (Value1 & ~Value2); > >> + ASSERT (StartBit < EndBit); > >> + > >> + UINT64 Mask =3D BITMASK_UNIT64 (StartBit, EndBit); > >> + > >> + return ( ( (Operand | OrData) & Mask) | (Operand & ~Mask)); > >> } > >> > >> /** > >> @@ -855,23 +865,12 @@ BitFieldAnd64 ( > >> IN UINT64 AndData > >> ) > >> { > >> - UINT64 Value1; > >> - UINT64 Value2; > >> - > >> ASSERT (EndBit < 64); > >> - ASSERT (StartBit <=3D EndBit); > >> - // > >> - // Higher bits in AndData those are not used must be zero. > >> - // > >> - // EndBit - StartBit + 1 might be 64 while the right shifting 64 > >> on RShiftU64() API is invalid, > >> - // So the logic is updated to right shift (EndBit - StartBit) bits > >> and compare the last bit directly. > >> - // > >> - ASSERT (RShiftU64 (AndData, EndBit - StartBit) =3D=3D (RShiftU64 > >> (AndData, EndBit - StartBit) & 1)); > >> - > >> - Value1 =3D LShiftU64 (~AndData, StartBit); > >> - Value2 =3D LShiftU64 ((UINT64)-2, EndBit); > >> - > >> - return Operand & ~(Value1 & ~Value2); > >> + ASSERT (StartBit < EndBit); > >> + > >> + UINT64 Mask =3D BITMASK_UNIT64 (StartBit, EndBit); > >> + > >> + return ( ( (Operand & AndData) & Mask) | (Operand & ~Mask)); > >> } > >> > >> /** > >> @@ -879,7 +878,7 @@ BitFieldAnd64 ( > >> bitwise OR, and returns the result. > >> > >> Performs a bitwise AND between the bit field specified by StartBit > >> and EndBit > >> - in Operand and the value specified by AndData, followed by a > >> bitwise > >> + in Operand and the value specified by AndData, followed by a > >> + bitwise > >> OR with value specified by OrData. All other bits in Operand are > >> preserved. The new 64-bit value is returned. > >> > >> @@ -912,7 +911,7 @@ BitFieldAndThenOr64 ( > >> ) > >> { > >> ASSERT (EndBit < 64); > >> - ASSERT (StartBit <=3D EndBit); > >> + ASSERT (StartBit < EndBit); > >> return BitFieldOr64 ( > >> BitFieldAnd64 (Operand, StartBit, EndBit, AndData), > >> StartBit, > >> -- > >> 2.7.4