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) ( >id, &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 <= >id (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