Skip to content
  • H.J. Lu's avatar
    Add .nop assembler directive · 62a02d25
    H.J. Lu authored
    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.
    62a02d25
To find the state of this project's repository at the time of any of these versions, check out the tags.