mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Refactor the TableGen'erated fixed length disassemblmer to use a table-driven state machine rather than a massive set of nested switch() statements. As a result, the ARM Disassembler (ARMDisassembler.cpp) builds much more quickly and generates a smaller end result. For a Release+Asserts build on a 16GB 3.4GHz i7 iMac w/ SSD: Time to compile at -O2 (averaged w/ hot caches): Previous: 35.5s New: 8.9s TEXT size: Previous: 447,251 New: 297,661 Builds in 25% of the time previously required and generates code 66% of the size. Execution time of the disassembler is only slightly slower (7% disassembling 10 million ARM instructions, 19.6s vs 21.0s). The new implementation has not yet been tuned, however, so the performance should almost certainly be recoverable should it become a concern. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161888 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			33 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- llvm/MC/MCFixedLenDisassembler.h - Decoder driver -------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| // Fixed length disassembler decoder state machine driver.
 | |
| //===----------------------------------------------------------------------===//
 | |
| #ifndef MCFIXEDLENDISASSEMBLER_H
 | |
| #define MCFIXEDLENDISASSEMBLER_H
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| namespace MCD {
 | |
| // Disassembler state machine opcodes.
 | |
| enum DecoderOps {
 | |
|   OPC_ExtractField = 1, // OPC_ExtractField(uint8_t Start, uint8_t Len)
 | |
|   OPC_FilterValue,      // OPC_FilterValue(uleb128 Val, uint16_t NumToSkip)
 | |
|   OPC_CheckField,       // OPC_CheckField(uint8_t Start, uint8_t Len,
 | |
|                         //                uleb128 Val, uint16_t NumToSkip)
 | |
|   OPC_CheckPredicate,   // OPC_CheckPredicate(uleb128 PIdx, uint16_t NumToSkip)
 | |
|   OPC_Decode,           // OPC_Decode(uleb128 Opcode, uleb128 DIdx)
 | |
|   OPC_SoftFail,         // OPC_SoftFail(uleb128 PMask, uleb128 NMask)
 | |
|   OPC_Fail              // OPC_Fail()
 | |
| };
 | |
| 
 | |
| } // namespace MCDecode
 | |
| } // namespace llvm
 | |
| 
 | |
| #endif
 |