ソースを参照

fixed RolH\RorH with shift count >31 ( thanks Oleg N. Cher )

git-svn-id: https://svn-dept.inf.ethz.ch/svn/lecturers/a2/trunk@8711 8c9fc860-2736-0410-a75d-ab315db34111
infsvn.durmanov 6 年 前
コミット
c25a49a332
1 ファイル変更9 行追加13 行削除
  1. 9 13
      source/I386.Builtins.Mod

+ 9 - 13
source/I386.Builtins.Mod

@@ -315,15 +315,13 @@ CODE{SYSTEM.i386}
 	; EBX (initially=EAX) -> EDX -> EAX
 	; Shift EDX:EAX right, shift count in ECX (count
 	; applied modulo 64).
-	MOV EBX,EAX
-	SHRD EAX,EDX,CL		; First apply shift count.
-	SHRD EDX,EBX,CL 		; mod 32 to EDX:EAX
-	TEST ECX,32 			; Need to shift by another 32?
-	JZ rshiftdone 			; No, done.
+	TEST ECX,32 			; Need to shift by 32?
+	JZ rest					; No.
+	XCHG EDX,EAX
+rest:
 	MOV EBX,EAX
 	SHRD EAX,EDX,CL
 	SHRD EDX,EBX,CL
-	rshiftdone:
 	POP	ECX
 END RorH;
 
@@ -337,15 +335,13 @@ CODE{SYSTEM.i386}
 	; EDX <- EAX <- EBX (intially=EDX)
 	; Shift EDX:EAX left, shift count in ECX (count
 	; applied modulo 64).
-	MOV EBX,EDX
-	SHLD EDX,EAX,CL		; First apply shift count.
-	SHLD EAX, EBX, CL
-	TEST ECX,32 			; Need to shift by another 32?
-	JZ lshiftdone 			; No, done.
+	TEST ECX,32				; Need to shift by 32?
+	JZ rest					; No.
+	XCHG EDX,EAX
+rest:	
 	MOV EBX,EDX
 	SHLD EDX,EAX,CL
-	SHLD EAX, EBX, CL
-	lshiftdone:
+	SHLD EAX,EBX,CL
 	POP	ECX
 END RolH;