diff options
Diffstat (limited to 'test/CodeGen/SystemZ/branch-05.ll')
-rw-r--r-- | test/CodeGen/SystemZ/branch-05.ll | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/test/CodeGen/SystemZ/branch-05.ll b/test/CodeGen/SystemZ/branch-05.ll new file mode 100644 index 0000000..d149e0b --- /dev/null +++ b/test/CodeGen/SystemZ/branch-05.ll @@ -0,0 +1,58 @@ +; Test indirect jumps. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s + +define i32 @f1(i32 %x, i32 %y, i32 %op) { +; CHECK: f1: +; CHECK: ahi %r4, -1 +; CHECK: clfi %r4, 5 +; CHECK-NEXT: j{{g?}}g +; CHECK: llgfr [[OP64:%r[0-5]]], %r4 +; CHECK: sllg [[INDEX:%r[1-5]]], [[OP64]], 3 +; CHECK: larl [[BASE:%r[1-5]]] +; CHECK: lg [[TARGET:%r[1-5]]], 0([[BASE]],[[INDEX]]) +; CHECK: br [[TARGET]] +entry: + switch i32 %op, label %exit [ + i32 1, label %b.add + i32 2, label %b.sub + i32 3, label %b.and + i32 4, label %b.or + i32 5, label %b.xor + i32 6, label %b.mul + ] + +b.add: + %add = add i32 %x, %y + br label %exit + +b.sub: + %sub = sub i32 %x, %y + br label %exit + +b.and: + %and = and i32 %x, %y + br label %exit + +b.or: + %or = or i32 %x, %y + br label %exit + +b.xor: + %xor = xor i32 %x, %y + br label %exit + +b.mul: + %mul = mul i32 %x, %y + br label %exit + +exit: + %res = phi i32 [ %x, %entry ], + [ %add, %b.add ], + [ %sub, %b.sub ], + [ %and, %b.and ], + [ %or, %b.or ], + [ %xor, %b.xor ], + [ %mul, %b.mul ] + ret i32 %res +} |