1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4# This program and the accompanying materials are licensed and made available
5# under the terms and conditions of the BSD License which accompanies this
6# 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#   MathReminderU64x64.S
15#
16# Abstract:
17#
18#   64-bit Math Worker Function.
19#   Divides a 64-bit unsigned value by another 64-bit unsigned value and returns
20#   the 64-bit unsigned remainder
21#
22#------------------------------------------------------------------------------
23
24    .686:
25    .code:
26
27ASM_GLOBAL ASM_PFX(__umoddi3), ASM_PFX(DivU64x64Remainder)
28
29#------------------------------------------------------------------------------
30#
31# void __cdecl __umoddi3 (void)
32#
33#------------------------------------------------------------------------------
34ASM_PFX(__umoddi3):
35    # Original local stack when calling __umoddi3
36    #               -----------------
37    #               |               |
38    #               |---------------|
39    #               |               |
40    #               |--  Divisor  --|
41    #               |               |
42    #               |---------------|
43    #               |               |
44    #               |--  Dividend --|
45    #               |               |
46    #               |---------------|
47    #               |  ReturnAddr** |
48    #       ESP---->|---------------|
49    #
50
51    #
52    # Set up the local stack for Reminder pointer
53    #
54    sub     $8, %esp
55    push    %esp
56
57    #
58    # Set up the local stack for Divisor parameter
59    #
60    movl    28(%esp), %eax
61    push    %eax
62    movl    28(%esp), %eax
63    push    %eax
64
65    #
66    # Set up the local stack for Dividend parameter
67    #
68    movl    28(%esp), %eax
69    push    %eax
70    movl    28(%esp), %eax
71    push    %eax
72
73    #
74    # Call native DivU64x64Remainder of BaseLib
75    #
76    jmp     ASM_PFX(DivU64x64Remainder)
77
78    #
79    # Put the Reminder in EDX:EAX as return value
80    #
81    movl    20(%esp), %eax
82    movl    24(%esp), %edx
83
84    #
85    # Adjust stack
86    #
87    add     $28, %esp
88
89    ret     $16
90