[PATCH] D84622: [PowerPC] Implement Vector Extract Low/High Order Builtins in LLVM/Clang
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGcce1b0e8919e: [PowerPC] Implement Vector Extract Low/High Order Builtins in LLVM/Clang (authored by biplmish). Changed prior to commit: https://reviews.llvm.org/D84622?vs=280803=283814#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84622/new/ https://reviews.llvm.org/D84622 Files: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Headers/altivec.h clang/test/CodeGen/builtins-ppc-p10vector.c llvm/include/llvm/IR/IntrinsicsPowerPC.td llvm/lib/Target/PowerPC/PPCInstrPrefix.td llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll Index: llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll === --- llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll +++ llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll @@ -253,3 +253,91 @@ ret <2 x i64> %0 } declare <2 x i64> @llvm.ppc.altivec.vinsd(<2 x i64>, i64, i32 immarg) + +define <2 x i64> @testVEXTDUBVLX(<16 x i8> %a, <16 x i8> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUBVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextdubvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextdubvlx(<16 x i8> %a, <16 x i8> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextdubvlx(<16 x i8>, <16 x i8>, i32) + +define <2 x i64> @testVEXTDUBVRX(<16 x i8> %a, <16 x i8> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUBVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextdubvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextdubvrx(<16 x i8> %a, <16 x i8> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextdubvrx(<16 x i8>, <16 x i8>, i32) + +define <2 x i64> @testVEXTDUHVLX(<8 x i16> %a, <8 x i16> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUHVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduhvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduhvlx(<8 x i16> %a, <8 x i16> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduhvlx(<8 x i16>, <8 x i16>, i32) + +define <2 x i64> @testVEXTDUHVRX(<8 x i16> %a, <8 x i16> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUHVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduhvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduhvrx(<8 x i16> %a, <8 x i16> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduhvrx(<8 x i16>, <8 x i16>, i32) + +define <2 x i64> @testVEXTDUWVLX(<4 x i32> %a, <4 x i32> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUWVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduwvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduwvlx(<4 x i32> %a, <4 x i32> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduwvlx(<4 x i32>, <4 x i32>, i32) + +define <2 x i64> @testVEXTDUWVRX(<4 x i32> %a, <4 x i32> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUWVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduwvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduwvrx(<4 x i32> %a, <4 x i32> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduwvrx(<4 x i32>, <4 x i32>, i32) + +define <2 x i64> @testVEXTDDVLX(<2 x i64> %a, <2 x i64> %b, i32 %c) { +; CHECK-LABEL: testVEXTDDVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextddvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextddvlx(<2 x i64> %a, <2 x i64> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextddvlx(<2 x i64>, <2 x i64>, i32) + +define <2 x i64> @testVEXTDDVRX(<2 x i64> %a, <2 x i64> %b, i32 %c) { +; CHECK-LABEL: testVEXTDDVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextddvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextddvrx(<2 x i64> %a, <2 x i64> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextddvrx(<2 x i64>, <2 x i64>, i32) Index: llvm/lib/Target/PowerPC/PPCInstrPrefix.td === --- llvm/lib/Target/PowerPC/PPCInstrPrefix.td +++ llvm/lib/Target/PowerPC/PPCInstrPrefix.td @@ -948,37 +948,69 @@ (int_ppc_altivec_vinsdrx v2i64:$vDi, i64:$rA, i64:$rB))]>, RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$vD), - (ins vrrc:$vA, vrrc:$vB, g8rc:$rC), + (ins vrrc:$vA, vrrc:$vB, gprc:$rC), "vextdubvlx $vD, $vA, $vB, $rC", -
[PATCH] D84622: [PowerPC] Implement Vector Extract Low/High Order Builtins in LLVM/Clang
amyk accepted this revision. amyk added a comment. I think overall it LGTM and the indentation can be addressed when committing. Comment at: clang/lib/Headers/altivec.h:17082 +/* vec_extractl */ +static __inline__ vector unsigned long long __ATTRS_o_ai vec_extractl( nit: space after this comment Comment at: clang/lib/Headers/altivec.h:17124 + +/* vec_extracth */ +static __inline__ vector unsigned long long __ATTRS_o_ai vec_extracth( nit: space after this comment Comment at: clang/lib/Headers/altivec.h:17156 +static __inline__ vector unsigned long long __ATTRS_o_ai +vec_extracth(vector unsigned long long __a, vector unsigned long long __b, + unsigned int __c) { I know you said previously that having the function names in one way caused errors with clang format, but could we have the function names declared in the same way for consistency? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84622/new/ https://reviews.llvm.org/D84622 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D84622: [PowerPC] Implement Vector Extract Low/High Order Builtins in LLVM/Clang
steven.zhang accepted this revision. steven.zhang added a comment. This revision is now accepted and ready to land. LGTM. But please hold on for one more days to see if there is other comments. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84622/new/ https://reviews.llvm.org/D84622 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D84622: [PowerPC] Implement Vector Extract Low/High Order Builtins in LLVM/Clang
biplmish created this revision. biplmish added reviewers: amyk, lei, steven.zhang, PowerPC. Herald added subscribers: cfe-commits, shchenz, wuzish, kbarton, hiraditya, nemanjai. Herald added projects: clang, LLVM. This patch implements builtins for the following prototypes: vector unsigned long long vec_extractl (vector unsigned char, vector unsigned char, unsigned int); vector unsigned long long vec_extractl (vector unsigned short, vector unsigned short, unsigned int); vector unsigned long long vec_extractl (vector unsigned int, vector unsigned int, unsigned int); vector unsigned long long vec_extractl (vector unsigned long long, vector unsigned long long, unsigned int); vector unsigned long long vec_extracth (vector unsigned char, vector unsigned char, unsigned int); vector unsigned long long vec_extracth (vector unsigned short, vector unsigned short, unsigned int); vector unsigned long long vec_extracth (vector unsigned int, vector unsigned int, unsigned int); vector unsigned long long vec_extracth (vector unsigned long long, vector unsigned long long, unsigned int); Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84622 Files: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Headers/altivec.h clang/test/CodeGen/builtins-ppc-p10vector.c llvm/include/llvm/IR/IntrinsicsPowerPC.td llvm/lib/Target/PowerPC/PPCInstrPrefix.td llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll Index: llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll === --- llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll +++ llvm/test/CodeGen/PowerPC/builtins-ppc-p10permute.ll @@ -253,3 +253,91 @@ ret <2 x i64> %0 } declare <2 x i64> @llvm.ppc.altivec.vinsd(<2 x i64>, i64, i32 immarg) + +define <2 x i64> @testVEXTDUBVLX(<16 x i8> %a, <16 x i8> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUBVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextdubvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextdubvlx(<16 x i8> %a, <16 x i8> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextdubvlx(<16 x i8>, <16 x i8>, i32) + +define <2 x i64> @testVEXTDUBVRX(<16 x i8> %a, <16 x i8> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUBVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextdubvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextdubvrx(<16 x i8> %a, <16 x i8> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextdubvrx(<16 x i8>, <16 x i8>, i32) + +define <2 x i64> @testVEXTDUHVLX(<8 x i16> %a, <8 x i16> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUHVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduhvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduhvlx(<8 x i16> %a, <8 x i16> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduhvlx(<8 x i16>, <8 x i16>, i32) + +define <2 x i64> @testVEXTDUHVRX(<8 x i16> %a, <8 x i16> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUHVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduhvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduhvrx(<8 x i16> %a, <8 x i16> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduhvrx(<8 x i16>, <8 x i16>, i32) + +define <2 x i64> @testVEXTDUWVLX(<4 x i32> %a, <4 x i32> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUWVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduwvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduwvlx(<4 x i32> %a, <4 x i32> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduwvlx(<4 x i32>, <4 x i32>, i32) + +define <2 x i64> @testVEXTDUWVRX(<4 x i32> %a, <4 x i32> %b, i32 %c) { +; CHECK-LABEL: testVEXTDUWVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextduwvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextduwvrx(<4 x i32> %a, <4 x i32> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextduwvrx(<4 x i32>, <4 x i32>, i32) + +define <2 x i64> @testVEXTDDVLX(<2 x i64> %a, <2 x i64> %b, i32 %c) { +; CHECK-LABEL: testVEXTDDVLX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextddvlx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextddvlx(<2 x i64> %a, <2 x i64> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64> @llvm.ppc.altivec.vextddvlx(<2 x i64>, <2 x i64>, i32) + +define <2 x i64> @testVEXTDDVRX(<2 x i64> %a, <2 x i64> %b, i32 %c) { +; CHECK-LABEL: testVEXTDDVRX: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:vextddvrx v2, v2, v3, r7 +; CHECK-NEXT:blr +entry: + %0 = tail call <2 x i64> @llvm.ppc.altivec.vextddvrx(<2 x i64> %a, <2 x i64> %b, i32 %c) + ret <2 x i64> %0 +} +declare <2 x i64>