[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:873]CCL coding system on Meadow.



In article <rsqaf4tba6u.fsf@xxxxxxxxxxxxxxxxxxxxx>,
  Tanaka Akira <akr@xxxxxxxxxxx> writes:

> で、ew-ccl-decode-b-2 をもとにして次のように最適化を行なうと、30秒ほど
> で済むようになりました。

結局次のようにしました。変な文字を読み飛ばす機能も入ってます。

こうすると同条件で 16秒ほどになります。DL だと 10秒ほどなのでたかだか
6割増しくらいしかかかってません。

;; ただ... 20.2 は EOF の処理が怪しくて 文字列の最後の = を A に変えた
;; だけで倍近く時間がかかるようになります。
;; 20.3 ならそんなことはありませんが、全体的にひどく遅いです。だいたい
;; 20.2 の 4倍くらいの時間がかかります。

;;;; CCL の >> が算術シフト(符号拡張有り)とは思いませんでした。おかげ
;;;; でちょっと悩んでしまいました。

(eval-when-compile
(defun ew-ccl-decode-b-bit-ex (v)
  (logior
   (lsh (logand v (lsh 255 16)) -16)
   (logand v (lsh 255 8))
   (lsh (logand v 255) 16)))

(defconst ew-ccl-decode-b-0-table
  (vconcat
   (mapcar
    (lambda (v)
      (if (integerp v)
	  (ew-ccl-decode-b-bit-ex (lsh v 18))
	(lsh 1 24)))
    ew-ccl-256-to-64-table)))

(defconst ew-ccl-decode-b-1-table
  (vconcat
   (mapcar
    (lambda (v)
      (if (integerp v)
	  (ew-ccl-decode-b-bit-ex (lsh v 12))
	(lsh 1 25)))
    ew-ccl-256-to-64-table)))

(defconst ew-ccl-decode-b-2-table
  (vconcat
   (mapcar
    (lambda (v)
      (if (integerp v)
	  (ew-ccl-decode-b-bit-ex (lsh v 6))
	(lsh 1 26)))
    ew-ccl-256-to-64-table)))

(defconst ew-ccl-decode-b-3-table
  (vconcat
   (mapcar
    (lambda (v)
      (if (integerp v)
	  (ew-ccl-decode-b-bit-ex v)
	(lsh 1 27)))
    ew-ccl-256-to-64-table)))
)

(define-ccl-program ew-ccl-decode-b
  `(1
    (loop
     (read r0 r1 r2 r3)
     (r4 = r0 ,ew-ccl-decode-b-0-table)
     (r5 = r1 ,ew-ccl-decode-b-1-table)
     (r4 |= r5)
     (r5 = r2 ,ew-ccl-decode-b-2-table)
     (r4 |= r5)
     (r5 = r3 ,ew-ccl-decode-b-3-table)
     (r4 |= r5)
     (if (r4 & ,(lognot (1- (lsh 1 24))))
	 ((loop
	   (if (r4 & ,(lsh 1 24))
	       ((r0 = r1) (r1 = r2) (r2 = r3) (read r3)
		(r4 >>= 1) (r4 &= ,(logior (lsh 7 24)))
		(r5 = r3 ,ew-ccl-decode-b-3-table)
		(r4 |= r5)
		(repeat))
	     (break)))
	  (loop
	   (if (r4 & ,(lsh 1 25))
	       ((r1 = r2) (r2 = r3) (read r3)
		(r4 >>= 1) (r4 &= ,(logior (lsh 7 24)))
		(r5 = r3 ,ew-ccl-decode-b-3-table)
		(r4 |= r5)
		(repeat))
	     (break)))
	  (loop
	   (if (r2 != ?=)
	       (if (r4 & ,(lsh 1 26))
		   ((r2 = r3) (read r3)
		    (r4 >>= 1) (r4 &= ,(logior (lsh 7 24)))
		    (r5 = r3 ,ew-ccl-decode-b-3-table)
		    (r4 |= r5)
		    (repeat))
		 ((r6 = 0)
		  (break)))
	     ((r6 = 1)
	      (break))))
	  (loop
	   (if (r3 != ?=)
	       (if (r4 & ,(lsh 1 27))
		   ((read r3)
		    (r4 = r3 ,ew-ccl-decode-b-3-table)
		    (repeat))
		 (break))
	     ((r6 |= 2)
	      (break))))
	  (r4 = r0 ,ew-ccl-decode-b-0-table)
	  (r5 = r1 ,ew-ccl-decode-b-1-table)
	  (r4 |= r5)
	  (branch
	   r6
	   ;; BBBB
	   ((r5 = r2 ,ew-ccl-decode-b-2-table)
	    (r4 |= r5)
	    (r5 = r3 ,ew-ccl-decode-b-3-table)
	    (r4 |= r5)
	    (r4 >8= 0)
	    (write r7)
	    (r4 >8= 0)
	    (write r7)
	    (r4 >8= 0)
	    (write-repeat r7))
	   ;; error: BB=B 
	   ((r4 >8= 0)
	    (write r7)
	    (end))
	   ;; BBB=
	   ((r5 = r2 ,ew-ccl-decode-b-2-table)
	    (r4 |= r5)
	    (r4 >8= 0)
	    (write r7)
	    (r4 >8= 0)
	    (write r7)
	    (end))
	   ;; BB==
	   ((r4 >8= 0)
	    (write r7)
	    (end))))
       ((r4 >8= 0)
	(write r7)
	(r4 >8= 0)
	(write r7)
	(r4 >8= 0)
	(write-repeat r7))))))
-- 
[田中 哲][たなか あきら][Tanaka Akira]