encode: Add library for x86-64 encoding

This commit is contained in:
Alexis Engelke
2020-06-24 11:20:50 +02:00
parent 4e95c8d152
commit 69ce124354
7 changed files with 817 additions and 110 deletions

View File

@@ -70,7 +70,7 @@
61 NP - - - - POPA ONLY32 INSTR_WIDTH
62 RM GP MEM - - BOUND ONLY32
63 MR GP16 GP16 - - ARPL ONLY32
63 RM GP GP32 - - MOVSX ONLY64
63 RM GP GP32 - - MOVSX ONLY64 ENC_SEPSZ
#64 SEG=FS prefix
#65 SEG=GS prefix
#66 operand size prefix
@@ -79,10 +79,10 @@
69 RMI GP GP IMM - IMUL
6a I IMM - - - PUSH DEF64 IMM_8
6b RMI GP GP IMM - IMUL IMM_8
6c NP - - - - INS SIZE_8 INSTR_WIDTH
6d NP - - - - INS INSTR_WIDTH
6e NP - - - - OUTS SIZE_8 INSTR_WIDTH
6f NP - - - - OUTS INSTR_WIDTH
6c NP - - - - INS SIZE_8 INSTR_WIDTH ENC_REP
6d NP - - - - INS INSTR_WIDTH ENC_REP
6e NP - - - - OUTS SIZE_8 INSTR_WIDTH ENC_REP
6f NP - - - - OUTS INSTR_WIDTH ENC_REP
70 D IMM - - - JO DEF64 IMM_8
71 D IMM - - - JNO DEF64 IMM_8
72 D IMM - - - JC DEF64 IMM_8
@@ -145,14 +145,7 @@
8f/0 M GP - - - POP DEF64
# Against frequent belief, only, XCHG (r/e)AX, (r)AX with 90 is NOP.
# As a lacking REX.B cannot be specified here, this is hardcoded.
90 OA GP GP - - XCHG_NOP
91 OA GP GP - - XCHG
92 OA GP GP - - XCHG
93 OA GP GP - - XCHG
94 OA GP GP - - XCHG
95 OA GP GP - - XCHG
96 OA GP GP - - XCHG
97 OA GP GP - - XCHG
90+ OA GP GP - - XCHG_NOP
98 NP - - - - C_EX INSTR_WIDTH
99 NP - - - - C_SEP INSTR_WIDTH
#9a CALLF TODO
@@ -165,18 +158,18 @@ a0 FD GP GP - - MOV SIZE_8
a1 FD GP GP - - MOV
a2 TD GP GP - - MOV SIZE_8
a3 TD GP GP - - MOV
a4 NP - - - - MOVS SIZE_8 INSTR_WIDTH
a5 NP - - - - MOVS INSTR_WIDTH
a6 NP - - - - CMPS SIZE_8 INSTR_WIDTH
a7 NP - - - - CMPS INSTR_WIDTH
a4 NP - - - - MOVS SIZE_8 INSTR_WIDTH ENC_REP
a5 NP - - - - MOVS INSTR_WIDTH ENC_REP
a6 NP - - - - CMPS SIZE_8 INSTR_WIDTH ENC_REPCC
a7 NP - - - - CMPS INSTR_WIDTH ENC_REPCC
a8 IA GP IMM - - TEST SIZE_8
a9 IA GP IMM - - TEST
aa NP - - - - STOS SIZE_8 INSTR_WIDTH
ab NP - - - - STOS INSTR_WIDTH
ac NP - - - - LODS SIZE_8 INSTR_WIDTH
ad NP - - - - LODS INSTR_WIDTH
ae NP - - - - SCAS SIZE_8 INSTR_WIDTH
af NP - - - - SCAS INSTR_WIDTH
aa NP - - - - STOS SIZE_8 INSTR_WIDTH ENC_REP
ab NP - - - - STOS INSTR_WIDTH ENC_REP
ac NP - - - - LODS SIZE_8 INSTR_WIDTH ENC_REP
ad NP - - - - LODS INSTR_WIDTH ENC_REP
ae NP - - - - SCAS SIZE_8 INSTR_WIDTH ENC_REPCC
af NP - - - - SCAS INSTR_WIDTH ENC_REPCC
b0+ OI GP IMM8 - - MOVABS SIZE_8
b8+ OI GP IMM - - MOVABS
c0/0 MI GP IMM8 - - ROL SIZE_8
@@ -442,8 +435,8 @@ NP.0f37 NP - - - - GETSEC
0fb3 MR GP GP - - BTR LOCK
0fb4 RM GP MEM - - LFS
0fb5 RM GP MEM - - LGS
0fb6 RM GP GP8 - - MOVZX
0fb7 RM GP GP16 - - MOVZX
0fb6 RM GP GP8 - - MOVZX ENC_SEPSZ
0fb7 RM GP GP16 - - MOVZX ENC_SEPSZ
RF3.0fb8 RM GP GP - - POPCNT
0fb9 RM GP GP - - UD1
0fba/4 MI GP IMM8 - - BT
@@ -457,8 +450,8 @@ RF3.0fbc RM GP GP - - TZCNT
RNP.0fbd RM GP GP - - BSR
RF2.0fbd RM GP GP - - BSR
RF3.0fbd RM GP GP - - LZCNT
0fbe RM GP GP8 - - MOVSX
0fbf RM GP GP16 - - MOVSX
0fbe RM GP GP8 - - MOVSX ENC_SEPSZ
0fbf RM GP GP16 - - MOVSX ENC_SEPSZ
0fc0 MR GP GP - - XADD SIZE_8 LOCK
0fc1 MR GP GP - - XADD LOCK
NP.0fc3 MR MEM GP - - MOVNTI
@@ -508,7 +501,7 @@ NP.0f77 NP - - - - MMX_EMMS
NP.W0.0f7e MR GP32 MMX - - MMX_MOVD
NP.W1.0f7e MR GP64 MMX - - MMX_MOVQ
NP.0f7f MR MMX MMX - - MMX_MOVQ
NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW
NP.0fc4 RMI MMX GP IMM8 - MMX_PINSRW ENC_NOSZ
NP.0fc5 RMI GP MMX IMM8 - MMX_PEXTRW DEF64 NOMEM
NP.0fd1 RM MMX MMX - - MMX_PSRLW
NP.0fd2 RM MMX MMX - - MMX_PSRLD
@@ -968,9 +961,9 @@ VEX.66.0f6a RVM XMM XMM XMM - VPUNPCKHDQ
VEX.66.0f6b RVM XMM XMM XMM - VPACKSSDW
VEX.66.0f6c RVM XMM XMM XMM - VPUNPCKLQDQ
VEX.66.0f6d RVM XMM XMM XMM - VPUNPCKHQDQ
VEX.66.W0.L0.0f6e RM XMM32 GP - - VMOVD
VEX.66.W1.L0.0f6e RM XMM32 GP - - VMOVD ONLY32
VEX.66.W1.L0.0f6e RM XMM64 GP - - VMOVQ ONLY64
VEX.66.W0.L0.0f6e RM XMM32 GP - - VMOVD ENC_NOSZ
VEX.66.W1.L0.0f6e RM XMM32 GP - - VMOVD ONLY32 ENC_NOSZ
VEX.66.W1.L0.0f6e RM XMM64 GP - - VMOVQ ONLY64 ENC_NOSZ
VEX.66.0f6f RM XMM XMM - - VMOVDQA
VEX.F3.0f6f RM XMM XMM - - VMOVDQU
VEX.66.0f70 RMI XMM XMM IMM8 - VPSHUFD
@@ -995,10 +988,10 @@ VEX.66.0f7c RVM XMM XMM XMM - VHADDPD
VEX.F2.0f7c RVM XMM XMM XMM - VHADDPS
VEX.66.0f7d RVM XMM XMM XMM - VHSUBPD
VEX.F2.0f7d RVM XMM XMM XMM - VHSUBPS
VEX.66.W0.L0.0f7e MR GP XMM32 - - VMOVD
VEX.66.W1.L0.0f7e MR GP XMM32 - - VMOVQ ONLY32
VEX.66.W1.L0.0f7e MR GP XMM64 - - VMOVQ ONLY64
VEX.F3.L0.0f7e RM XMM64 XMM64 - - VMOVQ
VEX.66.W0.L0.0f7e MR GP XMM32 - - VMOVD ENC_NOSZ
VEX.66.W1.L0.0f7e MR GP XMM32 - - VMOVQ ONLY32 ENC_NOSZ
VEX.66.W1.L0.0f7e MR GP XMM64 - - VMOVQ ONLY64 ENC_NOSZ
VEX.F3.L0.0f7e RM XMM64 XMM64 - - VMOVQ ENC_NOSZ
VEX.66.0f7f MR XMM XMM - - VMOVDQA
VEX.F3.0f7f MR XMM XMM - - VMOVDQU
VEX.NP.0fae//2 M GP32 - - - VLDMXCSR
@@ -1007,8 +1000,8 @@ VEX.NP.0fc2 RVMI XMM XMM XMM IMM8 VCMPPS
VEX.66.0fc2 RVMI XMM XMM XMM IMM8 VCMPPD
VEX.F3.LIG.0fc2 RVMI XMM XMM XMM32 IMM8 VCMPSS
VEX.F2.LIG.0fc2 RVMI XMM XMM XMM64 IMM8 VCMPSD
VEX.66.WIG.L0.0fc4 RVMI XMM XMM GP16 IMM8 VPINSRW
VEX.66.WIG.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW DEF64 NOMEM
VEX.66.WIG.L0.0fc4 RVMI XMM XMM GP16 IMM8 VPINSRW ENC_NOSZ
VEX.66.WIG.L0.0fc5 RMI GP XMM IMM8 - VPEXTRW DEF64 NOMEM ENC_NOSZ
VEX.NP.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPS
VEX.66.0fc6 RVMI XMM XMM XMM IMM8 VSHUFPD
VEX.NP.0fd0 RVM XMM XMM XMM - VADDSUBPS
@@ -1129,7 +1122,7 @@ VEX.66.W0.0f3847 RVM XMM XMM XMM - VPSLLVD
VEX.66.W1.0f3847 RVM XMM XMM XMM - VPSLLVQ
VEX.66.W0.0f3858 RM XMM XMM32 - - VPBROADCASTD
VEX.66.W0.0f3859 RM XMM XMM64 - - VPBROADCASTQ
VEX.66.W0.L1.0f385a RM XMM MEM128 - - VBROADCASTI128
VEX.66.W0.L1.0f385a RM XMM MEM128 - - VBROADCASTI128 ENC_NOSZ
VEX.66.W0.0f3878 RM XMM XMM8 - - VPBROADCASTB
VEX.66.W0.0f3879 RM XMM XMM16 - - VPBROADCASTW
VEX.66.W0.0f388c RVM XMM XMM XMM - VPMASKMOVD
@@ -1218,32 +1211,32 @@ VEX.66.0f3a0c RVMI XMM XMM XMM IMM8 VBLENDPS
VEX.66.0f3a0d RVMI XMM XMM XMM IMM8 VBLENDPD
VEX.66.0f3a0e RVMI XMM XMM XMM IMM8 VPBLENDW
VEX.66.0f3a0f RVMI XMM XMM XMM IMM8 VPALIGNR
VEX.66.WIG.L0.0f3a14 MRI GP8 XMM IMM8 - VPEXTRB
VEX.66.WIG.L0.0f3a14 MRI GP8 XMM IMM8 - VPEXTRB ENC_NOSZ
# TODO: also WIG for PEXTRW?
VEX.66.WIG.L0.0f3a15 MRI GP16 XMM IMM8 - VPEXTRW
VEX.66.W0.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD
VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD ONLY32
VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRQ ONLY64
VEX.66.L0.0f3a17 MRI GP32 XMM IMM8 - VEXTRACTPS
VEX.66.W0.L1.0f3a18 RVMI XMM XMM XMM128 IMM8 VINSERTF128
VEX.66.W0.L1.0f3a19 MRI XMM128 XMM IMM8 - VEXTRACTF128
VEX.66.WIG.L0.0f3a15 MRI GP16 XMM IMM8 - VPEXTRW ENC_NOSZ
VEX.66.W0.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD ENC_NOSZ
VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRD ONLY32 ENC_NOSZ
VEX.66.W1.L0.0f3a16 MRI GP XMM IMM8 - VPEXTRQ ONLY64 ENC_NOSZ
VEX.66.L0.0f3a17 MRI GP32 XMM IMM8 - VEXTRACTPS ENC_NOSZ
VEX.66.W0.L1.0f3a18 RVMI XMM XMM XMM128 IMM8 VINSERTF128 ENC_NOSZ
VEX.66.W0.L1.0f3a19 MRI XMM128 XMM IMM8 - VEXTRACTF128 ENC_NOSZ
VEX.66.W0.L1.0f3a1d MRI XMM XMM IMM8 - VCVTPS2PH
VEX.66.WIG.L0.0f3a20 RVMI XMM XMM GP8 IMM8 VPINSRB
VEX.66.L0.0f3a21 RVMI XMM XMM XMM32 IMM8 VINSERTPS
VEX.66.W0.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD
VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD ONLY32
VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRQ ONLY64
VEX.66.W0.L1.0f3a38 RVMI XMM XMM XMM128 IMM8 VINSERTI128
VEX.66.W0.L1.0f3a39 MRI XMM128 XMM IMM8 - VEXTRACTI128
VEX.66.WIG.L0.0f3a20 RVMI XMM XMM GP8 IMM8 VPINSRB ENC_NOSZ
VEX.66.L0.0f3a21 RVMI XMM XMM XMM32 IMM8 VINSERTPS ENC_NOSZ
VEX.66.W0.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD ENC_NOSZ
VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRD ONLY32 ENC_NOSZ
VEX.66.W1.L0.0f3a22 RVMI XMM XMM GP IMM8 VPINSRQ ONLY64 ENC_NOSZ
VEX.66.W0.L1.0f3a38 RVMI XMM XMM XMM128 IMM8 VINSERTI128 ENC_NOSZ
VEX.66.W0.L1.0f3a39 MRI XMM128 XMM IMM8 - VEXTRACTI128 ENC_NOSZ
VEX.66.0f3a40 RVMI XMM XMM XMM IMM8 VDPPS
VEX.66.0f3a41 RVMI XMM XMM XMM IMM8 VDPPD
VEX.66.0f3a42 RVMI XMM XMM XMM IMM8 VMPSADBW
VEX.66.0f3a44 RVMI XMM XMM XMM IMM8 VPCLMULQDQ
VEX.66.W0.L1.0f3a46 RVMI XMM XMM XMM IMM8 VPERM2I128
VEX.66.L0.0f3a60 RMI XMM XMM IMM8 - VPCMPESTRM
VEX.66.L0.0f3a61 RMI XMM XMM IMM8 - VPCMPESTRI
VEX.66.L0.0f3a62 RMI XMM XMM IMM8 - VPCMPISTRM
VEX.66.L0.0f3a63 RMI XMM XMM IMM8 - VPCMPISTRI
VEX.66.L0.0f3a60 RMI XMM XMM IMM8 - VPCMPESTRM ENC_NOSZ
VEX.66.L0.0f3a61 RMI XMM XMM IMM8 - VPCMPESTRI ENC_NOSZ
VEX.66.L0.0f3a62 RMI XMM XMM IMM8 - VPCMPISTRM ENC_NOSZ
VEX.66.L0.0f3a63 RMI XMM XMM IMM8 - VPCMPISTRI ENC_NOSZ
#
# BMI1
VEX.NP.L0.0f38f2 RVM GP GP GP - ANDN
@@ -1265,14 +1258,14 @@ VEX.F3.L0.0f38f7 RMV GP GP GP - SARX
F3.0f38f6 RM GP GP - - ADOX
#
# FPU
d8//0 M MEM32 - - - FADD
d8//1 M MEM32 - - - FMUL
d8//2 M MEM32 - - - FCOM
d8//3 M MEM32 - - - FCOMP
d8//4 M MEM32 - - - FSUB
d8//5 M MEM32 - - - FSUBR
d8//6 M MEM32 - - - FDIV
d8//7 M MEM32 - - - FDIVR
d8//0 M MEM32 - - - FADD ENC_SEPSZ
d8//1 M MEM32 - - - FMUL ENC_SEPSZ
d8//2 M MEM32 - - - FCOM ENC_SEPSZ
d8//3 M MEM32 - - - FCOMP ENC_SEPSZ
d8//4 M MEM32 - - - FSUB ENC_SEPSZ
d8//5 M MEM32 - - - FSUBR ENC_SEPSZ
d8//6 M MEM32 - - - FDIV ENC_SEPSZ
d8//7 M MEM32 - - - FDIVR ENC_SEPSZ
d8//c0+ AO FPU FPU - - FADD
d8//c8+ AO FPU FPU - - FMUL
d8//d0+ AO FPU FPU - - FCOM
@@ -1281,9 +1274,9 @@ d8//e0+ AO FPU FPU - - FSUB
d8//e8+ AO FPU FPU - - FSUBR
d8//f0+ AO FPU FPU - - FDIV
d8//f8+ AO FPU FPU - - FDIVR
d9//0 M MEM32 - - - FLD
d9//2 M MEM32 - - - FST
d9//3 M MEM32 - - - FSTP
d9//0 M MEM32 - - - FLD ENC_SEPSZ
d9//2 M MEM32 - - - FST ENC_SEPSZ
d9//3 M MEM32 - - - FSTP ENC_SEPSZ
d9//4 M MEMZ - - - FLDENV
d9//5 M MEM16 - - - FLDCW
d9//6 M MEMZ - - - FSTENV
@@ -1317,23 +1310,23 @@ d9//fc NP - - - - FRNDINT
d9//fd NP - - - - FSCALE
d9//fe NP - - - - FSIN
d9//ff NP - - - - FCOS
da//0 M MEM32 - - - FIADD
da//1 M MEM32 - - - FIMUL
da//2 M MEM32 - - - FICOM
da//3 M MEM32 - - - FICOMP
da//4 M MEM32 - - - FISUB
da//5 M MEM32 - - - FISUBR
da//6 M MEM32 - - - FIDIV
da//7 M MEM32 - - - FIDIVR
da//0 M MEM32 - - - FIADD ENC_SEPSZ
da//1 M MEM32 - - - FIMUL ENC_SEPSZ
da//2 M MEM32 - - - FICOM ENC_SEPSZ
da//3 M MEM32 - - - FICOMP ENC_SEPSZ
da//4 M MEM32 - - - FISUB ENC_SEPSZ
da//5 M MEM32 - - - FISUBR ENC_SEPSZ
da//6 M MEM32 - - - FIDIV ENC_SEPSZ
da//7 M MEM32 - - - FIDIVR ENC_SEPSZ
da//c0+ O FPU - - - FCMOVB
da//c8+ O FPU - - - FCMOVE
da//d0+ O FPU - - - FCMOVBE
da//d8+ O FPU - - - FCMOVU
da//e9 NP - - - - FUCOMPP
db//0 M MEM32 - - - FILD
db//1 M MEM32 - - - FISTTP
db//2 M MEM32 - - - FIST
db//3 M MEM32 - - - FISTP
db//0 M MEM32 - - - FILD ENC_SEPSZ
db//1 M MEM32 - - - FISTTP ENC_SEPSZ
db//2 M MEM32 - - - FIST ENC_SEPSZ
db//3 M MEM32 - - - FISTP ENC_SEPSZ
db//5 M FPU - - - FLD
db//7 M FPU - - - FSTP
db//c0+ O FPU - - - FCMOVNB
@@ -1344,24 +1337,24 @@ db//e2 NP - - - - FCLEX
db//e3 NP - - - - FINIT
db//e8+ O FPU - - - FUCOMI
db//f0+ O FPU - - - FCOMI
dc//0 M MEM64 - - - FADD
dc//1 M MEM64 - - - FMUL
dc//2 M MEM64 - - - FCOM
dc//3 M MEM64 - - - FCOMP
dc//4 M MEM64 - - - FSUB
dc//5 M MEM64 - - - FSUBR
dc//6 M MEM64 - - - FDIV
dc//7 M MEM64 - - - FDIVR
dc//0 M MEM64 - - - FADD ENC_SEPSZ
dc//1 M MEM64 - - - FMUL ENC_SEPSZ
dc//2 M MEM64 - - - FCOM ENC_SEPSZ
dc//3 M MEM64 - - - FCOMP ENC_SEPSZ
dc//4 M MEM64 - - - FSUB ENC_SEPSZ
dc//5 M MEM64 - - - FSUBR ENC_SEPSZ
dc//6 M MEM64 - - - FDIV ENC_SEPSZ
dc//7 M MEM64 - - - FDIVR ENC_SEPSZ
dc//c0+ OA FPU FPU - - FADD
dc//c8+ OA FPU FPU - - FMUL
dc//e0+ OA FPU FPU - - FSUBR
dc//e8+ OA FPU FPU - - FSUB
dc//f0+ OA FPU FPU - - FDIVR
dc//f8+ OA FPU FPU - - FDIV
dd//0 M MEM64 - - - FLD
dd//1 M MEM64 - - - FISTTP
dd//2 M MEM64 - - - FST
dd//3 M MEM64 - - - FSTP
dd//0 M MEM64 - - - FLD ENC_SEPSZ
dd//1 M MEM64 - - - FISTTP ENC_SEPSZ
dd//2 M MEM64 - - - FST ENC_SEPSZ
dd//3 M MEM64 - - - FSTP ENC_SEPSZ
dd//4 M MEMZ - - - FRSTOR
dd//6 M MEMZ - - - FSAVE
dd//7 M MEM16 - - - FSTSW
@@ -1370,14 +1363,14 @@ dd//d0+ O FPU - - - FST
dd//d8+ O FPU - - - FSTP
dd//e0+ O FPU - - - FUCOM
dd//e8+ O FPU - - - FUCOMP
de//0 M MEM16 - - - FIADD
de//1 M MEM16 - - - FIMUL
de//2 M MEM16 - - - FICOM
de//3 M MEM16 - - - FICOMP
de//4 M MEM16 - - - FISUB
de//5 M MEM16 - - - FISUBR
de//6 M MEM16 - - - FIDIV
de//7 M MEM16 - - - FIDIVR
de//0 M MEM16 - - - FIADD ENC_SEPSZ
de//1 M MEM16 - - - FIMUL ENC_SEPSZ
de//2 M MEM16 - - - FICOM ENC_SEPSZ
de//3 M MEM16 - - - FICOMP ENC_SEPSZ
de//4 M MEM16 - - - FISUB ENC_SEPSZ
de//5 M MEM16 - - - FISUBR ENC_SEPSZ
de//6 M MEM16 - - - FIDIV ENC_SEPSZ
de//7 M MEM16 - - - FIDIVR ENC_SEPSZ
de//c0+ OA FPU FPU - - FADDP
de//c8+ OA FPU FPU - - FMULP
de//d9 NP - - - - FCOMPP
@@ -1385,14 +1378,14 @@ de//e0+ OA FPU FPU - - FSUBRP
de//e8+ OA FPU FPU - - FSUBP
de//f0+ OA FPU FPU - - FDIVRP
de//f8+ OA FPU FPU - - FDIVP
df//0 M MEM16 - - - FILD
df//1 M MEM16 - - - FISTTP
df//2 M MEM16 - - - FIST
df//3 M MEM16 - - - FISTP
df//0 M MEM16 - - - FILD ENC_SEPSZ
df//1 M MEM16 - - - FISTTP ENC_SEPSZ
df//2 M MEM16 - - - FIST ENC_SEPSZ
df//3 M MEM16 - - - FISTP ENC_SEPSZ
df//4 M FPU - - - FBLD
df//5 M MEM64 - - - FILD
df//5 M MEM64 - - - FILD ENC_SEPSZ
df//6 M FPU - - - FBSTP
df//7 M MEM64 - - - FISTP
df//7 M MEM64 - - - FISTP ENC_SEPSZ
# FSTSW AX
df//e0 A GP16 - - - FSTSW
df//f0+ AO FPU FPU - - FCOMIP