diff --git a/lib/Target/PowerPC/PPCInstrVSX.td b/lib/Target/PowerPC/PPCInstrVSX.td index 771c1fbaa57..2762da6ad48 100644 --- a/lib/Target/PowerPC/PPCInstrVSX.td +++ b/lib/Target/PowerPC/PPCInstrVSX.td @@ -658,20 +658,27 @@ let Uses = [RM] in { let isCommutable = 1 in def XXLAND : XX3Form<60, 130, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), - "xxland $XT, $XA, $XB", IIC_VecGeneral, []>; + "xxland $XT, $XA, $XB", IIC_VecGeneral, + [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>; def XXLANDC : XX3Form<60, 138, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), - "xxlandc $XT, $XA, $XB", IIC_VecGeneral, []>; + "xxlandc $XT, $XA, $XB", IIC_VecGeneral, + [(set v4i32:$XT, (and v4i32:$XA, + (vnot_ppc v4i32:$XB)))]>; let isCommutable = 1 in { def XXLNOR : XX3Form<60, 162, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), - "xxlnor $XT, $XA, $XB", IIC_VecGeneral, []>; + "xxlnor $XT, $XA, $XB", IIC_VecGeneral, + [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA, + v4i32:$XB)))]>; def XXLOR : XX3Form<60, 146, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), - "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>; + "xxlor $XT, $XA, $XB", IIC_VecGeneral, + [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>; def XXLXOR : XX3Form<60, 154, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), - "xxlxor $XT, $XA, $XB", IIC_VecGeneral, []>; + "xxlxor $XT, $XA, $XB", IIC_VecGeneral, + [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>; } // isCommutable // Permutation Instructions diff --git a/test/CodeGen/PowerPC/vsx.ll b/test/CodeGen/PowerPC/vsx.ll index 6131cd1bb6d..5455565ce3d 100644 --- a/test/CodeGen/PowerPC/vsx.ll +++ b/test/CodeGen/PowerPC/vsx.ll @@ -42,3 +42,159 @@ entry: ; CHECK: blr } +define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) { +entry: + %v = xor <4 x i32> %a, %b + ret <4 x i32> %v + +; CHECK-LABEL: @test5 +; CHECK: xxlxor 34, 34, 35 +; CHECK: blr +} + +define <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) { +entry: + %v = xor <8 x i16> %a, %b + ret <8 x i16> %v + +; CHECK-LABEL: @test6 +; CHECK: xxlxor 34, 34, 35 +; CHECK: blr +} + +define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) { +entry: + %v = xor <16 x i8> %a, %b + ret <16 x i8> %v + +; CHECK-LABEL: @test7 +; CHECK: xxlxor 34, 34, 35 +; CHECK: blr +} + +define <4 x i32> @test8(<4 x i32> %a, <4 x i32> %b) { +entry: + %v = or <4 x i32> %a, %b + ret <4 x i32> %v + +; CHECK-LABEL: @test8 +; CHECK: xxlor 34, 34, 35 +; CHECK: blr +} + +define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) { +entry: + %v = or <8 x i16> %a, %b + ret <8 x i16> %v + +; CHECK-LABEL: @test9 +; CHECK: xxlor 34, 34, 35 +; CHECK: blr +} + +define <16 x i8> @test10(<16 x i8> %a, <16 x i8> %b) { +entry: + %v = or <16 x i8> %a, %b + ret <16 x i8> %v + +; CHECK-LABEL: @test10 +; CHECK: xxlor 34, 34, 35 +; CHECK: blr +} + +define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) { +entry: + %v = and <4 x i32> %a, %b + ret <4 x i32> %v + +; CHECK-LABEL: @test11 +; CHECK: xxland 34, 34, 35 +; CHECK: blr +} + +define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) { +entry: + %v = and <8 x i16> %a, %b + ret <8 x i16> %v + +; CHECK-LABEL: @test12 +; CHECK: xxland 34, 34, 35 +; CHECK: blr +} + +define <16 x i8> @test13(<16 x i8> %a, <16 x i8> %b) { +entry: + %v = and <16 x i8> %a, %b + ret <16 x i8> %v + +; CHECK-LABEL: @test13 +; CHECK: xxland 34, 34, 35 +; CHECK: blr +} + +define <4 x i32> @test14(<4 x i32> %a, <4 x i32> %b) { +entry: + %v = or <4 x i32> %a, %b + %w = xor <4 x i32> %v, + ret <4 x i32> %w + +; CHECK-LABEL: @test14 +; CHECK: xxlnor 34, 34, 35 +; CHECK: blr +} + +define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) { +entry: + %v = or <8 x i16> %a, %b + %w = xor <8 x i16> %v, + ret <8 x i16> %w + +; CHECK-LABEL: @test15 +; CHECK: xxlnor 34, 34, 35 +; CHECK: blr +} + +define <16 x i8> @test16(<16 x i8> %a, <16 x i8> %b) { +entry: + %v = or <16 x i8> %a, %b + %w = xor <16 x i8> %v, + ret <16 x i8> %w + +; CHECK-LABEL: @test16 +; CHECK: xxlnor 34, 34, 35 +; CHECK: blr +} + +define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) { +entry: + %w = xor <4 x i32> %b, + %v = and <4 x i32> %a, %w + ret <4 x i32> %v + +; CHECK-LABEL: @test17 +; CHECK: xxlandc 34, 34, 35 +; CHECK: blr +} + +define <8 x i16> @test18(<8 x i16> %a, <8 x i16> %b) { +entry: + %w = xor <8 x i16> %b, + %v = and <8 x i16> %a, %w + ret <8 x i16> %v + +; CHECK-LABEL: @test18 +; CHECK: xxlandc 34, 34, 35 +; CHECK: blr +} + +define <16 x i8> @test19(<16 x i8> %a, <16 x i8> %b) { +entry: + %w = xor <16 x i8> %b, + %v = and <16 x i8> %a, %w + ret <16 x i8> %v + +; CHECK-LABEL: @test19 +; CHECK: xxlandc 34, 34, 35 +; CHECK: blr +} +