updated for version 7.1a
diff --git a/runtime/syntax/masm.vim b/runtime/syntax/masm.vim
index e11a029..d7c1e7e 100644
--- a/runtime/syntax/masm.vim
+++ b/runtime/syntax/masm.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
-" Language:	Microsoft Assembler (80x86)
-" Maintainer:	Rob Brady <robb@datatone.com>
+" Language:	Microsoft Macro Assembler (80x86)
+" Orig Author:	Rob Brady <robb@datatone.com>
+" Maintainer:	Wu Yongwei <wuyongwei@gmail.com>
 " Last Change:	$Date$
-" URL: http://www.datatone.com/~robb/vim/syntax/masm.vim
 " $Revision$
 
 " For version 5.x: Clear all syntax items
@@ -16,86 +16,209 @@
 syn case ignore
 
 
-" syn match masmType "\.word"
+syn match masmIdentifier	"[@a-z_$?][@a-z0-9_$?]*"
+syn match masmLabel		"^\s*[@a-z_$?][@a-z0-9_$?]*:"he=e-1
 
-syn match masmIdentifier	"[a-z_$][a-z0-9_$]*"
-syn match masmLabel		"^[A-Z_$][A-Z0-9_$]*:"he=e-1
+syn match masmDecimal		"[-+]\?\d\+[dt]\?"
+syn match masmBinary		"[-+]\?[0-1]\+[by]"  "put this before hex or 0bfh dies!
+syn match masmOctal		"[-+]\?[0-7]\+[oq]"
+syn match masmHexadecimal	"[-+]\?[0-9]\x*h"
+syn match masmFloatRaw		"[-+]\?[0-9]\x*r"
+syn match masmFloat		"[-+]\?\d\+\.\(\d*\(E[-+]\?\d\+\)\?\)\?"
 
-syn match masmDecimal		"\d*"
-syn match masmBinary		"[0-1]\+b"  "put this before hex or 0bfh dies!
-syn match masmHexadecimal	"[0-9]\x*h"
-syn match masmFloat		"[0-9]\x*r"
+syn match masmComment		";.*" contains=@Spell
+syn region masmComment		start=+COMMENT\s*\z(\S\)+ end=+\z1.*+ contains=@Spell
+syn region masmString		start=+'+ end=+'+ oneline contains=@Spell
+syn region masmString		start=+"+ end=+"+ oneline contains=@Spell
 
-syn match masmComment		";.*"
-syn region masmString		start=+'+ end=+'+
+syn region masmTitleArea	start=+\<TITLE\s+lc=5 start=+\<SUBTITLE\s+lc=8 start=+\<SUBTTL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmTitle
+syn region masmTextArea		start=+\<NAME\s+lc=4 start=+\<INCLUDE\s+lc=7 start=+\<INCLUDELIB\s+lc=10 end=+$+ end=+;+me=e-1 contains=masmText
+syn match masmTitle		"[^\t ;]\([^;]*[^\t ;]\)\?" contained
+syn match masmText		"[^\t ;]\([^;]*[^\t ;]\)\?" contained
 
-syn keyword masmOperator	AND BYTE PTR CODEPTR DATAPTR DUP DWORD EQ FAR
-syn keyword masmOperator	FWORD GE GT HIGH LARGE LE LOW LT MOD NE NEAR
-syn keyword masmOperator	NOT OFFSET OR PROC PWORD QWORD SEG SHORT TBYTE
-syn keyword masmOperator	TYPE WORD PARA
-syn keyword masmDirective	ALIGN ARG ASSUME CODESEG COMM
-syn keyword masmDirective	CONST DATASEG DB DD DF DISPLAY DOSSEG DP
-syn keyword masmDirective	DQ DT DW ELSE ELSEIF EMUL END ENDIF ENDM ENDP
-syn keyword masmDirective	ENDS ENUM EQU PROC PUBLIC PUBLICDLL RADIX
-syn keyword masmDirective	EXTRN FARDATA GLOBAL RECORD SEGMENT SMALLSTACK
-syn keyword masmDirective	GROUP IF IF1 IF2 IFB IFDEF IFDIF IFDIFI
-syn keyword masmDirective	IFE IFIDN IFIDNI IFNB IFNDEF INCLUDE INCLUDLIB
-syn keyword masmDirective	LABEL LARGESTACK STACK STRUC SUBTTL TITLE
-syn keyword masmDirective	MODEL NAME NOEMUL UNION USES VERSION
-syn keyword masmDirective	ORG FLAT
-syn match   masmDirective	"\.model"
-syn match   masmDirective	"\.186"
-syn match   masmDirective	"\.286"
-syn match   masmDirective	"\.286c"
-syn match   masmDirective	"\.286p"
-syn match   masmDirective	"\.287"
-syn match   masmDirective	"\.386"
-syn match   masmDirective	"\.386c"
-syn match   masmDirective	"\.386p"
-syn match   masmDirective	"\.387"
-syn match   masmDirective	"\.486"
-syn match   masmDirective	"\.486c"
-syn match   masmDirective	"\.486p"
-syn match   masmDirective	"\.8086"
-syn match   masmDirective	"\.8087"
-syn match   masmDirective	"\.ALPHA"
-syn match   masmDirective	"\.CODE"
-syn match   masmDirective	"\.DATA"
+syn region masmOptionOpt	start=+\<OPTION\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption
+syn region masmModelOpt		start=+\.MODEL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption,masmType
+syn region masmSegmentOpt	start=+\<SEGMENT\s+lc=7 end=+$+ end=+;+me=e-1 contains=masmOption,masmString
+syn region masmProcOpt		start=+\<PROC\s+lc=4 end=+$+ end=+;+me=e-1 contains=masmOption,masmType,masmRegister,masmIdentifier
+syn region masmExpression	start=+\.IF\s+lc=3 start=+\.WHILE\s+lc=6 start=+\.UNTIL\s+lc=6 start=+\<IF\s+lc=2 start=+\<IF2\s+lc=3 start=+\<ELSEIF\s+lc=6 start=+\<ELSEIF2\s+lc=7 start=+\<REPEAT\s+lc=6 start=+\<WHILE\s+lc=5 end=+$+ end=+;+me=e-1 contains=masmType,masmOperator,masmRegister,masmIdentifier,masmDecimal,masmBinary,masmHexadecimal,masmFloatRaw,masmString
+
+syn keyword masmOption		TINY SMALL COMPACT MEDIUM LARGE HUGE contained
+syn keyword masmOption		NEARSTACK FARSTACK contained
+syn keyword masmOption		PUBLIC PRIVATE STACK COMMON MEMORY AT contained
+syn keyword masmOption		BYTE WORD DWORD PARA PAGE contained
+syn keyword masmOption		USE16 USE32 FLAT contained
+syn keyword masmOption		INFO READ WRITE EXECUTE SHARED contained
+syn keyword masmOption		NOPAGE NOCACHE DISCARD contained
+syn keyword masmOption		READONLY USES FRAME contained
+syn keyword masmOption		CASEMAP DOTNAME NODOTNAME EMULATOR contained
+syn keyword masmOption		NOEMULATOR EPILOGUE EXPR16 EXPR32 contained
+syn keyword masmOption		LANGUAGE LJMP NOLJMP M510 NOM510 contained
+syn keyword masmOption		NOKEYWORD NOSIGNEXTEND OFFSET contained
+syn keyword masmOption		OLDMACROS NOOLDMACROS OLDSTRUCTS contained
+syn keyword masmOption		NOOLDSTRUCTS PROC PROLOGUE READONLY contained
+syn keyword masmOption		NOREADONLY SCOPED NOSCOPED SEGMENT contained
+syn keyword masmOption		SETIF2 contained
+syn keyword masmType		STDCALL SYSCALL C BASIC FORTRAN PASCAL
+syn keyword masmType		PTR NEAR FAR NEAR16 FAR16 NEAR32 FAR32
+syn keyword masmType		REAL4 REAL8 REAL10 BYTE SBYTE TBYTE
+syn keyword masmType		WORD DWORD QWORD FWORD SWORD SDWORD
+syn keyword masmOperator	AND NOT OR SHL SHR XOR MOD DUP
+syn keyword masmOperator	EQ GE GT LE LT NE
+syn keyword masmOperator	LROFFSET SEG LENGTH LENGTHOF SIZE SIZEOF
+syn keyword masmOperator	CODEPTR DATAPTR FAR NEAR SHORT THIS TYPE
+syn keyword masmOperator	HIGH HIGHWORD LOW LOWWORD OPATTR MASK WIDTH
+syn match   masmOperator	"OFFSET\(\sFLAT:\)\?"
+syn match   masmOperator	".TYPE\>"
+syn match   masmOperator	"CARRY?"
+syn match   masmOperator	"OVERFLOW?"
+syn match   masmOperator	"PARITY?"
+syn match   masmOperator	"SIGN?"
+syn match   masmOperator	"ZERO?"
+syn keyword masmDirective	ALIAS ASSUME CATSTR COMM DB DD DF DOSSEG DQ DT
+syn keyword masmDirective	DW ECHO ELSE ELSEIF ELSEIF1 ELSEIF2 ELSEIFB
+syn keyword masmDirective	ELSEIFDEF ELSEIFDIF ELSEIFDIFI ELSEIFE
+syn keyword masmDirective	ELSEIFIDN ELSEIFIDNI ELSEIFNB ELSEIFNDEF END
+syn keyword masmDirective	ENDIF ENDM ENDP ENDS EQU EVEN EXITM EXTERN
+syn keyword masmDirective	EXTERNDEF EXTRN FOR FORC GOTO GROUP IF IF1 IF2
+syn keyword masmDirective	IFB IFDEF IFDIF IFDIFI IFE IFIDN IFIDNI IFNB
+syn keyword masmDirective	IFNDEF INCLUDE INCLUDELIB INSTR INVOKE IRP
+syn keyword masmDirective	IRPC LABEL LOCAL MACRO NAME OPTION ORG PAGE
+syn keyword masmDirective	POPCONTEXT PROC PROTO PUBLIC PURGE PUSHCONTEXT
+syn keyword masmDirective	RECORD REPEAT REPT SEGMENT SIZESTR STRUC
+syn keyword masmDirective	STRUCT SUBSTR SUBTITLE SUBTTL TEXTEQU TITLE
+syn keyword masmDirective	TYPEDEF UNION WHILE
+syn match   masmDirective	"\.8086\>"
+syn match   masmDirective	"\.8087\>"
+syn match   masmDirective	"\.NO87\>"
+syn match   masmDirective	"\.186\>"
+syn match   masmDirective	"\.286\>"
+syn match   masmDirective	"\.286C\>"
+syn match   masmDirective	"\.286P\>"
+syn match   masmDirective	"\.287\>"
+syn match   masmDirective	"\.386\>"
+syn match   masmDirective	"\.386C\>"
+syn match   masmDirective	"\.386P\>"
+syn match   masmDirective	"\.387\>"
+syn match   masmDirective	"\.486\>"
+syn match   masmDirective	"\.486P\>"
+syn match   masmDirective	"\.586\>"
+syn match   masmDirective	"\.586P\>"
+syn match   masmDirective	"\.686\>"
+syn match   masmDirective	"\.686P\>"
+syn match   masmDirective	"\.K3D\>"
+syn match   masmDirective	"\.MMX\>"
+syn match   masmDirective	"\.XMM\>"
+syn match   masmDirective	"\.ALPHA\>"
+syn match   masmDirective	"\.DOSSEG\>"
+syn match   masmDirective	"\.SEQ\>"
+syn match   masmDirective	"\.CODE\>"
+syn match   masmDirective	"\.CONST\>"
+syn match   masmDirective	"\.DATA\>"
+syn match   masmDirective	"\.DATA?"
+syn match   masmDirective	"\.EXIT\>"
+syn match   masmDirective	"\.FARDATA\>"
+syn match   masmDirective	"\.FARDATA?"
+syn match   masmDirective	"\.MODEL\>"
+syn match   masmDirective	"\.STACK\>"
+syn match   masmDirective	"\.STARTUP\>"
+syn match   masmDirective	"\.IF\>"
+syn match   masmDirective	"\.ELSE\>"
+syn match   masmDirective	"\.ELSEIF\>"
+syn match   masmDirective	"\.ENDIF\>"
+syn match   masmDirective	"\.REPEAT\>"
+syn match   masmDirective	"\.UNTIL\>"
+syn match   masmDirective	"\.UNTILCXZ\>"
+syn match   masmDirective	"\.WHILE\>"
+syn match   masmDirective	"\.ENDW\>"
+syn match   masmDirective	"\.BREAK\>"
+syn match   masmDirective	"\.CONTINUE\>"
+syn match   masmDirective	"\.ERR\>"
+syn match   masmDirective	"\.ERR1\>"
+syn match   masmDirective	"\.ERR2\>"
+syn match   masmDirective	"\.ERRB\>"
+syn match   masmDirective	"\.ERRDEF\>"
+syn match   masmDirective	"\.ERRDIF\>"
+syn match   masmDirective	"\.ERRDIFI\>"
+syn match   masmDirective	"\.ERRE\>"
+syn match   masmDirective	"\.ERRIDN\>"
+syn match   masmDirective	"\.ERRIDNI\>"
+syn match   masmDirective	"\.ERRNB\>"
+syn match   masmDirective	"\.ERRNDEF\>"
+syn match   masmDirective	"\.ERRNZ\>"
+syn match   masmDirective	"\.LALL\>"
+syn match   masmDirective	"\.SALL\>"
+syn match   masmDirective	"\.XALL\>"
+syn match   masmDirective	"\.LFCOND\>"
+syn match   masmDirective	"\.SFCOND\>"
+syn match   masmDirective	"\.TFCOND\>"
+syn match   masmDirective	"\.CREF\>"
+syn match   masmDirective	"\.NOCREF\>"
+syn match   masmDirective	"\.XCREF\>"
+syn match   masmDirective	"\.LIST\>"
+syn match   masmDirective	"\.NOLIST\>"
+syn match   masmDirective	"\.XLIST\>"
+syn match   masmDirective	"\.LISTALL\>"
+syn match   masmDirective	"\.LISTIF\>"
+syn match   masmDirective	"\.NOLISTIF\>"
+syn match   masmDirective	"\.LISTMACRO\>"
+syn match   masmDirective	"\.NOLISTMACRO\>"
+syn match   masmDirective	"\.LISTMACROALL\>"
+syn match   masmDirective	"\.FPO\>"
+syn match   masmDirective	"\.RADIX\>"
+syn match   masmDirective	"\.SAFESEH\>"
+syn match   masmDirective	"%OUT\>"
+syn match   masmDirective	"ALIGN\>"
+syn match   masmOption		"ALIGN([0-9]\+)"
 
 syn keyword masmRegister	AX BX CX DX SI DI BP SP
-syn keyword masmRegister	ES DS SS CS
+syn keyword masmRegister	CS DS SS ES FS GS
 syn keyword masmRegister	AH BH CH DH AL BL CL DL
 syn keyword masmRegister	EAX EBX ECX EDX ESI EDI EBP ESP
+syn keyword masmRegister	CR0 CR2 CR3 CR4
+syn keyword masmRegister	DR0 DR1 DR2 DR3 DR6 DR7
+syn keyword masmRegister	TR3 TR4 TR5 TR6 TR7
+syn match   masmRegister	"ST([0-7])"
 
 
-" these are current as of the 486 - don't have any pentium manuals handy
-syn keyword masmOpcode		AAA AAD AAM AAS ADC ADD AND ARPL BOUND BSF
-syn keyword masmOpcode		BSR BSWAP BT BTC BTR BTS BSWAP BT BTC BTR
-syn keyword masmOpcode		BTS CALL CBW CDQ CLC CLD CLI CLTS CMC CMP
-syn keyword masmOpcode		CMPS CMPSB CMPSW CMPSD CMPXCHG CWD CWDE DAA
-syn keyword masmOpcode		DAS DEC DIV ENTER HLT IDIV IMUL IN INC INS
-syn keyword masmOpcode		INSB INSW INSD INT INTO INVD INVLPG IRET
-syn keyword masmOpcode		IRETD JA JAE JB JBE JC JCXZ JECXZ JE JZ JG
-syn keyword masmOpcode		JGE JL JLE JNA JNAE JNB JNBE JNC JNE JNG JNGE
-syn keyword masmOpcode		JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO JS JZ
-syn keyword masmOpcode		JMP LAHF LAR LEA LEAVE LGDT LIDT LGS LSS LFS
-syn keyword masmOpcode		LODS LODSB LODSW LODSD LOOP LOOPE LOOPZ LOONE
-syn keyword masmOpcode		LOOPNE RETF RETN
-syn keyword masmOpcode		LDS LES LLDT LMSW LOCK LSL LTR MOV MOVS MOVSB
-syn keyword masmOpcode		MOVSW MOVSD MOVSX MOVZX MUL NEG NOP NOT OR
-syn keyword masmOpcode		OUT OUTS OUTSB OUTSW OUTSD POP POPA POPD
-syn keyword masmOpcode		POPF POPFD PUSH PUSHA PUSHAD PUSHF PUSHFD
-syn keyword masmOpcode		RCL RCR ROL ROR REP REPE REPZ REPNE REPNZ
-syn keyword masmOpcode		RET SAHF SAL SAR SHL SHR SBB SCAS SCASB
-syn keyword masmOpcode		SCASW SCASD SETA SETAE SETB SETBE SETC SETE
-syn keyword masmOpcode		SETG SETGE SETL SETLE SETNA SETNAE SETNB
-syn keyword masmOpcode		SETNBE SETNC SETNE SETNG SETNGE SETNL SETNLE
-syn keyword masmOpcode		SETNO SETNP SETNS SETNZ SETO SETP SETPE SETPO
-syn keyword masmOpcode		SETS SETZ SGDT SIDT SHLD SHRD SLDT SMSW STC
-syn keyword masmOpcode		STD STI STOS STOSB STOSW STOSD STR SUB TEST
-syn keyword masmOpcode		VERR VERW WAIT WBINVD XADD XCHG XLAT XLATB XOR
+" Instruction prefixes
+syn keyword masmOpcode		LOCK REP REPE REPNE REPNZ REPZ
 
-" floating point coprocessor as of 487
+" 8086/8088 opcodes
+syn keyword masmOpcode		AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD
+syn keyword masmOpcode		CLI CMC CMP CMPS CMPSB CMPSW CWD DAA DAS DEC
+syn keyword masmOpcode		DIV ESC HLT IDIV IMUL IN INC INT INTO IRET
+syn keyword masmOpcode		JCXZ JMP LAHF LDS LEA LES LODS LODSB LODSW
+syn keyword masmOpcode		LOOP LOOPE LOOPEW LOOPNE LOOPNEW LOOPNZ
+syn keyword masmOpcode		LOOPNZW LOOPW LOOPZ LOOPZW MOV MOVS MOVSB
+syn keyword masmOpcode		MOVSW MUL NEG NOP NOT OR OUT POP POPF PUSH
+syn keyword masmOpcode		PUSHF RCL RCR RET RETF RETN ROL ROR SAHF SAL
+syn keyword masmOpcode		SAR SBB SCAS SCASB SCASW SHL SHR STC STD STI
+syn keyword masmOpcode		STOS STOSB STOSW SUB TEST WAIT XCHG XLAT XLATB
+syn keyword masmOpcode		XOR
+syn match   masmOpcode	      "J\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
+" 80186 opcodes
+syn keyword masmOpcode		BOUND ENTER INS INSB INSW LEAVE OUTS OUTSB
+syn keyword masmOpcode		OUTSW POPA PUSHA PUSHW
+
+" 80286 opcodes
+syn keyword masmOpcode		ARPL LAR LSL SGDT SIDT SLDT SMSW STR VERR VERW
+
+" 80286/80386 privileged opcodes
+syn keyword masmOpcode		CLTS LGDT LIDT LLDT LMSW LTR
+
+" 80386 opcodes
+syn keyword masmOpcode		BSF BSR BT BTC BTR BTS CDQ CMPSD CWDE INSD
+syn keyword masmOpcode		IRETD IRETDF IRETF JECXZ LFS LGS LODSD LOOPD
+syn keyword masmOpcode		LOOPED LOOPNED LOOPNZD LOOPZD LSS MOVSD MOVSX
+syn keyword masmOpcode		MOVZX OUTSD POPAD POPFD PUSHAD PUSHD PUSHFD
+syn keyword masmOpcode		SCASD SHLD SHRD STOSD
+syn match   masmOpcode	    "SET\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
+" 80486 opcodes
+syn keyword masmOpcode		BSWAP CMPXCHG INVD INVLPG WBINVD XADD
+
+" Floating-point opcodes as of 487
 syn keyword masmOpFloat		F2XM1 FABS FADD FADDP FBLD FBSTP FCHS FCLEX
 syn keyword masmOpFloat		FNCLEX FCOM FCOMP FCOMPP FCOS FDECSTP FDISI
 syn keyword masmOpFloat		FNDISI FDIV FDIVP FDIVR FDIVRP FENI FNENI
@@ -103,13 +226,73 @@
 syn keyword masmOpFloat		FIMUL FINCSTP FINIT FNINIT FIST FISTP FISUB
 syn keyword masmOpFloat		FISUBR FLD FLDCW FLDENV FLDLG2 FLDLN2 FLDL2E
 syn keyword masmOpFloat		FLDL2T FLDPI FLDZ FLD1 FMUL FMULP FNOP FPATAN
-syn keyword masmOpFloat		FPREM FPREM1 FPTAN FRNDINT FRSTOR FSAVE
-syn keyword masmOpFloat		FNSAVE FSCALE FSETPM FSIN FSINCOS FSQRT FST
-syn keyword masmOpFloat		FSTCW FNSTCW FSTENV FNSTENV FSTP FSTSW FNSTSW
-syn keyword masmOpFloat		FSUB FSUBP FSUBR FSUBRP FTST FUCOM FUCOMP
-syn keyword masmOpFloat		FUCOMPP FWAIT FXAM FXCH FXTRACT FYL2X FYL2XP1
-syn match   masmOpFloat		"FSTSW[ \t]\+AX"
-syn match   masmOpFloat		"FNSTSW[ \t]\+AX"
+syn keyword masmOpFloat		FPREM FPREM1 FPTAN FRNDINT FRSTOR FSAVE FNSAVE
+syn keyword masmOpFloat		FSCALE FSETPM FSIN FSINCOS FSQRT FST FSTCW
+syn keyword masmOpFloat		FNSTCW FSTENV FNSTENV FSTP FSTSW FNSTSW FSUB
+syn keyword masmOpFloat		FSUBP FSUBR FSUBRP FTST FUCOM FUCOMP FUCOMPP
+syn keyword masmOpFloat		FWAIT FXAM FXCH FXTRACT FYL2X FYL2XP1
+
+" Floating-point opcodes in Pentium and later processors
+syn keyword masmOpFloat		FCMOVE FCMOVNE FCMOVB FCMOVBE FCMOVNB FCMOVNBE
+syn keyword masmOpFloat		FCMOVU FCMOVNU FCOMI FUCOMI FCOMIP FUCOMIP
+syn keyword masmOpFloat		FXSAVE FXRSTOR
+
+" MMX opcodes (Pentium w/ MMX, Pentium II, and later)
+syn keyword masmOpcode		MOVD MOVQ PACKSSWB PACKSSDW PACKUSWB
+syn keyword masmOpcode		PUNPCKHBW PUNPCKHWD PUNPCKHDQ
+syn keyword masmOpcode		PUNPCKLBW PUNPCKLWD PUNPCKLDQ
+syn keyword masmOpcode		PADDB PADDW PADDD PADDSB PADDSW PADDUSB PADDUSW
+syn keyword masmOpcode		PSUBB PSUBW PSUBD PSUBSB PSUBSW PSUBUSB PSUBUSW
+syn keyword masmOpcode		PMULHW PMULLW PMADDWD
+syn keyword masmOpcode		PCMPEQB PCMPEQW PCMPEQD PCMPGTB PCMPGTW PCMPGTD
+syn keyword masmOpcode		PAND PANDN POR PXOR
+syn keyword masmOpcode		PSLLW PSLLD PSLLQ PSRLW PSRLD PSRLQ PSRAW PSRAD
+syn keyword masmOpcode		EMMS
+
+" SSE opcodes (Pentium III and later)
+syn keyword masmOpcode		MOVAPS MOVUPS MOVHPS MOVHLPS MOVLPS MOVLHPS
+syn keyword masmOpcode		MOVMSKPS MOVSS
+syn keyword masmOpcode		ADDPS ADDSS SUBPS SUBSS MULPS MULSS DIVPS DIVSS
+syn keyword masmOpcode		RCPPS RCPSS SQRTPS SQRTSS RSQRTPS RSQRTSS
+syn keyword masmOpcode		MAXPS MAXSS MINPS MINSS
+syn keyword masmOpcode		CMPPS CMPSS COMISS UCOMISS
+syn keyword masmOpcode		ANDPS ANDNPS ORPS XORPS
+syn keyword masmOpcode		SHUFPS UNPCKHPS UNPCKLPS
+syn keyword masmOpcode		CVTPI2PS CVTSI2SS CVTPS2PI CVTTPS2PI
+syn keyword masmOpcode		CVTSS2SI CVTTSS2SI
+syn keyword masmOpcode		LDMXCSR STMXCSR
+syn keyword masmOpcode		PAVGB PAVGW PEXTRW PINSRW PMAXUB PMAXSW
+syn keyword masmOpcode		PMINUB PMINSW PMOVMSKB PMULHUW PSADBW PSHUFW
+syn keyword masmOpcode		MASKMOVQ MOVNTQ MOVNTPS SFENCE
+syn keyword masmOpcode		PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
+
+" SSE2 opcodes (Pentium 4 and later)
+syn keyword masmOpcode		MOVAPD MOVUPD MOVHPD MOVLPD MOVMSKPD MOVSD
+syn keyword masmOpcode		ADDPD ADDSD SUBPD SUBSD MULPD MULSD DIVPD DIVSD
+syn keyword masmOpcode		SQRTPD SQRTSD MAXPD MAXSD MINPD MINSD
+syn keyword masmOpcode		ANDPD ANDNPD ORPD XORPD
+syn keyword masmOpcode		CMPPD CMPSD COMISD UCOMISD
+syn keyword masmOpcode		SHUFPD UNPCKHPD UNPCKLPD
+syn keyword masmOpcode		CVTPD2PI CVTTPD2PI CVTPI2PD CVTPD2DQ
+syn keyword masmOpcode		CVTTPD2DQ CVTDQ2PD CVTPS2PD CVTPD2PS
+syn keyword masmOpcode		CVTSS2SD CVTSD2SS CVTSD2SI CVTTSD2SI CVTSI2SD
+syn keyword masmOpcode		CVTDQ2PS CVTPS2DQ CVTTPS2DQ
+syn keyword masmOpcode		MOVDQA MOVDQU MOVQ2DQ MOVDQ2Q PMULUDQ
+syn keyword masmOpcode		PADDQ PSUBQ PSHUFLW PSHUFHW PSHUFD
+syn keyword masmOpcode		PSLLDQ PSRLDQ PUNPCKHQDQ PUNPCKLQDQ
+syn keyword masmOpcode		CLFLUSH LFENCE MFENCE PAUSE MASKMOVDQU
+syn keyword masmOpcode		MOVNTPD MOVNTDQ MOVNTI
+
+" SSE3 opcodes (Pentium 4 w/ Hyper-Threading and later)
+syn keyword masmOpcode		FISTTP LDDQU ADDSUBPS ADDSUBPD
+syn keyword masmOpcode		HADDPS HSUBPS HADDPD HSUBPD
+syn keyword masmOpcode		MOVSHDUP MOVSLDUP MOVDDUP MONITOR MWAIT
+
+" Other opcodes in Pentium and later processors
+syn keyword masmOpcode		CMPXCHG8B CPUID UD2
+syn keyword masmOpcode		RSM RDMSR WRMSR RDPMC RDTSC SYSENTER SYSEXIT
+syn match   masmOpcode	   "CMOV\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
 
 " Define the default highlighting.
 " For version 5.7 and earlier: only when not done already
@@ -123,19 +306,30 @@
   endif
 
   " The default methods for highlighting.  Can be overridden later
-  HiLink masmLabel	Label
+  HiLink masmLabel	PreProc
   HiLink masmComment	Comment
   HiLink masmDirective	Statement
-  HiLink masmOperator	Statement
+  HiLink masmType	Type
+  HiLink masmOperator	Type
+  HiLink masmOption	Special
+  HiLink masmRegister	Special
   HiLink masmString	String
+  HiLink masmText	String
+  HiLink masmTitle	Title
+  HiLink masmOpcode	Statement
+  HiLink masmOpFloat	Statement
 
   HiLink masmHexadecimal Number
   HiLink masmDecimal	Number
+  HiLink masmOctal	Number
   HiLink masmBinary	Number
+  HiLink masmFloatRaw	Number
   HiLink masmFloat	Number
 
   HiLink masmIdentifier Identifier
 
+  syntax sync minlines=50
+
   delcommand HiLink
 endif