| /** @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) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
| 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 | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| /* | |
| * Shifts a 64-bit signed value left by a particular number of bits. | |
| */ | |
| __declspec(naked) void __cdecl _allshl (void) | |
| { | |
| _asm { | |
| ; | |
| ; Handle shifting of 64 or more bits (return 0) | |
| ; | |
| cmp cl, 64 | |
| jae short ReturnZero | |
| ; | |
| ; Handle shifting of between 0 and 31 bits | |
| ; | |
| cmp cl, 32 | |
| jae short More32 | |
| shld edx, eax, cl | |
| shl eax, cl | |
| ret | |
| ; | |
| ; Handle shifting of between 32 and 63 bits | |
| ; | |
| More32: | |
| mov edx, eax | |
| xor eax, eax | |
| and cl, 31 | |
| shl edx, cl | |
| ret | |
| ReturnZero: | |
| xor eax,eax | |
| xor edx,edx | |
| ret | |
| } | |
| } |