Module Name:    src
Committed By:   uwe
Date:           Mon Sep 11 12:00:45 UTC 2023

Modified Files:
        src/lib/libarch/sparc/v8: sparc_v8.S

Log Message:
sparc_v8.S: fix v8 .mul/.umul versions to conform to psABI

Both .mul and .umul are defined to return the most significant 32 bits
of the result in %o1, but v8 multiplication instructions put them in
%y.  Move them to %o1.  Nothing in the gcc generated code depends on
this, but hand-written assembly can rely on this and e.g. Self does.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/lib/libarch/sparc/v8/sparc_v8.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libarch/sparc/v8/sparc_v8.S
diff -u src/lib/libarch/sparc/v8/sparc_v8.S:1.2 src/lib/libarch/sparc/v8/sparc_v8.S:1.3
--- src/lib/libarch/sparc/v8/sparc_v8.S:1.2	Tue Sep 22 13:27:13 2015
+++ src/lib/libarch/sparc/v8/sparc_v8.S	Mon Sep 11 12:00:45 2023
@@ -6,28 +6,45 @@
 	.file	"sparc_v8.S"
 .section	".text"
 
-/*--- .umul ---*/
+
+/*
+ * unsigned .umul(unsigned a, unsigned b)
+ *
+ *     This function computes a * b with unsigned integer
+ *     multiplication.  When .umul returns, the caller's register %o0
+ *     contains the least significant 32 bits of the 64-bit result;
+ *     register %o1 holds the most significant 32 bits of the result.
+ *     Upon return, the integer condition codes and registers %o2
+ *     through %o5 have unspecified values.
+ */
 	.align 4
 	.global .umul
 	.type	 .umul,@function
-
 .umul:
-	!#PROLOGUE# 0
-	!#PROLOGUE# 1
+	umul	%o0, %o1, %o0
 	retl
-	 umul	%o0, %o1, %o0
+	 rd	%y, %o1
 .LLfe1:
 	.size	 .umul,.LLfe1-.umul
 
-/*--- .mul ---*/
+
+/*
+ * int .mul(int a, int b)
+ *
+ *     This function computes a * b with signed integer
+ *     multiplication.  When .mul returns, the caller's register %o0
+ *     contains the least significant 32 bits of the 64-bit result;
+ *     register %o1 holds the most significant 32 bits of the result.
+ *     Upon return, the integer condition codes and registers %o2
+ *     through %o5 have unspecified values.
+ */
 	.align 4
 	.global .mul
 	.type	 .mul,@function
 .mul:
-	!#PROLOGUE# 0
-	!#PROLOGUE# 1
+	smul	%o0, %o1, %o0
 	retl
-	 smul	%o0, %o1, %o0
+	 rd	%y, %o1
 .LLfe2:
 	.size	 .mul,.LLfe2-.mul
 

Reply via email to