[patch] xstormy16: fix add/sub bug

DJ Delorie <[email protected]>
Newsgroups gmane.comp.emulators.sid.devel,gmane.comp.tools.cgen.devel
Message-ID <[email protected]>
The psw needs to be set last, but its value depends on the inputs
*before* they are possibly changed by setting the destination, so...

Index: cgen/ChangeLog
2002-03-05  DJ Delorie  <[email protected]>

	* cpu/xstormy16.cpu (set-psw-add): Use temporaries to prevent
	prematurely overwriting needed inputs.
	(set-psw-sub): Likewise.
  
Index: sid/component/cgen-cpu/xstormy16/ChangeLog
2002-03-05  DJ Delorie  <[email protected]>

	* xstormy16-sem.cxx: Regenerate.

Index: cgen/cpu/xstormy16.cpu
===================================================================
RCS file: /cvs/src/src/cgen/cpu/xstormy16.cpu,v
retrieving revision 1.6
diff -p -2 -r1.6  cgen/cpu/xstormy16.cpu
*** cgen/cpu/xstormy16.cpu	18 Feb 2003 22:57:08 -0000	1.6
--- cgen/cpu/xstormy16.cpu	6 Mar 2003 00:30:17 -0000
***************
*** 425,438 ****
  ; The all-purpose addition operation.
  (define-pmacro (set-psw-add Rd index a b c)
!   (sequence ((HI value))
      (set value (addc a b c))
      (set (reg HI h-gr index) value)
!     (set psw (or (or (and psw #x0F80)
! 		     (basic-psw value))
! 		 (or (or (sll HI (add-oflag HI a b c) 4)
! 			 (sll HI (add-cflag HI a b c) 2))
! 		     (or (and (srl HI (addc HI (and a #xF) (and b #xF) c) 
! 				   1) #x8)
! 			 (sll index 12)))))))
  
  ; Set the PSW for a subtraction of a-b into Rd, but don't actually
--- 425,440 ----
  ; The all-purpose addition operation.
  (define-pmacro (set-psw-add Rd index a b c)
!   (sequence ((HI value) (HI newpsw))
      (set value (addc a b c))
+     (set newpsw (or (or (and psw #x0F80)
+ 			(basic-psw value))
+ 		    (or (or (sll HI (add-oflag HI a b c) 4)
+ 			    (sll HI (add-cflag HI a b c) 2))
+ 			(or (and (srl HI (addc HI (and a #xF) (and b #xF) c) 
+ 				      1) #x8)
+ 			    (sll index 12)))))
      (set (reg HI h-gr index) value)
!     (set psw newpsw)
!     ))
  
  ; Set the PSW for a subtraction of a-b into Rd, but don't actually
***************
*** 453,460 ****
  ; just using a carry for both).
  (define-pmacro (set-psw-sub Rd index a b c)
!   (sequence ((HI value))
      (set value (subc a b c))
!     (set (reg HI h-gr index) value)
!     (set psw (or (or (and psw #x0F80)
  		     (basic-psw value))
  		 (or (or (sll HI (sub-oflag HI a b c) 4)
--- 455,461 ----
  ; just using a carry for both).
  (define-pmacro (set-psw-sub Rd index a b c)
!   (sequence ((HI value) (HI newpsw))
      (set value (subc a b c))
!     (set newpsw (or (or (and psw #x0F80)
  		     (basic-psw value))
  		 (or (or (sll HI (sub-oflag HI a b c) 4)
***************
*** 462,466 ****
  		     (or (and (srl HI (subc HI (and a #xF) (and b #xF) c)
  				   1) #x8)
! 			 (sll index 12)))))))
  
  ; A 17-bit rotate-left operation
--- 463,470 ----
  		     (or (and (srl HI (subc HI (and a #xF) (and b #xF) c)
  				   1) #x8)
! 			 (sll index 12)))))
!     (set (reg HI h-gr index) value)
!     (set psw newpsw)
!     ))
  
  ; A 17-bit rotate-left operation
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.