R600/SI: Add double precision fsub pattern for SI
Patch by: Niels Ole Salscheider Reviewed-by: Tom Stellard <thomas.stellard@amd.com> llvm-svn: 186179
This commit is contained in:
		
							parent
							
								
									ab8a8c84d4
								
							
						
					
					
						commit
						2a6a610516
					
				| 
						 | 
				
			
			@ -296,6 +296,21 @@ MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter(
 | 
			
		|||
    MI->eraseFromParent();
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case AMDGPU::V_SUB_F64: {
 | 
			
		||||
    const SIInstrInfo *TII =
 | 
			
		||||
      static_cast<const SIInstrInfo*>(getTargetMachine().getInstrInfo());
 | 
			
		||||
    BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::V_ADD_F64),
 | 
			
		||||
            MI->getOperand(0).getReg())
 | 
			
		||||
            .addReg(MI->getOperand(1).getReg())
 | 
			
		||||
            .addReg(MI->getOperand(2).getReg())
 | 
			
		||||
            .addImm(0)  /* src2 */
 | 
			
		||||
            .addImm(0)  /* ABS */
 | 
			
		||||
            .addImm(0)  /* CLAMP */
 | 
			
		||||
            .addImm(0)  /* OMOD */
 | 
			
		||||
            .addImm(2); /* NEG */
 | 
			
		||||
    MI->eraseFromParent();
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
  return BB;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1232,17 +1232,23 @@ def SI_INDIRECT_DST_V16 : SI_INDIRECT_DST<VReg_512>;
 | 
			
		|||
 | 
			
		||||
} // Uses = [EXEC,VCC,M0], Defs = [EXEC,VCC,M0]
 | 
			
		||||
 | 
			
		||||
// This psuedo instruction takes a pointer as input and outputs a resource
 | 
			
		||||
// constant that can be used with the ADDR64 MUBUF instructions.
 | 
			
		||||
 | 
			
		||||
let usesCustomInserter = 1 in {
 | 
			
		||||
 | 
			
		||||
// This psuedo instruction takes a pointer as input and outputs a resource
 | 
			
		||||
// constant that can be used with the ADDR64 MUBUF instructions.
 | 
			
		||||
def SI_ADDR64_RSRC : InstSI <
 | 
			
		||||
  (outs SReg_128:$srsrc),
 | 
			
		||||
  (ins SReg_64:$ptr),
 | 
			
		||||
  "", []
 | 
			
		||||
>;
 | 
			
		||||
 | 
			
		||||
def V_SUB_F64 : InstSI <
 | 
			
		||||
  (outs VReg_64:$dst),
 | 
			
		||||
  (ins VReg_64:$src0, VReg_64:$src1),
 | 
			
		||||
  "V_SUB_F64 $dst, $src0, $src1",
 | 
			
		||||
  []
 | 
			
		||||
>;
 | 
			
		||||
 | 
			
		||||
} // end usesCustomInserter
 | 
			
		||||
 | 
			
		||||
} // end IsCodeGenOnly, isPseudo
 | 
			
		||||
| 
						 | 
				
			
			@ -1271,6 +1277,11 @@ def : Pat <
 | 
			
		|||
       $src0, $src1, $src2, $src3)
 | 
			
		||||
>;
 | 
			
		||||
 | 
			
		||||
def : Pat <
 | 
			
		||||
  (f64 (fsub f64:$src0, f64:$src1)),
 | 
			
		||||
  (V_SUB_F64 $src0, $src1)
 | 
			
		||||
>;
 | 
			
		||||
 | 
			
		||||
/********** ======================= **********/
 | 
			
		||||
/********** Image sampling patterns **********/
 | 
			
		||||
/********** ======================= **********/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
; RUN: llc < %s -march=r600 -mcpu=tahiti | FileCheck %s
 | 
			
		||||
 | 
			
		||||
; CHECK: @fsub_f64
 | 
			
		||||
; CHECK: V_ADD_F64 {{VGPR[0-9]+_VGPR[0-9]+, VGPR[0-9]+_VGPR[0-9]+, VGPR[0-9]+_VGPR[0-9]+}}, 0, 0, 0, 0, 2
 | 
			
		||||
 | 
			
		||||
define void @fsub_f64(double addrspace(1)* %out, double addrspace(1)* %in1,
 | 
			
		||||
                      double addrspace(1)* %in2) {
 | 
			
		||||
   %r0 = load double addrspace(1)* %in1
 | 
			
		||||
   %r1 = load double addrspace(1)* %in2
 | 
			
		||||
   %r2 = fsub double %r0, %r1
 | 
			
		||||
   store double %r2, double addrspace(1)* %out
 | 
			
		||||
   ret void
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue