Skip to content

Commit d3ce2ff

Browse files
authored
add more url's to output of disassembler (#21366)
1 parent 8d90d93 commit d3ce2ff

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

compiler/src/dmd/backend/arm/disasmarm.d

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ void disassemble(uint c) @trusted
265265
const(char)[] s2;
266266
const(char)[] s3;
267267
char[BUFMAX] buf = '\0';
268+
char[BUFMAX] url2buf = '\0';
268269
char[14] rbuf = '\0';
269270

270271
buf[0] = 0;
@@ -489,8 +490,8 @@ void disassemble(uint c) @trusted
489490
ulong imm = decodeNImmrImms(N,immr,imms);
490491
p4 = wordtostring(imm);
491492

492-
uint n = snprintf(buf.ptr, buf.length, "%s_log_imm", p1.ptr);
493-
url2 = buf[0 .. n];
493+
uint n = snprintf(url2buf.ptr, url2buf.length, "%s_log_imm", p1.ptr);
494+
url2 = url2buf[0 .. n];
494495

495496
if (opc == 3 && Rd == 0x1F)
496497
{
@@ -1861,8 +1862,8 @@ void disassemble(uint c) @trusted
18611862
p2 = fregString(rbuf[0 .. 4],"sd h"[size & 1],Rd);
18621863
p3 = fregString(rbuf[4 .. 8],"sd h"[size & 1],Rn);
18631864

1864-
uint n = snprintf(buf.ptr, buf.length, "%s_advsimd_int", p1.ptr);
1865-
url2 = buf[0 .. n];
1865+
uint n = snprintf(url2buf.ptr, url2buf.length, "%s_advsimd_int", p1.ptr);
1866+
url2 = url2buf[0 .. n];
18661867
}
18671868
}
18681869
else
@@ -2128,8 +2129,8 @@ void disassemble(uint c) @trusted
21282129
p2 = rbuf[0 .. n];
21292130
p3 = regString(sf,Rn);
21302131
}
2131-
uint n = snprintf(buf.ptr, buf.length, "%s_float", p1.ptr);
2132-
url2 = buf[0 .. n];
2132+
uint n = snprintf(url2buf.ptr, url2buf.length, "%s_float", p1.ptr);
2133+
url2 = url2buf[0 .. n];
21332134
}
21342135
}
21352136
else
@@ -2238,8 +2239,8 @@ void disassemble(uint c) @trusted
22382239
p3 = fregString(rbuf[4 .. 8],prefix,Rn);
22392240
p4 = fregString(rbuf[8 ..12],prefix,Rm);
22402241

2241-
uint n = snprintf(buf.ptr, buf.length, "%s_float.html", p1.ptr);
2242-
url2 = buf[0 .. n];
2242+
uint n = snprintf(url2buf.ptr, url2buf.length, "%s_float.html", p1.ptr);
2243+
url2 = url2buf[0 .. n];
22432244
}
22442245
}
22452246

@@ -2320,13 +2321,18 @@ void disassemble(uint c) @trusted
23202321
case decode2(0,1,0):
23212322
case decode2(1,1,0):
23222323
case decode2(2,0,0):
2323-
case decode2(2,1,0): p1 = op24 == 0 ? "stnp" : "stp"; break;
2324+
case decode2(2,1,0): p1 = op24 == 0 ? "stnp" : "stp"; goto Lurl2;
23242325

23252326
case decode2(0,0,1):
23262327
case decode2(0,1,1):
23272328
case decode2(1,1,1):
23282329
case decode2(2,0,1):
2329-
case decode2(2,1,1): p1 = op24 == 0 ? "ldnp" : "ldp"; break;
2330+
case decode2(2,1,1): p1 = op24 == 0 ? "ldnp" : "ldp"; goto Lurl2;
2331+
2332+
Lurl2:
2333+
uint n = snprintf(url2buf.ptr, url2buf.length, "%s_gen", p1.ptr);
2334+
url2 = url2buf[0 .. n];
2335+
break;
23302336

23312337
case decode2(1,0,0): if (op24) p1 = "stgp"; break;
23322338
case decode2(1,0,1): if (op24) p1 = "ldpsw"; break;
@@ -2378,6 +2384,7 @@ void disassemble(uint c) @trusted
23782384
uint ldr(uint size, uint VR, uint opc) { return (size << 3) | (VR << 2) | opc; }
23792385

23802386
bool is64 = false;
2387+
const(char)* format = "%s_imm";
23812388
switch (ldr(size, VR, opc))
23822389
{
23832390
case ldr(0,0,0): p1 = "strb"; goto Lldr8; // https://www.scs.stanford.edu/~zyedidia/arm64/strb_imm.html
@@ -2393,11 +2400,11 @@ void disassemble(uint c) @trusted
23932400
case ldr(1,0,1): p1 = "ldrh"; goto Lldr;
23942401
case ldr(1,0,2): p1 = "ldrsh"; goto Lldr64;
23952402
case ldr(1,0,3): p1 = "ldrsh"; goto Lldr;
2396-
case ldr(2,0,0): p1 = "str"; goto Lldr;
2397-
case ldr(2,0,1): p1 = "ldr"; goto Lldr;
2403+
case ldr(2,0,0): p1 = "str"; format = "%s_imm_gen"; goto Lldr;
2404+
case ldr(2,0,1): p1 = "ldr"; format = "%s_imm_gen"; goto Lldr;
23982405
case ldr(2,0,2): p1 = "ldrsw"; goto Lldrsw;
2399-
case ldr(3,0,0): p1 = "str"; goto Lldr64;
2400-
case ldr(3,0,1): p1 = "ldr"; goto Lldr64;
2406+
case ldr(3,0,0): p1 = "str"; format = "%s_imm_gen"; goto Lldr64;
2407+
case ldr(3,0,1): p1 = "ldr"; format = "%s_imm_gen"; goto Lldr64;
24012408
//case ldr(3,0,2): p1 = "prfm";
24022409
Lldrsw:
24032410
p2 = regString(true, Rt);
@@ -2422,15 +2429,22 @@ void disassemble(uint c) @trusted
24222429
case ldr(3,1,0): p1 = "str"; goto LsimdFp;
24232430
case ldr(3,1,1): p1 = "ldr"; goto LsimdFp;
24242431
LsimdFp:
2432+
format = "%s_imm_fpsimd";
24252433
uint shift = size + ((opc & 2) << 1);
24262434
p2 = fregString(buf[0..4], fpPrefix[shift], Rt);
24272435
uint offset = imm12 << shift;
24282436
p3 = eaString(0, cast(ubyte)Rn, offset);
24292437
break;
24302438

24312439
default:
2440+
format = null;
24322441
break;
24332442
}
2443+
if (format)
2444+
{
2445+
uint n = snprintf(url2buf.ptr, url2buf.length, format, p1.ptr);
2446+
url2 = url2buf[0 .. n];
2447+
}
24342448
}
24352449
}
24362450
//printf("%x\n", field(ins, 31, 25));

0 commit comments

Comments
 (0)