Add x87 instructions.
Bug: 276787675
Test: berberis_host_tests/berberis_host_test
Change-Id: I602f8f0d5ca5f5d1988517a429fcdfd787d5268a
diff --git a/assembler/asm_defs.py b/assembler/asm_defs.py
index 3d7da03..2e0e420 100644
--- a/assembler/asm_defs.py
+++ b/assembler/asm_defs.py
@@ -116,7 +116,7 @@
# Operands of this type are NOT passed to assembler
def is_implicit_reg(arg_type):
return arg_type in ('RAX', 'EAX', 'AX', 'AL',
- 'RCX', 'ECX', 'CL', 'ST',
+ 'RCX', 'ECX', 'CL', 'ST', 'ST1',
'RDX', 'EDX', 'DX', 'CC',
'RBX', 'EBX', 'BX', 'SW',
'RDI', 'RSI', 'RSP', 'FLAGS')
diff --git a/assembler/gen_asm_tests_x86.py b/assembler/gen_asm_tests_x86.py
index eb047fd..4f643c9 100644
--- a/assembler/gen_asm_tests_x86.py
+++ b/assembler/gen_asm_tests_x86.py
@@ -218,7 +218,7 @@
FIXED_REGISTER_CLASSES = (
'AL', 'AX', 'EAX', 'RAX',
- 'CL', 'ECX', 'RCX', 'ST',
+ 'CL', 'ECX', 'RCX', 'ST', 'ST1',
'DX', 'EDX', 'RDX', 'CC',
'BX', 'EBX', 'RBX', 'SW',
'EBP', 'RSP', 'FLAGS'
@@ -393,6 +393,12 @@
if insn_name[0:4] == 'LOCK':
# TODO(b/161986409): replace '\n' with ' ' when clang would be fixed.
fixed_name = '%s\n%s' % (insn_name[0:4], insn_name[4:])
+ fixed_name = {
+ # GNU disassembler accepts these instructions, but not Clang assembler.
+ 'FNDISI': '.byte 0xdb, 0xe1',
+ 'FNENI': '.byte 0xdb, 0xe0',
+ 'FNSETPM': '.byte 0xdb, 0xe4',
+ }.get(fixed_name, fixed_name)
if label_present:
print('.p2align 5, 0x90', file=file)
print('0:', file=file)
diff --git a/assembler/instructions/insn_def_x86.json b/assembler/instructions/insn_def_x86.json
index 2950c03..51b86c7 100644
--- a/assembler/instructions/insn_def_x86.json
+++ b/assembler/instructions/insn_def_x86.json
@@ -957,7 +957,34 @@
},
{
"encodings": {
- "FaddFromSt": { "opcodes": [ "Dc", "0" ] }
+ "F2xm1": { "opcodes": [ "D9", "F0" ] },
+ "Fabs": { "opcodes": [ "D9", "E1" ] },
+ "Fchs": { "opcodes": [ "D9", "E0" ] },
+ "Fcos": { "opcodes": [ "D9", "FF" ] },
+ "Frndint": { "opcodes": [ "D9", "FC" ] },
+ "Fscale": { "opcodes": [ "D9", "FD" ] },
+ "Fsin": { "opcodes": [ "D9", "FE" ] },
+ "Fsqrt": { "opcodes": [ "D9", "FA" ] },
+ "Ftst": { "opcodes": [ "D9", "E4" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" }
+ ]
+ },
+ {
+ "encodings": {
+ "FaddFromSt": { "opcodes": [ "DC", "0" ] },
+ "FaddpFromSt": { "opcodes": [ "DE", "0" ] },
+ "FdivFromSt": { "opcodes": [ "DC", "6" ] },
+ "FdivpFromSt": { "opcodes": [ "DE", "6" ] },
+ "FdivrFromSt": { "opcodes": [ "DC", "7" ] },
+ "FdivrpFromSt": { "opcodes": [ "DE", "7" ] },
+ "FmulFromSt": { "opcodes": [ "DC", "1" ] },
+ "FmulpFromSt": { "opcodes": [ "DE", "1" ] },
+ "FsubFromSt": { "opcodes": [ "DC", "4" ] },
+ "FsubpFromSt": { "opcodes": [ "DE", "4" ] },
+ "FsubrFromSt": { "opcodes": [ "DC", "5" ] },
+ "FsubrpFromSt": { "opcodes": [ "DE", "5" ] }
},
"args": [
{ "class": "RegX87", "usage": "use_def" },
@@ -966,7 +993,12 @@
},
{
"encodings": {
- "FaddToSt": { "opcodes": [ "D8", "0" ] }
+ "FaddToSt": { "opcodes": [ "D8", "0" ] },
+ "FdivToSt": { "opcodes": [ "D8", "6" ] },
+ "FdivrToSt": { "opcodes": [ "D8", "7" ] },
+ "FmulToSt": { "opcodes": [ "D8", "1" ] },
+ "FsubToSt": { "opcodes": [ "D8", "4" ] },
+ "FsubrToSt": { "opcodes": [ "D8", "5" ] }
},
"args": [
{ "class": "ST", "usage": "use_def" },
@@ -975,7 +1007,81 @@
},
{
"encodings": {
- "Fcom": { "opcodes": [ "D8", "2" ] }
+ "Faddl": { "opcodes": [ "DC", "0" ] },
+ "Fdivl": { "opcodes": [ "DC", "6" ] },
+ "Fdivrl": { "opcodes": [ "DC", "7" ] },
+ "Fmull": { "opcodes": [ "DC", "1" ] },
+ "Fsubl": { "opcodes": [ "DC", "4" ] },
+ "Fsubrl": { "opcodes": [ "DC", "5" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "MemX8764", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fadds": { "opcodes": [ "D8", "0" ] },
+ "Fdivrs": { "opcodes": [ "D8", "7" ] },
+ "Fdivs": { "opcodes": [ "D8", "6" ] },
+ "Fiaddl": { "opcodes": [ "DA", "0" ] },
+ "Fidivl": { "opcodes": [ "DA", "6" ] },
+ "Fidivrl": { "opcodes": [ "DA", "7" ] },
+ "Fimull": { "opcodes": [ "DA", "1" ] },
+ "Fisubl": { "opcodes": [ "DA", "4" ] },
+ "Fisubrl": { "opcodes": [ "DA", "5" ] },
+ "Fmuls": { "opcodes": [ "D8", "1" ] },
+ "Fsubrs": { "opcodes": [ "D8", "5" ] },
+ "Fsubs": { "opcodes": [ "D8", "4" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "MemX8732", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fbld": { "opcodes": [ "DF", "4" ] },
+ "Fldt": { "opcodes": [ "DB", "5" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "def" },
+ { "class": "MemX8780", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fbstp": { "opcodes": [ "DF", "6" ] },
+ "Fstpt": { "opcodes": [ "DB", "7" ] }
+ },
+ "args": [
+ { "class": "MemX8780", "usage": "def" },
+ { "class": "ST", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "FcmovbToSt": { "opcodes": [ "DA", "0" ] },
+ "FcmovbeToSt": { "opcodes": [ "DA", "2" ] },
+ "FcmoveToSt": { "opcodes": [ "DA", "1" ] },
+ "FcmovnbToSt": { "opcodes": [ "DB", "0" ] },
+ "FcmovnbeToSt": { "opcodes": [ "DB", "2" ] },
+ "FcmovneToSt": { "opcodes": [ "DB", "1" ] },
+ "FcmovnuToSt": { "opcodes": [ "DB", "3" ] },
+ "FcmovuToSt": { "opcodes": [ "DA", "3" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "RegX87", "usage": "use" },
+ { "class": "FLAGS", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fcom": { "opcodes": [ "D8", "2" ] },
+ "Fcomp": { "opcodes": [ "D8", "3" ] },
+ "Fucom": { "opcodes": [ "DD", "4" ] },
+ "Fucomp": { "opcodes": [ "DD", "5" ] }
},
"args": [
{ "class": "ST", "usage": "use" },
@@ -985,6 +1091,101 @@
},
{
"encodings": {
+ "Fcomi": { "opcodes": [ "DB", "6" ] },
+ "Fcomip": { "opcodes": [ "DF", "6" ] },
+ "Fucomi": { "opcodes": [ "DB", "5" ] },
+ "Fucomip": { "opcodes": [ "DF", "5" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "RegX87", "usage": "use" },
+ { "class": "FLAGS", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fcoml": { "opcodes": [ "DC", "2" ] },
+ "Fcompl": { "opcodes": [ "DC", "3" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "MemX8764", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fcompp": { "opcodes": [ "DE", "D9" ] },
+ "Fucompp": { "opcodes": [ "DA", "E9" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "ST1", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fcomps": { "opcodes": [ "D8", "3" ] },
+ "Fcoms": { "opcodes": [ "D8", "2" ] },
+ "Ficoml": { "opcodes": [ "DA", "2" ] },
+ "Ficompl": { "opcodes": [ "DA", "3" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "MemX8732", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fdecstp": { "opcodes": [ "D9", "F6" ] },
+ "Fincstp": { "opcodes": [ "D9", "F7" ] },
+ "Fnop": { "opcodes": [ "D9", "D0" ] },
+ "Fwait": { "opcodes": [ "9B" ] },
+ "Int3": { "opcodes": [ "CC" ] },
+ "Mfence": { "opcodes": [ "0F", "AE", "F0" ] },
+ "Nop": { "opcodes": [ "90" ] },
+ "UD2": { "opcodes": [ "0F", "0B" ] },
+ "Wait": { "opcodes": [ "9B" ] }
+ },
+ "args": []
+ },
+ {
+ "encodings": {
+ "Ffree": { "opcodes": [ "DD", "0" ] }
+ },
+ "args": [
+ { "class": "RegX87", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fiadds": { "opcodes": [ "DE", "0" ] },
+ "Fidivrs": { "opcodes": [ "DE", "7" ] },
+ "Fidivs": { "opcodes": [ "DE", "6" ] },
+ "Fimuls": { "opcodes": [ "DE", "1" ] },
+ "Fisubrs": { "opcodes": [ "DE", "5" ] },
+ "Fisubs": { "opcodes": [ "DE", "4" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "MemX8716", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Ficomps": { "opcodes": [ "DE", "3" ] },
+ "Ficoms": { "opcodes": [ "DE", "2" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "MemX8716", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
"Fildl": { "opcodes": [ "DB", "0" ] },
"Flds": { "opcodes": [ "D9", "0" ] }
},
@@ -1009,13 +1210,14 @@
},
"args": [
{ "class": "ST", "usage": "def" },
- { "class": "MemX8732", "usage": "use" }
+ { "class": "MemX8716", "usage": "use" }
]
},
{
"encodings": {
"Fistl": { "opcodes": [ "DB", "2" ] },
"Fistpl": { "opcodes": [ "DB", "3" ] },
+ "Fisttpl": { "feature": "SSE3", "opcodes": [ "DB", "1" ] },
"Fstps": { "opcodes": [ "D9", "3" ] },
"Fsts": { "opcodes": [ "D9", "2" ] }
},
@@ -1027,6 +1229,7 @@
{
"encodings": {
"Fistpll": { "opcodes": [ "DF", "7" ] },
+ "Fisttpll": { "feature": "SSE3", "opcodes": [ "DD", "1" ] },
"Fstl": { "opcodes": [ "DD", "2" ] },
"Fstpl": { "opcodes": [ "DD", "3" ] }
},
@@ -1037,6 +1240,40 @@
},
{
"encodings": {
+ "Fistps": { "opcodes": [ "DF", "3" ] },
+ "Fists": { "opcodes": [ "DF", "2" ] },
+ "Fisttps": { "feature": "SSE3", "opcodes": [ "DF", "1" ] }
+ },
+ "args": [
+ { "class": "MemX8716", "usage": "def" },
+ { "class": "ST", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fld1": { "opcodes": [ "D9", "E8" ] },
+ "Fldl2e": { "opcodes": [ "D9", "EA" ] },
+ "Fldl2t": { "opcodes": [ "D9", "E9" ] },
+ "Fldlg2": { "opcodes": [ "D9", "EC" ] },
+ "Fldln2": { "opcodes": [ "D9", "ED" ] },
+ "Fldpi": { "opcodes": [ "D9", "EB" ] },
+ "Fldz": { "opcodes": [ "D9", "EE" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fld": { "opcodes": [ "D9", "0" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "def" },
+ { "class": "RegX87", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
"Fldcw": { "opcodes": [ "D9", "5" ] }
},
"args": [
@@ -1046,6 +1283,40 @@
},
{
"encodings": {
+ "Fldenv": { "opcodes": [ "D9", "4" ] },
+ "Frstor": { "opcodes": [ "DD", "4" ] },
+ "Fxrstor": { "opcodes": [ "0F", "AE", "1" ] }
+ },
+ "args": [
+ { "class": "MemX87", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fnclex": { "opcodes": [ "DB", "E2" ] },
+ "Fndisi": { "opcodes": [ "DB", "E1" ] },
+ "Fneni": { "opcodes": [ "DB", "E0" ] },
+ "Fninit": { "opcodes": [ "DB", "E3" ] },
+ "Fnsetpm": { "opcodes": [ "DB", "E4" ] }
+ },
+ "args": [
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fnsave": { "opcodes": [ "DD", "6" ] },
+ "Fnstenv": { "opcodes": [ "D9", "6" ] },
+ "Fxsave": { "opcodes": [ "0F", "AE", "0" ] }
+ },
+ "args": [
+ { "class": "CC", "usage": "def" },
+ { "class": "MemX87", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
"Fnstcw": { "opcodes": [ "D9", "7" ] }
},
"args": [
@@ -1073,6 +1344,58 @@
},
{
"encodings": {
+ "Fpatan": { "opcodes": [ "D9", "F3" ] },
+ "Fprem": { "opcodes": [ "D9", "F8" ] },
+ "Fprem1": { "opcodes": [ "D9", "F5" ] },
+ "Fyl2x": { "opcodes": [ "D9", "F1" ] },
+ "Fyl2xp1": { "opcodes": [ "D9", "F9" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "ST1", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fptan": { "opcodes": [ "D9", "F2" ] },
+ "Fsincos": { "opcodes": [ "D9", "FB" ] },
+ "Fxtract": { "opcodes": [ "D9", "F4" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use_def" },
+ { "class": "ST1", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fst": { "opcodes": [ "DD", "2" ] },
+ "Fstp": { "opcodes": [ "DD", "3" ] }
+ },
+ "args": [
+ { "class": "RegX87", "usage": "def" },
+ { "class": "ST", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fxam": { "opcodes": [ "D9", "E5" ] }
+ },
+ "args": [
+ { "class": "ST", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fxch": { "opcodes": [ "D9", "1" ] }
+ },
+ "args": [
+ { "class": "RegX87", "usage": "use_def" },
+ { "class": "ST", "usage": "use_def" }
+ ]
+ },
+ {
+ "encodings": {
"Imulb": { "opcodes": [ "F6", "5" ] },
"Mulb": { "opcodes": [ "F6", "4" ] }
},
@@ -1172,15 +1495,6 @@
]
},
{
- "encodings": {
- "Int3": { "opcodes": [ "CC" ] },
- "Mfence": { "opcodes": [ "0F", "AE", "F0" ] },
- "Nop": { "opcodes": [ "90" ] },
- "UD2": { "opcodes": [ "0F", "0B" ] }
- },
- "args": []
- },
- {
"stems": [ "Jcc" ],
"args": [
{ "class": "Cond" },
diff --git a/assembler/instructions/insn_def_x86_64.json b/assembler/instructions/insn_def_x86_64.json
index 0a98cb9..b31f8bc 100644
--- a/assembler/instructions/insn_def_x86_64.json
+++ b/assembler/instructions/insn_def_x86_64.json
@@ -364,6 +364,24 @@
},
{
"encodings": {
+ "Fxrstor64": { "opcodes": [ "0F", "AE", "1" ] }
+ },
+ "args": [
+ { "class": "Mem64", "usage": "use" },
+ { "class": "CC", "usage": "def" }
+ ]
+ },
+ {
+ "encodings": {
+ "Fxsave64": { "opcodes": [ "0F", "AE", "0" ] }
+ },
+ "args": [
+ { "class": "CC", "usage": "def" },
+ { "class": "Mem64", "usage": "use" }
+ ]
+ },
+ {
+ "encodings": {
"Imulq": { "opcodes": [ "F7", "5" ] },
"Mulq": { "opcodes": [ "F7", "4" ] }
},