10b57cec5SDimitry Andric;  z_Windows_NT-586_asm.asm:  - microtasking routines specifically
20b57cec5SDimitry Andric;    written for IA-32 architecture and Intel(R) 64 running Windows* OS
30b57cec5SDimitry Andric
40b57cec5SDimitry Andric;
50b57cec5SDimitry Andric;//===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric;//
70b57cec5SDimitry Andric;// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric;// See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric;// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric;//
110b57cec5SDimitry Andric;//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric;
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric        TITLE   z_Windows_NT-586_asm.asm
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric; ============================= IA-32 architecture ==========================
170b57cec5SDimitry Andricifdef _M_IA32
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric        .586P
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricif @Version gt 510
220b57cec5SDimitry Andric        .model HUGE
230b57cec5SDimitry Andricelse
240b57cec5SDimitry Andric_TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
250b57cec5SDimitry Andric_TEXT   ENDS
260b57cec5SDimitry Andric_DATA   SEGMENT DWORD USE32 PUBLIC 'DATA'
270b57cec5SDimitry Andric_DATA   ENDS
280b57cec5SDimitry AndricCONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
290b57cec5SDimitry AndricCONST   ENDS
300b57cec5SDimitry Andric_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
310b57cec5SDimitry Andric_BSS    ENDS
320b57cec5SDimitry Andric$$SYMBOLS       SEGMENT BYTE USE32 'DEBSYM'
330b57cec5SDimitry Andric$$SYMBOLS       ENDS
340b57cec5SDimitry Andric$$TYPES SEGMENT BYTE USE32 'DEBTYP'
350b57cec5SDimitry Andric$$TYPES ENDS
360b57cec5SDimitry Andric_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
370b57cec5SDimitry Andric_TLS    ENDS
380b57cec5SDimitry AndricFLAT    GROUP _DATA, CONST, _BSS
390b57cec5SDimitry Andric        ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
400b57cec5SDimitry Andricendif
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric;------------------------------------------------------------------------
440b57cec5SDimitry Andric; FUNCTION ___kmp_x86_pause
450b57cec5SDimitry Andric;
460b57cec5SDimitry Andric; void
470b57cec5SDimitry Andric; __kmp_x86_pause( void )
480b57cec5SDimitry AndricPUBLIC  ___kmp_x86_pause
490b57cec5SDimitry Andric_p$ = 4
500b57cec5SDimitry Andric_d$ = 8
510b57cec5SDimitry Andric_TEXT   SEGMENT
520b57cec5SDimitry Andric        ALIGN 16
530b57cec5SDimitry Andric___kmp_x86_pause PROC NEAR
540b57cec5SDimitry Andric
550b57cec5SDimitry Andric        db      0f3H
560b57cec5SDimitry Andric        db      090H    ;; pause
570b57cec5SDimitry Andric        ret
580b57cec5SDimitry Andric
590b57cec5SDimitry Andric___kmp_x86_pause ENDP
600b57cec5SDimitry Andric_TEXT   ENDS
610b57cec5SDimitry Andric
620b57cec5SDimitry Andric;------------------------------------------------------------------------
630b57cec5SDimitry Andric; FUNCTION ___kmp_x86_cpuid
640b57cec5SDimitry Andric;
650b57cec5SDimitry Andric; void
660b57cec5SDimitry Andric; __kmp_x86_cpuid( int mode, int mode2, struct kmp_cpuid *p );
670b57cec5SDimitry AndricPUBLIC  ___kmp_x86_cpuid
680b57cec5SDimitry Andric_TEXT   SEGMENT
690b57cec5SDimitry Andric        ALIGN 16
700b57cec5SDimitry Andric_mode$  = 8
710b57cec5SDimitry Andric_mode2$ = 12
720b57cec5SDimitry Andric_p$     = 16
730b57cec5SDimitry Andric_eax$   = 0
740b57cec5SDimitry Andric_ebx$   = 4
750b57cec5SDimitry Andric_ecx$   = 8
760b57cec5SDimitry Andric_edx$   = 12
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric___kmp_x86_cpuid PROC NEAR
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric        push      ebp
810b57cec5SDimitry Andric        mov       ebp, esp
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric        push      edi
840b57cec5SDimitry Andric        push      ebx
850b57cec5SDimitry Andric        push      ecx
860b57cec5SDimitry Andric        push      edx
870b57cec5SDimitry Andric
880b57cec5SDimitry Andric        mov	  eax, DWORD PTR _mode$[ebp]
890b57cec5SDimitry Andric        mov	  ecx, DWORD PTR _mode2$[ebp]
900b57cec5SDimitry Andric	cpuid					; Query the CPUID for the current processor
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric        mov       edi, DWORD PTR _p$[ebp]
930b57cec5SDimitry Andric	mov 	  DWORD PTR _eax$[ edi ], eax
940b57cec5SDimitry Andric	mov 	  DWORD PTR _ebx$[ edi ], ebx
950b57cec5SDimitry Andric	mov 	  DWORD PTR _ecx$[ edi ], ecx
960b57cec5SDimitry Andric	mov 	  DWORD PTR _edx$[ edi ], edx
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric        pop       edx
990b57cec5SDimitry Andric        pop       ecx
1000b57cec5SDimitry Andric        pop       ebx
1010b57cec5SDimitry Andric        pop       edi
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andric        mov       esp, ebp
1040b57cec5SDimitry Andric        pop       ebp
1050b57cec5SDimitry Andric        ret
1060b57cec5SDimitry Andric
1070b57cec5SDimitry Andric___kmp_x86_cpuid ENDP
1080b57cec5SDimitry Andric_TEXT     ENDS
1090b57cec5SDimitry Andric
1100b57cec5SDimitry Andric;------------------------------------------------------------------------
1110b57cec5SDimitry Andric; FUNCTION ___kmp_test_then_add32
1120b57cec5SDimitry Andric;
1130b57cec5SDimitry Andric; kmp_int32
1140b57cec5SDimitry Andric; __kmp_test_then_add32( volatile kmp_int32 *p, kmp_int32 d );
1150b57cec5SDimitry AndricPUBLIC  ___kmp_test_then_add32
1160b57cec5SDimitry Andric_p$ = 4
1170b57cec5SDimitry Andric_d$ = 8
1180b57cec5SDimitry Andric_TEXT   SEGMENT
1190b57cec5SDimitry Andric        ALIGN 16
1200b57cec5SDimitry Andric___kmp_test_then_add32 PROC NEAR
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric        mov     eax, DWORD PTR _d$[esp]
1230b57cec5SDimitry Andric        mov     ecx, DWORD PTR _p$[esp]
1240b57cec5SDimitry Andriclock    xadd    DWORD PTR [ecx], eax
1250b57cec5SDimitry Andric        ret
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric___kmp_test_then_add32 ENDP
1280b57cec5SDimitry Andric_TEXT   ENDS
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric;------------------------------------------------------------------------
1310b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store8
1320b57cec5SDimitry Andric;
1330b57cec5SDimitry Andric; kmp_int8
1340b57cec5SDimitry Andric; __kmp_compare_and_store8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
1350b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store8
1360b57cec5SDimitry Andric_TEXT   SEGMENT
1370b57cec5SDimitry Andric        ALIGN 16
1380b57cec5SDimitry Andric_p$ = 4
1390b57cec5SDimitry Andric_cv$ = 8
1400b57cec5SDimitry Andric_sv$ = 12
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric___kmp_compare_and_store8 PROC NEAR
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
1450b57cec5SDimitry Andric        mov       al, BYTE PTR _cv$[esp]
1460b57cec5SDimitry Andric        mov       dl, BYTE PTR _sv$[esp]
1470b57cec5SDimitry Andriclock    cmpxchg   BYTE PTR [ecx], dl
1480b57cec5SDimitry Andric        sete      al           ; if al == [ecx] set al = 1 else set al = 0
1490b57cec5SDimitry Andric        and       eax, 1       ; sign extend previous instruction
1500b57cec5SDimitry Andric        ret
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric___kmp_compare_and_store8 ENDP
1530b57cec5SDimitry Andric_TEXT     ENDS
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andric;------------------------------------------------------------------------
1560b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store16
1570b57cec5SDimitry Andric;
1580b57cec5SDimitry Andric; kmp_int16
1590b57cec5SDimitry Andric; __kmp_compare_and_store16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
1600b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store16
1610b57cec5SDimitry Andric_TEXT   SEGMENT
1620b57cec5SDimitry Andric        ALIGN 16
1630b57cec5SDimitry Andric_p$ = 4
1640b57cec5SDimitry Andric_cv$ = 8
1650b57cec5SDimitry Andric_sv$ = 12
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric___kmp_compare_and_store16 PROC NEAR
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
1700b57cec5SDimitry Andric        mov       ax, WORD PTR _cv$[esp]
1710b57cec5SDimitry Andric        mov       dx, WORD PTR _sv$[esp]
1720b57cec5SDimitry Andriclock    cmpxchg   WORD PTR [ecx], dx
1730b57cec5SDimitry Andric        sete      al           ; if ax == [ecx] set al = 1 else set al = 0
1740b57cec5SDimitry Andric        and       eax, 1       ; sign extend previous instruction
1750b57cec5SDimitry Andric        ret
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric___kmp_compare_and_store16 ENDP
1780b57cec5SDimitry Andric_TEXT     ENDS
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andric;------------------------------------------------------------------------
1810b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store32
1820b57cec5SDimitry Andric;
1830b57cec5SDimitry Andric; kmp_int32
1840b57cec5SDimitry Andric; __kmp_compare_and_store32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
1850b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store32
1860b57cec5SDimitry Andric_TEXT   SEGMENT
1870b57cec5SDimitry Andric        ALIGN 16
1880b57cec5SDimitry Andric_p$ = 4
1890b57cec5SDimitry Andric_cv$ = 8
1900b57cec5SDimitry Andric_sv$ = 12
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric___kmp_compare_and_store32 PROC NEAR
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
1950b57cec5SDimitry Andric        mov       eax, DWORD PTR _cv$[esp]
1960b57cec5SDimitry Andric        mov       edx, DWORD PTR _sv$[esp]
1970b57cec5SDimitry Andriclock    cmpxchg   DWORD PTR [ecx], edx
1980b57cec5SDimitry Andric        sete      al           ; if eax == [ecx] set al = 1 else set al = 0
1990b57cec5SDimitry Andric        and       eax, 1       ; sign extend previous instruction
2000b57cec5SDimitry Andric        ret
2010b57cec5SDimitry Andric
2020b57cec5SDimitry Andric___kmp_compare_and_store32 ENDP
2030b57cec5SDimitry Andric_TEXT     ENDS
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric;------------------------------------------------------------------------
2060b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store64
2070b57cec5SDimitry Andric;
2080b57cec5SDimitry Andric; kmp_int32
2090b57cec5SDimitry Andric; __kmp_compare_and_store64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
2100b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store64
2110b57cec5SDimitry Andric_TEXT   SEGMENT
2120b57cec5SDimitry Andric        ALIGN 16
2130b57cec5SDimitry Andric_p$ = 8
2140b57cec5SDimitry Andric_cv_low$ = 12
2150b57cec5SDimitry Andric_cv_high$ = 16
2160b57cec5SDimitry Andric_sv_low$ = 20
2170b57cec5SDimitry Andric_sv_high$ = 24
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andric___kmp_compare_and_store64 PROC NEAR
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andric        push      ebp
2220b57cec5SDimitry Andric        mov       ebp, esp
2230b57cec5SDimitry Andric        push      ebx
2240b57cec5SDimitry Andric        push      edi
2250b57cec5SDimitry Andric        mov       edi, DWORD PTR _p$[ebp]
2260b57cec5SDimitry Andric        mov       eax, DWORD PTR _cv_low$[ebp]
2270b57cec5SDimitry Andric        mov       edx, DWORD PTR _cv_high$[ebp]
2280b57cec5SDimitry Andric        mov       ebx, DWORD PTR _sv_low$[ebp]
2290b57cec5SDimitry Andric        mov       ecx, DWORD PTR _sv_high$[ebp]
2300b57cec5SDimitry Andriclock    cmpxchg8b QWORD PTR [edi]
2310b57cec5SDimitry Andric        sete      al           ; if edx:eax == [edi] set al = 1 else set al = 0
2320b57cec5SDimitry Andric        and       eax, 1       ; sign extend previous instruction
2330b57cec5SDimitry Andric        pop       edi
2340b57cec5SDimitry Andric        pop       ebx
2350b57cec5SDimitry Andric        mov       esp, ebp
2360b57cec5SDimitry Andric        pop       ebp
2370b57cec5SDimitry Andric        ret
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andric___kmp_compare_and_store64 ENDP
2400b57cec5SDimitry Andric_TEXT     ENDS
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andric;------------------------------------------------------------------------
2430b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed8
2440b57cec5SDimitry Andric;
2450b57cec5SDimitry Andric; kmp_int8
2460b57cec5SDimitry Andric; __kmp_xchg_fixed8( volatile kmp_int8 *p, kmp_int8 d );
2470b57cec5SDimitry AndricPUBLIC  ___kmp_xchg_fixed8
2480b57cec5SDimitry Andric_TEXT   SEGMENT
2490b57cec5SDimitry Andric        ALIGN 16
2500b57cec5SDimitry Andric_p$ = 4
2510b57cec5SDimitry Andric_d$ = 8
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andric___kmp_xchg_fixed8 PROC NEAR
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
2560b57cec5SDimitry Andric        mov       al,  BYTE PTR _d$[esp]
2570b57cec5SDimitry Andriclock    xchg      BYTE PTR [ecx], al
2580b57cec5SDimitry Andric        ret
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andric___kmp_xchg_fixed8 ENDP
2610b57cec5SDimitry Andric_TEXT     ENDS
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric;------------------------------------------------------------------------
2640b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed16
2650b57cec5SDimitry Andric;
2660b57cec5SDimitry Andric; kmp_int16
2670b57cec5SDimitry Andric; __kmp_xchg_fixed16( volatile kmp_int16 *p, kmp_int16 d );
2680b57cec5SDimitry AndricPUBLIC  ___kmp_xchg_fixed16
2690b57cec5SDimitry Andric_TEXT   SEGMENT
2700b57cec5SDimitry Andric        ALIGN 16
2710b57cec5SDimitry Andric_p$ = 4
2720b57cec5SDimitry Andric_d$ = 8
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andric___kmp_xchg_fixed16 PROC NEAR
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
2770b57cec5SDimitry Andric        mov       ax,  WORD PTR  _d$[esp]
2780b57cec5SDimitry Andriclock    xchg      WORD PTR [ecx], ax
2790b57cec5SDimitry Andric        ret
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andric___kmp_xchg_fixed16 ENDP
2820b57cec5SDimitry Andric_TEXT     ENDS
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andric;------------------------------------------------------------------------
2850b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed32
2860b57cec5SDimitry Andric;
2870b57cec5SDimitry Andric; kmp_int32
2880b57cec5SDimitry Andric; __kmp_xchg_fixed32( volatile kmp_int32 *p, kmp_int32 d );
2890b57cec5SDimitry AndricPUBLIC  ___kmp_xchg_fixed32
2900b57cec5SDimitry Andric_TEXT   SEGMENT
2910b57cec5SDimitry Andric        ALIGN 16
2920b57cec5SDimitry Andric_p$ = 4
2930b57cec5SDimitry Andric_d$ = 8
2940b57cec5SDimitry Andric
2950b57cec5SDimitry Andric___kmp_xchg_fixed32 PROC NEAR
2960b57cec5SDimitry Andric
2970b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
2980b57cec5SDimitry Andric        mov       eax, DWORD PTR _d$[esp]
2990b57cec5SDimitry Andriclock    xchg      DWORD PTR [ecx], eax
3000b57cec5SDimitry Andric        ret
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andric___kmp_xchg_fixed32 ENDP
3030b57cec5SDimitry Andric_TEXT     ENDS
3040b57cec5SDimitry Andric
3050b57cec5SDimitry Andric
3060b57cec5SDimitry Andric;------------------------------------------------------------------------
3070b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_real32
3080b57cec5SDimitry Andric;
3090b57cec5SDimitry Andric; kmp_real32
3100b57cec5SDimitry Andric; __kmp_xchg_real32( volatile kmp_real32 *p, kmp_real32 d );
3110b57cec5SDimitry AndricPUBLIC  ___kmp_xchg_real32
3120b57cec5SDimitry Andric_TEXT   SEGMENT
3130b57cec5SDimitry Andric        ALIGN 16
3140b57cec5SDimitry Andric_p$ = 8
3150b57cec5SDimitry Andric_d$ = 12
3160b57cec5SDimitry Andric_old_value$ = -4
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andric___kmp_xchg_real32 PROC NEAR
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andric        push    ebp
3210b57cec5SDimitry Andric        mov     ebp, esp
3220b57cec5SDimitry Andric        sub     esp, 4
3230b57cec5SDimitry Andric        push    esi
3240b57cec5SDimitry Andric        mov     esi, DWORD PTR _p$[ebp]
3250b57cec5SDimitry Andric
3260b57cec5SDimitry Andric        fld     DWORD PTR [esi]
3270b57cec5SDimitry Andric                        ;; load <addr>
3280b57cec5SDimitry Andric        fst     DWORD PTR _old_value$[ebp]
3290b57cec5SDimitry Andric                        ;; store into old_value
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric        mov     eax, DWORD PTR _d$[ebp]
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andriclock    xchg    DWORD PTR [esi], eax
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andric        fld     DWORD PTR _old_value$[ebp]
3360b57cec5SDimitry Andric                        ;; return old_value
3370b57cec5SDimitry Andric        pop     esi
3380b57cec5SDimitry Andric        mov     esp, ebp
3390b57cec5SDimitry Andric        pop     ebp
3400b57cec5SDimitry Andric        ret
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andric___kmp_xchg_real32 ENDP
3430b57cec5SDimitry Andric_TEXT   ENDS
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andric;------------------------------------------------------------------------
3470b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store_ret8
3480b57cec5SDimitry Andric;
3490b57cec5SDimitry Andric; kmp_int8
3500b57cec5SDimitry Andric; __kmp_compare_and_store_ret8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
3510b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store_ret8
3520b57cec5SDimitry Andric_TEXT   SEGMENT
3530b57cec5SDimitry Andric        ALIGN 16
3540b57cec5SDimitry Andric_p$ = 4
3550b57cec5SDimitry Andric_cv$ = 8
3560b57cec5SDimitry Andric_sv$ = 12
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andric___kmp_compare_and_store_ret8 PROC NEAR
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
3610b57cec5SDimitry Andric        mov       al, BYTE PTR _cv$[esp]
3620b57cec5SDimitry Andric        mov       dl, BYTE PTR _sv$[esp]
3630b57cec5SDimitry Andriclock    cmpxchg   BYTE PTR [ecx], dl
3640b57cec5SDimitry Andric        ret
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andric___kmp_compare_and_store_ret8 ENDP
3670b57cec5SDimitry Andric_TEXT     ENDS
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andric;------------------------------------------------------------------------
3700b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store_ret16
3710b57cec5SDimitry Andric;
3720b57cec5SDimitry Andric; kmp_int16
3730b57cec5SDimitry Andric; __kmp_compare_and_store_ret16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
3740b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store_ret16
3750b57cec5SDimitry Andric_TEXT   SEGMENT
3760b57cec5SDimitry Andric        ALIGN 16
3770b57cec5SDimitry Andric_p$ = 4
3780b57cec5SDimitry Andric_cv$ = 8
3790b57cec5SDimitry Andric_sv$ = 12
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andric___kmp_compare_and_store_ret16 PROC NEAR
3820b57cec5SDimitry Andric
3830b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
3840b57cec5SDimitry Andric        mov       ax, WORD PTR _cv$[esp]
3850b57cec5SDimitry Andric        mov       dx, WORD PTR _sv$[esp]
3860b57cec5SDimitry Andriclock    cmpxchg   WORD PTR [ecx], dx
3870b57cec5SDimitry Andric        ret
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andric___kmp_compare_and_store_ret16 ENDP
3900b57cec5SDimitry Andric_TEXT     ENDS
3910b57cec5SDimitry Andric
3920b57cec5SDimitry Andric;------------------------------------------------------------------------
3930b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store_ret32
3940b57cec5SDimitry Andric;
3950b57cec5SDimitry Andric; kmp_int32
3960b57cec5SDimitry Andric; __kmp_compare_and_store_ret32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
3970b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store_ret32
3980b57cec5SDimitry Andric_TEXT   SEGMENT
3990b57cec5SDimitry Andric        ALIGN 16
4000b57cec5SDimitry Andric_p$ = 4
4010b57cec5SDimitry Andric_cv$ = 8
4020b57cec5SDimitry Andric_sv$ = 12
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andric___kmp_compare_and_store_ret32 PROC NEAR
4050b57cec5SDimitry Andric
4060b57cec5SDimitry Andric        mov       ecx, DWORD PTR _p$[esp]
4070b57cec5SDimitry Andric        mov       eax, DWORD PTR _cv$[esp]
4080b57cec5SDimitry Andric        mov       edx, DWORD PTR _sv$[esp]
4090b57cec5SDimitry Andriclock    cmpxchg   DWORD PTR [ecx], edx
4100b57cec5SDimitry Andric        ret
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andric___kmp_compare_and_store_ret32 ENDP
4130b57cec5SDimitry Andric_TEXT     ENDS
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andric;------------------------------------------------------------------------
4160b57cec5SDimitry Andric; FUNCTION ___kmp_compare_and_store_ret64
4170b57cec5SDimitry Andric;
4180b57cec5SDimitry Andric; kmp_int64
4190b57cec5SDimitry Andric; __kmp_compare_and_store_ret64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
4200b57cec5SDimitry AndricPUBLIC  ___kmp_compare_and_store_ret64
4210b57cec5SDimitry Andric_TEXT   SEGMENT
4220b57cec5SDimitry Andric        ALIGN 16
4230b57cec5SDimitry Andric_p$ = 8
4240b57cec5SDimitry Andric_cv_low$ = 12
4250b57cec5SDimitry Andric_cv_high$ = 16
4260b57cec5SDimitry Andric_sv_low$ = 20
4270b57cec5SDimitry Andric_sv_high$ = 24
4280b57cec5SDimitry Andric
4290b57cec5SDimitry Andric___kmp_compare_and_store_ret64 PROC NEAR
4300b57cec5SDimitry Andric
4310b57cec5SDimitry Andric        push      ebp
4320b57cec5SDimitry Andric        mov       ebp, esp
4330b57cec5SDimitry Andric        push      ebx
4340b57cec5SDimitry Andric        push      edi
4350b57cec5SDimitry Andric        mov       edi, DWORD PTR _p$[ebp]
4360b57cec5SDimitry Andric        mov       eax, DWORD PTR _cv_low$[ebp]
4370b57cec5SDimitry Andric        mov       edx, DWORD PTR _cv_high$[ebp]
4380b57cec5SDimitry Andric        mov       ebx, DWORD PTR _sv_low$[ebp]
4390b57cec5SDimitry Andric        mov       ecx, DWORD PTR _sv_high$[ebp]
4400b57cec5SDimitry Andriclock    cmpxchg8b QWORD PTR [edi]
4410b57cec5SDimitry Andric        pop       edi
4420b57cec5SDimitry Andric        pop       ebx
4430b57cec5SDimitry Andric        mov       esp, ebp
4440b57cec5SDimitry Andric        pop       ebp
4450b57cec5SDimitry Andric        ret
4460b57cec5SDimitry Andric
4470b57cec5SDimitry Andric___kmp_compare_and_store_ret64 ENDP
4480b57cec5SDimitry Andric_TEXT     ENDS
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andric;------------------------------------------------------------------------
4510b57cec5SDimitry Andric; FUNCTION ___kmp_load_x87_fpu_control_word
4520b57cec5SDimitry Andric;
4530b57cec5SDimitry Andric; void
4540b57cec5SDimitry Andric; __kmp_load_x87_fpu_control_word( kmp_int16 *p );
4550b57cec5SDimitry Andric;
4560b57cec5SDimitry Andric; parameters:
4570b57cec5SDimitry Andric;       p:      4(%esp)
4580b57cec5SDimitry AndricPUBLIC  ___kmp_load_x87_fpu_control_word
4590b57cec5SDimitry Andric_TEXT   SEGMENT
4600b57cec5SDimitry Andric        ALIGN 16
4610b57cec5SDimitry Andric_p$ = 4
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andric___kmp_load_x87_fpu_control_word PROC NEAR
4640b57cec5SDimitry Andric
4650b57cec5SDimitry Andric        mov       eax, DWORD PTR _p$[esp]
4660b57cec5SDimitry Andric        fldcw     WORD PTR [eax]
4670b57cec5SDimitry Andric        ret
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric___kmp_load_x87_fpu_control_word ENDP
4700b57cec5SDimitry Andric_TEXT     ENDS
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andric;------------------------------------------------------------------------
4730b57cec5SDimitry Andric; FUNCTION ___kmp_store_x87_fpu_control_word
4740b57cec5SDimitry Andric;
4750b57cec5SDimitry Andric; void
4760b57cec5SDimitry Andric; __kmp_store_x87_fpu_control_word( kmp_int16 *p );
4770b57cec5SDimitry Andric;
4780b57cec5SDimitry Andric; parameters:
4790b57cec5SDimitry Andric;       p:      4(%esp)
4800b57cec5SDimitry AndricPUBLIC  ___kmp_store_x87_fpu_control_word
4810b57cec5SDimitry Andric_TEXT   SEGMENT
4820b57cec5SDimitry Andric        ALIGN 16
4830b57cec5SDimitry Andric_p$ = 4
4840b57cec5SDimitry Andric
4850b57cec5SDimitry Andric___kmp_store_x87_fpu_control_word PROC NEAR
4860b57cec5SDimitry Andric
4870b57cec5SDimitry Andric        mov       eax, DWORD PTR _p$[esp]
4880b57cec5SDimitry Andric        fstcw     WORD PTR [eax]
4890b57cec5SDimitry Andric        ret
4900b57cec5SDimitry Andric
4910b57cec5SDimitry Andric___kmp_store_x87_fpu_control_word ENDP
4920b57cec5SDimitry Andric_TEXT     ENDS
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andric;------------------------------------------------------------------------
4950b57cec5SDimitry Andric; FUNCTION ___kmp_clear_x87_fpu_status_word
4960b57cec5SDimitry Andric;
4970b57cec5SDimitry Andric; void
4980b57cec5SDimitry Andric; __kmp_clear_x87_fpu_status_word();
4990b57cec5SDimitry AndricPUBLIC  ___kmp_clear_x87_fpu_status_word
5000b57cec5SDimitry Andric_TEXT   SEGMENT
5010b57cec5SDimitry Andric        ALIGN 16
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andric___kmp_clear_x87_fpu_status_word PROC NEAR
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andric        fnclex
5060b57cec5SDimitry Andric        ret
5070b57cec5SDimitry Andric
5080b57cec5SDimitry Andric___kmp_clear_x87_fpu_status_word ENDP
5090b57cec5SDimitry Andric_TEXT     ENDS
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andric
5120b57cec5SDimitry Andric;------------------------------------------------------------------------
5130b57cec5SDimitry Andric; FUNCTION ___kmp_invoke_microtask
5140b57cec5SDimitry Andric;
5150b57cec5SDimitry Andric; typedef void  (*microtask_t)( int *gtid, int *tid, ... );
5160b57cec5SDimitry Andric;
5170b57cec5SDimitry Andric; int
5180b57cec5SDimitry Andric; __kmp_invoke_microtask( microtask_t pkfn,
5190b57cec5SDimitry Andric;                         int gtid, int tid,
5200b57cec5SDimitry Andric;                         int argc, void *p_argv[] )
5210b57cec5SDimitry AndricPUBLIC  ___kmp_invoke_microtask
5220b57cec5SDimitry Andric_TEXT   SEGMENT
5230b57cec5SDimitry Andric        ALIGN 16
5240b57cec5SDimitry Andric_pkfn$ = 8
5250b57cec5SDimitry Andric_gtid$ = 12
5260b57cec5SDimitry Andric_tid$ = 16
5270b57cec5SDimitry Andric_argc$ = 20
5280b57cec5SDimitry Andric_argv$ = 24
5290b57cec5SDimitry Andricif OMPT_SUPPORT
5300b57cec5SDimitry Andric_exit_frame$ = 28
5310b57cec5SDimitry Andricendif
5320b57cec5SDimitry Andric_i$ = -8
5330b57cec5SDimitry Andric_stk_adj$ = -16
5340b57cec5SDimitry Andric_vptr$ = -12
5350b57cec5SDimitry Andric_qptr$ = -4
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andric___kmp_invoke_microtask PROC NEAR
5380b57cec5SDimitry Andric; Line 102
5390b57cec5SDimitry Andric        push    ebp
5400b57cec5SDimitry Andric        mov     ebp, esp
5410b57cec5SDimitry Andric        sub     esp, 16                                 ; 00000010H
5420b57cec5SDimitry Andric        push    ebx
5430b57cec5SDimitry Andric        push    esi
5440b57cec5SDimitry Andric        push    edi
5450b57cec5SDimitry Andricif OMPT_SUPPORT
5460b57cec5SDimitry Andric        mov     eax, DWORD PTR _exit_frame$[ebp]
5470b57cec5SDimitry Andric        mov     DWORD PTR [eax], ebp
5480b57cec5SDimitry Andricendif
5490b57cec5SDimitry Andric; Line 114
5500b57cec5SDimitry Andric        mov     eax, DWORD PTR _argc$[ebp]
5510b57cec5SDimitry Andric        mov     DWORD PTR _i$[ebp], eax
5520b57cec5SDimitry Andric
5530b57cec5SDimitry Andric;; ------------------------------------------------------------
5540b57cec5SDimitry Andric	lea     edx, DWORD PTR [eax*4+8]
5550b57cec5SDimitry Andric	mov     ecx, esp                                ; Save current SP into ECX
5560b57cec5SDimitry Andric	mov	eax,edx		; Save the size of the args in eax
5570b57cec5SDimitry Andric	sub	ecx,edx		; esp-((#args+2)*4) -> ecx -- without mods, stack ptr would be this
5580b57cec5SDimitry Andric	mov	edx,ecx		; Save to edx
5590b57cec5SDimitry Andric	and	ecx,-128	; Mask off 7 bits
5600b57cec5SDimitry Andric	sub	edx,ecx		; Amount to subtract from esp
5610b57cec5SDimitry Andric	sub	esp,edx		; Prepare stack ptr-- Now it will be aligned on 128-byte boundary at the call
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andric	add	edx,eax		; Calculate total size of the stack decrement.
5640b57cec5SDimitry Andric        mov     DWORD PTR _stk_adj$[ebp], edx
5650b57cec5SDimitry Andric;; ------------------------------------------------------------
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andric        jmp     SHORT $L22237
5680b57cec5SDimitry Andric$L22238:
5690b57cec5SDimitry Andric        mov     ecx, DWORD PTR _i$[ebp]
5700b57cec5SDimitry Andric        sub     ecx, 1
5710b57cec5SDimitry Andric        mov     DWORD PTR _i$[ebp], ecx
5720b57cec5SDimitry Andric$L22237:
5730b57cec5SDimitry Andric        cmp     DWORD PTR _i$[ebp], 0
5740b57cec5SDimitry Andric        jle     SHORT $L22239
5750b57cec5SDimitry Andric; Line 116
5760b57cec5SDimitry Andric        mov     edx, DWORD PTR _i$[ebp]
5770b57cec5SDimitry Andric        mov     eax, DWORD PTR _argv$[ebp]
5780b57cec5SDimitry Andric        mov     ecx, DWORD PTR [eax+edx*4-4]
5790b57cec5SDimitry Andric        mov     DWORD PTR _vptr$[ebp], ecx
5800b57cec5SDimitry Andric; Line 123
5810b57cec5SDimitry Andric        mov     eax, DWORD PTR _vptr$[ebp]
5820b57cec5SDimitry Andric; Line 124
5830b57cec5SDimitry Andric        push    eax
5840b57cec5SDimitry Andric; Line 127
5850b57cec5SDimitry Andric        jmp     SHORT $L22238
5860b57cec5SDimitry Andric$L22239:
5870b57cec5SDimitry Andric; Line 129
5880b57cec5SDimitry Andric        lea     edx, DWORD PTR _tid$[ebp]
5890b57cec5SDimitry Andric        mov     DWORD PTR _vptr$[ebp], edx
5900b57cec5SDimitry Andric; Line 130
5910b57cec5SDimitry Andric        lea     eax, DWORD PTR _gtid$[ebp]
5920b57cec5SDimitry Andric        mov     DWORD PTR _qptr$[ebp], eax
5930b57cec5SDimitry Andric; Line 143
5940b57cec5SDimitry Andric        mov     eax, DWORD PTR _vptr$[ebp]
5950b57cec5SDimitry Andric; Line 144
5960b57cec5SDimitry Andric        push    eax
5970b57cec5SDimitry Andric; Line 145
5980b57cec5SDimitry Andric        mov     eax, DWORD PTR _qptr$[ebp]
5990b57cec5SDimitry Andric; Line 146
6000b57cec5SDimitry Andric        push    eax
6010b57cec5SDimitry Andric; Line 147
6020b57cec5SDimitry Andric        call    DWORD PTR _pkfn$[ebp]
6030b57cec5SDimitry Andric; Line 148
6040b57cec5SDimitry Andric        add     esp, DWORD PTR _stk_adj$[ebp]
6050b57cec5SDimitry Andric; Line 152
6060b57cec5SDimitry Andric        mov     eax, 1
6070b57cec5SDimitry Andric; Line 153
6080b57cec5SDimitry Andric        pop     edi
6090b57cec5SDimitry Andric        pop     esi
6100b57cec5SDimitry Andric        pop     ebx
6110b57cec5SDimitry Andric        mov     esp, ebp
6120b57cec5SDimitry Andric        pop     ebp
6130b57cec5SDimitry Andric        ret     0
6140b57cec5SDimitry Andric___kmp_invoke_microtask ENDP
6150b57cec5SDimitry Andric_TEXT   ENDS
6160b57cec5SDimitry Andric
6170b57cec5SDimitry Andricendif
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andric; ==================================== Intel(R) 64 ===================================
6200b57cec5SDimitry Andric
6210b57cec5SDimitry Andricifdef _M_AMD64
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andric;------------------------------------------------------------------------
6240b57cec5SDimitry Andric; FUNCTION __kmp_x86_cpuid
6250b57cec5SDimitry Andric;
6260b57cec5SDimitry Andric; void
6270b57cec5SDimitry Andric; __kmp_x86_cpuid( int mode, int mode2, struct kmp_cpuid *p );
6280b57cec5SDimitry Andric;
6290b57cec5SDimitry Andric; parameters:
6300b57cec5SDimitry Andric;	mode:		ecx
6310b57cec5SDimitry Andric;	mode2:		edx
6320b57cec5SDimitry Andric;	cpuid_buffer: 	r8
6330b57cec5SDimitry AndricPUBLIC  __kmp_x86_cpuid
6340b57cec5SDimitry Andric_TEXT   SEGMENT
6350b57cec5SDimitry Andric        ALIGN 16
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andric__kmp_x86_cpuid PROC FRAME ;NEAR
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andric        push      rbp
6400b57cec5SDimitry Andric        .pushreg  rbp
6410b57cec5SDimitry Andric        mov       rbp, rsp
6420b57cec5SDimitry Andric        .setframe rbp, 0
6430b57cec5SDimitry Andric        push      rbx				; callee-save register
6440b57cec5SDimitry Andric        .pushreg  rbx
6450b57cec5SDimitry Andric        .ENDPROLOG
6460b57cec5SDimitry Andric
6470b57cec5SDimitry Andric	mov	  r10, r8                       ; p parameter
6480b57cec5SDimitry Andric        mov	  eax, ecx			; mode parameter
6490b57cec5SDimitry Andric        mov	  ecx, edx                      ; mode2 parameter
6500b57cec5SDimitry Andric	cpuid					; Query the CPUID for the current processor
6510b57cec5SDimitry Andric
6520b57cec5SDimitry Andric	mov 	  DWORD PTR 0[ r10 ], eax	; store results into buffer
6530b57cec5SDimitry Andric	mov 	  DWORD PTR 4[ r10 ], ebx
6540b57cec5SDimitry Andric	mov 	  DWORD PTR 8[ r10 ], ecx
6550b57cec5SDimitry Andric	mov 	  DWORD PTR 12[ r10 ], edx
6560b57cec5SDimitry Andric
6570b57cec5SDimitry Andric        pop       rbx				; callee-save register
6580b57cec5SDimitry Andric        mov       rsp, rbp
6590b57cec5SDimitry Andric        pop       rbp
6600b57cec5SDimitry Andric        ret
6610b57cec5SDimitry Andric
6620b57cec5SDimitry Andric__kmp_x86_cpuid ENDP
6630b57cec5SDimitry Andric_TEXT     ENDS
6640b57cec5SDimitry Andric
6650b57cec5SDimitry Andric
6660b57cec5SDimitry Andric;------------------------------------------------------------------------
6670b57cec5SDimitry Andric; FUNCTION __kmp_test_then_add32
6680b57cec5SDimitry Andric;
6690b57cec5SDimitry Andric; kmp_int32
6700b57cec5SDimitry Andric; __kmp_test_then_add32( volatile kmp_int32 *p, kmp_int32 d );
6710b57cec5SDimitry Andric;
6720b57cec5SDimitry Andric; parameters:
6730b57cec5SDimitry Andric;	p:	rcx
6740b57cec5SDimitry Andric;	d:	edx
6750b57cec5SDimitry Andric;
6760b57cec5SDimitry Andric; return: 	eax
6770b57cec5SDimitry AndricPUBLIC  __kmp_test_then_add32
6780b57cec5SDimitry Andric_TEXT   SEGMENT
6790b57cec5SDimitry Andric        ALIGN 16
6800b57cec5SDimitry Andric__kmp_test_then_add32 PROC ;NEAR
6810b57cec5SDimitry Andric
6820b57cec5SDimitry Andric        mov     eax, edx
6830b57cec5SDimitry Andriclock    xadd    DWORD PTR [rcx], eax
6840b57cec5SDimitry Andric        ret
6850b57cec5SDimitry Andric
6860b57cec5SDimitry Andric__kmp_test_then_add32 ENDP
6870b57cec5SDimitry Andric_TEXT   ENDS
6880b57cec5SDimitry Andric
6890b57cec5SDimitry Andric
6900b57cec5SDimitry Andric;------------------------------------------------------------------------
6910b57cec5SDimitry Andric; FUNCTION __kmp_test_then_add64
6920b57cec5SDimitry Andric;
6930b57cec5SDimitry Andric; kmp_int32
6940b57cec5SDimitry Andric; __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d );
6950b57cec5SDimitry Andric;
6960b57cec5SDimitry Andric; parameters:
6970b57cec5SDimitry Andric;	p:	rcx
6980b57cec5SDimitry Andric;	d:	rdx
6990b57cec5SDimitry Andric;
7000b57cec5SDimitry Andric; return: 	rax
7010b57cec5SDimitry AndricPUBLIC  __kmp_test_then_add64
7020b57cec5SDimitry Andric_TEXT   SEGMENT
7030b57cec5SDimitry Andric        ALIGN 16
7040b57cec5SDimitry Andric__kmp_test_then_add64 PROC ;NEAR
7050b57cec5SDimitry Andric
7060b57cec5SDimitry Andric        mov     rax, rdx
7070b57cec5SDimitry Andriclock    xadd    QWORD PTR [rcx], rax
7080b57cec5SDimitry Andric        ret
7090b57cec5SDimitry Andric
7100b57cec5SDimitry Andric__kmp_test_then_add64 ENDP
7110b57cec5SDimitry Andric_TEXT   ENDS
7120b57cec5SDimitry Andric
7130b57cec5SDimitry Andric
7140b57cec5SDimitry Andric;------------------------------------------------------------------------
7150b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store8
7160b57cec5SDimitry Andric;
7170b57cec5SDimitry Andric; kmp_int8
7180b57cec5SDimitry Andric; __kmp_compare_and_store8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
7190b57cec5SDimitry Andric; parameters:
7200b57cec5SDimitry Andric;	p:	rcx
7210b57cec5SDimitry Andric;	cv:	edx
7220b57cec5SDimitry Andric;	sv:	r8d
7230b57cec5SDimitry Andric;
7240b57cec5SDimitry Andric; return:	eax
7250b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store8
7260b57cec5SDimitry Andric_TEXT   SEGMENT
7270b57cec5SDimitry Andric        ALIGN 16
7280b57cec5SDimitry Andric
7290b57cec5SDimitry Andric__kmp_compare_and_store8 PROC ;NEAR
7300b57cec5SDimitry Andric
7310b57cec5SDimitry Andric        mov       al, dl	; "cv"
7320b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
7330b57cec5SDimitry Andriclock    cmpxchg   BYTE PTR [rcx], dl
7340b57cec5SDimitry Andric        sete      al           	; if al == [rcx] set al = 1 else set al = 0
7350b57cec5SDimitry Andric        and       rax, 1       	; sign extend previous instruction
7360b57cec5SDimitry Andric        ret
7370b57cec5SDimitry Andric
7380b57cec5SDimitry Andric__kmp_compare_and_store8 ENDP
7390b57cec5SDimitry Andric_TEXT     ENDS
7400b57cec5SDimitry Andric
7410b57cec5SDimitry Andric
7420b57cec5SDimitry Andric;------------------------------------------------------------------------
7430b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store16
7440b57cec5SDimitry Andric;
7450b57cec5SDimitry Andric; kmp_int16
7460b57cec5SDimitry Andric; __kmp_compare_and_store16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
7470b57cec5SDimitry Andric; parameters:
7480b57cec5SDimitry Andric;	p:	rcx
7490b57cec5SDimitry Andric;	cv:	edx
7500b57cec5SDimitry Andric;	sv:	r8d
7510b57cec5SDimitry Andric;
7520b57cec5SDimitry Andric; return:	eax
7530b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store16
7540b57cec5SDimitry Andric_TEXT   SEGMENT
7550b57cec5SDimitry Andric        ALIGN 16
7560b57cec5SDimitry Andric
7570b57cec5SDimitry Andric__kmp_compare_and_store16 PROC ;NEAR
7580b57cec5SDimitry Andric
7590b57cec5SDimitry Andric        mov       ax, dx	; "cv"
7600b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
7610b57cec5SDimitry Andriclock    cmpxchg   WORD PTR [rcx], dx
7620b57cec5SDimitry Andric        sete      al           	; if ax == [rcx] set al = 1 else set al = 0
7630b57cec5SDimitry Andric        and       rax, 1       	; sign extend previous instruction
7640b57cec5SDimitry Andric        ret
7650b57cec5SDimitry Andric
7660b57cec5SDimitry Andric__kmp_compare_and_store16 ENDP
7670b57cec5SDimitry Andric_TEXT     ENDS
7680b57cec5SDimitry Andric
7690b57cec5SDimitry Andric
7700b57cec5SDimitry Andric;------------------------------------------------------------------------
7710b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store32
7720b57cec5SDimitry Andric;
7730b57cec5SDimitry Andric; kmp_int32
7740b57cec5SDimitry Andric; __kmp_compare_and_store32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
7750b57cec5SDimitry Andric; parameters:
7760b57cec5SDimitry Andric;	p:	rcx
7770b57cec5SDimitry Andric;	cv:	edx
7780b57cec5SDimitry Andric;	sv:	r8d
7790b57cec5SDimitry Andric;
7800b57cec5SDimitry Andric; return:	eax
7810b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store32
7820b57cec5SDimitry Andric_TEXT   SEGMENT
7830b57cec5SDimitry Andric        ALIGN 16
7840b57cec5SDimitry Andric
7850b57cec5SDimitry Andric__kmp_compare_and_store32 PROC ;NEAR
7860b57cec5SDimitry Andric
7870b57cec5SDimitry Andric        mov       eax, edx	; "cv"
7880b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
7890b57cec5SDimitry Andriclock    cmpxchg   DWORD PTR [rcx], edx
7900b57cec5SDimitry Andric        sete      al           	; if eax == [rcx] set al = 1 else set al = 0
7910b57cec5SDimitry Andric        and       rax, 1       	; sign extend previous instruction
7920b57cec5SDimitry Andric        ret
7930b57cec5SDimitry Andric
7940b57cec5SDimitry Andric__kmp_compare_and_store32 ENDP
7950b57cec5SDimitry Andric_TEXT     ENDS
7960b57cec5SDimitry Andric
7970b57cec5SDimitry Andric
7980b57cec5SDimitry Andric;------------------------------------------------------------------------
7990b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store64
8000b57cec5SDimitry Andric;
8010b57cec5SDimitry Andric; kmp_int32
8020b57cec5SDimitry Andric; __kmp_compare_and_store64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
8030b57cec5SDimitry Andric; parameters:
8040b57cec5SDimitry Andric;	p:	rcx
8050b57cec5SDimitry Andric;	cv:	rdx
8060b57cec5SDimitry Andric;	sv:	r8
8070b57cec5SDimitry Andric;
8080b57cec5SDimitry Andric; return:	eax
8090b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store64
8100b57cec5SDimitry Andric_TEXT   SEGMENT
8110b57cec5SDimitry Andric        ALIGN 16
8120b57cec5SDimitry Andric
8130b57cec5SDimitry Andric__kmp_compare_and_store64 PROC ;NEAR
8140b57cec5SDimitry Andric
8150b57cec5SDimitry Andric        mov       rax, rdx	; "cv"
8160b57cec5SDimitry Andric	mov	  rdx, r8	; "sv"
8170b57cec5SDimitry Andriclock    cmpxchg   QWORD PTR [rcx], rdx
8180b57cec5SDimitry Andric        sete      al           ; if rax == [rcx] set al = 1 else set al = 0
8190b57cec5SDimitry Andric        and       rax, 1       ; sign extend previous instruction
8200b57cec5SDimitry Andric        ret
8210b57cec5SDimitry Andric
8220b57cec5SDimitry Andric__kmp_compare_and_store64 ENDP
8230b57cec5SDimitry Andric_TEXT     ENDS
8240b57cec5SDimitry Andric
8250b57cec5SDimitry Andric
8260b57cec5SDimitry Andric;------------------------------------------------------------------------
8270b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed8
8280b57cec5SDimitry Andric;
8290b57cec5SDimitry Andric; kmp_int8
8300b57cec5SDimitry Andric; __kmp_xchg_fixed8( volatile kmp_int8 *p, kmp_int8 d );
8310b57cec5SDimitry Andric;
8320b57cec5SDimitry Andric; parameters:
8330b57cec5SDimitry Andric;	p:	rcx
8340b57cec5SDimitry Andric;	d:	dl
8350b57cec5SDimitry Andric;
8360b57cec5SDimitry Andric; return: 	al
8370b57cec5SDimitry AndricPUBLIC  __kmp_xchg_fixed8
8380b57cec5SDimitry Andric_TEXT   SEGMENT
8390b57cec5SDimitry Andric        ALIGN 16
8400b57cec5SDimitry Andric
8410b57cec5SDimitry Andric__kmp_xchg_fixed8 PROC ;NEAR
8420b57cec5SDimitry Andric
8430b57cec5SDimitry Andric        mov       al,  dl
8440b57cec5SDimitry Andriclock    xchg      BYTE PTR [rcx], al
8450b57cec5SDimitry Andric        ret
8460b57cec5SDimitry Andric
8470b57cec5SDimitry Andric__kmp_xchg_fixed8 ENDP
8480b57cec5SDimitry Andric_TEXT     ENDS
8490b57cec5SDimitry Andric
8500b57cec5SDimitry Andric
8510b57cec5SDimitry Andric;------------------------------------------------------------------------
8520b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed16
8530b57cec5SDimitry Andric;
8540b57cec5SDimitry Andric; kmp_int16
8550b57cec5SDimitry Andric; __kmp_xchg_fixed16( volatile kmp_int16 *p, kmp_int16 d );
8560b57cec5SDimitry Andric;
8570b57cec5SDimitry Andric; parameters:
8580b57cec5SDimitry Andric;	p:	rcx
8590b57cec5SDimitry Andric;	d:	dx
8600b57cec5SDimitry Andric;
8610b57cec5SDimitry Andric; return: 	ax
8620b57cec5SDimitry AndricPUBLIC  __kmp_xchg_fixed16
8630b57cec5SDimitry Andric_TEXT   SEGMENT
8640b57cec5SDimitry Andric        ALIGN 16
8650b57cec5SDimitry Andric
8660b57cec5SDimitry Andric__kmp_xchg_fixed16 PROC ;NEAR
8670b57cec5SDimitry Andric
8680b57cec5SDimitry Andric        mov       ax,  dx
8690b57cec5SDimitry Andriclock    xchg      WORD PTR [rcx], ax
8700b57cec5SDimitry Andric        ret
8710b57cec5SDimitry Andric
8720b57cec5SDimitry Andric__kmp_xchg_fixed16 ENDP
8730b57cec5SDimitry Andric_TEXT     ENDS
8740b57cec5SDimitry Andric
8750b57cec5SDimitry Andric
8760b57cec5SDimitry Andric;------------------------------------------------------------------------
8770b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed32
8780b57cec5SDimitry Andric;
8790b57cec5SDimitry Andric; kmp_int32
8800b57cec5SDimitry Andric; __kmp_xchg_fixed32( volatile kmp_int32 *p, kmp_int32 d );
8810b57cec5SDimitry Andric;
8820b57cec5SDimitry Andric; parameters:
8830b57cec5SDimitry Andric;	p:	rcx
8840b57cec5SDimitry Andric;	d:	edx
8850b57cec5SDimitry Andric;
8860b57cec5SDimitry Andric; return: 	eax
8870b57cec5SDimitry AndricPUBLIC  __kmp_xchg_fixed32
8880b57cec5SDimitry Andric_TEXT   SEGMENT
8890b57cec5SDimitry Andric        ALIGN 16
8900b57cec5SDimitry Andric__kmp_xchg_fixed32 PROC ;NEAR
8910b57cec5SDimitry Andric
8920b57cec5SDimitry Andric        mov     eax, edx
8930b57cec5SDimitry Andriclock    xchg    DWORD PTR [rcx], eax
8940b57cec5SDimitry Andric        ret
8950b57cec5SDimitry Andric
8960b57cec5SDimitry Andric__kmp_xchg_fixed32 ENDP
8970b57cec5SDimitry Andric_TEXT   ENDS
8980b57cec5SDimitry Andric
8990b57cec5SDimitry Andric
9000b57cec5SDimitry Andric;------------------------------------------------------------------------
9010b57cec5SDimitry Andric; FUNCTION ___kmp_xchg_fixed64
9020b57cec5SDimitry Andric;
9030b57cec5SDimitry Andric; kmp_int64
9040b57cec5SDimitry Andric; __kmp_xchg_fixed64( volatile kmp_int64 *p, kmp_int64 d );
9050b57cec5SDimitry Andric;
9060b57cec5SDimitry Andric; parameters:
9070b57cec5SDimitry Andric;	p:	rcx
9080b57cec5SDimitry Andric;	d:	rdx
9090b57cec5SDimitry Andric;
9100b57cec5SDimitry Andric; return: 	rax
9110b57cec5SDimitry AndricPUBLIC  __kmp_xchg_fixed64
9120b57cec5SDimitry Andric_TEXT   SEGMENT
9130b57cec5SDimitry Andric        ALIGN 16
9140b57cec5SDimitry Andric__kmp_xchg_fixed64 PROC ;NEAR
9150b57cec5SDimitry Andric
9160b57cec5SDimitry Andric        mov     rax, rdx
9170b57cec5SDimitry Andriclock    xchg    QWORD PTR [rcx], rax
9180b57cec5SDimitry Andric        ret
9190b57cec5SDimitry Andric
9200b57cec5SDimitry Andric__kmp_xchg_fixed64 ENDP
9210b57cec5SDimitry Andric_TEXT   ENDS
9220b57cec5SDimitry Andric
9230b57cec5SDimitry Andric
9240b57cec5SDimitry Andric;------------------------------------------------------------------------
9250b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store_ret8
9260b57cec5SDimitry Andric;
9270b57cec5SDimitry Andric; kmp_int8
9280b57cec5SDimitry Andric; __kmp_compare_and_store_ret8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
9290b57cec5SDimitry Andric; parameters:
9300b57cec5SDimitry Andric;	p:	rcx
9310b57cec5SDimitry Andric;	cv:	edx
9320b57cec5SDimitry Andric;	sv:	r8d
9330b57cec5SDimitry Andric;
9340b57cec5SDimitry Andric; return:	eax
9350b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store_ret8
9360b57cec5SDimitry Andric_TEXT   SEGMENT
9370b57cec5SDimitry Andric        ALIGN 16
9380b57cec5SDimitry Andric
9390b57cec5SDimitry Andric__kmp_compare_and_store_ret8 PROC ;NEAR
9400b57cec5SDimitry Andric        mov       al, dl	; "cv"
9410b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
9420b57cec5SDimitry Andriclock    cmpxchg   BYTE PTR [rcx], dl
9430b57cec5SDimitry Andric                        ; Compare AL with [rcx].  If equal set
9440b57cec5SDimitry Andric                        ; ZF and exchange DL with [rcx].  Else, clear
9450b57cec5SDimitry Andric                        ; ZF and load [rcx] into AL.
9460b57cec5SDimitry Andric        ret
9470b57cec5SDimitry Andric
9480b57cec5SDimitry Andric__kmp_compare_and_store_ret8 ENDP
9490b57cec5SDimitry Andric_TEXT     ENDS
9500b57cec5SDimitry Andric
9510b57cec5SDimitry Andric
9520b57cec5SDimitry Andric;------------------------------------------------------------------------
9530b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store_ret16
9540b57cec5SDimitry Andric;
9550b57cec5SDimitry Andric; kmp_int16
9560b57cec5SDimitry Andric; __kmp_compare_and_store_ret16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
9570b57cec5SDimitry Andric; parameters:
9580b57cec5SDimitry Andric;	p:	rcx
9590b57cec5SDimitry Andric;	cv:	edx
9600b57cec5SDimitry Andric;	sv:	r8d
9610b57cec5SDimitry Andric;
9620b57cec5SDimitry Andric; return:	eax
9630b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store_ret16
9640b57cec5SDimitry Andric_TEXT   SEGMENT
9650b57cec5SDimitry Andric        ALIGN 16
9660b57cec5SDimitry Andric
9670b57cec5SDimitry Andric__kmp_compare_and_store_ret16 PROC ;NEAR
9680b57cec5SDimitry Andric
9690b57cec5SDimitry Andric        mov       ax, dx	; "cv"
9700b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
9710b57cec5SDimitry Andriclock    cmpxchg   WORD PTR [rcx], dx
9720b57cec5SDimitry Andric        ret
9730b57cec5SDimitry Andric
9740b57cec5SDimitry Andric__kmp_compare_and_store_ret16 ENDP
9750b57cec5SDimitry Andric_TEXT     ENDS
9760b57cec5SDimitry Andric
9770b57cec5SDimitry Andric
9780b57cec5SDimitry Andric;------------------------------------------------------------------------
9790b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store_ret32
9800b57cec5SDimitry Andric;
9810b57cec5SDimitry Andric; kmp_int32
9820b57cec5SDimitry Andric; __kmp_compare_and_store_ret32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
9830b57cec5SDimitry Andric; parameters:
9840b57cec5SDimitry Andric;	p:	rcx
9850b57cec5SDimitry Andric;	cv:	edx
9860b57cec5SDimitry Andric;	sv:	r8d
9870b57cec5SDimitry Andric;
9880b57cec5SDimitry Andric; return:	eax
9890b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store_ret32
9900b57cec5SDimitry Andric_TEXT   SEGMENT
9910b57cec5SDimitry Andric        ALIGN 16
9920b57cec5SDimitry Andric
9930b57cec5SDimitry Andric__kmp_compare_and_store_ret32 PROC ;NEAR
9940b57cec5SDimitry Andric
9950b57cec5SDimitry Andric        mov       eax, edx	; "cv"
9960b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
9970b57cec5SDimitry Andriclock    cmpxchg   DWORD PTR [rcx], edx
9980b57cec5SDimitry Andric        ret
9990b57cec5SDimitry Andric
10000b57cec5SDimitry Andric__kmp_compare_and_store_ret32 ENDP
10010b57cec5SDimitry Andric_TEXT     ENDS
10020b57cec5SDimitry Andric
10030b57cec5SDimitry Andric
10040b57cec5SDimitry Andric;------------------------------------------------------------------------
10050b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store_ret64
10060b57cec5SDimitry Andric;
10070b57cec5SDimitry Andric; kmp_int64
10080b57cec5SDimitry Andric; __kmp_compare_and_store_ret64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
10090b57cec5SDimitry Andric; parameters:
10100b57cec5SDimitry Andric;	p:	rcx
10110b57cec5SDimitry Andric;	cv:	rdx
10120b57cec5SDimitry Andric;	sv:	r8
10130b57cec5SDimitry Andric;
10140b57cec5SDimitry Andric; return:	rax
10150b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store_ret64
10160b57cec5SDimitry Andric_TEXT   SEGMENT
10170b57cec5SDimitry Andric        ALIGN 16
10180b57cec5SDimitry Andric
10190b57cec5SDimitry Andric__kmp_compare_and_store_ret64 PROC ;NEAR
10200b57cec5SDimitry Andric
10210b57cec5SDimitry Andric        mov       rax, rdx	; "cv"
10220b57cec5SDimitry Andric	mov	  rdx, r8	; "sv"
10230b57cec5SDimitry Andriclock    cmpxchg   QWORD PTR [rcx], rdx
10240b57cec5SDimitry Andric        ret
10250b57cec5SDimitry Andric
10260b57cec5SDimitry Andric__kmp_compare_and_store_ret64 ENDP
10270b57cec5SDimitry Andric_TEXT     ENDS
10280b57cec5SDimitry Andric
10290b57cec5SDimitry Andric
10300b57cec5SDimitry Andric;------------------------------------------------------------------------
10310b57cec5SDimitry Andric; FUNCTION __kmp_compare_and_store_loop8
10320b57cec5SDimitry Andric;
10330b57cec5SDimitry Andric; kmp_int8
10340b57cec5SDimitry Andric; __kmp_compare_and_store_loop8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
10350b57cec5SDimitry Andric; parameters:
10360b57cec5SDimitry Andric;	p:	rcx
10370b57cec5SDimitry Andric;	cv:	edx
10380b57cec5SDimitry Andric;	sv:	r8d
10390b57cec5SDimitry Andric;
10400b57cec5SDimitry Andric; return:	al
10410b57cec5SDimitry AndricPUBLIC  __kmp_compare_and_store_loop8
10420b57cec5SDimitry Andric_TEXT   SEGMENT
10430b57cec5SDimitry Andric        ALIGN 16
10440b57cec5SDimitry Andric
10450b57cec5SDimitry Andric__kmp_compare_and_store_loop8 PROC ;NEAR
10460b57cec5SDimitry Andric$__kmp_loop:
10470b57cec5SDimitry Andric        mov       al, dl	; "cv"
10480b57cec5SDimitry Andric	mov	  edx, r8d	; "sv"
10490b57cec5SDimitry Andriclock    cmpxchg   BYTE PTR [rcx], dl
10500b57cec5SDimitry Andric                        ; Compare AL with [rcx].  If equal set
10510b57cec5SDimitry Andric                        ; ZF and exchange DL with [rcx].  Else, clear
10520b57cec5SDimitry Andric                        ; ZF and load [rcx] into AL.
10530b57cec5SDimitry Andric        jz     	SHORT $__kmp_success
10540b57cec5SDimitry Andric
10550b57cec5SDimitry Andric        db      0f3H
10560b57cec5SDimitry Andric        db      090H    		; pause
10570b57cec5SDimitry Andric
10580b57cec5SDimitry Andric	jmp	SHORT $__kmp_loop
10590b57cec5SDimitry Andric
10600b57cec5SDimitry Andric$__kmp_success:
10610b57cec5SDimitry Andric        ret
10620b57cec5SDimitry Andric
10630b57cec5SDimitry Andric__kmp_compare_and_store_loop8 ENDP
10640b57cec5SDimitry Andric_TEXT     ENDS
10650b57cec5SDimitry Andric
10660b57cec5SDimitry Andric
10670b57cec5SDimitry Andric;------------------------------------------------------------------------
10680b57cec5SDimitry Andric; FUNCTION __kmp_xchg_real32
10690b57cec5SDimitry Andric;
10700b57cec5SDimitry Andric; kmp_real32
10710b57cec5SDimitry Andric; __kmp_xchg_real32( volatile kmp_real32 *p, kmp_real32 d );
10720b57cec5SDimitry Andric;
10730b57cec5SDimitry Andric; parameters:
10740b57cec5SDimitry Andric;	p:	rcx
10750b57cec5SDimitry Andric;       d:	xmm1 (lower 4 bytes)
10760b57cec5SDimitry Andric;
10770b57cec5SDimitry Andric; return:	xmm0 (lower 4 bytes)
10780b57cec5SDimitry AndricPUBLIC  __kmp_xchg_real32
10790b57cec5SDimitry Andric_TEXT   SEGMENT
10800b57cec5SDimitry Andric        ALIGN 16
10810b57cec5SDimitry Andric__kmp_xchg_real32 PROC ;NEAR
10820b57cec5SDimitry Andric
10830b57cec5SDimitry Andric	movd	eax, xmm1		; load d
10840b57cec5SDimitry Andric
10850b57cec5SDimitry Andriclock    xchg    DWORD PTR [rcx], eax
10860b57cec5SDimitry Andric
10870b57cec5SDimitry Andric	movd	xmm0, eax		; load old value into return register
10880b57cec5SDimitry Andric        ret
10890b57cec5SDimitry Andric
10900b57cec5SDimitry Andric__kmp_xchg_real32 ENDP
10910b57cec5SDimitry Andric_TEXT   ENDS
10920b57cec5SDimitry Andric
10930b57cec5SDimitry Andric
10940b57cec5SDimitry Andric;------------------------------------------------------------------------
10950b57cec5SDimitry Andric; FUNCTION __kmp_xchg_real64
10960b57cec5SDimitry Andric;
10970b57cec5SDimitry Andric; kmp_real64
10980b57cec5SDimitry Andric; __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 d );
10990b57cec5SDimitry Andric;
11000b57cec5SDimitry Andric; parameters:
11010b57cec5SDimitry Andric;	p:	rcx
11020b57cec5SDimitry Andric;	d:	xmm1 (lower 8 bytes)
11030b57cec5SDimitry Andric;
11040b57cec5SDimitry Andric; return:	xmm0 (lower 8 bytes)
11050b57cec5SDimitry AndricPUBLIC  __kmp_xchg_real64
11060b57cec5SDimitry Andric_TEXT   SEGMENT
11070b57cec5SDimitry Andric        ALIGN 16
11080b57cec5SDimitry Andric__kmp_xchg_real64 PROC ;NEAR
11090b57cec5SDimitry Andric
11100b57cec5SDimitry Andric	movd	rax, xmm1		; load "d"
11110b57cec5SDimitry Andric
11120b57cec5SDimitry Andriclock    xchg    QWORD PTR [rcx], rax
11130b57cec5SDimitry Andric
11140b57cec5SDimitry Andric	movd	xmm0, rax		; load old value into return register
11150b57cec5SDimitry Andric        ret
11160b57cec5SDimitry Andric
11170b57cec5SDimitry Andric__kmp_xchg_real64 ENDP
11180b57cec5SDimitry Andric_TEXT   ENDS
11190b57cec5SDimitry Andric
11200b57cec5SDimitry Andric;------------------------------------------------------------------------
11210b57cec5SDimitry Andric; FUNCTION __kmp_load_x87_fpu_control_word
11220b57cec5SDimitry Andric;
11230b57cec5SDimitry Andric; void
11240b57cec5SDimitry Andric; __kmp_load_x87_fpu_control_word( kmp_int16 *p );
11250b57cec5SDimitry Andric;
11260b57cec5SDimitry Andric; parameters:
11270b57cec5SDimitry Andric;	p:	rcx
11280b57cec5SDimitry AndricPUBLIC  __kmp_load_x87_fpu_control_word
11290b57cec5SDimitry Andric_TEXT   SEGMENT
11300b57cec5SDimitry Andric        ALIGN 16
11310b57cec5SDimitry Andric__kmp_load_x87_fpu_control_word PROC ;NEAR
11320b57cec5SDimitry Andric
11330b57cec5SDimitry Andric        fldcw   WORD PTR [rcx]
11340b57cec5SDimitry Andric        ret
11350b57cec5SDimitry Andric
11360b57cec5SDimitry Andric__kmp_load_x87_fpu_control_word ENDP
11370b57cec5SDimitry Andric_TEXT   ENDS
11380b57cec5SDimitry Andric
11390b57cec5SDimitry Andric
11400b57cec5SDimitry Andric;------------------------------------------------------------------------
11410b57cec5SDimitry Andric; FUNCTION __kmp_store_x87_fpu_control_word
11420b57cec5SDimitry Andric;
11430b57cec5SDimitry Andric; void
11440b57cec5SDimitry Andric; __kmp_store_x87_fpu_control_word( kmp_int16 *p );
11450b57cec5SDimitry Andric;
11460b57cec5SDimitry Andric; parameters:
11470b57cec5SDimitry Andric;	p:	rcx
11480b57cec5SDimitry AndricPUBLIC  __kmp_store_x87_fpu_control_word
11490b57cec5SDimitry Andric_TEXT   SEGMENT
11500b57cec5SDimitry Andric        ALIGN 16
11510b57cec5SDimitry Andric__kmp_store_x87_fpu_control_word PROC ;NEAR
11520b57cec5SDimitry Andric
11530b57cec5SDimitry Andric        fstcw   WORD PTR [rcx]
11540b57cec5SDimitry Andric        ret
11550b57cec5SDimitry Andric
11560b57cec5SDimitry Andric__kmp_store_x87_fpu_control_word ENDP
11570b57cec5SDimitry Andric_TEXT   ENDS
11580b57cec5SDimitry Andric
11590b57cec5SDimitry Andric
11600b57cec5SDimitry Andric;------------------------------------------------------------------------
11610b57cec5SDimitry Andric; FUNCTION __kmp_clear_x87_fpu_status_word
11620b57cec5SDimitry Andric;
11630b57cec5SDimitry Andric; void
11640b57cec5SDimitry Andric; __kmp_clear_x87_fpu_status_word()
11650b57cec5SDimitry AndricPUBLIC  __kmp_clear_x87_fpu_status_word
11660b57cec5SDimitry Andric_TEXT   SEGMENT
11670b57cec5SDimitry Andric        ALIGN 16
11680b57cec5SDimitry Andric__kmp_clear_x87_fpu_status_word PROC ;NEAR
11690b57cec5SDimitry Andric
11700b57cec5SDimitry Andric        fnclex
11710b57cec5SDimitry Andric        ret
11720b57cec5SDimitry Andric
11730b57cec5SDimitry Andric__kmp_clear_x87_fpu_status_word ENDP
11740b57cec5SDimitry Andric_TEXT   ENDS
11750b57cec5SDimitry Andric
11760b57cec5SDimitry Andric
11770b57cec5SDimitry Andric;------------------------------------------------------------------------
11780b57cec5SDimitry Andric; FUNCTION __kmp_invoke_microtask
11790b57cec5SDimitry Andric;
11800b57cec5SDimitry Andric; typedef void  (*microtask_t)( int *gtid, int *tid, ... );
11810b57cec5SDimitry Andric;
11820b57cec5SDimitry Andric; int
11830b57cec5SDimitry Andric; __kmp_invoke_microtask( microtask_t pkfn,
11840b57cec5SDimitry Andric;                         int gtid, int tid,
11850b57cec5SDimitry Andric;                         int argc, void *p_argv[] ) {
11860b57cec5SDimitry Andric;
11870b57cec5SDimitry Andric;     (*pkfn) ( &gtid, &tid, argv[0], ... );
11880b57cec5SDimitry Andric;     return 1;
11890b57cec5SDimitry Andric; }
11900b57cec5SDimitry Andric;
11910b57cec5SDimitry Andric; note:
11920b57cec5SDimitry Andric;      just before call to pkfn must have rsp 128-byte aligned for compiler
11930b57cec5SDimitry Andric;
11940b57cec5SDimitry Andric; parameters:
11950b57cec5SDimitry Andric;      rcx:   pkfn	16[rbp]
11960b57cec5SDimitry Andric;      edx:   gtid	24[rbp]
11970b57cec5SDimitry Andric;      r8d:   tid	32[rbp]
11980b57cec5SDimitry Andric;      r9d:   argc	40[rbp]
11990b57cec5SDimitry Andric;      [st]:  p_argv	48[rbp]
12000b57cec5SDimitry Andric;
12010b57cec5SDimitry Andric; reg temps:
12020b57cec5SDimitry Andric;      rax:   used all over the place
12030b57cec5SDimitry Andric;      rdx:   used all over the place
12040b57cec5SDimitry Andric;      rcx:   used as argument counter for push parms loop
12050b57cec5SDimitry Andric;      r10:   used to hold pkfn function pointer argument
12060b57cec5SDimitry Andric;
12070b57cec5SDimitry Andric; return:      eax    (always 1/TRUE)
12080b57cec5SDimitry Andric$_pkfn   = 16
12090b57cec5SDimitry Andric$_gtid   = 24
12100b57cec5SDimitry Andric$_tid    = 32
12110b57cec5SDimitry Andric$_argc   = 40
12120b57cec5SDimitry Andric$_p_argv = 48
12130b57cec5SDimitry Andricif OMPT_SUPPORT
12140b57cec5SDimitry Andric$_exit_frame = 56
12150b57cec5SDimitry Andricendif
12160b57cec5SDimitry Andric
12170b57cec5SDimitry AndricPUBLIC  __kmp_invoke_microtask
12180b57cec5SDimitry Andric_TEXT   SEGMENT
12190b57cec5SDimitry Andric        ALIGN 16
12200b57cec5SDimitry Andric
12210b57cec5SDimitry Andric__kmp_invoke_microtask PROC FRAME ;NEAR
12220b57cec5SDimitry Andric	mov	QWORD PTR 16[rsp], rdx	; home gtid parameter
12230b57cec5SDimitry Andric	mov 	QWORD PTR 24[rsp], r8	; home tid parameter
12240b57cec5SDimitry Andric        push    rbp		; save base pointer
12250b57cec5SDimitry Andric        .pushreg rbp
12260b57cec5SDimitry Andric	sub	rsp, 0		; no fixed allocation necessary - end prolog
12270b57cec5SDimitry Andric
12280b57cec5SDimitry Andric        lea     rbp, QWORD PTR [rsp]   	; establish the base pointer
12290b57cec5SDimitry Andric        .setframe rbp, 0
12300b57cec5SDimitry Andric        .ENDPROLOG
12310b57cec5SDimitry Andricif OMPT_SUPPORT
12320b57cec5SDimitry Andric        mov     rax, QWORD PTR $_exit_frame[rbp]
12330b57cec5SDimitry Andric        mov     QWORD PTR [rax], rbp
12340b57cec5SDimitry Andricendif
12350b57cec5SDimitry Andric	mov	r10, rcx	; save pkfn pointer for later
12360b57cec5SDimitry Andric
12370b57cec5SDimitry Andric;; ------------------------------------------------------------
12380b57cec5SDimitry Andric        mov     rax, r9		; rax <= argc
12390b57cec5SDimitry Andric        cmp     rax, 2
12400b57cec5SDimitry Andric        jge     SHORT $_kmp_invoke_stack_align
12410b57cec5SDimitry Andric        mov     rax, 2          ; set 4 homes if less than 2 parms
12420b57cec5SDimitry Andric$_kmp_invoke_stack_align:
12430b57cec5SDimitry Andric	lea     rdx, QWORD PTR [rax*8+16] ; rax <= (argc + 2) * 8
12440b57cec5SDimitry Andric	mov     rax, rsp        ; Save current SP into rax
12450b57cec5SDimitry Andric	sub	rax, rdx	; rsp - ((argc+2)*8) -> rax
12460b57cec5SDimitry Andric				; without align, rsp would be this
12470b57cec5SDimitry Andric	and     rax, -128       ; Mask off 7 bits (128-byte align)
12480b57cec5SDimitry Andric	add     rax, rdx        ; add space for push's in a loop below
12490b57cec5SDimitry Andric	mov     rsp, rax        ; Prepare the stack ptr
12500b57cec5SDimitry Andric				; Now it will align to 128-byte at the call
12510b57cec5SDimitry Andric;; ------------------------------------------------------------
12520b57cec5SDimitry Andric        			; setup pkfn parameter stack
12530b57cec5SDimitry Andric	mov	rax, r9		; rax <= argc
12540b57cec5SDimitry Andric	shl	rax, 3		; rax <= argc*8
12550b57cec5SDimitry Andric	mov	rdx, QWORD PTR $_p_argv[rbp]	; rdx <= p_argv
12560b57cec5SDimitry Andric	add	rdx, rax	; rdx <= &p_argv[argc]
12570b57cec5SDimitry Andric	mov	rcx, r9		; rcx <= argc
12580b57cec5SDimitry Andric	jecxz	SHORT $_kmp_invoke_pass_parms	; nothing to push if argc=0
12590b57cec5SDimitry Andric	cmp	ecx, 1		; if argc=1 branch ahead
12600b57cec5SDimitry Andric	je	SHORT $_kmp_invoke_one_parm
12610b57cec5SDimitry Andric	sub	ecx, 2		; if argc=2 branch ahead, subtract two from
12620b57cec5SDimitry Andric	je	SHORT $_kmp_invoke_two_parms
12630b57cec5SDimitry Andric
12640b57cec5SDimitry Andric$_kmp_invoke_push_parms:	; push last - 5th parms to pkfn on stack
12650b57cec5SDimitry Andric	sub	rdx, 8		; decrement p_argv pointer to previous parm
12660b57cec5SDimitry Andric	mov 	r8, QWORD PTR [rdx] ; r8 <= p_argv[rcx-1]
12670b57cec5SDimitry Andric	push	r8		; push p_argv[rcx-1] onto stack (reverse order)
12680b57cec5SDimitry Andric	sub	ecx, 1
12690b57cec5SDimitry Andric	jecxz	SHORT $_kmp_invoke_two_parms
12700b57cec5SDimitry Andric	jmp	SHORT $_kmp_invoke_push_parms
12710b57cec5SDimitry Andric
12720b57cec5SDimitry Andric$_kmp_invoke_two_parms:
12730b57cec5SDimitry Andric	sub	rdx, 8		; put 4th parm to pkfn in r9
12740b57cec5SDimitry Andric	mov	r9, QWORD PTR [rdx] ; r9 <= p_argv[1]
12750b57cec5SDimitry Andric
12760b57cec5SDimitry Andric$_kmp_invoke_one_parm:
12770b57cec5SDimitry Andric        sub	rdx, 8		; put 3rd parm to pkfn in r8
12780b57cec5SDimitry Andric	mov	r8, QWORD PTR [rdx] ; r8 <= p_argv[0]
12790b57cec5SDimitry Andric
12800b57cec5SDimitry Andric$_kmp_invoke_pass_parms:	; put 1st & 2nd parms to pkfn in registers
12810b57cec5SDimitry Andric	lea	rdx, QWORD PTR $_tid[rbp]  ; rdx <= &tid (2nd parm to pkfn)
12820b57cec5SDimitry Andric	lea	rcx, QWORD PTR $_gtid[rbp] ; rcx <= &gtid (1st parm to pkfn)
12830b57cec5SDimitry Andric        sub     rsp, 32         ; add stack space for first four parms
12840b57cec5SDimitry Andric	mov	rax, r10	; rax <= pkfn
12850b57cec5SDimitry Andric	call	rax		; call (*pkfn)()
12860b57cec5SDimitry Andric	mov	rax, 1		; move 1 into return register;
12870b57cec5SDimitry Andric
12880b57cec5SDimitry Andric        lea     rsp, QWORD PTR [rbp]	; restore stack pointer
12890b57cec5SDimitry Andric
12900b57cec5SDimitry Andric;	add	rsp, 0		; no fixed allocation necessary - start epilog
12910b57cec5SDimitry Andric        pop     rbp		; restore frame pointer
12920b57cec5SDimitry Andric        ret
12930b57cec5SDimitry Andric__kmp_invoke_microtask ENDP
12940b57cec5SDimitry Andric_TEXT   ENDS
12950b57cec5SDimitry Andric
12960b57cec5SDimitry Andricendif
12970b57cec5SDimitry Andric
12980b57cec5SDimitry AndricEND
1299