Skip to content

Commit ddba2a7

Browse files
committed
Better support for 64-bit .aword constants
1 parent 0616219 commit ddba2a7

File tree

2 files changed

+52
-12
lines changed

2 files changed

+52
-12
lines changed

ext/opcache/jit/dynasm/dasm_x86.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
/* Action definitions. DASM_STOP must be 255. */
1919
enum {
20-
DASM_DISP = 232,
20+
DASM_DISP = 231,
2121
DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB,
2222
DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC,
23-
DASM_IMM_LG, DASM_IMM_PC, DASM_IMM_PC64, DASM_LABEL_LG, DASM_LABEL_PC,
23+
DASM_IMM_LG, DASM_IMM_LG64, DASM_IMM_PC, DASM_IMM_PC64, DASM_LABEL_LG, DASM_LABEL_PC,
2424
DASM_ALIGN, DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_SECTION, DASM_STOP
2525
};
2626

@@ -220,6 +220,7 @@ void dasm_put(Dst_DECL, int start, ...)
220220
} else {
221221
int *pl, n;
222222
switch (action) {
223+
case DASM_IMM_LG64: ofs += 4;
223224
case DASM_REL_LG:
224225
case DASM_IMM_LG:
225226
n = *p++; pl = D->lglabels + n;
@@ -333,7 +334,7 @@ int dasm_link(Dst_DECL, size_t *szp)
333334
pos += 2;
334335
break;
335336
}
336-
case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++;
337+
case DASM_SPACE: case DASM_IMM_LG: case DASM_IMM_LG64: case DASM_VREG: p++;
337338
case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W:
338339
case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB:
339340
case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: case DASM_IMM_PC64:
@@ -447,6 +448,11 @@ int dasm_encode(Dst_DECL, void *buffer)
447448
n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base);
448449
goto wd;
449450
}
451+
case DASM_IMM_LG64: {
452+
p++;
453+
if (n < 0)
454+
dasmq((ptrdiff_t)D->globals[-n]);
455+
}
450456
case DASM_IMM_PC64: {
451457
int *pb = DASM_POS2PTR(D, n);
452458
dasmq(*pb < 0 ? pb[1] : (*pb + (ptrdiff_t)base));

ext/opcache/jit/dynasm/dasm_x86.lua

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ local action_names = {
4646
"SETLABEL", "REL_A",
4747
-- action arg (1 byte) or int arg, 2 buffer pos (link, offset):
4848
"REL_LG", "REL_PC",
49-
-- action arg (1 byte) or int arg, 1 buffer pos (link):
50-
"IMM_LG", "IMM_PC", "IMM_PC64",
49+
-- action arg (1 byte) or ptrdiff_t arg, 1 buffer pos (link):
50+
"IMM_LG", "IMM_LG64", "IMM_PC", "IMM_PC64",
5151
-- action arg (1 byte) or int arg, 1 buffer pos (offset):
5252
"LABEL_LG", "LABEL_PC",
5353
-- action arg (1 byte), 1 buffer pos (offset):
@@ -434,11 +434,17 @@ local function wputlabel(aprefix, imm, num)
434434
end
435435
wputxb(imm)
436436
else
437-
if aprefix == "IMM_" and x64 then
438-
waction("IMM_PC64", imm, num)
439-
else
440-
waction(aprefix.."PC", imm, num)
441-
end
437+
waction(aprefix.."PC", imm, num)
438+
end
439+
end
440+
441+
-- Put action for label arg (IMM_LG64, IMM_PC64, REL_LG, REL_PC).
442+
local function wputlabel64(aprefix, imm, num)
443+
if type(imm) == "number" then
444+
waction("IMM_LG64", nil, num);
445+
wputxb(imm)
446+
else
447+
waction("IMM_PC64", imm, num)
442448
end
443449
end
444450

@@ -473,6 +479,26 @@ local function wputwarg(n)
473479
else waction("IMM_W", n) end
474480
end
475481

482+
-- Put signed or unsigned qword or arg.
483+
local function wputqarg(n)
484+
local tn = type(n)
485+
if tn == "number" then
486+
wputb(band(n, 255))
487+
wputb(band(shr(n, 8), 255))
488+
wputb(band(shr(n, 16), 255))
489+
wputb(band(shr(n, 24), 255))
490+
wputb(band(shr(n, 32), 255))
491+
wputb(band(shr(n, 40), 255))
492+
wputb(band(shr(n, 48), 255))
493+
wputb(shr(n, 56))
494+
elseif tn == "table" then
495+
wputlabel64("IMM_", n[1], 1)
496+
else
497+
waction("IMM_D", format("(unsigned int)(%s)", n))
498+
waction("IMM_D", format("(unsigned int)((%s)>>32)", n))
499+
end
500+
end
501+
476502
-- Put signed or unsigned dword or arg.
477503
local function wputdarg(n)
478504
local tn = type(n)
@@ -2069,9 +2095,17 @@ local function op_data(params)
20692095
werror("bad mode or size in `"..p.."'")
20702096
end
20712097
if a.mode == "iJ" then
2072-
wputlabel("IMM_", a.imm, 1)
2098+
if sz == 'q' then
2099+
wputlabel64("IMM_", a.imm, 1)
2100+
else
2101+
wputlabel("IMM_", a.imm, 1)
2102+
end
20732103
else
2074-
wputszarg(sz, a.imm)
2104+
if sz == 'q' then
2105+
wputqarg(a.imm)
2106+
else
2107+
wputszarg(sz, a.imm)
2108+
end
20752109
end
20762110
if secpos+2 > maxsecpos then wflush() end
20772111
end

0 commit comments

Comments
 (0)