shithub: front

Download patch

ref: bf9c8472bf7e1218c420a2fb81b0abddb8221077
parent: d88192a6a501f15178d4c5f8cad4043968e38067
author: mia soweli <mia@soweli.net>
date: Mon Jul 28 17:57:42 EDT 2025

7[al]: implement atomic register loads properly

these were not correct. 7l knew the opcodes, but they
were not in the optab and were not encoded correctly.
STLR and STLXR also have different arity since STLXR also
returns a status.

i have also dropped atomic load and store register pair
operations since they are wrong and we would need to
deal with the four operand STLXP.

--- a/sys/src/cmd/7a/lex.c
+++ b/sys/src/cmd/7a/lex.c
@@ -484,11 +484,10 @@
 	"SMSUBL",	LTYPEM,	ASMSUBL,
 	"SMULH",	LTYPE1,	ASMULH,
 	"SMULL",	LTYPE1,	ASMULL,
-	"STLR",	LSTXR,	ASTLR,
-	"STLRB",	LSTXR,	ASTLRB,
-	"STLRH",	LSTXR,	ASTLRH,
-	"STLRW",	LSTXR,	ASTLRW,
-	"STLXP",	LSTXR,	ASTLXP,
+	"STLR",	LTYPE3,	ASTLR,
+	"STLRB",	LTYPE3,	ASTLRB,
+	"STLRH",	LTYPE3,	ASTLRH,
+	"STLRW",	LTYPE3,	ASTLRW,
 	"STLXR",	LSTXR,	ASTLXR,
 	"STLXRB",	LSTXR,	ASTLXRB,
 	"STLXRH",	LSTXR,	ASTLXRH,
@@ -496,8 +495,6 @@
 	"STXR",	LSTXR,	ASTXR,
 	"STXRB",	LSTXR,	ASTXRB,
 	"STXRH",	LSTXR,	ASTXRH,
-	"STXP",	LSTXR,	ASTXP,
-	"STXPW",	LSTXR,	ASTXPW,
 	"STXRW",	LSTXR,	ASTXRW,
 	"SUB",	LTYPE1,	ASUB,
 	"SUBS",	LTYPE1,	ASUBS,
@@ -549,11 +546,6 @@
 	"LDARB",	LTYPE3,	ALDARB,
 	"LDARH",	LTYPE3,	ALDARH,
 	"LDARW",	LTYPE3,	ALDARW,
-
-	"LDXP",	LTYPE3,	ALDXP,
-	"LDXPW",	LTYPE3,	ALDXPW,
-	"LDAXP",	LTYPE3,	ALDAXP,
-	"LDAXPW",	LTYPE3,	ALDAXPW,
 
 	"LDAXR",	LTYPE3,	ALDAXR,
 	"LDAXRB",	LTYPE3,	ALDAXRB,
--- a/sys/src/cmd/7l/asmout.c
+++ b/sys/src/cmd/7l/asmout.c
@@ -805,12 +805,12 @@
 
 	case 59:	/* stxr */
 		o1 = opstore(p->as);
-		o1 |= p->reg << 16;
-		if(p->from3.type != D_NONE)
-			o1 |= p->from3.reg<<10;
-		else
-			o1 |= 0x1F<<10;
+		o1 |= 0x1F<<10;
 		o1 |= p->to.reg<<5;
+		if(p->reg != NREG)
+			o1 |= p->reg<<16;
+		else
+			o1 |= 0x1F<<16;
 		o1 |= p->from.reg;
 		break;
 
--- a/sys/src/cmd/7l/optab.c
+++ b/sys/src/cmd/7l/optab.c
@@ -463,15 +463,13 @@
 	{ ADMB,		C_LCON,	C_NONE, 	C_NONE,		51, 4, 0 },
 	{ AHINT,		C_LCON,	C_NONE,	C_NONE,		52, 4, 0 },
 
+	{ ALDAR,		C_ZOREG,	C_NONE,	C_REG,		58, 4, 0 },
 	{ ALDXR,		C_ZOREG,	C_NONE,	C_REG,		58, 4, 0 },
 	{ ALDAXR,		C_ZOREG,	C_NONE, C_REG,		58, 4, 0 },
-	{ ALDXP,		C_ZOREG,	C_REG,	C_REG,		58, 4, 0 },
-	{ ALDAXP,		C_ZOREG,	C_REG,	C_REG,		58, 4, 0 },
 
+	{ ASTLR,		C_REG,	C_NONE,	C_ZOREG,		59, 4, 0 },
 	{ ASTXR,		C_REG,	C_REG,	C_ZOREG,		59, 4, 0 },
 	{ ASTLXR,		C_REG,	C_REG,	C_ZOREG,		59, 4, 0 },
-	{ ASTXP,		C_REG,	C_REG,	C_ZOREG,		59, 4, 0 },
-	{ ASTLXP,		C_REG,	C_REG,	C_ZOREG,		59, 4, 0 },
 
 	{ AAESD,	C_VREG,	C_NONE,	C_VREG,	29, 4, 0 },
 	{ ASHA1C,	C_VREG,	C_REG,	C_VREG,	1, 4, 0 },
--- a/sys/src/cmd/7l/span.c
+++ b/sys/src/cmd/7l/span.c
@@ -1348,6 +1348,11 @@
 		case AMSR:
 			break;
 
+		case ALDAR:
+			oprange[ALDARW] = t;
+			oprange[ALDARH] = t;
+			oprange[ALDARB] = t;
+			break;
 		case ALDXR:
 			oprange[ALDXRW] = t;
 			oprange[ALDXRH] = t;
@@ -1363,6 +1368,11 @@
 			break;
 		case ALDAXP:
 			oprange[ALDAXPW] = t;
+			break;
+		case ASTLR:
+			oprange[ASTLRW] = t;
+			oprange[ASTLRH] = t;
+			oprange[ASTLRB] = t;
 			break;
 		case ASTXR:
 			oprange[ASTXRW] = t;
--