| /** @file | |
| 64-bit Math Worker Function. | |
| The 32-bit versions of C compiler generate calls to library routines | |
| to handle 64-bit math. These functions use non-standard calling conventions. | |
| Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| /* | |
| * Shifts a 64-bit unsigned value right by a certain number of bits. | |
| */ | |
| __declspec(naked) void __cdecl | |
| _aullshr ( | |
| void | |
| ) | |
| { | |
| _asm { | |
| ; | |
| ; Checking: Only handle 64bit shifting or more | |
| ; | |
| cmp cl, 64 | |
| jae _Exit | |
| ; | |
| ; Handle shifting between 0 and 31 bits | |
| ; | |
| cmp cl, 32 | |
| jae More32 | |
| shrd eax, edx, cl | |
| shr edx, cl | |
| ret | |
| ; | |
| ; Handle shifting of 32-63 bits | |
| ; | |
| More32: | |
| mov eax, edx | |
| xor edx, edx | |
| and cl, 31 | |
| shr eax, cl | |
| ret | |
| ; | |
| ; Invalid number (less then 32bits), return 0 | |
| ; | |
| _Exit: | |
| xor eax, eax | |
| xor edx, edx | |
| ret | |
| } | |
| } |