OSDN Git Service

gdb/testsuite/
[pf3gnuchains/pf3gnuchains3x.git] / cgen / sem-frags.scm
index dc19dc4..0fb26f4 100644 (file)
@@ -90,6 +90,8 @@
                expr
 
                ; Local variables of the sequence `expr' is in.
+               ; This is recorded in the same form as the sequence,
+               ; i.e. (MODE name).
                locals
 
                ; Ordinal of the statement.
                ; Users of this statement.
                ; Each element is (owner-number . owner-object),
                ; where owner-number is an index into the initial insn table
-               ; (e.g. insn-list arg of sfrag-create-cse-mapping), and
+               ; (e.g. insn-list arg of /sfrag-create-cse-mapping), and
                ; owner-object is the corresponding object.
                users
                )
        (loop (cdr chars) (modulo (+ (* result 7) (car chars)) #xfffffff))))
 )
 
-(define (/frag-hash-compute! rtx-obj expr mode parent-expr op-pos tstate appstuff)
+;; MODE is the name of the mode.
+
+(define (/frag-hash-compute! rtx-obj expr parent-expr op-pos tstate appstuff)
   (let ((h 0))
     (case (rtx-name expr)
       ((operand)
 
 (define (/frag-hash-stmt stmt locals size)
   (set! /frag-hash-value-tmp 0)
-  (rtx-traverse-with-locals #f #f stmt /frag-hash-compute! locals #f) ; FIXME: (/fastcall-make /frag-hash-compute!))
+  (rtx-traverse-with-locals #f #f stmt /frag-hash-compute! locals #f)
   (modulo /frag-hash-value-tmp size)
 )
 
 (define /frag-speed-cost-tmp 0)
 (define /frag-size-cost-tmp 0)
 
-(define (/frag-cost-compute! rtx-obj expr mode parent-expr op-pos tstate appstuff)
+;; MODE is the name of the mode.
+
+(define (/frag-cost-compute! rtx-obj expr parent-expr op-pos tstate appstuff)
   ; FIXME: wip
   (let ((speed 0)
        (size 0))
        ; FIXME: speed/size = 0?
        (set! speed 1)
        (set! size 1))
-      ((UNARY BINARY TRINARY)
+      ((UNARY BINARY TRINARY COMPARE)
        (set! speed 1)
        (set! size 1))
       ((IF)
 (define (/frag-stmt-cost stmt locals)
   (set! /frag-speed-cost-tmp 0)
   (set! /frag-size-cost-tmp 0)
-  (rtx-traverse-with-locals #f #f stmt /frag-cost-compute! locals #f) ; FIXME: (/fastcall-make /frag-cost-compute!))
+  (rtx-traverse-with-locals #f #f stmt /frag-cost-compute! locals #f)
   (cons /frag-speed-cost-tmp /frag-size-cost-tmp)
 )
 
 
 (define (/frag-expr-locals expr)
   (if (rtx-kind? 'sequence expr)
+      (rtx-sequence-locals expr)
+      nil)
+)
+
+; Return the locals in EXPR in assq-able form, i.e. (name MODE).
+; If a sequence, return locals.
+; Otherwise, return nil.
+; The result is in assq'able form.
+
+(define (/frag-expr-assq-locals expr)
+  (if (rtx-kind? 'sequence expr)
       (rtx-sequence-assq-locals expr)
       nil)
 )
                ; statements.
                stmt-numbers
 
-               ; Raw rtl source of fragment.
+               ; rtl source of fragment.
                semantics
 
-               ; Compiled source.
-               compiled-semantics
-
                ; Boolean indicating if this frag is for parallel exec support.
                parallel?
 
 )
 
 (define-getters <sfrag> sfrag
-  (users user-nums sfmt stmt-numbers semantics compiled-semantics
+  (users user-nums sfmt stmt-numbers semantics
         parallel? header? trailer?)
 )
 
                  (for-each
                   (lambda (users)
                     (let* ((first-owner (cdar users))
+                           (context (make-obj-context first-owner "While building sfrags"))
+                           (rtl (apply
+                                 rtx-make
+                                 (cons 'sequence
+                                       (cons 'VOID
+                                             (cons nil
+                                                   (map (lambda (stmt-num)
+                                                          (-stmt-expr
+                                                           (vector-ref stmt-table
+                                                                       stmt-num)))
+                                                        stmt-list))))))
                            (sfrag
                             (make <sfrag>
                               (symbol-append (obj:name first-owner)
                               (map car users)
                               (insn-sfmt first-owner)
                               stmt-list
-                              (apply
-                               rtx-make
-                               (cons 'sequence
-                                     (cons 'VOID
-                                           (cons nil
-                                                 (map (lambda (stmt-num)
-                                                        (-stmt-expr
-                                                         (vector-ref stmt-table
-                                                                     stmt-num)))
-                                                      stmt-list)))))
-                              #f ; compiled-semantics
+                              rtl
                               #f ; parallel?
                               (eq? kind 'header)
                               (eq? kind 'trailer)
                            (+ expr-num 1)
                            (cdr expr-middle-stmts))
                      ; Yep.
-                     (let ((owner (vector-ref owner-table expr-num)))
+                     (let* ((owner (vector-ref owner-table expr-num))
+                            (context (make-obj-context owner "While building sfrags"))
+                            (rtl (apply
+                                  rtx-make
+                                  (cons 'sequence
+                                        (cons 'VOID
+                                              (cons nil
+                                                    (map (lambda (stmt-num)
+                                                           (-stmt-expr
+                                                            (vector-ref stmt-table stmt-num)))
+                                                         (car expr-middle-stmts))))))))
                        (vector-set! (vector-ref expr-sfrags expr-num)
                                     1 next-middle-frag-num)
                        (loop (cons (make <sfrag>
                                      (list expr-num)
                                      (insn-sfmt owner)
                                      (car expr-middle-stmts)
-                                     (apply
-                                      rtx-make
-                                      (cons 'sequence
-                                            (cons 'VOID
-                                                  (cons nil
-                                                        (map (lambda (stmt-num)
-                                                               (-stmt-expr
-                                                                (vector-ref stmt-table stmt-num)))
-                                                             (car expr-middle-stmts))))))
-                                     #f ; compiled-semantics
+                                     rtl
                                      #f ; parallel?
                                      #f ; header?
                                      #f ; trailer?
                             (mode:eq? (cadr l1) (cadr l2)))))
        )
     (for-each (lambda (expr)
-               (let ((locals (/frag-expr-locals expr)))
+               (let ((locals (/frag-expr-assq-locals expr)))
                  (for-each (lambda (local)
                              (let ((entry (lookup-local local result)))
                                (if (and entry
 (define (sem-find-common-frags insn-list)
   (/sem-find-common-frags-1
    (begin
-     (logit 2 "Simplifying/canonicalizing rtl ...\n")
+     (logit 2 "Simplifying rtl ...\n")
      (map (lambda (insn)
            (rtx-simplify-insn #f insn))
          insn-list))
    insn-list)
 )
 
-; Subroutine of sfrag-create-cse-mapping to compute INSN's fragment list.
+; Subroutine of /sfrag-create-cse-mapping to compute INSN's fragment list.
 ; FRAG-USAGE is a vector of 3 elements: #(header middle trailer).
 ; Each element is a fragment number or #f if not present.
 ; Numbers in FRAG-USAGE are indices relative to their respective subtables
     (cdr result))
 )
 
-; Subroutine of sfrag-create-cse-mapping to find the fragment number of the
+; Subroutine of /sfrag-create-cse-mapping to find the fragment number of the
 ; x-header/x-trailer virtual frags.
 
 (define (/frag-lookup-virtual frag-list name)
 ; - table mapping used fragments for each insn (a list)
 ; - locals list
 
-(define (sfrag-create-cse-mapping insn-list)
+(define (/sfrag-create-cse-mapping insn-list)
   (logit 1 "Creating semantic fragments for pbb engine ...\n")
 
   (let ((cse-data (sem-find-common-frags insn-list)))
                                      '(VIRTUAL) "")
                        nil ; users
                        nil ; user ordinals
-                       (insn-sfmt (current-insn-lookup 'x-before))
+                       (insn-sfmt (current-insn-lookup 'x-before #f))
                        #f ; stmt-numbers
                        (rtx-make 'nop)
-                       #f ; compiled-semantics
                        #f ; parallel?
                        #t ; header?
                        #f ; trailer?
                                      '(VIRTUAL) "")
                        nil ; users
                        nil ; user ordinals
-                       (insn-sfmt (current-insn-lookup 'x-before))
+                       (insn-sfmt (current-insn-lookup 'x-before #f))
                        #f ; stmt-numbers
                        (rtx-make 'nop)
-                       #f ; compiled-semantics
                        #f ; parallel?
                        #f ; header?
                        #t ; trailer?
   (if (not /sim-sfrag-init?)
       (begin
        (set! /sim-sfrag-insn-list (non-multi-insns (non-alias-insns (current-insn-list))))
-       (let ((frag-data (sfrag-create-cse-mapping /sim-sfrag-insn-list)))
+       (let ((frag-data (/sfrag-create-cse-mapping /sim-sfrag-insn-list)))
          (set! /sim-sfrag-frag-table (vector-ref frag-data 0))
          (set! /sim-sfrag-usage-table (vector-ref frag-data 1))
          (set! /sim-sfrag-locals-list (vector-ref frag-data 2)))