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;
}
}
}
--
⑨