[M3devel] atomics addressing modes, it looks like none needed
Jay K
jay.krell at cornell.edu
Thu Jan 21 10:11:24 CET 2010
I tried a few differnt switches.
They always seem to get the actual address into a register.
C:\dev2\cm3.2\m3-sys\m3back\src>type t.c && cl -c -Ox -FAsc t.c && type t.cod
long __cdecl _InterlockedExchange(long volatile*, long);
#pragma intrinsic(_InterlockedIncrement)
long __cdecl _InterlockedIncrement(long volatile*);
#pragma intrinsic(_InterlockedIncrement)
long __cdecl _InterlockedExchangeAdd(long volatile*, long);
#pragma intrinsic(_InterlockedExchangeAdd)
long __cdecl _InterlockedCompareExchange(long volatile*, long, long);
#pragma intrinsic(_InterlockedCompareExchange)
long F1(volatile long* a)
{
return _InterlockedIncrement(&a[10]);
}
typedef struct S1 { int a; long b; } S1;
long F2(volatile S1* a)
{
return _InterlockedExchangeAdd(&a->b, 123);
}
long F3(volatile S1* a)
{
return _InterlockedCompareExchange(&a->b, 1, 2);
}
long F4(volatile S1* a)
{
return _InterlockedExchange(&a->b, 1);
}
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
t.c
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08
TITLE C:\dev2\cm3.2\m3-sys\m3back\src\t.c
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
PUBLIC _F1
; Function compile flags: /Ogtpy
; File c:\dev2\cm3.2\m3-sys\m3back\src\t.c
_TEXT SEGMENT
_a$ = 8 ; size = 4
_F1 PROC
; 15 : return _InterlockedIncrement(&a[10]);
00000 8b 44 24 04 mov eax, DWORD PTR _a$[esp-4]
00004 8d 48 28 lea ecx, DWORD PTR [eax+40]
00007 b8 01 00 00 00 mov eax, 1
0000c f0 0f c1 01 lock xadd DWORD PTR [ecx], eax
00010 40 inc eax
; 16 : }
00011 c3 ret 0
_F1 ENDP
_TEXT ENDS
PUBLIC _F2
; Function compile flags: /Ogtpy
_TEXT SEGMENT
_a$ = 8 ; size = 4
_F2 PROC
; 23 : return _InterlockedExchangeAdd(&a->b, 123);
00020 8b 4c 24 04 mov ecx, DWORD PTR _a$[esp-4]
00024 b8 7b 00 00 00 mov eax, 123 ; 0000007bH
00029 83 c1 04 add ecx, 4
0002c f0 0f c1 01 lock xadd DWORD PTR [ecx], eax
; 24 : }
00030 c3 ret 0
_F2 ENDP
_TEXT ENDS
PUBLIC _F3
; Function compile flags: /Ogtpy
_TEXT SEGMENT
_a$ = 8 ; size = 4
_F3 PROC
; 29 : return _InterlockedCompareExchange(&a->b, 1, 2);
00040 8b 54 24 04 mov edx, DWORD PTR _a$[esp-4]
00044 b9 01 00 00 00 mov ecx, 1
00049 83 c2 04 add edx, 4
0004c b8 02 00 00 00 mov eax, 2
00051 f0 0f b1 0a lock cmpxchg DWORD PTR [edx], ecx
; 30 : }
00055 c3 ret 0
_F3 ENDP
_TEXT ENDS
PUBLIC _F4
; Function compile flags: /Ogtpy
_TEXT SEGMENT
_a$ = 8 ; size = 4
_F4 PROC
; 35 : return _InterlockedExchange(&a->b, 1);
00060 8b 4c 24 04 mov ecx, DWORD PTR _a$[esp-4]
00064 b8 01 00 00 00 mov eax, 1
00069 83 c1 04 add ecx, 4
0006c 87 01 xchg DWORD PTR [ecx], eax
; 36 : }
0006e c3 ret 0
_F4 ENDP
_TEXT ENDS
END
C:\dev2\cm3.2\m3-sys\m3back\src>
probably should try IA64 though.
- Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20100121/282ae614/attachment-0001.html>
More information about the M3devel
mailing list