public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug preprocessor/19081] New: cpp merging operator ## literal in output
@ 2004-12-19 16:43 smurfasmurf at yahoo dot com
  2004-12-19 17:49 ` [Bug preprocessor/19081] " pinskia at gcc dot gnu dot org
  0 siblings, 1 reply; 2+ messages in thread
From: smurfasmurf at yahoo dot com @ 2004-12-19 16:43 UTC (permalink / raw)
  To: gcc-bugs

The macro
  #define PAYME(x)  $##x
in the code below gives output like
  roll $##7, %eax;
after preprocessing with cpp (cpp md5block.spp >md5block.s).

Both version 2.95.3 on OpenBSD 3.6 and
cpp (GCC) 3.3 20030304 (Apple Computer, Inc. build 1495)
have been tested, and give the same type of error.

With the macro changed to
  #define PAYME(x)  $/**/x
I get the desired output
  roll $7, %eax;
but one would expect to get
  roll $ 7, %eax;
(with whitespace).


/*------------------------------------------------------------*/

/*
 *  rfc1321 requires that I include this.  The code is new.  The constants
 *  all come from the rfc (hence the copyright).  We trade a table for the
 *  macros in rfc.  The total size is a lot less. -- presotto
 *
 *	Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
 *	rights reserved.
 *
 *	License to copy and use this software is granted provided that it
 *	is identified as the "RSA Data Security, Inc. MD5 Message-Digest
 *	Algorithm" in all material mentioning or referencing this software
 *	or this function.
 *
 *	License is also granted to make and use derivative works provided
 *	that such works are identified as "derived from the RSA Data
 *	Security, Inc. MD5 Message-Digest Algorithm" in all material
 *	mentioning or referencing the derived work.
 *
 *	RSA Data Security, Inc. makes no representations concerning either
 *	the merchantability of this software or the suitability of this
 *	software forany particular purpose. It is provided "as is"
 *	without express or implied warranty of any kind.
 *	These notices must be retained in any copies of any part of this
 *	documentation and/or software.
 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22

#define S21 5
#define S22 9
#define S23 14
#define S24 20

#define S31 4
#define S32 11
#define S33 16
#define S34 23

#define S41 6
#define S42 10
#define S43 15
#define S44 21

#define PAYME(x) $##x

/*
 * SI is data
 *	a += FN(B,C,D);
 *	a += x[sh] + t[sh];
 *	a = (a << S11) | (a >> (32 - S11));
 *	a += b;
 */

#define BODY1(off,V,FN,SH,A,B,C,D)\
	FN(B,C,D)\
	leal V(A, %edi, 1), A;\
	addl off(%ebp), A;\
	roll PAYME(SH), A;\
	addl B, A;\

#define BODY(off,V,FN,SH,A,B,C,D)\
	FN(B,C,D)\
	leal V(A, %edi, 1), A;\
	addl (off)(%ebp), A;\
	roll PAYME(SH), A;\
	addl B,A;\

/*
 * fn1 = ((c ^ d) & b) ^ d
 */
#define FN1(B,C,D)\
	movl C, %edi;\
	xorl D, %edi;\
	andl B, %edi;\
	xorl D, %edi;\

/*
 * fn2 = ((b ^ c) & d) ^ c;
 */
#define FN2(B,C,D)\
	movl B, %edi;\
	xorl C, %edi;\
	andl D, %edi;\
	xorl C, %edi;\

/*
 * fn3 = b ^ c ^ d;
 */
#define FN3(B,C,D)\
	movl B, %edi;\
	xorl C, %edi;\
	xorl D, %edi;\

/*
 * fn4 = c ^ (b | ~d);
 */
#define FN4(B,C,D)\
	movl D, %edi;\
	xorl $-1, %edi;\
	orl B, %edi;\
	xorl C, %edi;\

#define	STACKSIZE	20

#define	DATA	(STACKSIZE+8)
#define	LEN	(STACKSIZE+12)
#define	STATE	(STACKSIZE+16)

#define EDATA	(STACKSIZE-4)
#define OLDEBX	(STACKSIZE-8)
#define OLDESI	(STACKSIZE-12)
#define OLDEDI	(STACKSIZE-16)

	.text

	.p2align 2,0x90
	.globl _md5block
		.type _md5block, @function
	_md5block:

	/* Prelude */
	pushl %ebp
	subl $(STACKSIZE), %esp
	movl %ebx, OLDEBX(%esp)
	movl %esi, OLDESI(%esp)
	movl %edi, OLDEDI(%esp)

	movl	DATA(%esp), %eax
	addl	LEN(%esp), %eax
	movl	%eax, EDATA(%esp)

	movl DATA(%esp), %ebp

mainloop:
	movl STATE(%esp), %esi
	movl (%esi), %eax
	movl 4(%esi), %ebx
	movl 8(%esi), %ecx
	movl 12(%esi), %edx

	BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax)


	BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax)


	BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax)


	BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax)

	addl $(16*4), %ebp
	movl STATE(%esp), %edi
	addl %eax,0(%edi)
	addl %ebx,4(%edi)
	addl %ecx,8(%edi)
	addl %edx,12(%edi)

	movl EDATA(%esp), %edi
	cmpl %edi, %ebp
	jb mainloop

	/* Postlude */
	movl OLDEBX(%esp), %ebx
	movl OLDESI(%esp), %esi
	movl OLDEDI(%esp), %edi
	addl $(STACKSIZE), %esp
	popl %ebp
	ret

/*------------------------------------------------------------*/

-- 
           Summary: cpp merging operator ## literal in output
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: preprocessor
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: smurfasmurf at yahoo dot com
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19081


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Bug preprocessor/19081] cpp merging operator ## literal in output
  2004-12-19 16:43 [Bug preprocessor/19081] New: cpp merging operator ## literal in output smurfasmurf at yahoo dot com
@ 2004-12-19 17:49 ` pinskia at gcc dot gnu dot org
  0 siblings, 0 replies; 2+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-12-19 17:49 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-19 17:49 -------
Apple's cpp has a bug, it works with the FSF's cpp.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19081


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-12-19 17:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-19 16:43 [Bug preprocessor/19081] New: cpp merging operator ## literal in output smurfasmurf at yahoo dot com
2004-12-19 17:49 ` [Bug preprocessor/19081] " pinskia at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).