Add .nop assembler directive
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 17 Feb 2018 13:20:42 +0000 (05:20 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 17 Feb 2018 13:20:57 +0000 (05:20 -0800)
commit62a02d25b6e5d9f92c205260daa11355d0c62532
tree9fa0855fa0acd81d5d855b01a865cdfb3456254a
parentbb57c12e551e7b66db9d5d8623e2f294091f03c1
Add .nop assembler directive

Implement the '.nop SIZE[, CONTROL]' assembler directive, which emits
SIZE bytes filled with no-op instructions.  SIZE is absolute expression.
The optional CONTROL byte controls how no-op instructions should be
generated.  If the comma and @var{control} are omitted, CONTROL is
assumed to be zero.

For Intel 80386 and AMD x86-64 targets, CONTROL byte specifies the size
limit of a single no-op instruction.  The valid values of CONTROL byte
are between 0 and 8 for 16-bit mode, between 0 and 10 for 32-bit mode,
between 0 and 11 for 64-bit mode.  When 0 is used, the no-op size limit
is set to the maximum supported size.

2 new relax states, rs_space_nop and rs_fill_nop, are added to enum
_relax_state, which are similar to rs_space and rs_fill, respectively,
but they fill with no-op instructions, instead of a single byte.  A
target backend must override the default md_generate_nops to generate
proper no-op instructions.  Otherwise, an error of unimplemented .nop
directive will be issued whenever .nop directive is used.

* NEWS: Mention .nop directive.
* as.h (_relax_state): Add rs_space_nop and rs_fill_nop.
* read.c (potable): Add .nop.
(s_nop): New function.
* read.h (s_nop): New prototype.
* write.c (cvt_frag_to_fill): Handle rs_space_nop and
rs_fill_nop.
(md_generate_nops): New function.
(relax_segment): Likewise.
(write_contents): Use md_generate_nops for rs_fill_nop.
* config/tc-i386.c (alt64_11): New.
(alt64_patt): Likewise.
(md_convert_frag): Handle rs_space_nop.
(i386_output_nops): New function.
(i386_generate_nops): Likewise.
(i386_align_code): Call i386_output_nops.
* config/tc-i386.h (i386_generate_nops): New.
(md_generate_nops): Likewise.
* doc/as.texinfo: Document .nop directive.
* testsuite/gas/i386/i386.exp: Run .nop directive tests.
* testsuite/gas/i386/nop-1.d: New file.
* testsuite/gas/i386/nop-1.s: Likewise.
* testsuite/gas/i386/nop-2.d: Likewise.
* testsuite/gas/i386/nop-2.s: Likewise.
* testsuite/gas/i386/nop-3.d: Likewise.
* testsuite/gas/i386/nop-3.s: Likewise.
* testsuite/gas/i386/nop-4.d: Likewise.
* testsuite/gas/i386/nop-4.s: Likewise.
* testsuite/gas/i386/nop-5.d: Likewise.
* testsuite/gas/i386/nop-5.s: Likewise.
* testsuite/gas/i386/nop-6.d: Likewise.
* testsuite/gas/i386/nop-6.s: Likewise.
* testsuite/gas/i386/nop-bad-1.l: Likewise.
* testsuite/gas/i386/nop-bad-1.s: Likewise.
* testsuite/gas/i386/x86-64-nop-1.d: Likewise.
* testsuite/gas/i386/x86-64-nop-2.d: Likewise.
* testsuite/gas/i386/x86-64-nop-3.d: Likewise.
* testsuite/gas/i386/x86-64-nop-4.d: Likewise.
* testsuite/gas/i386/x86-64-nop-5.d: Likewise.
* testsuite/gas/i386/x86-64-nop-6.d: Likewise.
30 files changed:
gas/ChangeLog
gas/NEWS
gas/as.h
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/doc/as.texinfo
gas/read.c
gas/read.h
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/nop-1.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-1.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-2.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-2.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-3.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-3.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-4.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-4.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-5.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-5.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-6.d [new file with mode: 0644]
gas/testsuite/gas/i386/nop-6.s [new file with mode: 0644]
gas/testsuite/gas/i386/nop-bad-1.l [new file with mode: 0644]
gas/testsuite/gas/i386/nop-bad-1.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-1.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-2.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-3.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-4.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-5.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nop-6.d [new file with mode: 0644]
gas/write.c