1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00
llvm-mirror/lib/Target/Sparc
Daniel Cederman e3cb6ccb12 [Sparc] Add membar assembler tags
Summary: The Sparc V9 membar instruction can enforce different types of
memory orderings depending on the value in its immediate field.  In the
architectural manual the type is selected by combining different assembler
tags into a mask. This patch adds support for these tags.

Reviewers: jyknight, venkatra, brad

Reviewed By: jyknight

Subscribers: fedor.sergeev, jrtc27, jfb, llvm-commits

Differential Revision: https://reviews.llvm.org/D53491

llvm-svn: 349048
2018-12-13 15:29:12 +00:00
..
AsmParser [Sparc] Add membar assembler tags 2018-12-13 15:29:12 +00:00
Disassembler
InstPrinter [Sparc] Add membar assembler tags 2018-12-13 15:29:12 +00:00
MCTargetDesc
TargetInfo
CMakeLists.txt
DelaySlotFiller.cpp
LeonFeatures.td
LeonPasses.cpp
LeonPasses.h
LLVMBuild.txt
README.txt
Sparc.h
Sparc.td [Sparc] Add support for the partial write PSR instruction 2018-09-27 12:34:48 +00:00
SparcAsmPrinter.cpp
SparcCallingConv.td
SparcFrameLowering.cpp
SparcFrameLowering.h
SparcInstr64Bit.td
SparcInstrAliases.td [Sparc] Add unimp alias 2018-09-27 12:34:53 +00:00
SparcInstrFormats.td
SparcInstrInfo.cpp
SparcInstrInfo.h
SparcInstrInfo.td [Sparc] Add membar assembler tags 2018-12-13 15:29:12 +00:00
SparcInstrVIS.td
SparcISelDAGToDAG.cpp
SparcISelLowering.cpp [Sparc] Use float register for integer constrained with "f" in inline asm 2018-12-13 15:13:29 +00:00
SparcISelLowering.h [Sparc] Remove the support for builtin setjmp/longjmp 2018-09-27 13:32:54 +00:00
SparcMachineFunctionInfo.cpp
SparcMachineFunctionInfo.h
SparcMCInstLower.cpp
SparcRegisterInfo.cpp
SparcRegisterInfo.h [TargetRegisterInfo] Remove temporary hook enableMultipleCopyHints() 2018-10-05 14:23:11 +00:00
SparcRegisterInfo.td
SparcSchedule.td
SparcSubtarget.cpp [Sparc] Add support for the partial write PSR instruction 2018-09-27 12:34:48 +00:00
SparcSubtarget.h [Sparc] Add support for the partial write PSR instruction 2018-09-27 12:34:48 +00:00
SparcTargetMachine.cpp [Targets] Add errors for tiny and kernel codemodel on targets that don't support them 2018-12-07 12:10:23 +00:00
SparcTargetMachine.h [Sparc] EXPENSIVE_CHECKS now passes all machine verifier errors (PR27461) 2018-09-27 16:21:35 +00:00
SparcTargetObjectFile.cpp
SparcTargetObjectFile.h

To-do
-----

* Keep the address of the constant pool in a register instead of forming its
  address all of the time.
* We can fold small constant offsets into the %hi/%lo references to constant
  pool addresses as well.
* When in V9 mode, register allocate %icc[0-3].
* Add support for isel'ing UMUL_LOHI instead of marking it as Expand.
* Emit the 'Branch on Integer Register with Prediction' instructions.  It's
  not clear how to write a pattern for this though:

float %t1(int %a, int* %p) {
        %C = seteq int %a, 0
        br bool %C, label %T, label %F
T:
        store int 123, int* %p
        br label %F
F:
        ret float undef
}

codegens to this:

t1:
        save -96, %o6, %o6
1)      subcc %i0, 0, %l0
1)      bne .LBBt1_2    ! F
        nop
.LBBt1_1:       ! T
        or %g0, 123, %l0
        st %l0, [%i1]
.LBBt1_2:       ! F
        restore %g0, %g0, %g0
        retl
        nop

1) should be replaced with a brz in V9 mode.

* Same as above, but emit conditional move on register zero (p192) in V9
  mode.  Testcase:

int %t1(int %a, int %b) {
        %C = seteq int %a, 0
        %D = select bool %C, int %a, int %b
        ret int %D
}

* Emit MULX/[SU]DIVX instructions in V9 mode instead of fiddling
  with the Y register, if they are faster.

* Codegen bswap(load)/store(bswap) -> load/store ASI

* Implement frame pointer elimination, e.g. eliminate save/restore for
  leaf fns.
* Fill delay slots

* Use %g0 directly to materialize 0. No instruction is required.