* Add Linux ppc64le (PowerPC64) architecture support using generic targets Add ppc64le as a new architecture in ISPC, enabling compilation for POWER8+ (POWER ISA 3.0) processors using the existing generic target system (generic-i1x4 through generic-i64x4). Key changes: - Add Arch::ppc64le enum and parsing/serialization support - Add CPU_PPC64LE_Generic device type with pwr8 baseline and +vsx features - Initialize LLVM PowerPC backend when ISPC_PPC64_ENABLED is defined - Generate ppc64le-linux-gnu triple for the target - Auto-detect ppc64le host architecture and default to generic-i32x4 - Add PPC64_ENABLED CMake option (OFF by default) with powerpc LLVM component - Add ppc64le support to builtin generation (GenerateBuiltins.cmake, GenericTargets.cmake, bitcode2cpp.py) - Add PowerPC to LLVM_TARGETS_TO_BUILD in alloy.py and superbuild - Add lit test infrastructure: PPC64_ENABLED feature flag, PPC64LE_HOST detection, and generic-target-ppc64le.ispc test - Mark 5 tests UNSUPPORTED on PPC64LE_HOST due to known issues: gather/scatter assertion, LLVM selection failures, missing rcp stdlib, and ABI signext mismatch Tested on Fedora 43 ppc64le (POWER8+) with LLVM 20: 425 tests passed, 267 unsupported, 3 expectedly failed, 0 failures. * Add ppc64le to supported architectures in documentation Update ispc.rst to list ppc64le in supported architectures and add experimental PowerPC64 support entry to v1.31.0 release notes. * Add ppc64le support to examples timing utility Add __powerpc64__ to the architecture guard in timing.h so it uses gettimeofday-based timing instead of x86 inline assembly (rdtsc/cpuid) on PowerPC64 hosts. * Add ppc64le support to example CMake build system Add ppc64le architecture detection and generic target selection to the example build system. On ppc64le, examples default to generic-i32x4 target. Also guard x86-specific -m32/-m64 compiler flags to only apply on x86 architectures. All 15 CPU examples build and pass on ppc64le. * Fix generic-target build and ppc64le arch inference for cross-compilation Fix missing build dependencies for the generic-target CMake OBJECT library: - Add GENERATED property to generated CPP source files - Add add_dependencies on generic-target-cpp and generic-stdlib-cpp targets - Move configure_ispc_obj(generic-target) into add_ispc_slim() so include directories are set in both slim and composite binary paths Fix lGetArchFromTarget to correctly infer ppc64le architecture when cross-compiling with --cpu=ppc64le on non-PPC hosts. Previously the arch inference was entirely host-guarded, causing it to fall through to x86_64. * Address PR review: fix ppc64le triple, add test runner support and asm test - Fix ppc64le LLVM triple to use canonical 'powerpc64le' prefix instead of 'ppc64le' in cmake/GenerateBuiltins.cmake - Add ppc64le support to scripts/run_tests.py: target config, gcc_arch flags, and default target/arch detection for ppc64le hosts - Add ppc64le-vector-asm.ispc lit test verifying PowerPC VSX vector instructions (xvaddsp, xvmulsp) are generated for generic targets * Revert autoformatted changes * Document reasons for ppc64le UNSUPPORTED test skips Add explanatory comments to all lit tests marked UNSUPPORTED on ppc64le: - stdlib-short-vec-funcs-3: LLVM 20 can't select froundeven for vectors - stdlib-short-vec-funcs-6: LLVM 20 can't promote atan2/pow/fmod results Both are fixed in LLVM 21 (PR llvm/llvm-project#150597) - fast_math_opt: generic target rcp uses fdiv, failing CHECK_NOFDIV - num-limits: ABI mismatch for int8/int16 returns between ISPC and clang - 2169: ISPC assertion in integer divide optimization for generic targets * Make ppc64le LLVM bug test skips version-conditional Use 'UNSUPPORTED: PPC64LE_HOST && !LLVM_21_0+' instead of unconditional 'UNSUPPORTED: PPC64LE_HOST' for tests that fail due to LLVM 20 PowerPC backend bugs fixed in LLVM 21. This automatically re-enables the tests when ISPC is built with LLVM 21+. * s/UNSUPPORTED/XFAIL * Add -mcpu * Update docs * Add PPC64 CI workflow with Ubuntu + QEMU for lit tests * Fix check_isa to guard PPC64LE detection with endianness check * Re-align with default target * Revert all changes made to docs/ispc.rst * Add functional tests to PPC64 CI workflow via QEMU * Disable ispcrt build in PPC64 CI to avoid TBB dependency * Install libtbb-dev instead of disabling ispcrt in PPC64 CI * Disable X86 and ARM targets in PPC64 CI to avoid missing 32-bit headers * Install gcc-multilib and re-enable all targets in PPC64 CI * Install python3-dev for examples build in PPC64 CI * Switch PPC64 CI to Ubuntu 25.10 with native LLVM 20 packages * Fix LLVM tools package name to llvm-20-tools for Ubuntu 25.10 * Replace gcc-multilib with cross-compilation headers in PPC64 CI Use libc6-dev-i386-cross and libc6-dev-armhf-cross instead of gcc-multilib to provide 32-bit headers for builtin compilation. This avoids the package conflict between gcc-multilib and gcc-powerpc64le-linux-gnu on Ubuntu 25.10. * Add libstdc++-15-dev for host C++ linking in PPC64 CI clang++ needs libstdc++-dev to link C++ programs on the host. Previously gcc-multilib pulled this in as a dependency; now that we use cross packages instead, we need to install it explicitly. * Create FileCheck symlink for unversioned lookup in PPC64 CI Ubuntu 25.10 installs FileCheck as FileCheck-20 (versioned), but ISPC's CMake FindLLVM.cmake looks for the unversioned name. Create a symlink to resolve this. Tested locally: full build + lit tests pass in Ubuntu 25.10 Docker. * Revert configure_ispc_obj(generic-target) move, no longer needed after #3739 * Fix PPC64 CI: build only PPC64 target, remove unnecessary cross-compilation packages Disable ARM and x86 targets in the PPC64 CI workflow since they are not needed and cause build failures due to missing cross-compilation headers in the container. Also remove libc6-dev-i386-cross and libc6-dev-armhf-cross packages that were only needed for those targets. * Fix PPC64 CI: keep X86 enabled for host lit tests, remove build artifacts Remove -DX86_ENABLED=OFF from the PPC64 CI cmake command since lit tests use --target=host which detects x86 on the CI runner. Remove set_source_files_properties and add_dependencies lines from GenericTargets.cmake that were artifacts of the configure_ispc_obj move reverted in c1a2b488. * fix: Fix PPC64LE pipeline * Add pipeline running on native runner * Add sudo to apt-get install commands in workflow * Consolidate pipelines * Skip miscompiled float16 tests on ppc64le and fix native runner - Add '// rule: skip on arch=ppc64le' to 54 float16/f16 functional tests that fail compilation on ppc64le - Drop g++-multilib from native runner (unavailable on ppc64le) - Add -DX86_ENABLED=OFF to native runner cmake to avoid x86 dependencies * Refactor ppc64le arch inference out of lGetArchFromTarget Revert lGetArchFromTarget to its original single-parameter signature and move the cross-compilation arch fix-up for ppc64le to the call site. This keeps the function focused on target-to-arch mapping and handles the CPU-based override separately. * Rename ppc64le CPU identifier to pwr8 Use 'pwr8' instead of 'ppc64le' as the CPU name for the generic PPC64LE target, aligning the --cpu flag value with the actual LLVM CPU name that was already being set internally. * Skip float16 func tests on ppc64le due to missing fp16 support * Install LLVM 19 packages for native ppc64le CI runner * fix: clean up * fix: install libclang-19-dev * fix: s/generic/pwr8 * func-tests: skip round() varying float tests on ppc64le LLVM PowerPC backend (POWER8) cannot lower @llvm.roundeven for vector types (v4f32), which the generic builtin path uses for round(). Skip these tests on ppc64le until a target-specific implementation is added. * doc: clean up * doc: move PowerPC support to new ISPC 1.31.0 section
10 lines
352 B
Plaintext
10 lines
352 B
Plaintext
// rule: skip on arch=ppc64le
|
|
#include "test_static.isph"
|
|
task void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
|
float16 a = aFOO[programIndex];
|
|
float16 rot = rotate(a, -1);
|
|
RET[programIndex] = rot;
|
|
}
|
|
|
|
task void result(uniform float RET[]) { RET[programIndex] = 1 + (programIndex + programCount - 1) % programCount; }
|