pardo@JUNE.CS.WASHINGTON.EDU (07/14/89)
I'm trying to generate inline `asm' for the i386 Sequent. Configured using the configuration script, gcc version 1.34. I'm getting messages from the compiler that tell me that I'm doing something wrong, but I certainly don't know what it is. If somebody can help me, I'd appreciate it a lot. Also, I've included some comments on gcc.texinfo. I hope that they are useful. Here is a concatenation of the important data structures and code: ---------------------------------------------------------------------- typedef char lock_t; /* A byte or so. */ typedef void *data_t; /* A generic pointer. */ typedef struct buf_t { /* Some random bits. */ struct buf_t *next; union { data_t *last; u_int size; } u; pid_t pid; data_t data[1]; /* VARSIZE */ } buf_t; typedef struct buf_list_t { buf_t *tail; /* Just a struct pointer. */ lock_t lock; } buf_list_t; buf_list_t freelist; void init (buf_t *mtbuf) { mtbuf->next = NULL; asm ( "movl %2,%ecx;xchgl %ecx,%0" : "=g" (freelist.tail) : "0" (freelist.tail) , "g" (mtbuf) ); /* <= LINE 168 */ /* More stuff. */ } ---------------------------------------------------------------------- When I try to compile: gcc -g -Wall -I/u1/pardo/june/resch/trace/pardo/include -I/u1/pardo/june/resch/trace/ogre/include -c buf.c buf.c: In function init: buf.c:168: invalid `asm': invalid expression as operand buf.c:168: invalid `asm': invalid expression as operand Also, I really want to use register `ecx' across both (really, 3) instructions, so I originally had a hard register specifier in the asm: asm ( "movl %2,%ecx;xchgl %ecx,%0" : "=g" (freelist.tail) : "0" (freelist.tail) , "g" (mtbuf) : "%ecx" ); /* <= LINE 169 */ Gives me: buf.c:169: unknown register name `%ecx' in `asm' I also tried the form "ecx" instead of "%ecx", but I got the same message. ---------------------------------------------------------------------- Some comments on the `Extended Asm' section of gcc.texinfo: * The manual says that the instruction template must be ``much like what appears in a machine description [...]''. It appears that the operands *must* be parenthesized. In my opionion, this should be documented, or there should be a cross reference to the part of the info document that explains this. * The `Extended Asm' section of `gcc.texinfo' says that a user must duplicate operands that are both read and write, e.g.,: "=f" (x) : "0" (x) while the `Modifiers' section (under `Constraints in the machine description') says that it is possible to use "+" for read-write operands. Given the statement in `Extended Asm', ``much like what appears in the machine description'', I wonder if it is possible to use a constraint string of "+" instead? Thanks for your help! ;-D on ( Hard register, soft brain ) Pardo