This is the mail archive of the cgen@sources.redhat.com mailing list for the CGEN project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch to add ifield number to cgen_operand (1/2)



A few weeks ago I posted a bogus patch for reloc handling, which was
wisely ignored.  For what it's worth, the message was:

	http://sources.redhat.com/ml/cgen/2001-q1/msg00013.html

Part of the patch replaced the "start" and "length" fields of the
"cgen_operand" struct with the ifield number.  A comment in cgen.h
suggests that this change was already envisaged, so I decided to
update & resend that part. Please commit if OK.

(The patch affects include/, opcodes/ and cgen/.  I've done these
separately, hope that's OK.)

Richard

--

For INCLUDE/

2001-01-23  Richard Sandiford  <r.sandiford@redhat.com>

	* opcode/cgen.h (ifield_type): Define to a dummy value if CGEN_ARCH
	is not defined.
	(cgen_operand_type): Replace start and length fields with ifield
	member.
	(cgen_ifield_lookup_by_num): Declared.

Index: ./include/opcode/cgen.h
===================================================================
RCS file: /cvs/src/src/include/opcode/cgen.h,v
retrieving revision 1.8
diff -c -p -d -r1.8 cgen.h
*** ./include/opcode/cgen.h	2001/01/09 17:01:07	1.8
--- ./include/opcode/cgen.h	2001/01/23 18:10:36
*************** enum cgen_asm_type
*** 408,413 ****
--- 408,414 ----

  #ifndef CGEN_ARCH
  enum cgen_hw_type { CGEN_HW_MAX };
+ enum ifield_type { CGEN_IFLD_MAX };
  #endif

  /* List of hardware elements.  */
*************** typedef struct
*** 614,634 ****

    /* The hardware element associated with this operand.  */
    enum cgen_hw_type hw_type;
-
-   /* FIXME: We don't yet record ifield definitions, which we should.
-      When we do it might make sense to delete start/length (since they will
-      be duplicated in the ifield's definition) and replace them with a
-      pointer to the ifield entry.  */
-
-   /* Bit position.
-      This is just a hint, and may be unused in more complex operands.
-      May be unused for a modifier.  */
-   unsigned char start;

!   /* The number of bits in the operand.
!      This is just a hint, and may be unused in more complex operands.
!      May be unused for a modifier.  */
!   unsigned char length;

  #if 0 /* ??? Interesting idea but relocs tend to get too complicated,
  	 and ABI dependent, for simple table lookups to work.  */
--- 615,623 ----

    /* The hardware element associated with this operand.  */
    enum cgen_hw_type hw_type;

!   /* The field that the operand is stored in.  */
!   enum ifield_type ifield;

  #if 0 /* ??? Interesting idea but relocs tend to get too complicated,
  	 and ABI dependent, for simple table lookups to work.  */
*************** typedef struct cgen_ifld {
*** 814,819 ****
--- 803,812 ----
  /* Return value of attribute ATTR in IFLD.  */
  #define CGEN_IFLD_ATTR_VALUE(ifld, attr) \
  CGEN_ATTR_VALUE ((ifld), CGEN_IFLD_ATTRS (ifld), (attr))
+
+ extern const CGEN_IFLD * cgen_ifield_lookup_by_num
+      PARAMS ((CGEN_CPU_DESC, unsigned int));
+

  /* Instruction data.  */


For OPCODES/

2001-01-23  Richard Sandiford  <r.sandiford@redhat.com>

	* cgen-opc.c (cgen_ifield_lookup_by_num): Added.

Index: ./opcodes/cgen-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/cgen-opc.c,v
retrieving revision 1.5
diff -c -p -d -r1.5 cgen-opc.c
*** ./opcodes/cgen-opc.c	2001/01/02 16:34:07	1.5
--- ./opcodes/cgen-opc.c	2001/01/23 18:10:49
*************** cgen_hw_lookup_by_num (cd, hwnum)
*** 298,303 ****
--- 298,313 ----
    return NULL;
  }

+ /* Instruction fields.  */
+
+ const CGEN_IFLD *
+ cgen_ifield_lookup_by_num (cd, ifnum)
+      CGEN_CPU_DESC cd;
+      unsigned int ifnum;
+ {
+   return &cd->ifld_table[ifnum];
+ }
+
  /* Operand support.  */

  /* Lookup an operand by its name.

For CGEN/

2001-01-23  Richard Sandiford  <r.sandiford@redhat.com>

	* cgen/desc-cpu.scm (gen-operand-table): Replaced start and
	length fields with the instruction field number.
	* cgen/ifield.scm (ifld-enum): Enumerate f-nil as F_NIL
	(-ifield-parse): Add SIGNED attribute.
	* cgen/opcodes.scm (gen-insert): Remove special handling of
	SIGNED attribute following the change to ifld-enum.

Index: ./cgen/desc-cpu.scm
===================================================================
RCS file: /cvs/src/src/cgen/desc-cpu.scm,v
retrieving revision 1.5
diff -c -p -d -r1.5 desc-cpu.scm
*** ./cgen/desc-cpu.scm	2001/01/06 12:11:09	1.5
--- ./cgen/desc-cpu.scm	2001/01/23 17:54:46
*************** const CGEN_OPERAND @arch@_cgen_operand_t
*** 405,412 ****
      		   	         "\"" (obj:name op) "\", "
  			         (op-enum op) ", "
  			         (hw-enum (op:hw-name op)) ", "
! 			         (number->string (op:start op)) ", "
! 			         (number->string (op:length op)) ",\n"
  			         "    "
  			         (gen-obj-attr-defn 'operand op all-attrs
  				       	            num-non-bools gen-A-attr-mask)
--- 405,411 ----
      		   	         "\"" (obj:name op) "\", "
  			         (op-enum op) ", "
  			         (hw-enum (op:hw-name op)) ", "
! 				 (ifld-enum (op-ifield op)) ",\n"
  			         "    "
  			         (gen-obj-attr-defn 'operand op all-attrs
  				       	            num-non-bools gen-A-attr-mask)
Index: ./cgen/ifield.scm
===================================================================
RCS file: /cvs/src/src/cgen/ifield.scm,v
retrieving revision 1.3
diff -c -p -d -r1.3 ifield.scm
*** ./cgen/ifield.scm	2000/09/15 15:01:20	1.3
--- ./cgen/ifield.scm	2001/01/23 17:54:46
***************
*** 186,192 ****
    (string-upcase (string-append (if (or (null? prefix?) (car prefix?))
  				    "@ARCH@_"
  				    "")
! 				(gen-sym ifld)))
  )

  ; Return a boolean indicating if ifield F is an opcode field
--- 186,192 ----
    (string-upcase (string-append (if (or (null? prefix?) (car prefix?))
  				    "@ARCH@_"
  				    "")
! 				(if ifld (gen-sym ifld) "F_NIL")))
  )

  ; Return a boolean indicating if ifield F is an opcode field
***************
*** 520,526 ****
  		   (make <ifield>
  			 name
  			 (parse-comment comment errtxt)
! 			 atlist
  			 mode-obj
  			 bitrange
  			 (-ifld-parse-encode errtxt encode)
--- 520,528 ----
  		   (make <ifield>
  			 name
  			 (parse-comment comment errtxt)
! 			 (if (eq? (mode:class mode-obj) 'INT)
! 			     (atlist-cons (bool-attr-make 'SIGNED #t) atlist)
! 			     atlist)
  			 mode-obj
  			 bitrange
  			 (-ifld-parse-encode errtxt encode)
Index: ./cgen/opcodes.scm
===================================================================
RCS file: /cvs/src/src/cgen/opcodes.scm,v
retrieving revision 1.1.1.1
diff -c -p -d -r1.1.1.1 opcodes.scm
*** ./cgen/opcodes.scm	2000/07/28 04:11:52	1.1.1.1
--- ./cgen/opcodes.scm	2001/01/23 17:54:46
***************
*** 117,132 ****
        (if need-extra?
  	  "value"
  	  varname)
-       ", "
        ; We explicitly pass the attributes here rather than look them up
        ; to give the code more optimization opportunities.
!       ; ??? Maybe when fields are recorded in opc.c, stop doing this, and
!       ; pass a pointer to the recorded attributes instead.
!       (gen-bool-attrs (if (eq? (mode:class (ifld-mode self)) 'INT)
! 			  (atlist-cons (bool-attr-make 'SIGNED #t)
! 				       (obj-atlist self))
! 			  (obj-atlist self))
! 		      gen-attr-mask)
        ", " (number->string (ifld-word-offset self))
        ", " (number->string (ifld-start self #f))
        ", " (number->string (ifld-length self))
--- 117,126 ----
        (if need-extra?
  	  "value"
  	  varname)
        ; We explicitly pass the attributes here rather than look them up
        ; to give the code more optimization opportunities.
!       ; ??? Maybe we should pass a pointer to the recorded attributes instead.
!       ", " (gen-bool-attrs (obj-atlist self) gen-attr-mask)
        ", " (number->string (ifld-word-offset self))
        ", " (number->string (ifld-start self #f))
        ", " (number->string (ifld-length self))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]