]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm
CryptoPkg/Test: Add unit test for CryptoBn
[mirror_edk2.git] / CryptoPkg / Library / IntrinsicLib / Ia32 / MathLlshr.asm
CommitLineData
1a49e2aa 1;***\r
2;llshr.asm - long shift right\r
3;\r
4; Copyright (c) Microsoft Corporation. All rights reserved.\r
5; SPDX-License-Identifier: BSD-2-Clause-Patent\r
6;\r
7;Purpose:\r
8; define signed long shift right routine\r
9; __allshr\r
10;\r
11;Original Implemenation: MSVC 14.12.25827\r
12;\r
13;*******************************************************************************\r
14 .686\r
15 .model flat,C\r
16 .code\r
17\r
18\r
19\r
20;***\r
21;llshr - long shift right\r
22;\r
23;Purpose:\r
24; Does a signed Long Shift Right\r
25; Shifts a long right any number of bits.\r
26;\r
27;Entry:\r
28; EDX:EAX - long value to be shifted\r
29; CL - number of bits to shift by\r
30;\r
31;Exit:\r
32; EDX:EAX - shifted value\r
33;\r
34;Uses:\r
35; CL is destroyed.\r
36;\r
37;Exceptions:\r
38;\r
39;*******************************************************************************\r
40_allshr PROC NEAR\r
41\r
42;\r
43; Handle shifts of 64 bits or more (if shifting 64 bits or more, the result\r
44; depends only on the high order bit of edx).\r
45;\r
46 cmp cl,64\r
47 jae short RETSIGN\r
48\r
49;\r
50; Handle shifts of between 0 and 31 bits\r
51;\r
52 cmp cl, 32\r
53 jae short MORE32\r
54 shrd eax,edx,cl\r
55 sar edx,cl\r
56 ret\r
57\r
58;\r
59; Handle shifts of between 32 and 63 bits\r
60;\r
61MORE32:\r
62 mov eax,edx\r
63 sar edx,31\r
64 and cl,31\r
65 sar eax,cl\r
66 ret\r
67\r
68;\r
69; Return double precision 0 or -1, depending on the sign of edx\r
70;\r
71RETSIGN:\r
72 sar edx,31\r
73 mov eax,edx\r
74 ret\r
75\r
76_allshr ENDP\r
77\r
78 end\r