mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
48575f6ea7
difficult on current ARM implementations for a few reasons. 1. Even though a single vmla has latency that is one cycle shorter than a pair of vmul + vadd, a RAW hazard during the first (4? on Cortex-a8) can cause additional pipeline stall. So it's frequently better to single codegen vmul + vadd. 2. A vmla folowed by a vmul, vmadd, or vsub causes the second fp instruction to stall for 4 cycles. We need to schedule them apart. 3. A vmla followed vmla is a special case. Obvious issuing back to back RAW vmla + vmla is very bad. But this isn't ideal either: vmul vadd vmla Instead, we want to expand the second vmla: vmla vmul vadd Even with the 4 cycle vmul stall, the second sequence is still 2 cycles faster. Up to now, isel simply avoid codegen'ing fp vmla / vmls. This works well enough but it isn't the optimial solution. This patch attempts to make it possible to use vmla / vmls in cases where it is profitable. A. Add missing isel predicates which cause vmla to be codegen'ed. B. Make sure the fmul in (fadd (fmul)) has a single use. We don't want to compute a fmul and a fmla. C. Add additional isel checks for vmla, avoid cases where vmla is feeding into fp instructions (except for the #3 exceptional case). D. Add ARM hazard recognizer to model the vmla / vmls hazards. E. Add a special pre-regalloc case to expand vmla / vmls when it's likely the vmla / vmls will trigger one of the special hazards. Work in progress, only A+B are enabled. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120960 91177308-0d34-0410-b5e6-96231b3b80d8
55 lines
1.5 KiB
CMake
55 lines
1.5 KiB
CMake
set(LLVM_TARGET_DEFINITIONS ARM.td)
|
|
|
|
tablegen(ARMGenRegisterInfo.h.inc -gen-register-desc-header)
|
|
tablegen(ARMGenRegisterNames.inc -gen-register-enums)
|
|
tablegen(ARMGenRegisterInfo.inc -gen-register-desc)
|
|
tablegen(ARMGenInstrNames.inc -gen-instr-enums)
|
|
tablegen(ARMGenInstrInfo.inc -gen-instr-desc)
|
|
tablegen(ARMGenCodeEmitter.inc -gen-emitter)
|
|
tablegen(ARMGenMCCodeEmitter.inc -gen-emitter -mc-emitter)
|
|
tablegen(ARMGenAsmWriter.inc -gen-asm-writer)
|
|
tablegen(ARMGenAsmMatcher.inc -gen-asm-matcher)
|
|
tablegen(ARMGenDAGISel.inc -gen-dag-isel)
|
|
tablegen(ARMGenFastISel.inc -gen-fast-isel)
|
|
tablegen(ARMGenCallingConv.inc -gen-callingconv)
|
|
tablegen(ARMGenSubtarget.inc -gen-subtarget)
|
|
tablegen(ARMGenEDInfo.inc -gen-enhanced-disassembly-info)
|
|
tablegen(ARMGenDecoderTables.inc -gen-arm-decoder)
|
|
|
|
add_llvm_target(ARMCodeGen
|
|
ARMAsmBackend.cpp
|
|
ARMAsmPrinter.cpp
|
|
ARMBaseInstrInfo.cpp
|
|
ARMBaseRegisterInfo.cpp
|
|
ARMCodeEmitter.cpp
|
|
ARMConstantIslandPass.cpp
|
|
ARMConstantPoolValue.cpp
|
|
ARMELFWriterInfo.cpp
|
|
ARMExpandPseudoInsts.cpp
|
|
ARMFastISel.cpp
|
|
ARMFrameInfo.cpp
|
|
ARMGlobalMerge.cpp
|
|
ARMHazardRecognizer.cpp
|
|
ARMISelDAGToDAG.cpp
|
|
ARMISelLowering.cpp
|
|
ARMInstrInfo.cpp
|
|
ARMJITInfo.cpp
|
|
ARMMCCodeEmitter.cpp
|
|
ARMLoadStoreOptimizer.cpp
|
|
ARMMCAsmInfo.cpp
|
|
ARMMCInstLower.cpp
|
|
ARMRegisterInfo.cpp
|
|
ARMSelectionDAGInfo.cpp
|
|
ARMSubtarget.cpp
|
|
ARMTargetMachine.cpp
|
|
ARMTargetObjectFile.cpp
|
|
NEONMoveFix.cpp
|
|
Thumb1InstrInfo.cpp
|
|
Thumb1FrameInfo.cpp
|
|
Thumb1RegisterInfo.cpp
|
|
Thumb2ITBlockPass.cpp
|
|
Thumb2InstrInfo.cpp
|
|
Thumb2RegisterInfo.cpp
|
|
Thumb2SizeReduction.cpp
|
|
)
|