[M3devel] atomics addressing modes, it looks like none needed
Tony Hosking
hosking at cs.purdue.edu
Thu Jan 21 15:21:22 CET 2010
OK, so no indexed mode? gcc may generate it differently.
Antony Hosking | Associate Professor | Computer Science | Purdue University
305 N. University Street | West Lafayette | IN 47907 | USA
Office +1 765 494 6001 | Mobile +1 765 427 5484
On 21 Jan 2010, at 04:11, Jay K wrote:
> 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/9a2587ee/attachment-0002.html>
More information about the M3devel
mailing list