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 ;---------------------------------------------------------------------------
     25     .686
     26     .model  flat,C
     27     .code
     28 
     29 ;---------------------------------------------------------------------------
     30 ;UINT64
     31 ;RShiftU64 (
     32 ;  IN UINT64   Operand,
     33 ;  IN UINTN    Count
     34 ;  )
     35 ;/*++
     36 ;
     37 ;Routine Description:
     38 ;  This routine allows a 64 bit value to be right shifted by 32 bits and returns the 
     39 ;  shifted value.
     40 ;  Count is valid up 63. (Only Bits 0-5 is valid for Count)
     41 ;Arguments:
     42 ;  Operand - Value to be shifted
     43 ;  Count   - Number of times to shift right.
     44 ; 
     45 ;Returns:
     46 ;
     47 ;  Value shifted right identified by the Count.
     48 ;
     49 ;--*/
     50 RShiftU64 PROC
     51   
     52     mov    eax, [esp + 4]; dword ptr Operand[0]
     53     mov    edx, [esp + 8]; dword ptr Operand[4]
     54   
     55     ;
     56     ; CL is valid from 0 - 31. shld will move EDX:EAX by CL times but EDX is not touched
     57     ; For CL of 32 - 63, it will be shifted 0 - 31 so we will move edx to eax later. 
     58     ;
     59     mov    ecx, [esp + 0Ch] ; Count
     60     and    ecx, 63
     61     shrd   eax, edx, cl
     62     shr    edx, cl
     63 
     64     cmp    ecx, 32
     65     jc     short _RShiftU64_Done
     66 
     67     ;
     68     ; Since Count is 32 - 63, edx will have been shifted  by 0 - 31                                                     
     69     ; If shifted by 32 or more, set upper 32 bits to zero.
     70     ;
     71     mov    eax, edx
     72     xor    edx, edx
     73 
     74 _RShiftU64_Done:
     75 
     76     ret
     77 RShiftU64 ENDP	
     78 	END
     79