[CIR][X86] Add support for vpshl/vpshr builtins (#179538)
This patch also adds support for fshl/fshr operations so that vpshl/vpshr intrinsics can lower to them Part of: #167765
This commit is contained in:
parent
0c884aa2f5
commit
0f6ee50e4e
@ -1344,8 +1344,23 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
|
||||
case Builtin::BI__builtin_elementwise_canonicalize:
|
||||
case Builtin::BI__builtin_elementwise_copysign:
|
||||
case Builtin::BI__builtin_elementwise_fma:
|
||||
case Builtin::BI__builtin_elementwise_fshl:
|
||||
case Builtin::BI__builtin_elementwise_fshr:
|
||||
return errorBuiltinNYI(*this, e, builtinID);
|
||||
case Builtin::BI__builtin_elementwise_fshl: {
|
||||
mlir::Location loc = getLoc(e->getExprLoc());
|
||||
mlir::Value a = emitScalarExpr(e->getArg(0));
|
||||
mlir::Value b = emitScalarExpr(e->getArg(1));
|
||||
mlir::Value c = emitScalarExpr(e->getArg(2));
|
||||
return RValue::get(builder.emitIntrinsicCallOp(loc, "fshl", a.getType(),
|
||||
mlir::ValueRange{a, b, c}));
|
||||
}
|
||||
case Builtin::BI__builtin_elementwise_fshr: {
|
||||
mlir::Location loc = getLoc(e->getExprLoc());
|
||||
mlir::Value a = emitScalarExpr(e->getArg(0));
|
||||
mlir::Value b = emitScalarExpr(e->getArg(1));
|
||||
mlir::Value c = emitScalarExpr(e->getArg(2));
|
||||
return RValue::get(builder.emitIntrinsicCallOp(loc, "fshr", a.getType(),
|
||||
mlir::ValueRange{a, b, c}));
|
||||
}
|
||||
case Builtin::BI__builtin_elementwise_add_sat:
|
||||
case Builtin::BI__builtin_elementwise_sub_sat:
|
||||
case Builtin::BI__builtin_elementwise_max:
|
||||
|
||||
@ -2058,6 +2058,10 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) {
|
||||
case X86::BI__builtin_ia32_pternlogd256_maskz:
|
||||
case X86::BI__builtin_ia32_pternlogq128_maskz:
|
||||
case X86::BI__builtin_ia32_pternlogq256_maskz:
|
||||
cgm.errorNYI(expr->getSourceRange(),
|
||||
std::string("unimplemented X86 builtin call: ") +
|
||||
getContext().BuiltinInfo.getName(builtinID));
|
||||
return mlir::Value{};
|
||||
case X86::BI__builtin_ia32_vpshldd128:
|
||||
case X86::BI__builtin_ia32_vpshldd256:
|
||||
case X86::BI__builtin_ia32_vpshldd512:
|
||||
@ -2067,6 +2071,8 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) {
|
||||
case X86::BI__builtin_ia32_vpshldw128:
|
||||
case X86::BI__builtin_ia32_vpshldw256:
|
||||
case X86::BI__builtin_ia32_vpshldw512:
|
||||
return emitX86FunnelShift(builder, getLoc(expr->getExprLoc()), ops[0],
|
||||
ops[1], ops[2], false);
|
||||
case X86::BI__builtin_ia32_vpshrdd128:
|
||||
case X86::BI__builtin_ia32_vpshrdd256:
|
||||
case X86::BI__builtin_ia32_vpshrdd512:
|
||||
@ -2076,10 +2082,9 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) {
|
||||
case X86::BI__builtin_ia32_vpshrdw128:
|
||||
case X86::BI__builtin_ia32_vpshrdw256:
|
||||
case X86::BI__builtin_ia32_vpshrdw512:
|
||||
cgm.errorNYI(expr->getSourceRange(),
|
||||
std::string("unimplemented X86 builtin call: ") +
|
||||
getContext().BuiltinInfo.getName(builtinID));
|
||||
return mlir::Value{};
|
||||
// Ops 0 and 1 are swapped.
|
||||
return emitX86FunnelShift(builder, getLoc(expr->getExprLoc()), ops[1],
|
||||
ops[0], ops[2], true);
|
||||
case X86::BI__builtin_ia32_reduce_fadd_pd512:
|
||||
case X86::BI__builtin_ia32_reduce_fadd_ps512:
|
||||
case X86::BI__builtin_ia32_reduce_fadd_ph512:
|
||||
|
||||
401
clang/test/CIR/CodeGenBuiltins/X86/avx512vbmi2-builtins.c
Normal file
401
clang/test/CIR/CodeGenBuiltins/X86/avx512vbmi2-builtins.c
Normal file
@ -0,0 +1,401 @@
|
||||
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding -triple x86_64-unknown-linux-gnu -fclangir -target-feature +avx512vbmi2 -emit-cir %s -o %t.cir
|
||||
// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s
|
||||
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding -triple x86_64-unknown-linux-gnu -fclangir -target-feature +avx512vbmi2 -emit-llvm %s -o %t.ll
|
||||
// RUN: FileCheck --check-prefixes=LLVM --input-file=%t.ll %s
|
||||
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-unknown-linux -target-feature +avx512vbmi2 -emit-llvm -o %t.ll -Wall -Werror -Wsign-conversion
|
||||
// RUN: FileCheck --check-prefixes=OGCG --input-file=%t.ll %s
|
||||
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
__m512i test_mm512_shldv_epi64(__m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @_mm512_shldv_epi64
|
||||
// CIR: %{{.*}} = cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<8 x !u64i>
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !u64i>, !cir.vector<8 x !u64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !u64i>
|
||||
// CIR: %{{.*}} = cir.cast bitcast %{{.*}} : !cir.vector<8 x !u64i> -> !cir.vector<8 x !s64i>
|
||||
// CIR-LABEL: @test_mm512_shldv_epi64
|
||||
// CIR: %{{.*}} = cir.call @_mm512_shldv_epi64
|
||||
// LLVM-LABEL: @test_mm512_shldv_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_shldv_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64>
|
||||
return _mm512_shldv_epi64(s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldi_epi64(__m512i s, __mmask8 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_mask_shldi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}}
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}})
|
||||
// LLVM-LABEL: @test_mm512_mask_shldi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 47))
|
||||
// LLVM: select <8 x i1> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 47))
|
||||
// OGCG: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
|
||||
return _mm512_mask_shldi_epi64(s, u, a, b, 47);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shldi_epi64(__mmask8 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_maskz_shldi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shldi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 63))
|
||||
// LLVM: select <8 x i1> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shldi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 63))
|
||||
// OGCG: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
|
||||
return _mm512_maskz_shldi_epi64(u, a, b, 63);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shldi_epi64(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_shldi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shldi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 31))
|
||||
// OGCG-LABEL: @test_mm512_shldi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 31))
|
||||
return _mm512_shldi_epi64(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldi_epi32(__m512i s, __mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_mask_shldi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !s32i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_mask_shldi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 7))
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 7))
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_mask_shldi_epi32(s, u, a, b, 7);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shldi_epi32(__mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_maskz_shldi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shldi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 15))
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shldi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 15))
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_maskz_shldi_epi32(u, a, b, 15);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shldi_epi32(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_shldi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !s32i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shldi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 31))
|
||||
// OGCG-LABEL: @test_mm512_shldi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 31))
|
||||
return _mm512_shldi_epi32(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldi_epi16(__m512i s, __mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_mask_shldi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_mask_shldi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 3))
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 3))
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_mask_shldi_epi16(s, u, a, b, 3);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shldi_epi16(__mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_maskz_shldi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shldi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 15))
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shldi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 15))
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_maskz_shldi_epi16(u, a, b, 15);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shldi_epi16(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: test_mm512_shldi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shldi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 31))
|
||||
// OGCG-LABEL: @test_mm512_shldi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 31))
|
||||
return _mm512_shldi_epi16(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldv_epi64(__m512i s, __mmask8 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_mask_shldv_epi64
|
||||
// CIR: cir.call @_mm512_shldv_epi64(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !u8i -> !cir.vector<8 x !cir.int<s, 1>>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !s64i>
|
||||
// CIR-LABEL: test_mm512_mask_shldv_epi64
|
||||
// CIR: cir.call @_mm512_mask_shldv_epi64
|
||||
// LLVM-LABEL: @test_mm512_mask_shldv_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// LLVM: select <8 x i1> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldv_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64>
|
||||
// OGCG: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
|
||||
return _mm512_mask_shldv_epi64(s, u, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shldv_epi32(__m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_shldv_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !u32i>, !cir.vector<16 x !u32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !u32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !u32i> -> !cir.vector<8 x !s64i>
|
||||
// CIR-LABEL: test_mm512_shldv_epi32
|
||||
// CIR: cir.call @_mm512_shldv_epi32
|
||||
// LLVM-LABEL: @test_mm512_shldv_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_shldv_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32>
|
||||
return _mm512_shldv_epi32(s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldv_epi16(__m512i s, __mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @_mm512_mask_shldv_epi16
|
||||
// CIR: cir.call @_mm512_shldv_epi16(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<32 x !s16i>
|
||||
// CIR-LABEL: @test_mm512_mask_shldv_epi16
|
||||
// CIR: cir.call @_mm512_mask_shldv_epi16
|
||||
// LLVM-LABEL: @test_mm512_mask_shldv_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldv_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16>
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_mask_shldv_epi16(s, u, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shldv_epi16(__mmask32 u, __m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_maskz_shldv_epi16
|
||||
// CIR: cir.call @_mm512_shldv_epi16(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<32 x !s16i>
|
||||
// CIR-LABEL: @test_mm512_maskz_shldv_epi16
|
||||
// CIR: cir.call @_mm512_maskz_shldv_epi16
|
||||
// LLVM-LABEL: @test_mm512_maskz_shldv_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shldv_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16>
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_maskz_shldv_epi16(u, s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shldv_epi16(__m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_shldv_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}}{{.*}} : (!cir.vector<32 x !u16i>, !cir.vector<32 x !u16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !u16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !u16i> -> !cir.vector<8 x !s64i>
|
||||
// CIR-LABEL: @test_mm512_shldv_epi16
|
||||
// CIR: cir.call @_mm512_shldv_epi16
|
||||
// LLVM-LABEL: @test_mm512_shldv_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_shldv_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16>
|
||||
return _mm512_shldv_epi16(s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shrdi_epi64(__m512i s, __mmask8 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_mask_shrdi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_mask_shrdi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 47))
|
||||
// LLVM: select <8 x i1> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_mask_shrdi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 47))
|
||||
// OGCG: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
|
||||
return _mm512_mask_shrdi_epi64(s, u, a, b, 47);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shrdi_epi64(__mmask8 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_maskz_shrdi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.call @_mm512_setzero_si512() {{.*}} : () -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !u8i -> !cir.vector<8 x !cir.int<s, 1>>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shrdi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 63))
|
||||
// LLVM: select <8 x i1> {{.*}}, <8 x i64> {{.*}}, <8 x i64>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shrdi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 63))
|
||||
// OGCG: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
|
||||
return _mm512_maskz_shrdi_epi64(u, a, b, 63);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shrdi_epi64(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_shrdi_epi64
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !u64i>) -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shrdi_epi64
|
||||
// LLVM: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> {{.*}}, <8 x i64> {{.*}}, <8 x i64> splat (i64 31))
|
||||
// OGCG-LABEL: @test_mm512_shrdi_epi64
|
||||
// OGCG: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> splat (i64 31))
|
||||
return _mm512_shrdi_epi64(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shrdi_epi32(__m512i s, __mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_mask_shrdi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !s32i> -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// LLVM-LABEL: @test_mm512_mask_shrdi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 7))
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_mask_shrdi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 7))
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_mask_shrdi_epi32(s, u, a, b, 7);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shrdi_epi32(__mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_maskz_shrdi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !s32i> -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shrdi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 15))
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shrdi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 15))
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_maskz_shrdi_epi32(u, a, b, 15);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shrdi_epi32(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_shrdi_epi32
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>, !cir.vector<16 x !u32i>) -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<16 x !s32i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shrdi_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32> splat (i32 31))
|
||||
// OGCG-LABEL: @test_mm512_shrdi_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> splat (i32 31))
|
||||
return _mm512_shrdi_epi32(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shrdi_epi16(__m512i s, __mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_mask_shrdi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<32 x !cir.int<s, 1>>, !cir.vector<32 x !s16i>
|
||||
// LLVM-LABEL: @test_mm512_mask_shrdi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 3))
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_mask_shrdi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 3))
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_mask_shrdi_epi16(s, u, a, b, 3);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shrdi_epi16(__mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_maskz_shrdi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<32 x !cir.int<s, 1>>, !cir.vector<32 x !s16i>
|
||||
// LLVM-LABEL: @test_mm512_maskz_shrdi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 15))
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shrdi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 15))
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_maskz_shrdi_epi16(u, a, b, 15);
|
||||
}
|
||||
|
||||
__m512i test_mm512_shrdi_epi16(__m512i a, __m512i b) {
|
||||
// CIR-LABEL: @test_mm512_shrdi_epi16
|
||||
// CIR: cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<32 x !s16i>, !cir.vector<32 x !s16i>, !cir.vector<32 x !u16i>) -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<32 x !s16i> -> !cir.vector<8 x !s64i>
|
||||
// LLVM-LABEL: @test_mm512_shrdi_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16> splat (i16 31))
|
||||
// OGCG-LABEL: @test_mm512_shrdi_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> splat (i16 31))
|
||||
return _mm512_shrdi_epi16(a, b, 31);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shldv_epi32(__m512i s, __mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_mask_shldv_epi32
|
||||
// CIR: cir.call @_mm512_shldv_epi32(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// CIR-LABEL: test_mm512_mask_shldv_epi32
|
||||
// CIR: cir.call @_mm512_mask_shldv_epi32
|
||||
// LLVM-LABEL: @test_mm512_mask_shldv_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_mask_shldv_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32>
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_mask_shldv_epi32(s, u, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shldv_epi32(__mmask16 u, __m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_maskz_shldv_epi32
|
||||
// CIR: cir.call @_mm512_shldv_epi32(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.call @_mm512_setzero_si512() {{.*}} : () -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// CIR-LABEL: test_mm512_maskz_shldv_epi32
|
||||
// CIR: cir.call @_mm512_maskz_shldv_epi32
|
||||
// LLVM-LABEL: @test_mm512_maskz_shldv_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shldv_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32>
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_maskz_shldv_epi32(u, s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shrdv_epi32(__m512i s, __mmask16 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: @_mm512_shrdv_epi32
|
||||
// CIR: cir.call @_mm512_shrdv_epi32(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// CIR-LABEL: @test_mm512_mask_shrdv_epi32
|
||||
// CIR: cir.call @_mm512_mask_shrdv_epi32
|
||||
// LLVM-LABEL: @test_mm512_mask_shrdv_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_mask_shrdv_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32>
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_mask_shrdv_epi32(s, u, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_maskz_shrdv_epi32(__mmask16 u, __m512i s, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_maskz_shrdv_epi32
|
||||
// CIR: cir.call @_mm512_shrdv_epi32(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<16 x !s32i>
|
||||
// CIR: cir.call @_mm512_setzero_si512() {{.*}} : () -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<16 x !cir.int<s, 1>>, !cir.vector<16 x !s32i>
|
||||
// CIR-LABEL: test_mm512_maskz_shrdv_epi32
|
||||
// CIR: cir.call @_mm512_maskz_shrdv_epi32
|
||||
// LLVM-LABEL: @test_mm512_maskz_shrdv_epi32
|
||||
// LLVM: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// LLVM: select <16 x i1> {{.*}}, <16 x i32> {{.*}}, <16 x i32>
|
||||
// OGCG-LABEL: @test_mm512_maskz_shrdv_epi32
|
||||
// OGCG: call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32>
|
||||
// OGCG: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
|
||||
return _mm512_maskz_shrdv_epi32(u, s, a, b);
|
||||
}
|
||||
|
||||
__m512i test_mm512_mask_shrdv_epi16(__m512i s, __mmask32 u, __m512i a, __m512i b) {
|
||||
// CIR-LABEL: _mm512_mask_shrdv_epi16
|
||||
// CIR: cir.call @_mm512_shrdv_epi16(%{{.*}}, %{{.*}}, %{{.*}}){{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !cir.vector<8 x !s64i>
|
||||
// CIR: cir.cast bitcast %{{.*}} : !cir.vector<8 x !s64i> -> !cir.vector<32 x !s16i>
|
||||
// CIR: cir.vec.ternary(%{{.*}}, %{{.*}}, %{{.*}}) : !cir.vector<32 x !cir.int<s, 1>>, !cir.vector<32 x !s16i>
|
||||
// CIR-LABEL: test_mm512_mask_shrdv_epi16
|
||||
// CIR: cir.call @_mm512_mask_shrdv_epi16
|
||||
// LLVM: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// LLVM: select <32 x i1> {{.*}}, <32 x i16> {{.*}}, <32 x i16>
|
||||
// OGCG-LABEL: @test_mm512_mask_shrdv_epi16
|
||||
// OGCG: call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16>
|
||||
// OGCG: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
|
||||
return _mm512_mask_shrdv_epi16(s, u, a, b);
|
||||
}
|
||||
@ -6,6 +6,7 @@
|
||||
// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG
|
||||
|
||||
typedef int vint4 __attribute__((ext_vector_type(4)));
|
||||
typedef short vshort8 __attribute__((ext_vector_type(8)));
|
||||
typedef float vfloat4 __attribute__((ext_vector_type(4)));
|
||||
typedef double vdouble4 __attribute__((ext_vector_type(4)));
|
||||
|
||||
@ -116,3 +117,89 @@ void test_builtin_elementwise_cos(float f, double d, vfloat4 vf4,
|
||||
// OGCG: {{%.*}} = call <4 x double> @llvm.cos.v4f64(<4 x double> {{%.*}})
|
||||
vd4 = __builtin_elementwise_cos(vd4);
|
||||
}
|
||||
|
||||
void test_builtin_elementwise_fshl(long long int i1, long long int i2,
|
||||
long long int i3, unsigned short us1,
|
||||
unsigned short us2, unsigned short us3,
|
||||
char c1, char c2, char c3,
|
||||
unsigned char uc1, unsigned char uc2,
|
||||
unsigned char uc3, vshort8 vi1,
|
||||
vshort8 vi2, vshort8 vi3, vint4 vu1,
|
||||
vint4 vu2, vint4 vu3) {
|
||||
// CIR-LABEL: test_builtin_elementwise_fshl
|
||||
// LLVM-LABEL: test_builtin_elementwise_fshl
|
||||
// OGCG-LABEL: test_builtin_elementwise_fshl
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!s64i, !s64i, !s64i) -> !s64i
|
||||
// LLVM: %{{.*}} = call i64 @llvm.fshl.i64(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i64 @llvm.fshl.i64(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
|
||||
i1 = __builtin_elementwise_fshl(i1, i2, i3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!u16i, !u16i, !u16i) -> !u16i
|
||||
// LLVM: %{{.*}} = call i16 @llvm.fshl.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i16 @llvm.fshl.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
|
||||
us1 = __builtin_elementwise_fshl(us1, us2, us3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!s8i, !s8i, !s8i) -> !s8i
|
||||
// LLVM: %{{.*}} = call i8 @llvm.fshl.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i8 @llvm.fshl.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
c1 = __builtin_elementwise_fshl(c1, c2, c3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!u8i, !u8i, !u8i) -> !u8i
|
||||
// LLVM: %{{.*}} = call i8 @llvm.fshl.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i8 @llvm.fshl.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
uc1 = __builtin_elementwise_fshl(uc1, uc2, uc3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s16i>, !cir.vector<8 x !s16i>, !cir.vector<8 x !s16i>) -> !cir.vector<8 x !s16i>
|
||||
// LLVM: %{{.*}} = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i16> %{{.*}})
|
||||
// OGCG: %{{.*}} = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i16> %{{.*}})
|
||||
vi1 = __builtin_elementwise_fshl(vi1, vi2, vi3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshl" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
|
||||
// LLVM: %{{.*}} = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}})
|
||||
// OGCG: %{{.*}} = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}})
|
||||
vu1 = __builtin_elementwise_fshl(vu1, vu2, vu3);
|
||||
}
|
||||
|
||||
void test_builtin_elementwise_fshr(long long int i1, long long int i2,
|
||||
long long int i3, unsigned short us1,
|
||||
unsigned short us2, unsigned short us3,
|
||||
char c1, char c2, char c3,
|
||||
unsigned char uc1, unsigned char uc2,
|
||||
unsigned char uc3, vshort8 vi1,
|
||||
vshort8 vi2, vshort8 vi3, vint4 vu1,
|
||||
vint4 vu2, vint4 vu3) {
|
||||
// CIR-LABEL: test_builtin_elementwise_fshr
|
||||
// LLVM-LABEL: test_builtin_elementwise_fshr
|
||||
// OGCG-LABEL: test_builtin_elementwise_fshr
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!s64i, !s64i, !s64i) -> !s64i
|
||||
// LLVM: %{{.*}} = call i64 @llvm.fshr.i64(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i64 @llvm.fshr.i64(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}})
|
||||
i1 = __builtin_elementwise_fshr(i1, i2, i3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!u16i, !u16i, !u16i) -> !u16i
|
||||
// LLVM: %{{.*}} = call i16 @llvm.fshr.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i16 @llvm.fshr.i16(i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}})
|
||||
us1 = __builtin_elementwise_fshr(us1, us2, us3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!s8i, !s8i, !s8i) -> !s8i
|
||||
// LLVM: %{{.*}} = call i8 @llvm.fshr.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i8 @llvm.fshr.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
c1 = __builtin_elementwise_fshr(c1, c2, c3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!u8i, !u8i, !u8i) -> !u8i
|
||||
// LLVM: %{{.*}} = call i8 @llvm.fshr.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
// OGCG: %{{.*}} = call i8 @llvm.fshr.i8(i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}})
|
||||
uc1 = __builtin_elementwise_fshr(uc1, uc2, uc3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<8 x !s16i>, !cir.vector<8 x !s16i>, !cir.vector<8 x !s16i>) -> !cir.vector<8 x !s16i>
|
||||
// LLVM: %{{.*}} = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i16> %{{.*}})
|
||||
// OGCG: %{{.*}} = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i16> %{{.*}})
|
||||
vi1 = __builtin_elementwise_fshr(vi1, vi2, vi3);
|
||||
|
||||
// CIR: %{{.*}} = cir.call_llvm_intrinsic "fshr" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
|
||||
// LLVM: %{{.*}} = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}})
|
||||
// OGCG: %{{.*}} = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}})
|
||||
vu1 = __builtin_elementwise_fshr(vu1, vu2, vu3);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user