[Mesa-dev] [PATCH 1/6] radeon/llvm: interp instructions emits native outputs

Tom Stellard tom at stellard.net
Mon Oct 22 08:07:46 PDT 2012


On Mon, Oct 22, 2012 at 12:03:35AM +0200, Vincent Lejeune wrote:
> ---
>  lib/Target/AMDGPU/R600ExpandSpecialInstrs.cpp | 30 +++++++++++----------------
>  lib/Target/AMDGPU/R600Instructions.td         | 25 +++++-----------------
>  lib/Target/AMDGPU/R600RegisterInfo.td         | 10 +++++++++
>  3 files changed, 27 insertions(+), 38 deletions(-)
> 

I've pushed this entire series to my llvm repo.

Thanks!

-Tom

> diff --git a/lib/Target/AMDGPU/R600ExpandSpecialInstrs.cpp b/lib/Target/AMDGPU/R600ExpandSpecialInstrs.cpp
> index fabdb4d..f9fd65d 100644
> --- a/lib/Target/AMDGPU/R600ExpandSpecialInstrs.cpp
> +++ b/lib/Target/AMDGPU/R600ExpandSpecialInstrs.cpp
> @@ -95,8 +95,9 @@ bool R600ExpandSpecialInstrsPass::ExpandInputPerspective(MachineInstr &MI)
>    for (unsigned i = 0; i < 8; i++) {
>      unsigned IJIndex = AMDGPU::R600_TReg32RegClass.getRegister(
>          2 * IJIndexBase + ((i + 1) % 2));
> -    unsigned ReadReg = AMDGPU::R600_TReg32RegClass.getRegister(
> -        4 * MI.getOperand(2).getImm());
> +    unsigned ReadReg = AMDGPU::R600_ArrayBaseRegClass.getRegister(
> +        MI.getOperand(2).getImm());
> +
>  
>      unsigned Sel;
>      switch (i % 4) {
> @@ -109,16 +110,11 @@ bool R600ExpandSpecialInstrsPass::ExpandInputPerspective(MachineInstr &MI)
>  
>      unsigned Res = TRI.getSubReg(DstReg, Sel);
>  
> -    const MCInstrDesc &Opcode = (i < 4)?
> -        TII->get(AMDGPU::INTERP_ZW):
> -        TII->get(AMDGPU::INTERP_XY);
> +    unsigned Opcode = (i < 4)?AMDGPU::INTERP_ZW:AMDGPU::INTERP_XY;
>  
> -    MachineInstr *NewMI = BuildMI(*(MI.getParent()),
> -        I, MI.getParent()->findDebugLoc(I),
> -        Opcode, Res)
> -        .addReg(IJIndex)
> -        .addReg(ReadReg)
> -        .addImm(0);
> +    MachineBasicBlock &MBB = *(MI.getParent());
> +    MachineInstr *NewMI =
> +        TII->buildDefaultInstruction(MBB, I, Opcode, Res, IJIndex, ReadReg);
>  
>      if (!(i> 1 && i < 6)) {
>        TII->addFlag(NewMI, 0, MO_FLAG_MASK);
> @@ -143,8 +139,8 @@ bool R600ExpandSpecialInstrsPass::ExpandInputConstant(MachineInstr &MI)
>    unsigned DstReg = MI.getOperand(0).getReg();
>  
>    for (unsigned i = 0; i < 4; i++) {
> -    unsigned ReadReg = AMDGPU::R600_TReg32RegClass.getRegister(
> -        4 * MI.getOperand(1).getImm() + i);
> +    unsigned ReadReg = AMDGPU::R600_ArrayBaseRegClass.getRegister(
> +        MI.getOperand(1).getImm());
>  
>      unsigned Sel;
>      switch (i % 4) {
> @@ -157,11 +153,9 @@ bool R600ExpandSpecialInstrsPass::ExpandInputConstant(MachineInstr &MI)
>  
>      unsigned Res = TRI.getSubReg(DstReg, Sel);
>  
> -    MachineInstr *NewMI = BuildMI(*(MI.getParent()),
> -        I, MI.getParent()->findDebugLoc(I),
> -        TII->get(AMDGPU::INTERP_LOAD_P0), Res)
> -        .addReg(ReadReg)
> -        .addImm(0);
> +    MachineBasicBlock &MBB = *(MI.getParent());
> +    MachineInstr *NewMI = TII->buildDefaultInstruction(
> +        MBB, I, AMDGPU::INTERP_LOAD_P0, Res, ReadReg);
>  
>      if (i % 4 !=  3)
>        TII->addFlag(NewMI, 0, MO_FLAG_NOT_LAST);
> diff --git a/lib/Target/AMDGPU/R600Instructions.td b/lib/Target/AMDGPU/R600Instructions.td
> index 7cc74e8..b97b094 100644
> --- a/lib/Target/AMDGPU/R600Instructions.td
> +++ b/lib/Target/AMDGPU/R600Instructions.td
> @@ -444,32 +444,17 @@ def input_constant :  AMDGPUShaderInst <
>  
>  
>  
> -def INTERP_XY : InstR600 <0xD6,
> -  (outs R600_Reg32:$dst),
> -  (ins R600_Reg32:$src0, R600_Reg32:$src1, i32imm:$flags),
> -  "INTERP_XY dst",
> -  [], AnyALU>
> +def INTERP_XY : R600_2OP <0xD6, "INTERP_XY", []>
>  {
> -  let FlagOperandIdx = 3;
> +  let bank_swizzle = 5;
>  }
>  
> -def INTERP_ZW : InstR600 <0xD7,
> -  (outs R600_Reg32:$dst),
> -  (ins R600_Reg32:$src0, R600_Reg32:$src1, i32imm:$flags),
> -  "INTERP_ZW dst",
> -  [], AnyALU>
> +def INTERP_ZW : R600_2OP <0xD7, "INTERP_ZW", []>
>  {
> -  let FlagOperandIdx = 3;
> +  let bank_swizzle = 5;
>  }
>  
> -def INTERP_LOAD_P0 : InstR600 <0xE0,
> -  (outs R600_Reg32:$dst),
> -  (ins R600_Reg32:$src, i32imm:$flags),
> -  "INTERP_LOAD_P0 dst",
> -  [], AnyALU>
> -{
> -  let FlagOperandIdx = 2;
> -}
> +def INTERP_LOAD_P0 : R600_1OP <0xE0, "INTERP_LOAD_P0", []>;
>  
>  let Predicates = [isR600toCayman] in { 
>  
> diff --git a/lib/Target/AMDGPU/R600RegisterInfo.td b/lib/Target/AMDGPU/R600RegisterInfo.td
> index c682f2b..d3d6d25 100644
> --- a/lib/Target/AMDGPU/R600RegisterInfo.td
> +++ b/lib/Target/AMDGPU/R600RegisterInfo.td
> @@ -41,6 +41,12 @@ foreach Index = 0-127 in {
>                                     Index>;
>  }
>  
> +// Array Base Register holding input in FS
> +foreach Index = 448-464 in {
> +  def ArrayBase#Index :  R600Reg<"ARRAY_BASE", Index>;
> +}
> +
> +
>  // Special Registers
>  
>  def ZERO : R600Reg<"0.0", 248>;
> @@ -56,6 +62,9 @@ def PRED_SEL_OFF: R600Reg<"Pred_sel_off", 0>;
>  def PRED_SEL_ZERO : R600Reg<"Pred_sel_zero", 2>;
>  def PRED_SEL_ONE : R600Reg<"Pred_sel_one", 3>;
>  
> +def R600_ArrayBase : RegisterClass <"AMDGPU", [f32, i32], 32,
> +                          (add (sequence "ArrayBase%u", 448, 464))>;
> +
>  def R600_CReg32 : RegisterClass <"AMDGPU", [f32, i32], 32,
>                            (add (interleave
>                                    (interleave (sequence "C%u_X", 0, 127),
> @@ -83,6 +92,7 @@ def R600_TReg32 : RegisterClass <"AMDGPU", [f32, i32], 32,
>  def R600_Reg32 : RegisterClass <"AMDGPU", [f32, i32], 32, (add
>      R600_TReg32,
>      R600_CReg32,
> +    R600_ArrayBase,
>      ZERO, HALF, ONE, ONE_INT, PV_X, ALU_LITERAL_X, NEG_ONE, NEG_HALF)>;
>  
>  def R600_Predicate : RegisterClass <"AMDGPU", [i32], 32, (add
> -- 
> 1.7.11.7
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list