Changeset 11501


Ignore:
Timestamp:
12/28/08 22:36:48 (12 years ago)
Author:
ehuelsmann
Message:

Efficiency/correctness of generated code: choose opcodes based on operand value,
instead of hard coding operand limits (bipush/sipush).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp

    r11500 r11501  
    282282(defknown emit-push-constant-int (fixnum) t)
    283283(defun emit-push-constant-int (n)
    284   (if (<= -32768 n 32767)
    285       (emit 'sipush n)
    286       (emit 'ldc (pool-int n))))
     284  (case n
     285    (-1
     286     (emit 'iconst_m1))
     287    (0
     288     (emit 'iconst_0))
     289    (1
     290     (emit 'iconst_1))
     291    (2
     292     (emit 'iconst_2))
     293    (3
     294     (emit 'iconst_3))
     295    (4
     296     (emit 'iconst_4))
     297    (5
     298     (emit 'iconst_5))
     299    (t
     300     (if (<= -128 n 127)
     301         (emit 'bipush n)
     302         (if (<= -32768 n 32767)
     303             (emit 'sipush n)
     304             (emit 'ldc (pool-int n)))))))
    287305
    288306(defknown emit-push-constant-long (integer) t)
     
    528546    (emit 'aload (compiland-argument-register *current-compiland*))
    529547    (emit 'arraylength)
    530     (emit 'bipush arity)
     548    (emit-push-constant-int arity)
    531549    (emit 'if_icmpeq `,label1)
    532550    (emit 'aload 0) ; this
     
    11891207                  (emit 'aload (compiland-closure-register *current-compiland*))
    11901208                  (emit 'swap) ; array value
    1191                   (emit 'bipush (variable-closure-index variable))
     1209                  (emit-push-constant-int (variable-closure-index variable))
    11921210                  (emit 'swap) ; array index value
    11931211                  (emit 'aastore))
     
    11971215                  (emit 'aload (compiland-argument-register *current-compiland*)) ; Stack: value array
    11981216                  (emit 'swap) ; array value
    1199                   (emit 'bipush (variable-index variable)) ; array value index
     1217                  (emit-push-constant-int (variable-index variable)) ; array value index
    12001218                  (emit 'swap) ; array index value
    12011219                  (emit 'aastore)))))
     
    19071925        (cond ((<= 0 n 255)
    19081926               (emit 'getstatic +lisp-fixnum-class+ "constants" +lisp-fixnum-array+)
    1909                (emit 'sipush n)
     1927               (emit-push-constant-int n)
    19101928               (emit 'aaload))
    19111929              (t
    19121930               (emit 'new +lisp-fixnum-class+)
    19131931               (emit 'dup)
    1914                (case n
    1915                  (-1
    1916                   (emit 'iconst_m1))
    1917                  (0
    1918                   (emit 'iconst_0))
    1919                  (1
    1920                   (emit 'iconst_1))
    1921                  (2
    1922                   (emit 'iconst_2))
    1923                  (3
    1924                   (emit 'iconst_3))
    1925                  (4
    1926                   (emit 'iconst_4))
    1927                  (5
    1928                   (emit 'iconst_5))
    1929                  (t
    1930                   (emit-push-constant-int n)))
     1932               (emit-push-constant-int n)
    19311933               (emit-invokespecial-init +lisp-fixnum-class+ '("I"))))
    19321934        (emit 'putstatic *this-class* g +lisp-fixnum+)
     
    19621964               (emit 'dup)
    19631965               (emit 'ldc (pool-string s))
    1964                (emit 'bipush 10)
     1966               (emit-push-constant-int 10)
    19651967               (emit-invokespecial-init +lisp-bignum-class+ (list +java-string+ "I"))
    19661968               (emit 'putstatic *this-class* g +lisp-bignum+)
     
    19771979    (cond ((<= 0 n 255)
    19781980           (emit 'getstatic +lisp-character-class+ "constants" +lisp-character-array+)
    1979            (emit 'sipush n)
     1981           (emit-push-constant-int n)
    19801982           (emit 'aaload))
    19811983          (t
     
    26282630                     (setf must-clear-values t)))))
    26292631              (t
    2630                (emit 'sipush numargs)
     2632               (emit-push-constant-int numargs)
    26312633               (emit 'anewarray +lisp-object-class+)
    26322634               (let ((i 0))
    26332635                 (dolist (arg args)
    26342636                   (emit 'dup)
    2635                    (emit 'sipush i)
     2637                   (emit-push-constant-int i)
    26362638                   (compile-form arg 'stack nil)
    26372639                   (emit 'aastore) ; store value in array
     
    38873889             (emit 'aload values-register)
    38883890             (emit 'arraylength)
    3889              (emit 'bipush (length vars))
     3891             (emit-push-constant-int (length vars))
    38903892             (emit 'if_icmplt LABEL1)
    38913893             ;; Reaching here, we have enough values for all the variables. We can use
     
    38963898             (emit-push-current-thread)
    38973899             (emit 'aload result-register)
    3898              (emit 'bipush (length vars))
     3900             (emit-push-constant-int (length vars))
    38993901             (emit-invokevirtual +lisp-thread-class+ "getValues"
    39003902                                 (list +lisp-object+ "I") +lisp-object-array+)
     
    39053907                 (when (< index (1- (length vars)))
    39063908                   (emit 'dup))
    3907                  (emit 'bipush index)
     3909                 (emit-push-constant-int index)
    39083910                 (incf index)
    39093911                 (emit 'aaload)
     
    72377239                                  nil +lisp-object+))
    72387240             (t
    7239               (emit 'sipush arg2)
     7241              (emit-push-constant-int arg2)
    72407242              (emit-invokevirtual +lisp-object-class+ "getSlotValue"
    72417243                                  '("I") +lisp-object+)))
     
    72437245          ((fixnump arg2)
    72447246     (compile-forms-and-maybe-emit-clear-values arg1 'stack nil)
    7245            (emit 'sipush arg2)
     7247           (emit-push-constant-int arg2)
    72467248           (case representation
    72477249             (:int
     
    72967298                 (value-register (when target (allocate-register))))
    72977299            (compile-form arg1 'stack nil)
    7298             (emit 'sipush arg2)
     7300            (emit-push-constant-int arg2)
    72997301            (compile-form arg3 'stack nil)
    73007302            (maybe-emit-clear-values arg1 arg3)
     
    86538655            (aver (not (variable-special-p variable)))
    86548656            (emit 'aload (compiland-argument-register compiland))
    8655             (emit 'bipush (variable-index variable))
     8657            (emit-push-constant-int (variable-index variable))
    86568658            (emit 'aaload)
    86578659            (emit 'astore (variable-reserved-register variable))
     
    86828684                     (declare-symbol (variable-name variable)) +lisp-symbol+)
    86838685               (emit 'aload (compiland-argument-register compiland))
    8684                (emit 'bipush (variable-index variable))
     8686               (emit-push-constant-int (variable-index variable))
    86858687               (emit 'aaload)
    86868688               (emit-invokevirtual +lisp-thread-class+ "bindSpecial"
Note: See TracChangeset for help on using the changeset viewer.