<div dir="ltr">Okay. Shouldn't that test not crash, though?<div><br></div><div> - Daniel</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 15, 2013 at 5:33 PM, Tom Stellard <span dir="ltr"><<a href="mailto:tom@stellard.net" target="_blank">tom@stellard.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, Aug 15, 2013 at 05:12:08PM -0700, Daniel Dunbar wrote:<br>
> Hi Tom,<br>
><br>
> The test in test/CodeGen/SI doesn't actually get run currently, because<br>
> there is no lit.local.cfg which enables its suffix. I am about to fix this<br>
> problem globally, but this test crashes now on my machine:<br>
> --<br>
<br>
This whole directory can be removed, the SI tests are in the R600<br>
directory now.<br>
<br>
-Tom<br>
<br>
> -- Testing: 1 tests, 1 threads --<br>
> Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..<br>
> FAIL: LLVM :: CodeGen/SI/sanity.ll (1 of 1)<br>
> ******************** TEST 'LLVM :: CodeGen/SI/sanity.ll' FAILED<br>
> ********************<br>
> Script:<br>
> --<br>
> /Volumes/OzzyData/Users/ddunbar/llvm.obj.64/Debug+Asserts/bin/llc <<br>
> /Volumes/OzzyData/Users/ddunbar/llvm/test/CodeGen/SI/sanity.ll -march=r600<br>
> -mcpu=SI |<br>
> /Volumes/OzzyData/Users/ddunbar/llvm.obj.64/Debug+Asserts/bin/FileCheck<br>
> /Volumes/OzzyData/Users/ddunbar/llvm/test/CodeGen/SI/sanity.ll<br>
> --<br>
> Exit Code: 2<br>
><br>
> Command Output (stderr):<br>
> --<br>
> 0x7fe0f1034210: i64 = GlobalAddress<void (i32)* @llvm.AMDGPU.shader.type> 0<br>
> [ORD=1]<br>
> Undefined function<br>
> UNREACHABLE executed at<br>
> /Volumes/OzzyData/Users/ddunbar/llvm/lib/Target/R600/AMDGPUISelLowering.h:68!<br>
> 0  llc                      0x00000001091b9dfe<br>
> llvm::sys::PrintStackTrace(__sFILE*) + 46<br>
> 1  llc                      0x00000001091ba10b<br>
> PrintStackTraceSignalHandler(void*) + 27<br>
> 2  llc                      0x00000001091ba488 SignalHandler(int) + 408<br>
> 3  libsystem_platform.dylib 0x00007fff94c095aa _sigtramp + 26<br>
> 4  llc                      0x00000001096ff2df guard variable for<br>
> llvm::system_category()::s + 621559<br>
> 5  llc                      0x00000001091ba13b raise + 27<br>
> 6  llc                      0x00000001091ba1f2 abort + 18<br>
> 7  llc                      0x0000000109198b86<br>
> llvm::llvm_unreachable_internal(char const*, char const*, unsigned int) +<br>
> 198<br>
> 8  llc                      0x0000000107ec23ff<br>
> llvm::AMDGPUTargetLowering::LowerCall(llvm::TargetLowering::CallLoweringInfo&,<br>
> llvm::SmallVectorImpl<llvm::SDValue>&) const + 63<br>
> 9  llc                      0x00000001087af8f2<br>
> llvm::TargetLowering::LowerCallTo(llvm::TargetLowering::CallLoweringInfo&)<br>
> const + 4146<br>
> 10 llc                      0x0000000108794176<br>
> llvm::SelectionDAGBuilder::LowerCallTo(llvm::ImmutableCallSite,<br>
> llvm::SDValue, bool, llvm::MachineBasicBlock*) + 3494<br>
> 11 llc                      0x0000000108782105<br>
> llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) + 2549<br>
> 12 llc                      0x0000000108779a49<br>
> llvm::SelectionDAGBuilder::visit(unsigned int, llvm::User const&) + 1097<br>
> 13 llc                      0x0000000108778ce3<br>
> llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) + 131<br>
> 14 llc                      0x00000001087e876c<br>
> llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::Instruction<br>
> const>, llvm::ilist_iterator<llvm::Instruction const>, bool&) + 140<br>
> 15 llc                      0x00000001087e8556<br>
> llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 4214<br>
> 16 llc                      0x00000001087e65a4<br>
> llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1108<br>
> 17 llc                      0x0000000108a148be<br>
> llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 110<br>
> 18 llc                      0x00000001090f578f<br>
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 431<br>
> 19 llc                      0x00000001090f5a78<br>
> llvm::FPPassManager::runOnModule(llvm::Module&) + 104<br>
> 20 llc                      0x00000001090f6146<br>
> llvm::MPPassManager::runOnModule(llvm::Module&) + 1350<br>
> 21 llc                      0x00000001090f6c0e<br>
> llvm::PassManagerImpl::run(llvm::Module&) + 302<br>
> 22 llc                      0x00000001090f6ea1<br>
> llvm::PassManager::run(llvm::Module&) + 33<br>
> 23 llc                      0x0000000107da8db9 compileModule(char**,<br>
> llvm::LLVMContext&) + 6185<br>
> 24 llc                      0x0000000107da7522 main + 226<br>
> 25 libdyld.dylib            0x00007fff932d15fd start + 1<br>
> 26 libdyld.dylib            0x0000000000000003 start + 1825761799<br>
> Stack dump:<br>
> 0. Program arguments:<br>
> /Volumes/OzzyData/Users/ddunbar/llvm.obj.64/Debug+Asserts/bin/llc<br>
> -march=r600 -mcpu=SI<br>
> 1. Running pass 'Function Pass Manager' on module '<stdin>'.<br>
> 2. Running pass 'AMDGPU DAG->DAG Pattern Instruction Selection' on function<br>
> '@main'<br>
> FileCheck error: '-' is empty.<br>
><br>
> --<br>
><br>
> ********************<br>
> Testing Time: 12.76s<br>
> ********************<br>
> Failing Tests (1):<br>
>     LLVM :: CodeGen/SI/sanity.ll<br>
><br>
>   Unexpected Failures: 1<br>
> --<br>
><br>
> I will XFAIL it for the time being, but could you take a look?<br>
><br>
> Thanks,<br>
>   - Daniel<br>
><br>
><br>
> On Tue, Dec 11, 2012 at 1:25 PM, Tom Stellard <<a href="mailto:thomas.stellard@amd.com">thomas.stellard@amd.com</a>>wrote:<br>
><br>
> > Author: tstellar<br>
> > Date: Tue Dec 11 15:25:42 2012<br>
> > New Revision: 169915<br>
> ><br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=169915&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=169915&view=rev</a><br>
> > Log:<br>
> > Add R600 backend<br>
> ><br>
> > A new backend supporting AMD GPUs: Radeon HD2XXX - HD7XXX<br>
> ><br>
> > Added:<br>
> >     llvm/trunk/include/llvm/IntrinsicsR600.td<br>
> >     llvm/trunk/lib/Target/R600/<br>
> >     llvm/trunk/lib/Target/R600/AMDGPU.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPU.td<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUInstructions.td<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h<br>
> >     llvm/trunk/lib/Target/R600/AMDIL.h<br>
> >     llvm/trunk/lib/Target/R600/AMDIL7XXDevice.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDIL7XXDevice.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILBase.td<br>
> >     llvm/trunk/lib/Target/R600/AMDILCFGStructurizer.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILDevice.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILDevice.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILDeviceInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILDeviceInfo.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILDevices.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILEvergreenDevice.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILEvergreenDevice.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILFrameLowering.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILFrameLowering.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILISelDAGToDAG.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILISelLowering.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILInstrInfo.td<br>
> >     llvm/trunk/lib/Target/R600/AMDILIntrinsicInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILIntrinsicInfo.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILIntrinsics.td<br>
> >     llvm/trunk/lib/Target/R600/AMDILNIDevice.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILNIDevice.h<br>
> >     llvm/trunk/lib/Target/R600/AMDILPeepholeOptimizer.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILRegisterInfo.td<br>
> >     llvm/trunk/lib/Target/R600/AMDILSIDevice.cpp<br>
> >     llvm/trunk/lib/Target/R600/AMDILSIDevice.h<br>
> >     llvm/trunk/lib/Target/R600/CMakeLists.txt<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/CMakeLists.txt<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/LLVMBuild.txt<br>
> >     llvm/trunk/lib/Target/R600/InstPrinter/Makefile<br>
> >     llvm/trunk/lib/Target/R600/LLVMBuild.txt<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.h<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUMCCodeEmitter.h<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUMCTargetDesc.cpp<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUMCTargetDesc.h<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/CMakeLists.txt<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/LLVMBuild.txt<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/Makefile<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/R600MCCodeEmitter.cpp<br>
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/SIMCCodeEmitter.cpp<br>
> >     llvm/trunk/lib/Target/R600/Makefile<br>
> >     llvm/trunk/lib/Target/R600/Processors.td<br>
> >     llvm/trunk/lib/Target/R600/R600Defines.h<br>
> >     llvm/trunk/lib/Target/R600/R600ExpandSpecialInstrs.cpp<br>
> >     llvm/trunk/lib/Target/R600/R600ISelLowering.cpp<br>
> >     llvm/trunk/lib/Target/R600/R600ISelLowering.h<br>
> >     llvm/trunk/lib/Target/R600/R600InstrInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/R600InstrInfo.h<br>
> >     llvm/trunk/lib/Target/R600/R600Instructions.td<br>
> >     llvm/trunk/lib/Target/R600/R600Intrinsics.td<br>
> >     llvm/trunk/lib/Target/R600/R600MachineFunctionInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/R600MachineFunctionInfo.h<br>
> >     llvm/trunk/lib/Target/R600/R600RegisterInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/R600RegisterInfo.h<br>
> >     llvm/trunk/lib/Target/R600/R600RegisterInfo.td<br>
> >     llvm/trunk/lib/Target/R600/R600Schedule.td<br>
> >     llvm/trunk/lib/Target/R600/SIAssignInterpRegs.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIFixSGPRLiveness.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIISelLowering.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIISelLowering.h<br>
> >     llvm/trunk/lib/Target/R600/SIInstrFormats.td<br>
> >     llvm/trunk/lib/Target/R600/SIInstrInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIInstrInfo.h<br>
> >     llvm/trunk/lib/Target/R600/SIInstrInfo.td<br>
> >     llvm/trunk/lib/Target/R600/SIInstructions.td<br>
> >     llvm/trunk/lib/Target/R600/SIIntrinsics.td<br>
> >     llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp<br>
> >     llvm/trunk/lib/Target/R600/SILowerLiteralConstants.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIMachineFunctionInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIMachineFunctionInfo.h<br>
> >     llvm/trunk/lib/Target/R600/SIRegisterInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/SIRegisterInfo.h<br>
> >     llvm/trunk/lib/Target/R600/SIRegisterInfo.td<br>
> >     llvm/trunk/lib/Target/R600/SISchedule.td<br>
> >     llvm/trunk/lib/Target/R600/TargetInfo/<br>
> >     llvm/trunk/lib/Target/R600/TargetInfo/AMDGPUTargetInfo.cpp<br>
> >     llvm/trunk/lib/Target/R600/TargetInfo/CMakeLists.txt<br>
> >     llvm/trunk/lib/Target/R600/TargetInfo/LLVMBuild.txt<br>
> >     llvm/trunk/lib/Target/R600/TargetInfo/Makefile<br>
> >     llvm/trunk/test/CodeGen/R600/add.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/and.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fabs.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fadd.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fadd.v4f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fcmp-cnd.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fcmp-cnde-int-args.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fcmp.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fdiv.v4f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/floor.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fmax.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fmin.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fmul.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fmul.v4f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fsub.ll<br>
> >     llvm/trunk/test/CodeGen/R600/fsub.v4f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/i8_to_double_to_float.ll<br>
> >     llvm/trunk/test/CodeGen/R600/icmp-select-sete-reverse-args.ll<br>
> >     llvm/trunk/test/CodeGen/R600/lit.local.cfg<br>
> >     llvm/trunk/test/CodeGen/R600/literals.ll<br>
> >     llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.mul.ll<br>
> >     llvm/trunk/test/CodeGen/R600/llvm.AMDGPU.trunc.ll<br>
> >     llvm/trunk/test/CodeGen/R600/llvm.cos.ll<br>
> >     llvm/trunk/test/CodeGen/R600/llvm.pow.ll<br>
> >     llvm/trunk/test/CodeGen/R600/llvm.sin.ll<br>
> >     llvm/trunk/test/CodeGen/R600/load.constant_addrspace.f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/load.i8.ll<br>
> >     llvm/trunk/test/CodeGen/R600/reciprocal.ll<br>
> >     llvm/trunk/test/CodeGen/R600/sdiv.ll<br>
> >     llvm/trunk/test/CodeGen/R600/selectcc-icmp-select-float.ll<br>
> >     llvm/trunk/test/CodeGen/R600/selectcc_cnde.ll<br>
> >     llvm/trunk/test/CodeGen/R600/selectcc_cnde_int.ll<br>
> >     llvm/trunk/test/CodeGen/R600/setcc.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/short-args.ll<br>
> >     llvm/trunk/test/CodeGen/R600/store.v4f32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/store.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/udiv.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/R600/urem.v4i32.ll<br>
> >     llvm/trunk/test/CodeGen/SI/<br>
> >     llvm/trunk/test/CodeGen/SI/sanity.ll<br>
> > Modified:<br>
> >     llvm/trunk/include/llvm/Intrinsics.td<br>
> >     llvm/trunk/lib/Target/LLVMBuild.txt<br>
> ><br>
> > Modified: llvm/trunk/include/llvm/Intrinsics.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=169915&r1=169914&r2=169915&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=169915&r1=169914&r2=169915&view=diff</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/include/llvm/Intrinsics.td (original)<br>
> > +++ llvm/trunk/include/llvm/Intrinsics.td Tue Dec 11 15:25:42 2012<br>
> > @@ -472,3 +472,4 @@<br>
> >  include "llvm/IntrinsicsHexagon.td"<br>
> >  include "llvm/IntrinsicsNVVM.td"<br>
> >  include "llvm/IntrinsicsMips.td"<br>
> > +include "llvm/IntrinsicsR600.td"<br>
> ><br>
> > Added: llvm/trunk/include/llvm/IntrinsicsR600.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicsR600.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicsR600.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/include/llvm/IntrinsicsR600.td (added)<br>
> > +++ llvm/trunk/include/llvm/IntrinsicsR600.td Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,36 @@<br>
> > +//===- IntrinsicsR600.td - Defines R600 intrinsics ---------*- tablegen<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +// This file defines all of the R600-specific intrinsics.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +let TargetPrefix = "r600" in {<br>
> > +<br>
> > +class R600ReadPreloadRegisterIntrinsic<string name><br>
> > +  : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,<br>
> > +    GCCBuiltin<name>;<br>
> > +<br>
> > +multiclass R600ReadPreloadRegisterIntrinsic_xyz<string prefix> {<br>
> > +  def _x : R600ReadPreloadRegisterIntrinsic<!strconcat(prefix, "_x")>;<br>
> > +  def _y : R600ReadPreloadRegisterIntrinsic<!strconcat(prefix, "_y")>;<br>
> > +  def _z : R600ReadPreloadRegisterIntrinsic<!strconcat(prefix, "_z")>;<br>
> > +}<br>
> > +<br>
> > +defm int_r600_read_global_size : R600ReadPreloadRegisterIntrinsic_xyz <<br>
> > +                                       "__builtin_r600_read_global_size">;<br>
> > +defm int_r600_read_local_size : R600ReadPreloadRegisterIntrinsic_xyz <<br>
> > +                                       "__builtin_r600_read_local_size">;<br>
> > +defm int_r600_read_ngroups : R600ReadPreloadRegisterIntrinsic_xyz <<br>
> > +                                       "__builtin_r600_read_ngroups">;<br>
> > +defm int_r600_read_tgid : R600ReadPreloadRegisterIntrinsic_xyz <<br>
> > +                                       "__builtin_r600_read_tgid">;<br>
> > +defm int_r600_read_tidig : R600ReadPreloadRegisterIntrinsic_xyz <<br>
> > +                                       "__builtin_r600_read_tidig">;<br>
> > +} // End TargetPrefix = "r600"<br>
> ><br>
> > Modified: llvm/trunk/lib/Target/LLVMBuild.txt<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/LLVMBuild.txt?rev=169915&r1=169914&r2=169915&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/LLVMBuild.txt?rev=169915&r1=169914&r2=169915&view=diff</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/LLVMBuild.txt (original)<br>
> > +++ llvm/trunk/lib/Target/LLVMBuild.txt Tue Dec 11 15:25:42 2012<br>
> > @@ -16,7 +16,7 @@<br>
> ><br>
> >  ;===------------------------------------------------------------------------===;<br>
> ><br>
> >  [common]<br>
> > -subdirectories = ARM CppBackend Hexagon MBlaze MSP430 NVPTX Mips PowerPC<br>
> > Sparc X86 XCore<br>
> > +subdirectories = ARM CppBackend Hexagon MBlaze MSP430 NVPTX Mips PowerPC<br>
> > R600 Sparc X86 XCore<br>
> ><br>
> >  ; This is a special group whose required libraries are extended (by<br>
> > llvm-build)<br>
> >  ; with the best execution engine (the native JIT, if available, or the<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPU.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPU.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPU.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPU.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPU.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,48 @@<br>
> > +//===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- C++<br>
> > -*-=//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> > +/// \file<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPU_H<br>
> > +#define AMDGPU_H<br>
> > +<br>
> > +#include "AMDGPUTargetMachine.h"<br>
> > +#include "llvm/Support/TargetRegistry.h"<br>
> > +#include "llvm/Target/TargetMachine.h"<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class FunctionPass;<br>
> > +class AMDGPUTargetMachine;<br>
> > +<br>
> > +// R600 Passes<br>
> > +FunctionPass* createR600KernelParametersPass(const DataLayout *TD);<br>
> > +FunctionPass *createR600ExpandSpecialInstrsPass(TargetMachine &tm);<br>
> > +<br>
> > +// SI Passes<br>
> > +FunctionPass *createSIAssignInterpRegsPass(TargetMachine &tm);<br>
> > +FunctionPass *createSILowerControlFlowPass(TargetMachine &tm);<br>
> > +FunctionPass *createSICodeEmitterPass(formatted_raw_ostream &OS);<br>
> > +FunctionPass *createSILowerLiteralConstantsPass(TargetMachine &tm);<br>
> > +FunctionPass *createSIFixSGPRLivenessPass(TargetMachine &tm);<br>
> > +<br>
> > +// Passes common to R600 and SI<br>
> > +FunctionPass *createAMDGPUConvertToISAPass(TargetMachine &tm);<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +namespace ShaderType {<br>
> > +  enum Type {<br>
> > +    PIXEL = 0,<br>
> > +    VERTEX = 1,<br>
> > +    GEOMETRY = 2,<br>
> > +    COMPUTE = 3<br>
> > +  };<br>
> > +}<br>
> > +<br>
> > +#endif // AMDGPU_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPU.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPU.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPU.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPU.td (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPU.td Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,40 @@<br>
> > +//===-- AMDIL.td - AMDIL Tablegen files --*- tablegen<br>
> > -*-------------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//==-----------------------------------------------------------------------===//<br>
> > +<br>
> > +// Include AMDIL TD files<br>
> > +include "AMDILBase.td"<br>
> > +<br>
> > +<br>
> > +def AMDGPUInstrInfo : InstrInfo {<br>
> > +  let guessInstructionProperties = 1;<br>
> > +}<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// Declare the target which we are implementing<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +def AMDGPUAsmWriter : AsmWriter {<br>
> > +    string AsmWriterClassName = "InstPrinter";<br>
> > +    int Variant = 0;<br>
> > +    bit isMCAsmWriter = 1;<br>
> > +}<br>
> > +<br>
> > +def AMDGPU : Target {<br>
> > +  // Pull in Instruction Info:<br>
> > +  let InstructionSet = AMDGPUInstrInfo;<br>
> > +  let AssemblyWriters = [AMDGPUAsmWriter];<br>
> > +}<br>
> > +<br>
> > +// Include AMDGPU TD files<br>
> > +include "R600Schedule.td"<br>
> > +include "SISchedule.td"<br>
> > +include "Processors.td"<br>
> > +include "AMDGPUInstrInfo.td"<br>
> > +include "AMDGPUIntrinsics.td"<br>
> > +include "AMDGPURegisterInfo.td"<br>
> > +include "AMDGPUInstructions.td"<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,138 @@<br>
> > +//===-- AMDGPUAsmPrinter.cpp - AMDGPU Assebly printer<br>
> >  --------------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +///<br>
> > +/// The AMDGPUAsmPrinter is used to print both assembly string and also<br>
> > binary<br>
> > +/// code.  When passed an MCAsmStreamer it prints assembly and when passed<br>
> > +/// an MCObjectStreamer it outputs binary code.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +<br>
> > +<br>
> > +#include "AMDGPUAsmPrinter.h"<br>
> > +#include "AMDGPU.h"<br>
> > +#include "SIMachineFunctionInfo.h"<br>
> > +#include "SIRegisterInfo.h"<br>
> > +#include "llvm/MC/MCStreamer.h"<br>
> > +#include "llvm/Target/TargetLoweringObjectFile.h"<br>
> > +#include "llvm/Support/TargetRegistry.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +<br>
> > +static AsmPrinter *createAMDGPUAsmPrinterPass(TargetMachine &tm,<br>
> > +                                              MCStreamer &Streamer) {<br>
> > +  return new AMDGPUAsmPrinter(tm, Streamer);<br>
> > +}<br>
> > +<br>
> > +extern "C" void LLVMInitializeR600AsmPrinter() {<br>
> > +  TargetRegistry::RegisterAsmPrinter(TheAMDGPUTarget,<br>
> > createAMDGPUAsmPrinterPass);<br>
> > +}<br>
> > +<br>
> > +/// We need to override this function so we can avoid<br>
> > +/// the call to EmitFunctionHeader(), which the MCPureStreamer can't<br>
> > handle.<br>
> > +bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {<br>
> > +  const AMDGPUSubtarget &STM = TM.getSubtarget<AMDGPUSubtarget>();<br>
> > +  if (STM.dumpCode()) {<br>
> > +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)<br>
> > +    MF.dump();<br>
> > +#endif<br>
> > +  }<br>
> > +  SetupMachineFunction(MF);<br>
> > +  OutStreamer.SwitchSection(getObjFileLowering().getTextSection());<br>
> > +  if (STM.device()->getGeneration() > AMDGPUDeviceInfo::HD6XXX) {<br>
> > +    EmitProgramInfo(MF);<br>
> > +  }<br>
> > +  EmitFunctionBody();<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +void AMDGPUAsmPrinter::EmitProgramInfo(MachineFunction &MF) {<br>
> > +  unsigned MaxSGPR = 0;<br>
> > +  unsigned MaxVGPR = 0;<br>
> > +  bool VCCUsed = false;<br>
> > +  const SIRegisterInfo * RI =<br>
> > +                static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());<br>
> > +<br>
> > +  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();<br>
> > +                                                  BB != BB_E; ++BB) {<br>
> > +    MachineBasicBlock &MBB = *BB;<br>
> > +    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();<br>
> > +                                                    I != E; ++I) {<br>
> > +      MachineInstr &MI = *I;<br>
> > +<br>
> > +      unsigned numOperands = MI.getNumOperands();<br>
> > +      for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) {<br>
> > +        MachineOperand & MO = MI.getOperand(op_idx);<br>
> > +        unsigned maxUsed;<br>
> > +        unsigned width = 0;<br>
> > +        bool isSGPR = false;<br>
> > +        unsigned reg;<br>
> > +        unsigned hwReg;<br>
> > +        if (!MO.isReg()) {<br>
> > +          continue;<br>
> > +        }<br>
> > +        reg = MO.getReg();<br>
> > +        if (reg == AMDGPU::VCC) {<br>
> > +          VCCUsed = true;<br>
> > +          continue;<br>
> > +        }<br>
> > +        switch (reg) {<br>
> > +        default: break;<br>
> > +        case AMDGPU::EXEC:<br>
> > +        case AMDGPU::SI_LITERAL_CONSTANT:<br>
> > +        case AMDGPU::SREG_LIT_0:<br>
> > +        case AMDGPU::M0:<br>
> > +          continue;<br>
> > +        }<br>
> > +<br>
> > +        if (AMDGPU::SReg_32RegClass.contains(reg)) {<br>
> > +          isSGPR = true;<br>
> > +          width = 1;<br>
> > +        } else if (AMDGPU::VReg_32RegClass.contains(reg)) {<br>
> > +          isSGPR = false;<br>
> > +          width = 1;<br>
> > +        } else if (AMDGPU::SReg_64RegClass.contains(reg)) {<br>
> > +          isSGPR = true;<br>
> > +          width = 2;<br>
> > +        } else if (AMDGPU::VReg_64RegClass.contains(reg)) {<br>
> > +          isSGPR = false;<br>
> > +          width = 2;<br>
> > +        } else if (AMDGPU::SReg_128RegClass.contains(reg)) {<br>
> > +          isSGPR = true;<br>
> > +          width = 4;<br>
> > +        } else if (AMDGPU::VReg_128RegClass.contains(reg)) {<br>
> > +          isSGPR = false;<br>
> > +          width = 4;<br>
> > +        } else if (AMDGPU::SReg_256RegClass.contains(reg)) {<br>
> > +          isSGPR = true;<br>
> > +          width = 8;<br>
> > +        } else {<br>
> > +          assert(!"Unknown register class");<br>
> > +        }<br>
> > +        hwReg = RI->getEncodingValue(reg);<br>
> > +        maxUsed = hwReg + width - 1;<br>
> > +        if (isSGPR) {<br>
> > +          MaxSGPR = maxUsed > MaxSGPR ? maxUsed : MaxSGPR;<br>
> > +        } else {<br>
> > +          MaxVGPR = maxUsed > MaxVGPR ? maxUsed : MaxVGPR;<br>
> > +        }<br>
> > +      }<br>
> > +    }<br>
> > +  }<br>
> > +  if (VCCUsed) {<br>
> > +    MaxSGPR += 2;<br>
> > +  }<br>
> > +  SIMachineFunctionInfo * MFI = MF.getInfo<SIMachineFunctionInfo>();<br>
> > +  OutStreamer.EmitIntValue(MaxSGPR + 1, 4);<br>
> > +  OutStreamer.EmitIntValue(MaxVGPR + 1, 4);<br>
> > +  OutStreamer.EmitIntValue(MFI->SPIPSInputAddr, 4);<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUAsmPrinter.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,44 @@<br>
> > +//===-- AMDGPUAsmPrinter.h - Print AMDGPU assembly code<br>
> > -------------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief AMDGPU Assembly printer class.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPU_ASMPRINTER_H<br>
> > +#define AMDGPU_ASMPRINTER_H<br>
> > +<br>
> > +#include "llvm/CodeGen/AsmPrinter.h"<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class AMDGPUAsmPrinter : public AsmPrinter {<br>
> > +<br>
> > +public:<br>
> > +  explicit AMDGPUAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)<br>
> > +    : AsmPrinter(TM, Streamer) { }<br>
> > +<br>
> > +  virtual bool runOnMachineFunction(MachineFunction &MF);<br>
> > +<br>
> > +  virtual const char *getPassName() const {<br>
> > +    return "AMDGPU Assembly Printer";<br>
> > +  }<br>
> > +<br>
> > +  /// \brief Emit register usage information so that the GPU driver<br>
> > +  /// can correctly setup the GPU state.<br>
> > +  void EmitProgramInfo(MachineFunction &MF);<br>
> > +<br>
> > +  /// Implemented in AMDGPUMCInstLower.cpp<br>
> > +  virtual void EmitInstruction(const MachineInstr *MI);<br>
> > +};<br>
> > +<br>
> > +} // End anonymous llvm<br>
> > +<br>
> > +#endif //AMDGPU_ASMPRINTER_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUCodeEmitter.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,49 @@<br>
> > +//===-- AMDGPUCodeEmitter.h - AMDGPU Code Emitter interface<br>
> > -----------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief CodeEmitter interface for R600 and SI codegen.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPUCODEEMITTER_H<br>
> > +#define AMDGPUCODEEMITTER_H<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class AMDGPUCodeEmitter {<br>
> > +public:<br>
> > +  uint64_t getBinaryCodeForInstr(const MachineInstr &MI) const;<br>
> > +  virtual uint64_t getMachineOpValue(const MachineInstr &MI,<br>
> > +                                   const MachineOperand &MO) const {<br>
> > return 0; }<br>
> > +  virtual unsigned GPR4AlignEncode(const MachineInstr  &MI,<br>
> > +                                     unsigned OpNo) const {<br>
> > +    return 0;<br>
> > +  }<br>
> > +  virtual unsigned GPR2AlignEncode(const MachineInstr &MI,<br>
> > +                                   unsigned OpNo) const {<br>
> > +    return 0;<br>
> > +  }<br>
> > +  virtual uint64_t VOPPostEncode(const MachineInstr &MI,<br>
> > +                                 uint64_t Value) const {<br>
> > +    return Value;<br>
> > +  }<br>
> > +  virtual uint64_t i32LiteralEncode(const MachineInstr &MI,<br>
> > +                                    unsigned OpNo) const {<br>
> > +    return 0;<br>
> > +  }<br>
> > +  virtual uint32_t SMRDmemriEncode(const MachineInstr &MI, unsigned OpNo)<br>
> > +                                                                   const {<br>
> > +    return 0;<br>
> > +  }<br>
> > +};<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif // AMDGPUCODEEMITTER_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUConvertToISA.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,62 @@<br>
> > +//===-- AMDGPUConvertToISA.cpp - Lower AMDIL to HW ISA<br>
> > --------------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief This pass lowers AMDIL machine instructions to the appropriate<br>
> > +/// hardware instructions.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPU.h"<br>
> > +#include "AMDGPUInstrInfo.h"<br>
> > +#include "llvm/CodeGen/MachineFunctionPass.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +namespace {<br>
> > +<br>
> > +class AMDGPUConvertToISAPass : public MachineFunctionPass {<br>
> > +<br>
> > +private:<br>
> > +  static char ID;<br>
> > +  TargetMachine &TM;<br>
> > +<br>
> > +public:<br>
> > +  AMDGPUConvertToISAPass(TargetMachine &tm) :<br>
> > +    MachineFunctionPass(ID), TM(tm) { }<br>
> > +<br>
> > +  virtual bool runOnMachineFunction(MachineFunction &MF);<br>
> > +<br>
> > +  virtual const char *getPassName() const {return "AMDGPU Convert to<br>
> > ISA";}<br>
> > +<br>
> > +};<br>
> > +<br>
> > +} // End anonymous namespace<br>
> > +<br>
> > +char AMDGPUConvertToISAPass::ID = 0;<br>
> > +<br>
> > +FunctionPass *llvm::createAMDGPUConvertToISAPass(TargetMachine &tm) {<br>
> > +  return new AMDGPUConvertToISAPass(tm);<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUConvertToISAPass::runOnMachineFunction(MachineFunction &MF) {<br>
> > +  const AMDGPUInstrInfo * TII =<br>
> > +                      static_cast<const<br>
> > AMDGPUInstrInfo*>(TM.getInstrInfo());<br>
> > +<br>
> > +  for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();<br>
> > +                                                  BB != BB_E; ++BB) {<br>
> > +    MachineBasicBlock &MBB = *BB;<br>
> > +    for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();<br>
> > +                                                      I != E; ++I) {<br>
> > +      MachineInstr &MI = *I;<br>
> > +      TII->convertToISA(MI, MF, MBB.findDebugLoc(I));<br>
> > +    }<br>
> > +  }<br>
> > +  return false;<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUISelLowering.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,417 @@<br>
> > +//===-- AMDGPUISelLowering.cpp - AMDGPU Common DAG lowering functions<br>
> > -----===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief This is the parent TargetLowering class for hardware code gen<br>
> > +/// targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPUISelLowering.h"<br>
> > +#include "AMDILIntrinsicInfo.h"<br>
> > +#include "llvm/CodeGen/MachineFunction.h"<br>
> > +#include "llvm/CodeGen/MachineRegisterInfo.h"<br>
> > +#include "llvm/CodeGen/SelectionDAG.h"<br>
> > +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) :<br>
> > +  TargetLowering(TM, new TargetLoweringObjectFileELF()) {<br>
> > +<br>
> > +  // Initialize target lowering borrowed from AMDIL<br>
> > +  InitAMDILLowering();<br>
> > +<br>
> > +  // We need to custom lower some of the intrinsics<br>
> > +  setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);<br>
> > +<br>
> > +  // Library functions.  These default to Expand, but we have instructions<br>
> > +  // for them.<br>
> > +  setOperationAction(ISD::FCEIL,  MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FEXP2,  MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FPOW,   MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FLOG2,  MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FABS,   MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FFLOOR, MVT::f32, Legal);<br>
> > +  setOperationAction(ISD::FRINT,  MVT::f32, Legal);<br>
> > +<br>
> > +  // Lower floating point store/load to integer store/load to reduce the<br>
> > number<br>
> > +  // of patterns in tablegen.<br>
> > +  setOperationAction(ISD::STORE, MVT::f32, Promote);<br>
> > +  AddPromotedToType(ISD::STORE, MVT::f32, MVT::i32);<br>
> > +<br>
> > +  setOperationAction(ISD::STORE, MVT::v4f32, Promote);<br>
> > +  AddPromotedToType(ISD::STORE, MVT::v4f32, MVT::v4i32);<br>
> > +<br>
> > +  setOperationAction(ISD::LOAD, MVT::f32, Promote);<br>
> > +  AddPromotedToType(ISD::LOAD, MVT::f32, MVT::i32);<br>
> > +<br>
> > +  setOperationAction(ISD::LOAD, MVT::v4f32, Promote);<br>
> > +  AddPromotedToType(ISD::LOAD, MVT::v4f32, MVT::v4i32);<br>
> > +<br>
> > +  setOperationAction(ISD::UDIV, MVT::i32, Expand);<br>
> > +  setOperationAction(ISD::UDIVREM, MVT::i32, Custom);<br>
> > +  setOperationAction(ISD::UREM, MVT::i32, Expand);<br>
> > +}<br>
> > +<br>
> ><br>
> > +//===---------------------------------------------------------------------===//<br>
> > +// TargetLowering Callbacks<br>
> ><br>
> > +//===---------------------------------------------------------------------===//<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::LowerFormalArguments(<br>
> > +                                      SDValue Chain,<br>
> > +                                      CallingConv::ID CallConv,<br>
> > +                                      bool isVarArg,<br>
> > +                                      const<br>
> > SmallVectorImpl<ISD::InputArg> &Ins,<br>
> > +                                      DebugLoc DL, SelectionDAG &DAG,<br>
> > +                                      SmallVectorImpl<SDValue> &InVals)<br>
> > const {<br>
> > +  for (unsigned i = 0, e = Ins.size(); i < e; ++i) {<br>
> > +    InVals.push_back(SDValue());<br>
> > +  }<br>
> > +  return Chain;<br>
> > +}<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::LowerReturn(<br>
> > +                                     SDValue Chain,<br>
> > +                                     CallingConv::ID CallConv,<br>
> > +                                     bool isVarArg,<br>
> > +                                     const<br>
> > SmallVectorImpl<ISD::OutputArg> &Outs,<br>
> > +                                     const SmallVectorImpl<SDValue><br>
> > &OutVals,<br>
> > +                                     DebugLoc DL, SelectionDAG &DAG)<br>
> > const {<br>
> > +  return DAG.getNode(AMDGPUISD::RET_FLAG, DL, MVT::Other, Chain);<br>
> > +}<br>
> > +<br>
> ><br>
> > +//===---------------------------------------------------------------------===//<br>
> > +// Target specific lowering<br>
> ><br>
> > +//===---------------------------------------------------------------------===//<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op, SelectionDAG<br>
> > &DAG)<br>
> > +    const {<br>
> > +  switch (Op.getOpcode()) {<br>
> > +  default:<br>
> > +    Op.getNode()->dump();<br>
> > +    assert(0 && "Custom lowering code for this"<br>
> > +        "instruction is not implemented yet!");<br>
> > +    break;<br>
> > +  // AMDIL DAG lowering<br>
> > +  case ISD::SDIV: return LowerSDIV(Op, DAG);<br>
> > +  case ISD::SREM: return LowerSREM(Op, DAG);<br>
> > +  case ISD::SIGN_EXTEND_INREG: return LowerSIGN_EXTEND_INREG(Op, DAG);<br>
> > +  case ISD::BRCOND: return LowerBRCOND(Op, DAG);<br>
> > +  // AMDGPU DAG lowering<br>
> > +  case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);<br>
> > +  case ISD::UDIVREM: return LowerUDIVREM(Op, DAG);<br>
> > +  }<br>
> > +  return Op;<br>
> > +}<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,<br>
> > +    SelectionDAG &DAG) const {<br>
> > +  unsigned IntrinsicID =<br>
> > cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();<br>
> > +  DebugLoc DL = Op.getDebugLoc();<br>
> > +  EVT VT = Op.getValueType();<br>
> > +<br>
> > +  switch (IntrinsicID) {<br>
> > +    default: return Op;<br>
> > +    case AMDGPUIntrinsic::AMDIL_abs:<br>
> > +      return LowerIntrinsicIABS(Op, DAG);<br>
> > +    case AMDGPUIntrinsic::AMDIL_exp:<br>
> > +      return DAG.getNode(ISD::FEXP2, DL, VT, Op.getOperand(1));<br>
> > +    case AMDGPUIntrinsic::AMDGPU_lrp:<br>
> > +      return LowerIntrinsicLRP(Op, DAG);<br>
> > +    case AMDGPUIntrinsic::AMDIL_fraction:<br>
> > +      return DAG.getNode(AMDGPUISD::FRACT, DL, VT, Op.getOperand(1));<br>
> > +    case AMDGPUIntrinsic::AMDIL_mad:<br>
> > +      return DAG.getNode(AMDGPUISD::MAD, DL, VT, Op.getOperand(1),<br>
> > +                              Op.getOperand(2), Op.getOperand(3));<br>
> > +    case AMDGPUIntrinsic::AMDIL_max:<br>
> > +      return DAG.getNode(AMDGPUISD::FMAX, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDGPU_imax:<br>
> > +      return DAG.getNode(AMDGPUISD::SMAX, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDGPU_umax:<br>
> > +      return DAG.getNode(AMDGPUISD::UMAX, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDIL_min:<br>
> > +      return DAG.getNode(AMDGPUISD::FMIN, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDGPU_imin:<br>
> > +      return DAG.getNode(AMDGPUISD::SMIN, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDGPU_umin:<br>
> > +      return DAG.getNode(AMDGPUISD::UMIN, DL, VT, Op.getOperand(1),<br>
> > +                                                  Op.getOperand(2));<br>
> > +    case AMDGPUIntrinsic::AMDIL_round_nearest:<br>
> > +      return DAG.getNode(ISD::FRINT, DL, VT, Op.getOperand(1));<br>
> > +  }<br>
> > +}<br>
> > +<br>
> > +///IABS(a) = SMAX(sub(0, a), a)<br>
> > +SDValue AMDGPUTargetLowering::LowerIntrinsicIABS(SDValue Op,<br>
> > +    SelectionDAG &DAG) const {<br>
> > +<br>
> > +  DebugLoc DL = Op.getDebugLoc();<br>
> > +  EVT VT = Op.getValueType();<br>
> > +  SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, VT),<br>
> > +                                              Op.getOperand(1));<br>
> > +<br>
> > +  return DAG.getNode(AMDGPUISD::SMAX, DL, VT, Neg, Op.getOperand(1));<br>
> > +}<br>
> > +<br>
> > +/// Linear Interpolation<br>
> > +/// LRP(a, b, c) = muladd(a,  b, (1 - a) * c)<br>
> > +SDValue AMDGPUTargetLowering::LowerIntrinsicLRP(SDValue Op,<br>
> > +    SelectionDAG &DAG) const {<br>
> > +  DebugLoc DL = Op.getDebugLoc();<br>
> > +  EVT VT = Op.getValueType();<br>
> > +  SDValue OneSubA = DAG.getNode(ISD::FSUB, DL, VT,<br>
> > +                                DAG.getConstantFP(1.0f, MVT::f32),<br>
> > +                                Op.getOperand(1));<br>
> > +  SDValue OneSubAC = DAG.getNode(ISD::FMUL, DL, VT, OneSubA,<br>
> > +                                                    Op.getOperand(3));<br>
> > +  return DAG.getNode(AMDGPUISD::MAD, DL, VT, Op.getOperand(1),<br>
> > +                                               Op.getOperand(2),<br>
> > +                                               OneSubAC);<br>
> > +}<br>
> > +<br>
> > +/// \brief Generate Min/Max node<br>
> > +SDValue AMDGPUTargetLowering::LowerMinMax(SDValue Op,<br>
> > +    SelectionDAG &DAG) const {<br>
> > +  DebugLoc DL = Op.getDebugLoc();<br>
> > +  EVT VT = Op.getValueType();<br>
> > +<br>
> > +  SDValue LHS = Op.getOperand(0);<br>
> > +  SDValue RHS = Op.getOperand(1);<br>
> > +  SDValue True = Op.getOperand(2);<br>
> > +  SDValue False = Op.getOperand(3);<br>
> > +  SDValue CC = Op.getOperand(4);<br>
> > +<br>
> > +  if (VT != MVT::f32 ||<br>
> > +      !((LHS == True && RHS == False) || (LHS == False && RHS == True))) {<br>
> > +    return SDValue();<br>
> > +  }<br>
> > +<br>
> > +  ISD::CondCode CCOpcode = cast<CondCodeSDNode>(CC)->get();<br>
> > +  switch (CCOpcode) {<br>
> > +  case ISD::SETOEQ:<br>
> > +  case ISD::SETONE:<br>
> > +  case ISD::SETUNE:<br>
> > +  case ISD::SETNE:<br>
> > +  case ISD::SETUEQ:<br>
> > +  case ISD::SETEQ:<br>
> > +  case ISD::SETFALSE:<br>
> > +  case ISD::SETFALSE2:<br>
> > +  case ISD::SETTRUE:<br>
> > +  case ISD::SETTRUE2:<br>
> > +  case ISD::SETUO:<br>
> > +  case ISD::SETO:<br>
> > +    assert(0 && "Operation should already be optimised !");<br>
> > +  case ISD::SETULE:<br>
> > +  case ISD::SETULT:<br>
> > +  case ISD::SETOLE:<br>
> > +  case ISD::SETOLT:<br>
> > +  case ISD::SETLE:<br>
> > +  case ISD::SETLT: {<br>
> > +    if (LHS == True)<br>
> > +      return DAG.getNode(AMDGPUISD::FMIN, DL, VT, LHS, RHS);<br>
> > +    else<br>
> > +      return DAG.getNode(AMDGPUISD::FMAX, DL, VT, LHS, RHS);<br>
> > +  }<br>
> > +  case ISD::SETGT:<br>
> > +  case ISD::SETGE:<br>
> > +  case ISD::SETUGE:<br>
> > +  case ISD::SETOGE:<br>
> > +  case ISD::SETUGT:<br>
> > +  case ISD::SETOGT: {<br>
> > +    if (LHS == True)<br>
> > +      return DAG.getNode(AMDGPUISD::FMAX, DL, VT, LHS, RHS);<br>
> > +    else<br>
> > +      return DAG.getNode(AMDGPUISD::FMIN, DL, VT, LHS, RHS);<br>
> > +  }<br>
> > +  case ISD::SETCC_INVALID:<br>
> > +    assert(0 && "Invalid setcc condcode !");<br>
> > +  }<br>
> > +  return Op;<br>
> > +}<br>
> > +<br>
> > +<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::LowerUDIVREM(SDValue Op,<br>
> > +    SelectionDAG &DAG) const {<br>
> > +  DebugLoc DL = Op.getDebugLoc();<br>
> > +  EVT VT = Op.getValueType();<br>
> > +<br>
> > +  SDValue Num = Op.getOperand(0);<br>
> > +  SDValue Den = Op.getOperand(1);<br>
> > +<br>
> > +  SmallVector<SDValue, 8> Results;<br>
> > +<br>
> > +  // RCP =  URECIP(Den) = 2^32 / Den + e<br>
> > +  // e is rounding error.<br>
> > +  SDValue RCP = DAG.getNode(AMDGPUISD::URECIP, DL, VT, Den);<br>
> > +<br>
> > +  // RCP_LO = umulo(RCP, Den) */<br>
> > +  SDValue RCP_LO = DAG.getNode(ISD::UMULO, DL, VT, RCP, Den);<br>
> > +<br>
> > +  // RCP_HI = mulhu (RCP, Den) */<br>
> > +  SDValue RCP_HI = DAG.getNode(ISD::MULHU, DL, VT, RCP, Den);<br>
> > +<br>
> > +  // NEG_RCP_LO = -RCP_LO<br>
> > +  SDValue NEG_RCP_LO = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0,<br>
> > VT),<br>
> > +                                                     RCP_LO);<br>
> > +<br>
> > +  // ABS_RCP_LO = (RCP_HI == 0 ? NEG_RCP_LO : RCP_LO)<br>
> > +  SDValue ABS_RCP_LO = DAG.getSelectCC(DL, RCP_HI, DAG.getConstant(0, VT),<br>
> > +                                           NEG_RCP_LO, RCP_LO,<br>
> > +                                           ISD::SETEQ);<br>
> > +  // Calculate the rounding error from the URECIP instruction<br>
> > +  // E = mulhu(ABS_RCP_LO, RCP)<br>
> > +  SDValue E = DAG.getNode(ISD::MULHU, DL, VT, ABS_RCP_LO, RCP);<br>
> > +<br>
> > +  // RCP_A_E = RCP + E<br>
> > +  SDValue RCP_A_E = DAG.getNode(ISD::ADD, DL, VT, RCP, E);<br>
> > +<br>
> > +  // RCP_S_E = RCP - E<br>
> > +  SDValue RCP_S_E = DAG.getNode(ISD::SUB, DL, VT, RCP, E);<br>
> > +<br>
> > +  // Tmp0 = (RCP_HI == 0 ? RCP_A_E : RCP_SUB_E)<br>
> > +  SDValue Tmp0 = DAG.getSelectCC(DL, RCP_HI, DAG.getConstant(0, VT),<br>
> > +                                     RCP_A_E, RCP_S_E,<br>
> > +                                     ISD::SETEQ);<br>
> > +  // Quotient = mulhu(Tmp0, Num)<br>
> > +  SDValue Quotient = DAG.getNode(ISD::MULHU, DL, VT, Tmp0, Num);<br>
> > +<br>
> > +  // Num_S_Remainder = Quotient * Den<br>
> > +  SDValue Num_S_Remainder = DAG.getNode(ISD::UMULO, DL, VT, Quotient,<br>
> > Den);<br>
> > +<br>
> > +  // Remainder = Num - Num_S_Remainder<br>
> > +  SDValue Remainder = DAG.getNode(ISD::SUB, DL, VT, Num, Num_S_Remainder);<br>
> > +<br>
> > +  // Remainder_GE_Den = (Remainder >= Den ? -1 : 0)<br>
> > +  SDValue Remainder_GE_Den = DAG.getSelectCC(DL, Remainder, Den,<br>
> > +                                                 DAG.getConstant(-1, VT),<br>
> > +                                                 DAG.getConstant(0, VT),<br>
> > +                                                 ISD::SETGE);<br>
> > +  // Remainder_GE_Zero = (Remainder >= 0 ? -1 : 0)<br>
> > +  SDValue Remainder_GE_Zero = DAG.getSelectCC(DL, Remainder,<br>
> > +                                                  DAG.getConstant(0, VT),<br>
> > +                                                  DAG.getConstant(-1, VT),<br>
> > +                                                  DAG.getConstant(0, VT),<br>
> > +                                                  ISD::SETGE);<br>
> > +  // Tmp1 = Remainder_GE_Den & Remainder_GE_Zero<br>
> > +  SDValue Tmp1 = DAG.getNode(ISD::AND, DL, VT, Remainder_GE_Den,<br>
> > +                                               Remainder_GE_Zero);<br>
> > +<br>
> > +  // Calculate Division result:<br>
> > +<br>
> > +  // Quotient_A_One = Quotient + 1<br>
> > +  SDValue Quotient_A_One = DAG.getNode(ISD::ADD, DL, VT, Quotient,<br>
> > +<br>
> > DAG.getConstant(1, VT));<br>
> > +<br>
> > +  // Quotient_S_One = Quotient - 1<br>
> > +  SDValue Quotient_S_One = DAG.getNode(ISD::SUB, DL, VT, Quotient,<br>
> > +<br>
> > DAG.getConstant(1, VT));<br>
> > +<br>
> > +  // Div = (Tmp1 == 0 ? Quotient : Quotient_A_One)<br>
> > +  SDValue Div = DAG.getSelectCC(DL, Tmp1, DAG.getConstant(0, VT),<br>
> > +                                     Quotient, Quotient_A_One,<br>
> > ISD::SETEQ);<br>
> > +<br>
> > +  // Div = (Remainder_GE_Zero == 0 ? Quotient_S_One : Div)<br>
> > +  Div = DAG.getSelectCC(DL, Remainder_GE_Zero, DAG.getConstant(0, VT),<br>
> > +                            Quotient_S_One, Div, ISD::SETEQ);<br>
> > +<br>
> > +  // Calculate Rem result:<br>
> > +<br>
> > +  // Remainder_S_Den = Remainder - Den<br>
> > +  SDValue Remainder_S_Den = DAG.getNode(ISD::SUB, DL, VT, Remainder, Den);<br>
> > +<br>
> > +  // Remainder_A_Den = Remainder + Den<br>
> > +  SDValue Remainder_A_Den = DAG.getNode(ISD::ADD, DL, VT, Remainder, Den);<br>
> > +<br>
> > +  // Rem = (Tmp1 == 0 ? Remainder : Remainder_S_Den)<br>
> > +  SDValue Rem = DAG.getSelectCC(DL, Tmp1, DAG.getConstant(0, VT),<br>
> > +                                    Remainder, Remainder_S_Den,<br>
> > ISD::SETEQ);<br>
> > +<br>
> > +  // Rem = (Remainder_GE_Zero == 0 ? Remainder_A_Den : Rem)<br>
> > +  Rem = DAG.getSelectCC(DL, Remainder_GE_Zero, DAG.getConstant(0, VT),<br>
> > +                            Remainder_A_Den, Rem, ISD::SETEQ);<br>
> > +  SDValue Ops[2];<br>
> > +  Ops[0] = Div;<br>
> > +  Ops[1] = Rem;<br>
> > +  return DAG.getMergeValues(Ops, 2, DL);<br>
> > +}<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// Helper functions<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +bool AMDGPUTargetLowering::isHWTrueValue(SDValue Op) const {<br>
> > +  if (ConstantFPSDNode * CFP = dyn_cast<ConstantFPSDNode>(Op)) {<br>
> > +    return CFP->isExactlyValue(1.0);<br>
> > +  }<br>
> > +  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {<br>
> > +    return C->isAllOnesValue();<br>
> > +  }<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUTargetLowering::isHWFalseValue(SDValue Op) const {<br>
> > +  if (ConstantFPSDNode * CFP = dyn_cast<ConstantFPSDNode>(Op)) {<br>
> > +    return CFP->getValueAPF().isZero();<br>
> > +  }<br>
> > +  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {<br>
> > +    return C->isNullValue();<br>
> > +  }<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +SDValue AMDGPUTargetLowering::CreateLiveInRegister(SelectionDAG &DAG,<br>
> > +                                                  const<br>
> > TargetRegisterClass *RC,<br>
> > +                                                   unsigned Reg, EVT VT)<br>
> > const {<br>
> > +  MachineFunction &MF = DAG.getMachineFunction();<br>
> > +  MachineRegisterInfo &MRI = MF.getRegInfo();<br>
> > +  unsigned VirtualRegister;<br>
> > +  if (!MRI.isLiveIn(Reg)) {<br>
> > +    VirtualRegister = MRI.createVirtualRegister(RC);<br>
> > +    MRI.addLiveIn(Reg, VirtualRegister);<br>
> > +  } else {<br>
> > +    VirtualRegister = MRI.getLiveInVirtReg(Reg);<br>
> > +  }<br>
> > +  return DAG.getRegister(VirtualRegister, VT);<br>
> > +}<br>
> > +<br>
> > +#define NODE_NAME_CASE(node) case AMDGPUISD::node: return #node;<br>
> > +<br>
> > +const char* AMDGPUTargetLowering::getTargetNodeName(unsigned Opcode)<br>
> > const {<br>
> > +  switch (Opcode) {<br>
> > +  default: return 0;<br>
> > +  // AMDIL DAG nodes<br>
> > +  NODE_NAME_CASE(MAD);<br>
> > +  NODE_NAME_CASE(CALL);<br>
> > +  NODE_NAME_CASE(UMUL);<br>
> > +  NODE_NAME_CASE(DIV_INF);<br>
> > +  NODE_NAME_CASE(RET_FLAG);<br>
> > +  NODE_NAME_CASE(BRANCH_COND);<br>
> > +<br>
> > +  // AMDGPU DAG nodes<br>
> > +  NODE_NAME_CASE(DWORDADDR)<br>
> > +  NODE_NAME_CASE(FRACT)<br>
> > +  NODE_NAME_CASE(FMAX)<br>
> > +  NODE_NAME_CASE(SMAX)<br>
> > +  NODE_NAME_CASE(UMAX)<br>
> > +  NODE_NAME_CASE(FMIN)<br>
> > +  NODE_NAME_CASE(SMIN)<br>
> > +  NODE_NAME_CASE(UMIN)<br>
> > +  NODE_NAME_CASE(URECIP)<br>
> > +  NODE_NAME_CASE(INTERP)<br>
> > +  NODE_NAME_CASE(INTERP_P0)<br>
> > +  NODE_NAME_CASE(EXPORT)<br>
> > +  }<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUISelLowering.h Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,144 @@<br>
> > +//===-- AMDGPUISelLowering.h - AMDGPU Lowering Interface --------*- C++<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Interface definition of the TargetLowering class that is common<br>
> > +/// to all AMD GPUs.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPUISELLOWERING_H<br>
> > +#define AMDGPUISELLOWERING_H<br>
> > +<br>
> > +#include "llvm/Target/TargetLowering.h"<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class MachineRegisterInfo;<br>
> > +<br>
> > +class AMDGPUTargetLowering : public TargetLowering {<br>
> > +private:<br>
> > +  SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;<br>
> > +<br>
> > +protected:<br>
> > +<br>
> > +  /// \brief Helper function that adds Reg to the LiveIn list of the DAG's<br>
> > +  /// MachineFunction.<br>
> > +  ///<br>
> > +  /// \returns a RegisterSDNode representing Reg.<br>
> > +  SDValue CreateLiveInRegister(SelectionDAG &DAG, const<br>
> > TargetRegisterClass *RC,<br>
> > +                                                  unsigned Reg, EVT VT)<br>
> > const;<br>
> > +<br>
> > +  bool isHWTrueValue(SDValue Op) const;<br>
> > +  bool isHWFalseValue(SDValue Op) const;<br>
> > +<br>
> > +public:<br>
> > +  AMDGPUTargetLowering(TargetMachine &TM);<br>
> > +<br>
> > +  virtual SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID<br>
> > CallConv,<br>
> > +                             bool isVarArg,<br>
> > +                             const SmallVectorImpl<ISD::InputArg> &Ins,<br>
> > +                             DebugLoc DL, SelectionDAG &DAG,<br>
> > +                             SmallVectorImpl<SDValue> &InVals) const;<br>
> > +<br>
> > +  virtual SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv,<br>
> > +                              bool isVarArg,<br>
> > +                              const SmallVectorImpl<ISD::OutputArg> &Outs,<br>
> > +                              const SmallVectorImpl<SDValue> &OutVals,<br>
> > +                              DebugLoc DL, SelectionDAG &DAG) const;<br>
> > +<br>
> > +  virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerIntrinsicIABS(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerIntrinsicLRP(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  virtual const char* getTargetNodeName(unsigned Opcode) const;<br>
> > +<br>
> > +// Functions defined in AMDILISelLowering.cpp<br>
> > +public:<br>
> > +<br>
> > +  /// \brief Determine which of the bits specified in \p Mask are known<br>
> > to be<br>
> > +  /// either zero or one and return them in the \p KnownZero and \p<br>
> > KnownOne<br>
> > +  /// bitsets.<br>
> > +  virtual void computeMaskedBitsForTargetNode(const SDValue Op,<br>
> > +                                              APInt &KnownZero,<br>
> > +                                              APInt &KnownOne,<br>
> > +                                              const SelectionDAG &DAG,<br>
> > +                                              unsigned Depth = 0) const;<br>
> > +<br>
> > +  virtual bool getTgtMemIntrinsic(IntrinsicInfo &Info,<br>
> > +                                  const CallInst &I, unsigned Intrinsic)<br>
> > const;<br>
> > +<br>
> > +  /// We want to mark f32/f64 floating point values as legal.<br>
> > +  bool isFPImmLegal(const APFloat &Imm, EVT VT) const;<br>
> > +<br>
> > +  /// We don't want to shrink f64/f32 constants.<br>
> > +  bool ShouldShrinkFPConstant(EVT VT) const;<br>
> > +<br>
> > +private:<br>
> > +  void InitAMDILLowering();<br>
> > +  SDValue LowerSREM(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSREM8(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSREM16(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSREM32(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSREM64(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSDIV(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSDIV24(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSDIV32(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSDIV64(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  EVT genIntType(uint32_t size = 32, uint32_t numEle = 1) const;<br>
> > +  SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;<br>
> > +  SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;<br>
> > +};<br>
> > +<br>
> > +namespace AMDGPUISD {<br>
> > +<br>
> > +enum {<br>
> > +  // AMDIL ISD Opcodes<br>
> > +  FIRST_NUMBER = ISD::BUILTIN_OP_END,<br>
> > +  MAD,         // 32bit Fused Multiply Add instruction<br>
> > +  CALL,        // Function call based on a single integer<br>
> > +  UMUL,        // 32bit unsigned multiplication<br>
> > +  DIV_INF,      // Divide with infinity returned on zero divisor<br>
> > +  RET_FLAG,<br>
> > +  BRANCH_COND,<br>
> > +  // End AMDIL ISD Opcodes<br>
> > +  BITALIGN,<br>
> > +  DWORDADDR,<br>
> > +  FRACT,<br>
> > +  FMAX,<br>
> > +  SMAX,<br>
> > +  UMAX,<br>
> > +  FMIN,<br>
> > +  SMIN,<br>
> > +  UMIN,<br>
> > +  URECIP,<br>
> > +  INTERP,<br>
> > +  INTERP_P0,<br>
> > +  EXPORT,<br>
> > +  LAST_AMDGPU_ISD_NUMBER<br>
> > +};<br>
> > +<br>
> > +<br>
> > +} // End namespace AMDGPUISD<br>
> > +<br>
> > +namespace SIISD {<br>
> > +<br>
> > +enum {<br>
> > +  SI_FIRST = AMDGPUISD::LAST_AMDGPU_ISD_NUMBER,<br>
> > +  VCC_AND,<br>
> > +  VCC_BITCAST<br>
> > +};<br>
> > +<br>
> > +} // End namespace SIISD<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif // AMDGPUISELLOWERING_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.cpp Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,257 @@<br>
> > +//===-- AMDGPUInstrInfo.cpp - Base class for AMD GPU InstrInfo<br>
> > ------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Implementation of the TargetInstrInfo class that is common to<br>
> > all<br>
> > +/// AMD GPUs.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPUInstrInfo.h"<br>
> > +#include "AMDGPURegisterInfo.h"<br>
> > +#include "AMDGPUTargetMachine.h"<br>
> > +#include "AMDIL.h"<br>
> > +#include "llvm/CodeGen/MachineFrameInfo.h"<br>
> > +#include "llvm/CodeGen/MachineInstrBuilder.h"<br>
> > +#include "llvm/CodeGen/MachineRegisterInfo.h"<br>
> > +<br>
> > +#define GET_INSTRINFO_CTOR<br>
> > +#include "AMDGPUGenInstrInfo.inc"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +AMDGPUInstrInfo::AMDGPUInstrInfo(TargetMachine &tm)<br>
> > +  : AMDGPUGenInstrInfo(0,0), RI(tm, *this), TM(tm) { }<br>
> > +<br>
> > +const AMDGPURegisterInfo &AMDGPUInstrInfo::getRegisterInfo() const {<br>
> > +  return RI;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::isCoalescableExtInstr(const MachineInstr &MI,<br>
> > +                                           unsigned &SrcReg, unsigned<br>
> > &DstReg,<br>
> > +                                           unsigned &SubIdx) const {<br>
> > +// TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +unsigned AMDGPUInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,<br>
> > +                                             int &FrameIndex) const {<br>
> > +// TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +<br>
> > +unsigned AMDGPUInstrInfo::isLoadFromStackSlotPostFE(const MachineInstr<br>
> > *MI,<br>
> > +                                                   int &FrameIndex) const<br>
> > {<br>
> > +// TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::hasLoadFromStackSlot(const MachineInstr *MI,<br>
> > +                                          const MachineMemOperand *&MMO,<br>
> > +                                          int &FrameIndex) const {<br>
> > +// TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +unsigned AMDGPUInstrInfo::isStoreFromStackSlot(const MachineInstr *MI,<br>
> > +                                              int &FrameIndex) const {<br>
> > +// TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +unsigned AMDGPUInstrInfo::isStoreFromStackSlotPostFE(const MachineInstr<br>
> > *MI,<br>
> > +                                                    int &FrameIndex)<br>
> > const {<br>
> > +// TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +bool AMDGPUInstrInfo::hasStoreFromStackSlot(const MachineInstr *MI,<br>
> > +                                           const MachineMemOperand *&MMO,<br>
> > +                                           int &FrameIndex) const {<br>
> > +// TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +MachineInstr *<br>
> > +AMDGPUInstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,<br>
> > +                                      MachineBasicBlock::iterator &MBBI,<br>
> > +                                      LiveVariables *LV) const {<br>
> > +// TODO: Implement this function<br>
> > +  return NULL;<br>
> > +}<br>
> > +bool AMDGPUInstrInfo::getNextBranchInstr(MachineBasicBlock::iterator<br>
> > &iter,<br>
> > +                                        MachineBasicBlock &MBB) const {<br>
> > +  while (iter != MBB.end()) {<br>
> > +    switch (iter->getOpcode()) {<br>
> > +    default:<br>
> > +      break;<br>
> > +    case AMDGPU::BRANCH_COND_i32:<br>
> > +    case AMDGPU::BRANCH_COND_f32:<br>
> > +    case AMDGPU::BRANCH:<br>
> > +      return true;<br>
> > +    };<br>
> > +    ++iter;<br>
> > +  }<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +MachineBasicBlock::iterator skipFlowControl(MachineBasicBlock *MBB) {<br>
> > +  MachineBasicBlock::iterator tmp = MBB->end();<br>
> > +  if (!MBB->size()) {<br>
> > +    return MBB->end();<br>
> > +  }<br>
> > +  while (--tmp) {<br>
> > +    if (tmp->getOpcode() == AMDGPU::ENDLOOP<br>
> > +        || tmp->getOpcode() == AMDGPU::ENDIF<br>
> > +        || tmp->getOpcode() == AMDGPU::ELSE) {<br>
> > +      if (tmp == MBB->begin()) {<br>
> > +        return tmp;<br>
> > +      } else {<br>
> > +        continue;<br>
> > +      }<br>
> > +    }  else {<br>
> > +      return ++tmp;<br>
> > +    }<br>
> > +  }<br>
> > +  return MBB->end();<br>
> > +}<br>
> > +<br>
> > +void<br>
> > +AMDGPUInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,<br>
> > +                                    MachineBasicBlock::iterator MI,<br>
> > +                                    unsigned SrcReg, bool isKill,<br>
> > +                                    int FrameIndex,<br>
> > +                                    const TargetRegisterClass *RC,<br>
> > +                                    const TargetRegisterInfo *TRI) const {<br>
> > +  assert(!"Not Implemented");<br>
> > +}<br>
> > +<br>
> > +void<br>
> > +AMDGPUInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,<br>
> > +                                     MachineBasicBlock::iterator MI,<br>
> > +                                     unsigned DestReg, int FrameIndex,<br>
> > +                                     const TargetRegisterClass *RC,<br>
> > +                                     const TargetRegisterInfo *TRI) const<br>
> > {<br>
> > +  assert(!"Not Implemented");<br>
> > +}<br>
> > +<br>
> > +MachineInstr *<br>
> > +AMDGPUInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,<br>
> > +                                      MachineInstr *MI,<br>
> > +                                      const SmallVectorImpl<unsigned><br>
> > &Ops,<br>
> > +                                      int FrameIndex) const {<br>
> > +// TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +MachineInstr*<br>
> > +AMDGPUInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,<br>
> > +                                      MachineInstr *MI,<br>
> > +                                      const SmallVectorImpl<unsigned><br>
> > &Ops,<br>
> > +                                      MachineInstr *LoadMI) const {<br>
> > +  // TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +bool<br>
> > +AMDGPUInstrInfo::canFoldMemoryOperand(const MachineInstr *MI,<br>
> > +                                     const SmallVectorImpl<unsigned><br>
> > &Ops) const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +bool<br>
> > +AMDGPUInstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr<br>
> > *MI,<br>
> > +                                 unsigned Reg, bool UnfoldLoad,<br>
> > +                                 bool UnfoldStore,<br>
> > +                                 SmallVectorImpl<MachineInstr*> &NewMIs)<br>
> > const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool<br>
> > +AMDGPUInstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,<br>
> > +                                    SmallVectorImpl<SDNode*> &NewNodes)<br>
> > const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +unsigned<br>
> > +AMDGPUInstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,<br>
> > +                                           bool UnfoldLoad, bool<br>
> > UnfoldStore,<br>
> > +                                           unsigned *LoadRegIndex) const {<br>
> > +  // TODO: Implement this function<br>
> > +  return 0;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::shouldScheduleLoadsNear(SDNode *Load1, SDNode<br>
> > *Load2,<br>
> > +                                             int64_t Offset1, int64_t<br>
> > Offset2,<br>
> > +                                             unsigned NumLoads) const {<br>
> > +  assert(Offset2 > Offset1<br>
> > +         && "Second offset should be larger than first offset!");<br>
> > +  // If we have less than 16 loads in a row, and the offsets are within<br>
> > 16,<br>
> > +  // then schedule together.<br>
> > +  // TODO: Make the loads schedule near if it fits in a cacheline<br>
> > +  return (NumLoads < 16 && (Offset2 - Offset1) < 16);<br>
> > +}<br>
> > +<br>
> > +bool<br>
> > +AMDGPUInstrInfo::ReverseBranchCondition(SmallVectorImpl<MachineOperand><br>
> > &Cond)<br>
> > +  const {<br>
> > +  // TODO: Implement this function<br>
> > +  return true;<br>
> > +}<br>
> > +void AMDGPUInstrInfo::insertNoop(MachineBasicBlock &MBB,<br>
> > +                                MachineBasicBlock::iterator MI) const {<br>
> > +  // TODO: Implement this function<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::isPredicated(const MachineInstr *MI) const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +bool<br>
> > +AMDGPUInstrInfo::SubsumesPredicate(const SmallVectorImpl<MachineOperand><br>
> > &Pred1,<br>
> > +                                  const SmallVectorImpl<MachineOperand><br>
> > &Pred2)<br>
> > +  const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::DefinesPredicate(MachineInstr *MI,<br>
> > +                                      std::vector<MachineOperand> &Pred)<br>
> > const {<br>
> > +  // TODO: Implement this function<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUInstrInfo::isPredicable(MachineInstr *MI) const {<br>
> > +  // TODO: Implement this function<br>
> > +  return MI->getDesc().isPredicable();<br>
> > +}<br>
> > +<br>
> > +bool<br>
> > +AMDGPUInstrInfo::isSafeToMoveRegClassDefs(const TargetRegisterClass *RC)<br>
> > const {<br>
> > +  // TODO: Implement this function<br>
> > +  return true;<br>
> > +}<br>
> > +<br>
> > +void AMDGPUInstrInfo::convertToISA(MachineInstr & MI, MachineFunction &MF,<br>
> > +    DebugLoc DL) const {<br>
> > +  MachineRegisterInfo &MRI = MF.getRegInfo();<br>
> > +  const AMDGPURegisterInfo & RI = getRegisterInfo();<br>
> > +<br>
> > +  for (unsigned i = 0; i < MI.getNumOperands(); i++) {<br>
> > +    MachineOperand &MO = MI.getOperand(i);<br>
> > +    // Convert dst regclass to one that is supported by the ISA<br>
> > +    if (MO.isReg() && MO.isDef()) {<br>
> > +      if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {<br>
> > +        const TargetRegisterClass * oldRegClass =<br>
> > MRI.getRegClass(MO.getReg());<br>
> > +        const TargetRegisterClass * newRegClass =<br>
> > RI.getISARegClass(oldRegClass);<br>
> > +<br>
> > +        assert(newRegClass);<br>
> > +<br>
> > +        MRI.setRegClass(MO.getReg(), newRegClass);<br>
> > +      }<br>
> > +    }<br>
> > +  }<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,149 @@<br>
> > +//===-- AMDGPUInstrInfo.h - AMDGPU Instruction Information ------*- C++<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Contains the definition of a TargetInstrInfo class that is<br>
> > common<br>
> > +/// to all AMD GPUs.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPUINSTRUCTIONINFO_H<br>
> > +#define AMDGPUINSTRUCTIONINFO_H<br>
> > +<br>
> > +#include "AMDGPURegisterInfo.h"<br>
> > +#include "AMDGPUInstrInfo.h"<br>
> > +#include "llvm/Target/TargetInstrInfo.h"<br>
> > +<br>
> > +#include <map><br>
> > +<br>
> > +#define GET_INSTRINFO_HEADER<br>
> > +#define GET_INSTRINFO_ENUM<br>
> > +#include "AMDGPUGenInstrInfo.inc"<br>
> > +<br>
> > +#define OPCODE_IS_ZERO_INT AMDGPU::PRED_SETE_INT<br>
> > +#define OPCODE_IS_NOT_ZERO_INT AMDGPU::PRED_SETNE_INT<br>
> > +#define OPCODE_IS_ZERO AMDGPU::PRED_SETE<br>
> > +#define OPCODE_IS_NOT_ZERO AMDGPU::PRED_SETNE<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class AMDGPUTargetMachine;<br>
> > +class MachineFunction;<br>
> > +class MachineInstr;<br>
> > +class MachineInstrBuilder;<br>
> > +<br>
> > +class AMDGPUInstrInfo : public AMDGPUGenInstrInfo {<br>
> > +private:<br>
> > +  const AMDGPURegisterInfo RI;<br>
> > +  TargetMachine &TM;<br>
> > +  bool getNextBranchInstr(MachineBasicBlock::iterator &iter,<br>
> > +                          MachineBasicBlock &MBB) const;<br>
> > +public:<br>
> > +  explicit AMDGPUInstrInfo(TargetMachine &tm);<br>
> > +<br>
> > +  virtual const AMDGPURegisterInfo &getRegisterInfo() const = 0;<br>
> > +<br>
> > +  bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg,<br>
> > +                             unsigned &DstReg, unsigned &SubIdx) const;<br>
> > +<br>
> > +  unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex)<br>
> > const;<br>
> > +  unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI,<br>
> > +                                     int &FrameIndex) const;<br>
> > +  bool hasLoadFromStackSlot(const MachineInstr *MI,<br>
> > +                            const MachineMemOperand *&MMO,<br>
> > +                            int &FrameIndex) const;<br>
> > +  unsigned isStoreFromStackSlot(const MachineInstr *MI, int &FrameIndex)<br>
> > const;<br>
> > +  unsigned isStoreFromStackSlotPostFE(const MachineInstr *MI,<br>
> > +                                      int &FrameIndex) const;<br>
> > +  bool hasStoreFromStackSlot(const MachineInstr *MI,<br>
> > +                             const MachineMemOperand *&MMO,<br>
> > +                             int &FrameIndex) const;<br>
> > +<br>
> > +  MachineInstr *<br>
> > +  convertToThreeAddress(MachineFunction::iterator &MFI,<br>
> > +                        MachineBasicBlock::iterator &MBBI,<br>
> > +                        LiveVariables *LV) const;<br>
> > +<br>
> > +<br>
> > +  virtual void copyPhysReg(MachineBasicBlock &MBB,<br>
> > +                           MachineBasicBlock::iterator MI, DebugLoc DL,<br>
> > +                           unsigned DestReg, unsigned SrcReg,<br>
> > +                           bool KillSrc) const = 0;<br>
> > +<br>
> > +  void storeRegToStackSlot(MachineBasicBlock &MBB,<br>
> > +                           MachineBasicBlock::iterator MI,<br>
> > +                           unsigned SrcReg, bool isKill, int FrameIndex,<br>
> > +                           const TargetRegisterClass *RC,<br>
> > +                           const TargetRegisterInfo *TRI) const;<br>
> > +  void loadRegFromStackSlot(MachineBasicBlock &MBB,<br>
> > +                            MachineBasicBlock::iterator MI,<br>
> > +                            unsigned DestReg, int FrameIndex,<br>
> > +                            const TargetRegisterClass *RC,<br>
> > +                            const TargetRegisterInfo *TRI) const;<br>
> > +<br>
> > +protected:<br>
> > +  MachineInstr *foldMemoryOperandImpl(MachineFunction &MF,<br>
> > +                                      MachineInstr *MI,<br>
> > +                                      const SmallVectorImpl<unsigned><br>
> > &Ops,<br>
> > +                                      int FrameIndex) const;<br>
> > +  MachineInstr *foldMemoryOperandImpl(MachineFunction &MF,<br>
> > +                                      MachineInstr *MI,<br>
> > +                                      const SmallVectorImpl<unsigned><br>
> > &Ops,<br>
> > +                                      MachineInstr *LoadMI) const;<br>
> > +public:<br>
> > +  bool canFoldMemoryOperand(const MachineInstr *MI,<br>
> > +                            const SmallVectorImpl<unsigned> &Ops) const;<br>
> > +  bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,<br>
> > +                           unsigned Reg, bool UnfoldLoad, bool<br>
> > UnfoldStore,<br>
> > +                           SmallVectorImpl<MachineInstr *> &NewMIs) const;<br>
> > +  bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,<br>
> > +                           SmallVectorImpl<SDNode *> &NewNodes) const;<br>
> > +  unsigned getOpcodeAfterMemoryUnfold(unsigned Opc,<br>
> > +                                      bool UnfoldLoad, bool UnfoldStore,<br>
> > +                                      unsigned *LoadRegIndex = 0) const;<br>
> > +  bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,<br>
> > +                               int64_t Offset1, int64_t Offset2,<br>
> > +                               unsigned NumLoads) const;<br>
> > +<br>
> > +  bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond)<br>
> > const;<br>
> > +  void insertNoop(MachineBasicBlock &MBB,<br>
> > +                  MachineBasicBlock::iterator MI) const;<br>
> > +  bool isPredicated(const MachineInstr *MI) const;<br>
> > +  bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,<br>
> > +                         const SmallVectorImpl<MachineOperand> &Pred2)<br>
> > const;<br>
> > +  bool DefinesPredicate(MachineInstr *MI,<br>
> > +                        std::vector<MachineOperand> &Pred) const;<br>
> > +  bool isPredicable(MachineInstr *MI) const;<br>
> > +  bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const;<br>
> > +<br>
> > +  // Helper functions that check the opcode for status information<br>
> > +  bool isLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isExtLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isSWSExtLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isSExtLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isZExtLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isAExtLoadInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isStoreInst(llvm::MachineInstr *MI) const;<br>
> > +  bool isTruncStoreInst(llvm::MachineInstr *MI) const;<br>
> > +<br>
> > +  virtual MachineInstr* getMovImmInstr(MachineFunction *MF, unsigned<br>
> > DstReg,<br>
> > +                                       int64_t Imm) const = 0;<br>
> > +  virtual unsigned getIEQOpcode() const = 0;<br>
> > +  virtual bool isMov(unsigned opcode) const = 0;<br>
> > +<br>
> > +  /// \brief Convert the AMDIL MachineInstr to a supported ISA<br>
> > +  /// MachineInstr<br>
> > +  virtual void convertToISA(MachineInstr & MI, MachineFunction &MF,<br>
> > +    DebugLoc DL) const;<br>
> > +<br>
> > +};<br>
> > +<br>
> > +} // End llvm namespace<br>
> > +<br>
> > +#endif // AMDGPUINSTRINFO_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUInstrInfo.td Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,74 @@<br>
> > +//===-- AMDGPUInstrInfo.td - AMDGPU DAG nodes --------------*- tablegen<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +// This file contains DAG node defintions for the AMDGPU target.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// AMDGPU DAG Profiles<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +def AMDGPUDTIntTernaryOp : SDTypeProfile<1, 3, [<br>
> > +  SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<0>, SDTCisInt<3><br>
> > +]>;<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// AMDGPU DAG Nodes<br>
> > +//<br>
> > +<br>
> > +// out = ((a << 32) | b) >> c)<br>
> > +//<br>
> > +// Can be used to optimize rtol:<br>
> > +// rotl(a, b) = bitalign(a, a, 32 - b)<br>
> > +def AMDGPUbitalign : SDNode<"AMDGPUISD::BITALIGN", AMDGPUDTIntTernaryOp>;<br>
> > +<br>
> > +// This argument to this node is a dword address.<br>
> > +def AMDGPUdwordaddr : SDNode<"AMDGPUISD::DWORDADDR", SDTIntUnaryOp>;<br>
> > +<br>
> > +// out = a - floor(a)<br>
> > +def AMDGPUfract : SDNode<"AMDGPUISD::FRACT", SDTFPUnaryOp>;<br>
> > +<br>
> > +// out = max(a, b) a and b are floats<br>
> > +def AMDGPUfmax : SDNode<"AMDGPUISD::FMAX", SDTFPBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// out = max(a, b) a and b are signed ints<br>
> > +def AMDGPUsmax : SDNode<"AMDGPUISD::SMAX", SDTIntBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// out = max(a, b) a and b are unsigned ints<br>
> > +def AMDGPUumax : SDNode<"AMDGPUISD::UMAX", SDTIntBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// out = min(a, b) a and b are floats<br>
> > +def AMDGPUfmin : SDNode<"AMDGPUISD::FMIN", SDTFPBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// out = min(a, b) a snd b are signed ints<br>
> > +def AMDGPUsmin : SDNode<"AMDGPUISD::SMIN", SDTIntBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// out = min(a, b) a and b are unsigned ints<br>
> > +def AMDGPUumin : SDNode<"AMDGPUISD::UMIN", SDTIntBinOp,<br>
> > +  [SDNPCommutative, SDNPAssociative]<br>
> > +>;<br>
> > +<br>
> > +// urecip - This operation is a helper for integer division, it returns<br>
> > the<br>
> > +// result of 1 / a as a fractional unsigned integer.<br>
> > +// out = (2^32 / a) + e<br>
> > +// e is rounding error<br>
> > +def AMDGPUurecip : SDNode<"AMDGPUISD::URECIP", SDTIntUnaryOp>;<br>
> > +<br>
> > +def fpow : SDNode<"ISD::FPOW", SDTFPBinOp>;<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUInstructions.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstructions.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUInstructions.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUInstructions.td (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUInstructions.td Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,190 @@<br>
> > +//===-- AMDGPUInstructions.td - Common instruction defs ---*- tablegen<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +// This file contains instruction defs that are common to all hw codegen<br>
> > +// targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +class AMDGPUInst <dag outs, dag ins, string asm, list<dag> pattern> :<br>
> > Instruction {<br>
> > +  field bits<16> AMDILOp = 0;<br>
> > +  field bits<3> Gen = 0;<br>
> > +<br>
> > +  let Namespace = "AMDGPU";<br>
> > +  let OutOperandList = outs;<br>
> > +  let InOperandList = ins;<br>
> > +  let AsmString = asm;<br>
> > +  let Pattern = pattern;<br>
> > +  let Itinerary = NullALU;<br>
> > +  let TSFlags{42-40} = Gen;<br>
> > +  let TSFlags{63-48} = AMDILOp;<br>
> > +}<br>
> > +<br>
> > +class AMDGPUShaderInst <dag outs, dag ins, string asm, list<dag> pattern><br>
> > +    : AMDGPUInst<outs, ins, asm, pattern> {<br>
> > +<br>
> > +  field bits<32> Inst = 0xffffffff;<br>
> > +<br>
> > +}<br>
> > +<br>
> > +def InstFlag : OperandWithDefaultOps <i32, (ops (i32 0))>;<br>
> > +<br>
> > +def COND_EQ : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETOEQ: case ISD::SETUEQ:<br>
> > +                     case ISD::SETEQ: return true;}}}]<br>
> > +>;<br>
> > +<br>
> > +def COND_NE : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETONE: case ISD::SETUNE:<br>
> > +                     case ISD::SETNE: return true;}}}]<br>
> > +>;<br>
> > +def COND_GT : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETOGT: case ISD::SETUGT:<br>
> > +                     case ISD::SETGT: return true;}}}]<br>
> > +>;<br>
> > +<br>
> > +def COND_GE : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETOGE: case ISD::SETUGE:<br>
> > +                     case ISD::SETGE: return true;}}}]<br>
> > +>;<br>
> > +<br>
> > +def COND_LT : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETOLT: case ISD::SETULT:<br>
> > +                     case ISD::SETLT: return true;}}}]<br>
> > +>;<br>
> > +<br>
> > +def COND_LE : PatLeaf <<br>
> > +  (cond),<br>
> > +  [{switch(N->get()){{default: return false;<br>
> > +                     case ISD::SETOLE: case ISD::SETULE:<br>
> > +                     case ISD::SETLE: return true;}}}]<br>
> > +>;<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// Load/Store Pattern Fragments<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +def zextloadi8_global : PatFrag<(ops node:$ptr), (zextloadi8 node:$ptr),<br>
> > [{<br>
> > +    return isGlobalLoad(dyn_cast<LoadSDNode>(N));<br>
> > +}]>;<br>
> > +<br>
> > +class Constants {<br>
> > +int TWO_PI = 0x40c90fdb;<br>
> > +int PI = 0x40490fdb;<br>
> > +int TWO_PI_INV = 0x3e22f983;<br>
> > +}<br>
> > +def CONST : Constants;<br>
> > +<br>
> > +def FP_ZERO : PatLeaf <<br>
> > +  (fpimm),<br>
> > +  [{return N->getValueAPF().isZero();}]<br>
> > +>;<br>
> > +<br>
> > +def FP_ONE : PatLeaf <<br>
> > +  (fpimm),<br>
> > +  [{return N->isExactlyValue(1.0);}]<br>
> > +>;<br>
> > +<br>
> > +let isCodeGenOnly = 1, isPseudo = 1, usesCustomInserter = 1  in {<br>
> > +<br>
> > +class CLAMP <RegisterClass rc> : AMDGPUShaderInst <<br>
> > +  (outs rc:$dst),<br>
> > +  (ins rc:$src0),<br>
> > +  "CLAMP $dst, $src0",<br>
> > +  [(set rc:$dst, (int_AMDIL_clamp rc:$src0, (f32 FP_ZERO), (f32 FP_ONE)))]<br>
> > +>;<br>
> > +<br>
> > +class FABS <RegisterClass rc> : AMDGPUShaderInst <<br>
> > +  (outs rc:$dst),<br>
> > +  (ins rc:$src0),<br>
> > +  "FABS $dst, $src0",<br>
> > +  [(set rc:$dst, (fabs rc:$src0))]<br>
> > +>;<br>
> > +<br>
> > +class FNEG <RegisterClass rc> : AMDGPUShaderInst <<br>
> > +  (outs rc:$dst),<br>
> > +  (ins rc:$src0),<br>
> > +  "FNEG $dst, $src0",<br>
> > +  [(set rc:$dst, (fneg rc:$src0))]<br>
> > +>;<br>
> > +<br>
> > +def SHADER_TYPE : AMDGPUShaderInst <<br>
> > +  (outs),<br>
> > +  (ins i32imm:$type),<br>
> > +  "SHADER_TYPE $type",<br>
> > +  [(int_AMDGPU_shader_type imm:$type)]<br>
> > +>;<br>
> > +<br>
> > +} // End isCodeGenOnly = 1, isPseudo = 1, hasCustomInserter = 1<br>
> > +<br>
> > +/* Generic helper patterns for intrinsics */<br>
> > +/* -------------------------------------- */<br>
> > +<br>
> > +class POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst<br>
> > mul,<br>
> > +                  RegisterClass rc> : Pat <<br>
> > +  (fpow rc:$src0, rc:$src1),<br>
> > +  (exp_ieee (mul rc:$src1, (log_ieee rc:$src0)))<br>
> > +>;<br>
> > +<br>
> > +/* Other helper patterns */<br>
> > +/* --------------------- */<br>
> > +<br>
> > +/* Extract element pattern */<br>
> > +class Extract_Element <ValueType sub_type, ValueType vec_type,<br>
> > +                     RegisterClass vec_class, int sub_idx,<br>
> > +                     SubRegIndex sub_reg>: Pat<<br>
> > +  (sub_type (vector_extract (vec_type vec_class:$src), sub_idx)),<br>
> > +  (EXTRACT_SUBREG vec_class:$src, sub_reg)<br>
> > +>;<br>
> > +<br>
> > +/* Insert element pattern */<br>
> > +class Insert_Element <ValueType elem_type, ValueType vec_type,<br>
> > +                      RegisterClass elem_class, RegisterClass vec_class,<br>
> > +                      int sub_idx, SubRegIndex sub_reg> : Pat <<br>
> > +<br>
> > +  (vec_type (vector_insert (vec_type vec_class:$vec),<br>
> > +                           (elem_type elem_class:$elem), sub_idx)),<br>
> > +  (INSERT_SUBREG vec_class:$vec, elem_class:$elem, sub_reg)<br>
> > +>;<br>
> > +<br>
> > +// Vector Build pattern<br>
> > +class Vector_Build <ValueType vecType, RegisterClass vectorClass,<br>
> > +                    ValueType elemType, RegisterClass elemClass> : Pat <<br>
> > +  (vecType (build_vector (elemType elemClass:$x), (elemType elemClass:$y),<br>
> > +                         (elemType elemClass:$z), (elemType<br>
> > elemClass:$w))),<br>
> > +  (INSERT_SUBREG (INSERT_SUBREG (INSERT_SUBREG (INSERT_SUBREG<br>
> > +  (vecType (IMPLICIT_DEF)), elemClass:$x, sel_x), elemClass:$y, sel_y),<br>
> > +                            elemClass:$z, sel_z), elemClass:$w, sel_w)<br>
> > +>;<br>
> > +<br>
> > +// bitconvert pattern<br>
> > +class BitConvert <ValueType dt, ValueType st, RegisterClass rc> : Pat <<br>
> > +  (dt (bitconvert (st rc:$src0))),<br>
> > +  (dt rc:$src0)<br>
> > +>;<br>
> > +<br>
> > +class DwordAddrPat<ValueType vt, RegisterClass rc> : Pat <<br>
> > +  (vt (AMDGPUdwordaddr (vt rc:$addr))),<br>
> > +  (vt rc:$addr)<br>
> > +>;<br>
> > +<br>
> > +include "R600Instructions.td"<br>
> > +<br>
> > +include "SIInstrInfo.td"<br>
> > +<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUIntrinsics.td Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,62 @@<br>
> > +//===-- AMDGPUIntrinsics.td - Common intrinsics  -*- tablegen<br>
> > -*-----------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +// This file defines intrinsics that are used by all hw codegen targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +let TargetPrefix = "AMDGPU", isTarget = 1 in {<br>
> > +<br>
> > +  def int_AMDGPU_load_const : Intrinsic<[llvm_float_ty], [llvm_i32_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_load_imm : Intrinsic<[llvm_v4f32_ty], [llvm_i32_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_reserve_reg : Intrinsic<[], [llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_store_output : Intrinsic<[], [llvm_float_ty,<br>
> > llvm_i32_ty], []>;<br>
> > +  def int_AMDGPU_swizzle : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +<br>
> > +  def int_AMDGPU_arl : Intrinsic<[llvm_i32_ty], [llvm_float_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_cndlt : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty, llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_div : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_dp4 : Intrinsic<[llvm_float_ty], [llvm_v4f32_ty,<br>
> > llvm_v4f32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_kill : Intrinsic<[], [llvm_float_ty], []>;<br>
> > +  def int_AMDGPU_kilp : Intrinsic<[], [], []>;<br>
> > +  def int_AMDGPU_lrp : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty, llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_mul : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_pow : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_rcp : Intrinsic<[llvm_float_ty], [llvm_float_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_rsq : Intrinsic<[llvm_float_ty], [llvm_float_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_seq : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_sgt : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_sge : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_sle : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_sne : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_mullit : Intrinsic<[llvm_v4f32_ty], [llvm_float_ty,<br>
> > llvm_float_ty, llvm_float_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_tex : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_txb : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_txf : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_txq : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_txd : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_v4f32_ty, llvm_v4f32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_txl : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_trunc : Intrinsic<[llvm_float_ty], [llvm_float_ty],<br>
> > [IntrNoMem]>;<br>
> > +  def int_AMDGPU_ddx : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_ddy : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,<br>
> > llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_imax : Intrinsic<[llvm_i32_ty], [llvm_i32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_imin : Intrinsic<[llvm_i32_ty], [llvm_i32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_umax : Intrinsic<[llvm_i32_ty], [llvm_i32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_umin : Intrinsic<[llvm_i32_ty], [llvm_i32_ty,<br>
> > llvm_i32_ty], [IntrNoMem]>;<br>
> > +  def int_AMDGPU_cube : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty],<br>
> > [IntrNoMem]>;<br>
> > +<br>
> > +  def int_AMDGPU_shader_type : Intrinsic<[], [llvm_i32_ty], []>;<br>
> > +}<br>
> > +<br>
> > +let TargetPrefix = "TGSI", isTarget = 1 in {<br>
> > +<br>
> > +  def int_TGSI_lit_z : Intrinsic<[llvm_float_ty], [llvm_float_ty,<br>
> > llvm_float_ty, llvm_float_ty],[IntrNoMem]>;<br>
> > +}<br>
> > +<br>
> > +include "SIIntrinsics.td"<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,77 @@<br>
> > +//===- AMDGPUMCInstLower.cpp - Lower AMDGPU MachineInstr to an MCInst<br>
> > -----===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Code to lower AMDGPU MachineInstrs to their corresponding<br>
> > MCInst.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +<br>
> > +#include "AMDGPUMCInstLower.h"<br>
> > +#include "AMDGPUAsmPrinter.h"<br>
> > +#include "R600InstrInfo.h"<br>
> > +#include "llvm/CodeGen/MachineBasicBlock.h"<br>
> > +#include "llvm/CodeGen/MachineInstr.h"<br>
> > +#include "llvm/Constants.h"<br>
> > +#include "llvm/MC/MCInst.h"<br>
> > +#include "llvm/MC/MCStreamer.h"<br>
> > +#include "llvm/Support/ErrorHandling.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +AMDGPUMCInstLower::AMDGPUMCInstLower() { }<br>
> > +<br>
> > +void AMDGPUMCInstLower::lower(const MachineInstr *MI, MCInst &OutMI)<br>
> > const {<br>
> > +  OutMI.setOpcode(MI->getOpcode());<br>
> > +<br>
> > +  for (unsigned i = 0, e = MI->getNumExplicitOperands(); i != e; ++i) {<br>
> > +    const MachineOperand &MO = MI->getOperand(i);<br>
> > +<br>
> > +    MCOperand MCOp;<br>
> > +    switch (MO.getType()) {<br>
> > +    default:<br>
> > +      llvm_unreachable("unknown operand type");<br>
> > +    case MachineOperand::MO_FPImmediate: {<br>
> > +      const APFloat &FloatValue = MO.getFPImm()->getValueAPF();<br>
> > +      assert(&FloatValue.getSemantics() == &APFloat::IEEEsingle &&<br>
> > +             "Only floating point immediates are supported at the<br>
> > moment.");<br>
> > +      MCOp = MCOperand::CreateFPImm(FloatValue.convertToFloat());<br>
> > +      break;<br>
> > +    }<br>
> > +    case MachineOperand::MO_Immediate:<br>
> > +      MCOp = MCOperand::CreateImm(MO.getImm());<br>
> > +      break;<br>
> > +    case MachineOperand::MO_Register:<br>
> > +      MCOp = MCOperand::CreateReg(MO.getReg());<br>
> > +      break;<br>
> > +    }<br>
> > +    OutMI.addOperand(MCOp);<br>
> > +  }<br>
> > +}<br>
> > +<br>
> > +void AMDGPUAsmPrinter::EmitInstruction(const MachineInstr *MI) {<br>
> > +  AMDGPUMCInstLower MCInstLowering;<br>
> > +<br>
> > +  if (MI->isBundle()) {<br>
> > +    const MachineBasicBlock *MBB = MI->getParent();<br>
> > +    MachineBasicBlock::const_instr_iterator I = MI;<br>
> > +    ++I;<br>
> > +    while (I != MBB->end() && I->isInsideBundle()) {<br>
> > +      MCInst MCBundleInst;<br>
> > +      const MachineInstr *BundledInst = I;<br>
> > +      MCInstLowering.lower(BundledInst, MCBundleInst);<br>
> > +      OutStreamer.EmitInstruction(MCBundleInst);<br>
> > +      ++I;<br>
> > +    }<br>
> > +  } else {<br>
> > +    MCInst TmpInst;<br>
> > +    MCInstLowering.lower(MI, TmpInst);<br>
> > +    OutStreamer.EmitInstruction(TmpInst);<br>
> > +  }<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUMCInstLower.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,31 @@<br>
> > +//===- AMDGPUMCInstLower.h MachineInstr Lowering Interface ------*- C++<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> > +/// \file<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPU_MCINSTLOWER_H<br>
> > +#define AMDGPU_MCINSTLOWER_H<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class MCInst;<br>
> > +class MachineInstr;<br>
> > +<br>
> > +class AMDGPUMCInstLower {<br>
> > +<br>
> > +public:<br>
> > +  AMDGPUMCInstLower();<br>
> > +<br>
> > +  /// \brief Lower a MachineInstr to an MCInst<br>
> > +  void lower(const MachineInstr *MI, MCInst &OutMI) const;<br>
> > +<br>
> > +};<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif //AMDGPU_MCINSTLOWER_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,51 @@<br>
> > +//===-- AMDGPURegisterInfo.cpp - AMDGPU Register Information<br>
> > -------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Parent TargetRegisterInfo class common to all hw codegen<br>
> > targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPURegisterInfo.h"<br>
> > +#include "AMDGPUTargetMachine.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +AMDGPURegisterInfo::AMDGPURegisterInfo(TargetMachine &tm,<br>
> > +    const TargetInstrInfo &tii)<br>
> > +: AMDGPUGenRegisterInfo(0),<br>
> > +  TM(tm),<br>
> > +  TII(tii)<br>
> > +  { }<br>
> > +<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +// Function handling callbacks - Functions are a seldom used feature of<br>
> > GPUS, so<br>
> > +// they are not supported at this time.<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +const uint16_t AMDGPURegisterInfo::CalleeSavedReg = AMDGPU::NoRegister;<br>
> > +<br>
> > +const uint16_t* AMDGPURegisterInfo::getCalleeSavedRegs(const<br>
> > MachineFunction *MF)<br>
> > +<br>
> > const {<br>
> > +  return &CalleeSavedReg;<br>
> > +}<br>
> > +<br>
> > +void AMDGPURegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator<br>
> > MI,<br>
> > +                                             int SPAdj,<br>
> > +                                             RegScavenger *RS) const {<br>
> > +  assert(!"Subroutines not supported yet");<br>
> > +}<br>
> > +<br>
> > +unsigned AMDGPURegisterInfo::getFrameRegister(const MachineFunction &MF)<br>
> > const {<br>
> > +  assert(!"Subroutines not supported yet");<br>
> > +  return 0;<br>
> > +}<br>
> > +<br>
> > +#define GET_REGINFO_TARGET_DESC<br>
> > +#include "AMDGPUGenRegisterInfo.inc"<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.h Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,63 @@<br>
> > +//===-- AMDGPURegisterInfo.h - AMDGPURegisterInfo Interface -*- C++<br>
> > -*-----===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief TargetRegisterInfo interface that is implemented by all hw<br>
> > codegen<br>
> > +/// targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPUREGISTERINFO_H<br>
> > +#define AMDGPUREGISTERINFO_H<br>
> > +<br>
> > +#include "llvm/ADT/BitVector.h"<br>
> > +#include "llvm/Target/TargetRegisterInfo.h"<br>
> > +<br>
> > +#define GET_REGINFO_HEADER<br>
> > +#define GET_REGINFO_ENUM<br>
> > +#include "AMDGPUGenRegisterInfo.inc"<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class AMDGPUTargetMachine;<br>
> > +class TargetInstrInfo;<br>
> > +<br>
> > +struct AMDGPURegisterInfo : public AMDGPUGenRegisterInfo {<br>
> > +  TargetMachine &TM;<br>
> > +  const TargetInstrInfo &TII;<br>
> > +  static const uint16_t CalleeSavedReg;<br>
> > +<br>
> > +  AMDGPURegisterInfo(TargetMachine &tm, const TargetInstrInfo &tii);<br>
> > +<br>
> > +  virtual BitVector getReservedRegs(const MachineFunction &MF) const {<br>
> > +    assert(!"Unimplemented");  return BitVector();<br>
> > +  }<br>
> > +<br>
> > +  /// \param RC is an AMDIL reg class.<br>
> > +  ///<br>
> > +  /// \returns The ISA reg class that is equivalent to \p RC.<br>
> > +  virtual const TargetRegisterClass * getISARegClass(<br>
> > +                                         const TargetRegisterClass * RC)<br>
> > const {<br>
> > +    assert(!"Unimplemented"); return NULL;<br>
> > +  }<br>
> > +<br>
> > +  virtual const TargetRegisterClass* getCFGStructurizerRegClass(MVT VT)<br>
> > const {<br>
> > +    assert(!"Unimplemented"); return NULL;<br>
> > +  }<br>
> > +<br>
> > +  const uint16_t* getCalleeSavedRegs(const MachineFunction *MF) const;<br>
> > +  void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj,<br>
> > +                           RegScavenger *RS) const;<br>
> > +  unsigned getFrameRegister(const MachineFunction &MF) const;<br>
> > +<br>
> > +};<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif // AMDIDSAREGISTERINFO_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPURegisterInfo.td Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,22 @@<br>
> > +//===-- AMDGPURegisterInfo.td - AMDGPU register info -------*- tablegen<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +// Tablegen register definitions common to all hw codegen targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +let Namespace = "AMDGPU" in {<br>
> > +  def sel_x : SubRegIndex;<br>
> > +  def sel_y : SubRegIndex;<br>
> > +  def sel_z : SubRegIndex;<br>
> > +  def sel_w : SubRegIndex;<br>
> > +}<br>
> > +<br>
> > +include "R600RegisterInfo.td"<br>
> > +include "SIRegisterInfo.td"<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUSubtarget.cpp Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,87 @@<br>
> > +//===-- AMDGPUSubtarget.cpp - AMDGPU Subtarget Information<br>
> > ----------------===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief Implements the AMDGPU specific subclass of TargetSubtarget.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPUSubtarget.h"<br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +#define GET_SUBTARGETINFO_ENUM<br>
> > +#define GET_SUBTARGETINFO_TARGET_DESC<br>
> > +#define GET_SUBTARGETINFO_CTOR<br>
> > +#include "AMDGPUGenSubtargetInfo.inc"<br>
> > +<br>
> > +AMDGPUSubtarget::AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef<br>
> > FS) :<br>
> > +  AMDGPUGenSubtargetInfo(TT, CPU, FS), DumpCode(false) {<br>
> > +    InstrItins = getInstrItineraryForCPU(CPU);<br>
> > +<br>
> > +  memset(CapsOverride, 0, sizeof(*CapsOverride)<br>
> > +      * AMDGPUDeviceInfo::MaxNumberCapabilities);<br>
> > +  // Default card<br>
> > +  StringRef GPU = CPU;<br>
> > +  Is64bit = false;<br>
> > +  DefaultSize[0] = 64;<br>
> > +  DefaultSize[1] = 1;<br>
> > +  DefaultSize[2] = 1;<br>
> > +  ParseSubtargetFeatures(GPU, FS);<br>
> > +  DevName = GPU;<br>
> > +  Device = AMDGPUDeviceInfo::getDeviceFromName(DevName, this, Is64bit);<br>
> > +}<br>
> > +<br>
> > +AMDGPUSubtarget::~AMDGPUSubtarget() {<br>
> > +  delete Device;<br>
> > +}<br>
> > +<br>
> > +bool<br>
> > +AMDGPUSubtarget::isOverride(AMDGPUDeviceInfo::Caps caps) const {<br>
> > +  assert(caps < AMDGPUDeviceInfo::MaxNumberCapabilities &&<br>
> > +      "Caps index is out of bounds!");<br>
> > +  return CapsOverride[caps];<br>
> > +}<br>
> > +bool<br>
> > +AMDGPUSubtarget::is64bit() const  {<br>
> > +  return Is64bit;<br>
> > +}<br>
> > +bool<br>
> > +AMDGPUSubtarget::isTargetELF() const {<br>
> > +  return false;<br>
> > +}<br>
> > +size_t<br>
> > +AMDGPUSubtarget::getDefaultSize(uint32_t dim) const {<br>
> > +  if (dim > 3) {<br>
> > +    return 1;<br>
> > +  } else {<br>
> > +    return DefaultSize[dim];<br>
> > +  }<br>
> > +}<br>
> > +<br>
> > +std::string<br>
> > +AMDGPUSubtarget::getDataLayout() const {<br>
> > +    if (!Device) {<br>
> > +        return std::string("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16"<br>
> > +                "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:32:32"<br>
> > +                "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64"<br>
> > +                "-v96:128:128-v128:128:128-v192:256:256-v256:256:256"<br>
> > +                "-v512:512:512-v1024:1024:1024-v2048:2048:2048-a0:0:64");<br>
> > +    }<br>
> > +    return Device->getDataLayout();<br>
> > +}<br>
> > +<br>
> > +std::string<br>
> > +AMDGPUSubtarget::getDeviceName() const {<br>
> > +  return DevName;<br>
> > +}<br>
> > +const AMDGPUDevice *<br>
> > +AMDGPUSubtarget::device() const {<br>
> > +  return Device;<br>
> > +}<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUSubtarget.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,65 @@<br>
> > +//=====-- AMDGPUSubtarget.h - Define Subtarget for the AMDIL ---*- C++<br>
> > -*-====//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//==-----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief AMDGPU specific subclass of TargetSubtarget.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPUSUBTARGET_H<br>
> > +#define AMDGPUSUBTARGET_H<br>
> > +#include "AMDILDevice.h"<br>
> > +#include "llvm/ADT/StringExtras.h"<br>
> > +#include "llvm/ADT/StringRef.h"<br>
> > +#include "llvm/Target/TargetSubtargetInfo.h"<br>
> > +<br>
> > +#define GET_SUBTARGETINFO_HEADER<br>
> > +#include "AMDGPUGenSubtargetInfo.inc"<br>
> > +<br>
> > +#define MAX_CB_SIZE (1 << 16)<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +class AMDGPUSubtarget : public AMDGPUGenSubtargetInfo {<br>
> > +private:<br>
> > +  bool CapsOverride[AMDGPUDeviceInfo::MaxNumberCapabilities];<br>
> > +  const AMDGPUDevice *Device;<br>
> > +  size_t DefaultSize[3];<br>
> > +  std::string DevName;<br>
> > +  bool Is64bit;<br>
> > +  bool Is32on64bit;<br>
> > +  bool DumpCode;<br>
> > +  bool R600ALUInst;<br>
> > +<br>
> > +  InstrItineraryData InstrItins;<br>
> > +<br>
> > +public:<br>
> > +  AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef FS);<br>
> > +  virtual ~AMDGPUSubtarget();<br>
> > +<br>
> > +  const InstrItineraryData &getInstrItineraryData() const { return<br>
> > InstrItins; }<br>
> > +  virtual void ParseSubtargetFeatures(llvm::StringRef CPU,<br>
> > llvm::StringRef FS);<br>
> > +<br>
> > +  bool isOverride(AMDGPUDeviceInfo::Caps) const;<br>
> > +  bool is64bit() const;<br>
> > +<br>
> > +  // Helper functions to simplify if statements<br>
> > +  bool isTargetELF() const;<br>
> > +  const AMDGPUDevice* device() const;<br>
> > +  std::string getDataLayout() const;<br>
> > +  std::string getDeviceName() const;<br>
> > +  virtual size_t getDefaultSize(uint32_t dim) const;<br>
> > +  bool dumpCode() const { return DumpCode; }<br>
> > +  bool r600ALUEncoding() const { return R600ALUInst; }<br>
> > +<br>
> > +};<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif // AMDGPUSUBTARGET_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.cpp Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,141 @@<br>
> > +//===-- AMDGPUTargetMachine.cpp - TargetMachine for hw codegen<br>
> > targets-----===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief The AMDGPU target machine contains all of the hardware specific<br>
> > +/// information  needed to emit code for R600 and SI GPUs.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#include "AMDGPUTargetMachine.h"<br>
> > +#include "AMDGPU.h"<br>
> > +#include "R600ISelLowering.h"<br>
> > +#include "R600InstrInfo.h"<br>
> > +#include "SIISelLowering.h"<br>
> > +#include "SIInstrInfo.h"<br>
> > +#include "llvm/Analysis/Passes.h"<br>
> > +#include "llvm/Analysis/Verifier.h"<br>
> > +#include "llvm/CodeGen/MachineFunctionAnalysis.h"<br>
> > +#include "llvm/CodeGen/MachineModuleInfo.h"<br>
> > +#include "llvm/CodeGen/Passes.h"<br>
> > +#include "llvm/MC/MCAsmInfo.h"<br>
> > +#include "llvm/PassManager.h"<br>
> > +#include "llvm/Support/TargetRegistry.h"<br>
> > +#include "llvm/Support/raw_os_ostream.h"<br>
> > +#include "llvm/Transforms/IPO.h"<br>
> > +#include "llvm/Transforms/Scalar.h"<br>
> > +#include <llvm/CodeGen/Passes.h><br>
> > +<br>
> > +using namespace llvm;<br>
> > +<br>
> > +extern "C" void LLVMInitializeR600Target() {<br>
> > +  // Register the target<br>
> > +  RegisterTargetMachine<AMDGPUTargetMachine> X(TheAMDGPUTarget);<br>
> > +}<br>
> > +<br>
> > +AMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, StringRef TT,<br>
> > +    StringRef CPU, StringRef FS,<br>
> > +  TargetOptions Options,<br>
> > +  Reloc::Model RM, CodeModel::Model CM,<br>
> > +  CodeGenOpt::Level OptLevel<br>
> > +)<br>
> > +:<br>
> > +  LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OptLevel),<br>
> > +  Subtarget(TT, CPU, FS),<br>
> > +  Layout(Subtarget.getDataLayout()),<br>
> > +  FrameLowering(TargetFrameLowering::StackGrowsUp,<br>
> > +      Subtarget.device()->getStackAlignment(), 0),<br>
> > +  IntrinsicInfo(this),<br>
> > +  InstrItins(&Subtarget.getInstrItineraryData()) {<br>
> > +  // TLInfo uses InstrInfo so it must be initialized after.<br>
> > +  if (Subtarget.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX) {<br>
> > +    InstrInfo = new R600InstrInfo(*this);<br>
> > +    TLInfo = new R600TargetLowering(*this);<br>
> > +  } else {<br>
> > +    InstrInfo = new SIInstrInfo(*this);<br>
> > +    TLInfo = new SITargetLowering(*this);<br>
> > +  }<br>
> > +}<br>
> > +<br>
> > +AMDGPUTargetMachine::~AMDGPUTargetMachine() {<br>
> > +}<br>
> > +<br>
> > +namespace {<br>
> > +class AMDGPUPassConfig : public TargetPassConfig {<br>
> > +public:<br>
> > +  AMDGPUPassConfig(AMDGPUTargetMachine *TM, PassManagerBase &PM)<br>
> > +    : TargetPassConfig(TM, PM) {}<br>
> > +<br>
> > +  AMDGPUTargetMachine &getAMDGPUTargetMachine() const {<br>
> > +    return getTM<AMDGPUTargetMachine>();<br>
> > +  }<br>
> > +<br>
> > +  virtual bool addPreISel();<br>
> > +  virtual bool addInstSelector();<br>
> > +  virtual bool addPreRegAlloc();<br>
> > +  virtual bool addPostRegAlloc();<br>
> > +  virtual bool addPreSched2();<br>
> > +  virtual bool addPreEmitPass();<br>
> > +};<br>
> > +} // End of anonymous namespace<br>
> > +<br>
> > +TargetPassConfig *AMDGPUTargetMachine::createPassConfig(PassManagerBase<br>
> > &PM) {<br>
> > +  return new AMDGPUPassConfig(this, PM);<br>
> > +}<br>
> > +<br>
> > +bool<br>
> > +AMDGPUPassConfig::addPreISel() {<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUPassConfig::addInstSelector() {<br>
> > +  addPass(createAMDGPUPeepholeOpt(*TM));<br>
> > +  addPass(createAMDGPUISelDag(getAMDGPUTargetMachine()));<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUPassConfig::addPreRegAlloc() {<br>
> > +  const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();<br>
> > +<br>
> > +  if (ST.device()->getGeneration() > AMDGPUDeviceInfo::HD6XXX) {<br>
> > +    addPass(createSIAssignInterpRegsPass(*TM));<br>
> > +  }<br>
> > +  addPass(createAMDGPUConvertToISAPass(*TM));<br>
> > +  if (ST.device()->getGeneration() > AMDGPUDeviceInfo::HD6XXX) {<br>
> > +    addPass(createSIFixSGPRLivenessPass(*TM));<br>
> > +  }<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUPassConfig::addPostRegAlloc() {<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUPassConfig::addPreSched2() {<br>
> > +<br>
> > +  addPass(&IfConverterID);<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> > +bool AMDGPUPassConfig::addPreEmitPass() {<br>
> > +  addPass(createAMDGPUCFGPreparationPass(*TM));<br>
> > +  addPass(createAMDGPUCFGStructurizerPass(*TM));<br>
> > +<br>
> > +  const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();<br>
> > +  if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX) {<br>
> > +    addPass(createR600ExpandSpecialInstrsPass(*TM));<br>
> > +    addPass(&FinalizeMachineBundlesID);<br>
> > +  } else {<br>
> > +    addPass(createSILowerLiteralConstantsPass(*TM));<br>
> > +    addPass(createSILowerControlFlowPass(*TM));<br>
> > +  }<br>
> > +<br>
> > +  return false;<br>
> > +}<br>
> > +<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDGPUTargetMachine.h Tue Dec 11 15:25:42<br>
> > 2012<br>
> > @@ -0,0 +1,70 @@<br>
> > +//===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This file is distributed under the University of Illinois Open Source<br>
> > +// License. See LICENSE.TXT for details.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +//<br>
> > +/// \file<br>
> > +/// \brief The AMDGPU TargetMachine interface definition for hw codgen<br>
> > targets.<br>
> > +//<br>
> ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > +<br>
> > +#ifndef AMDGPU_TARGET_MACHINE_H<br>
> > +#define AMDGPU_TARGET_MACHINE_H<br>
> > +<br>
> > +#include "AMDGPUInstrInfo.h"<br>
> > +#include "AMDGPUSubtarget.h"<br>
> > +#include "AMDILFrameLowering.h"<br>
> > +#include "AMDILIntrinsicInfo.h"<br>
> > +#include "R600ISelLowering.h"<br>
> > +#include "llvm/ADT/OwningPtr.h"<br>
> > +#include "llvm/DataLayout.h"<br>
> > +<br>
> > +namespace llvm {<br>
> > +<br>
> > +MCAsmInfo* createMCAsmInfo(const Target &T, StringRef TT);<br>
> > +<br>
> > +class AMDGPUTargetMachine : public LLVMTargetMachine {<br>
> > +<br>
> > +  AMDGPUSubtarget Subtarget;<br>
> > +  const DataLayout Layout;<br>
> > +  AMDGPUFrameLowering FrameLowering;<br>
> > +  AMDGPUIntrinsicInfo IntrinsicInfo;<br>
> > +  const AMDGPUInstrInfo * InstrInfo;<br>
> > +  AMDGPUTargetLowering * TLInfo;<br>
> > +  const InstrItineraryData* InstrItins;<br>
> > +<br>
> > +public:<br>
> > +   AMDGPUTargetMachine(const Target &T, StringRef TT, StringRef FS,<br>
> > +                       StringRef CPU,<br>
> > +                       TargetOptions Options,<br>
> > +                       Reloc::Model RM, CodeModel::Model CM,<br>
> > +                       CodeGenOpt::Level OL);<br>
> > +   ~AMDGPUTargetMachine();<br>
> > +   virtual const AMDGPUFrameLowering* getFrameLowering() const {<br>
> > +     return &FrameLowering;<br>
> > +   }<br>
> > +   virtual const AMDGPUIntrinsicInfo* getIntrinsicInfo() const {<br>
> > +     return &IntrinsicInfo;<br>
> > +   }<br>
> > +   virtual const AMDGPUInstrInfo *getInstrInfo() const {return InstrInfo;}<br>
> > +   virtual const AMDGPUSubtarget *getSubtargetImpl() const {return<br>
> > &Subtarget; }<br>
> > +   virtual const AMDGPURegisterInfo *getRegisterInfo() const {<br>
> > +      return &InstrInfo->getRegisterInfo();<br>
> > +   }<br>
> > +   virtual AMDGPUTargetLowering * getTargetLowering() const {<br>
> > +      return TLInfo;<br>
> > +   }<br>
> > +   virtual const InstrItineraryData* getInstrItineraryData() const {<br>
> > +      return InstrItins;<br>
> > +   }<br>
> > +   virtual const DataLayout* getDataLayout() const { return &Layout; }<br>
> > +   virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);<br>
> > +};<br>
> > +<br>
> > +} // End namespace llvm<br>
> > +<br>
> > +#endif // AMDGPU_TARGET_MACHINE_H<br>
> ><br>
> > Added: llvm/trunk/lib/Target/R600/AMDIL.h<br>
> > URL:<br>
> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDIL.h?rev=169915&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/AMDIL.h?rev=169915&view=auto</a><br>

> ><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/Target/R600/AMDIL.h (added)<br>
> > +++ llvm/trunk/lib/Target/R600/AMDIL.h Tue Dec 11 15:25:42 2012<br>
> > @@ -0,0 +1,106 @@<br>
> > +//===-- AMDIL.h - Top-level interface for AMDIL representation --*- C++<br>
> > -*-===//<br>
> > +//<br>
> > +//                     The LLVM Compiler Infrastructure<br>
> > +//<br>
> > +// This ...<br>
> ><br>
> > [Message clipped]<br>
<br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
</blockquote></div><br></div>