From 36f09ee9e6ddb9309f28bcff918fb6a7c60a17b4 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Fri, 20 Dec 2002 06:39:04 +0000 Subject: [PATCH] * mode.scm (mode-sem-mode): New fn. * operand.scm (op:new-mode): Update. mode-name. (op-natural-mode?) New fn. * rtl.scm (hw): Set hw-name,mode-name. plus some comment tweaks --- ChangeLog | 5 +++++ mode.scm | 16 ++++++++++++++++ operand.scm | 9 +++++++++ rtl.scm | 2 ++ semantics.scm | 2 +- types.scm | 3 +++ 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 9fb3d92..5b51f2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2002-12-19 Doug Evans + * mode.scm (mode-sem-mode): New fn. + * operand.scm (op:new-mode): Update. mode-name. + (op-natural-mode?) New fn. + * rtl.scm (hw): Set hw-name,mode-name. + Back out sim*.scm changes of 2001-04-02 Ben Elliston Instead do: * sim-decode.scm (-gen-decode-insn-globals): Use @PREFIX@_INSN__MAX diff --git a/mode.scm b/mode.scm index 5e0c69e..7fdbe5d 100644 --- a/mode.scm +++ b/mode.scm @@ -286,6 +286,22 @@ (mode:lookup (mode-real-name m)) ) +; Return the version of MODE to use in semantic expressions. +; This (essentially) converts aliases to their real value and then uses +; mode:sem-mode. The implementation is the opposite but the effect is the +; same. +; ??? Less efficient than it should be. One improvement would be to +; disallow unsigned modes from being aliased and set sem-mode for aliased +; modes. + +(define (mode-sem-mode m) + (let* ((m1 (mode:lookup m)) + (sm (mode:sem-mode m1))) + (if sm + sm + (mode-real-mode m1))) +) + ; Return #t if mode M1-NAME is bigger than mode M2-NAME. (define (mode-bigger? m1-name m2-name) diff --git a/operand.scm b/operand.scm index a3faf1d..df70133 100644 --- a/operand.scm +++ b/operand.scm @@ -261,6 +261,7 @@ ; Mode support. ; Create a copy of operand OP in mode NEW-MODE-NAME. +; NOTE: Even if the mode isn't changing this creates a copy. ; If OP has been subclassed the result must contain the complete class ; (e.g. the behaviour of `object-copy-top'). @@ -282,6 +283,7 @@ (if (not new-mode) (error "op:new-mode: internal error, bad mode" new-mode-name)) + (elm-xset! result 'mode-name new-mode-name) (elm-xset! result 'mode new-mode) result) (parse-error "op:new-mode" @@ -290,6 +292,13 @@ "'") new-mode-name)))) ) + +; Return #t if operand OP references its h/w element in its natural mode. + +(define (op-natural-mode? op) + (or (eq? (op:mode-name op) 'DFLT) + (mode-compatible? 'samesize (op:mode op) (hw-default-mode (op:type op)))) +) ; Ifield support. diff --git a/rtl.scm b/rtl.scm index d7d0025..7834ed9 100644 --- a/rtl.scm +++ b/rtl.scm @@ -2029,7 +2029,9 @@ (if (not (hw-mode-ok? hw (obj:name mode) (elm-xget result 'index))) (parse-error "hw" "invalid mode for hardware" mode-name)) + (elm-xset! result 'hw-name hw-name) (elm-xset! result 'type hw) + (elm-xset! result 'mode-name mode-name) (elm-xset! result 'mode mode) (op:set-pretty-sem-name! result hw-name) diff --git a/semantics.scm b/semantics.scm index 1159587..e614892 100644 --- a/semantics.scm +++ b/semantics.scm @@ -260,7 +260,7 @@ (else #f)) ) -; Simplify an rtl expresion. +; Simplify an rtl expression. ; EXPR must be in source form. ; The result is a possibly simplified EXPR, still in source form. ; diff --git a/types.scm b/types.scm index eb8d2b5..27bf707 100644 --- a/types.scm +++ b/types.scm @@ -239,6 +239,9 @@ ) ; Return a boolean indicating if two bitranges overlap. +; +; lsb0? = #t: 31 ... 0 +; lsb0? = #f: 0 ... 31 (define (bitrange-overlap? start1 length1 start2 length2 lsb0?) (if lsb0? -- 2.43.5