1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2014, 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#   MathLShiftS64.S
15#
16# Abstract:
17#
18#   64-bit Math Worker Function.
19#   Shifts a 64-bit signed value left by a certain number of bits.
20#
21#------------------------------------------------------------------------------
22
23    .686:
24    .code:
25
26ASM_GLOBAL ASM_PFX(__ashldi3)
27
28#------------------------------------------------------------------------------
29#
30# void __cdecl __ashldi3 (void)
31#
32#------------------------------------------------------------------------------
33ASM_PFX(__ashldi3):
34    #
35    # Handle shifting of 64 or more bits (return 0)
36    #
37    cmpb    $64, %cl
38    jae     ReturnZero
39
40    #
41    # Handle shifting of between 0 and 31 bits
42    #
43    cmpb    $32, %cl
44    jae     More32
45    shld    %cl, %eax, %edx
46    shl     %cl, %eax
47    ret
48
49    #
50    # Handle shifting of between 32 and 63 bits
51    #
52More32:
53    movl    %eax, %edx
54    xor     %eax, %eax
55    and     $31, %cl
56    shl     %cl, %edx
57    ret
58
59ReturnZero:
60    xor     %eax, %eax
61    xor     %edx, %edx
62    ret
63