|
|
1.1 ! root 1: (include-if (null (get 'chead 'version)) "../chead.l") ! 2: (Liszt-file array ! 3: "$Header: array.l,v 1.7 83/08/28 17:12:39 layer Exp $") ! 4: ! 5: ;;; ---- a r r a y array referencing ! 6: ;;; ! 7: ;;; -[Sat Aug 6 23:59:45 1983 by layer]- ! 8: ! 9: ! 10: ;--- d-handlearrayref :: general array handler ! 11: ; this function is called from d-exp when the car is an array (declare macarray) ! 12: ; In the current array scheme, stores look like array references with one ! 13: ; extra argument. Thus we must determine if we are accessing or storing in ! 14: ; the array. ! 15: ; Note that we must turn g-loc to reg and g-cc to nil since, even though ! 16: ; d-supercxr handles g-loc and g-cc, d-superrplacx does not and we cannot ! 17: ; know ahead of time which one we will use. If this seems important, ! 18: ; we can beef up d-superrplacx ! 19: ; ! 20: (defun d-handlearrayref nil ! 21: (let ((spec (get (car v-form) g-arrayspecs)) ! 22: expr ! 23: (g-loc 'reg) g-cc) ! 24: ! 25: (makecomment '(array ref)) ! 26: (if (eq (1+ (length (cdr spec))) (length (cdr v-form))) ! 27: then (d-dostore spec (cadr v-form) (cddr v-form)) ! 28: else (setq expr (d-arrayindexcomp (cdr v-form) (cdr spec))) ! 29: ! 30: (let ((v-form `(cxr ,expr (getdata (getd ',(car v-form)))))) ! 31: (d-supercxr (car spec) nil))))) ! 32: ! 33: ! 34: ;--- d-dostore :: store value in array. ! 35: ; spec - array descriptor from declare, e.g. (foo t 12 3 4) ! 36: ; value - expression to calculate value to be stored. ! 37: ; indexes - list of expressions which are the actual indicies. ! 38: ; ! 39: (defun d-dostore (spec value indexes) ! 40: (let (expr gen) ! 41: (makecomment '(doing store)) ! 42: ; create an expression for doing index calculation. ! 43: (setq expr (d-arrayindexcomp indexes (cdr spec)) ! 44: gen (gensym)) ! 45: ! 46: ; calculate value to store and stack it. ! 47: (d-pushargs (ncons value)) ! 48: (rplaca g-locs gen) ; name just stacked varib ! 49: ! 50: ; do the store operation. ! 51: (let ((v-form `(rplacx ,expr (getdata (getd ',(car v-form))) ! 52: ,gen))) ! 53: (d-superrplacx (car spec))) ! 54: ! 55: ; move the value we stored into r0 ! 56: (d-move 'unstack 'reg) ! 57: (setq g-locs (cdr g-locs)) ! 58: (decr g-loccnt))) ! 59: ! 60: ! 61: ! 62: ! 63: (defun d-arrayindexcomp (actual formal) ! 64: (if (null (cdr actual)) ! 65: then (car actual) ; always allow one arg ! 66: elseif (eq (length actual) (length formal)) ! 67: then (do ((ac actual (cdr ac)) ! 68: (fo formal (cdr fo)) ! 69: (res)) ! 70: ((null ac) (cons '+ res)) ! 71: (setq res (cons (if (null (cdr fo)) then (car ac) ! 72: else `(* ,(car ac) ,(apply 'times (cdr fo)))) ! 73: res))) ! 74: else (comp-err "Wrong number of subscripts to array " actual)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.