diff options
author | Mike Pall <mike> | 2013-07-18 08:51:32 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-07-18 08:51:32 +0200 |
commit | ec96d8b494f0fa87cb8a31a38e7c9241f4f414d3 (patch) | |
tree | dfaf4547096266a7990ecc3d1467e9cebb38f7cb /dynasm | |
parent | 9aa5d04137f9ba2f279eb0aebb0a4ba98e6ea2b3 (diff) | |
download | luajit-ec96d8b494f0fa87cb8a31a38e7c9241f4f414d3.tar.gz luajit-ec96d8b494f0fa87cb8a31a38e7c9241f4f414d3.tar.bz2 luajit-ec96d8b494f0fa87cb8a31a38e7c9241f4f414d3.zip |
DynASM/x64: Add VREG support to mov64.
Thanks to Peter Cawley.
Diffstat (limited to 'dynasm')
-rw-r--r-- | dynasm/dasm_x86.lua | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/dynasm/dasm_x86.lua b/dynasm/dasm_x86.lua index 07ddd98d..824c6343 100644 --- a/dynasm/dasm_x86.lua +++ b/dynasm/dasm_x86.lua | |||
@@ -1678,7 +1678,7 @@ if x64 then | |||
1678 | function map_op.mov64_2(params) | 1678 | function map_op.mov64_2(params) |
1679 | if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end | 1679 | if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end |
1680 | if secpos+2 > maxsecpos then wflush() end | 1680 | if secpos+2 > maxsecpos then wflush() end |
1681 | local opcode, op64, sz, rex | 1681 | local opcode, op64, sz, rex, vreg |
1682 | local op64 = match(params[1], "^%[%s*(.-)%s*%]$") | 1682 | local op64 = match(params[1], "^%[%s*(.-)%s*%]$") |
1683 | if op64 then | 1683 | if op64 then |
1684 | local a = parseoperand(params[2]) | 1684 | local a = parseoperand(params[2]) |
@@ -1699,11 +1699,17 @@ if x64 then | |||
1699 | werror("bad operand mode") | 1699 | werror("bad operand mode") |
1700 | end | 1700 | end |
1701 | op64 = params[2] | 1701 | op64 = params[2] |
1702 | opcode = 0xb8 + band(a.reg, 7) -- !x64: no VREG support. | 1702 | if a.reg == -1 then |
1703 | vreg = a.vreg | ||
1704 | opcode = 0xb8 | ||
1705 | else | ||
1706 | opcode = 0xb8 + band(a.reg, 7) | ||
1707 | end | ||
1703 | rex = a.reg > 7 and 9 or 8 | 1708 | rex = a.reg > 7 and 9 or 8 |
1704 | end | 1709 | end |
1705 | end | 1710 | end |
1706 | wputop(sz, opcode, rex) | 1711 | wputop(sz, opcode, rex) |
1712 | if vreg then waction("VREG", vreg); wputxb(0) end | ||
1707 | waction("IMM_D", format("(unsigned int)(%s)", op64)) | 1713 | waction("IMM_D", format("(unsigned int)(%s)", op64)) |
1708 | waction("IMM_D", format("(unsigned int)((%s)>>32)", op64)) | 1714 | waction("IMM_D", format("(unsigned int)((%s)>>32)", op64)) |
1709 | end | 1715 | end |