summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorTom Stellard <tstellar@redhat.com>2019-06-17 16:27:43 +0000
committerTom Stellard <tstellar@redhat.com>2019-06-17 16:27:43 +0000
commit8b1c53b52818aac8cbf5e9acb168e6315e5cbc6b (patch)
tree7e9e6bef4e13f7dc268b34804bd21e5c51ad24a4 /llvm/test
parenta8dcd47688764faf90c44dfefd0cc321b3e8d9df (diff)
downloadbcm5719-llvm-8b1c53b52818aac8cbf5e9acb168e6315e5cbc6b.tar.gz
bcm5719-llvm-8b1c53b52818aac8cbf5e9acb168e6315e5cbc6b.zip
AMDGPU/GlobalISel: Implement select for G_ICMP and G_SELECT
Reviewers: arsenm Subscribers: kzhuravl, jvesely, wdng, nhaehnle, yaxunl, rovka, kristof.beyls, dstuttard, tpr, t-tye, hiraditya, Petar.Avramovic, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60640 llvm-svn: 363576
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy.mir59
-rw-r--r--llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-icmp.mir309
2 files changed, 364 insertions, 4 deletions
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy.mir
index c47f39dd5ba..9a5931fcd96 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-copy.mir
@@ -1,9 +1,6 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -march=amdgcn -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefixes=GCN
---- |
- define amdgpu_kernel void @copy(i32 addrspace(1)* %global0) {ret void}
-...
---
name: copy
@@ -22,6 +19,60 @@ body: |
%0:sgpr(p1) = COPY $sgpr2_sgpr3
%1:vgpr(p1) = COPY %0
%2:vgpr(s32) = G_IMPLICIT_DEF
- G_STORE %2, %1 :: (store 4 into %ir.global0)
+ G_STORE %2, %1 :: (store 4, addrspace 1)
+...
+---
+
+name: copy_vcc_scc
+legalized: true
+regBankSelected: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $scc
+ ; GCN-LABEL: name: copy_vcc_scc
+ ; GCN: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
+ ; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+ ; GCN: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr3
+ ; GCN: [[COPY3:%[0-9]+]]:sreg_32_xm0 = COPY $scc
+ ; GCN: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[COPY3]], implicit $exec
+ ; GCN: [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, [[COPY2]], 0, [[COPY1]], [[V_CMP_NE_U32_e64_]], implicit $exec
+ ; GCN: FLAT_STORE_DWORD [[COPY]], [[V_CNDMASK_B32_e64_]], 0, 0, 0, 0, implicit $exec, implicit $flat_scr
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:scc(s1) = COPY $scc
+ %4:vcc(s1) = COPY %3
+ %5:vgpr(s32) = G_SELECT %4, %1, %2
+ G_STORE %5, %0 :: (store 4, addrspace 1)
+...
+---
+
+name: copy_vcc_scc_2_uses
+legalized: true
+regBankSelected: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $scc
+ ; GCN-LABEL: name: copy_vcc_scc_2_uses
+ ; GCN: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
+ ; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+ ; GCN: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr3
+ ; GCN: [[COPY3:%[0-9]+]]:sreg_32_xm0 = COPY $scc
+ ; GCN: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[COPY3]], implicit $exec
+ ; GCN: [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, [[COPY2]], 0, [[COPY1]], [[V_CMP_NE_U32_e64_]], implicit $exec
+ ; GCN: [[V_CMP_NE_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 0, [[COPY3]], implicit $exec
+ ; GCN: [[V_CNDMASK_B32_e64_1:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, [[V_CNDMASK_B32_e64_]], 0, [[COPY1]], [[V_CMP_NE_U32_e64_1]], implicit $exec
+ ; GCN: FLAT_STORE_DWORD [[COPY]], [[V_CNDMASK_B32_e64_1]], 0, 0, 0, 0, implicit $exec, implicit $flat_scr
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:scc(s1) = COPY $scc
+ %4:vcc(s1) = COPY %3
+ %5:vgpr(s32) = G_SELECT %4, %1, %2
+ %6:vcc(s1) = COPY %3
+ %7:vgpr(s32) = G_SELECT %6, %1, %5
+ G_STORE %7, %0 :: (store 4, addrspace 1)
...
---
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-icmp.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-icmp.mir
new file mode 100644
index 00000000000..1e3b9c22f5f
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-icmp.mir
@@ -0,0 +1,309 @@
+# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefixes=GCN
+
+---
+name: icmp_s_mix
+legalized: true
+regBankSelected: true
+
+# GCN: name: icmp_s_mix
+# GCN: [[SGPR0:%[0-9]+]]:sreg_32 = COPY $sgpr0
+# GCN: [[SGPR1:%[0-9]+]]:sreg_32 = COPY $sgpr1
+# GCN: [[SGPR2:%[0-9]+]]:sreg_32 = COPY $sgpr2
+# GCN: [[SGPR3:%[0-9]+]]:sreg_32 = COPY $sgpr3
+# GCN: [[SGPR4:%[0-9]+]]:sreg_32 = COPY $sgpr4
+# GCN: [[SGPR5:%[0-9]+]]:sreg_32 = COPY $sgpr5
+# GCN: [[SGPR6:%[0-9]+]]:sreg_32 = COPY $sgpr6
+# GCN: [[SGPR7:%[0-9]+]]:sreg_32 = COPY $sgpr7
+# GCN: S_CMP_LG_U32 [[SGPR0]], [[SGPR1]], implicit-def $scc
+# GCN-NEXT: [[COND0:%[0-9]+]]:sreg_32_xm0 = COPY $scc
+# GCN: S_CMP_LG_U32 [[SGPR4]], [[SGPR5]], implicit-def $scc
+# GCN-NEXT: [[COND1:%[0-9]+]]:sreg_32_xm0 = COPY $scc
+# GCN: $scc = COPY [[COND0]]
+# GCN-NEXT: S_CSELECT_B32 [[SGPR6]], [[SGPR7]], implicit $scc
+# GCN: $scc = COPY [[COND1]]
+# GCN-NEXT: S_CSELECT_B32 [[SGPR2]], [[SGPR3]], implicit $scc
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:sgpr(s32) = COPY $sgpr0
+ %2:sgpr(s32) = COPY $sgpr1
+ %3:sgpr(s32) = COPY $sgpr2
+ %4:sgpr(s32) = COPY $sgpr3
+ %5:sgpr(s32) = COPY $sgpr4
+ %6:sgpr(s32) = COPY $sgpr5
+ %7:sgpr(s32) = COPY $sgpr6
+ %8:sgpr(s32) = COPY $sgpr7
+ %9:scc(s1) = G_ICMP intpred(ne), %1, %2
+ %10:scc(s1) = G_ICMP intpred(ne), %5, %6
+ %11:sgpr(s32) = G_SELECT %9, %7, %8
+ %12:sgpr(s32) = G_SELECT %10, %3, %4
+ %13:vgpr(s32) = COPY %11
+ G_STORE %13, %0 :: (volatile store 4, addrspace 1)
+ %14:vgpr(s32) = COPY %12
+ G_STORE %14, %0 :: (volatile store 4, addrspace 1)
+
+...
+---
+name: icmp_salu
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_salu
+# GCN: S_CMP_LG_U32
+# GCN: S_CMP_EQ_U32
+# GCN: S_CMP_GT_I32
+# GCN: S_CMP_GE_I32
+# GCN: S_CMP_LT_I32
+# GCN: S_CMP_LE_I32
+# GCN: S_CMP_GT_U32
+# GCN: S_CMP_GE_U32
+# GCN: S_CMP_LT_U32
+# GCN: S_CMP_LE_U32
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $sgpr0, $sgpr1, $sgpr2, $sgpr3
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:sgpr(s32) = COPY $sgpr0
+ %2:sgpr(s32) = COPY $sgpr1
+ %3:sgpr(s32) = COPY $sgpr2
+ %4:sgpr(s32) = COPY $sgpr3
+ %5:scc(s1) = G_ICMP intpred(ne), %1, %2
+ %6:scc(s1) = G_ICMP intpred(eq), %1, %2
+ %7:scc(s1) = G_ICMP intpred(sgt), %1, %2
+ %8:scc(s1) = G_ICMP intpred(sge), %1, %2
+ %9:scc(s1) = G_ICMP intpred(slt), %1, %2
+ %10:scc(s1) = G_ICMP intpred(sle), %1, %2
+ %11:scc(s1) = G_ICMP intpred(ugt), %1, %2
+ %12:scc(s1) = G_ICMP intpred(uge), %1, %2
+ %13:scc(s1) = G_ICMP intpred(ult), %1, %2
+ %14:scc(s1) = G_ICMP intpred(ule), %1, %2
+ %15:sgpr(s32) = G_SELECT %5, %3, %4
+ %16:sgpr(s32) = G_SELECT %6, %3, %4
+ %17:sgpr(s32) = G_SELECT %7, %3, %4
+ %18:sgpr(s32) = G_SELECT %8, %3, %4
+ %19:sgpr(s32) = G_SELECT %9, %3, %4
+ %20:sgpr(s32) = G_SELECT %10, %3, %4
+ %21:sgpr(s32) = G_SELECT %11, %3, %4
+ %22:sgpr(s32) = G_SELECT %12, %3, %4
+ %23:sgpr(s32) = G_SELECT %13, %3, %4
+ %24:sgpr(s32) = G_SELECT %14, %3, %4
+ %25:vgpr(s32) = COPY %15
+ G_STORE %25, %0 :: (volatile store 4, addrspace 1)
+ %26:vgpr(s32) = COPY %16
+ G_STORE %26, %0 :: (volatile store 4, addrspace 1)
+ %27:vgpr(s32) = COPY %17
+ G_STORE %27, %0 :: (volatile store 4, addrspace 1)
+ %28:vgpr(s32) = COPY %18
+ G_STORE %28, %0 :: (volatile store 4, addrspace 1)
+ %29:vgpr(s32) = COPY %19
+ G_STORE %29, %0 :: (volatile store 4, addrspace 1)
+ %30:vgpr(s32) = COPY %20
+ G_STORE %30, %0 :: (volatile store 4, addrspace 1)
+ %31:vgpr(s32) = COPY %21
+ G_STORE %31, %0 :: (volatile store 4, addrspace 1)
+ %32:vgpr(s32) = COPY %22
+ G_STORE %32, %0 :: (volatile store 4, addrspace 1)
+ %33:vgpr(s32) = COPY %23
+ G_STORE %33, %0 :: (volatile store 4, addrspace 1)
+ %34:vgpr(s32) = COPY %24
+ G_STORE %34, %0 :: (volatile store 4, addrspace 1)
+
+...
+---
+name: icmp_v_mix
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_v_mix
+# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+# GCN: [[VGPR3:%[0-9]+]]:vgpr_32 = COPY $vgpr3
+# GCN: [[VGPR4:%[0-9]+]]:vgpr_32 = COPY $vgpr4
+# GCN: [[VGPR5:%[0-9]+]]:vgpr_32 = COPY $vgpr5
+# GCN: [[VGPR6:%[0-9]+]]:vgpr_32 = COPY $vgpr6
+# GCN: [[VGPR7:%[0-9]+]]:vgpr_32 = COPY $vgpr7
+# GCN: [[VGPR8:%[0-9]+]]:vgpr_32 = COPY $vgpr8
+# GCN: [[VGPR9:%[0-9]+]]:vgpr_32 = COPY $vgpr9
+# GCN: [[COND0:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 [[VGPR2]], [[VGPR3]]
+# GCN: [[COND1:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 [[VGPR6]], [[VGPR7]]
+# GCN: V_CNDMASK_B32_e64 0, [[VGPR9]], 0, [[VGPR8]], [[COND0]]
+# GCN: V_CNDMASK_B32_e64 0, [[VGPR5]], 0, [[VGPR4]], [[COND1]]
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7, $vgpr8, $vgpr9
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:vgpr(s32) = COPY $vgpr5
+ %5:vgpr(s32) = COPY $vgpr6
+ %6:vgpr(s32) = COPY $vgpr7
+ %7:vgpr(s32) = COPY $vgpr8
+ %8:vgpr(s32) = COPY $vgpr9
+ %9:sgpr(s1) = G_ICMP intpred(ne), %1, %2
+ %10:sgpr(s1) = G_ICMP intpred(ne), %5, %6
+ %11:vgpr(s32) = G_SELECT %9, %7, %8
+ %12:vgpr(s32) = G_SELECT %10, %3, %4
+ G_STORE %11, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %12, %0 :: (volatile store 4, addrspace 1)
+...
+---
+name: icmp_valu
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_valu
+# GCN: V_CMP_NE_U32_e64
+# GCN: V_CMP_EQ_U32_e64
+# GCN: V_CMP_GT_I32_e64
+# GCN: V_CMP_GE_I32_e64
+# GCN: V_CMP_LT_I32_e64
+# GCN: V_CMP_LE_I32_e64
+# GCN: V_CMP_GT_U32_e64
+# GCN: V_CMP_GE_U32_e64
+# GCN: V_CMP_LT_U32_e64
+# GCN: V_CMP_LE_U32_e64
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:vgpr(s32) = COPY $vgpr5
+ %5:sgpr(s1) = G_ICMP intpred(ne), %1, %2
+ %6:sgpr(s1) = G_ICMP intpred(eq), %1, %2
+ %7:sgpr(s1) = G_ICMP intpred(sgt), %1, %2
+ %8:sgpr(s1) = G_ICMP intpred(sge), %1, %2
+ %9:sgpr(s1) = G_ICMP intpred(slt), %1, %2
+ %10:sgpr(s1) = G_ICMP intpred(sle), %1, %2
+ %11:sgpr(s1) = G_ICMP intpred(ugt), %1, %2
+ %12:sgpr(s1) = G_ICMP intpred(uge), %1, %2
+ %13:sgpr(s1) = G_ICMP intpred(ult), %1, %2
+ %14:sgpr(s1) = G_ICMP intpred(ule), %1, %2
+ %15:vgpr(s32) = G_SELECT %5, %3, %4
+ %16:vgpr(s32) = G_SELECT %6, %3, %4
+ %17:vgpr(s32) = G_SELECT %7, %3, %4
+ %18:vgpr(s32) = G_SELECT %8, %3, %4
+ %19:vgpr(s32) = G_SELECT %9, %3, %4
+ %20:vgpr(s32) = G_SELECT %10, %3, %4
+ %21:vgpr(s32) = G_SELECT %11, %3, %4
+ %22:vgpr(s32) = G_SELECT %12, %3, %4
+ %23:vgpr(s32) = G_SELECT %13, %3, %4
+ %24:vgpr(s32) = G_SELECT %14, %3, %4
+ G_STORE %15, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %16, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %17, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %18, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %19, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %20, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %21, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %22, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %23, %0 :: (volatile store 4, addrspace 1)
+ G_STORE %24, %0 :: (volatile store 4, addrspace 1)
+...
+---
+
+name: icmp_vv
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_vv
+# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+# GCN: [[VGPR3:%[0-9]+]]:vgpr_32 = COPY $vgpr3
+# GCN: V_CMP_NE_U32_e64 [[VGPR2]], [[VGPR3]]
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:vgpr(s32) = COPY $vgpr5
+ %5:sgpr(s1) = G_ICMP intpred(ne), %1, %2
+ %6:vgpr(s32) = G_SELECT %5, %3, %4
+ G_STORE %6, %0 :: (store 4, addrspace 1)
+...
+---
+
+name: icmp_vs
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_vs
+# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+# GCN: [[SGPR0:%[0-9]+]]:sreg_32_xm0 = COPY $sgpr0
+# GCN: V_CMP_NE_U32_e64 [[VGPR2]], [[SGPR0]]
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:sgpr(s32) = COPY $sgpr0
+ %5:sgpr(s1) = G_ICMP intpred(ne), %1, %4
+ %6:vgpr(s32) = G_SELECT %5, %2, %3
+ G_STORE %6, %0 :: (store 4, addrspace 1)
+...
+---
+
+name: icmp_sv
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_sv
+# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+# GCN: [[SGPR0:%[0-9]+]]:sreg_32_xm0 = COPY $sgpr0
+# GCN: V_CMP_NE_U32_e64 [[SGPR0]], [[VGPR2]]
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:sgpr(s32) = COPY $sgpr0
+ %5:sgpr(s1) = G_ICMP intpred(ne), %4, %1
+ %6:vgpr(s32) = G_SELECT %5, %2, %3
+ G_STORE %6, %0 :: (store 4, addrspace 1)
+...
+---
+
+name: icmp_or_vcc
+legalized: true
+regBankSelected: true
+
+# GCN-LABEL: name: icmp_or_vcc
+# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
+# GCN: [[SGPR0:%[0-9]+]]:sreg_32_xm0 = COPY $sgpr0
+# GCN: V_CMP_NE_U32_e64 [[SGPR0]], [[VGPR2]]
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
+
+ %0:vgpr(p1) = COPY $vgpr0_vgpr1
+ %1:vgpr(s32) = COPY $vgpr2
+ %2:vgpr(s32) = COPY $vgpr3
+ %3:vgpr(s32) = COPY $vgpr4
+ %4:sgpr(s32) = COPY $sgpr0
+ %5:sgpr(s1) = G_ICMP intpred(ne), %4, %1
+ %6:vgpr(s32) = G_SELECT %5, %2, %3
+ G_STORE %6, %0 :: (store 4, addrspace 1)
+...
+---
OpenPOWER on IntegriCloud