shithub: front

Download patch

ref: d11644834cca4298822d18b89f38c271aa9bb938
parent: 75201c49996de9faed5b74a77964ac9c2fa0dd3d
author: mia soweli <mia@soweli.net>
date: Fri Aug 15 11:48:44 EDT 2025

5[al]: support DMB, DSB, and ISB

--- a/sys/src/cmd/5a/a.y
+++ b/sys/src/cmd/5a/a.y
@@ -19,7 +19,7 @@
 %token	<lval>	LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA
 %token	<lval>	LTYPEB LTYPEC LTYPED LTYPEE LTYPEF
 %token	<lval>	LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK
-%token	<lval>	LTYPEL LTYPEM LTYPEN LTYPEBX
+%token	<lval>	LTYPEL LTYPEM LTYPEN LTYPEBX LTYPEDMB
 %token	<lval>	LCONST LSP LSB LFP LPC
 %token	<lval>	LTYPEX LR LREG LF LFREG LC LCREG LPSR LFCR
 %token	<lval>	LCOND LS LAT
@@ -271,6 +271,14 @@
 	{
 		outcode($1, Always, &nullgen, NREG, &nullgen);
 	}
+
+/*
+ * DMB
+ */
+|	LTYPEDMB imm comma
+	{
+		outcode($1, Always, &$2, NREG, &nullgen);
+	} 
 
 cond:
 	{
--- a/sys/src/cmd/5a/lex.c
+++ b/sys/src/cmd/5a/lex.c
@@ -388,6 +388,10 @@
 
 	"MCR",		LTYPEJ, 0,
 	"MRC",		LTYPEJ, 1,
+
+	"DMB",		LTYPEDMB, ADMB,
+	"DSB",		LTYPEDMB, ADSB,
+	"ISB",		LTYPEDMB, AISB,
 	0
 };
 
--- a/sys/src/cmd/5c/5.out.h
+++ b/sys/src/cmd/5c/5.out.h
@@ -160,6 +160,10 @@
 
 	AROR,
 
+	ADMB,
+	ADSB,
+	AISB,
+
 	ALAST,
 };
 
--- a/sys/src/cmd/5l/asm.c
+++ b/sys/src/cmd/5l/asm.c
@@ -1124,6 +1124,12 @@
 		o1 = 0xf57ff01f;
 		break;
 
+	case 43:	/* dmb */
+		o1 = opirr(p->as);
+		if(p->from.type == D_CONST)
+			o1 |= p->from.offset & 0xF;
+		break;
+
 	case 50:	/* floating point store */
 		v = regoff(&p->to);
 		r = p->to.reg;
@@ -1486,6 +1492,20 @@
 		lputl(o6);
 		break;
 	}
+}
+
+long
+opirr(int a)
+{
+	switch(a) {
+	case ADSB:	return 0xf57ff040;
+	case ADMB:	return 0xf57ff050;
+	case AISB:		return 0xf57ff060;
+	}
+
+	diag("bad irr %d", a);
+	prasm(curp);
+	return 0;
 }
 
 long
--- a/sys/src/cmd/5l/l.h
+++ b/sys/src/cmd/5l/l.h
@@ -363,6 +363,7 @@
 int	ocmp(const void*, const void*);
 long	opirr(int);
 Optab*	oplook(Prog*);
+long	opirr(int);
 long	oprrr(int, int);
 long	opvfprrr(int, int);
 long	olr(long, int, int, int);
--- a/sys/src/cmd/5l/optab.c
+++ b/sys/src/cmd/5l/optab.c
@@ -256,5 +256,7 @@
 	{ AMOVHU,	C_LAUTO,C_NONE, C_REG,		73, 8, REGSP,	LFROM|V4 },
 	{ AMOVHU,	C_LOREG,C_NONE,	C_REG,		73, 8, 0,	LFROM|V4 },
 
+	{ ADMB,		C_LCON,	C_NONE,	C_NONE,		 43, 4, 0 },
+
 	{ AXXX,		C_NONE,	C_NONE,	C_NONE,		 0, 4, 0 },
 };
--- a/sys/src/cmd/5l/span.c
+++ b/sys/src/cmd/5l/span.c
@@ -794,6 +794,11 @@
 			oprange[AMULLU] = oprange[r];
 			oprange[AMULALU] = oprange[r];
 			break;
+
+		case ADMB:
+			oprange[ADSB] = oprange[r];
+			oprange[AISB] = oprange[r];
+			break;
 		}
 	}
 }
--