Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: x86-64 ASM output of a simple test program

Author: Dezhi Zhao

Date: 13:45:46 09/29/05

Go up one level in this thread


On September 29, 2005 at 16:26:55, Eugene Nalimov wrote:

>On September 29, 2005 at 14:42:46, Dezhi Zhao wrote:
>
>>On September 29, 2005 at 12:12:16, Eugene Nalimov wrote:
>>
>>>On September 29, 2005 at 01:26:54, Dezhi Zhao wrote:
>>>
>>>>The compiler is not very aware of 64 bit operands. It should be not difficult to
>>>>calculate the size of a simple structure and utilize one of the many registers
>>>>instead of using the stack.
>>>
>>>Yes, it is not very difficult, but we decided to spend resources optimizing
>>>legal C/C++ programs, not the cases where language standard explicitly says
>>>"behavior is undefined".
>>
>>The test code is not involved in any issues of language standard.
>>The casts used there are legal by any standards.
>
>Wrong. Here is relevant part of C++ Standard ISO/IEC 14882:2003 (C89 and C99
>standards says the same, I just happened to have this one near me):
>
>Section 9.5, paragraph 1: "In a union, at most one of the data members can be
>active at any time, that is, the value of at most one of the data members can be
>stored in a union at any time".
>
>Thanks,
>Eugene
>

OK. I sounds to me the standard is trying make a union thread safe by
definition.

However, does the compiler pass a structure of size 8 as in the expample by
value or by reference in a function call? I think it to be by reference.
I'm going to try it out:)

>>>
>>>Program still does what programmer intended (it does not give you access
>>>violation, nor it formats your hard drive), though code is suboptimal...
>>
>>Yes. The compiler does a good job. But we can still hope for more. I did not
>>forget to test the bsf and bsr intrinsic. The Beta2(and RC) compiler outputs for
>>both 32 and 64 bit machines are perfect. Thanks!
>>
>>>
>>>Thanks,
>>>Eugene
>>>
>>>:-)
>>>
>>>>; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.26
>>>>
>>>>include listing.inc
>>>>
>>>>INCLUDELIB OLDNAMES
>>>>
>>>>PUBLIC	wmain
>>>>; Function compile flags: /Ogtpy
>>>>; File c:\documents and settings\administrator\my documents\visual studio
>>>>2005\projects\x64\x64\x64.cpp
>>>>;	COMDAT wmain
>>>>_TEXT	SEGMENT
>>>>argc$ = 8
>>>>q$ = 16
>>>>argv$ = 16
>>>>wmain	PROC						; COMDAT
>>>>
>>>>; 9    : 	union
>>>>; 10   : 	{
>>>>; 11   : 		unsigned __int64 qw;
>>>>; 12   : 		struct
>>>>; 13   : 		{
>>>>; 14   : 			unsigned lo32;
>>>>; 15   : 			unsigned hi32;
>>>>; 16   : 		};
>>>>; 17   : 	} q, i;
>>>>; 18   :
>>>>; 19   : 	q.lo32 = argc;
>>>>; 20   : 	q.hi32 = (unsigned) argv;
>>>>; 21   :
>>>>; 22   : 	i.qw = (unsigned __int64) argv | (unsigned __int64) argc << 32;
>>>>; 23   :
>>>>; 24   : 	return q.qw == i.qw;
>>>>
>>>>	xor	eax, eax
>>>>	movsxd	r8, ecx
>>>>	mov	DWORD PTR q$[rsp], ecx
>>>>	shl	r8, 32					; 00000020H
>>>>	mov	DWORD PTR q$[rsp+4], edx
>>>>	or	r8, rdx
>>>>	cmp	QWORD PTR q$[rsp], r8
>>>>	sete	al
>>>>
>>>>; 25   : }
>>>>
>>>>	ret	0
>>>>wmain	ENDP
>>>>_TEXT	ENDS
>>>>END



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.