Home | History | Annotate | Download | only in Ia32
      1 /*++
      2 
      3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   RShiftU64.c
     15 
     16 Abstract:
     17 
     18   64-bit right shift function for IA-32
     19 
     20 --*/
     21 
     22 #include "Tiano.h"
     23 
     24 UINT64
     25 RShiftU64 (
     26   IN UINT64   Operand,
     27   IN UINTN    Count
     28   )
     29 /*++
     30 
     31 Routine Description:
     32   This routine allows a 64 bit value to be right shifted by 32 bits and returns the
     33   shifted value.
     34   Count is valid up 63. (Only Bits 0-5 is valid for Count)
     35 Arguments:
     36   Operand - Value to be shifted
     37   Count   - Number of times to shift right.
     38 
     39 Returns:
     40 
     41   Value shifted right identified by the Count.
     42 
     43 --*/
     44 {
     45   __asm {
     46 
     47     mov    eax, dword ptr Operand[0]
     48     mov    edx, dword ptr Operand[4]
     49 
     50     ;
     51     ; CL is valid from 0 - 31. shld will move EDX:EAX by CL times but EDX is not touched
     52     ; For CL of 32 - 63, it will be shifted 0 - 31 so we will move edx to eax later.
     53     ;
     54     mov    ecx, Count
     55     and    ecx, 63
     56     shrd   eax, edx, cl
     57     shr    edx, cl
     58 
     59     cmp    ecx, 32
     60     jc     short _RShiftU64_Done
     61 
     62     ;
     63     ; Since Count is 32 - 63, edx will have been shifted  by 0 - 31
     64     ; If shifted by 32 or more, set upper 32 bits to zero.
     65     ;
     66     mov    eax, edx
     67     xor    edx, edx
     68 
     69 _RShiftU64_Done:
     70   }
     71 }
     72