llvm-project/llvm/lib/Target/Sparc
Daniel Cederman 92dadc0bca [Sparc] Custom bitcast between f64 and v2i32
Summary:
Currently bitcasting constants from f64 to v2i32 is done by storing the
value to the stack and then loading it again. This is not necessary, but
seems to happen because v2i32 is a valid type for Sparc V8. If it had not
been legal, we would have gotten help from the type legalizer.

This patch tries to do the same work as the legalizer would have done by
bitcasting the floating point constant and splitting the value up into a
vector of two i32 values.

Reviewers: venkatra, jyknight

Reviewed By: jyknight

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

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

llvm-svn: 340723
2018-08-27 07:14:53 +00:00
..
AsmParser Remove trailing space 2018-07-30 19:41:25 +00:00
Disassembler Remove trailing space 2018-07-30 19:41:25 +00:00
InstPrinter Remove trailing space 2018-07-30 19:41:25 +00:00
MCTargetDesc [Sparc] Add support for 13-bit PIC 2018-06-11 05:50:08 +00:00
TargetInfo Add backend name to Target to enable runtime info to be fed back into TableGen 2017-11-15 23:55:44 +00:00
CMakeLists.txt Consistently sort add_subdirectory calls in lib/Target/*/CMakeLists.txt 2018-04-23 12:49:34 +00:00
DelaySlotFiller.cpp [DebugInfo] Examine all uses of isDebugValue() for debug instructions. 2018-05-09 02:42:00 +00:00
LLVMBuild.txt
LeonFeatures.td Revert "[Sparc] Add support for the cycle counter available in GR740" 2018-08-13 14:18:09 +00:00
LeonPasses.cpp
LeonPasses.h
README.txt
Sparc.h Remove trailing space 2018-07-30 19:41:25 +00:00
Sparc.td Revert "[Sparc] Add support for the cycle counter available in GR740" 2018-08-13 14:18:09 +00:00
SparcAsmPrinter.cpp
SparcCallingConv.td
SparcFrameLowering.cpp [Sparc] Account for bias in stack readjustment 2018-01-29 12:10:32 +00:00
SparcFrameLowering.h Move TargetFrameLowering.h to CodeGen where it's implemented 2017-11-03 22:32:11 +00:00
SparcISelDAGToDAG.cpp Revert "This pass, fixing an erratum in some LEON 2 processors..." 2018-04-20 07:53:27 +00:00
SparcISelLowering.cpp [Sparc] Custom bitcast between f64 and v2i32 2018-08-27 07:14:53 +00:00
SparcISelLowering.h [Sparc] Custom bitcast between f64 and v2i32 2018-08-27 07:14:53 +00:00
SparcInstr64Bit.td
SparcInstrAliases.td [Sparc] Add mnemonic aliases for flush, stb, stba, sth, and stha 2018-05-23 08:26:49 +00:00
SparcInstrFormats.td
SparcInstrInfo.cpp Remove trailing space 2018-07-30 19:41:25 +00:00
SparcInstrInfo.h Target/TargetInstrInfo.h -> CodeGen/TargetInstrInfo.h to match layering 2017-11-08 01:01:31 +00:00
SparcInstrInfo.td [Sparc] Do not depend on icc for ta 1 2018-07-17 05:49:33 +00:00
SparcInstrVIS.td Revert r318704 - [Sparc] efficient pattern for UINT_TO_FP conversion 2017-12-11 22:25:04 +00:00
SparcMCInstLower.cpp
SparcMachineFunctionInfo.cpp
SparcMachineFunctionInfo.h
SparcRegisterInfo.cpp Target/TargetInstrInfo.h -> CodeGen/TargetInstrInfo.h to match layering 2017-11-08 01:01:31 +00:00
SparcRegisterInfo.h [Sparc] Return true in enableMultipleCopyHints(). 2018-02-24 08:24:31 +00:00
SparcRegisterInfo.td
SparcSchedule.td
SparcSubtarget.cpp Revert "[Sparc] Add support for the cycle counter available in GR740" 2018-08-13 14:18:09 +00:00
SparcSubtarget.h Revert "[Sparc] Add support for the cycle counter available in GR740" 2018-08-13 14:18:09 +00:00
SparcTargetMachine.cpp Remove trailing space 2018-07-30 19:41:25 +00:00
SparcTargetMachine.h
SparcTargetObjectFile.cpp Fix a bunch more layering of CodeGen headers that are in Target 2017-11-17 01:07:10 +00:00
SparcTargetObjectFile.h
SparcTargetStreamer.h

README.txt

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.