summaryrefslogtreecommitdiff
path: root/lib/Target/R600/AMDGPUInstructions.td
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2014-06-24 22:13:39 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2014-06-24 22:13:39 +0000
commit95eb45c5d94bfe9360ffc021697a50c6cf8c08cd (patch)
treeccff569afcf67b58b968ce88f204ad9641431949 /lib/Target/R600/AMDGPUInstructions.td
parent0029534141ee83d827267d4ac9418bbed5704c2e (diff)
downloadllvm-95eb45c5d94bfe9360ffc021697a50c6cf8c08cd.tar.gz
llvm-95eb45c5d94bfe9360ffc021697a50c6cf8c08cd.tar.bz2
llvm-95eb45c5d94bfe9360ffc021697a50c6cf8c08cd.tar.xz
R600: Fix inconsistency in rsq instructions.
R600 was using a clamped version of rsq, but SI was not. Add a new rsq_clamped intrinsic and use them consistently. It's unclear to me from the documentation what behavior the R600 instructions have, so I assume they have the legacy behavior described by the SI documents. For R600, use RECIPSQRT_IEEE for both llvm.AMDGPU.rsq.legacy and llvm.AMDGPU.rsq. R600 also has RECIPSQRT_FF, which I'm not sure how it fits in here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211637 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/R600/AMDGPUInstructions.td')
-rw-r--r--lib/Target/R600/AMDGPUInstructions.td15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/Target/R600/AMDGPUInstructions.td b/lib/Target/R600/AMDGPUInstructions.td
index 14bfd8cc18..b86b7818fc 100644
--- a/lib/Target/R600/AMDGPUInstructions.td
+++ b/lib/Target/R600/AMDGPUInstructions.td
@@ -524,10 +524,17 @@ class RcpPat<Instruction RcpInst, ValueType vt> : Pat <
(RcpInst $src)
>;
-class RsqPat<Instruction RsqInst, ValueType vt> : Pat <
- (AMDGPUrcp (fsqrt vt:$src)),
- (RsqInst $src)
->;
+multiclass RsqPat<Instruction RsqInst, ValueType vt> {
+ def : Pat <
+ (fdiv FP_ONE, (fsqrt vt:$src)),
+ (RsqInst $src)
+ >;
+
+ def : Pat <
+ (AMDGPUrcp (fsqrt vt:$src)),
+ (RsqInst $src)
+ >;
+}
include "R600Instructions.td"
include "R700Instructions.td"