#BEGIN_LEGAL
#
#Copyright (c) 2022 Intel Corporation
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#  
#END_LEGAL
# This file is for defining sets of extensions implemented by various chips
#
# The first column is a chip name. It will become the source for the enum xed_chip_t XED_CHIP_* 
# The rest of the columns are ISA extensions that that CHIP implements
# ALL_OF(x) is a macro that refers to the set defined previously for some chip x.
# NOT(y) is a macro that removes a specific ISA extension (processed last)

I86:       I86 LAHF
I86FP:     I86 LAHF      X87

I186:      ALL_OF(I86)  I186 
     # BOUND, ENTER, INS/INSB/INSW, LEAVE, OUTS/OUTSB/OUTSW, POPA, PUSHA
I186FP:   ALL_OF(I186)   X87

I286REAL:  ALL_OF(I186)     I286REAL X87
I286:      ALL_OF(I286REAL) I286PROTECTED
     # ARPL, CLTS, LAR, LGDT, LIDT, LLDT, LMSW,
     #  LOADALL(undoc), LSL, LTR, SGDT, SIDT,SLDT, SMSW, STR,VERR,VERW
I2186FP:   ALL_OF(I286) X87

# 386 did not add any instr  to real mode
I386REAL:  ALL_OF(I286REAL) 
I386:      ALL_OF(I386REAL)  ALL_OF(I286) I386 
     # BSF, BSR, BT, BTC, BTR,BTS, CDQ, CMPSD,CWDE, INSD, IRET*, JECXZ,
     # LFS, LGS,LSS, LOADALL(undoc), LODSD, LOOP, MOVSD
     # MOVSX, OUTSD, POPAD POPFD, PUSHAD PUSHD PUSHFD, SCASD
     # SETcc* SHLD, SHRD, STOSD
I386FP:    ALL_OF(I386)  X87

I486REAL:  ALL_OF(I386REAL)  I486REAL             # BSWAP, CMPXCHG, CPUID, INVD, INVLPG, RSM,WBINVD,XADD 
I486:      ALL_OF(I486REAL)  ALL_OF(I386) I486     X87         # RSM

PENTIUMREAL:    ALL_OF(I486REAL)     PENTIUMREAL  # CMPXCHG8B, RDMSR, RDTSC, WRMSR
PENTIUM:        ALL_OF(PENTIUMREAL) ALL_OF(I486)
# Quark is PENTIUM ISA, but not Pentium implementation. 
QUARK:          ALL_OF(PENTIUM)

PENTIUMMMXREAL: ALL_OF(PENTIUMREAL)    RDPMC     # P55C++  RDPMC
PENTIUMMMX:     ALL_OF(PENTIUMMMXREAL) ALL_OF(PENTIUM) PENTIUMMMX   # P55C++

ALLREAL:  ALL_OF(PENTIUMMMXREAL)

# P6, PentiumPro, PPRO:
# The SSE_PREFETCH were on P6 as fat NOPs, but XED only recognizes them on >=PENTIUM3
PENTIUMPRO: ALL_OF(PENTIUM) PPRO PPRO_UD0_SHORT CMOV FCMOV FCOMI RDPMC FAT_NOP PREFETCH_NOP     # NO MMX (Orig P6)
    # FCMOV*, CMOV*, RDPMC, SYSCALL, SYSENTER, SYSEXIT,SYSRET, UD2, F[U]COMI[P]
    # note conflict with PENTIUM2 addition of SYSENTER/SYSEXIT
           

PENTIUM2:   ALL_OF(PENTIUM)  PENTIUMMMX  PPRO CMOV FCMOV FCOMI FAT_NOP RDPMC PREFETCH_NOP FXSAVE
    # FXSAVE/FXRSTOR, SYSENTER,SYSEXIT P6

# we keep SSEMXCSR separate from SSE to accommodate chip-check for KNC
#  which only implements LDMXCSR/STMXCSR from SSE.
# The SSE_PREFETCH came in as NOPs on P6/PPRO.  innaccuracy...
PENTIUM3:   ALL_OF(PENTIUM2)  SSE  SSEMXCSR SSE_PREFETCH   # SSE(incl. ldmxcsr/stmxcsr) (KNI) 

# SSE2MMX is a several purely mmx instructions that came with SSE2 (PADDQ, PSUBQ, PMULUDQ).
# They are really part of SSE2.
PENTIUM4:     ALL_OF(PENTIUM3) NOT(PPRO_UD0_SHORT) PPRO_UD0_LONG SSE2 SSE2MMX CLFSH PAUSE

# MONITOR is (MONITOR and MWAIT) instructions
# SSE3X87 is two x87 instructions that came with SSE3.
P4PRESCOTT:   ALL_OF(PENTIUM4) SSE3 SSE3X87 MONITOR LONGMODE CMPXCHG16B  FXSAVE64

# Made a chip for the P4's that omit LAHF in 64b mode
P4PRESCOTT_NOLAHF:  ALL_OF(P4PRESCOTT)  NOT(LAHF) 

P4PRESCOTT_VTX:  ALL_OF(P4PRESCOTT)  VTX

# SSSE3MMX is a a bunch of purely mmx instructions that came with SSSE3.
# They are really part of SSSE3.
MEROM:       ALL_OF(P4PRESCOTT)  VTX SSSE3 SSSE3MMX SMX

PENRYN:      ALL_OF(MEROM)     SSE4
PENRYN_E:    ALL_OF(PENRYN)    XSAVE
NEHALEM:     ALL_OF(PENRYN)    SSE42 POPCNT RDTSCP
WESTMERE:    ALL_OF(NEHALEM)    AES PCLMULQDQ

# ATOM
BONNELL:  ALL_OF(MEROM)     MOVBE  NOT(SMX) NOT(PPRO_UD0_LONG) PPRO_UD0_SHORT
SALTWELL: ALL_OF(BONNELL)

# PREFETCHW semantics added to PREFETCHW opcode but not subject
# to chip-check because of prior implementation as NOP.
SILVERMONT:    ALL_OF(WESTMERE)  MOVBE RDRAND PREFETCHW VMFUNC NOT(PPRO_UD0_LONG) PPRO_UD0_SHORT



