radeon/llvm: Add custom SDNode for FRACT
authorTom Stellard <thomas.stellard@amd.com>
Wed, 23 May 2012 17:19:36 +0000 (13:19 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Thu, 24 May 2012 18:12:30 +0000 (14:12 -0400)
src/gallium/drivers/radeon/AMDGPUGenInstrEnums.pl
src/gallium/drivers/radeon/AMDGPUISelLowering.cpp
src/gallium/drivers/radeon/AMDGPUISelLowering.h
src/gallium/drivers/radeon/AMDGPUInstrInfo.td
src/gallium/drivers/radeon/AMDILInstructions.td
src/gallium/drivers/radeon/R600Instructions.td

index 2b83273cc87fc540aa78b464cf9a6b5331807113..d346f8ca5714379a3849cd55cb8dfd5f00b72aec 100644 (file)
@@ -32,7 +32,6 @@ use warnings;
 use strict;
 
 my @F32_MULTICLASSES = qw {
-  UnaryIntrinsicFloat
   UnaryIntrinsicFloatScalar
 };
 
@@ -55,7 +54,7 @@ my $FILE_TYPE = $ARGV[0];
 
 open AMDIL, '<', 'AMDILInstructions.td';
 
-my @INST_ENUMS = ('NONE', 'FEQ', 'FGE', 'FLT', 'FNE', 'MOVE_f32', 'MOVE_i32', 'FTOI', 'ITOF', 'UGT', 'IGE', 'INE', 'UGE', 'IEQ', 'BINARY_OR_i32', 'BINARY_NOT_i32');
+my @INST_ENUMS = ('NONE', 'FEQ', 'FGE', 'FLT', 'FNE', 'MOVE_f32', 'MOVE_i32', 'FTOI', 'ITOF', 'UGT', 'IGE', 'INE', 'UGE', 'IEQ', 'BINARY_OR_i32', 'BINARY_NOT_i32', 'ROUND_POSINF_f32', 'ROUND_NEAREST_f32');
 
 while (<AMDIL>) {
   if ($_ =~ /defm\s+([A-Z_]+)\s+:\s+([A-Za-z0-9]+)</) {
index e90d71a5c27db82dd98233790074ff22df5e8a68..ced949ed3d553b0e71cfd6ef089f88d99aedbf1d 100644 (file)
@@ -51,6 +51,8 @@ SDValue AMDGPUTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
       return LowerIntrinsicIABS(Op, DAG);
     case AMDGPUIntrinsic::AMDGPU_lrp:
       return LowerIntrinsicLRP(Op, DAG);
+    case AMDGPUIntrinsic::AMDIL_fraction:
+      return DAG.getNode(AMDGPUISD::FRACT, DL, VT, Op.getOperand(1));
     case AMDGPUIntrinsic::AMDIL_mad:
       return DAG.getNode(AMDILISD::MAD, DL, VT, Op.getOperand(1),
                               Op.getOperand(2), Op.getOperand(3));
@@ -252,6 +254,7 @@ const char* AMDGPUTargetLowering::getTargetNodeName(unsigned Opcode) const
   switch (Opcode) {
   default: return AMDILTargetLowering::getTargetNodeName(Opcode);
 
+  NODE_NAME_CASE(FRACT)
   NODE_NAME_CASE(FMAX)
   NODE_NAME_CASE(SMAX)
   NODE_NAME_CASE(UMAX)
index f1544b86920756e8c0ae46764068fbd415f9a8dc..81bc608cebfe1f9e8f8a0b7856970dcfe760847f 100644 (file)
@@ -56,6 +56,7 @@ namespace AMDGPUISD
 enum
 {
   AMDGPU_FIRST = AMDILISD::LAST_NON_MEMORY_OPCODE,
+  FRACT,
   FMAX,
   SMAX,
   UMAX,
index b6e0807453dadfbf521bd8daa85049ccf118daa9..f511d3b9b57d72439faf6318571c36ee0fcc0b6a 100644 (file)
@@ -15,6 +15,9 @@
 // AMDGPU DAG Nodes
 //
 
+// out = a - floor(a)
+def AMDGPUfract : SDNode<"AMDGPUISD::FRACT", SDTFPUnaryOp>;
+
 // out = max(a, b) a and b are floats
 def AMDGPUfmax : SDNode<"AMDGPUISD::FMAX", SDTFPBinOp,
   [SDNPCommutative, SDNPAssociative]
index 8f22d6672fb1b0f25df53a3b7bd16669a4c2457f..f7bf31f6c60c2357c3395f17af21fe3eda1238c7 100644 (file)
@@ -214,7 +214,6 @@ def LUSHR        : TwoInOneOut<IL_OP_U64_SHR, (outs GPRI64:$dst),
 //===---------------------------------------------------------------------===//
 let mayLoad=0, mayStore=0 in {
 defm ABS : UnaryIntrinsicFloat<IL_OP_ABS, int_AMDIL_fabs>;
-defm FRAC : UnaryIntrinsicFloat<IL_OP_FRC, int_AMDIL_fraction>;
 defm PIREDUCE : UnaryIntrinsicFloat<IL_OP_PI_REDUCE, int_AMDIL_pireduce>;
 defm ROUND_NEAREST : UnaryIntrinsicFloat<IL_OP_ROUND_NEAR,
           int_AMDIL_round_nearest>;
index 978ccecd3398fec54c889d708d41686f5deb1713..670598fc31d000463b2269e4467af6752fcaa34d 100644 (file)
@@ -358,9 +358,8 @@ def SNE : R600_2OP <
 
 def FRACT : R600_1OP <
   0x10, "FRACT",
-  []> {
-  let AMDILOp = AMDILInst.FRAC_f32;
-}
+  [(set R600_Reg32:$dst, (AMDGPUfract R600_Reg32:$src))]
+>;
 
 def TRUNC : R600_1OP <
   0x11, "TRUNC",