This commit is contained in:
ignuki
2018-09-26 20:49:41 +02:00
parent 3c72294435
commit f56e581916
2 changed files with 809 additions and 28 deletions

79
init.el
View File

@@ -11,10 +11,10 @@
(unless package-archive-contents (package-refresh-contents))
(defvar prelude-packages
'(async counsel dracula-theme evil evil-magit fill-column-indicator ghc
'(async cargo counsel dracula-theme evil evil-magit fill-column-indicator ghc
git-commit go-mode goto-chg haskell-mode ivy less-css-mode magit
magit-popup pkg-info python s swiper undo-tree use-package
use-package-chords web-mode with-editor)
magit-popup pkg-info python rust-mode s swiper toml-mode undo-tree
use-package use-package-chords web-mode with-editor)
"A list of packages to ensure are installed at launch.")
(dolist (pkg prelude-packages)
@@ -26,6 +26,9 @@
(when (fboundp 'windmove-default-keybindings) (windmove-default-keybindings))
(add-to-list 'default-frame-alist '(font . "Iosevka Term 11"))
(set-face-font 'bold "Iosevka Term Bold 11")
(set-face-font 'italic "Iosevka Term Italic 11")
(set-face-font 'bold-italic "Iosevka Term Bold Italic 11")
(set-frame-font "Iosevka Term 11")
(setq frame-title-format
@@ -36,7 +39,7 @@
inhibit-startup-screen t
vc-follow-symlinks t
inhibit-compacting-font-caches 1
mouse-wheel-scroll-amount '(1 ((shift) . 1))
mouse-wheel-scroll-amount '(3 ((shift) . 3))
mouse-wheel-progressive-speed nil
mouse-wheel-follow-mouse 't
;; scroll-margin 1
@@ -73,6 +76,7 @@
(load "~/.emacs.d/lisp/plsql.el")
(load "~/.emacs.d/lisp/dockerfile-mode.el")
(load "~/.emacs.d/lisp/nasm-mode.el")
(add-to-list 'auto-mode-alist
'("\\.\\(p\\(?:k[bg]\\|ls\\)\\|sql\\)\\'" . plsql-mode))
(add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode))
@@ -149,24 +153,20 @@
(require 'use-package)
(use-package ivy
:init (setq ivy-use-virtual-buffers t
ivy-count-format ""
ivy-display-style nil)
:config (ivy-mode 1))
(use-package dracula-theme
:config (load-theme 'dracula t))
(use-package swiper
:bind (("C-s" . swiper)))
(use-package cargo
:init
(add-hook 'rust-mode-hook 'cargo-minor-mode))
(use-package counsel
:bind (("M-x" . counsel-M-x)
("C-x C-f" . counsel-find-file)))
(use-package dracula-theme
:config (load-theme 'dracula t))
(use-package evil
:init (setq evil-want-fine-undo t)
:init
(setq evil-want-fine-undo t)
:config (evil-mode 1))
(use-package evil-magit
@@ -176,12 +176,41 @@
:init
(setq fci-rule-column 80))
(use-package go-mode
:mode ("\\.go\\'" . go-mode))
(use-package haskell-mode
:mode ("\\.hs\\'" . haskell-mode)
:interpreter ("haskell" . haskell-mode))
(use-package go-mode
:mode ("\\.go\\'" . go-mode))
(use-package ivy
:init (setq ivy-use-virtual-buffers t
ivy-count-format ""
ivy-display-style nil)
:config (ivy-mode 1))
(use-package less-css-mode
:mode ("\\.less\\'" . less-css-mode))
(use-package nasm-mode
:mode ("\\.s\\'" . nasm-mode)
:mode ("\\.asm\\'" . nasm-mode)
:mode ("\\.nasm\\'" . nasm-mode))
(use-package python
:mode ("\\.py\\'" . python-mode)
:interpreter ("python" . python-mode))
(use-package rust-mode
:mode ("\\.rs\\'" . rust-mode)
:init
(setq rust-format-on-save t))
(use-package swiper
:bind (("C-s" . swiper)))
(use-package toml-mode
:mode ("\\.toml\\'" . toml-mode))
(use-package web-mode
:mode ("\\.html\\'" . web-mode)
@@ -193,21 +222,15 @@
:mode ("\\.mustache\\'" . web-mode)
:mode ("\\.djhtml\\'" . web-mode)
:mode ("\\.html?\\'" . web-mode)
:init (setq web-mode-markup-indent-offset 2
web-mode-code-indent-offset 2
web-mode-css-indent-offset 2))
(use-package less-css-mode
:mode ("\\.less\\'" . less-css-mode))
:init
(setq web-mode-markup-indent-offset 2
web-mode-code-indent-offset 2
web-mode-css-indent-offset 2))
(use-package yaml-mode
:mode ("\\.yml\\'" . yaml-mode)
:mode ("\\.yaml\\'" . yaml-mode))
(use-package python
:mode ("\\.py\\'" . python-mode)
:interpreter ("python" . python-mode))
(defvar linum-current-line 1 "Current line number.")
(defvar linum-format-fmt "" " ")
(defvar linum-format "" " ")

758
lisp/nasm-mode.el Normal file
View File

@@ -0,0 +1,758 @@
;;; nasm-mode.el --- NASM x86 assembly major mode -*- lexical-binding: t; -*-
;; This is free and unencumbered software released into the public domain.
;; Author: Christopher Wellons <wellons@nullprogram.com>
;; URL: https://github.com/skeeto/nasm-mode
;; Version: 1.1.1
;; Package-Requires: ((emacs "24.3"))
;;; Commentary:
;; A major mode for editing NASM x86 assembly programs. It includes
;; syntax highlighting, automatic indentation, and imenu integration.
;; Unlike Emacs' generic `asm-mode`, it understands NASM-specific
;; syntax.
;; NASM Home: http://www.nasm.us/
;; Labels without colons are not recognized as labels by this mode,
;; since, without a parser equal to that of NASM itself, it's
;; otherwise ambiguous between macros and labels. This covers both
;; indentation and imenu support.
;; The keyword lists are up to date as of NASM 2.12.01.
;; http://www.nasm.us/doc/nasmdocb.html
;; TODO:
;; [ ] Line continuation awareness
;; [x] Don't run comment command if type ';' inside a string
;; [ ] Nice multi-; comments, like in asm-mode
;; [x] Be able to hit tab after typing mnemonic and insert a TAB
;; [ ] Autocompletion
;; [ ] Help menu with basic summaries of instructions
;; [ ] Highlight errors, e.g. size mismatches "mov al, dword [rbx]"
;; [ ] Work nicely with outline-minor-mode
;; [ ] Highlighting of multiline macro definition arguments
;;; Code:
(require 'imenu)
(defgroup nasm-mode ()
"Options for `nasm-mode'."
:group 'languages)
(defgroup nasm-mode-faces ()
"Faces used by `nasm-mode'."
:group 'nasm-mode)
(defcustom nasm-basic-offset (default-value 'tab-width)
"Indentation level for `nasm-mode'."
:type 'integer
:group 'nasm-mode)
(defcustom nasm-after-mnemonic-whitespace :tab
"In `nasm-mode', determines the whitespace to use after mnemonics.
This can be :tab, :space, or nil (do nothing)."
:type '(choice (const :tab) (const :space) (const nil))
:group 'nasm-mode)
(defface nasm-registers
'((t :inherit (font-lock-variable-name-face)))
"Face for registers."
:group 'nasm-mode-faces)
(defface nasm-prefix
'((t :inherit (font-lock-builtin-face)))
"Face for prefix."
:group 'nasm-mode-faces)
(defface nasm-types
'((t :inherit (font-lock-type-face)))
"Face for types."
:group 'nasm-mode-faces)
(defface nasm-instructions
'((t :inherit (font-lock-builtin-face)))
"Face for instructions."
:group 'nasm-mode-faces)
(defface nasm-directives
'((t :inherit (font-lock-keyword-face)))
"Face for directives."
:group 'nasm-mode-faces)
(defface nasm-preprocessor
'((t :inherit (font-lock-preprocessor-face)))
"Face for preprocessor directives."
:group 'nasm-mode-faces)
(defface nasm-labels
'((t :inherit (font-lock-function-name-face)))
"Face for nonlocal labels."
:group 'nasm-mode-faces)
(defface nasm-local-labels
'((t :inherit (font-lock-function-name-face)))
"Face for local labels."
:group 'nasm-mode-faces)
(defface nasm-section-name
'((t :inherit (font-lock-type-face)))
"Face for section name face."
:group 'nasm-mode-faces)
(defface nasm-constant
'((t :inherit (font-lock-constant-face)))
"Face for constant."
:group 'nasm-mode-faces)
(eval-and-compile
(defconst nasm-registers
'("ah" "al" "ax" "bh" "bl" "bnd0" "bnd1" "bnd2" "bnd3" "bp" "bpl"
"bx" "ch" "cl" "cr0" "cr1" "cr10" "cr11" "cr12" "cr13" "cr14"
"cr15" "cr2" "cr3" "cr4" "cr5" "cr6" "cr7" "cr8" "cr9" "cs" "cx"
"dh" "di" "dil" "dl" "dr0" "dr1" "dr10" "dr11" "dr12" "dr13"
"dr14" "dr15" "dr2" "dr3" "dr4" "dr5" "dr6" "dr7" "dr8" "dr9" "ds"
"dx" "eax" "ebp" "ebx" "ecx" "edi" "edx" "es" "esi" "esp" "fs"
"gs" "k0" "k1" "k2" "k3" "k4" "k5" "k6" "k7" "mm0" "mm1" "mm2"
"mm3" "mm4" "mm5" "mm6" "mm7" "r10" "r10b" "r10d" "r10w" "r11"
"r11b" "r11d" "r11w" "r12" "r12b" "r12d" "r12w" "r13" "r13b"
"r13d" "r13w" "r14" "r14b" "r14d" "r14w" "r15" "r15b" "r15d"
"r15w" "r8" "r8b" "r8d" "r8w" "r9" "r9b" "r9d" "r9w" "rax" "rbp"
"rbx" "rcx" "rdi" "rdx" "rsi" "rsp" "segr6" "segr7" "si" "sil"
"sp" "spl" "ss" "st0" "st1" "st2" "st3" "st4" "st5" "st6" "st7"
"tr0" "tr1" "tr2" "tr3" "tr4" "tr5" "tr6" "tr7" "xmm0" "xmm1"
"xmm10" "xmm11" "xmm12" "xmm13" "xmm14" "xmm15" "xmm16" "xmm17"
"xmm18" "xmm19" "xmm2" "xmm20" "xmm21" "xmm22" "xmm23" "xmm24"
"xmm25" "xmm26" "xmm27" "xmm28" "xmm29" "xmm3" "xmm30" "xmm31"
"xmm4" "xmm5" "xmm6" "xmm7" "xmm8" "xmm9" "ymm0" "ymm1" "ymm10"
"ymm11" "ymm12" "ymm13" "ymm14" "ymm15" "ymm16" "ymm17" "ymm18"
"ymm19" "ymm2" "ymm20" "ymm21" "ymm22" "ymm23" "ymm24" "ymm25"
"ymm26" "ymm27" "ymm28" "ymm29" "ymm3" "ymm30" "ymm31" "ymm4"
"ymm5" "ymm6" "ymm7" "ymm8" "ymm9" "zmm0" "zmm1" "zmm10" "zmm11"
"zmm12" "zmm13" "zmm14" "zmm15" "zmm16" "zmm17" "zmm18" "zmm19"
"zmm2" "zmm20" "zmm21" "zmm22" "zmm23" "zmm24" "zmm25" "zmm26"
"zmm27" "zmm28" "zmm29" "zmm3" "zmm30" "zmm31" "zmm4" "zmm5"
"zmm6" "zmm7" "zmm8" "zmm9")
"NASM registers (reg.c) for `nasm-mode'."))
(eval-and-compile
(defconst nasm-directives
'("absolute" "bits" "common" "cpu" "debug" "default" "extern"
"float" "global" "list" "section" "segment" "warning" "sectalign"
"export" "group" "import" "library" "map" "module" "org" "osabi"
"safeseh" "uppercase")
"NASM directives (directiv.c) for `nasm-mode'."))
(eval-and-compile
(defconst nasm-instructions
'("aaa" "aad" "aam" "aas" "adc" "adcx" "add" "addpd" "addps"
"addsd" "addss" "addsubpd" "addsubps" "adox" "aesdec"
"aesdeclast" "aesenc" "aesenclast" "aesimc" "aeskeygenassist"
"and" "andn" "andnpd" "andnps" "andpd" "andps" "arpl"
"bb0_reset" "bb1_reset" "bextr" "blcfill" "blci" "blcic"
"blcmsk" "blcs" "blendpd" "blendps" "blendvpd" "blendvps"
"blsfill" "blsi" "blsic" "blsmsk" "blsr" "bndcl" "bndcn" "bndcu"
"bndldx" "bndmk" "bndmov" "bndstx" "bound" "bsf" "bsr" "bswap"
"bt" "btc" "btr" "bts" "bzhi" "call" "cbw" "cdq" "cdqe" "clac"
"clc" "cld" "clflush" "clflushopt" "clgi" "cli" "clts" "clzero"
"cmc" "cmova" "cmovae" "cmovb" "cmovbe" "cmovc" "cmove" "cmovg"
"cmovge" "cmovl" "cmovle" "cmovna" "cmovnae" "cmovnb" "cmovnbe"
"cmovnc" "cmovne" "cmovng" "cmovnge" "cmovnl" "cmovnle" "cmovno"
"cmovnp" "cmovns" "cmovnz" "cmovo" "cmovp" "cmovpe" "cmovpo"
"cmovs" "cmovz" "cmp" "cmpeqpd" "cmpeqps" "cmpeqsd" "cmpeqss"
"cmplepd" "cmpleps" "cmplesd" "cmpless" "cmpltpd" "cmpltps"
"cmpltsd" "cmpltss" "cmpneqpd" "cmpneqps" "cmpneqsd" "cmpneqss"
"cmpnlepd" "cmpnleps" "cmpnlesd" "cmpnless" "cmpnltpd"
"cmpnltps" "cmpnltsd" "cmpnltss" "cmpordpd" "cmpordps"
"cmpordsd" "cmpordss" "cmppd" "cmpps" "cmpsb" "cmpsd" "cmpsq"
"cmpss" "cmpsw" "cmpunordpd" "cmpunordps" "cmpunordsd"
"cmpunordss" "cmpxchg" "cmpxchg16b" "cmpxchg486" "cmpxchg8b"
"comisd" "comiss" "cpu_read" "cpu_write" "cpuid" "cqo" "crc32"
"cvtdq2pd" "cvtdq2ps" "cvtpd2dq" "cvtpd2pi" "cvtpd2ps"
"cvtpi2pd" "cvtpi2ps" "cvtps2dq" "cvtps2pd" "cvtps2pi"
"cvtsd2si" "cvtsd2ss" "cvtsi2sd" "cvtsi2ss" "cvtss2sd"
"cvtss2si" "cvttpd2dq" "cvttpd2pi" "cvttps2dq" "cvttps2pi"
"cvttsd2si" "cvttss2si" "cwd" "cwde" "daa" "das" "db" "dd" "dec"
"div" "divpd" "divps" "divsd" "divss" "dmint" "do" "dppd" "dpps"
"dq" "dt" "dw" "dy" "dz" "emms" "enter" "equ" "extractps"
"extrq" "f2xm1" "fabs" "fadd" "faddp" "fbld" "fbstp" "fchs"
"fclex" "fcmovb" "fcmovbe" "fcmove" "fcmovnb" "fcmovnbe"
"fcmovne" "fcmovnu" "fcmovu" "fcom" "fcomi" "fcomip" "fcomp"
"fcompp" "fcos" "fdecstp" "fdisi" "fdiv" "fdivp" "fdivr"
"fdivrp" "femms" "feni" "ffree" "ffreep" "fiadd" "ficom"
"ficomp" "fidiv" "fidivr" "fild" "fimul" "fincstp" "finit"
"fist" "fistp" "fisttp" "fisub" "fisubr" "fld" "fld1" "fldcw"
"fldenv" "fldl2e" "fldl2t" "fldlg2" "fldln2" "fldpi" "fldz"
"fmul" "fmulp" "fnclex" "fndisi" "fneni" "fninit" "fnop"
"fnsave" "fnstcw" "fnstenv" "fnstsw" "fpatan" "fprem" "fprem1"
"fptan" "frndint" "frstor" "fsave" "fscale" "fsetpm" "fsin"
"fsincos" "fsqrt" "fst" "fstcw" "fstenv" "fstp" "fstsw" "fsub"
"fsubp" "fsubr" "fsubrp" "ftst" "fucom" "fucomi" "fucomip"
"fucomp" "fucompp" "fwait" "fxam" "fxch" "fxrstor" "fxrstor64"
"fxsave" "fxsave64" "fxtract" "fyl2x" "fyl2xp1" "getsec"
"haddpd" "haddps" "hint_nop0" "hint_nop1" "hint_nop10"
"hint_nop11" "hint_nop12" "hint_nop13" "hint_nop14" "hint_nop15"
"hint_nop16" "hint_nop17" "hint_nop18" "hint_nop19" "hint_nop2"
"hint_nop20" "hint_nop21" "hint_nop22" "hint_nop23" "hint_nop24"
"hint_nop25" "hint_nop26" "hint_nop27" "hint_nop28" "hint_nop29"
"hint_nop3" "hint_nop30" "hint_nop31" "hint_nop32" "hint_nop33"
"hint_nop34" "hint_nop35" "hint_nop36" "hint_nop37" "hint_nop38"
"hint_nop39" "hint_nop4" "hint_nop40" "hint_nop41" "hint_nop42"
"hint_nop43" "hint_nop44" "hint_nop45" "hint_nop46" "hint_nop47"
"hint_nop48" "hint_nop49" "hint_nop5" "hint_nop50" "hint_nop51"
"hint_nop52" "hint_nop53" "hint_nop54" "hint_nop55" "hint_nop56"
"hint_nop57" "hint_nop58" "hint_nop59" "hint_nop6" "hint_nop60"
"hint_nop61" "hint_nop62" "hint_nop63" "hint_nop7" "hint_nop8"
"hint_nop9" "hlt" "hsubpd" "hsubps" "ibts" "icebp" "idiv" "imul"
"in" "inc" "incbin" "insb" "insd" "insertps" "insertq" "insw"
"int" "int01" "int03" "int1" "int3" "into" "invd" "invept"
"invlpg" "invlpga" "invpcid" "invvpid" "iret" "iretd" "iretq"
"iretw" "ja" "jae" "jb" "jbe" "jc" "jcxz" "je" "jecxz" "jg"
"jge" "jl" "jle" "jmp" "jmpe" "jna" "jnae" "jnb" "jnbe" "jnc"
"jne" "jng" "jnge" "jnl" "jnle" "jno" "jnp" "jns" "jnz" "jo"
"jp" "jpe" "jpo" "jrcxz" "js" "jz" "kaddb" "kaddd" "kaddq"
"kaddw" "kandb" "kandd" "kandnb" "kandnd" "kandnq" "kandnw"
"kandq" "kandw" "kmovb" "kmovd" "kmovq" "kmovw" "knotb" "knotd"
"knotq" "knotw" "korb" "kord" "korq" "kortestb" "kortestd"
"kortestq" "kortestw" "korw" "kshiftlb" "kshiftld" "kshiftlq"
"kshiftlw" "kshiftrb" "kshiftrd" "kshiftrq" "kshiftrw" "ktestb"
"ktestd" "ktestq" "ktestw" "kunpckbw" "kunpckdq" "kunpckwd"
"kxnorb" "kxnord" "kxnorq" "kxnorw" "kxorb" "kxord" "kxorq"
"kxorw" "lahf" "lar" "lddqu" "ldmxcsr" "lds" "lea" "leave" "les"
"lfence" "lfs" "lgdt" "lgs" "lidt" "lldt" "llwpcb" "lmsw"
"loadall" "loadall286" "lodsb" "lodsd" "lodsq" "lodsw" "loop"
"loope" "loopne" "loopnz" "loopz" "lsl" "lss" "ltr" "lwpins"
"lwpval" "lzcnt" "maskmovdqu" "maskmovq" "maxpd" "maxps" "maxsd"
"maxss" "mfence" "minpd" "minps" "minsd" "minss" "monitor" "monitorx"
"montmul" "mov" "movapd" "movaps" "movbe" "movd" "movddup"
"movdq2q" "movdqa" "movdqu" "movhlps" "movhpd" "movhps"
"movlhps" "movlpd" "movlps" "movmskpd" "movmskps" "movntdq"
"movntdqa" "movnti" "movntpd" "movntps" "movntq" "movntsd"
"movntss" "movq" "movq2dq" "movsb" "movsd" "movshdup" "movsldup"
"movsq" "movss" "movsw" "movsx" "movsxd" "movupd" "movups"
"movzx" "mpsadbw" "mul" "mulpd" "mulps" "mulsd" "mulss" "mulx"
"mwait" "mwaitx" "neg" "nop" "not" "or" "orpd" "orps" "out" "outsb"
"outsd" "outsw" "pabsb" "pabsd" "pabsw" "packssdw" "packsswb"
"packusdw" "packuswb" "paddb" "paddd" "paddq" "paddsb" "paddsiw"
"paddsw" "paddusb" "paddusw" "paddw" "palignr" "pand" "pandn"
"pause" "paveb" "pavgb" "pavgusb" "pavgw" "pblendvb" "pblendw"
"pclmulhqhqdq" "pclmulhqlqdq" "pclmullqhqdq" "pclmullqlqdq"
"pclmulqdq" "pcmpeqb" "pcmpeqd" "pcmpeqq" "pcmpeqw" "pcmpestri"
"pcmpestrm" "pcmpgtb" "pcmpgtd" "pcmpgtq" "pcmpgtw" "pcmpistri"
"pcmpistrm" "pdep" "pdistib" "pext" "pextrb" "pextrd" "pextrq"
"pextrw" "pf2id" "pf2iw" "pfacc" "pfadd" "pfcmpeq" "pfcmpge"
"pfcmpgt" "pfmax" "pfmin" "pfmul" "pfnacc" "pfpnacc" "pfrcp"
"pfrcpit1" "pfrcpit2" "pfrcpv" "pfrsqit1" "pfrsqrt" "pfrsqrtv"
"pfsub" "pfsubr" "phaddd" "phaddsw" "phaddw" "phminposuw"
"phsubd" "phsubsw" "phsubw" "pi2fd" "pi2fw" "pinsrb" "pinsrd"
"pinsrq" "pinsrw" "pmachriw" "pmaddubsw" "pmaddwd" "pmagw"
"pmaxsb" "pmaxsd" "pmaxsw" "pmaxub" "pmaxud" "pmaxuw" "pminsb"
"pminsd" "pminsw" "pminub" "pminud" "pminuw" "pmovmskb"
"pmovsxbd" "pmovsxbq" "pmovsxbw" "pmovsxdq" "pmovsxwd"
"pmovsxwq" "pmovzxbd" "pmovzxbq" "pmovzxbw" "pmovzxdq"
"pmovzxwd" "pmovzxwq" "pmuldq" "pmulhriw" "pmulhrsw" "pmulhrwa"
"pmulhrwc" "pmulhuw" "pmulhw" "pmulld" "pmullw" "pmuludq"
"pmvgezb" "pmvlzb" "pmvnzb" "pmvzb" "pop" "popa" "popad" "popaw"
"popcnt" "popf" "popfd" "popfq" "popfw" "por" "prefetch"
"prefetchnta" "prefetcht0" "prefetcht1" "prefetcht2" "prefetchw"
"prefetchwt1" "psadbw" "pshufb" "pshufd" "pshufhw" "pshuflw"
"pshufw" "psignb" "psignd" "psignw" "pslld" "pslldq" "psllq"
"psllw" "psrad" "psraw" "psrld" "psrldq" "psrlq" "psrlw" "psubb"
"psubd" "psubq" "psubsb" "psubsiw" "psubsw" "psubusb" "psubusw"
"psubw" "pswapd" "ptest" "punpckhbw" "punpckhdq" "punpckhqdq"
"punpckhwd" "punpcklbw" "punpckldq" "punpcklqdq" "punpcklwd"
"push" "pusha" "pushad" "pushaw" "pushf" "pushfd" "pushfq"
"pushfw" "pxor" "rcl" "rcpps" "rcpss" "rcr" "rdfsbase"
"rdgsbase" "rdm" "rdmsr" "rdpmc" "rdrand" "rdseed" "rdshr"
"rdtsc" "rdtscp" "resb" "resd" "reso" "resq" "rest" "resw"
"resy" "resz" "ret" "retf" "retn" "rol" "ror" "rorx" "roundpd"
"roundps" "roundsd" "roundss" "rsdc" "rsldt" "rsm" "rsqrtps"
"rsqrtss" "rsts" "sahf" "sal" "salc" "sar" "sarx" "sbb" "scasb"
"scasd" "scasq" "scasw" "seta" "setae" "setb" "setbe" "setc"
"sete" "setg" "setge" "setl" "setle" "setna" "setnae" "setnb"
"setnbe" "setnc" "setne" "setng" "setnge" "setnl" "setnle"
"setno" "setnp" "setns" "setnz" "seto" "setp" "setpe" "setpo"
"sets" "setz" "sfence" "sgdt" "sha1msg1" "sha1msg2" "sha1nexte"
"sha1rnds4" "sha256msg1" "sha256msg2" "sha256rnds2" "shl" "shld"
"shlx" "shr" "shrd" "shrx" "shufpd" "shufps" "sidt" "skinit"
"sldt" "slwpcb" "smi" "smint" "smintold" "smsw" "sqrtpd"
"sqrtps" "sqrtsd" "sqrtss" "stac" "stc" "std" "stgi" "sti"
"stmxcsr" "stosb" "stosd" "stosq" "stosw" "str" "sub" "subpd"
"subps" "subsd" "subss" "svdc" "svldt" "svts" "swapgs" "syscall"
"sysenter" "sysexit" "sysret" "t1mskc" "test" "tzcnt" "tzmsk"
"ucomisd" "ucomiss" "ud0" "ud1" "ud2" "ud2a" "ud2b" "umov"
"unpckhpd" "unpckhps" "unpcklpd" "unpcklps" "vaddpd" "vaddps"
"vaddsd" "vaddss" "vaddsubpd" "vaddsubps" "vaesdec"
"vaesdeclast" "vaesenc" "vaesenclast" "vaesimc"
"vaeskeygenassist" "valignd" "valignq" "vandnpd" "vandnps"
"vandpd" "vandps" "vblendmpd" "vblendmps" "vblendpd" "vblendps"
"vblendvpd" "vblendvps" "vbroadcastf128" "vbroadcastf32x2"
"vbroadcastf32x4" "vbroadcastf32x8" "vbroadcastf64x2"
"vbroadcastf64x4" "vbroadcasti128" "vbroadcasti32x2"
"vbroadcasti32x4" "vbroadcasti32x8" "vbroadcasti64x2"
"vbroadcasti64x4" "vbroadcastsd" "vbroadcastss" "vcmpeq_ospd"
"vcmpeq_osps" "vcmpeq_ossd" "vcmpeq_osss" "vcmpeq_uqpd"
"vcmpeq_uqps" "vcmpeq_uqsd" "vcmpeq_uqss" "vcmpeq_uspd"
"vcmpeq_usps" "vcmpeq_ussd" "vcmpeq_usss" "vcmpeqpd" "vcmpeqps"
"vcmpeqsd" "vcmpeqss" "vcmpfalse_oqpd" "vcmpfalse_oqps"
"vcmpfalse_oqsd" "vcmpfalse_oqss" "vcmpfalse_ospd"
"vcmpfalse_osps" "vcmpfalse_ossd" "vcmpfalse_osss" "vcmpfalsepd"
"vcmpfalseps" "vcmpfalsesd" "vcmpfalsess" "vcmpge_oqpd"
"vcmpge_oqps" "vcmpge_oqsd" "vcmpge_oqss" "vcmpge_ospd"
"vcmpge_osps" "vcmpge_ossd" "vcmpge_osss" "vcmpgepd" "vcmpgeps"
"vcmpgesd" "vcmpgess" "vcmpgt_oqpd" "vcmpgt_oqps" "vcmpgt_oqsd"
"vcmpgt_oqss" "vcmpgt_ospd" "vcmpgt_osps" "vcmpgt_ossd"
"vcmpgt_osss" "vcmpgtpd" "vcmpgtps" "vcmpgtsd" "vcmpgtss"
"vcmple_oqpd" "vcmple_oqps" "vcmple_oqsd" "vcmple_oqss"
"vcmple_ospd" "vcmple_osps" "vcmple_ossd" "vcmple_osss"
"vcmplepd" "vcmpleps" "vcmplesd" "vcmpless" "vcmplt_oqpd"
"vcmplt_oqps" "vcmplt_oqsd" "vcmplt_oqss" "vcmplt_ospd"
"vcmplt_osps" "vcmplt_ossd" "vcmplt_osss" "vcmpltpd" "vcmpltps"
"vcmpltsd" "vcmpltss" "vcmpneq_oqpd" "vcmpneq_oqps"
"vcmpneq_oqsd" "vcmpneq_oqss" "vcmpneq_ospd" "vcmpneq_osps"
"vcmpneq_ossd" "vcmpneq_osss" "vcmpneq_uqpd" "vcmpneq_uqps"
"vcmpneq_uqsd" "vcmpneq_uqss" "vcmpneq_uspd" "vcmpneq_usps"
"vcmpneq_ussd" "vcmpneq_usss" "vcmpneqpd" "vcmpneqps"
"vcmpneqsd" "vcmpneqss" "vcmpnge_uqpd" "vcmpnge_uqps"
"vcmpnge_uqsd" "vcmpnge_uqss" "vcmpnge_uspd" "vcmpnge_usps"
"vcmpnge_ussd" "vcmpnge_usss" "vcmpngepd" "vcmpngeps"
"vcmpngesd" "vcmpngess" "vcmpngt_uqpd" "vcmpngt_uqps"
"vcmpngt_uqsd" "vcmpngt_uqss" "vcmpngt_uspd" "vcmpngt_usps"
"vcmpngt_ussd" "vcmpngt_usss" "vcmpngtpd" "vcmpngtps"
"vcmpngtsd" "vcmpngtss" "vcmpnle_uqpd" "vcmpnle_uqps"
"vcmpnle_uqsd" "vcmpnle_uqss" "vcmpnle_uspd" "vcmpnle_usps"
"vcmpnle_ussd" "vcmpnle_usss" "vcmpnlepd" "vcmpnleps"
"vcmpnlesd" "vcmpnless" "vcmpnlt_uqpd" "vcmpnlt_uqps"
"vcmpnlt_uqsd" "vcmpnlt_uqss" "vcmpnlt_uspd" "vcmpnlt_usps"
"vcmpnlt_ussd" "vcmpnlt_usss" "vcmpnltpd" "vcmpnltps"
"vcmpnltsd" "vcmpnltss" "vcmpord_qpd" "vcmpord_qps"
"vcmpord_qsd" "vcmpord_qss" "vcmpord_spd" "vcmpord_sps"
"vcmpord_ssd" "vcmpord_sss" "vcmpordpd" "vcmpordps" "vcmpordsd"
"vcmpordss" "vcmppd" "vcmpps" "vcmpsd" "vcmpss" "vcmptrue_uqpd"
"vcmptrue_uqps" "vcmptrue_uqsd" "vcmptrue_uqss" "vcmptrue_uspd"
"vcmptrue_usps" "vcmptrue_ussd" "vcmptrue_usss" "vcmptruepd"
"vcmptrueps" "vcmptruesd" "vcmptruess" "vcmpunord_qpd"
"vcmpunord_qps" "vcmpunord_qsd" "vcmpunord_qss" "vcmpunord_spd"
"vcmpunord_sps" "vcmpunord_ssd" "vcmpunord_sss" "vcmpunordpd"
"vcmpunordps" "vcmpunordsd" "vcmpunordss" "vcomisd" "vcomiss"
"vcompresspd" "vcompressps" "vcvtdq2pd" "vcvtdq2ps" "vcvtpd2dq"
"vcvtpd2ps" "vcvtpd2qq" "vcvtpd2udq" "vcvtpd2uqq" "vcvtph2ps"
"vcvtps2dq" "vcvtps2pd" "vcvtps2ph" "vcvtps2qq" "vcvtps2udq"
"vcvtps2uqq" "vcvtqq2pd" "vcvtqq2ps" "vcvtsd2si" "vcvtsd2ss"
"vcvtsd2usi" "vcvtsi2sd" "vcvtsi2ss" "vcvtss2sd" "vcvtss2si"
"vcvtss2usi" "vcvttpd2dq" "vcvttpd2qq" "vcvttpd2udq"
"vcvttpd2uqq" "vcvttps2dq" "vcvttps2qq" "vcvttps2udq"
"vcvttps2uqq" "vcvttsd2si" "vcvttsd2usi" "vcvttss2si"
"vcvttss2usi" "vcvtudq2pd" "vcvtudq2ps" "vcvtuqq2pd"
"vcvtuqq2ps" "vcvtusi2sd" "vcvtusi2ss" "vdbpsadbw" "vdivpd"
"vdivps" "vdivsd" "vdivss" "vdppd" "vdpps" "verr" "verw"
"vexp2pd" "vexp2ps" "vexpandpd" "vexpandps" "vextractf128"
"vextractf32x4" "vextractf32x8" "vextractf64x2" "vextractf64x4"
"vextracti128" "vextracti32x4" "vextracti32x8" "vextracti64x2"
"vextracti64x4" "vextractps" "vfixupimmpd" "vfixupimmps"
"vfixupimmsd" "vfixupimmss" "vfmadd123pd" "vfmadd123ps"
"vfmadd123sd" "vfmadd123ss" "vfmadd132pd" "vfmadd132ps"
"vfmadd132sd" "vfmadd132ss" "vfmadd213pd" "vfmadd213ps"
"vfmadd213sd" "vfmadd213ss" "vfmadd231pd" "vfmadd231ps"
"vfmadd231sd" "vfmadd231ss" "vfmadd312pd" "vfmadd312ps"
"vfmadd312sd" "vfmadd312ss" "vfmadd321pd" "vfmadd321ps"
"vfmadd321sd" "vfmadd321ss" "vfmaddpd" "vfmaddps" "vfmaddsd"
"vfmaddss" "vfmaddsub123pd" "vfmaddsub123ps" "vfmaddsub132pd"
"vfmaddsub132ps" "vfmaddsub213pd" "vfmaddsub213ps"
"vfmaddsub231pd" "vfmaddsub231ps" "vfmaddsub312pd"
"vfmaddsub312ps" "vfmaddsub321pd" "vfmaddsub321ps" "vfmaddsubpd"
"vfmaddsubps" "vfmsub123pd" "vfmsub123ps" "vfmsub123sd"
"vfmsub123ss" "vfmsub132pd" "vfmsub132ps" "vfmsub132sd"
"vfmsub132ss" "vfmsub213pd" "vfmsub213ps" "vfmsub213sd"
"vfmsub213ss" "vfmsub231pd" "vfmsub231ps" "vfmsub231sd"
"vfmsub231ss" "vfmsub312pd" "vfmsub312ps" "vfmsub312sd"
"vfmsub312ss" "vfmsub321pd" "vfmsub321ps" "vfmsub321sd"
"vfmsub321ss" "vfmsubadd123pd" "vfmsubadd123ps" "vfmsubadd132pd"
"vfmsubadd132ps" "vfmsubadd213pd" "vfmsubadd213ps"
"vfmsubadd231pd" "vfmsubadd231ps" "vfmsubadd312pd"
"vfmsubadd312ps" "vfmsubadd321pd" "vfmsubadd321ps" "vfmsubaddpd"
"vfmsubaddps" "vfmsubpd" "vfmsubps" "vfmsubsd" "vfmsubss"
"vfnmadd123pd" "vfnmadd123ps" "vfnmadd123sd" "vfnmadd123ss"
"vfnmadd132pd" "vfnmadd132ps" "vfnmadd132sd" "vfnmadd132ss"
"vfnmadd213pd" "vfnmadd213ps" "vfnmadd213sd" "vfnmadd213ss"
"vfnmadd231pd" "vfnmadd231ps" "vfnmadd231sd" "vfnmadd231ss"
"vfnmadd312pd" "vfnmadd312ps" "vfnmadd312sd" "vfnmadd312ss"
"vfnmadd321pd" "vfnmadd321ps" "vfnmadd321sd" "vfnmadd321ss"
"vfnmaddpd" "vfnmaddps" "vfnmaddsd" "vfnmaddss" "vfnmsub123pd"
"vfnmsub123ps" "vfnmsub123sd" "vfnmsub123ss" "vfnmsub132pd"
"vfnmsub132ps" "vfnmsub132sd" "vfnmsub132ss" "vfnmsub213pd"
"vfnmsub213ps" "vfnmsub213sd" "vfnmsub213ss" "vfnmsub231pd"
"vfnmsub231ps" "vfnmsub231sd" "vfnmsub231ss" "vfnmsub312pd"
"vfnmsub312ps" "vfnmsub312sd" "vfnmsub312ss" "vfnmsub321pd"
"vfnmsub321ps" "vfnmsub321sd" "vfnmsub321ss" "vfnmsubpd"
"vfnmsubps" "vfnmsubsd" "vfnmsubss" "vfpclasspd" "vfpclassps"
"vfpclasssd" "vfpclassss" "vfrczpd" "vfrczps" "vfrczsd"
"vfrczss" "vgatherdpd" "vgatherdps" "vgatherpf0dpd"
"vgatherpf0dps" "vgatherpf0qpd" "vgatherpf0qps" "vgatherpf1dpd"
"vgatherpf1dps" "vgatherpf1qpd" "vgatherpf1qps" "vgatherqpd"
"vgatherqps" "vgetexppd" "vgetexpps" "vgetexpsd" "vgetexpss"
"vgetmantpd" "vgetmantps" "vgetmantsd" "vgetmantss" "vhaddpd"
"vhaddps" "vhsubpd" "vhsubps" "vinsertf128" "vinsertf32x4"
"vinsertf32x8" "vinsertf64x2" "vinsertf64x4" "vinserti128"
"vinserti32x4" "vinserti32x8" "vinserti64x2" "vinserti64x4"
"vinsertps" "vlddqu" "vldmxcsr" "vldqqu" "vmaskmovdqu"
"vmaskmovpd" "vmaskmovps" "vmaxpd" "vmaxps" "vmaxsd" "vmaxss"
"vmcall" "vmclear" "vmfunc" "vminpd" "vminps" "vminsd" "vminss"
"vmlaunch" "vmload" "vmmcall" "vmovapd" "vmovaps" "vmovd"
"vmovddup" "vmovdqa" "vmovdqa32" "vmovdqa64" "vmovdqu"
"vmovdqu16" "vmovdqu32" "vmovdqu64" "vmovdqu8" "vmovhlps"
"vmovhpd" "vmovhps" "vmovlhps" "vmovlpd" "vmovlps" "vmovmskpd"
"vmovmskps" "vmovntdq" "vmovntdqa" "vmovntpd" "vmovntps"
"vmovntqq" "vmovq" "vmovqqa" "vmovqqu" "vmovsd" "vmovshdup"
"vmovsldup" "vmovss" "vmovupd" "vmovups" "vmpsadbw" "vmptrld"
"vmptrst" "vmread" "vmresume" "vmrun" "vmsave" "vmulpd" "vmulps"
"vmulsd" "vmulss" "vmwrite" "vmxoff" "vmxon" "vorpd" "vorps"
"vpabsb" "vpabsd" "vpabsq" "vpabsw" "vpackssdw" "vpacksswb"
"vpackusdw" "vpackuswb" "vpaddb" "vpaddd" "vpaddq" "vpaddsb"
"vpaddsw" "vpaddusb" "vpaddusw" "vpaddw" "vpalignr" "vpand"
"vpandd" "vpandn" "vpandnd" "vpandnq" "vpandq" "vpavgb" "vpavgw"
"vpblendd" "vpblendmb" "vpblendmd" "vpblendmq" "vpblendmw"
"vpblendvb" "vpblendw" "vpbroadcastb" "vpbroadcastd"
"vpbroadcastmb2q" "vpbroadcastmw2d" "vpbroadcastq"
"vpbroadcastw" "vpclmulhqhqdq" "vpclmulhqlqdq" "vpclmullqhqdq"
"vpclmullqlqdq" "vpclmulqdq" "vpcmov" "vpcmpb" "vpcmpd"
"vpcmpeqb" "vpcmpeqd" "vpcmpeqq" "vpcmpeqw" "vpcmpestri"
"vpcmpestrm" "vpcmpgtb" "vpcmpgtd" "vpcmpgtq" "vpcmpgtw"
"vpcmpistri" "vpcmpistrm" "vpcmpq" "vpcmpub" "vpcmpud" "vpcmpuq"
"vpcmpuw" "vpcmpw" "vpcomb" "vpcomd" "vpcompressd" "vpcompressq"
"vpcomq" "vpcomub" "vpcomud" "vpcomuq" "vpcomuw" "vpcomw"
"vpconflictd" "vpconflictq" "vperm2f128" "vperm2i128" "vpermb"
"vpermd" "vpermi2b" "vpermi2d" "vpermi2pd" "vpermi2ps"
"vpermi2q" "vpermi2w" "vpermilpd" "vpermilps" "vpermpd"
"vpermps" "vpermq" "vpermt2b" "vpermt2d" "vpermt2pd" "vpermt2ps"
"vpermt2q" "vpermt2w" "vpermw" "vpexpandd" "vpexpandq" "vpextrb"
"vpextrd" "vpextrq" "vpextrw" "vpgatherdd" "vpgatherdq"
"vpgatherqd" "vpgatherqq" "vphaddbd" "vphaddbq" "vphaddbw"
"vphaddd" "vphadddq" "vphaddsw" "vphaddubd" "vphaddubq"
"vphaddubw" "vphaddudq" "vphadduwd" "vphadduwq" "vphaddw"
"vphaddwd" "vphaddwq" "vphminposuw" "vphsubbw" "vphsubd"
"vphsubdq" "vphsubsw" "vphsubw" "vphsubwd" "vpinsrb" "vpinsrd"
"vpinsrq" "vpinsrw" "vplzcntd" "vplzcntq" "vpmacsdd" "vpmacsdqh"
"vpmacsdql" "vpmacssdd" "vpmacssdqh" "vpmacssdql" "vpmacsswd"
"vpmacssww" "vpmacswd" "vpmacsww" "vpmadcsswd" "vpmadcswd"
"vpmadd52huq" "vpmadd52luq" "vpmaddubsw" "vpmaddwd" "vpmaskmovd"
"vpmaskmovq" "vpmaxsb" "vpmaxsd" "vpmaxsq" "vpmaxsw" "vpmaxub"
"vpmaxud" "vpmaxuq" "vpmaxuw" "vpminsb" "vpminsd" "vpminsq"
"vpminsw" "vpminub" "vpminud" "vpminuq" "vpminuw" "vpmovb2m"
"vpmovd2m" "vpmovdb" "vpmovdw" "vpmovm2b" "vpmovm2d" "vpmovm2q"
"vpmovm2w" "vpmovmskb" "vpmovq2m" "vpmovqb" "vpmovqd" "vpmovqw"
"vpmovsdb" "vpmovsdw" "vpmovsqb" "vpmovsqd" "vpmovsqw"
"vpmovswb" "vpmovsxbd" "vpmovsxbq" "vpmovsxbw" "vpmovsxdq"
"vpmovsxwd" "vpmovsxwq" "vpmovusdb" "vpmovusdw" "vpmovusqb"
"vpmovusqd" "vpmovusqw" "vpmovuswb" "vpmovw2m" "vpmovwb"
"vpmovzxbd" "vpmovzxbq" "vpmovzxbw" "vpmovzxdq" "vpmovzxwd"
"vpmovzxwq" "vpmuldq" "vpmulhrsw" "vpmulhuw" "vpmulhw" "vpmulld"
"vpmullq" "vpmullw" "vpmultishiftqb" "vpmuludq" "vpor" "vpord"
"vporq" "vpperm" "vprold" "vprolq" "vprolvd" "vprolvq" "vprord"
"vprorq" "vprorvd" "vprorvq" "vprotb" "vprotd" "vprotq" "vprotw"
"vpsadbw" "vpscatterdd" "vpscatterdq" "vpscatterqd"
"vpscatterqq" "vpshab" "vpshad" "vpshaq" "vpshaw" "vpshlb"
"vpshld" "vpshlq" "vpshlw" "vpshufb" "vpshufd" "vpshufhw"
"vpshuflw" "vpsignb" "vpsignd" "vpsignw" "vpslld" "vpslldq"
"vpsllq" "vpsllvd" "vpsllvq" "vpsllvw" "vpsllw" "vpsrad"
"vpsraq" "vpsravd" "vpsravq" "vpsravw" "vpsraw" "vpsrld"
"vpsrldq" "vpsrlq" "vpsrlvd" "vpsrlvq" "vpsrlvw" "vpsrlw"
"vpsubb" "vpsubd" "vpsubq" "vpsubsb" "vpsubsw" "vpsubusb"
"vpsubusw" "vpsubw" "vpternlogd" "vpternlogq" "vptest"
"vptestmb" "vptestmd" "vptestmq" "vptestmw" "vptestnmb"
"vptestnmd" "vptestnmq" "vptestnmw" "vpunpckhbw" "vpunpckhdq"
"vpunpckhqdq" "vpunpckhwd" "vpunpcklbw" "vpunpckldq"
"vpunpcklqdq" "vpunpcklwd" "vpxor" "vpxord" "vpxorq" "vrangepd"
"vrangeps" "vrangesd" "vrangess" "vrcp14pd" "vrcp14ps"
"vrcp14sd" "vrcp14ss" "vrcp28pd" "vrcp28ps" "vrcp28sd"
"vrcp28ss" "vrcpps" "vrcpss" "vreducepd" "vreduceps" "vreducesd"
"vreducess" "vrndscalepd" "vrndscaleps" "vrndscalesd"
"vrndscaless" "vroundpd" "vroundps" "vroundsd" "vroundss"
"vrsqrt14pd" "vrsqrt14ps" "vrsqrt14sd" "vrsqrt14ss" "vrsqrt28pd"
"vrsqrt28ps" "vrsqrt28sd" "vrsqrt28ss" "vrsqrtps" "vrsqrtss"
"vscalefpd" "vscalefps" "vscalefsd" "vscalefss" "vscatterdpd"
"vscatterdps" "vscatterpf0dpd" "vscatterpf0dps" "vscatterpf0qpd"
"vscatterpf0qps" "vscatterpf1dpd" "vscatterpf1dps"
"vscatterpf1qpd" "vscatterpf1qps" "vscatterqpd" "vscatterqps"
"vshuff32x4" "vshuff64x2" "vshufi32x4" "vshufi64x2" "vshufpd"
"vshufps" "vsqrtpd" "vsqrtps" "vsqrtsd" "vsqrtss" "vstmxcsr"
"vsubpd" "vsubps" "vsubsd" "vsubss" "vtestpd" "vtestps"
"vucomisd" "vucomiss" "vunpckhpd" "vunpckhps" "vunpcklpd"
"vunpcklps" "vxorpd" "vxorps" "vzeroall" "vzeroupper" "wbinvd"
"wrfsbase" "wrgsbase" "wrmsr" "wrshr" "xabort" "xadd" "xbegin"
"xbts" "xchg" "xcryptcbc" "xcryptcfb" "xcryptctr" "xcryptecb"
"xcryptofb" "xend" "xgetbv" "xlat" "xlatb" "xor" "xorpd" "xorps"
"xrstor" "xrstor64" "xrstors" "xrstors64" "xsave" "xsave64"
"xsavec" "xsavec64" "xsaveopt" "xsaveopt64" "xsaves" "xsaves64"
"xsetbv" "xsha1" "xsha256" "xstore" "xtest")
"NASM instructions (tokhash.c) for `nasm-mode'."))
(eval-and-compile
(defconst nasm-types
'("1to16" "1to2" "1to4" "1to8" "__float128h__" "__float128l__"
"__float16__" "__float32__" "__float64__" "__float80e__"
"__float80m__" "__float8__" "__infinity__" "__nan__" "__qnan__"
"__snan__" "__utf16__" "__utf16be__" "__utf16le__" "__utf32__"
"__utf32be__" "__utf32le__" "abs" "byte" "dword" "evex" "far"
"long" "near" "nosplit" "oword" "qword" "rel" "seg" "short"
"strict" "to" "tword" "vex2" "vex3" "word" "wrt" "yword"
"zword")
"NASM types (tokens.dat) for `nasm-mode'."))
(eval-and-compile
(defconst nasm-prefix
'("a16" "a32" "a64" "asp" "lock" "o16" "o32" "o64" "osp" "rep" "repe"
"repne" "repnz" "repz" "times" "wait" "xacquire" "xrelease" "bnd")
"NASM prefixes (nasmlib.c) for `nasm-mode'."))
(eval-and-compile
(defconst nasm-pp-directives
'("%elif" "%elifn" "%elifctx" "%elifnctx" "%elifdef" "%elifndef"
"%elifempty" "%elifnempty" "%elifenv" "%elifnenv" "%elifid"
"%elifnid" "%elifidn" "%elifnidn" "%elifidni" "%elifnidni"
"%elifmacro" "%elifnmacro" "%elifnum" "%elifnnum" "%elifstr"
"%elifnstr" "%eliftoken" "%elifntoken" "%if" "%ifn" "%ifctx"
"%ifnctx" "%ifdef" "%ifndef" "%ifempty" "%ifnempty" "%ifenv"
"%ifnenv" "%ifid" "%ifnid" "%ifidn" "%ifnidn" "%ifidni" "%ifnidni"
"%ifmacro" "%ifnmacro" "%ifnum" "%ifnnum" "%ifstr" "%ifnstr"
"%iftoken" "%ifntoken" "%arg" "%assign" "%clear" "%define"
"%defstr" "%deftok" "%depend" "%else" "%endif" "%endm" "%endmacro"
"%endrep" "%error" "%exitmacro" "%exitrep" "%fatal" "%iassign"
"%idefine" "%idefstr" "%ideftok" "%imacro" "%include" "%irmacro"
"%ixdefine" "%line" "%local" "%macro" "%pathsearch" "%pop" "%push"
"%rep" "%repl" "%rmacro" "%rotate" "%stacksize" "%strcat"
"%strlen" "%substr" "%undef" "%unimacro" "%unmacro" "%use"
"%warning" "%xdefine" "istruc" "at" "iend" "align" "alignb"
"struc" "endstruc" "__LINE__" "__FILE__" "%comment" "%endcomment"
"__NASM_MAJOR__" " __NASM_MINOR__" "__NASM_SUBMINOR__"
"___NASM_PATCHLEVEL__" "__NASM_VERSION_ID__" "__NASM_VER__"
"__BITS__" "__OUTPUT_FORMAT__" "__DATE__" "__TIME__" "__DATE_NUM__"
"__TIME_NUM__" "__UTC_DATE__" "__UTC_TIME__" "__UTC_DATE_NUM__"
"__UTC_TIME_NUM__" "__POSIX_TIME__" " __PASS__" "SECTALIGN")
"NASM preprocessor directives (pptok.c) for `nasm-mode'."))
(defconst nasm-nonlocal-label-rexexp
"\\(\\_<[a-zA-Z_?][a-zA-Z0-9_$#@~?]*\\_>\\)\\s-*:"
"Regexp for `nasm-mode' for matching nonlocal labels.")
(defconst nasm-local-label-regexp
"\\(\\_<\\.[a-zA-Z_?][a-zA-Z0-9_$#@~?]*\\_>\\)\\(?:\\s-*:\\)?"
"Regexp for `nasm-mode' for matching local labels.")
(defconst nasm-label-regexp
(concat nasm-nonlocal-label-rexexp "\\|" nasm-local-label-regexp)
"Regexp for `nasm-mode' for matching labels.")
(defconst nasm-constant-regexp
"\\<$?[-+]?[0-9][-+_0-9A-Fa-fHhXxDdTtQqOoBbYyeE.]*\\>"
"Regexp for `nasm-mode' for matching numeric constants.")
(defconst nasm-section-name-regexp
"^\\s-*section[ \t]+\\(\\_<\\.[a-zA-Z0-9_$#@~.?]+\\_>\\)"
"Regexp for `nasm-mode' for matching section names.")
(defmacro nasm--opt (keywords)
"Prepare KEYWORDS for `looking-at'."
`(eval-when-compile
(regexp-opt ,keywords 'words)))
(defconst nasm-imenu-generic-expression
`((nil ,(concat "^\\s-*" nasm-nonlocal-label-rexexp) 1)
(nil ,(concat (nasm--opt '("%define" "%macro"))
"\\s-+\\([a-zA-Z0-9_$#@~.?]+\\)") 2))
"Expressions for `imenu-generic-expression'.")
(defconst nasm-full-instruction-regexp
(eval-when-compile
(let ((pfx (nasm--opt nasm-prefix))
(ins (nasm--opt nasm-instructions)))
(concat "^\\(" pfx "\\s-+\\)?" ins "$")))
"Regexp for `nasm-mode' matching a valid full NASM instruction field.
This includes prefixes or modifiers (eg \"mov\", \"rep mov\", etc match)")
(defconst nasm-font-lock-keywords
`((,nasm-section-name-regexp (1 'nasm-section-name))
(,(nasm--opt nasm-registers) . 'nasm-registers)
(,(nasm--opt nasm-prefix) . 'nasm-prefix)
(,(nasm--opt nasm-types) . 'nasm-types)
(,(nasm--opt nasm-instructions) . 'nasm-instructions)
(,(nasm--opt nasm-pp-directives) . 'nasm-preprocessor)
(,(concat "^\\s-*" nasm-nonlocal-label-rexexp) (1 'nasm-labels))
(,(concat "^\\s-*" nasm-local-label-regexp) (1 'nasm-local-labels))
(,nasm-constant-regexp . 'nasm-constant)
(,(nasm--opt nasm-directives) . 'nasm-directives))
"Keywords for `nasm-mode'.")
(defconst nasm-mode-syntax-table
(with-syntax-table (copy-syntax-table)
(modify-syntax-entry ?_ "_")
(modify-syntax-entry ?# "_")
(modify-syntax-entry ?@ "_")
(modify-syntax-entry ?\? "_")
(modify-syntax-entry ?~ "_")
(modify-syntax-entry ?\. "w")
(modify-syntax-entry ?\; "<")
(modify-syntax-entry ?\n ">")
(modify-syntax-entry ?\" "\"")
(modify-syntax-entry ?\' "\"")
(modify-syntax-entry ?\` "\"")
(syntax-table))
"Syntax table for `nasm-mode'.")
(defvar nasm-mode-map
(let ((map (make-sparse-keymap)))
(prog1 map
(define-key map (kbd ":") #'nasm-colon)
(define-key map (kbd ";") #'nasm-comment)
(define-key map [remap join-line] #'nasm-join-line)))
"Key bindings for `nasm-mode'.")
(defun nasm-colon ()
"Insert a colon and convert the current line into a label."
(interactive)
(call-interactively #'self-insert-command)
(nasm-indent-line))
(defun nasm-indent-line ()
"Indent current line (or insert a tab) as NASM assembly code.
This will be called by `indent-for-tab-command' when TAB is
pressed. We indent the entire line as appropriate whenever POINT
is not immediately after a mnemonic; otherwise, we insert a tab."
(interactive)
(let ((before ; text before point and after indentation
(save-excursion
(let ((point (point))
(bti (progn (back-to-indentation) (point))))
(buffer-substring-no-properties bti point)))))
(if (string-match nasm-full-instruction-regexp before)
;; We are immediately after a mnemonic
(cl-case nasm-after-mnemonic-whitespace
(:tab (insert "\t"))
(:space (insert-char ?\s nasm-basic-offset)))
;; We're literally anywhere else, indent the whole line
(let ((orig (- (point-max) (point))))
(back-to-indentation)
(if (or (looking-at (nasm--opt nasm-directives))
(looking-at (nasm--opt nasm-pp-directives))
(looking-at "\\[")
(looking-at ";;+")
(looking-at nasm-label-regexp))
(indent-line-to 0)
(indent-line-to nasm-basic-offset))
(when (> (- (point-max) orig) (point))
(setf (point) (- (point-max) orig)))))))
(defun nasm--current-line ()
"Return the current line as a string."
(save-excursion
(let ((start (progn (beginning-of-line) (point)))
(end (progn (end-of-line) (point))))
(buffer-substring-no-properties start end))))
(defun nasm--empty-line-p ()
"Return non-nil if current line has non-whitespace."
(not (string-match-p "\\S-" (nasm--current-line))))
(defun nasm--line-has-comment-p ()
"Return non-nil if current line contains a comment."
(save-excursion
(end-of-line)
(nth 4 (syntax-ppss))))
(defun nasm--line-has-non-comment-p ()
"Return non-nil of the current line has code."
(let* ((line (nasm--current-line))
(match (string-match-p "\\S-" line)))
(when match
(not (eql ?\; (aref line match))))))
(defun nasm--inside-indentation-p ()
"Return non-nil if point is within the indentation."
(save-excursion
(let ((point (point))
(start (progn (beginning-of-line) (point)))
(end (progn (back-to-indentation) (point))))
(and (<= start point) (<= point end)))))
(defun nasm-comment-indent ()
"Compute desired indentation for comment on the current line."
comment-column)
(defun nasm-insert-comment ()
"Insert a comment if the current line doesnt contain one."
(let ((comment-insert-comment-function nil))
(comment-indent)))
(defun nasm-comment (&optional arg)
"Begin or edit a comment with context-sensitive placement.
The right-hand comment gutter is far away from the code, so this
command uses the mark ring to help move back and forth between
code and the comment gutter.
* If no comment gutter exists yet, mark the current position and
jump to it.
* If already within the gutter, pop the top mark and return to
the code.
* If on a line with no code, just insert a comment character.
* If within the indentation, just insert a comment character.
This is intended prevent interference when the intention is to
comment out the line.
With a prefix arg, kill the comment on the current line with
`comment-kill'."
(interactive "p")
(if (not (eql arg 1))
(comment-kill nil)
(cond
;; Empty line, or inside a string? Insert.
((or (nasm--empty-line-p) (nth 3 (syntax-ppss)))
(insert ";"))
;; Inside the indentation? Comment out the line.
((nasm--inside-indentation-p)
(insert ";"))
;; Currently in a right-side comment? Return.
((and (nasm--line-has-comment-p)
(nasm--line-has-non-comment-p)
(nth 4 (syntax-ppss)))
(setf (point) (mark))
(pop-mark))
;; Line has code? Mark and jump to right-side comment.
((nasm--line-has-non-comment-p)
(push-mark)
(comment-indent))
;; Otherwise insert.
((insert ";")))))
(defun nasm-join-line (join-following-p)
"Like `join-line', but use a tab when joining with a label."
(interactive "*P")
(join-line join-following-p)
(if (looking-back nasm-label-regexp (line-beginning-position))
(let ((column (current-column)))
(cond ((< column nasm-basic-offset)
(delete-char 1)
(insert-char ?\t))
((and (= column nasm-basic-offset) (eql ?: (char-before)))
(delete-char 1))))
(nasm-indent-line)))
;;;###autoload
(define-derived-mode nasm-mode prog-mode "NASM"
"Major mode for editing NASM assembly programs."
:group 'nasm-mode
(make-local-variable 'indent-line-function)
(make-local-variable 'comment-start)
(setf font-lock-defaults '(nasm-font-lock-keywords nil :case-fold)
indent-line-function #'nasm-indent-line
comment-start ";"
comment-indent-function #'nasm-comment-indent
comment-insert-comment-function #'nasm-insert-comment
imenu-generic-expression nasm-imenu-generic-expression))
(provide 'nasm-mode)
;;; nasm-mode.el ends here