ref: 0b30fe7e72e1b3ce70f2119dac5ab04cc4faf696
parent: e0a70e7f9c30c06d11c9a9c2175f15bf47decc10
	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;
}
}
}
--
⑨