diff options
| author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2018-01-19 20:52:04 +0000 |
|---|---|---|
| committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2018-01-19 20:52:04 +0000 |
| commit | 849a59fd4b15967672f94fe034a0b152833b6320 (patch) | |
| tree | 42a672e8cf7f4b24d6740427519daf979348771c /llvm/test/CodeGen | |
| parent | 9eb858c92fe9598b49d1a227652e7415a15e90e9 (diff) | |
| download | bcm5719-llvm-849a59fd4b15967672f94fe034a0b152833b6320.tar.gz bcm5719-llvm-849a59fd4b15967672f94fe034a0b152833b6320.zip | |
[SystemZ] Rework IPM sequence generation
The SystemZ back-end uses a sequence of IPM followed by arithmetic
operations to implement the SETCC primitive. This is currently done
early during SelectionDAG. This patch moves generating those sequences
to much later in SelectionDAG (during PreprocessISelDAG).
This doesn't change much in generated code by itself, but it allows
further enhancements that will be checked-in as follow-on commits.
llvm-svn: 322987
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/branch-07.ll | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/setcc-03.ll | 73 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/setcc-04.ll | 173 |
3 files changed, 250 insertions, 4 deletions
diff --git a/llvm/test/CodeGen/SystemZ/branch-07.ll b/llvm/test/CodeGen/SystemZ/branch-07.ll index 857c9cb17ad..bac607133a8 100644 --- a/llvm/test/CodeGen/SystemZ/branch-07.ll +++ b/llvm/test/CodeGen/SystemZ/branch-07.ll @@ -129,8 +129,8 @@ define void @f9(i64 %a, i64 %b, <2 x i64> *%dest) { ; CHECK-LABEL: f9: ; CHECK: ipm [[REG:%r[0-5]]] ; CHECK: afi [[REG]], -268435456 -; CHECK: risbg [[REG2:%r[0-5]]], [[REG]], 63, 191, 33 -; CHECK: lcgr {{%r[0-5]}}, [[REG2]] +; CHECK: sllg [[REG2:%r[0-5]]], [[REG]], 32 +; CHECK: srag {{%r[0-5]}}, [[REG2]], 63 ; CHECK: br %r14 %avec = bitcast i64 %a to <2 x i32> %bvec = bitcast i64 %b to <2 x i32> @@ -145,8 +145,8 @@ define void @f10(i64 %a, i64 %b, <2 x i64> *%dest) { ; CHECK-LABEL: f10: ; CHECK: ipm [[REG:%r[0-5]]] ; CHECK: afi [[REG]], 1879048192 -; CHECK: risbg [[REG2:%r[0-5]]], [[REG]], 63, 191, 33 -; CHECK: lcgr {{%r[0-5]}}, [[REG2]] +; CHECK: sllg [[REG2:%r[0-5]]], [[REG]], 32 +; CHECK: srag {{%r[0-5]}}, [[REG2]], 63 ; CHECK: br %r14 %avec = bitcast i64 %a to <2 x i32> %bvec = bitcast i64 %b to <2 x i32> diff --git a/llvm/test/CodeGen/SystemZ/setcc-03.ll b/llvm/test/CodeGen/SystemZ/setcc-03.ll new file mode 100644 index 00000000000..0a125f02aac --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/setcc-03.ll @@ -0,0 +1,73 @@ +; Test SETCC with an i32 result for every integer condition. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s + +; Test CC in { 0 }, with 3 don't care. +define i64 @f1(i32 %a, i32 %b) { +; CHECK-LABEL: f1: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -268435456 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = icmp eq i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1 }, with 3 don't care. +define i64 @f2(i32 %a, i32 %b) { +; CHECK-LABEL: f2: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36 +; CHECK: br %r14 + %cond = icmp slt i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 1 }, with 3 don't care. +define i64 @f3(i32 %a, i32 %b) { +; CHECK-LABEL: f3: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -536870912 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = icmp sle i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 2 }, with 3 don't care. +define i64 @f4(i32 %a, i32 %b) { +; CHECK-LABEL: f4: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35 +; CHECK: br %r14 + %cond = icmp sgt i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 2 }, with 3 don't care. +define i64 @f5(i32 %a, i32 %b) { +; CHECK-LABEL: f5: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 4294967295 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36 +; CHECK: br %r14 + %cond = icmp sge i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1, 2 }, with 3 don't care. +define i64 @f6(i32 %a, i32 %b) { +; CHECK-LABEL: f6: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], 1879048192 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = icmp ne i32 %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} diff --git a/llvm/test/CodeGen/SystemZ/setcc-04.ll b/llvm/test/CodeGen/SystemZ/setcc-04.ll new file mode 100644 index 00000000000..91ea11e850a --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/setcc-04.ll @@ -0,0 +1,173 @@ +; Test SETCC with an i64 result for every floating-point condition. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s + +; Test CC in { 0 } +define i64 @f1(float %a, float %b) { +; CHECK-LABEL: f1: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -268435456 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp oeq float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1 } +define i64 @f2(float %a, float %b) { +; CHECK-LABEL: f2: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 268435456 +; CHECK-NEXT: afi [[REG]], -268435456 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp olt float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 1 } +define i64 @f3(float %a, float %b) { +; CHECK-LABEL: f3: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -536870912 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp ole float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 2 } +define i64 @f4(float %a, float %b) { +; CHECK-LABEL: f4: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 268435456 +; CHECK-NEXT: afi [[REG]], 1342177280 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp ogt float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 2 } +define i64 @f5(float %a, float %b) { +; CHECK-LABEL: f5: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 4294967295 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36 +; CHECK: br %r14 + %cond = fcmp oge float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1, 2 } +define i64 @f6(float %a, float %b) { +; CHECK-LABEL: f6: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], 268435456 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35 +; CHECK: br %r14 + %cond = fcmp one float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 1, 2 } +define i64 @f7(float %a, float %b) { +; CHECK-LABEL: f7: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -805306368 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp ord float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 3 } +define i64 @f8(float %a, float %b) { +; CHECK-LABEL: f8: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], 1342177280 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp uno float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 3 } +define i64 @f9(float %a, float %b) { +; CHECK-LABEL: f9: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], -268435456 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35 +; CHECK: br %r14 + %cond = fcmp ueq float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1, 3 } +define i64 @f10(float %a, float %b) { +; CHECK-LABEL: f10: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36 +; CHECK: br %r14 + %cond = fcmp ult float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 1, 3 } +define i64 @f11(float %a, float %b) { +; CHECK-LABEL: f11: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 268435456 +; CHECK-NEXT: afi [[REG]], -805306368 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp ule float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 2, 3 } +define i64 @f12(float %a, float %b) { +; CHECK-LABEL: f12: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35 +; CHECK: br %r14 + %cond = fcmp ugt float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 0, 2, 3 } +define i64 @f13(float %a, float %b) { +; CHECK-LABEL: f13: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: xilf [[REG]], 268435456 +; CHECK-NEXT: afi [[REG]], 1879048192 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp uge float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} + +; Test CC in { 1, 2, 3 } +define i64 @f14(float %a, float %b) { +; CHECK-LABEL: f14: +; CHECK: ipm [[REG:%r[0-5]]] +; CHECK-NEXT: afi [[REG]], 1879048192 +; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33 +; CHECK: br %r14 + %cond = fcmp une float %a, %b + %res = zext i1 %cond to i64 + ret i64 %res +} |

