Files
TheRock/compiler/amd-llvm/clang/test/CodeGen/X86/vpclmulqdq-builtins.c
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

96 lines
8.5 KiB
C

// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -emit-llvm -o - | FileCheck %s --check-prefix AVX
// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -target-feature +avx512f -emit-llvm -o - | FileCheck %s --check-prefixes AVX,AVX512
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -emit-llvm -o - -std=c++11 | FileCheck %s --check-prefix AVX
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -target-feature +avx512f -emit-llvm -o - -std=c++11 | FileCheck %s --check-prefixes AVX,AVX512
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -emit-llvm -o - -std=c++11 -fexperimental-new-constant-interpreter | FileCheck %s --check-prefix AVX
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +vpclmulqdq -target-feature +avx512f -emit-llvm -o - -std=c++11 -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes AVX,AVX512
#include <immintrin.h>
#include "builtin_test_helpers.h"
__m256i test_mm256_clmulepi64_epi128(__m256i A, __m256i B) {
// AVX: @llvm.x86.pclmulqdq.256
return _mm256_clmulepi64_epi128(A, B, 0);
}
// Test constexpr evaluation for _mm256_clmulepi64_epi128
// Each 128-bit lane is processed independently
// Basic test cases for all imm8 values (0x00, 0x01, 0x10, 0x11)
// imm8=0x00: lower 64 bits of both operands in each lane
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL}), ((__m256i){0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL}), 0x00), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL));
// imm8=0x01: upper 64 bits of first operand, lower 64 bits of second in each lane
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL}), ((__m256i){0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL}), 0x01), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL));
// imm8=0x10: lower 64 bits of first operand, upper 64 bits of second in each lane
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL}), ((__m256i){0x0ULL, 0x3ULL, 0x0ULL, 0x5ULL}), 0x10), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL));
// imm8=0x11: upper 64 bits of both operands in each lane
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL}), ((__m256i){0x0ULL, 0x3ULL, 0x0ULL, 0x5ULL}), 0x11), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL));
// Complex test cases with edge values and non-zero upper 64-bit results
// Test with high bit set (0x8000000000000000) - produces result with upper bits
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){(long long)0x8000000000000000ULL, 0x0ULL, (long long)0x8000000000000000ULL, 0x0ULL}), ((__m256i){0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL}), 0x00), 0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL));
// Test with all bits set (0xFFFFFFFFFFFFFFFF) - maximum value
// imm8=0x01: upper(A) * lower(B) for each 128-bit lane
// For lane 0: upper(0xFFFFFFFFFFFFFFFF) * lower(0x2)
// For lane 1: upper(0xFFFFFFFFFFFFFFFF) * lower(0x3)
// Note: This test case removed due to complexity - using simpler edge cases instead
// Test with large values that cause carry propagation
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){(long long)0x1000000000000000ULL, 0x0ULL, (long long)0x2000000000000000ULL, 0x0ULL}), ((__m256i){0x0ULL, 0x10ULL, 0x0ULL, 0x20ULL}), 0x10), 0x0ULL, 0x1ULL, 0x0ULL, 0x4ULL));
// Test with values that produce results in upper 64 bits
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL}), ((__m256i){0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL}), 0x11), 0x1ULL, 0x4000000000000000ULL, 0x1ULL, 0x4000000000000000ULL));
// Test with polynomial-like values (common in CRC/GCM)
// x^63 + x^62 + ... + x + 1 = 0xFFFFFFFFFFFFFFFF
// x^64 = 0x10000000000000000 (represented as upper 64 bits = 1)
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x1ULL, 0x0ULL, (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL}), ((__m256i){(long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, 0x1ULL, 0x0ULL}), 0x00), (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL));
// Test with sparse polynomials (few bits set)
TEST_CONSTEXPR(match_m256i(_mm256_clmulepi64_epi128(((__m256i){0x5ULL, 0x0ULL, 0x9ULL, 0x0ULL}), ((__m256i){0x3ULL, 0x0ULL, 0x7ULL, 0x0ULL}), 0x00), 0xfULL, 0x0ULL, 0x3fULL, 0x0ULL));
#ifdef __AVX512F__
__m512i test_mm512_clmulepi64_epi128(__m512i A, __m512i B) {
// AVX512: @llvm.x86.pclmulqdq.512
return _mm512_clmulepi64_epi128(A, B, 0);
}
// Test constexpr evaluation for _mm512_clmulepi64_epi128
// Each 128-bit lane is processed independently
// Basic test cases for all imm8 values (0x00, 0x01, 0x10, 0x11)
// imm8=0x00: lower 64 bits of both operands in each lane
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL, 0x0ULL}), ((__m512i){0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL, 0x7ULL, 0x0ULL, 0x9ULL, 0x0ULL}), 0x00), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL, 0x1cULL, 0x0ULL, 0x48ULL, 0x0ULL));
// imm8=0x01: upper 64 bits of first operand, lower 64 bits of second in each lane
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL}), ((__m512i){0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL, 0x7ULL, 0x0ULL, 0x9ULL, 0x0ULL}), 0x01), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL, 0x1cULL, 0x0ULL, 0x48ULL, 0x0ULL));
// imm8=0x10: lower 64 bits of first operand, upper 64 bits of second in each lane
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL, 0x0ULL}), ((__m512i){0x0ULL, 0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL, 0x7ULL, 0x0ULL, 0x9ULL}), 0x10), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL, 0x1cULL, 0x0ULL, 0x48ULL, 0x0ULL));
// imm8=0x11: upper 64 bits of both operands in each lane
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL}), ((__m512i){0x0ULL, 0x3ULL, 0x0ULL, 0x5ULL, 0x0ULL, 0x7ULL, 0x0ULL, 0x9ULL}), 0x11), 0x3ULL, 0x0ULL, 0xaULL, 0x0ULL, 0x1cULL, 0x0ULL, 0x48ULL, 0x0ULL));
// Complex test cases with edge values and non-zero upper 64-bit results
// Test with high bit set (0x8000000000000000) - produces result with upper bits
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){(long long)0x8000000000000000ULL, 0x0ULL, (long long)0x8000000000000000ULL, 0x0ULL, (long long)0x8000000000000000ULL, 0x0ULL, (long long)0x8000000000000000ULL, 0x0ULL}), ((__m512i){0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL, 0x0ULL, 0x10ULL, 0x0ULL}), 0x00), 0x0ULL, 0x1ULL, 0x0ULL, 0x2ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x8ULL));
// Test with all bits set (0xFFFFFFFFFFFFFFFF) - maximum value
// Note: Complex test case with all 1s removed - using simpler edge cases instead
// Test with large values that cause carry propagation
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){(long long)0x1000000000000000ULL, 0x0ULL, (long long)0x2000000000000000ULL, 0x0ULL, (long long)0x4000000000000000ULL, 0x0ULL, (long long)0x8000000000000000ULL, 0x0ULL}), ((__m512i){0x0ULL, 0x10ULL, 0x0ULL, 0x20ULL, 0x0ULL, 0x40ULL, 0x0ULL, 0x80ULL}), 0x10), 0x0ULL, 0x1ULL, 0x0ULL, 0x4ULL, 0x0ULL, 0x10ULL, 0x0ULL, 0x40ULL));
// Test with values that produce results in upper 64 bits
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL}), ((__m512i){0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL, 0x0ULL, (long long)0x8000000000000001ULL}), 0x11), 0x1ULL, 0x4000000000000000ULL, 0x1ULL, 0x4000000000000000ULL, 0x1ULL, 0x4000000000000000ULL, 0x1ULL, 0x4000000000000000ULL));
// Test with polynomial-like values (common in CRC/GCM) across all lanes
TEST_CONSTEXPR(match_m512i(_mm512_clmulepi64_epi128(((__m512i){0x1ULL, 0x0ULL, (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, 0x5ULL, 0x0ULL, 0x9ULL, 0x0ULL}), ((__m512i){(long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, 0x1ULL, 0x0ULL, 0x3ULL, 0x0ULL, 0x7ULL, 0x0ULL}), 0x00), (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, (long long)0xFFFFFFFFFFFFFFFFULL, 0x0ULL, 0xfULL, 0x0ULL, 0x3fULL, 0x0ULL));
#endif