Squashed 'FFTS/Sources/FFTS/' content from commit d11c3e7
git-subtree-dir: FFTS/Sources/FFTS git-subtree-split: d11c3e76200e619d35e2d898a28a1c5641a366f4
This commit is contained in:
29
.gitignore
vendored
Normal file
29
.gitignore
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
*.o
|
||||||
|
*.Po
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lai
|
||||||
|
*.lo
|
||||||
|
*.Plo
|
||||||
|
*.so
|
||||||
|
*~
|
||||||
|
*.log
|
||||||
|
*.swp
|
||||||
|
*.cache/*
|
||||||
|
|
||||||
|
*Makefile
|
||||||
|
|
||||||
|
config.h
|
||||||
|
config.status
|
||||||
|
compile
|
||||||
|
libtool
|
||||||
|
ffts.pc
|
||||||
|
stamp-h1
|
||||||
|
tests/test
|
||||||
|
|
||||||
|
java/android/local.properties
|
||||||
|
java/android/gen/*
|
||||||
|
java/android/obj/*
|
||||||
|
java/android/bin/*
|
||||||
|
|
||||||
|
build
|
||||||
12
.travis.yml
Normal file
12
.travis.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
language: c
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- cmake
|
||||||
|
sources:
|
||||||
|
- kubuntu-backports
|
||||||
|
script:
|
||||||
|
- mkdir build && cd build && cmake .. && cmake --build .
|
||||||
6
AUTHORS
Normal file
6
AUTHORS
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
FFTS was developed at the University of Waikato by Anthony Blake <amb@anthonix.com>
|
||||||
|
|
||||||
|
The following authors have also graciously contributed code:
|
||||||
|
|
||||||
|
Michael Zucchi <notzed@gmail.com> -- JNI java/android support
|
||||||
|
Michael Cree <mcree@orcon.net.nz> -- Architecture specific code, including support for Altivec and DEC Alpha
|
||||||
626
CMakeLists.txt
Normal file
626
CMakeLists.txt
Normal file
@@ -0,0 +1,626 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(ffts C ASM)
|
||||||
|
|
||||||
|
# TODO: to support AutoConfigure building, this should came from "template" file
|
||||||
|
set(FFTS_MAJOR 0)
|
||||||
|
set(FFTS_MINOR 9)
|
||||||
|
set(FFTS_MICRO 0)
|
||||||
|
|
||||||
|
set(FFTS_VERSION "${FFTS_MAJOR}.${FFTS_MINOR}.${FFTS_MICRO}")
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
|
# default build type is Debug which means no optimization
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE "Release")
|
||||||
|
endif(NOT CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
|
# installation parameters
|
||||||
|
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/ffts)
|
||||||
|
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib)
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_COMPILER_GCCLIKE OFF)
|
||||||
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||||
|
# using Clang
|
||||||
|
set(CMAKE_COMPILER_GCCLIKE ON)
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
# using GCC
|
||||||
|
set(CMAKE_COMPILER_GCCLIKE ON)
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
|
||||||
|
# using Intel C++
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
||||||
|
# using Visual Studio C++
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# common options
|
||||||
|
|
||||||
|
# !!!! FOR TESTING ONLY !!!!
|
||||||
|
option(ENABLE_AVX
|
||||||
|
"Enables AVX instructions." OFF
|
||||||
|
)
|
||||||
|
# !!!! FOR TESTING ONLY !!!!
|
||||||
|
option(ENABLE_DOUBLE
|
||||||
|
"Enables double precision" OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(ENABLE_NEON
|
||||||
|
"Enables the use of NEON instructions." OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(ENABLE_VFP
|
||||||
|
"Enables the use of VFP instructions." OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(DISABLE_DYNAMIC_CODE
|
||||||
|
"Disables the use of dynamic machine code generation." OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(GENERATE_POSITION_INDEPENDENT_CODE
|
||||||
|
"Generate position independent code" OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(ENABLE_SHARED
|
||||||
|
"Enable building a shared library." OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
option(ENABLE_STATIC
|
||||||
|
"Enable building a static library." ON
|
||||||
|
)
|
||||||
|
|
||||||
|
include(CheckCSourceCompiles)
|
||||||
|
include(CheckCSourceRuns)
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
|
# Ensure defined when building FFTS (as opposed to using it from
|
||||||
|
# another project). Used to export functions from Windows DLL.
|
||||||
|
add_definitions(-DFFTS_BUILD)
|
||||||
|
|
||||||
|
# check existence of various headers
|
||||||
|
check_include_file(inttypes.h HAVE_INTTYPES_H)
|
||||||
|
check_include_file(malloc.h HAVE_MALLOC_H)
|
||||||
|
check_include_file(mm_malloc.h HAVE_MM_MALLOC_H)
|
||||||
|
check_include_file(stdint.h HAVE_STDINT_H)
|
||||||
|
check_include_file(stdlib.h HAVE_STDLIB_H)
|
||||||
|
check_include_file(string.h HAVE_STRING_H)
|
||||||
|
check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
|
||||||
|
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||||
|
|
||||||
|
if(HAVE_INTTYPES_H)
|
||||||
|
add_definitions(-DHAVE_INTTYPES_H)
|
||||||
|
endif(HAVE_INTTYPES_H)
|
||||||
|
|
||||||
|
if(HAVE_MALLOC_H)
|
||||||
|
add_definitions(-DHAVE_MALLOC_H)
|
||||||
|
endif(HAVE_MALLOC_H)
|
||||||
|
|
||||||
|
if(HAVE_MM_MALLOC_H)
|
||||||
|
add_definitions(-DHAVE_MM_MALLOC_H)
|
||||||
|
endif(HAVE_MM_MALLOC_H)
|
||||||
|
|
||||||
|
if(HAVE_STDINT_H)
|
||||||
|
add_definitions(-DHAVE_STDINT_H)
|
||||||
|
endif(HAVE_STDINT_H)
|
||||||
|
|
||||||
|
if(HAVE_STDLIB_H)
|
||||||
|
add_definitions(-DHAVE_STDLIB_H)
|
||||||
|
endif(HAVE_STDLIB_H)
|
||||||
|
|
||||||
|
if(HAVE_STRING_H)
|
||||||
|
add_definitions(-DHAVE_STRING_H)
|
||||||
|
endif(HAVE_STRING_H)
|
||||||
|
|
||||||
|
if(HAVE_SYS_MMAN_H)
|
||||||
|
add_definitions(-DHAVE_SYS_MMAN_H)
|
||||||
|
endif(HAVE_SYS_MMAN_H)
|
||||||
|
|
||||||
|
if(HAVE_UNISTD_H)
|
||||||
|
add_definitions(-DHAVE_UNISTD_H)
|
||||||
|
endif(HAVE_UNISTD_H)
|
||||||
|
|
||||||
|
# check existence of various declarations
|
||||||
|
check_symbol_exists(memalign malloc.h HAVE_DECL_MEMALIGN)
|
||||||
|
check_symbol_exists(posix_memalign stdlib.h HAVE_DECL_POSIX_MEMALIGN)
|
||||||
|
check_symbol_exists(valloc stdlib.h HAVE_DECL_VALLOC)
|
||||||
|
check_symbol_exists(_mm_malloc malloc.h HAVE_DECL__MM_MALLOC)
|
||||||
|
|
||||||
|
if(HAVE_DECL_MEMALIGN)
|
||||||
|
add_definitions(-DHAVE_DECL_MEMALIGN)
|
||||||
|
endif(HAVE_DECL_MEMALIGN)
|
||||||
|
|
||||||
|
if(HAVE_DECL_POSIX_MEMALIGN)
|
||||||
|
add_definitions(-DHAVE_DECL_POSIX_MEMALIGN)
|
||||||
|
endif(HAVE_DECL_POSIX_MEMALIGN)
|
||||||
|
|
||||||
|
if(HAVE_DECL_VALLOC)
|
||||||
|
add_definitions(-DHAVE_DECL_VALLOC)
|
||||||
|
endif(HAVE_DECL_VALLOC)
|
||||||
|
|
||||||
|
if(HAVE_DECL__MM_MALLOC)
|
||||||
|
add_definitions(-DHAVE_DECL__MM_MALLOC)
|
||||||
|
endif(HAVE_DECL__MM_MALLOC)
|
||||||
|
|
||||||
|
# check existence of various functions
|
||||||
|
check_function_exists(memalign HAVE_MEMALIGN)
|
||||||
|
check_function_exists(posix_memalign HAVE_POSIX_MEMALIGN)
|
||||||
|
check_function_exists(valloc HAVE_VALLOC)
|
||||||
|
check_function_exists(_mm_malloc HAVE__MM_MALLOC)
|
||||||
|
|
||||||
|
if(HAVE_MEMALIGN)
|
||||||
|
add_definitions(-DHAVE_MEMALIGN)
|
||||||
|
endif(HAVE_MEMALIGN)
|
||||||
|
|
||||||
|
if(HAVE_POSIX_MEMALIGN)
|
||||||
|
add_definitions(-DHAVE_POSIX_MEMALIGN)
|
||||||
|
endif(HAVE_POSIX_MEMALIGN)
|
||||||
|
|
||||||
|
if(HAVE_VALLOC)
|
||||||
|
add_definitions(-DHAVE_VALLOC)
|
||||||
|
endif(HAVE_VALLOC)
|
||||||
|
|
||||||
|
if(HAVE__MM_MALLOC)
|
||||||
|
add_definitions(-DHAVE__MM_MALLOC)
|
||||||
|
endif(HAVE__MM_MALLOC)
|
||||||
|
|
||||||
|
# backup flags
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
|
||||||
|
# Determinate if we are cross-compiling
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING)
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
|
||||||
|
# Determinate ARM architecture
|
||||||
|
|
||||||
|
# Try to execute quietly without messages
|
||||||
|
set(CMAKE_REQUIRED_QUIET 1)
|
||||||
|
|
||||||
|
# The test for ARM architecture
|
||||||
|
set(TEST_SOURCE_CODE "int main() { return 0; }")
|
||||||
|
|
||||||
|
# GCC documentation says "native" is only supported on Linux, but let's try
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -march=native")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" GCC_MARCH_NATIVE_FLAG_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT GCC_MARCH_NATIVE_FLAG_SUPPORTED)
|
||||||
|
# Fallback trying generic ARMv7
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -march=armv7-a")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" GCC_MARCH_ARMV7A_FLAG_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT GCC_MARCH_ARMV7A_FLAG_SUPPORTED)
|
||||||
|
# Fallback trying generic ARMv6
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -march=armv6")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" GCC_MARCH_ARMV6_FLAG_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT GCC_MARCH_ARMV6_FLAG_SUPPORTED)
|
||||||
|
message(WARNING "FFTS failed to determinate ARM architecture")
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
|
||||||
|
else()
|
||||||
|
message("FFTS is build using 'march=armv6'")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=armv6")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv6")
|
||||||
|
endif(NOT GCC_MARCH_ARMV6_FLAG_SUPPORTED)
|
||||||
|
else()
|
||||||
|
message("FFTS is build using 'march=armv7-a'")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=armv7-a")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a")
|
||||||
|
endif(NOT GCC_MARCH_ARMV7A_FLAG_SUPPORTED)
|
||||||
|
else()
|
||||||
|
message("FFTS is build using 'march=native'")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=native")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
|
||||||
|
endif(NOT GCC_MARCH_NATIVE_FLAG_SUPPORTED)
|
||||||
|
|
||||||
|
# Determinate what floating-point hardware (or hardware emulation) is available
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
|
||||||
|
# The test for ARM NEON support
|
||||||
|
set(TEST_SOURCE_CODE "
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
float32x4_t v;
|
||||||
|
float zeros[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
v = vld1q_f32(zeros);
|
||||||
|
return 0;
|
||||||
|
}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test running with -mfpu=neon and -mfloat-abi=hard
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -mfpu=neon -mfloat-abi=hard")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" NEON_HARDFP_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT NEON_HARDFP_SUPPORTED)
|
||||||
|
# Test running with -mfpu=neon and -mfloat-abi=softfp
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -mfpu=neon -mfloat-abi=softfp")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" NEON_SOFTFP_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT NEON_SOFTFP_SUPPORTED)
|
||||||
|
if(ENABLE_NEON)
|
||||||
|
message(FATAL_ERROR "FFTS cannot enable NEON on this platform")
|
||||||
|
endif(ENABLE_NEON)
|
||||||
|
else()
|
||||||
|
message("FFTS is using 'neon' FPU and 'softfp' float ABI")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mfpu=neon -mfloat-abi=softfp")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon -mfloat-abi=softfp")
|
||||||
|
set(ENABLE_NEON ON)
|
||||||
|
endif(NOT NEON_SOFTFP_SUPPORTED)
|
||||||
|
else()
|
||||||
|
message("FFTS is using 'neon' FPU and 'hard' float ABI")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mfpu=neon -mfloat-abi=hard")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon -mfloat-abi=hard")
|
||||||
|
set(ENABLE_NEON ON)
|
||||||
|
endif(NOT NEON_HARDFP_SUPPORTED)
|
||||||
|
|
||||||
|
# Fallback using VFP if NEON is not supported
|
||||||
|
if(NOT NEON_HARDFP_SUPPORTED AND NOT NEON_SOFTFP_SUPPORTED)
|
||||||
|
# Test for ARM VFP support
|
||||||
|
set(TEST_SOURCE_CODE "
|
||||||
|
double sum(double a, double b)
|
||||||
|
{
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
double s1, s2, v1 = 1.0, v2 = 2.0, v3 = 1.0e-322;
|
||||||
|
s1 = sum(v1, v2);
|
||||||
|
s2 = sum(v3, v3);
|
||||||
|
return 0;
|
||||||
|
}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test running with -mfpu=vfp
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -mfpu=vfp")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" VFP_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT VFP_SUPPORTED)
|
||||||
|
# Fallback using emulation if VFP is not supported
|
||||||
|
if(ENABLE_VFP)
|
||||||
|
message(FATAL_ERROR "FFTS cannot enable VFP on this platform")
|
||||||
|
endif(ENABLE_VFP)
|
||||||
|
|
||||||
|
message(WARNING "FFTS is using 'soft' FPU")
|
||||||
|
else()
|
||||||
|
message("FFTS is using 'vfp' FPU")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mfpu=vfp")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp")
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
set(ENABLE_VFP ON)
|
||||||
|
endif(NOT VFP_SUPPORTED)
|
||||||
|
|
||||||
|
# Test running with -mfloat-abi=hard
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -mfloat-abi=hard")
|
||||||
|
|
||||||
|
# Use the same test as before
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" HARDFP_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT HARDFP_SUPPORTED)
|
||||||
|
# Test running with -mfloat-abi=softfp
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -mfloat-abi=softfp")
|
||||||
|
check_c_source_runs("${TEST_SOURCE_CODE}" SOFTFP_SUPPORTED)
|
||||||
|
|
||||||
|
if(NOT SOFTFP_SUPPORTED)
|
||||||
|
# Most likely development libraries are missing
|
||||||
|
message(WARNING "FFTS is using 'soft' float ABI")
|
||||||
|
else()
|
||||||
|
message("FFTS is using 'softfp' float ABI")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mfloat-abi=softfp")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp")
|
||||||
|
endif(NOT SOFTFP_SUPPORTED)
|
||||||
|
else()
|
||||||
|
message("FFTS is using 'hard' float ABI")
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mfloat-abi=hard")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=hard")
|
||||||
|
endif(NOT HARDFP_SUPPORTED)
|
||||||
|
endif(NOT NEON_HARDFP_SUPPORTED AND NOT NEON_SOFTFP_SUPPORTED)
|
||||||
|
else()
|
||||||
|
# enable SSE code generation
|
||||||
|
if(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -msse")
|
||||||
|
endif(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
|
||||||
|
# check if the platform has support for SSE intrinsics
|
||||||
|
check_include_file(xmmintrin.h HAVE_XMMINTRIN_H)
|
||||||
|
if(HAVE_XMMINTRIN_H)
|
||||||
|
add_definitions(-DHAVE_SSE)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
|
||||||
|
# TODO: not the right place
|
||||||
|
if(ENABLE_AVX)
|
||||||
|
add_definitions(-DHAVE_AVX)
|
||||||
|
endif(ENABLE_AVX)
|
||||||
|
if(ENABLE_DOUBLE)
|
||||||
|
add_definitions(-DFFTS_DOUBLE)
|
||||||
|
endif(ENABLE_DOUBLE)
|
||||||
|
endif(HAVE_XMMINTRIN_H)
|
||||||
|
|
||||||
|
# enable SSE2 code generation
|
||||||
|
if(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -msse2")
|
||||||
|
endif(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
|
||||||
|
# check if the platform has support for SSE2 intrinsics
|
||||||
|
check_include_file(emmintrin.h HAVE_EMMINTRIN_H)
|
||||||
|
if(HAVE_EMMINTRIN_H)
|
||||||
|
add_definitions(-DHAVE_SSE2)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
endif(HAVE_EMMINTRIN_H)
|
||||||
|
|
||||||
|
# enable SSE3 code generation
|
||||||
|
if(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} -msse3")
|
||||||
|
endif(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
|
||||||
|
# check if the platform has support for SSE3 intrinsics
|
||||||
|
check_include_file(pmmintrin.h HAVE_PMMINTRIN_H)
|
||||||
|
if(HAVE_PMMINTRIN_H)
|
||||||
|
add_definitions(-DHAVE_PMMINTRIN_H)
|
||||||
|
add_definitions(-DHAVE_SSE3)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
else()
|
||||||
|
# check if the platform has specific intrinsics
|
||||||
|
check_include_file(intrin.h HAVE_INTRIN_H)
|
||||||
|
if(HAVE_INTRIN_H)
|
||||||
|
add_definitions(-DHAVE_INTRIN_H)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include<intrin.h>
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
(void) argv;
|
||||||
|
(void) argc;
|
||||||
|
return _mm_movemask_ps(_mm_moveldup_ps(_mm_set_ss(1.0f)));
|
||||||
|
}" HAVE__MM_MOVELDUP_PS
|
||||||
|
)
|
||||||
|
|
||||||
|
if(HAVE__MM_MOVELDUP_PS)
|
||||||
|
# assume that we have all SSE3 intrinsics
|
||||||
|
add_definitions(-DHAVE_SSE3)
|
||||||
|
endif(HAVE__MM_MOVELDUP_PS)
|
||||||
|
endif(HAVE_INTRIN_H)
|
||||||
|
endif(HAVE_PMMINTRIN_H)
|
||||||
|
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
|
||||||
|
else()
|
||||||
|
# TODO: Add detections for compiler support and headers
|
||||||
|
endif(NOT CMAKE_CROSSCOMPILING)
|
||||||
|
|
||||||
|
# restore flags
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
|
||||||
|
|
||||||
|
# compiler settings
|
||||||
|
if(MSVC)
|
||||||
|
# enable all warnings but also disable some..
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4 /wd4127")
|
||||||
|
|
||||||
|
# mark debug versions
|
||||||
|
set(CMAKE_DEBUG_POSTFIX "d")
|
||||||
|
|
||||||
|
add_definitions(-D_USE_MATH_DEFINES)
|
||||||
|
elseif(CMAKE_COMPILER_GCCLIKE)
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckLibraryExists)
|
||||||
|
|
||||||
|
# enable all warnings
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
|
||||||
|
|
||||||
|
# check if we can control visibility of symbols
|
||||||
|
check_c_compiler_flag(-fvisibility=hidden HAVE_GCC_VISIBILITY)
|
||||||
|
if(HAVE_GCC_VISIBILITY)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
|
||||||
|
add_definitions(-DHAVE_GCC_VISIBILITY)
|
||||||
|
endif(HAVE_GCC_VISIBILITY)
|
||||||
|
|
||||||
|
# some systems need libm for the math functions to work
|
||||||
|
check_library_exists(m pow "" HAVE_LIBM)
|
||||||
|
if(HAVE_LIBM)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES m)
|
||||||
|
list(APPEND FFTS_EXTRA_LIBRARIES m)
|
||||||
|
endif(HAVE_LIBM)
|
||||||
|
|
||||||
|
if(HAVE_PMMINTRIN_H)
|
||||||
|
add_definitions(-msse3)
|
||||||
|
elseif(HAVE_EMMINTRIN_H)
|
||||||
|
add_definitions(-msse2)
|
||||||
|
elseif(HAVE_XMMINTRIN_H)
|
||||||
|
add_definitions(-msse)
|
||||||
|
endif(HAVE_PMMINTRIN_H)
|
||||||
|
endif(MSVC)
|
||||||
|
|
||||||
|
include_directories(include)
|
||||||
|
include_directories(src)
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
set(FFTS_HEADERS
|
||||||
|
include/ffts.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FFTS_SOURCES
|
||||||
|
src/ffts_attributes.h
|
||||||
|
src/ffts.c
|
||||||
|
src/ffts_chirp_z.c
|
||||||
|
src/ffts_chirp_z.h
|
||||||
|
src/ffts_cpu.c
|
||||||
|
src/ffts_cpu.h
|
||||||
|
src/ffts_internal.h
|
||||||
|
src/ffts_nd.c
|
||||||
|
src/ffts_nd.h
|
||||||
|
src/ffts_real.h
|
||||||
|
src/ffts_real.c
|
||||||
|
src/ffts_real_nd.c
|
||||||
|
src/ffts_real_nd.h
|
||||||
|
src/ffts_transpose.c
|
||||||
|
src/ffts_transpose.h
|
||||||
|
src/ffts_trig.c
|
||||||
|
src/ffts_trig.h
|
||||||
|
src/ffts_static.c
|
||||||
|
src/ffts_static.h
|
||||||
|
src/macros.h
|
||||||
|
src/patterns.h
|
||||||
|
src/types.h
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT DISABLE_DYNAMIC_CODE)
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/codegen_sse.h
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(WARNING "Dynamic code is only supported with x64, disabling dynamic code.")
|
||||||
|
set(DISABLE_DYNAMIC_CODE ON)
|
||||||
|
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
|
||||||
|
endif(NOT DISABLE_DYNAMIC_CODE)
|
||||||
|
|
||||||
|
if(ENABLE_NEON)
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/neon.s
|
||||||
|
)
|
||||||
|
|
||||||
|
if(DISABLE_DYNAMIC_CODE)
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/neon_static.s
|
||||||
|
)
|
||||||
|
endif(DISABLE_DYNAMIC_CODE)
|
||||||
|
|
||||||
|
add_definitions(-DHAVE_NEON)
|
||||||
|
elseif(ENABLE_VFP)
|
||||||
|
if(NOT DISABLE_DYNAMIC_CODE)
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/vfp.s
|
||||||
|
)
|
||||||
|
endif(NOT DISABLE_DYNAMIC_CODE)
|
||||||
|
|
||||||
|
add_definitions(-DHAVE_VFP)
|
||||||
|
elseif(HAVE_XMMINTRIN_H)
|
||||||
|
add_definitions(-DHAVE_SSE)
|
||||||
|
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/macros-avx.h
|
||||||
|
src/macros-sse.h
|
||||||
|
)
|
||||||
|
endif(ENABLE_NEON)
|
||||||
|
|
||||||
|
if(DISABLE_DYNAMIC_CODE)
|
||||||
|
add_definitions(-DDYNAMIC_DISABLED)
|
||||||
|
else()
|
||||||
|
list(APPEND FFTS_SOURCES
|
||||||
|
src/codegen.c
|
||||||
|
src/codegen.h
|
||||||
|
)
|
||||||
|
endif(DISABLE_DYNAMIC_CODE)
|
||||||
|
|
||||||
|
if(GENERATE_POSITION_INDEPENDENT_CODE)
|
||||||
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
endif(GENERATE_POSITION_INDEPENDENT_CODE)
|
||||||
|
|
||||||
|
if(ENABLE_SHARED)
|
||||||
|
add_library(ffts_shared SHARED
|
||||||
|
${FFTS_HEADERS}
|
||||||
|
${FFTS_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
# On unix-like platforms the library is called "libffts.so" and on Windows "ffts.dll"
|
||||||
|
set_target_properties(ffts_shared PROPERTIES
|
||||||
|
DEFINE_SYMBOL FFTS_SHARED
|
||||||
|
OUTPUT_NAME ffts
|
||||||
|
VERSION ${FFTS_MAJOR}.${FFTS_MINOR}.${FFTS_MICRO}
|
||||||
|
)
|
||||||
|
|
||||||
|
install( TARGETS ffts_shared DESTINATION ${LIB_INSTALL_DIR} )
|
||||||
|
endif(ENABLE_SHARED)
|
||||||
|
|
||||||
|
if(ENABLE_STATIC)
|
||||||
|
add_library(ffts_static STATIC
|
||||||
|
${FFTS_HEADERS}
|
||||||
|
${FFTS_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
# On unix-like platforms the library is called "libffts.a"
|
||||||
|
set_target_properties(ffts_static PROPERTIES OUTPUT_NAME ffts)
|
||||||
|
endif(UNIX)
|
||||||
|
|
||||||
|
install( TARGETS ffts_static DESTINATION ${LIB_INSTALL_DIR} )
|
||||||
|
endif(ENABLE_STATIC)
|
||||||
|
|
||||||
|
if(ENABLE_STATIC OR ENABLE_SHARED)
|
||||||
|
find_path(MPFR_INCLUDES
|
||||||
|
NAMES mpfr.h
|
||||||
|
PATHS ${INCLUDE_INSTALL_DIR}
|
||||||
|
)
|
||||||
|
find_library(MPFR_LIBRARIES mpfr PATHS ${LIB_INSTALL_DIR})
|
||||||
|
find_package(OpenMP)
|
||||||
|
|
||||||
|
if(MPFR_INCLUDES)
|
||||||
|
add_definitions(-DHAVE_MPFR_H)
|
||||||
|
include_directories(${MPFR_INCLUDES})
|
||||||
|
endif(MPFR_INCLUDES)
|
||||||
|
|
||||||
|
add_executable(ffts_trig_test
|
||||||
|
tests/trig_test.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ffts_trig_test ffts)
|
||||||
|
if(MPFR_LIBRARIES)
|
||||||
|
target_link_libraries(ffts_trig_test ${MPFR_LIBRARIES})
|
||||||
|
endif(MPFR_LIBRARIES)
|
||||||
|
|
||||||
|
if(OPENMP_FOUND)
|
||||||
|
if(MSVC)
|
||||||
|
set_target_properties(ffts_trig_test PROPERTIES
|
||||||
|
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
||||||
|
LINK_FLAGS "${OpenMP_EXE_LINKER_FLAGS}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set_target_properties(ffts_trig_test PROPERTIES
|
||||||
|
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
||||||
|
LINK_FLAGS "${OpenMP_C_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}"
|
||||||
|
)
|
||||||
|
endif(MSVC)
|
||||||
|
endif(OPENMP_FOUND)
|
||||||
|
|
||||||
|
add_executable(ffts_test
|
||||||
|
tests/test.c
|
||||||
|
)
|
||||||
|
|
||||||
|
# link with static library by default
|
||||||
|
if(ENABLE_STATIC)
|
||||||
|
add_library(ffts ALIAS ffts_static)
|
||||||
|
else()
|
||||||
|
add_library(ffts ALIAS ffts_shared)
|
||||||
|
endif(ENABLE_STATIC)
|
||||||
|
|
||||||
|
target_link_libraries(ffts_test
|
||||||
|
ffts
|
||||||
|
${FFTS_EXTRA_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(ffts_cpu_test
|
||||||
|
src/ffts_cpu.c
|
||||||
|
src/ffts_cpu.h
|
||||||
|
tests/cpu_test.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(ffts_cpu_test PROPERTIES COMPILE_DEFINITIONS FFTS_BUILDING_CPU_TEST)
|
||||||
|
endif(ENABLE_STATIC OR ENABLE_SHARED)
|
||||||
|
|
||||||
|
# generate packageconfig file
|
||||||
|
if(UNIX)
|
||||||
|
include(FindPkgConfig QUIET)
|
||||||
|
if(PKG_CONFIG_FOUND)
|
||||||
|
# convert lists of link libraries into -lstdc++ -lm etc..
|
||||||
|
foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
|
||||||
|
set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}")
|
||||||
|
endforeach()
|
||||||
|
# Produce a pkg-config file for linking against the shared lib
|
||||||
|
configure_file("ffts.pc.cmake.in" "ffts.pc" @ONLY)
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ffts.pc"
|
||||||
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig")
|
||||||
|
endif(PKG_CONFIG_FOUND)
|
||||||
|
endif(UNIX)
|
||||||
|
|
||||||
|
install( FILES
|
||||||
|
${FFTS_HEADERS}
|
||||||
|
DESTINATION ${INCLUDE_INSTALL_DIR} )
|
||||||
31
COPYRIGHT
Normal file
31
COPYRIGHT
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
This file is part of FFTS -- The Fastest Fourier Transform in the South
|
||||||
|
|
||||||
|
Copyright (c) 2012, 2013 Anthony M. Blake <amb@anthonix.com>
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the organization nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL ANTHONY M. BLAKE BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
11
Makefile.am
Normal file
11
Makefile.am
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
SUBDIRS = src tests
|
||||||
|
EXTRA_DIST=COPYRIGHT ffts.pc.in build_iphone.sh build_android.sh
|
||||||
|
ACLOCAL_AMFLAGS = -Im4
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = ffts.pc
|
||||||
|
|
||||||
|
if ENABLE_JNI
|
||||||
|
SUBDIRS += java
|
||||||
|
endif
|
||||||
879
Makefile.in
Normal file
879
Makefile.in
Normal file
@@ -0,0 +1,879 @@
|
|||||||
|
# Makefile.in generated by automake 1.14 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
@ENABLE_JNI_TRUE@am__append_1 = java
|
||||||
|
subdir = .
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||||
|
$(top_srcdir)/configure $(am__configure_deps) \
|
||||||
|
$(srcdir)/config.h.in $(srcdir)/ffts.pc.in AUTHORS README \
|
||||||
|
compile config.guess config.sub depcomp install-sh missing \
|
||||||
|
ltmain.sh
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_classpath.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_check_java_home.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_java_options.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_jni_include_dir.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_jar.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac_works.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno config.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = config.h
|
||||||
|
CONFIG_CLEAN_FILES = ffts.pc
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||||
|
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||||
|
install-data-recursive install-dvi-recursive \
|
||||||
|
install-exec-recursive install-html-recursive \
|
||||||
|
install-info-recursive install-pdf-recursive \
|
||||||
|
install-ps-recursive install-recursive installcheck-recursive \
|
||||||
|
installdirs-recursive pdf-recursive ps-recursive \
|
||||||
|
tags-recursive uninstall-recursive
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
|
||||||
|
DATA = $(pkgconfig_DATA)
|
||||||
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
|
distclean-recursive maintainer-clean-recursive
|
||||||
|
am__recursive_targets = \
|
||||||
|
$(RECURSIVE_TARGETS) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
|
$(am__extra_recursive_targets)
|
||||||
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
|
cscope distdir dist dist-all distcheck
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||||
|
$(LISP)config.h.in
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
'
|
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
CSCOPE = cscope
|
||||||
|
DIST_SUBDIRS = src tests java
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
if test -d "$(distdir)"; then \
|
||||||
|
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -rf "$(distdir)" \
|
||||||
|
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||||
|
else :; fi
|
||||||
|
am__post_remove_distdir = $(am__remove_distdir)
|
||||||
|
am__relativize = \
|
||||||
|
dir0=`pwd`; \
|
||||||
|
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||||
|
sed_rest='s,^[^/]*/*,,'; \
|
||||||
|
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||||
|
sed_butlast='s,/*[^/]*$$,,'; \
|
||||||
|
while test -n "$$dir1"; do \
|
||||||
|
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||||
|
if test "$$first" != "."; then \
|
||||||
|
if test "$$first" = ".."; then \
|
||||||
|
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||||
|
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||||
|
else \
|
||||||
|
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||||
|
if test "$$first2" = "$$first"; then \
|
||||||
|
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||||
|
else \
|
||||||
|
dir2="../$$dir2"; \
|
||||||
|
fi; \
|
||||||
|
dir0="$$dir0"/"$$first"; \
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||||
|
done; \
|
||||||
|
reldir="$$dir2"
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
DIST_TARGETS = dist-gzip
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCAS = @CCAS@
|
||||||
|
CCASDEPMODE = @CCASDEPMODE@
|
||||||
|
CCASFLAGS = @CCASFLAGS@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
JAR = @JAR@
|
||||||
|
JAVA = @JAVA@
|
||||||
|
JAVAC = @JAVAC@
|
||||||
|
JAVACFLAGS = @JAVACFLAGS@
|
||||||
|
JAVAFLAGS = @JAVAFLAGS@
|
||||||
|
JAVAPREFIX = @JAVAPREFIX@
|
||||||
|
JAVA_PATH_NAME = @JAVA_PATH_NAME@
|
||||||
|
JNI_CPPFLAGS = @JNI_CPPFLAGS@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
_ACJNI_JAVAC = @_ACJNI_JAVAC@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
SUBDIRS = src tests $(am__append_1)
|
||||||
|
EXTRA_DIST = COPYRIGHT ffts.pc.in build_iphone.sh build_android.sh
|
||||||
|
ACLOCAL_AMFLAGS = -Im4
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = ffts.pc
|
||||||
|
all: config.h
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
am--refresh: Makefile
|
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
echo ' $(SHELL) ./config.status'; \
|
||||||
|
$(SHELL) ./config.status;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
config.h: stamp-h1
|
||||||
|
@test -f $@ || rm -f stamp-h1
|
||||||
|
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
||||||
|
|
||||||
|
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||||
|
@rm -f stamp-h1
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||||
|
$(srcdir)/config.h.in: $(am__configure_deps)
|
||||||
|
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||||
|
rm -f stamp-h1
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
distclean-hdr:
|
||||||
|
-rm -f config.h stamp-h1
|
||||||
|
ffts.pc: $(top_builddir)/config.status $(srcdir)/ffts.pc.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool:
|
||||||
|
-rm -f libtool config.lt
|
||||||
|
install-pkgconfigDATA: $(pkgconfig_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-pkgconfigDATA:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run 'make' without going through this Makefile.
|
||||||
|
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||||
|
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||||
|
$(am__recursive_targets):
|
||||||
|
@fail=; \
|
||||||
|
if $(am__make_keepgoing); then \
|
||||||
|
failcom='fail=yes'; \
|
||||||
|
else \
|
||||||
|
failcom='exit 1'; \
|
||||||
|
fi; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
for subdir in $$list; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
dot_seen=yes; \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| eval $$failcom; \
|
||||||
|
done; \
|
||||||
|
if test "$$dot_seen" = "no"; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||||
|
fi; test -z "$$fail"
|
||||||
|
|
||||||
|
ID: $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-recursive
|
||||||
|
TAGS: tags
|
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||||
|
include_option=--etags-include; \
|
||||||
|
empty_fix=.; \
|
||||||
|
else \
|
||||||
|
include_option=--include; \
|
||||||
|
empty_fix=; \
|
||||||
|
fi; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test ! -f $$subdir/TAGS || \
|
||||||
|
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
shift; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
if test $$# -gt 0; then \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
"$$@" $$unique; \
|
||||||
|
else \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$unique; \
|
||||||
|
fi; \
|
||||||
|
fi
|
||||||
|
ctags: ctags-recursive
|
||||||
|
|
||||||
|
CTAGS: ctags
|
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& $(am__cd) $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
|
cscope: cscope.files
|
||||||
|
test ! -s cscope.files \
|
||||||
|
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||||
|
clean-cscope:
|
||||||
|
-rm -f cscope.files
|
||||||
|
cscope.files: clean-cscope cscopelist
|
||||||
|
cscopelist: cscopelist-recursive
|
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files)
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
$(am__make_dryrun) \
|
||||||
|
|| test -d "$(distdir)/$$subdir" \
|
||||||
|
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||||
|
$(am__relativize); \
|
||||||
|
new_distdir=$$reldir; \
|
||||||
|
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||||
|
$(am__relativize); \
|
||||||
|
new_top_distdir=$$reldir; \
|
||||||
|
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||||
|
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||||
|
($(am__cd) $$subdir && \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="$$new_top_distdir" \
|
||||||
|
distdir="$$new_distdir" \
|
||||||
|
am__remove_distdir=: \
|
||||||
|
am__skip_length_check=: \
|
||||||
|
am__skip_mode_fix=: \
|
||||||
|
distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
-test -n "$(am__skip_mode_fix)" \
|
||||||
|
|| find "$(distdir)" -type d ! -perm -755 \
|
||||||
|
-exec chmod u+rwx,go+rx {} \; -o \
|
||||||
|
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||||
|
|| chmod -R a+r "$(distdir)"
|
||||||
|
dist-gzip: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-lzip: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-xz: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir
|
||||||
|
@echo WARNING: "Support for shar distribution archives is" \
|
||||||
|
"deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir
|
||||||
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
|
"legacy program 'compress' is deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir
|
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist
|
||||||
|
case '$(DIST_ARCHIVES)' in \
|
||||||
|
*.tar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
|
*.tar.lz*) \
|
||||||
|
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||||
|
*.tar.xz*) \
|
||||||
|
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir)
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build $(distdir)/_inst
|
||||||
|
chmod a-w $(distdir)
|
||||||
|
test -d $(distdir)/_build || exit 0; \
|
||||||
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
|
&& am__cwd=`pwd` \
|
||||||
|
&& $(am__cd) $(distdir)/_build \
|
||||||
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||||
|
distuninstallcheck \
|
||||||
|
&& chmod -R a-w "$$dc_install_base" \
|
||||||
|
&& ({ \
|
||||||
|
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||||
|
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||||
|
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||||
|
&& rm -rf "$$dc_destdir" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||||
|
&& rm -rf $(DIST_ARCHIVES) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||||
|
&& cd "$$am__cwd" \
|
||||||
|
|| exit 1
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
|
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||||
|
distuninstallcheck:
|
||||||
|
@test -n '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: trying to run $@ with an empty' \
|
||||||
|
'$$(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
|
if test -n "$(DESTDIR)"; then \
|
||||||
|
echo " (check DESTDIR support)"; \
|
||||||
|
fi ; \
|
||||||
|
$(distuninstallcheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
distcleancheck: distclean
|
||||||
|
@if test '$(srcdir)' = . ; then \
|
||||||
|
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||||
|
$(distcleancheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
check-am: all-am
|
||||||
|
check: check-recursive
|
||||||
|
all-am: Makefile $(DATA) config.h
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
installdirs-am:
|
||||||
|
for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: install-recursive
|
||||||
|
install-exec: install-exec-recursive
|
||||||
|
install-data: install-data-recursive
|
||||||
|
uninstall: uninstall-recursive
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-recursive
|
||||||
|
install-strip:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-recursive
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-hdr \
|
||||||
|
distclean-libtool distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-recursive
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-recursive
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-pkgconfigDATA
|
||||||
|
|
||||||
|
install-dvi: install-dvi-recursive
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
install-html: install-html-recursive
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-recursive
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-recursive
|
||||||
|
|
||||||
|
install-pdf-am:
|
||||||
|
|
||||||
|
install-ps: install-ps-recursive
|
||||||
|
|
||||||
|
install-ps-am:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-recursive
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-recursive
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-pkgconfigDATA
|
||||||
|
|
||||||
|
.MAKE: $(am__recursive_targets) all install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||||
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
|
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||||
|
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
||||||
|
dist-xz dist-zip distcheck distclean distclean-generic \
|
||||||
|
distclean-hdr distclean-libtool distclean-tags distcleancheck \
|
||||||
|
distdir distuninstallcheck dvi dvi-am html html-am info \
|
||||||
|
info-am install install-am install-data install-data-am \
|
||||||
|
install-dvi install-dvi-am install-exec install-exec-am \
|
||||||
|
install-html install-html-am install-info install-info-am \
|
||||||
|
install-man install-pdf install-pdf-am install-pkgconfigDATA \
|
||||||
|
install-ps install-ps-am install-strip installcheck \
|
||||||
|
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||||
|
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
|
||||||
|
uninstall-am uninstall-pkgconfigDATA
|
||||||
|
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
35
README.md
Normal file
35
README.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# FFTS -- The Fastest Fourier Transform in the South
|
||||||
|
|
||||||
|
[](https://travis-ci.org/linkotec/ffts)
|
||||||
|
|
||||||
|
To build for Android, edit and run build_android.sh
|
||||||
|
|
||||||
|
To build for iOS, edit and run build_iphone.sh
|
||||||
|
|
||||||
|
To build for Linux or OS X on x86, run
|
||||||
|
./configure --enable-sse --enable-single --prefix=/usr/local
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
Optionally build for Windows and Linux with CMake, run
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
|
||||||
|
FFTS dynamically generates code at runtime. This can be disabled with
|
||||||
|
--disable-dynamic-code
|
||||||
|
|
||||||
|
Note that 32 bit x86 dynamic machine code generation is not supported at the moment.
|
||||||
|
|
||||||
|
For JNI targets: --enable-jni will build the jni stuff automatically for
|
||||||
|
the host target, and --enable-shared must also be added manually for it to
|
||||||
|
work.
|
||||||
|
|
||||||
|
If you like FFTS, please show your support by sending a postcard to:
|
||||||
|
|
||||||
|
Anthony Blake<br>
|
||||||
|
Department of Computer Science<br>
|
||||||
|
The University of Waikato<br>
|
||||||
|
Private Bag 3105<br>
|
||||||
|
Hamilton 3240<br>
|
||||||
|
NEW ZEALAND
|
||||||
9763
aclocal.m4
vendored
Normal file
9763
aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load Diff
80
build_android.sh
Executable file
80
build_android.sh
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Compiles ffts for Android
|
||||||
|
# Make sure you have NDK_ROOT defined in .bashrc or .bash_profile
|
||||||
|
# Modify INSTALL_DIR to suit your situation
|
||||||
|
|
||||||
|
INSTALL_DIR="`pwd`/java/android/bin"
|
||||||
|
|
||||||
|
PLATFORM=android-8
|
||||||
|
TOOL="4.6"
|
||||||
|
|
||||||
|
case $(uname -s) in
|
||||||
|
Darwin)
|
||||||
|
CONFBUILD=i386-apple-darwin`uname -r`
|
||||||
|
HOSTPLAT=darwin-x86
|
||||||
|
;;
|
||||||
|
Linux)
|
||||||
|
CONFBUILD=x86-unknown-linux
|
||||||
|
HOSTPLAT=linux-`uname -m`
|
||||||
|
;;
|
||||||
|
*) echo $0: Unknown platform; exit
|
||||||
|
esac
|
||||||
|
|
||||||
|
case arm in
|
||||||
|
arm)
|
||||||
|
TARGPLAT=arm-linux-androideabi
|
||||||
|
ARCH=arm
|
||||||
|
CONFTARG=arm-eabi
|
||||||
|
;;
|
||||||
|
x86)
|
||||||
|
TARGPLAT=x86
|
||||||
|
ARCH=x86
|
||||||
|
CONFTARG=x86
|
||||||
|
;;
|
||||||
|
mips)
|
||||||
|
## probably wrong
|
||||||
|
TARGPLAT=mipsel-linux-android
|
||||||
|
ARCH=mips
|
||||||
|
CONFTARG=mips
|
||||||
|
;;
|
||||||
|
*) echo $0: Unknown target; exit
|
||||||
|
esac
|
||||||
|
|
||||||
|
: ${NDK_ROOT:?}
|
||||||
|
|
||||||
|
echo "Using: $NDK_ROOT/toolchains/${TARGPLAT}-${TOOL}/prebuilt/${HOSTPLAT}/bin"
|
||||||
|
|
||||||
|
export PATH="$NDK_ROOT/toolchains/${TARGPLAT}-${TOOL}/prebuilt/${HOSTPLAT}/bin/:$PATH"
|
||||||
|
export SYS_ROOT="$NDK_ROOT/platforms/${PLATFORM}/arch-${ARCH}/"
|
||||||
|
export CC="${TARGPLAT}-gcc --sysroot=$SYS_ROOT"
|
||||||
|
export LD="${TARGPLAT}-ld"
|
||||||
|
export AR="${TARGPLAT}-ar"
|
||||||
|
export RANLIB="${TARGPLAT}-ranlib"
|
||||||
|
export STRIP="${TARGPLAT}-strip"
|
||||||
|
export CFLAGS="-Os"
|
||||||
|
|
||||||
|
mkdir -p $INSTALL_DIR
|
||||||
|
./configure --enable-neon --build=${CONFBUILD} --host=${CONFTARG} --prefix=$INSTALL_DIR LIBS="-lc -lgcc"
|
||||||
|
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
if [ -z "$ANDROID_HOME" ] ; then
|
||||||
|
echo ""
|
||||||
|
echo " No ANDROID_HOME defined"
|
||||||
|
echo " Android JNI interfaces will not be built"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "Using android_home ${ANDROID_HOME}"
|
||||||
|
echo
|
||||||
|
( cd java/android ; ${ANDROID_HOME}/tools/android update lib-project -p . ) || exit 1
|
||||||
|
( cd java/android/jni ; ${NDK_ROOT}/ndk-build V=1 ) || exit 1
|
||||||
|
( cd java/android ; ant release ) || exit 1
|
||||||
|
echo
|
||||||
|
echo "Android library project location:"
|
||||||
|
echo " `pwd`/java/android"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
22
build_iphone.sh
Executable file
22
build_iphone.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#/bin/sh
|
||||||
|
# Compiles ffts for iOS
|
||||||
|
# Modify INSTALL_DIR, SDKVER and DEVROOT to suit your situation
|
||||||
|
|
||||||
|
INSTALL_DIR="`pwd`/build"
|
||||||
|
|
||||||
|
export SDKVER="6.1"
|
||||||
|
export DEVROOT="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer"
|
||||||
|
export SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk"
|
||||||
|
export CFLAGS="-O3 -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-shorten-64-to-32 -Wno-trigraphs -fpascal-strings -miphoneos-version-min=5.0 -mcpu=cortex-a9 -arch armv7 -mfpu=neon -pipe -isysroot $SDKROOT -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -mno-thumb -no-integrated-as"
|
||||||
|
export AR="$DEVROOT/usr/bin/ar"
|
||||||
|
export CC="clang"
|
||||||
|
|
||||||
|
|
||||||
|
mkdir -p $INSTALL_DIR
|
||||||
|
./configure --enable-neon --build=i386-apple-darwin`uname -r` --host=arm-eabi --prefix=$INSTALL_DIR
|
||||||
|
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
exit 0
|
||||||
1537
config.guess
vendored
Executable file
1537
config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
147
config.h.in
Normal file
147
config.h.in
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to disable dynamic code generation. */
|
||||||
|
#undef DYNAMIC_DISABLED
|
||||||
|
|
||||||
|
/* JNI being built. */
|
||||||
|
#undef ENABLE_JNI
|
||||||
|
|
||||||
|
/* Define to FFT in single precision. */
|
||||||
|
#undef FFTS_PREC_SINGLE
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `memalign', and to 0 if you
|
||||||
|
don't. */
|
||||||
|
#undef HAVE_DECL_MEMALIGN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if
|
||||||
|
you don't. */
|
||||||
|
#undef HAVE_DECL_POSIX_MEMALIGN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
|
#undef HAVE_DLFCN_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `gettimeofday' function. */
|
||||||
|
#undef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `m' library (-lm). */
|
||||||
|
#undef HAVE_LIBM
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to FFT with ARM NEON. */
|
||||||
|
#undef HAVE_NEON
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `pow' function. */
|
||||||
|
#undef HAVE_POW
|
||||||
|
|
||||||
|
/* Define to FFT with SSE. */
|
||||||
|
#undef HAVE_SSE
|
||||||
|
|
||||||
|
/* Define to 1 if stdbool.h conforms to C99. */
|
||||||
|
#undef HAVE_STDBOOL_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||||
|
#undef HAVE_SYS_SOCKET_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||||
|
#undef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define to FFT with ARM VFP. */
|
||||||
|
#undef HAVE_VFP
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the type `_Bool'. */
|
||||||
|
#undef HAVE__BOOL
|
||||||
|
|
||||||
|
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||||
|
*/
|
||||||
|
#undef LT_OBJDIR
|
||||||
|
|
||||||
|
/* Name of package */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
|
||||||
|
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||||
|
#define below would cause a syntax error. */
|
||||||
|
#undef _UINT64_T
|
||||||
|
|
||||||
|
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||||
|
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#undef inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to the type of a signed integer type of width exactly 32 bits if
|
||||||
|
such a type exists and the standard includes do not define it. */
|
||||||
|
#undef int32_t
|
||||||
|
|
||||||
|
/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||||
|
nothing if this is not supported. Do not define if restrict is
|
||||||
|
supported directly. */
|
||||||
|
#undef restrict
|
||||||
|
/* Work around a bug in Sun C++: it does not support _Restrict or
|
||||||
|
__restrict__, even though the corresponding Sun C compiler ends up with
|
||||||
|
"#define restrict _Restrict" or "#define restrict __restrict__" in the
|
||||||
|
previous line. Perhaps some future version of Sun C++ will work with
|
||||||
|
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
|
||||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT
|
||||||
|
# define _Restrict
|
||||||
|
# define __restrict__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
||||||
|
|
||||||
|
/* Define to the type of an unsigned integer type of width exactly 64 bits if
|
||||||
|
such a type exists and the standard includes do not define it. */
|
||||||
|
#undef uint64_t
|
||||||
|
|
||||||
|
// vim: set autoindent noexpandtab tabstop=3 shiftwidth=3:
|
||||||
1786
config.sub
vendored
Executable file
1786
config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
137
configure.ac
Normal file
137
configure.ac
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
# -*- Autoconf -*-
|
||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ([2.65])
|
||||||
|
AC_INIT(ffts, 0.7, amb@anthonix.com)
|
||||||
|
AM_INIT_AUTOMAKE(ffts, 0.7)
|
||||||
|
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
|
# AC_CONFIG_SRCDIR([include/common.h])
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CXX
|
||||||
|
AC_PROG_CC
|
||||||
|
#AX_COMPILER_VENDOR
|
||||||
|
LT_INIT([disable-shared])
|
||||||
|
AM_PROG_AS
|
||||||
|
#CXX="clang++"
|
||||||
|
#CXXFLAGS="$CXXFLAGS -stdlib=libc++"
|
||||||
|
|
||||||
|
#SFFT_AR="/usr/bin/ar"
|
||||||
|
#SFFT_CFLAGS="$CFLAGS"
|
||||||
|
#SFFT_CC="$CC"
|
||||||
|
AC_ARG_ENABLE(dynamic-code, [AC_HELP_STRING([--enable-dynamic-code],[dynamically generate code])], sfft_dynamic=$enableval, sfft_dynamic=yes)
|
||||||
|
if test "$sfft_dynamic" = "no"; then
|
||||||
|
AC_DEFINE(DYNAMIC_DISABLED,1,[Define to disable dynamic code generation.])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(DYNAMIC_DISABLED, test "$sfft_dynamic" = "no")
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(single, [AC_HELP_STRING([--enable-single],[compile single-precision library])], sfft_single=$enableval, sfft_single=no)
|
||||||
|
if test "$sfft_single" = "yes"; then
|
||||||
|
AC_DEFINE(FFTS_PREC_SINGLE,1,[Define to FFT in single precision.])
|
||||||
|
fi
|
||||||
|
if test "$sfft_single" = "no"; then
|
||||||
|
AC_DEFINE(FFTS_PREC_SINGLE,0,[Define to FFT in single precision.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(sse, [AC_HELP_STRING([--enable-sse],[enable SSE extensions])], have_sse=$enableval, have_sse=no)
|
||||||
|
if test "$have_sse" = "yes"; then
|
||||||
|
SIMD=sse
|
||||||
|
AC_DEFINE(HAVE_SSE,1,[Define to FFT with SSE.])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_SSE, test "$have_sse" = "yes")
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(neon, [AC_HELP_STRING([--enable-neon],[enable NEON extensions])], have_neon=$enableval, have_neon=no)
|
||||||
|
if test "$have_neon" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_NEON,1,[Define to FFT with ARM NEON.])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_NEON, test "$have_neon" = "yes")
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(vfp, [AC_HELP_STRING([--enable-vfp],[enable VFP extensions])], have_vfp=$enableval, have_vfp=no)
|
||||||
|
if test "$have_vfp" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_VFP,1,[Define to FFT with ARM VFP.])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_VFP, test "$have_vfp" = "yes")
|
||||||
|
|
||||||
|
AC_ARG_WITH(float-abi, [AS_HELP_STRING([--with-float-abi=ABI],[set float abi for arm, hard or softfp (default is softfp)])],
|
||||||
|
float_abi=$withval, float_abi=softfp)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(jni, [AC_HELP_STRING([--enable-jni],[enable JNI binding])], have_jni=$enableval, have_jni=no)
|
||||||
|
if test "$have_jni" = "yes"; then
|
||||||
|
# Java stuff
|
||||||
|
AX_JAVA_OPTIONS
|
||||||
|
AC_CHECK_JAVA_HOME
|
||||||
|
AC_CHECK_CLASSPATH
|
||||||
|
AC_PROG_JAVAC
|
||||||
|
# blah this whinges about something
|
||||||
|
#AC_PROG_JAVAH
|
||||||
|
AC_PROG_JAR
|
||||||
|
AX_JNI_INCLUDE_DIR
|
||||||
|
for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS
|
||||||
|
do
|
||||||
|
JNI_CPPFLAGS="$JNI_CPPFLAGS -I$JNI_INCLUDE_DIR"
|
||||||
|
done
|
||||||
|
AC_SUBST(JNI_CPPFLAGS, [$JNI_CPPFLAGS])
|
||||||
|
|
||||||
|
AC_DEFINE(ENABLE_JNI,1,[JNI being built.])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(ENABLE_JNI, test "$have_jni" = "yes")
|
||||||
|
|
||||||
|
fpu=""
|
||||||
|
AS_IF([test "$have_vfp" = "yes"],[fpu="-mfpu=vfp"],
|
||||||
|
[test "$have_neon" = "yes"],[fpu="-mfpu=neon"],
|
||||||
|
[])
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([host is "${host}"])
|
||||||
|
case "${host}" in
|
||||||
|
arm* )
|
||||||
|
CFLAGS="$CFLAGS -mfloat-abi=${float_abi} ${fpu} -std=c99"
|
||||||
|
CCASFLAGS="$CCASFLAGS -mfloat-abi=${float_abi} ${fpu}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#if test "$ord_sr" = "no"; then
|
||||||
|
# AC_DEFINE(SFFT_ORD_SR,0,[Define to enable ordinary split radix.])
|
||||||
|
#fi
|
||||||
|
|
||||||
|
# Checks for libraries.
|
||||||
|
AC_CHECK_LIB([m], [cos])
|
||||||
|
AC_CHECK_DECLS([posix_memalign,
|
||||||
|
memalign],,,
|
||||||
|
[#define _XOPEN_SOURCE 600
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <malloc.h>])
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_CHECK_HEADERS([malloc.h stddef.h stdint.h stdlib.h string.h sys/mman.h sys/socket.h sys/time.h unistd.h])
|
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_HEADER_STDBOOL
|
||||||
|
AC_C_INLINE
|
||||||
|
AC_TYPE_INT32_T
|
||||||
|
AC_C_RESTRICT
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_UINT64_T
|
||||||
|
AC_PROG_CC_STDC
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_LN_S
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
#AC_FUNC_MALLOC
|
||||||
|
AC_CHECK_FUNCS([gettimeofday pow])
|
||||||
|
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile
|
||||||
|
src/Makefile
|
||||||
|
tests/Makefile
|
||||||
|
ffts.pc
|
||||||
|
java/Makefile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
||||||
780
depcomp
Executable file
780
depcomp
Executable file
@@ -0,0 +1,780 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2012-07-12.20; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by 'PROGRAMS ARGS'.
|
||||||
|
object Object file output by 'PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputting dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -"
|
||||||
|
if test "$depmode" = msvcmsys; then
|
||||||
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvisualcpp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then
|
||||||
|
# This is just like msvc7 but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvc7
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = xlc; then
|
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
|
||||||
|
gccflag=-qmakedep=gcc,-MF
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say).
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
|
## The second -e expression handles DOS-style file names with drive letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the "deleted header file" problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" |
|
||||||
|
## Some versions of gcc put a space before the ':'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||||
|
## to the object. Take care to not repeat it in the output.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||||
|
tr "$nl" ' ' >> "$depfile"
|
||||||
|
echo >> "$depfile"
|
||||||
|
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
xlc)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
|
||||||
|
# However on
|
||||||
|
# $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
|
# ICC 7.0 will fill foo.d with something like
|
||||||
|
# foo.o: sub/foo.c
|
||||||
|
# foo.o: sub/foo.h
|
||||||
|
# which is wrong. We want
|
||||||
|
# sub/foo.o: sub/foo.c
|
||||||
|
# sub/foo.o: sub/foo.h
|
||||||
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\':
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
# tcc 0.9.26 (FIXME still under development at the moment of writing)
|
||||||
|
# will emit a similar output, but also prepend the continuation lines
|
||||||
|
# with horizontal tabulation characters.
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form 'foo.o: dependent.h',
|
||||||
|
# or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \
|
||||||
|
< "$tmpdepfile" > "$depfile"
|
||||||
|
sed '
|
||||||
|
s/[ '"$tab"'][ '"$tab"']*/ /g
|
||||||
|
s/^ *//
|
||||||
|
s/ *\\*$//
|
||||||
|
s/^[^:]*: *//
|
||||||
|
/^$/d
|
||||||
|
/:$/d
|
||||||
|
s/$/ :/
|
||||||
|
' < "$tmpdepfile" >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
## The order of this option in the case statement is important, since the
|
||||||
|
## shell code in configure will try each of these formats in the order
|
||||||
|
## listed in this file. A plain '-MD' option would be understood by many
|
||||||
|
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||||
|
pgcc)
|
||||||
|
# Portland's C compiler understands '-MD'.
|
||||||
|
# Will always output deps to 'file.d' where file is the root name of the
|
||||||
|
# source file under compilation, even if file resides in a subdirectory.
|
||||||
|
# The object file name does not affect the name of the '.d' file.
|
||||||
|
# pgcc 10.2 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\' :
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
# Use the source, not the object, to determine the base name, since
|
||||||
|
# that's sadly what pgcc will do too.
|
||||||
|
base=`echo "$source" | sed -e 's|^.*/||' -e 's/\.[-_a-zA-Z0-9]*$//'`
|
||||||
|
tmpdepfile="$base.d"
|
||||||
|
|
||||||
|
# For projects that build the same source file twice into different object
|
||||||
|
# files, the pgcc approach of using the *source* file root name can cause
|
||||||
|
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||||
|
# the same $tmpdepfile.
|
||||||
|
lockdir="$base.d-lock"
|
||||||
|
trap "echo '$0: caught signal, cleaning up...' >&2; rm -rf $lockdir" 1 2 13 15
|
||||||
|
numtries=100
|
||||||
|
i=$numtries
|
||||||
|
while test $i -gt 0 ; do
|
||||||
|
# mkdir is a portable test-and-set.
|
||||||
|
if mkdir $lockdir 2>/dev/null; then
|
||||||
|
# This process acquired the lock.
|
||||||
|
"$@" -MD
|
||||||
|
stat=$?
|
||||||
|
# Release the lock.
|
||||||
|
rm -rf $lockdir
|
||||||
|
break
|
||||||
|
else
|
||||||
|
## the lock is being held by a different process,
|
||||||
|
## wait until the winning process is done or we timeout
|
||||||
|
while test -d $lockdir && test $i -gt 0; do
|
||||||
|
sleep 1
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
trap - 1 2 13 15
|
||||||
|
if test $i -le 0; then
|
||||||
|
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||||
|
echo "$0: check lockdir '$lockdir'" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form `foo.o: dependent.h',
|
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
||||||
|
sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in 'foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# generates 2 separate objects for the 2 libraries. These two
|
||||||
|
# compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||||
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.o.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
showIncludes=-Wc,-showIncludes
|
||||||
|
else
|
||||||
|
showIncludes=-showIncludes
|
||||||
|
fi
|
||||||
|
"$@" $showIncludes > "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||||
|
if test "$stat" = 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The first sed program below extracts the file names and escapes
|
||||||
|
# backslashes for cygpath. The second sed program outputs the file
|
||||||
|
# name when reading, but also accumulates all include files in the
|
||||||
|
# hold buffer in order to output them again at the end. This only
|
||||||
|
# works with sed implementations that can handle large buffers.
|
||||||
|
sed < "$tmpdepfile" -n '
|
||||||
|
/^Note: including file: *\(.*\)/ {
|
||||||
|
s//\1/
|
||||||
|
s/\\/\\\\/g
|
||||||
|
p
|
||||||
|
}' | $cygpath_u | sort -u | sed -n '
|
||||||
|
s/ /\\ /g
|
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p
|
||||||
|
s/.\(.*\) \\/\1:/
|
||||||
|
H
|
||||||
|
$ {
|
||||||
|
s/.*/'"$tab"'/
|
||||||
|
G
|
||||||
|
p
|
||||||
|
}' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7msys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for ':'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no eat=no
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
if test $eat = yes; then
|
||||||
|
eat=no
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-arch)
|
||||||
|
eat=yes ;;
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
# makedepend may prepend the VPATH from the source file name to the object.
|
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E |
|
||||||
|
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||||
|
sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E 2>/dev/null |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||||
|
echo "$tab" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvcmsys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
10
ffts.pc.cmake.in
Normal file
10
ffts.pc.cmake.in
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
libdir=${exec_prefix}/lib
|
||||||
|
includedir=${prefix}/include
|
||||||
|
|
||||||
|
Name: @CMAKE_PROJECT_NAME@
|
||||||
|
Description: fast Fourier transform library
|
||||||
|
Version: @FFTS_VERSION@
|
||||||
|
Libs: -L${libdir} -lffts -lm
|
||||||
|
Cflags: -I${includedir}/ffts
|
||||||
10
ffts.pc.in
Normal file
10
ffts.pc.in
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
includedir=@includedir@
|
||||||
|
|
||||||
|
Name: FFTS
|
||||||
|
Description: fast Fourier transform library
|
||||||
|
Version: @VERSION@
|
||||||
|
Libs: -L${libdir} -lffts -lm
|
||||||
|
Cflags: -I${includedir}/ffts
|
||||||
114
include/ffts.h
Normal file
114
include/ffts.h
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
This file is part of FFTS.
|
||||||
|
|
||||||
|
Copyright (c) 2012, Anthony M. Blake
|
||||||
|
Copyright (c) 2018, Jukka Ojanen <jukka.ojanen@kolumbus.fi>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the organization nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL ANTHONY M. BLAKE BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FFTS_H
|
||||||
|
#define FFTS_H
|
||||||
|
|
||||||
|
#if defined (_MSC_VER) && (_MSC_VER >= 1020)
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(_WIN32) || defined(WIN32)) && defined(FFTS_SHARED)
|
||||||
|
# ifdef FFTS_BUILD
|
||||||
|
# define FFTS_API __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define FFTS_API __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# if (__GNUC__ >= 4) || defined(HAVE_GCC_VISIBILITY)
|
||||||
|
# define FFTS_API __attribute__ ((visibility("default")))
|
||||||
|
# else
|
||||||
|
# define FFTS_API
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The direction of the transform
|
||||||
|
(i.e, the sign of the exponent in the transform.)
|
||||||
|
*/
|
||||||
|
#define FFTS_FORWARD (-1)
|
||||||
|
#define FFTS_BACKWARD (+1)
|
||||||
|
|
||||||
|
struct _ffts_plan_t;
|
||||||
|
typedef struct _ffts_plan_t ffts_plan_t;
|
||||||
|
|
||||||
|
/* Complex data is stored in the interleaved format
|
||||||
|
(i.e, the real and imaginary parts composing each
|
||||||
|
element of complex data are stored adjacently in memory)
|
||||||
|
|
||||||
|
The multi-dimensional arrays passed are expected to be
|
||||||
|
stored as a single contiguous block in row-major order
|
||||||
|
*/
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_1d(size_t N, int sign);
|
||||||
|
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_1d_64f(size_t N, int sign);
|
||||||
|
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_2d(size_t N1, size_t N2, int sign);
|
||||||
|
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_nd(int rank, size_t *Ns, int sign);
|
||||||
|
|
||||||
|
/* For real transforms, sign == FFTS_FORWARD implies a real-to-complex
|
||||||
|
forwards tranform, and sign == FFTS_BACKWARD implies a complex-to-real
|
||||||
|
backwards transform.
|
||||||
|
|
||||||
|
The output of a real-to-complex transform is N/2+1 complex numbers,
|
||||||
|
where the redundant outputs have been omitted.
|
||||||
|
*/
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_1d_real(size_t N, int sign);
|
||||||
|
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_2d_real(size_t N1, size_t N2, int sign);
|
||||||
|
|
||||||
|
FFTS_API ffts_plan_t*
|
||||||
|
ffts_init_nd_real(int rank, size_t *Ns, int sign);
|
||||||
|
|
||||||
|
FFTS_API void
|
||||||
|
ffts_execute(ffts_plan_t *p, const void *input, void *output);
|
||||||
|
|
||||||
|
FFTS_API void
|
||||||
|
ffts_free(ffts_plan_t *p);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FFTS_H */
|
||||||
527
install-sh
Executable file
527
install-sh
Executable file
@@ -0,0 +1,527 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2011-11-20.07; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# 'make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call 'install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob set +f &&
|
||||||
|
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
33
java/Makefile.am
Normal file
33
java/Makefile.am
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# TODO: the ax_prog_javah thing doesn't work so this
|
||||||
|
# requires javah in the path
|
||||||
|
|
||||||
|
if ENABLE_JNI
|
||||||
|
JAVA_SRC=$(shell find $(srcdir)/src -name '*.java')
|
||||||
|
|
||||||
|
BUILT_SOURCES = nz_ac_waikato_ffts_FFTS.h
|
||||||
|
|
||||||
|
all: ffts.jar
|
||||||
|
|
||||||
|
classes ffts.jar: $(JAVA_SRC)
|
||||||
|
-rm -rf classes
|
||||||
|
mkdir classes
|
||||||
|
$(JAVAC) -d classes -sourcepath src $(JAVA_SRC)
|
||||||
|
$(JAR) -cf ffts.jar -C classes .
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libffts_jni.la
|
||||||
|
libffts_jni_la_SOURCES = jni/ffts_jni.c
|
||||||
|
nodist_include_HEADERS = nz_ac_waikato_ffts_FFTS.h
|
||||||
|
libffts_jni_la_LIBADD = $(top_builddir)/src/libffts.la
|
||||||
|
libffts_jni_la_CFLAGS = @JNI_CPPFLAGS@ $(AM_CFLAGS) -I$(top_srcdir)/include
|
||||||
|
libffts_jni_la_LDFLAGS = -shared
|
||||||
|
|
||||||
|
pkgdata_DATA = ffts.jar
|
||||||
|
|
||||||
|
nz_ac_waikato_ffts_FFTS.h: classes
|
||||||
|
javah -cp $< nz.ac.waikato.ffts.FFTS
|
||||||
|
|
||||||
|
CLEANFILES=ffts.jar nz_ac_waikato_ffts_FFTS.h
|
||||||
|
clean-local:
|
||||||
|
-rm -rf classes
|
||||||
|
endif
|
||||||
741
java/Makefile.in
Normal file
741
java/Makefile.in
Normal file
@@ -0,0 +1,741 @@
|
|||||||
|
# Makefile.in generated by automake 1.14 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
# TODO: the ax_prog_javah thing doesn't work so this
|
||||||
|
# requires javah in the path
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = java
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||||
|
$(top_srcdir)/depcomp
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_classpath.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_check_java_home.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_java_options.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_jni_include_dir.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_jar.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac_works.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" \
|
||||||
|
"$(DESTDIR)$(includedir)"
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
@ENABLE_JNI_TRUE@libffts_jni_la_DEPENDENCIES = \
|
||||||
|
@ENABLE_JNI_TRUE@ $(top_builddir)/src/libffts.la
|
||||||
|
am__libffts_jni_la_SOURCES_DIST = jni/ffts_jni.c
|
||||||
|
@ENABLE_JNI_TRUE@am_libffts_jni_la_OBJECTS = \
|
||||||
|
@ENABLE_JNI_TRUE@ libffts_jni_la-ffts_jni.lo
|
||||||
|
libffts_jni_la_OBJECTS = $(am_libffts_jni_la_OBJECTS)
|
||||||
|
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
|
am__v_lt_0 = --silent
|
||||||
|
am__v_lt_1 =
|
||||||
|
libffts_jni_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||||
|
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||||
|
$(libffts_jni_la_CFLAGS) $(CFLAGS) $(libffts_jni_la_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
@ENABLE_JNI_TRUE@am_libffts_jni_la_rpath = -rpath $(libdir)
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||||
|
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||||
|
$(AM_CFLAGS) $(CFLAGS)
|
||||||
|
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||||
|
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||||
|
am__v_CC_0 = @echo " CC " $@;
|
||||||
|
am__v_CC_1 =
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||||
|
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||||
|
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||||
|
am__v_CCLD_1 =
|
||||||
|
SOURCES = $(libffts_jni_la_SOURCES)
|
||||||
|
DIST_SOURCES = $(am__libffts_jni_la_SOURCES_DIST)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
DATA = $(pkgdata_DATA)
|
||||||
|
HEADERS = $(nodist_include_HEADERS)
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
'
|
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCAS = @CCAS@
|
||||||
|
CCASDEPMODE = @CCASDEPMODE@
|
||||||
|
CCASFLAGS = @CCASFLAGS@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
JAR = @JAR@
|
||||||
|
JAVA = @JAVA@
|
||||||
|
JAVAC = @JAVAC@
|
||||||
|
JAVACFLAGS = @JAVACFLAGS@
|
||||||
|
JAVAFLAGS = @JAVAFLAGS@
|
||||||
|
JAVAPREFIX = @JAVAPREFIX@
|
||||||
|
JAVA_PATH_NAME = @JAVA_PATH_NAME@
|
||||||
|
JNI_CPPFLAGS = @JNI_CPPFLAGS@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
_ACJNI_JAVAC = @_ACJNI_JAVAC@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
@ENABLE_JNI_TRUE@JAVA_SRC = $(shell find $(srcdir)/src -name '*.java')
|
||||||
|
@ENABLE_JNI_TRUE@BUILT_SOURCES = nz_ac_waikato_ffts_FFTS.h
|
||||||
|
@ENABLE_JNI_TRUE@lib_LTLIBRARIES = libffts_jni.la
|
||||||
|
@ENABLE_JNI_TRUE@libffts_jni_la_SOURCES = jni/ffts_jni.c
|
||||||
|
@ENABLE_JNI_TRUE@nodist_include_HEADERS = nz_ac_waikato_ffts_FFTS.h
|
||||||
|
@ENABLE_JNI_TRUE@libffts_jni_la_LIBADD = $(top_builddir)/src/libffts.la
|
||||||
|
@ENABLE_JNI_TRUE@libffts_jni_la_CFLAGS = @JNI_CPPFLAGS@ $(AM_CFLAGS) -I$(top_srcdir)/include
|
||||||
|
@ENABLE_JNI_TRUE@libffts_jni_la_LDFLAGS = -shared
|
||||||
|
@ENABLE_JNI_TRUE@pkgdata_DATA = ffts.jar
|
||||||
|
@ENABLE_JNI_TRUE@CLEANFILES = ffts.jar nz_ac_waikato_ffts_FFTS.h
|
||||||
|
all: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||||
|
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu java/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu java/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
list2=; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
list2="$$list2 $$p"; \
|
||||||
|
else :; fi; \
|
||||||
|
done; \
|
||||||
|
test -z "$$list2" || { \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
|
||||||
|
}
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
for p in $$list; do \
|
||||||
|
$(am__strip_dir) \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES:
|
||||||
|
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; \
|
||||||
|
locs=`for p in $$list; do echo $$p; done | \
|
||||||
|
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||||
|
sort -u`; \
|
||||||
|
test -z "$$locs" || { \
|
||||||
|
echo rm -f $${locs}; \
|
||||||
|
rm -f $${locs}; \
|
||||||
|
}
|
||||||
|
|
||||||
|
libffts_jni.la: $(libffts_jni_la_OBJECTS) $(libffts_jni_la_DEPENDENCIES) $(EXTRA_libffts_jni_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(libffts_jni_la_LINK) $(am_libffts_jni_la_rpath) $(libffts_jni_la_OBJECTS) $(libffts_jni_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libffts_jni_la-ffts_jni.Plo@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
libffts_jni_la-ffts_jni.lo: jni/ffts_jni.c
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libffts_jni_la_CFLAGS) $(CFLAGS) -MT libffts_jni_la-ffts_jni.lo -MD -MP -MF $(DEPDIR)/libffts_jni_la-ffts_jni.Tpo -c -o libffts_jni_la-ffts_jni.lo `test -f 'jni/ffts_jni.c' || echo '$(srcdir)/'`jni/ffts_jni.c
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libffts_jni_la-ffts_jni.Tpo $(DEPDIR)/libffts_jni_la-ffts_jni.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jni/ffts_jni.c' object='libffts_jni_la-ffts_jni.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libffts_jni_la_CFLAGS) $(CFLAGS) -c -o libffts_jni_la-ffts_jni.lo `test -f 'jni/ffts_jni.c' || echo '$(srcdir)/'`jni/ffts_jni.c
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
install-pkgdataDATA: $(pkgdata_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-pkgdataDATA:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
|
||||||
|
install-nodist_includeHEADERS: $(nodist_include_HEADERS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
|
||||||
|
$(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-nodist_includeHEADERS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
ID: $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-am
|
||||||
|
TAGS: tags
|
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
shift; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
if test $$# -gt 0; then \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
"$$@" $$unique; \
|
||||||
|
else \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$unique; \
|
||||||
|
fi; \
|
||||||
|
fi
|
||||||
|
ctags: ctags-am
|
||||||
|
|
||||||
|
CTAGS: ctags
|
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& $(am__cd) $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
|
cscopelist: cscopelist-am
|
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files)
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-am
|
||||||
|
all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(includedir)"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
@ENABLE_JNI_FALSE@clean-local:
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
|
||||||
|
mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-nodist_includeHEADERS install-pkgdataDATA
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am: install-libLTLIBRARIES
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-pdf-am:
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
install-ps-am:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS \
|
||||||
|
uninstall-pkgdataDATA
|
||||||
|
|
||||||
|
.MAKE: all check install install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||||
|
clean-libLTLIBRARIES clean-libtool clean-local cscopelist-am \
|
||||||
|
ctags ctags-am distclean distclean-compile distclean-generic \
|
||||||
|
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||||
|
html-am info info-am install install-am install-data \
|
||||||
|
install-data-am install-dvi install-dvi-am install-exec \
|
||||||
|
install-exec-am install-html install-html-am install-info \
|
||||||
|
install-info-am install-libLTLIBRARIES install-man \
|
||||||
|
install-nodist_includeHEADERS install-pdf install-pdf-am \
|
||||||
|
install-pkgdataDATA install-ps install-ps-am install-strip \
|
||||||
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \
|
||||||
|
uninstall-nodist_includeHEADERS uninstall-pkgdataDATA
|
||||||
|
|
||||||
|
|
||||||
|
@ENABLE_JNI_TRUE@all: ffts.jar
|
||||||
|
|
||||||
|
@ENABLE_JNI_TRUE@classes ffts.jar: $(JAVA_SRC)
|
||||||
|
@ENABLE_JNI_TRUE@ -rm -rf classes
|
||||||
|
@ENABLE_JNI_TRUE@ mkdir classes
|
||||||
|
@ENABLE_JNI_TRUE@ $(JAVAC) -d classes -sourcepath src $(JAVA_SRC)
|
||||||
|
@ENABLE_JNI_TRUE@ $(JAR) -cf ffts.jar -C classes .
|
||||||
|
|
||||||
|
@ENABLE_JNI_TRUE@nz_ac_waikato_ffts_FFTS.h: classes
|
||||||
|
@ENABLE_JNI_TRUE@ javah -cp $< nz.ac.waikato.ffts.FFTS
|
||||||
|
@ENABLE_JNI_TRUE@clean-local:
|
||||||
|
@ENABLE_JNI_TRUE@ -rm -rf classes
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
9
java/android/.classpath
Normal file
9
java/android/.classpath
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="gen"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||||
|
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||||
|
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||||
|
<classpathentry kind="output" path="bin/classes"/>
|
||||||
|
</classpath>
|
||||||
40
java/android/.project
Normal file
40
java/android/.project
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>ffts-android</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>src</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>PARENT-1-PROJECT_LOC/src</locationURI>
|
||||||
|
</link>
|
||||||
|
</linkedResources>
|
||||||
|
</projectDescription>
|
||||||
4
java/android/.settings/org.eclipse.jdt.core.prefs
Normal file
4
java/android/.settings/org.eclipse.jdt.core.prefs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.6
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
|
||||||
7
java/android/AndroidManifest.xml
Normal file
7
java/android/AndroidManifest.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="nz.waikato.ffts"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<uses-sdk android:minSdkVersion="8" />
|
||||||
|
</manifest>
|
||||||
18
java/android/ant.properties
Normal file
18
java/android/ant.properties
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# This file is used to override default values used by the Ant build system.
|
||||||
|
#
|
||||||
|
# This file must be checked into Version Control Systems, as it is
|
||||||
|
# integral to the build system of your project.
|
||||||
|
|
||||||
|
# This file is only used by the Ant script.
|
||||||
|
|
||||||
|
# You can use this to override default values such as
|
||||||
|
# 'source.dir' for the location of your java source folder and
|
||||||
|
# 'out.dir' for the location of your output folder.
|
||||||
|
source.dir=../src
|
||||||
|
|
||||||
|
# You can also use it define how the release builds are signed by declaring
|
||||||
|
# the following properties:
|
||||||
|
# 'key.store' for the location of your keystore and
|
||||||
|
# 'key.alias' for the name of the key to use.
|
||||||
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
|
|
||||||
92
java/android/build.xml
Normal file
92
java/android/build.xml
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="ffts" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contains the path to the SDK. It should *NOT* be checked into
|
||||||
|
Version Control Systems. -->
|
||||||
|
<property file="local.properties" />
|
||||||
|
|
||||||
|
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||||
|
'android' tool to add properties to it.
|
||||||
|
This is the place to change some Ant specific build properties.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
source.dir
|
||||||
|
The name of the source directory. Default is 'src'.
|
||||||
|
out.dir
|
||||||
|
The name of the output directory. Default is 'bin'.
|
||||||
|
|
||||||
|
For other overridable properties, look at the beginning of the rules
|
||||||
|
files in the SDK, at tools/ant/build.xml
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should
|
||||||
|
be updated using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="ant.properties" />
|
||||||
|
|
||||||
|
<!-- if sdk.dir was not set from one of the property file, then
|
||||||
|
get it from the ANDROID_HOME env var.
|
||||||
|
This must be done before we load project.properties since
|
||||||
|
the proguard config can use sdk.dir -->
|
||||||
|
<property environment="env" />
|
||||||
|
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||||
|
<isset property="env.ANDROID_HOME" />
|
||||||
|
</condition>
|
||||||
|
|
||||||
|
<!-- The project.properties file is created and updated by the 'android'
|
||||||
|
tool, as well as ADT.
|
||||||
|
|
||||||
|
This contains project specific properties such as project target, and library
|
||||||
|
dependencies. Lower level build properties are stored in ant.properties
|
||||||
|
(or in .classpath for Eclipse projects).
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems. -->
|
||||||
|
<loadproperties srcFile="project.properties" />
|
||||||
|
|
||||||
|
<!-- quick check on sdk.dir -->
|
||||||
|
<fail
|
||||||
|
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||||
|
unless="sdk.dir"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Import per project custom build rules if present at the root of the project.
|
||||||
|
This is the place to put custom intermediary targets such as:
|
||||||
|
-pre-build
|
||||||
|
-pre-compile
|
||||||
|
-post-compile (This is typically used for code obfuscation.
|
||||||
|
Compiled code location: ${out.classes.absolute.dir}
|
||||||
|
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||||
|
-post-package
|
||||||
|
-post-build
|
||||||
|
-pre-clean
|
||||||
|
-->
|
||||||
|
<import file="custom_rules.xml" optional="true" />
|
||||||
|
|
||||||
|
<!-- Import the actual build file.
|
||||||
|
|
||||||
|
To customize existing targets, there are two options:
|
||||||
|
- Customize only one target:
|
||||||
|
- copy/paste the target into this file, *before* the
|
||||||
|
<import> task.
|
||||||
|
- customize it to your needs.
|
||||||
|
- Customize the whole content of build.xml
|
||||||
|
- copy/paste the content of the rules files (minus the top node)
|
||||||
|
into this file, replacing the <import> task.
|
||||||
|
- customize to your needs.
|
||||||
|
|
||||||
|
***********************
|
||||||
|
****** IMPORTANT ******
|
||||||
|
***********************
|
||||||
|
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||||
|
in order to avoid having your file be overridden by tools such as "android update project"
|
||||||
|
-->
|
||||||
|
<!-- version-tag: 1 -->
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||||
|
|
||||||
|
</project>
|
||||||
25
java/android/jni/Android.mk
Normal file
25
java/android/jni/Android.mk
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
TOP=../../..
|
||||||
|
|
||||||
|
# Include the shared library
|
||||||
|
#include $(CLEAR_VARS)
|
||||||
|
#LOCAL_MODULE := ffts
|
||||||
|
#LOCAL_SRC_FILES := ../../../src/.libs/libffts.so
|
||||||
|
#include $(PREBUILT_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
# Include the static library in shared lib
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := ffts
|
||||||
|
LOCAL_SRC_FILES := $(TOP)/java/android/bin/lib/libffts.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(TOP)/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := ffts_jni
|
||||||
|
LOCAL_CFLAGS := -I$(TOP)/include -I$(TOP)/java/jni -I$(TOP) -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast
|
||||||
|
LOCAL_SRC_FILES := $(TOP)/java/jni/ffts_jni.c
|
||||||
|
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
|
||||||
|
LOCAL_STATIC_LIBRARIES := ffts
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
2
java/android/jni/Application.mk
Normal file
2
java/android/jni/Application.mk
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# requires NEON atm
|
||||||
|
APP_ABI := armeabi-v7a
|
||||||
20
java/android/proguard-project.txt
Normal file
20
java/android/proguard-project.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
15
java/android/project.properties
Normal file
15
java/android/project.properties
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
android.library=true
|
||||||
|
# Project target.
|
||||||
|
target=android-10
|
||||||
237
java/jni/ffts_jni.c
Normal file
237
java/jni/ffts_jni.c
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFTS -- The Fastest Fourier Transform in the South
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Michael Zucchi <notzed@gmail.com>
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the organization nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL ANTHONY M. BLAKE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <ffts.h>
|
||||||
|
#include <alloca.h>
|
||||||
|
|
||||||
|
// Bit of a hack for android, as we can't build the *.h without
|
||||||
|
// the classes ... but we can't build the project without the jni.
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include <jni.h>
|
||||||
|
#define NEEDS_ALIGNED
|
||||||
|
#undef HAVE_DECL_POSIX_MEMALIGN
|
||||||
|
#else
|
||||||
|
#include "nz_ac_waikato_ffts_FFTS.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TODO: feature tests instead
|
||||||
|
#ifdef HAVE_SSE
|
||||||
|
#define NEEDS_ALIGNED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NEEDS_ALIGNED
|
||||||
|
#define ALIGN_MASK 15
|
||||||
|
|
||||||
|
static void *
|
||||||
|
xmemalign(size_t align, size_t size) {
|
||||||
|
#if defined(HAVE_DECL_POSIX_MEMALIGN)
|
||||||
|
void *r;
|
||||||
|
|
||||||
|
if (posix_memalign(&r, align, size) != 0)
|
||||||
|
return NULL;
|
||||||
|
return r;
|
||||||
|
#elif defined(HAVE_DECL_MEMALIGN)
|
||||||
|
return memalign(align, size);
|
||||||
|
#else
|
||||||
|
#error "Require an aligning malloc"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
throwOutOfMemoryError(JNIEnv *env, const char *msg) {
|
||||||
|
jclass jc = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
|
||||||
|
|
||||||
|
if (jc)
|
||||||
|
(*env)->ThrowNew(env, jc, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_complex_11d
|
||||||
|
(JNIEnv *env, jclass jc, jint N, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
|
||||||
|
plan = ffts_init_1d(N, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_complex_12d
|
||||||
|
(JNIEnv *env, jclass jc, jint N1, jint N2, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
|
||||||
|
plan = ffts_init_2d(N1, N2, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_complex_1nd
|
||||||
|
(JNIEnv *env, jclass jc, jintArray jNs, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
int n = (*env)->GetArrayLength(env, jNs);
|
||||||
|
int *cNs;
|
||||||
|
size_t *Ns;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Needs to convert java int array to size_t array
|
||||||
|
// Get the int elements and conver to C type
|
||||||
|
Ns = alloca(sizeof(*Ns) * n);
|
||||||
|
cNs = alloca(sizeof(int) * n);
|
||||||
|
(*env)->GetIntArrayRegion(env, jNs, 0, n, cNs);
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
Ns[i] = cNs[i];
|
||||||
|
|
||||||
|
plan = ffts_init_nd(n, Ns, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_real_11d
|
||||||
|
(JNIEnv *env, jclass jc, jint N, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
|
||||||
|
plan = ffts_init_1d_real(N, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_real_12d
|
||||||
|
(JNIEnv *env, jclass jc, jint N1, jint N2, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
|
||||||
|
plan = ffts_init_2d_real(N1, N2, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_nz_ac_waikato_ffts_FFTS_real_1nd
|
||||||
|
(JNIEnv *env, jclass jc, jintArray jNs, jint sign) {
|
||||||
|
ffts_plan_t *plan;
|
||||||
|
int n = (*env)->GetArrayLength(env, jNs);
|
||||||
|
int *cNs;
|
||||||
|
size_t *Ns;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Needs to convert java int array to size_t array
|
||||||
|
// Get the int elements and conver to C type
|
||||||
|
Ns = alloca(sizeof(*Ns) * n);
|
||||||
|
cNs = alloca(sizeof(int) * n);
|
||||||
|
(*env)->GetIntArrayRegion(env, jNs, 0, n, cNs);
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
Ns[i] = cNs[i];
|
||||||
|
|
||||||
|
plan = ffts_init_nd_real(n, Ns, sign);
|
||||||
|
if (!plan)
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
|
||||||
|
return (jlong)plan;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_nz_ac_waikato_ffts_FFTS_execute__JJ_3FI_3FI
|
||||||
|
(JNIEnv *env, jclass jc, jlong p, jlong size, jfloatArray jsrc, jint soff, jfloatArray jdst, jint doff) {
|
||||||
|
ffts_plan_t *plan = (ffts_plan_t *)p;
|
||||||
|
|
||||||
|
// TODO: check performance on android/arm
|
||||||
|
#ifdef NEEDS_ALIGNED
|
||||||
|
// On oracle jvm this is faster than GetFloatArrayElements()
|
||||||
|
void *src, *dst;
|
||||||
|
|
||||||
|
src = xmemalign(64, size * 4);
|
||||||
|
if (!src) {
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dst = xmemalign(64, size * 4);
|
||||||
|
if (!dst) {
|
||||||
|
free(src);
|
||||||
|
throwOutOfMemoryError(env, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*env)->GetFloatArrayRegion(env, jsrc, 0, size, src + soff);
|
||||||
|
ffts_execute(plan, src, dst);
|
||||||
|
(*env)->SetFloatArrayRegion(env, jdst, 0, size, dst + doff);
|
||||||
|
|
||||||
|
free(dst);
|
||||||
|
free(src);
|
||||||
|
#else
|
||||||
|
// This is the fastest with oracle jvm, but doesn't work with sse ...
|
||||||
|
void *src = (*env)->GetPrimitiveArrayCritical(env, jsrc, NULL);
|
||||||
|
void *dst = (*env)->GetPrimitiveArrayCritical(env, jdst, NULL);
|
||||||
|
|
||||||
|
ffts_execute(plan, src + soff, dst + doff);
|
||||||
|
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, jdst, dst, 0);
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, jsrc, src, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// This is the slowest
|
||||||
|
void *src = (*env)->GetFloatArrayElements(env, jsrc, NULL);
|
||||||
|
void *dst = (*env)->GetFloatArrayElements(env, jdst, NULL);
|
||||||
|
|
||||||
|
ffts_execute(plan, src + soff, dst + doff);
|
||||||
|
|
||||||
|
(*env)->ReleaseFloatArrayElements(env, jdst, dst, 0);
|
||||||
|
(*env)->ReleaseFloatArrayElements(env, jsrc, src, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_nz_ac_waikato_ffts_FFTS_execute__JJLjava_nio_FloatBuffer_2Ljava_nio_FloatBuffer_2
|
||||||
|
(JNIEnv *env, jclass jc, jlong p, jlong size, jobject jsrc, jobject jdst) {
|
||||||
|
ffts_plan_t *plan = (ffts_plan_t *)p;
|
||||||
|
void *src = (*env)->GetDirectBufferAddress(env, jsrc);
|
||||||
|
void *dst = (*env)->GetDirectBufferAddress(env, jdst);
|
||||||
|
|
||||||
|
// Bounds checking etc is in java side.
|
||||||
|
|
||||||
|
ffts_execute(plan, src, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_nz_ac_waikato_ffts_FFTS_free
|
||||||
|
(JNIEnv *env, jclass jc, jlong p) {
|
||||||
|
ffts_plan_t *plan = (ffts_plan_t *)p;
|
||||||
|
|
||||||
|
ffts_free(plan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// vim: set autoindent noexpandtab tabstop=3 shiftwidth=3:
|
||||||
203
java/src/nz/ac/waikato/ffts/FFTS.java
Normal file
203
java/src/nz/ac/waikato/ffts/FFTS.java
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFTS -- The Fastest Fourier Transform in the South
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Michael Zucchi <notzed@gmail.com>
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the organization nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL ANTHONY M. BLAKE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package nz.ac.waikato.ffts;
|
||||||
|
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A java wrapper for ffts plans.
|
||||||
|
*
|
||||||
|
* Plans must currently be freed explicitly.
|
||||||
|
*
|
||||||
|
* @author notzed
|
||||||
|
*/
|
||||||
|
public class FFTS {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* C pointer
|
||||||
|
*/
|
||||||
|
private long p;
|
||||||
|
/**
|
||||||
|
* Minimum size of input
|
||||||
|
*/
|
||||||
|
final protected long inSize;
|
||||||
|
/**
|
||||||
|
* Minimum size of output
|
||||||
|
*/
|
||||||
|
final protected long outSize;
|
||||||
|
|
||||||
|
private FFTS(long p, long inSize) {
|
||||||
|
this(p, inSize, inSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FFTS(long p, long inSize, long outSize) {
|
||||||
|
this.p = p;
|
||||||
|
this.inSize = inSize;
|
||||||
|
this.outSize = inSize;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The sign to use for a forward transform.
|
||||||
|
*/
|
||||||
|
public static final int FORWARD = -1;
|
||||||
|
/**
|
||||||
|
* The sign to use for a backward transform.
|
||||||
|
*/
|
||||||
|
public static final int BACKWARD = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a FFT plan for a 1-dimensional complex transform.
|
||||||
|
*
|
||||||
|
* The src and dst parameters to execute() use complex data.
|
||||||
|
*
|
||||||
|
* @param sign The direction of the transform.
|
||||||
|
* @param N The size of the transform.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static FFTS complex(int sign, int N) {
|
||||||
|
return new FFTS(complex_1d(N, sign), N * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a FFT plan for a 2-dimensional complex transform.
|
||||||
|
* @param sign The direction of the transform.
|
||||||
|
* @param N1 The size of the transform.
|
||||||
|
* @param N2 The size of the transform.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static FFTS complex(int sign, int N1, int N2) {
|
||||||
|
return new FFTS(complex_2d(N1, N2, sign), N1 * N2 * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FFTS complex(int sign, int... Ns) {
|
||||||
|
return new FFTS(complex_nd(Ns, sign), size(Ns) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FFTS real(int sign, int N) {
|
||||||
|
return new FFTS(real_1d(N, sign), sign == FORWARD ? N : (N / 2 + 1) * 2, sign == FORWARD ? (N / 2 + 1) * 2 : N);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FFTS real(int sign, int N1, int N2) {
|
||||||
|
return new FFTS(real_2d(N1, N2, sign), sign == FORWARD ? N1 * N2 : (N1 * N2 / 2 + 1) * 2, sign == FORWARD ? (N1 * N2 / 2 + 1) * 2 : N1 * N2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FFTS real(int sign, int... Ns) {
|
||||||
|
return new FFTS(real_nd(Ns, sign), sign == FORWARD ? size(Ns) : (size(Ns) / 2 + 1) * 2, sign == FORWARD ? (size(Ns) / 2 + 1) * 2 : size(Ns));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute this plan with the given array data.
|
||||||
|
*
|
||||||
|
* @param src
|
||||||
|
* @param dst
|
||||||
|
*/
|
||||||
|
public void execute(float[] src, float[] dst) {
|
||||||
|
execute(src, 0, dst, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute this plan with the given array data.
|
||||||
|
* @param src
|
||||||
|
* @param soff Start offset into src array.
|
||||||
|
* @param dst
|
||||||
|
* @param doff Start offset into dst array.
|
||||||
|
*/
|
||||||
|
public void execute(float[] src, int soff, float[] dst, int doff) {
|
||||||
|
if (src.length - soff < inSize || dst.length - doff < outSize)
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
if (p == 0)
|
||||||
|
throw new NullPointerException();
|
||||||
|
|
||||||
|
execute(p, inSize, src, soff, dst, doff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute this plan with the given nio buffers. The bufffers
|
||||||
|
* must be derived from direct buffers.
|
||||||
|
*
|
||||||
|
* The buffer position and limits are ignored.
|
||||||
|
*
|
||||||
|
* @param src
|
||||||
|
* @param dst
|
||||||
|
*/
|
||||||
|
public void execute(FloatBuffer src, FloatBuffer dst) {
|
||||||
|
if (src.capacity() < inSize || dst.capacity() < outSize)
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
if (p == 0)
|
||||||
|
throw new NullPointerException();
|
||||||
|
|
||||||
|
execute(p, inSize, src, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the plan.
|
||||||
|
*/
|
||||||
|
public void free() {
|
||||||
|
if (p == 0)
|
||||||
|
throw new NullPointerException();
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the number of elements required to store one
|
||||||
|
* set of n-dimensional data.
|
||||||
|
*/
|
||||||
|
protected static long size(int[] Ns) {
|
||||||
|
long s = Ns[0];
|
||||||
|
for (int i = 1; i < Ns.length; i++)
|
||||||
|
s *= Ns[i];
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.loadLibrary("ffts_jni");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Native interface
|
||||||
|
*/
|
||||||
|
protected static native long complex_1d(int N, int sign);
|
||||||
|
|
||||||
|
protected static native long complex_2d(int N1, int N2, int sign);
|
||||||
|
|
||||||
|
protected static native long complex_nd(int[] Ns, int sign);
|
||||||
|
|
||||||
|
protected static native long real_1d(int N, int sign);
|
||||||
|
|
||||||
|
protected static native long real_2d(int N1, int N2, int sign);
|
||||||
|
|
||||||
|
protected static native long real_nd(int[] Ns, int sign);
|
||||||
|
|
||||||
|
protected static native void execute(long p, long size, float[] src, int soff, float[] dst, int doff);
|
||||||
|
|
||||||
|
protected static native void execute(long p, long size, FloatBuffer src, FloatBuffer dst);
|
||||||
|
|
||||||
|
protected static native void free(long p);
|
||||||
|
}
|
||||||
144
m4/ax_check_class.m4
Normal file
144
m4/ax_check_class.m4
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_check_class.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_CHECK_CLASS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_CHECK_CLASS tests the existence of a given Java class, either in a
|
||||||
|
# jar or in a '.class' file.
|
||||||
|
#
|
||||||
|
# *Warning*: its success or failure can depend on a proper setting of the
|
||||||
|
# CLASSPATH env. variable.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 7
|
||||||
|
|
||||||
|
AU_ALIAS([AC_CHECK_CLASS], [AX_CHECK_CLASS])
|
||||||
|
AC_DEFUN([AX_CHECK_CLASS],[
|
||||||
|
AC_REQUIRE([AX_PROG_JAVA])
|
||||||
|
ac_var_name=`echo $1 | sed 's/\./_/g'`
|
||||||
|
dnl Normaly I'd use a AC_CACHE_CHECK here but since the variable name is
|
||||||
|
dnl dynamic I need an extra level of extraction
|
||||||
|
AC_MSG_CHECKING([for $1 class])
|
||||||
|
AC_CACHE_VAL(ax_cv_class_$ac_var_name, [
|
||||||
|
if test x$ac_cv_prog_uudecode_base64 = xyes; then
|
||||||
|
dnl /**
|
||||||
|
dnl * Test.java: used to test dynamicaly if a class exists.
|
||||||
|
dnl */
|
||||||
|
dnl public class Test
|
||||||
|
dnl {
|
||||||
|
dnl
|
||||||
|
dnl public static void
|
||||||
|
dnl main( String[] argv )
|
||||||
|
dnl {
|
||||||
|
dnl Class lib;
|
||||||
|
dnl if (argv.length < 1)
|
||||||
|
dnl {
|
||||||
|
dnl System.err.println ("Missing argument");
|
||||||
|
dnl System.exit (77);
|
||||||
|
dnl }
|
||||||
|
dnl try
|
||||||
|
dnl {
|
||||||
|
dnl lib = Class.forName (argv[0]);
|
||||||
|
dnl }
|
||||||
|
dnl catch (ClassNotFoundException e)
|
||||||
|
dnl {
|
||||||
|
dnl System.exit (1);
|
||||||
|
dnl }
|
||||||
|
dnl lib = null;
|
||||||
|
dnl System.exit (0);
|
||||||
|
dnl }
|
||||||
|
dnl
|
||||||
|
dnl }
|
||||||
|
cat << \EOF > Test.uue
|
||||||
|
begin-base64 644 Test.class
|
||||||
|
yv66vgADAC0AKQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
|
||||||
|
bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
|
||||||
|
bWJlclRhYmxlDAAKAAsBAANlcnIBABVMamF2YS9pby9QcmludFN0cmVhbTsJ
|
||||||
|
AA0ACQcADgEAEGphdmEvbGFuZy9TeXN0ZW0IABABABBNaXNzaW5nIGFyZ3Vt
|
||||||
|
ZW50DAASABMBAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgAV
|
||||||
|
ABEHABYBABNqYXZhL2lvL1ByaW50U3RyZWFtDAAYABkBAARleGl0AQAEKEkp
|
||||||
|
VgoADQAXDAAcAB0BAAdmb3JOYW1lAQAlKExqYXZhL2xhbmcvU3RyaW5nOylM
|
||||||
|
amF2YS9sYW5nL0NsYXNzOwoAHwAbBwAgAQAPamF2YS9sYW5nL0NsYXNzBwAi
|
||||||
|
AQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAY8aW5pdD4B
|
||||||
|
AAMoKVYMACMAJAoAAwAlAQAKU291cmNlRmlsZQEACVRlc3QuamF2YQAhAAEA
|
||||||
|
AwAAAAAAAgAJAAUABgABAAcAAABtAAMAAwAAACkqvgSiABCyAAwSD7YAFBBN
|
||||||
|
uAAaKgMyuAAeTKcACE0EuAAaAUwDuAAasQABABMAGgAdACEAAQAIAAAAKgAK
|
||||||
|
AAAACgAAAAsABgANAA4ADgATABAAEwASAB4AFgAiABgAJAAZACgAGgABACMA
|
||||||
|
JAABAAcAAAAhAAEAAQAAAAUqtwAmsQAAAAEACAAAAAoAAgAAAAQABAAEAAEA
|
||||||
|
JwAAAAIAKA==
|
||||||
|
====
|
||||||
|
EOF
|
||||||
|
if $UUDECODE Test.uue; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AS_MESSAGE_LOG_FD
|
||||||
|
echo "configure: failed file was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat Test.uue >&AS_MESSAGE_LOG_FD
|
||||||
|
ac_cv_prog_uudecode_base64=no
|
||||||
|
fi
|
||||||
|
rm -f Test.uue
|
||||||
|
if AC_TRY_COMMAND($JAVA $JAVAFLAGS Test $1) >/dev/null 2>&1; then
|
||||||
|
eval "ac_cv_class_$ac_var_name=yes"
|
||||||
|
else
|
||||||
|
eval "ac_cv_class_$ac_var_name=no"
|
||||||
|
fi
|
||||||
|
rm -f Test.class
|
||||||
|
else
|
||||||
|
AX_TRY_COMPILE_JAVA([$1], , [eval "ac_cv_class_$ac_var_name=yes"],
|
||||||
|
[eval "ac_cv_class_$ac_var_name=no"])
|
||||||
|
fi
|
||||||
|
eval "ac_var_val=$`eval echo ac_cv_class_$ac_var_name`"
|
||||||
|
eval "HAVE_$ac_var_name=$`echo ac_cv_class_$ac_var_val`"
|
||||||
|
HAVE_LAST_CLASS=$ac_var_val
|
||||||
|
if test x$ac_var_val = xyes; then
|
||||||
|
ifelse([$2], , :, [$2])
|
||||||
|
else
|
||||||
|
ifelse([$3], , :, [$3])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
dnl for some reason the above statment didn't fall though here?
|
||||||
|
dnl do scripts have variable scoping?
|
||||||
|
eval "ac_var_val=$`eval echo ac_cv_class_$ac_var_name`"
|
||||||
|
AC_MSG_RESULT($ac_var_val)
|
||||||
|
])
|
||||||
60
m4/ax_check_classpath.m4
Normal file
60
m4/ax_check_classpath.m4
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_check_classpath.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_CHECK_CLASSPATH
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_CHECK_CLASSPATH just displays the CLASSPATH, for the edification of
|
||||||
|
# the user.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 5
|
||||||
|
|
||||||
|
AU_ALIAS([AC_CHECK_CLASSPATH], [AX_CHECK_CLASSPATH])
|
||||||
|
AC_DEFUN([AX_CHECK_CLASSPATH],[
|
||||||
|
if test "x$CLASSPATH" = x; then
|
||||||
|
echo "You have no CLASSPATH, I hope it is good"
|
||||||
|
else
|
||||||
|
echo "You have CLASSPATH $CLASSPATH, hope it is correct"
|
||||||
|
fi
|
||||||
|
])
|
||||||
80
m4/ax_check_java_home.m4
Normal file
80
m4/ax_check_java_home.m4
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_check_java_home.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_CHECK_JAVA_HOME
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Check for Sun Java (JDK / JRE) installation, where the 'java' VM is in.
|
||||||
|
# If found, set environment variable JAVA_HOME = Java installation home,
|
||||||
|
# else left JAVA_HOME untouch, which in most case means JAVA_HOME is
|
||||||
|
# empty.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Gleen Salmon <gleensalmon@yahoo.com>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([AC_CHECK_JAVA_HOME], [AX_CHECK_JAVA_HOME])
|
||||||
|
|
||||||
|
AC_DEFUN([AX_CHECK_JAVA_HOME],
|
||||||
|
[AC_MSG_CHECKING([for JAVA_HOME])
|
||||||
|
# We used a fake loop so that we can use "break" to exit when the result
|
||||||
|
# is found.
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
# If the user defined JAVA_HOME, don't touch it.
|
||||||
|
test "${JAVA_HOME+set}" = set && break
|
||||||
|
|
||||||
|
# On Mac OS X 10.5 and following, run /usr/libexec/java_home to get
|
||||||
|
# the value of JAVA_HOME to use.
|
||||||
|
# (http://developer.apple.com/library/mac/#qa/qa2001/qa1170.html).
|
||||||
|
JAVA_HOME=`/usr/libexec/java_home 2>/dev/null`
|
||||||
|
test x"$JAVA_HOME" != x && break
|
||||||
|
|
||||||
|
# See if we can find the java executable, and compute from there.
|
||||||
|
TRY_JAVA_HOME=`ls -dr /usr/java/* 2> /dev/null | head -n 1`
|
||||||
|
if test x$TRY_JAVA_HOME != x; then
|
||||||
|
PATH=$PATH:$TRY_JAVA_HOME/bin
|
||||||
|
fi
|
||||||
|
AC_PATH_PROG([JAVA_PATH_NAME], [java])
|
||||||
|
if test "x$JAVA_PATH_NAME" != x; then
|
||||||
|
JAVA_HOME=`echo $JAVA_PATH_NAME | sed "s/\(.*\)[[/]]bin[[/]]java.*/\1/"`
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([Could not compute JAVA_HOME])
|
||||||
|
break
|
||||||
|
done
|
||||||
|
AC_MSG_RESULT([$JAVA_HOME])
|
||||||
|
])
|
||||||
101
m4/ax_check_java_plugin.m4
Normal file
101
m4/ax_check_java_plugin.m4
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_check_java_plugin.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_CHECK_JAVA_PLUGIN(<shell-variable>)
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro sets <shell-variable> to empty on failure and to a compatible
|
||||||
|
# version of plugin.jar otherwise. Directories searched are /usr/java/*
|
||||||
|
# and /usr/local/java/*, which are assumed to be j{dk,re} installations.
|
||||||
|
# Apply the shell variable as you see fit. If sun changes things so
|
||||||
|
# <jre>/lib/plugin.jar is not the magic file it will stop working.
|
||||||
|
#
|
||||||
|
# This macro assumes that unzip, zipinfo or pkzipc is avialable (and can
|
||||||
|
# list the contents of the jar archive). The first two are assumed to work
|
||||||
|
# similarly enough to the infozip versisonms. The pkzipc version is
|
||||||
|
# assumed to work if I undertstand the documentation on pkware's site but
|
||||||
|
# YMMV. I do not have access to pwkware's version to test it.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Duncan Simpson <dps@simpson.demon.co.uk>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([DPS_CHECK_PLUGIN], [AX_CHECK_JAVA_PLUGIN])
|
||||||
|
AC_DEFUN([AX_CHECK_JAVA_PLUGIN],
|
||||||
|
[AC_REQUIRE([AC_PROG_AWK])
|
||||||
|
AC_REQUIRE([AC_PROG_FGREP])
|
||||||
|
AC_CHECK_PROG(ZIPINFO,[zipinfo unzip pkzipc])
|
||||||
|
AC_MSG_CHECKING([for the java plugin])
|
||||||
|
case "x$ZIPINFO" in
|
||||||
|
[*/zipinfo)]
|
||||||
|
zipinf="zipinfo -1" ;;
|
||||||
|
[*/unzip)]
|
||||||
|
zipinf="unzip -l";;
|
||||||
|
[*/pkzipc)]
|
||||||
|
ziping="unzipc -view";;
|
||||||
|
[x*)]
|
||||||
|
AC_MSG_RESULT([skiped, none of zipinfo, unzip and pkzipc found])
|
||||||
|
AC_SUBST($1,[])
|
||||||
|
zipinf="";;
|
||||||
|
esac
|
||||||
|
if test "x$zipinf" != "x"; then
|
||||||
|
jplugin=""
|
||||||
|
for jhome in `ls -dr /usr/java/* /usr/local/java/* 2> /dev/null`; do
|
||||||
|
for jfile in lib/plugin.jar jre/lib/plugin.jar; do
|
||||||
|
if test "x$jplugin" = "x" && test -f "$jhome/$jfile"; then
|
||||||
|
eval "$zipinf $jhome/$jfile | $AWK '{ print \$NF; }' | $FGREP netscape/javascript/JSObject" >/dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
dnl Some version of gcj (and javac) refuse to work with some files
|
||||||
|
dnl that pass this test. To stop this problem make sure that the compiler
|
||||||
|
dnl still works with this jar file in the classpath
|
||||||
|
cat << \EOF > Test.java
|
||||||
|
/* [#]line __oline__ "configure" */
|
||||||
|
public class Test {
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if eval "$JAVAC -classpath $jhome/$jfile Test.java 2>/dev/null >/dev/null" && test -f Test.class; then
|
||||||
|
jplugin="$jhome/$jfile"
|
||||||
|
fi
|
||||||
|
rm -f Test.java Test.class
|
||||||
|
fi; fi; done; done
|
||||||
|
if test "x$jplugin" != "x"; then
|
||||||
|
AC_SUBST($1,$jplugin)
|
||||||
|
AC_MSG_RESULT($jplugin)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([java plugin not found])
|
||||||
|
AC_SUBST($1,[])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
85
m4/ax_java_check_class.m4
Normal file
85
m4/ax_java_check_class.m4
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_java_check_class.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_JAVA_CHECK_CLASS(<class>,<action-if-found>,<action-if-not-found>)
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Test if a Java class is available. Based on AX_PROG_JAVAC_WORKS. This
|
||||||
|
# version uses a cache variable which is both compiler, options and
|
||||||
|
# classpath dependent (so if you switch from javac to gcj it correctly
|
||||||
|
# notices and redoes the test).
|
||||||
|
#
|
||||||
|
# The macro tries to compile a minimal program importing <class>. Some
|
||||||
|
# newer compilers moan about the failure to use this but fail or produce a
|
||||||
|
# class file anyway. All moaing is sunk to /dev/null since I only wanted
|
||||||
|
# to know if the class could be imported. This is a recommended followup
|
||||||
|
# to AX_CHECK_JAVA_PLUGIN with classpath appropriately adjusted.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Duncan Simpson <dps@simpson.demon.co.uk>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 8
|
||||||
|
|
||||||
|
AU_ALIAS([DPS_JAVA_CHECK_CLASS], [AX_JAVA_CHECK_CLASS])
|
||||||
|
AC_DEFUN([AX_JAVA_CHECK_CLASS],[
|
||||||
|
m4_define([cache_val],[m4_translit(ax_cv_have_java_class_$1, " ." ,"__")])
|
||||||
|
if test "x$CLASSPATH" != "x"; then
|
||||||
|
xtra=" with classpath ${CLASSPATH}"
|
||||||
|
xopts=`echo ${CLASSPATH} | ${SED} 's/^ *://'`
|
||||||
|
xopts="-classpath $xopts"
|
||||||
|
else xtra=""; xopts=""; fi
|
||||||
|
cache_var="cache_val"AS_TR_SH([_Jc_${JAVAC}_Cp_${CLASSPATH}])
|
||||||
|
AC_CACHE_CHECK([if the $1 class is avialable$xtra], [$cache_var], [
|
||||||
|
JAVA_TEST=Test.java
|
||||||
|
CLASS_TEST=Test.class
|
||||||
|
cat << \EOF > $JAVA_TEST
|
||||||
|
/* [#]xline __oline__ "configure" */
|
||||||
|
import $1;
|
||||||
|
public class Test {
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $xopts $JAVA_TEST) >/dev/null 2>&1; then
|
||||||
|
eval "${cache_var}=yes"
|
||||||
|
else
|
||||||
|
eval "${cache_var}=no"
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
rm -f $JAVA_TEST $CLASS_TEST
|
||||||
|
])
|
||||||
|
if eval 'test "x$'${cache_var}'" = "xyes"'; then
|
||||||
|
$2
|
||||||
|
true; else
|
||||||
|
$3
|
||||||
|
false; fi])
|
||||||
48
m4/ax_java_options.m4
Normal file
48
m4/ax_java_options.m4
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_java_options.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_JAVA_OPTIONS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_JAVA_OPTIONS adds configure command line options used for Java m4
|
||||||
|
# macros. This Macro is optional.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([AC_JAVA_OPTIONS], [AX_JAVA_OPTIONS])
|
||||||
|
AC_DEFUN([AX_JAVA_OPTIONS],[
|
||||||
|
AC_ARG_WITH(java-prefix,
|
||||||
|
[ --with-java-prefix=PFX prefix where Java runtime is installed (optional)])
|
||||||
|
AC_ARG_WITH(javac-flags,
|
||||||
|
[ --with-javac-flags=FLAGS flags to pass to the Java compiler (optional)])
|
||||||
|
AC_ARG_WITH(java-flags,
|
||||||
|
[ --with-java-flags=FLAGS flags to pass to the Java VM (optional)])
|
||||||
|
JAVAPREFIX=$with_java_prefix
|
||||||
|
JAVACFLAGS=$with_javac_flags
|
||||||
|
JAVAFLAGS=$with_java_flags
|
||||||
|
AC_SUBST(JAVAPREFIX)dnl
|
||||||
|
AC_SUBST(JAVACFLAGS)dnl
|
||||||
|
AC_SUBST(JAVAFLAGS)dnl
|
||||||
|
AC_SUBST(JAVA)dnl
|
||||||
|
AC_SUBST(JAVAC)dnl
|
||||||
|
])
|
||||||
120
m4/ax_jni_include_dir.m4
Normal file
120
m4/ax_jni_include_dir.m4
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_JNI_INCLUDE_DIR
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_JNI_INCLUDE_DIR finds include directories needed for compiling
|
||||||
|
# programs using the JNI interface.
|
||||||
|
#
|
||||||
|
# JNI include directories are usually in the java distribution This is
|
||||||
|
# deduced from the value of JAVAC. When this macro completes, a list of
|
||||||
|
# directories is left in the variable JNI_INCLUDE_DIRS.
|
||||||
|
#
|
||||||
|
# Example usage follows:
|
||||||
|
#
|
||||||
|
# AX_JNI_INCLUDE_DIR
|
||||||
|
#
|
||||||
|
# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS
|
||||||
|
# do
|
||||||
|
# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR"
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# If you want to force a specific compiler:
|
||||||
|
#
|
||||||
|
# - at the configure.in level, set JAVAC=yourcompiler before calling
|
||||||
|
# AX_JNI_INCLUDE_DIR
|
||||||
|
#
|
||||||
|
# - at the configure level, setenv JAVAC
|
||||||
|
#
|
||||||
|
# Note: This macro can work with the autoconf M4 macros for Java programs.
|
||||||
|
# This particular macro is not part of the original set of macros.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Don Anderson <dda@sleepycat.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 8
|
||||||
|
|
||||||
|
AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR])
|
||||||
|
AC_DEFUN([AX_JNI_INCLUDE_DIR],[
|
||||||
|
|
||||||
|
JNI_INCLUDE_DIRS=""
|
||||||
|
|
||||||
|
test "x$JAVAC" = x && AC_MSG_ERROR(['\$JAVAC' undefined])
|
||||||
|
AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no])
|
||||||
|
test "x$_ACJNI_JAVAC" = xno && AC_MSG_ERROR([$JAVAC could not be found in path])
|
||||||
|
|
||||||
|
_ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC")
|
||||||
|
_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`
|
||||||
|
case "$host_os" in
|
||||||
|
darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
|
||||||
|
_JINC="$_JTOPDIR/Headers";;
|
||||||
|
*) _JINC="$_JTOPDIR/include";;
|
||||||
|
esac
|
||||||
|
_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])
|
||||||
|
_AS_ECHO_LOG([_JINC=$_JINC])
|
||||||
|
|
||||||
|
# On Mac OS X 10.6.4, jni.h is a symlink:
|
||||||
|
# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h
|
||||||
|
# -> ../../CurrentJDK/Headers/jni.h.
|
||||||
|
if test -f "$_JINC/jni.h" || test -L "$_JINC/jni.h"; then
|
||||||
|
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JINC"
|
||||||
|
else
|
||||||
|
_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
|
||||||
|
if test -f "$_JTOPDIR/include/jni.h"; then
|
||||||
|
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include"
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([cannot find java include files])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# get the likely subdirectories for system specific java includes
|
||||||
|
case "$host_os" in
|
||||||
|
bsdi*) _JNI_INC_SUBDIRS="bsdos";;
|
||||||
|
freebsd*) _JNI_INC_SUBDIRS="freebsd";;
|
||||||
|
linux*) _JNI_INC_SUBDIRS="linux genunix";;
|
||||||
|
osf*) _JNI_INC_SUBDIRS="alpha";;
|
||||||
|
solaris*) _JNI_INC_SUBDIRS="solaris";;
|
||||||
|
mingw*) _JNI_INC_SUBDIRS="win32";;
|
||||||
|
cygwin*) _JNI_INC_SUBDIRS="win32";;
|
||||||
|
*) _JNI_INC_SUBDIRS="genunix";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# add any subdirectories that are present
|
||||||
|
for JINCSUBDIR in $_JNI_INC_SUBDIRS
|
||||||
|
do
|
||||||
|
if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
|
||||||
|
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
])
|
||||||
|
|
||||||
|
# _ACJNI_FOLLOW_SYMLINKS <path>
|
||||||
|
# Follows symbolic links on <path>,
|
||||||
|
# finally setting variable _ACJNI_FOLLOWED
|
||||||
|
# ----------------------------------------
|
||||||
|
AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[
|
||||||
|
# find the include directory relative to the javac executable
|
||||||
|
_cur="$1"
|
||||||
|
while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
|
||||||
|
AC_MSG_CHECKING([symlink for $_cur])
|
||||||
|
_slink=`ls -ld "$_cur" | sed 's/.* -> //'`
|
||||||
|
case "$_slink" in
|
||||||
|
/*) _cur="$_slink";;
|
||||||
|
# 'X' avoids triggering unwanted echo options.
|
||||||
|
*) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";;
|
||||||
|
esac
|
||||||
|
AC_MSG_RESULT([$_cur])
|
||||||
|
done
|
||||||
|
_ACJNI_FOLLOWED="$_cur"
|
||||||
|
])# _ACJNI
|
||||||
52
m4/ax_prog_jar.m4
Normal file
52
m4/ax_prog_jar.m4
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_jar.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAR
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_PROG_JAR tests for an existing jar program. It uses the environment
|
||||||
|
# variable JAR then tests in sequence various common jar programs.
|
||||||
|
#
|
||||||
|
# If you want to force a specific compiler:
|
||||||
|
#
|
||||||
|
# - at the configure.in level, set JAR=yourcompiler before calling
|
||||||
|
# AX_PROG_JAR
|
||||||
|
#
|
||||||
|
# - at the configure level, setenv JAR
|
||||||
|
#
|
||||||
|
# You can use the JAR variable in your Makefile.in, with @JAR@.
|
||||||
|
#
|
||||||
|
# Note: This macro depends on the autoconf M4 macros for Java programs. It
|
||||||
|
# is VERY IMPORTANT that you download that whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission.
|
||||||
|
#
|
||||||
|
# The general documentation of those macros, as well as the sample
|
||||||
|
# configure.in, is included in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Egon Willighagen <e.willighagen@science.ru.nl>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAR], [AX_PROG_JAR])
|
||||||
|
AC_DEFUN([AX_PROG_JAR],[
|
||||||
|
AC_REQUIRE([AC_EXEEXT])dnl
|
||||||
|
if test "x$JAVAPREFIX" = x; then
|
||||||
|
test "x$JAR" = x && AC_CHECK_PROGS(JAR, jar$EXEEXT)
|
||||||
|
else
|
||||||
|
test "x$JAR" = x && AC_CHECK_PROGS(JAR, jar, $JAVAPREFIX)
|
||||||
|
fi
|
||||||
|
test "x$JAR" = x && AC_MSG_ERROR([no acceptable jar program found in \$PATH])
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
])
|
||||||
115
m4/ax_prog_java.m4
Normal file
115
m4/ax_prog_java.m4
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_java.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Here is a summary of the main macros:
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAC: finds a Java compiler.
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA: finds a Java virtual machine.
|
||||||
|
#
|
||||||
|
# AX_CHECK_CLASS: finds if we have the given class (beware of CLASSPATH!).
|
||||||
|
#
|
||||||
|
# AX_CHECK_RQRD_CLASS: finds if we have the given class and stops
|
||||||
|
# otherwise.
|
||||||
|
#
|
||||||
|
# AX_TRY_COMPILE_JAVA: attempt to compile user given source.
|
||||||
|
#
|
||||||
|
# AX_TRY_RUN_JAVA: attempt to compile and run user given source.
|
||||||
|
#
|
||||||
|
# AX_JAVA_OPTIONS: adds Java configure options.
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA tests an existing Java virtual machine. It uses the
|
||||||
|
# environment variable JAVA then tests in sequence various common Java
|
||||||
|
# virtual machines. For political reasons, it starts with the free ones.
|
||||||
|
# You *must* call [AX_PROG_JAVAC] before.
|
||||||
|
#
|
||||||
|
# If you want to force a specific VM:
|
||||||
|
#
|
||||||
|
# - at the configure.in level, set JAVA=yourvm before calling AX_PROG_JAVA
|
||||||
|
#
|
||||||
|
# (but after AC_INIT)
|
||||||
|
#
|
||||||
|
# - at the configure level, setenv JAVA
|
||||||
|
#
|
||||||
|
# You can use the JAVA variable in your Makefile.in, with @JAVA@.
|
||||||
|
#
|
||||||
|
# *Warning*: its success or failure can depend on a proper setting of the
|
||||||
|
# CLASSPATH env. variable.
|
||||||
|
#
|
||||||
|
# TODO: allow to exclude virtual machines (rationale: most Java programs
|
||||||
|
# cannot run with some VM like kaffe).
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission.
|
||||||
|
#
|
||||||
|
# A Web page, with a link to the latest CVS snapshot is at
|
||||||
|
# <http://www.internatif.org/bortzmeyer/autoconf-Java/>.
|
||||||
|
#
|
||||||
|
# This is a sample configure.in Process this file with autoconf to produce
|
||||||
|
# a configure script.
|
||||||
|
#
|
||||||
|
# AC_INIT(UnTag.java)
|
||||||
|
#
|
||||||
|
# dnl Checks for programs.
|
||||||
|
# AC_CHECK_CLASSPATH
|
||||||
|
# AX_PROG_JAVAC
|
||||||
|
# AX_PROG_JAVA
|
||||||
|
#
|
||||||
|
# dnl Checks for classes
|
||||||
|
# AX_CHECK_RQRD_CLASS(org.xml.sax.Parser)
|
||||||
|
# AX_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver)
|
||||||
|
#
|
||||||
|
# AC_OUTPUT(Makefile)
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 8
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVA], [AX_PROG_JAVA])
|
||||||
|
AC_DEFUN([AX_PROG_JAVA],[
|
||||||
|
if test x$JAVAPREFIX = x; then
|
||||||
|
test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe java)
|
||||||
|
else
|
||||||
|
test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe java, $JAVAPREFIX)
|
||||||
|
fi
|
||||||
|
test x$JAVA = x && AC_MSG_ERROR([no acceptable Java virtual machine found in \$PATH])
|
||||||
|
AX_PROG_JAVA_WORKS
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
])
|
||||||
104
m4/ax_prog_java_cc.m4
Normal file
104
m4/ax_prog_java_cc.m4
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_java_cc.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA_CC
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Finds the appropriate java compiler on your path. By preference the java
|
||||||
|
# compiler is gcj, then jikes then javac.
|
||||||
|
#
|
||||||
|
# The macro can take one argument specifying a space separated list of
|
||||||
|
# java compiler names.
|
||||||
|
#
|
||||||
|
# For example:
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA_CC(javac, gcj)
|
||||||
|
#
|
||||||
|
# The macro also sets the compiler options variable: JAVA_CC_OPTS to
|
||||||
|
# something sensible:
|
||||||
|
#
|
||||||
|
# - for GCJ it sets it to: @GCJ_OPTS@
|
||||||
|
# (if GCJ_OPTS is not yet defined then it is set to "-C")
|
||||||
|
#
|
||||||
|
# - no other compiler has applicable options yet
|
||||||
|
#
|
||||||
|
# Here's an example configure.in:
|
||||||
|
#
|
||||||
|
# AC_INIT(Makefile.in)
|
||||||
|
# AX_PROG_JAVA_CC()
|
||||||
|
# AC_OUTPUT(Makefile)
|
||||||
|
# dnl End.
|
||||||
|
#
|
||||||
|
# And here's the start of the Makefile.in:
|
||||||
|
#
|
||||||
|
# PROJECT_ROOT := @srcdir@
|
||||||
|
# # Tool definitions.
|
||||||
|
# JAVAC := @JAVA_CC@
|
||||||
|
# JAVAC_OPTS := @JAVA_CC_OPTS@
|
||||||
|
# JAR_TOOL := @jar_tool@
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Nic Ferrier <nferrier@tapsellferrier.co.uk>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 4
|
||||||
|
|
||||||
|
# AX_PROG_JAVA_CC([COMPILER ...])
|
||||||
|
# --------------------------
|
||||||
|
# COMPILER ... is a space separated list of java compilers to search for.
|
||||||
|
# This just gives the user an opportunity to specify an alternative
|
||||||
|
# search list for the java compiler.
|
||||||
|
AU_ALIAS([AC_PROG_JAVA_CC], [AX_PROG_JAVA_CC])
|
||||||
|
AC_DEFUN([AX_PROG_JAVA_CC],
|
||||||
|
[AC_ARG_VAR([JAVA_CC], [java compiler command])dnl
|
||||||
|
AC_ARG_VAR([JAVA_CC_FLAGS], [java compiler flags])dnl
|
||||||
|
m4_ifval([$1],
|
||||||
|
[AC_CHECK_TOOLS(JAVA_CC, [$1])],
|
||||||
|
[AC_CHECK_TOOL(JAVA_CC, gcj)
|
||||||
|
if test -z "$JAVA_CC"; then
|
||||||
|
AC_CHECK_TOOL(JAVA_CC, javac)
|
||||||
|
fi
|
||||||
|
if test -z "$JAVA_CC"; then
|
||||||
|
AC_CHECK_TOOL(JAVA_CC, jikes)
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "$JAVA_CC" = "gcj"; then
|
||||||
|
if test "$GCJ_OPTS" = ""; then
|
||||||
|
AC_SUBST(GCJ_OPTS,-C)
|
||||||
|
fi
|
||||||
|
AC_SUBST(JAVA_CC_OPTS, @GCJ_OPTS@,
|
||||||
|
[Define the compilation options for GCJ])
|
||||||
|
fi
|
||||||
|
test -z "$JAVA_CC" && AC_MSG_ERROR([no acceptable java compiler found in \$PATH])
|
||||||
|
])# AX_PROG_JAVA_CC
|
||||||
134
m4/ax_prog_java_works.m4
Normal file
134
m4/ax_prog_java_works.m4
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_java_works.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVA_WORKS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Internal use ONLY.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 8
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVA_WORKS], [AX_PROG_JAVA_WORKS])
|
||||||
|
AC_DEFUN([AX_PROG_JAVA_WORKS], [
|
||||||
|
AC_PATH_PROG(UUDECODE, uudecode, [no])
|
||||||
|
if test x$UUDECODE != xno; then
|
||||||
|
AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [
|
||||||
|
dnl /**
|
||||||
|
dnl * Test.java: used to test if java compiler works.
|
||||||
|
dnl */
|
||||||
|
dnl public class Test
|
||||||
|
dnl {
|
||||||
|
dnl
|
||||||
|
dnl public static void
|
||||||
|
dnl main( String[] argv )
|
||||||
|
dnl {
|
||||||
|
dnl System.exit (0);
|
||||||
|
dnl }
|
||||||
|
dnl
|
||||||
|
dnl }
|
||||||
|
cat << \EOF > Test.uue
|
||||||
|
begin-base64 644 Test.class
|
||||||
|
yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
|
||||||
|
bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
|
||||||
|
bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
|
||||||
|
YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
|
||||||
|
aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
|
||||||
|
AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
|
||||||
|
AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
|
||||||
|
====
|
||||||
|
EOF
|
||||||
|
if $UUDECODE Test.uue; then
|
||||||
|
ac_cv_prog_uudecode_base64=yes
|
||||||
|
else
|
||||||
|
echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AS_MESSAGE_LOG_FD
|
||||||
|
echo "configure: failed file was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat Test.uue >&AS_MESSAGE_LOG_FD
|
||||||
|
ac_cv_prog_uudecode_base64=no
|
||||||
|
fi
|
||||||
|
rm -f Test.uue])
|
||||||
|
fi
|
||||||
|
if test x$ac_cv_prog_uudecode_base64 != xyes; then
|
||||||
|
rm -f Test.class
|
||||||
|
AC_MSG_WARN([I have to compile Test.class from scratch])
|
||||||
|
if test x$ac_cv_prog_javac_works = xno; then
|
||||||
|
AC_MSG_ERROR([Cannot compile java source. $JAVAC does not work properly])
|
||||||
|
fi
|
||||||
|
if test x$ac_cv_prog_javac_works = x; then
|
||||||
|
AX_PROG_JAVAC
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [
|
||||||
|
JAVA_TEST=Test.java
|
||||||
|
CLASS_TEST=Test.class
|
||||||
|
TEST=Test
|
||||||
|
changequote(, )dnl
|
||||||
|
cat << \EOF > $JAVA_TEST
|
||||||
|
/* [#]line __oline__ "configure" */
|
||||||
|
public class Test {
|
||||||
|
public static void main (String args[]) {
|
||||||
|
System.exit (0);
|
||||||
|
} }
|
||||||
|
EOF
|
||||||
|
changequote([, ])dnl
|
||||||
|
if test x$ac_cv_prog_uudecode_base64 != xyes; then
|
||||||
|
if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
|
||||||
|
AC_MSG_ERROR(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then
|
||||||
|
ac_cv_prog_java_works=yes
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
|
||||||
|
AC_MSG_ERROR(The Java VM $JAVA failed (see config.log, check the CLASSPATH?))
|
||||||
|
fi
|
||||||
|
rm -fr $JAVA_TEST $CLASS_TEST Test.uue
|
||||||
|
])
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
]
|
||||||
|
)
|
||||||
79
m4/ax_prog_javac.m4
Normal file
79
m4/ax_prog_javac.m4
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_javac.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAC
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAC tests an existing Java compiler. It uses the environment
|
||||||
|
# variable JAVAC then tests in sequence various common Java compilers. For
|
||||||
|
# political reasons, it starts with the free ones.
|
||||||
|
#
|
||||||
|
# If you want to force a specific compiler:
|
||||||
|
#
|
||||||
|
# - at the configure.in level, set JAVAC=yourcompiler before calling
|
||||||
|
# AX_PROG_JAVAC
|
||||||
|
#
|
||||||
|
# - at the configure level, setenv JAVAC
|
||||||
|
#
|
||||||
|
# You can use the JAVAC variable in your Makefile.in, with @JAVAC@.
|
||||||
|
#
|
||||||
|
# *Warning*: its success or failure can depend on a proper setting of the
|
||||||
|
# CLASSPATH env. variable.
|
||||||
|
#
|
||||||
|
# TODO: allow to exclude compilers (rationale: most Java programs cannot
|
||||||
|
# compile with some compilers like guavac).
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVAC], [AX_PROG_JAVAC])
|
||||||
|
AC_DEFUN([AX_PROG_JAVAC],[
|
||||||
|
if test "x$JAVAPREFIX" = x; then
|
||||||
|
test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj -C" guavac jikes javac)
|
||||||
|
else
|
||||||
|
test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj -C" guavac jikes javac, $JAVAPREFIX)
|
||||||
|
fi
|
||||||
|
test "x$JAVAC" = x && AC_MSG_ERROR([no acceptable Java compiler found in \$PATH])
|
||||||
|
AX_PROG_JAVAC_WORKS
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
])
|
||||||
72
m4/ax_prog_javac_works.m4
Normal file
72
m4/ax_prog_javac_works.m4
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_javac_works.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAC_WORKS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Internal use ONLY.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
|
#serial 6
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVAC_WORKS], [AX_PROG_JAVAC_WORKS])
|
||||||
|
AC_DEFUN([AX_PROG_JAVAC_WORKS],[
|
||||||
|
AC_CACHE_CHECK([if $JAVAC works], ac_cv_prog_javac_works, [
|
||||||
|
JAVA_TEST=Test.java
|
||||||
|
CLASS_TEST=Test.class
|
||||||
|
cat << \EOF > $JAVA_TEST
|
||||||
|
/* [#]line __oline__ "configure" */
|
||||||
|
public class Test {
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then
|
||||||
|
ac_cv_prog_javac_works=yes
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)])
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
rm -f $JAVA_TEST $CLASS_TEST
|
||||||
|
])
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
])
|
||||||
52
m4/ax_prog_javadoc.m4
Normal file
52
m4/ax_prog_javadoc.m4
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_javadoc.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVADOC
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVADOC tests for an existing javadoc generator. It uses the
|
||||||
|
# environment variable JAVADOC then tests in sequence various common
|
||||||
|
# javadoc generator.
|
||||||
|
#
|
||||||
|
# If you want to force a specific compiler:
|
||||||
|
#
|
||||||
|
# - at the configure.in level, set JAVADOC=yourgenerator before calling
|
||||||
|
# AX_PROG_JAVADOC
|
||||||
|
#
|
||||||
|
# - at the configure level, setenv JAVADOC
|
||||||
|
#
|
||||||
|
# You can use the JAVADOC variable in your Makefile.in, with @JAVADOC@.
|
||||||
|
#
|
||||||
|
# Note: This macro depends on the autoconf M4 macros for Java programs. It
|
||||||
|
# is VERY IMPORTANT that you download that whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission.
|
||||||
|
#
|
||||||
|
# The general documentation of those macros, as well as the sample
|
||||||
|
# configure.in, is included in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Egon Willighagen <e.willighagen@science.ru.nl>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 7
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVADOC], [AX_PROG_JAVADOC])
|
||||||
|
AC_DEFUN([AX_PROG_JAVADOC],[
|
||||||
|
if test "x$JAVAPREFIX" = x; then
|
||||||
|
test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, javadoc)
|
||||||
|
else
|
||||||
|
test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, javadoc, $JAVAPREFIX)
|
||||||
|
fi
|
||||||
|
test "x$JAVADOC" = x && AC_MSG_ERROR([no acceptable javadoc generator found in \$PATH])
|
||||||
|
AC_PROVIDE([$0])dnl
|
||||||
|
])
|
||||||
43
m4/ax_prog_javah.m4
Normal file
43
m4/ax_prog_javah.m4
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_prog_javah.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAH
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_PROG_JAVAH tests the availability of the javah header generator and
|
||||||
|
# looks for the jni.h header file. If available, JAVAH is set to the full
|
||||||
|
# path of javah and CPPFLAGS is updated accordingly.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Luc Maisonobe <luc@spaceroots.org>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 5
|
||||||
|
|
||||||
|
AU_ALIAS([AC_PROG_JAVAH], [AX_PROG_JAVAH])
|
||||||
|
AC_DEFUN([AX_PROG_JAVAH],[
|
||||||
|
AC_REQUIRE([AC_CANONICAL_SYSTEM])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_CPP])dnl
|
||||||
|
AC_PATH_PROG(JAVAH,javah)
|
||||||
|
if test x"`eval 'echo $ac_cv_path_JAVAH'`" != x ; then
|
||||||
|
AC_TRY_CPP([#include <jni.h>],,[
|
||||||
|
ac_save_CPPFLAGS="$CPPFLAGS"
|
||||||
|
changequote(, )dnl
|
||||||
|
ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
|
||||||
|
ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
|
||||||
|
changequote([, ])dnl
|
||||||
|
CPPFLAGS="$ac_save_CPPFLAGS -I$ac_dir -I$ac_dir/$ac_machdep"
|
||||||
|
AC_TRY_CPP([#include <jni.h>],
|
||||||
|
ac_save_CPPFLAGS="$CPPFLAGS",
|
||||||
|
AC_MSG_WARN([unable to include <jni.h>]))
|
||||||
|
CPPFLAGS="$ac_save_CPPFLAGS"])
|
||||||
|
fi])
|
||||||
55
m4/ax_try_compile_java.m4
Normal file
55
m4/ax_try_compile_java.m4
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_try_compile_java.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_TRY_COMPILE_JAVA
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_TRY_COMPILE_JAVA attempt to compile user given source.
|
||||||
|
#
|
||||||
|
# *Warning*: its success or failure can depend on a proper setting of the
|
||||||
|
# CLASSPATH env. variable.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 7
|
||||||
|
|
||||||
|
AU_ALIAS([AC_TRY_COMPILE_JAVA], [AX_TRY_COMPILE_JAVA])
|
||||||
|
AC_DEFUN([AX_TRY_COMPILE_JAVA],[
|
||||||
|
AC_REQUIRE([AX_PROG_JAVAC])dnl
|
||||||
|
cat << \EOF > Test.java
|
||||||
|
/* [#]line __oline__ "configure" */
|
||||||
|
ifelse([$1], , , [import $1;])
|
||||||
|
public class Test {
|
||||||
|
[$2]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class
|
||||||
|
then
|
||||||
|
dnl Don't remove the temporary files here, so they can be examined.
|
||||||
|
ifelse([$3], , :, [$3])
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat Test.java >&AS_MESSAGE_LOG_FD
|
||||||
|
ifelse([$4], , , [ rm -fr Test*
|
||||||
|
$4
|
||||||
|
])dnl
|
||||||
|
fi
|
||||||
|
rm -fr Test*])
|
||||||
56
m4/ax_try_run_java.m4
Normal file
56
m4/ax_try_run_java.m4
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_try_run_java.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_TRY_RUN_JAVA
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# AX_TRY_RUN_JAVA attempt to compile and run user given source.
|
||||||
|
#
|
||||||
|
# *Warning*: its success or failure can depend on a proper setting of the
|
||||||
|
# CLASSPATH env. variable.
|
||||||
|
#
|
||||||
|
# Note: This is part of the set of autoconf M4 macros for Java programs.
|
||||||
|
# It is VERY IMPORTANT that you download the whole set, some macros depend
|
||||||
|
# on other. Unfortunately, the autoconf archive does not support the
|
||||||
|
# concept of set of macros, so I had to break it for submission. The
|
||||||
|
# general documentation, as well as the sample configure.in, is included
|
||||||
|
# in the AX_PROG_JAVA macro.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 1
|
||||||
|
|
||||||
|
AU_ALIAS([AC_TRY_RUN_JAVA], [AX_TRY_RUN_JAVA])
|
||||||
|
AC_DEFUN([AX_TRY_RUN_JAVA],[
|
||||||
|
AC_REQUIRE([AX_PROG_JAVAC])dnl
|
||||||
|
AC_REQUIRE([AX_PROG_JAVA])dnl
|
||||||
|
cat << \EOF > Test.java
|
||||||
|
/* [#]line __oline__ "configure" */
|
||||||
|
ifelse([$1], , , [include $1;])
|
||||||
|
public class Test {
|
||||||
|
[$2]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class && ($JAVA $JAVAFLAGS Test; exit) 2>/dev/null
|
||||||
|
then
|
||||||
|
dnl Don't remove the temporary files here, so they can be examined.
|
||||||
|
ifelse([$3], , :, [$3])
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat Test.java >&AS_MESSAGE_LOG_FD
|
||||||
|
ifelse([$4], , , [ rm -fr Test*
|
||||||
|
$4
|
||||||
|
])dnl
|
||||||
|
fi
|
||||||
|
rm -fr Test*])
|
||||||
330
missing
Executable file
330
missing
Executable file
@@ -0,0 +1,330 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
|
scriptversion=2012-01-06.18; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2012 Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
run=:
|
||||||
|
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||||
|
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||||
|
|
||||||
|
# In the cases where this matters, 'missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
--run)
|
||||||
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file 'aclocal.m4'
|
||||||
|
autoconf touch file 'configure'
|
||||||
|
autoheader touch file 'config.h.in'
|
||||||
|
autom4te touch the output file, or create a stub one
|
||||||
|
automake touch all 'Makefile.in' files
|
||||||
|
bison create 'y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create 'lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create 'lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
yacc create 'y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||||
|
'g' are ignored when checking the name.
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: Unknown '$1' option"
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# normalize program name to check for.
|
||||||
|
program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program). This is about non-GNU programs, so use $1 not
|
||||||
|
# $program.
|
||||||
|
case $1 in
|
||||||
|
lex*|yacc*)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
|
# We have it, but it failed.
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running '$TOOL --version' or '$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
|
# try to emulate it.
|
||||||
|
case $program in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'acinclude.m4' or '${configure_ac}'. You might want
|
||||||
|
to install the Automake and Perl packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified '${configure_ac}'. You might want to install the
|
||||||
|
Autoconf and GNU m4 packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'acconfig.h' or '${configure_ac}'. You might want
|
||||||
|
to install the Autoconf and GNU m4 packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case $f in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'.
|
||||||
|
You might want to install the Automake and Perl packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get '$1' as part of Autoconf from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison*|yacc*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' $msg. You should only need it if
|
||||||
|
you modified a '.y' file. You may need the Bison package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
Bison from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.h; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.c; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex*|flex*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a '.l' file. You may need the Flex package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
Flex from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f lex.yy.c; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
Help2man package in order for those modifications to take
|
||||||
|
effect. You can get Help2man from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is $msg. You should only need it if
|
||||||
|
you modified a '.texi' or '.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy 'make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the Texinfo package or
|
||||||
|
the GNU make package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '
|
||||||
|
/^@setfilename/{
|
||||||
|
s/.* \([^ ]*\) *$/\1/
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: '$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the 'README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing '$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
35
src/Makefile.am
Normal file
35
src/Makefile.am
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libffts.la
|
||||||
|
|
||||||
|
libffts_la_SOURCES = ffts.c ffts_nd.c ffts_real.c ffts_real_nd.c ffts_transpose.c ffts_trig.c ffts_static.c ffts_chirp_z.c
|
||||||
|
libffts_la_SOURCES += codegen.h codegen_arm.h codegen_sse.h ffts.h ffts_nd.h ffts_real.h ffts_real_nd.h ffts_small.h ffts_static.h macros-alpha.h macros-altivec.h macros-neon.h macros-sse.h macros.h neon.h neon_float.h patterns.h types.h vfp.h
|
||||||
|
|
||||||
|
if DYNAMIC_DISABLED
|
||||||
|
libffts_la_SOURCES += ffts_static.c
|
||||||
|
else
|
||||||
|
libffts_la_SOURCES += codegen.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
libffts_includedir=$(includedir)/ffts
|
||||||
|
libffts_include_HEADERS = ../include/ffts.h
|
||||||
|
|
||||||
|
AM_CFLAGS = -I$(top_srcdir)/include -DAUTOTOOLS_BUILD=yes
|
||||||
|
|
||||||
|
if HAVE_VFP
|
||||||
|
libffts_la_SOURCES += vfp.s
|
||||||
|
else
|
||||||
|
if HAVE_NEON
|
||||||
|
|
||||||
|
libffts_la_SOURCES += neon.s
|
||||||
|
|
||||||
|
if DYNAMIC_DISABLED
|
||||||
|
libffts_la_SOURCES += neon_static_f.s neon_static_i.s
|
||||||
|
endif
|
||||||
|
|
||||||
|
else
|
||||||
|
if HAVE_SSE
|
||||||
|
libffts_la_SOURCES += macros-sse.h
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
730
src/Makefile.in
Normal file
730
src/Makefile.in
Normal file
@@ -0,0 +1,730 @@
|
|||||||
|
# Makefile.in generated by automake 1.14 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
@DYNAMIC_DISABLED_TRUE@am__append_1 = ffts_static.c
|
||||||
|
@DYNAMIC_DISABLED_FALSE@am__append_2 = codegen.c
|
||||||
|
@HAVE_VFP_TRUE@am__append_3 = vfp.s
|
||||||
|
@HAVE_NEON_TRUE@@HAVE_VFP_FALSE@am__append_4 = neon.s
|
||||||
|
@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@@HAVE_VFP_FALSE@am__append_5 = neon_static_f.s neon_static_i.s
|
||||||
|
@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@@HAVE_VFP_FALSE@am__append_6 = sse.s
|
||||||
|
subdir = src
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||||
|
$(top_srcdir)/depcomp $(libffts_include_HEADERS)
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_classpath.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_check_java_home.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_java_options.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_jni_include_dir.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_jar.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac.m4 \
|
||||||
|
$(top_srcdir)/m4/ax_prog_javac_works.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__installdirs = "$(DESTDIR)$(libdir)" \
|
||||||
|
"$(DESTDIR)$(libffts_includedir)"
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
libffts_la_LIBADD =
|
||||||
|
am__libffts_la_SOURCES_DIST = ffts.c ffts_small.c ffts_nd.c \
|
||||||
|
ffts_real.c ffts_real_nd.c patterns.c codegen.h codegen_arm.h \
|
||||||
|
codegen_sse.h ffts.h ffts_nd.h ffts_real.h ffts_real_nd.h \
|
||||||
|
ffts_small.h ffts_static.h macros-alpha.h macros-altivec.h \
|
||||||
|
macros-neon.h macros-sse.h macros.h neon.h neon_float.h \
|
||||||
|
patterns.h types.h vfp.h ffts_static.c codegen.c vfp.s neon.s \
|
||||||
|
neon_static_f.s neon_static_i.s sse.s
|
||||||
|
@DYNAMIC_DISABLED_TRUE@am__objects_1 = ffts_static.lo
|
||||||
|
@DYNAMIC_DISABLED_FALSE@am__objects_2 = codegen.lo
|
||||||
|
@HAVE_VFP_TRUE@am__objects_3 = vfp.lo
|
||||||
|
@HAVE_NEON_TRUE@@HAVE_VFP_FALSE@am__objects_4 = neon.lo
|
||||||
|
@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@@HAVE_VFP_FALSE@am__objects_5 = neon_static_f.lo \
|
||||||
|
@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@@HAVE_VFP_FALSE@ neon_static_i.lo
|
||||||
|
@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@@HAVE_VFP_FALSE@am__objects_6 = \
|
||||||
|
@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@@HAVE_VFP_FALSE@ sse.lo
|
||||||
|
am_libffts_la_OBJECTS = ffts.lo ffts_small.lo ffts_nd.lo ffts_real.lo \
|
||||||
|
ffts_real_nd.lo patterns.lo $(am__objects_1) $(am__objects_2) \
|
||||||
|
$(am__objects_3) $(am__objects_4) $(am__objects_5) \
|
||||||
|
$(am__objects_6)
|
||||||
|
libffts_la_OBJECTS = $(am_libffts_la_OBJECTS)
|
||||||
|
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
|
am__v_lt_0 = --silent
|
||||||
|
am__v_lt_1 =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||||
|
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||||
|
$(AM_CFLAGS) $(CFLAGS)
|
||||||
|
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||||
|
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||||
|
am__v_CC_0 = @echo " CC " $@;
|
||||||
|
am__v_CC_1 =
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||||
|
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||||
|
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||||
|
am__v_CCLD_1 =
|
||||||
|
CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
|
||||||
|
LTCCASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
|
||||||
|
$(CCASFLAGS)
|
||||||
|
AM_V_CCAS = $(am__v_CCAS_@AM_V@)
|
||||||
|
am__v_CCAS_ = $(am__v_CCAS_@AM_DEFAULT_V@)
|
||||||
|
am__v_CCAS_0 = @echo " CCAS " $@;
|
||||||
|
am__v_CCAS_1 =
|
||||||
|
SOURCES = $(libffts_la_SOURCES)
|
||||||
|
DIST_SOURCES = $(am__libffts_la_SOURCES_DIST)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
HEADERS = $(libffts_include_HEADERS)
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
'
|
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCAS = @CCAS@
|
||||||
|
CCASDEPMODE = @CCASDEPMODE@
|
||||||
|
CCASFLAGS = @CCASFLAGS@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
JAR = @JAR@
|
||||||
|
JAVA = @JAVA@
|
||||||
|
JAVAC = @JAVAC@
|
||||||
|
JAVACFLAGS = @JAVACFLAGS@
|
||||||
|
JAVAFLAGS = @JAVAFLAGS@
|
||||||
|
JAVAPREFIX = @JAVAPREFIX@
|
||||||
|
JAVA_PATH_NAME = @JAVA_PATH_NAME@
|
||||||
|
JNI_CPPFLAGS = @JNI_CPPFLAGS@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
_ACJNI_JAVAC = @_ACJNI_JAVAC@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
lib_LTLIBRARIES = libffts.la
|
||||||
|
libffts_la_SOURCES = ffts.c ffts_small.c ffts_nd.c ffts_real.c \
|
||||||
|
ffts_real_nd.c patterns.c codegen.h codegen_arm.h \
|
||||||
|
codegen_sse.h ffts.h ffts_nd.h ffts_real.h ffts_real_nd.h \
|
||||||
|
ffts_small.h ffts_static.h macros-alpha.h macros-altivec.h \
|
||||||
|
macros-neon.h macros-sse.h macros.h neon.h neon_float.h \
|
||||||
|
patterns.h types.h vfp.h $(am__append_1) $(am__append_2) \
|
||||||
|
$(am__append_3) $(am__append_4) $(am__append_5) \
|
||||||
|
$(am__append_6)
|
||||||
|
libffts_includedir = $(includedir)/ffts
|
||||||
|
libffts_include_HEADERS = ../include/ffts.h
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj .s
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||||
|
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu src/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
list2=; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
list2="$$list2 $$p"; \
|
||||||
|
else :; fi; \
|
||||||
|
done; \
|
||||||
|
test -z "$$list2" || { \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
|
||||||
|
}
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
for p in $$list; do \
|
||||||
|
$(am__strip_dir) \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES:
|
||||||
|
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; \
|
||||||
|
locs=`for p in $$list; do echo $$p; done | \
|
||||||
|
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||||
|
sort -u`; \
|
||||||
|
test -z "$$locs" || { \
|
||||||
|
echo rm -f $${locs}; \
|
||||||
|
rm -f $${locs}; \
|
||||||
|
}
|
||||||
|
|
||||||
|
libffts.la: $(libffts_la_OBJECTS) $(libffts_la_DEPENDENCIES) $(EXTRA_libffts_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libffts_la_OBJECTS) $(libffts_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codegen.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_nd.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_real.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_real_nd.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_small.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_static.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/patterns.Plo@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
.s.o:
|
||||||
|
$(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
.s.obj:
|
||||||
|
$(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.s.lo:
|
||||||
|
$(AM_V_CCAS)$(LTCCASCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
install-libffts_includeHEADERS: $(libffts_include_HEADERS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(libffts_include_HEADERS)'; test -n "$(libffts_includedir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(libffts_includedir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(libffts_includedir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libffts_includedir)'"; \
|
||||||
|
$(INSTALL_HEADER) $$files "$(DESTDIR)$(libffts_includedir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-libffts_includeHEADERS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(libffts_include_HEADERS)'; test -n "$(libffts_includedir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(libffts_includedir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
ID: $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-am
|
||||||
|
TAGS: tags
|
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
shift; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
if test $$# -gt 0; then \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
"$$@" $$unique; \
|
||||||
|
else \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$unique; \
|
||||||
|
fi; \
|
||||||
|
fi
|
||||||
|
ctags: ctags-am
|
||||||
|
|
||||||
|
CTAGS: ctags
|
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& $(am__cd) $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
|
cscopelist: cscopelist-am
|
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files)
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libffts_includedir)"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||||
|
mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-libffts_includeHEADERS
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am: install-libLTLIBRARIES
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-pdf-am:
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
install-ps-am:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-libLTLIBRARIES \
|
||||||
|
uninstall-libffts_includeHEADERS
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||||
|
clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
|
||||||
|
ctags-am distclean distclean-compile distclean-generic \
|
||||||
|
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||||
|
html-am info info-am install install-am install-data \
|
||||||
|
install-data-am install-dvi install-dvi-am install-exec \
|
||||||
|
install-exec-am install-html install-html-am install-info \
|
||||||
|
install-info-am install-libLTLIBRARIES \
|
||||||
|
install-libffts_includeHEADERS install-man install-pdf \
|
||||||
|
install-pdf-am install-ps install-ps-am install-strip \
|
||||||
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \
|
||||||
|
uninstall-libffts_includeHEADERS
|
||||||
|
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
6
src/arch/.gitignore
vendored
Normal file
6
src/arch/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/.deps
|
||||||
|
/.libs
|
||||||
|
/*.la
|
||||||
|
/*.lo
|
||||||
4805
src/arch/ChangeLog
Normal file
4805
src/arch/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
21
src/arch/LICENSE
Normal file
21
src/arch/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
Copyright (c) 2001, 2002, 2003 Ximian, Inc and the individuals listed
|
||||||
|
on the ChangeLog entries.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
11
src/arch/Makefile.am
Normal file
11
src/arch/Makefile.am
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
DIST_SUBDIRS = x86 ppc sparc arm arm64 s390x amd64 ia64 mips
|
||||||
|
|
||||||
|
AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)
|
||||||
|
|
||||||
|
if ARM
|
||||||
|
# arm needs to build some stuff even in JIT mode
|
||||||
|
SUBDIRS = $(arch_target)
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST = ChangeLog
|
||||||
|
|
||||||
7
src/arch/README
Normal file
7
src/arch/README
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
mono_arch
|
||||||
|
=========
|
||||||
|
|
||||||
|
Part of Mono project, https://github.com/mono
|
||||||
|
|
||||||
|
These are C macros that are useful when generating native code on various platforms.
|
||||||
|
This code is MIT X11 licensed.
|
||||||
1
src/arch/arm/.gitattributes
vendored
Normal file
1
src/arch/arm/.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/arm-wmmx.h -crlf
|
||||||
15
src/arch/arm/.gitignore
vendored
Normal file
15
src/arch/arm/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/.deps
|
||||||
|
/.libs
|
||||||
|
/*.o
|
||||||
|
/*.la
|
||||||
|
/*.lo
|
||||||
|
/*.lib
|
||||||
|
/*.obj
|
||||||
|
/*.exe
|
||||||
|
/*.dll
|
||||||
|
/arm_dpimacros.h
|
||||||
|
/arm_fpamacros.h
|
||||||
|
/arm_vfpmacros.h
|
||||||
|
/fixeol.sh
|
||||||
27
src/arch/arm/Makefile.am
Normal file
27
src/arch/arm/Makefile.am
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libmonoarch-arm.la
|
||||||
|
|
||||||
|
BUILT_SOURCES = arm_dpimacros.h arm_vfpmacros.h
|
||||||
|
|
||||||
|
|
||||||
|
libmonoarch_arm_la_SOURCES = $(BUILT_SOURCES) \
|
||||||
|
arm-codegen.c \
|
||||||
|
arm-codegen.h \
|
||||||
|
arm-dis.c \
|
||||||
|
arm-dis.h
|
||||||
|
|
||||||
|
arm_dpimacros.h: dpiops.sh mov_macros.th dpi_macros.th cmp_macros.th
|
||||||
|
(cd $(srcdir); bash ./dpiops.sh) > $@t
|
||||||
|
mv $@t $@
|
||||||
|
|
||||||
|
arm_vfpmacros.h: vfpops.sh vfpm_macros.th vfp_macros.th
|
||||||
|
(cd $(srcdir); bash ./vfpops.sh) > $@t
|
||||||
|
mv $@t $@
|
||||||
|
|
||||||
|
CLEANFILES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
|
EXTRA_DIST = dpiops.sh mov_macros.th dpi_macros.th cmp_macros.th \
|
||||||
|
vfpm_macros.th vfp_macros.th arm-vfp-codegen.h vfpops.sh
|
||||||
|
|
||||||
193
src/arch/arm/arm-codegen.c
Normal file
193
src/arch/arm/arm-codegen.c
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* arm-codegen.c
|
||||||
|
* Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "arm-codegen.h"
|
||||||
|
|
||||||
|
|
||||||
|
arminstr_t* arm_emit_std_prologue(arminstr_t* p, unsigned int local_size) {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_IP, ARMREG_SP);
|
||||||
|
|
||||||
|
/* save args */
|
||||||
|
ARM_PUSH(p, (1 << ARMREG_A1)
|
||||||
|
| (1 << ARMREG_A2)
|
||||||
|
| (1 << ARMREG_A3)
|
||||||
|
| (1 << ARMREG_A4));
|
||||||
|
|
||||||
|
ARM_PUSH(p, (1U << ARMREG_IP) | (1U << ARMREG_LR));
|
||||||
|
|
||||||
|
if (local_size != 0) {
|
||||||
|
if ((local_size & (~0xFF)) == 0) {
|
||||||
|
ARM_SUB_REG_IMM8(p, ARMREG_SP, ARMREG_SP, local_size);
|
||||||
|
} else {
|
||||||
|
/* TODO: optimize */
|
||||||
|
p = arm_mov_reg_imm32(p, ARMREG_IP, local_size);
|
||||||
|
ARM_SUB_REG_REG(p, ARMREG_SP, ARMREG_SP, ARMREG_IP);
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_IP, ARMREG_IP, sizeof(armword_t));
|
||||||
|
ARM_LDR_REG_REG(p, ARMREG_IP, ARMREG_SP, ARMREG_IP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
arminstr_t* arm_emit_std_epilogue(arminstr_t* p, unsigned int local_size, int pop_regs) {
|
||||||
|
if (local_size != 0) {
|
||||||
|
if ((local_size & (~0xFF)) == 0) {
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_SP, ARMREG_SP, local_size);
|
||||||
|
} else {
|
||||||
|
/* TODO: optimize */
|
||||||
|
p = arm_mov_reg_imm32(p, ARMREG_IP, local_size);
|
||||||
|
ARM_ADD_REG_REG(p, ARMREG_SP, ARMREG_SP, ARMREG_IP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ARM_POP_NWB(p, (1 << ARMREG_SP) | (1 << ARMREG_PC) | (pop_regs & 0x3FF));
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* do not push A1-A4 */
|
||||||
|
arminstr_t* arm_emit_lean_prologue(arminstr_t* p, unsigned int local_size, int push_regs) {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_IP, ARMREG_SP);
|
||||||
|
/* push_regs upto R10 will be saved */
|
||||||
|
ARM_PUSH(p, (1U << ARMREG_IP) | (1U << ARMREG_LR) | (push_regs & 0x3FF));
|
||||||
|
|
||||||
|
if (local_size != 0) {
|
||||||
|
if ((local_size & (~0xFF)) == 0) {
|
||||||
|
ARM_SUB_REG_IMM8(p, ARMREG_SP, ARMREG_SP, local_size);
|
||||||
|
} else {
|
||||||
|
/* TODO: optimize */
|
||||||
|
p = arm_mov_reg_imm32(p, ARMREG_IP, local_size);
|
||||||
|
ARM_SUB_REG_REG(p, ARMREG_SP, ARMREG_SP, ARMREG_IP);
|
||||||
|
/* restore IP from stack */
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_IP, ARMREG_IP, sizeof(armword_t));
|
||||||
|
ARM_LDR_REG_REG(p, ARMREG_IP, ARMREG_SP, ARMREG_IP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bit scan forward. */
|
||||||
|
int arm_bsf(armword_t val) {
|
||||||
|
int i;
|
||||||
|
armword_t mask;
|
||||||
|
|
||||||
|
if (val == 0) return 0;
|
||||||
|
for (i=1, mask=1; (i <= 8 * sizeof(armword_t)) && ((val & mask) == 0); ++i, mask<<=1);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int arm_is_power_of_2(armword_t val) {
|
||||||
|
return ((val & (val-1)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* 1 - unable to represent
|
||||||
|
* positive even number - MOV-representable
|
||||||
|
* negative even number - MVN-representable
|
||||||
|
*/
|
||||||
|
int calc_arm_mov_const_shift(armword_t val) {
|
||||||
|
armword_t mask;
|
||||||
|
int res = 1, shift;
|
||||||
|
|
||||||
|
for (shift=0; shift < 32; shift+=2) {
|
||||||
|
mask = ARM_SCALE(0xFF, shift);
|
||||||
|
if ((val & (~mask)) == 0) {
|
||||||
|
res = shift;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (((~val) & (~mask)) == 0) {
|
||||||
|
res = -shift - 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int is_arm_const(armword_t val) {
|
||||||
|
int res;
|
||||||
|
res = arm_is_power_of_2(val);
|
||||||
|
if (!res) {
|
||||||
|
res = calc_arm_mov_const_shift(val);
|
||||||
|
res = !(res < 0 || res == 1);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int arm_const_steps(armword_t val) {
|
||||||
|
int shift, steps = 0;
|
||||||
|
|
||||||
|
while (val != 0) {
|
||||||
|
shift = (arm_bsf(val) - 1) & (~1);
|
||||||
|
val &= ~(0xFF << shift);
|
||||||
|
++steps;
|
||||||
|
}
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARM cannot load arbitrary 32-bit constants directly into registers;
|
||||||
|
* widely used work-around for this is to store constants into a
|
||||||
|
* PC-addressable pool and use LDR instruction with PC-relative address
|
||||||
|
* to load constant into register. Easiest way to implement this is to
|
||||||
|
* embed constant inside a function with unconditional branch around it.
|
||||||
|
* The above method is not used at the moment.
|
||||||
|
* This routine always emits sequence of instructions to generate
|
||||||
|
* requested constant. In the worst case it takes 4 instructions to
|
||||||
|
* synthesize a constant - 1 MOV and 3 subsequent ORRs.
|
||||||
|
*/
|
||||||
|
arminstr_t* arm_mov_reg_imm32_cond(arminstr_t* p, int reg, armword_t imm32, int cond) {
|
||||||
|
int mov_op;
|
||||||
|
int step_op;
|
||||||
|
int snip;
|
||||||
|
int shift = calc_arm_mov_const_shift(imm32);
|
||||||
|
|
||||||
|
if ((shift & 0x80000001) != 1) {
|
||||||
|
if (shift >= 0) {
|
||||||
|
ARM_MOV_REG_IMM_COND(p, reg, imm32 >> ((32 - shift) & 31), shift, cond);
|
||||||
|
} else {
|
||||||
|
ARM_MVN_REG_IMM_COND(p, reg, (imm32 ^ (~0)) >> ((32 + 2 + shift) & 31), (-shift - 2), cond);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mov_op = ARMOP_MOV;
|
||||||
|
step_op = ARMOP_ORR;
|
||||||
|
|
||||||
|
if (arm_const_steps(imm32) > arm_const_steps(~imm32)) {
|
||||||
|
mov_op = ARMOP_MVN;
|
||||||
|
step_op = ARMOP_SUB;
|
||||||
|
imm32 = ~imm32;
|
||||||
|
}
|
||||||
|
|
||||||
|
shift = (arm_bsf(imm32) - 1) & (~1);
|
||||||
|
snip = imm32 & (0xFF << shift);
|
||||||
|
ARM_EMIT(p, ARM_DEF_DPI_IMM_COND((unsigned)snip >> shift, (32 - shift) >> 1, reg, 0, 0, mov_op, cond));
|
||||||
|
|
||||||
|
while ((imm32 ^= snip) != 0) {
|
||||||
|
shift = (arm_bsf(imm32) - 1) & (~1);
|
||||||
|
snip = imm32 & (0xFF << shift);
|
||||||
|
ARM_EMIT(p, ARM_DEF_DPI_IMM_COND((unsigned)snip >> shift, (32 - shift) >> 1, reg, reg, 0, step_op, cond));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
arminstr_t* arm_mov_reg_imm32(arminstr_t* p, int reg, armword_t imm32) {
|
||||||
|
return arm_mov_reg_imm32_cond(p, reg, imm32, ARMCOND_AL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1127
src/arch/arm/arm-codegen.h
Normal file
1127
src/arch/arm/arm-codegen.h
Normal file
File diff suppressed because it is too large
Load Diff
509
src/arch/arm/arm-dis.c
Normal file
509
src/arch/arm/arm-dis.c
Normal file
@@ -0,0 +1,509 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "arm-dis.h"
|
||||||
|
#include "arm-codegen.h"
|
||||||
|
|
||||||
|
|
||||||
|
static ARMDis* gdisasm = NULL;
|
||||||
|
|
||||||
|
static int use_reg_alias = 1;
|
||||||
|
|
||||||
|
const static char* cond[] = {
|
||||||
|
"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
|
||||||
|
"hi", "ls", "ge", "lt", "gt", "le", "", "nv"
|
||||||
|
};
|
||||||
|
|
||||||
|
const static char* ops[] = {
|
||||||
|
"and", "eor", "sub", "rsb", "add", "adc", "sbc", "rsc",
|
||||||
|
"tst", "teq", "cmp", "cmn", "orr", "mov", "bic", "mvn"
|
||||||
|
};
|
||||||
|
|
||||||
|
const static char* shift_types[] = {"lsl", "lsr", "asr", "ror"};
|
||||||
|
|
||||||
|
const static char* mul_ops[] = {
|
||||||
|
"mul", "mla", "?", "?", "umull", "umlal", "smull", "smlal"
|
||||||
|
};
|
||||||
|
|
||||||
|
const static char* reg_alias[] = {
|
||||||
|
"a1", "a2", "a3", "a4",
|
||||||
|
"r4", "r5", "r6", "r7", "r8", "r9", "r10",
|
||||||
|
"fp", "ip", "sp", "lr", "pc"
|
||||||
|
};
|
||||||
|
|
||||||
|
const static char* msr_fld[] = {"f", "c", "x", "?", "s"};
|
||||||
|
|
||||||
|
|
||||||
|
/* private functions prototypes (to keep compiler happy) */
|
||||||
|
void chk_out(ARMDis* dis);
|
||||||
|
void dump_reg(ARMDis* dis, int reg);
|
||||||
|
void dump_creg(ARMDis* dis, int creg);
|
||||||
|
void dump_reglist(ARMDis* dis, int reg_list);
|
||||||
|
void init_gdisasm(void);
|
||||||
|
|
||||||
|
void dump_br(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_cdp(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_cdt(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_crt(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_dpi(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_hxfer(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_mrs(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_mrt(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_msr(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_mul(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_swi(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_swp(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_wxfer(ARMDis* dis, ARMInstr i);
|
||||||
|
void dump_clz(ARMDis* dis, ARMInstr i);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
void out(ARMDis* dis, const char* format, ...) {
|
||||||
|
va_list arglist;
|
||||||
|
va_start(arglist, format);
|
||||||
|
fprintf(dis->dis_out, format, arglist);
|
||||||
|
va_end(arglist);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void chk_out(ARMDis* dis) {
|
||||||
|
if (dis != NULL && dis->dis_out == NULL) dis->dis_out = stdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_set_output(ARMDis* dis, FILE* f) {
|
||||||
|
if (dis != NULL) {
|
||||||
|
dis->dis_out = f;
|
||||||
|
chk_out(dis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE* armdis_get_output(ARMDis* dis) {
|
||||||
|
return (dis != NULL ? dis->dis_out : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void dump_reg(ARMDis* dis, int reg) {
|
||||||
|
reg &= 0xF;
|
||||||
|
if (!use_reg_alias || (reg > 3 && reg < 11)) {
|
||||||
|
fprintf(dis->dis_out, "r%d", reg);
|
||||||
|
} else {
|
||||||
|
fprintf(dis->dis_out, "%s", reg_alias[reg]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_creg(ARMDis* dis, int creg) {
|
||||||
|
if (dis != NULL) {
|
||||||
|
creg &= 0xF;
|
||||||
|
fprintf(dis->dis_out, "c%d", creg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_reglist(ARMDis* dis, int reg_list) {
|
||||||
|
int i = 0, j, n = 0;
|
||||||
|
int m1 = 1, m2, rn;
|
||||||
|
while (i < 16) {
|
||||||
|
if ((reg_list & m1) != 0) {
|
||||||
|
if (n != 0) fprintf(dis->dis_out, ", ");
|
||||||
|
n++;
|
||||||
|
dump_reg(dis, i);
|
||||||
|
for (j = i+1, rn = 0, m2 = m1<<1; j < 16; ++j, m2<<=1) {
|
||||||
|
if ((reg_list & m2) != 0) ++rn;
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
i+=rn;
|
||||||
|
if (rn > 1) {
|
||||||
|
fprintf(dis->dis_out, "-");
|
||||||
|
dump_reg(dis, i);
|
||||||
|
} else if (rn == 1) {
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i);
|
||||||
|
}
|
||||||
|
m1<<=(rn+1);
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
++i;
|
||||||
|
m1<<=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_br(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "b%s%s\t%x\t; %p -> %#x",
|
||||||
|
(i.br.link == 1) ? "l" : "",
|
||||||
|
cond[i.br.cond], i.br.offset, dis->pi, (int)dis->pi + 4*2 + ((int)(i.br.offset << 8) >> 6));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_dpi(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s", ops[i.dpi.all.opcode], cond[i.dpi.all.cond]);
|
||||||
|
|
||||||
|
if ((i.dpi.all.opcode < ARMOP_TST || i.dpi.all.opcode > ARMOP_CMN) && (i.dpi.all.s != 0)) {
|
||||||
|
fprintf(dis->dis_out, "s");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(dis->dis_out, "\t");
|
||||||
|
|
||||||
|
if ((i.dpi.all.opcode < ARMOP_TST) || (i.dpi.all.opcode > ARMOP_CMN)) {
|
||||||
|
/* for comparison operations Rd is ignored */
|
||||||
|
dump_reg(dis, i.dpi.all.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((i.dpi.all.opcode != ARMOP_MOV) && (i.dpi.all.opcode != ARMOP_MVN)) {
|
||||||
|
/* for MOV/MVN Rn is ignored */
|
||||||
|
dump_reg(dis, i.dpi.all.rn);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.dpi.all.type == 1) {
|
||||||
|
/* immediate */
|
||||||
|
if (i.dpi.op2_imm.rot != 0) {
|
||||||
|
fprintf(dis->dis_out, "#%d, %d\t; 0x%x", i.dpi.op2_imm.imm, i.dpi.op2_imm.rot << 1,
|
||||||
|
ARM_SCALE(i.dpi.op2_imm.imm, (i.dpi.op2_imm.rot << 1)) );
|
||||||
|
} else {
|
||||||
|
fprintf(dis->dis_out, "#%d\t; 0x%x", i.dpi.op2_imm.imm, i.dpi.op2_imm.imm);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* reg-reg */
|
||||||
|
if (i.dpi.op2_reg.tag == 0) {
|
||||||
|
/* op2 is reg shift by imm */
|
||||||
|
dump_reg(dis, i.dpi.op2_reg_imm.r2.rm);
|
||||||
|
if (i.dpi.op2_reg_imm.imm.shift != 0) {
|
||||||
|
fprintf(dis->dis_out, " %s #%d", shift_types[i.dpi.op2_reg_imm.r2.type], i.dpi.op2_reg_imm.imm.shift);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* op2 is reg shift by reg */
|
||||||
|
dump_reg(dis, i.dpi.op2_reg_reg.r2.rm);
|
||||||
|
fprintf(dis->dis_out, " %s ", shift_types[i.dpi.op2_reg_reg.r2.type]);
|
||||||
|
dump_reg(dis, i.dpi.op2_reg_reg.reg.rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_wxfer(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s%s%s\t",
|
||||||
|
(i.wxfer.all.ls == 0) ? "str" : "ldr",
|
||||||
|
cond[i.generic.cond],
|
||||||
|
(i.wxfer.all.b == 0) ? "" : "b",
|
||||||
|
(i.wxfer.all.ls != 0 && i.wxfer.all.wb != 0) ? "t" : "");
|
||||||
|
dump_reg(dis, i.wxfer.all.rd);
|
||||||
|
fprintf(dis->dis_out, ", [");
|
||||||
|
dump_reg(dis, i.wxfer.all.rn);
|
||||||
|
fprintf(dis->dis_out, "%s, ", (i.wxfer.all.p == 0) ? "]" : "");
|
||||||
|
|
||||||
|
if (i.wxfer.all.type == 0) { /* imm */
|
||||||
|
fprintf(dis->dis_out, "#%s%d", (i.wxfer.all.u == 0) ? "-" : "", i.wxfer.all.op2_imm);
|
||||||
|
} else {
|
||||||
|
dump_reg(dis, i.wxfer.op2_reg_imm.r2.rm);
|
||||||
|
if (i.wxfer.op2_reg_imm.imm.shift != 0) {
|
||||||
|
fprintf(dis->dis_out, " %s #%d", shift_types[i.wxfer.op2_reg_imm.r2.type], i.wxfer.op2_reg_imm.imm.shift);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.wxfer.all.p != 0) {
|
||||||
|
/* close pre-index instr, also check for write-back */
|
||||||
|
fprintf(dis->dis_out, "]%s", (i.wxfer.all.wb != 0) ? "!" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_hxfer(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s%s%s\t",
|
||||||
|
(i.hxfer.ls == 0) ? "str" : "ldr",
|
||||||
|
cond[i.generic.cond],
|
||||||
|
(i.hxfer.s != 0) ? "s" : "",
|
||||||
|
(i.hxfer.h != 0) ? "h" : "b");
|
||||||
|
dump_reg(dis, i.hxfer.rd);
|
||||||
|
fprintf(dis->dis_out, ", [");
|
||||||
|
dump_reg(dis, i.hxfer.rn);
|
||||||
|
fprintf(dis->dis_out, "%s, ", (i.hxfer.p == 0) ? "]" : "");
|
||||||
|
|
||||||
|
if (i.hxfer.type != 0) { /* imm */
|
||||||
|
fprintf(dis->dis_out, "#%s%d", (i.hxfer.u == 0) ? "-" : "", (i.hxfer.imm_hi << 4) | i.hxfer.rm);
|
||||||
|
} else {
|
||||||
|
dump_reg(dis, i.hxfer.rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.hxfer.p != 0) {
|
||||||
|
/* close pre-index instr, also check for write-back */
|
||||||
|
fprintf(dis->dis_out, "]%s", (i.hxfer.wb != 0) ? "!" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_mrt(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s%s%s\t", (i.mrt.ls == 0) ? "stm" : "ldm", cond[i.mrt.cond],
|
||||||
|
(i.mrt.u == 0) ? "d" : "i", (i.mrt.p == 0) ? "a" : "b");
|
||||||
|
dump_reg(dis, i.mrt.rn);
|
||||||
|
fprintf(dis->dis_out, "%s, {", (i.mrt.wb != 0) ? "!" : "");
|
||||||
|
dump_reglist(dis, i.mrt.reg_list);
|
||||||
|
fprintf(dis->dis_out, "}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_swp(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "swp%s%s ", cond[i.swp.cond], (i.swp.b != 0) ? "b" : "");
|
||||||
|
dump_reg(dis, i.swp.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.swp.rm);
|
||||||
|
fprintf(dis->dis_out, ", [");
|
||||||
|
dump_reg(dis, i.swp.rn);
|
||||||
|
fprintf(dis->dis_out, "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_mul(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s%s\t", mul_ops[i.mul.opcode], cond[i.mul.cond], (i.mul.s != 0) ? "s" : "");
|
||||||
|
switch (i.mul.opcode) {
|
||||||
|
case ARMOP_MUL:
|
||||||
|
dump_reg(dis, i.mul.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rm);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rs);
|
||||||
|
break;
|
||||||
|
case ARMOP_MLA:
|
||||||
|
dump_reg(dis, i.mul.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rm);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rs);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rn);
|
||||||
|
break;
|
||||||
|
case ARMOP_UMULL:
|
||||||
|
case ARMOP_UMLAL:
|
||||||
|
case ARMOP_SMULL:
|
||||||
|
case ARMOP_SMLAL:
|
||||||
|
dump_reg(dis, i.mul.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rn);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rm);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.mul.rs);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(dis->dis_out, "DCD 0x%x\t; <unknown>", i.raw);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_cdp(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "cdp%s\tp%d, %d, ", cond[i.generic.cond], i.cdp.cpn, i.cdp.op);
|
||||||
|
dump_creg(dis, i.cdp.crd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_creg(dis, i.cdp.crn);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_creg(dis, i.cdp.crm);
|
||||||
|
|
||||||
|
if (i.cdp.op2 != 0) {
|
||||||
|
fprintf(dis->dis_out, ", %d", i.cdp.op2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_cdt(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s%s\tp%d, ", (i.cdt.ls == 0) ? "stc" : "ldc",
|
||||||
|
cond[i.generic.cond], (i.cdt.n != 0) ? "l" : "", i.cdt.cpn);
|
||||||
|
dump_creg(dis, i.cdt.crd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.cdt.rn);
|
||||||
|
|
||||||
|
if (i.cdt.p == 0) {
|
||||||
|
fprintf(dis->dis_out, "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.cdt.offs != 0) {
|
||||||
|
fprintf(dis->dis_out, ", #%d", i.cdt.offs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.cdt.p != 0) {
|
||||||
|
fprintf(dis->dis_out, "]%s", (i.cdt.wb != 0) ? "!" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_crt(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "%s%s\tp%d, %d, ", (i.crt.ls == 0) ? "mrc" : "mcr",
|
||||||
|
cond[i.generic.cond], i.crt.cpn, i.crt.op1);
|
||||||
|
dump_reg(dis, i.crt.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_creg(dis, i.crt.crn);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_creg(dis, i.crt.crm);
|
||||||
|
|
||||||
|
if (i.crt.op2 != 0) {
|
||||||
|
fprintf(dis->dis_out, ", %d", i.crt.op2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_msr(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "msr%s\t%spsr_, ", cond[i.generic.cond],
|
||||||
|
(i.msr.all.sel == 0) ? "s" : "c");
|
||||||
|
if (i.msr.all.type == 0) {
|
||||||
|
/* reg */
|
||||||
|
fprintf(dis->dis_out, "%s, ", msr_fld[i.msr.all.fld]);
|
||||||
|
dump_reg(dis, i.msr.all.rm);
|
||||||
|
} else {
|
||||||
|
/* imm */
|
||||||
|
fprintf(dis->dis_out, "f, #%d", i.msr.op2_imm.imm << i.msr.op2_imm.rot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_mrs(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "mrs%s\t", cond[i.generic.cond]);
|
||||||
|
dump_reg(dis, i.mrs.rd);
|
||||||
|
fprintf(dis->dis_out, ", %spsr", (i.mrs.sel == 0) ? "s" : "c");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_swi(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "swi%s\t%d", cond[i.generic.cond], i.swi.num);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void dump_clz(ARMDis* dis, ARMInstr i) {
|
||||||
|
fprintf(dis->dis_out, "clz\t");
|
||||||
|
dump_reg(dis, i.clz.rd);
|
||||||
|
fprintf(dis->dis_out, ", ");
|
||||||
|
dump_reg(dis, i.clz.rm);
|
||||||
|
fprintf(dis->dis_out, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_decode(ARMDis* dis, void* p, int size) {
|
||||||
|
int i;
|
||||||
|
arminstr_t* pi = (arminstr_t*)p;
|
||||||
|
ARMInstr instr;
|
||||||
|
|
||||||
|
if (dis == NULL) return;
|
||||||
|
|
||||||
|
chk_out(dis);
|
||||||
|
|
||||||
|
size/=sizeof(arminstr_t);
|
||||||
|
|
||||||
|
for (i=0; i<size; ++i) {
|
||||||
|
fprintf(dis->dis_out, "%p:\t%08x\t", pi, *pi);
|
||||||
|
dis->pi = pi;
|
||||||
|
instr.raw = *pi++;
|
||||||
|
|
||||||
|
if ((instr.raw & ARM_BR_MASK) == ARM_BR_TAG) {
|
||||||
|
dump_br(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_SWP_MASK) == ARM_SWP_TAG) {
|
||||||
|
dump_swp(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_MUL_MASK) == ARM_MUL_TAG) {
|
||||||
|
dump_mul(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_CLZ_MASK) == ARM_CLZ_TAG) {
|
||||||
|
dump_clz(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_WXFER_MASK) == ARM_WXFER_TAG) {
|
||||||
|
dump_wxfer(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_HXFER_MASK) == ARM_HXFER_TAG) {
|
||||||
|
dump_hxfer(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_DPI_MASK) == ARM_DPI_TAG) {
|
||||||
|
dump_dpi(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_MRT_MASK) == ARM_MRT_TAG) {
|
||||||
|
dump_mrt(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_CDP_MASK) == ARM_CDP_TAG) {
|
||||||
|
dump_cdp(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_CDT_MASK) == ARM_CDT_TAG) {
|
||||||
|
dump_cdt(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_CRT_MASK) == ARM_CRT_TAG) {
|
||||||
|
dump_crt(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_MSR_MASK) == ARM_MSR_TAG) {
|
||||||
|
dump_msr(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_MRS_MASK) == ARM_MRS_TAG) {
|
||||||
|
dump_mrs(dis, instr);
|
||||||
|
} else if ((instr.raw & ARM_SWI_MASK) == ARM_SWI_TAG) {
|
||||||
|
dump_swi(dis, instr);
|
||||||
|
} else {
|
||||||
|
fprintf(dis->dis_out, "DCD 0x%x\t; <unknown>", instr.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(dis->dis_out, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_open(ARMDis* dis, const char* dump_name) {
|
||||||
|
if (dis != NULL && dump_name != NULL) {
|
||||||
|
armdis_set_output(dis, fopen(dump_name, "w"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_close(ARMDis* dis) {
|
||||||
|
if (dis->dis_out != NULL && dis->dis_out != stdout && dis->dis_out != stderr) {
|
||||||
|
fclose(dis->dis_out);
|
||||||
|
dis->dis_out = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_dump(ARMDis* dis, const char* dump_name, void* p, int size) {
|
||||||
|
armdis_open(dis, dump_name);
|
||||||
|
armdis_decode(dis, p, size);
|
||||||
|
armdis_close(dis);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_init(ARMDis* dis) {
|
||||||
|
if (dis != NULL) {
|
||||||
|
/* set to stdout */
|
||||||
|
armdis_set_output(dis, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void init_gdisasm() {
|
||||||
|
if (gdisasm == NULL) {
|
||||||
|
gdisasm = (ARMDis*)malloc(sizeof(ARMDis));
|
||||||
|
armdis_init(gdisasm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _armdis_set_output(FILE* f) {
|
||||||
|
init_gdisasm();
|
||||||
|
armdis_set_output(gdisasm, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE* _armdis_get_output() {
|
||||||
|
init_gdisasm();
|
||||||
|
return armdis_get_output(gdisasm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _armdis_decode(void* p, int size) {
|
||||||
|
init_gdisasm();
|
||||||
|
armdis_decode(gdisasm, p, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _armdis_open(const char* dump_name) {
|
||||||
|
init_gdisasm();
|
||||||
|
armdis_open(gdisasm, dump_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _armdis_close() {
|
||||||
|
init_gdisasm();
|
||||||
|
armdis_close(gdisasm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _armdis_dump(const char* dump_name, void* p, int size) {
|
||||||
|
init_gdisasm();
|
||||||
|
armdis_dump(gdisasm, dump_name, p, size);
|
||||||
|
}
|
||||||
|
|
||||||
41
src/arch/arm/arm-dis.h
Normal file
41
src/arch/arm/arm-dis.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARM_DIS
|
||||||
|
#define ARM_DIS
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct _ARMDis {
|
||||||
|
FILE* dis_out;
|
||||||
|
void* pi;
|
||||||
|
} ARMDis;
|
||||||
|
|
||||||
|
|
||||||
|
void _armdis_set_output(FILE* f);
|
||||||
|
FILE* _armdis_get_output(void);
|
||||||
|
void _armdis_decode(void* p, int size);
|
||||||
|
void _armdis_open(const char* dump_name);
|
||||||
|
void _armdis_close(void);
|
||||||
|
void _armdis_dump(const char* dump_name, void* p, int size);
|
||||||
|
|
||||||
|
|
||||||
|
void armdis_init(ARMDis* dis);
|
||||||
|
void armdis_set_output(ARMDis* dis, FILE* f);
|
||||||
|
FILE* armdis_get_output(ARMDis* dis);
|
||||||
|
void armdis_decode(ARMDis* dis, void* p, int size);
|
||||||
|
void armdis_open(ARMDis* dis, const char* dump_name);
|
||||||
|
void armdis_close(ARMDis* dis);
|
||||||
|
void armdis_dump(ARMDis* dis, const char* dump_name, void* p, int size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARM_DIS */
|
||||||
247
src/arch/arm/arm-vfp-codegen.h
Normal file
247
src/arch/arm/arm-vfp-codegen.h
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2011 Xamarin Inc
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __MONO_ARM_VFP_CODEGEN_H__
|
||||||
|
#define __MONO_ARM_VFP_CODEGEN_H__
|
||||||
|
|
||||||
|
#include "arm-codegen.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* VFP registers */
|
||||||
|
ARM_VFP_F0,
|
||||||
|
ARM_VFP_F1,
|
||||||
|
ARM_VFP_F2,
|
||||||
|
ARM_VFP_F3,
|
||||||
|
ARM_VFP_F4,
|
||||||
|
ARM_VFP_F5,
|
||||||
|
ARM_VFP_F6,
|
||||||
|
ARM_VFP_F7,
|
||||||
|
ARM_VFP_F8,
|
||||||
|
ARM_VFP_F9,
|
||||||
|
ARM_VFP_F10,
|
||||||
|
ARM_VFP_F11,
|
||||||
|
ARM_VFP_F12,
|
||||||
|
ARM_VFP_F13,
|
||||||
|
ARM_VFP_F14,
|
||||||
|
ARM_VFP_F15,
|
||||||
|
ARM_VFP_F16,
|
||||||
|
ARM_VFP_F17,
|
||||||
|
ARM_VFP_F18,
|
||||||
|
ARM_VFP_F19,
|
||||||
|
ARM_VFP_F20,
|
||||||
|
ARM_VFP_F21,
|
||||||
|
ARM_VFP_F22,
|
||||||
|
ARM_VFP_F23,
|
||||||
|
ARM_VFP_F24,
|
||||||
|
ARM_VFP_F25,
|
||||||
|
ARM_VFP_F26,
|
||||||
|
ARM_VFP_F27,
|
||||||
|
ARM_VFP_F28,
|
||||||
|
ARM_VFP_F29,
|
||||||
|
ARM_VFP_F30,
|
||||||
|
ARM_VFP_F31,
|
||||||
|
|
||||||
|
ARM_VFP_D0 = ARM_VFP_F0,
|
||||||
|
ARM_VFP_D1 = ARM_VFP_F2,
|
||||||
|
ARM_VFP_D2 = ARM_VFP_F4,
|
||||||
|
ARM_VFP_D3 = ARM_VFP_F6,
|
||||||
|
ARM_VFP_D4 = ARM_VFP_F8,
|
||||||
|
ARM_VFP_D5 = ARM_VFP_F10,
|
||||||
|
ARM_VFP_D6 = ARM_VFP_F12,
|
||||||
|
ARM_VFP_D7 = ARM_VFP_F14,
|
||||||
|
ARM_VFP_D8 = ARM_VFP_F16,
|
||||||
|
ARM_VFP_D9 = ARM_VFP_F18,
|
||||||
|
ARM_VFP_D10 = ARM_VFP_F20,
|
||||||
|
ARM_VFP_D11 = ARM_VFP_F22,
|
||||||
|
ARM_VFP_D12 = ARM_VFP_F24,
|
||||||
|
ARM_VFP_D13 = ARM_VFP_F26,
|
||||||
|
ARM_VFP_D14 = ARM_VFP_F28,
|
||||||
|
ARM_VFP_D15 = ARM_VFP_F30,
|
||||||
|
|
||||||
|
ARM_VFP_COPROC_SINGLE = 10,
|
||||||
|
ARM_VFP_COPROC_DOUBLE = 11,
|
||||||
|
|
||||||
|
#define ARM_VFP_OP(p,q,r,s) (((p) << 23) | ((q) << 21) | ((r) << 20) | ((s) << 6))
|
||||||
|
#define ARM_VFP_OP2(Fn,N) (ARM_VFP_OP (1,1,1,1) | ((Fn) << 16) | ((N) << 7))
|
||||||
|
|
||||||
|
ARM_VFP_MUL = ARM_VFP_OP (0,1,0,0),
|
||||||
|
ARM_VFP_NMUL = ARM_VFP_OP (0,1,0,1),
|
||||||
|
ARM_VFP_ADD = ARM_VFP_OP (0,1,1,0),
|
||||||
|
ARM_VFP_SUB = ARM_VFP_OP (0,1,1,1),
|
||||||
|
ARM_VFP_DIV = ARM_VFP_OP (1,0,0,0),
|
||||||
|
|
||||||
|
ARM_VFP_CPY = ARM_VFP_OP2 (0,0),
|
||||||
|
ARM_VFP_ABS = ARM_VFP_OP2 (0,1),
|
||||||
|
ARM_VFP_NEG = ARM_VFP_OP2 (1,0),
|
||||||
|
ARM_VFP_SQRT = ARM_VFP_OP2 (1,1),
|
||||||
|
ARM_VFP_CMP = ARM_VFP_OP2 (4,0),
|
||||||
|
ARM_VFP_CMPE = ARM_VFP_OP2 (4,1),
|
||||||
|
ARM_VFP_CMPZ = ARM_VFP_OP2 (5,0),
|
||||||
|
ARM_VFP_CMPEZ = ARM_VFP_OP2 (5,1),
|
||||||
|
ARM_VFP_CVT = ARM_VFP_OP2 (7,1),
|
||||||
|
ARM_VFP_UITO = ARM_VFP_OP2 (8,0),
|
||||||
|
ARM_VFP_SITO = ARM_VFP_OP2 (8,1),
|
||||||
|
ARM_VFP_TOUI = ARM_VFP_OP2 (12,0),
|
||||||
|
ARM_VFP_TOSI = ARM_VFP_OP2 (13,0),
|
||||||
|
ARM_VFP_TOUIZ = ARM_VFP_OP2 (12,1),
|
||||||
|
ARM_VFP_TOSIZ = ARM_VFP_OP2 (13,1),
|
||||||
|
|
||||||
|
ARM_VFP_SID = 0,
|
||||||
|
ARM_VFP_SCR = 1 << 1,
|
||||||
|
ARM_VFP_EXC = 8 << 1
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ARM_DEF_VFP_DYADIC(cond,cp,op,Fd,Fn,Fm) \
|
||||||
|
(14 << 24) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
(op) | \
|
||||||
|
(((Fd) >> 1) << 12) | \
|
||||||
|
(((Fd) & 1) << 22) | \
|
||||||
|
(((Fn) >> 1) << 16) | \
|
||||||
|
(((Fn) & 1) << 7) | \
|
||||||
|
(((Fm) >> 1) << 0) | \
|
||||||
|
(((Fm) & 1) << 5) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
#define ARM_DEF_VFP_MONADIC(cond,cp,op,Fd,Fm) \
|
||||||
|
(14 << 24) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
(op) | \
|
||||||
|
(((Fd) >> 1) << 12) | \
|
||||||
|
(((Fd) & 1) << 22) | \
|
||||||
|
(((Fm) >> 1) << 0) | \
|
||||||
|
(((Fm) & 1) << 5) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
#define ARM_DEF_VFP_LSF(cond,cp,post,ls,wback,basereg,Fd,offset) \
|
||||||
|
((offset) >= 0? (offset)>>2: -(offset)>>2) | \
|
||||||
|
(6 << 25) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
(((Fd) >> 1) << 12) | \
|
||||||
|
(((Fd) & 1) << 22) | \
|
||||||
|
((basereg) << 16) | \
|
||||||
|
((ls) << 20) | \
|
||||||
|
((wback) << 21) | \
|
||||||
|
(((offset) >= 0) << 23) | \
|
||||||
|
((wback) << 21) | \
|
||||||
|
((post) << 24) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
#define ARM_DEF_VFP_CPT(cond,cp,op,L,Fn,Rd) \
|
||||||
|
(14 << 24) | \
|
||||||
|
(1 << 4) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
((op) << 21) | \
|
||||||
|
((L) << 20) | \
|
||||||
|
((Rd) << 12) | \
|
||||||
|
(((Fn) >> 1) << 16) | \
|
||||||
|
(((Fn) & 1) << 7) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
/* FP load and stores */
|
||||||
|
#define ARM_FLDS_COND(p,freg,base,offset,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
|
||||||
|
#define ARM_FLDS(p,freg,base,offset) \
|
||||||
|
ARM_FLDS_COND(p,freg,base,offset,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_FLDD_COND(p,freg,base,offset,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
|
||||||
|
#define ARM_FLDD(p,freg,base,offset) \
|
||||||
|
ARM_FLDD_COND(p,freg,base,offset,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_FSTS_COND(p,freg,base,offset,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_STR,0,(base),(freg),(offset)))
|
||||||
|
#define ARM_FSTS(p,freg,base,offset) \
|
||||||
|
ARM_FSTS_COND(p,freg,base,offset,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_FSTD_COND(p,freg,base,offset,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_STR,0,(base),(freg),(offset)))
|
||||||
|
#define ARM_FSTD(p,freg,base,offset) \
|
||||||
|
ARM_FSTD_COND(p,freg,base,offset,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_FLDMD_COND(p,first_reg,nregs,base,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,0,ARMOP_LDR,0,(base),(first_reg),((nregs) * 2) << 2))
|
||||||
|
|
||||||
|
#define ARM_FLDMD(p,first_reg,nregs,base) \
|
||||||
|
ARM_FLDMD_COND(p,first_reg,nregs,base,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_FSTMD_COND(p,first_reg,nregs,base,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,0,ARMOP_STR,0,(base),(first_reg),((nregs) * 2) << 2))
|
||||||
|
|
||||||
|
#define ARM_FSTMD(p,first_reg,nregs,base) \
|
||||||
|
ARM_FSTMD_COND(p,first_reg,nregs,base,ARMCOND_AL)
|
||||||
|
|
||||||
|
#include <mono/arch/arm/arm_vfpmacros.h>
|
||||||
|
|
||||||
|
/* coprocessor register transfer */
|
||||||
|
#define ARM_FMSR(p,freg,reg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,0,(freg),(reg)))
|
||||||
|
#define ARM_FMRS(p,reg,freg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,1,(freg),(reg)))
|
||||||
|
|
||||||
|
#define ARM_FMDLR(p,freg,reg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,0,(freg),(reg)))
|
||||||
|
#define ARM_FMRDL(p,reg,freg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,1,(freg),(reg)))
|
||||||
|
#define ARM_FMDHR(p,freg,reg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,0,(freg),(reg)))
|
||||||
|
#define ARM_FMRDH(p,reg,freg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,1,(freg),(reg)))
|
||||||
|
|
||||||
|
#define ARM_FMXR(p,freg,reg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,0,(freg),(reg)))
|
||||||
|
#define ARM_FMRX(p,reg,fcreg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,1,(fcreg),(reg)))
|
||||||
|
|
||||||
|
#define ARM_FMSTAT(p) \
|
||||||
|
ARM_FMRX((p),ARMREG_R15,ARM_VFP_SCR)
|
||||||
|
|
||||||
|
#define ARM_DEF_MCRR(cond,cp,rn,rd,Fm,M) \
|
||||||
|
((Fm) << 0) | \
|
||||||
|
(1 << 4) | \
|
||||||
|
((M) << 5) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
((rd) << 12) | \
|
||||||
|
((rn) << 16) | \
|
||||||
|
((2) << 21) | \
|
||||||
|
(12 << 24) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
#define ARM_FMDRR(p,rd,rn,dm) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_MCRR(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,(rn),(rd),(dm) >> 1, (dm) & 1))
|
||||||
|
|
||||||
|
#define ARM_DEF_FMRRD(cond,cp,rn,rd,Dm,D) \
|
||||||
|
((Dm) << 0) | \
|
||||||
|
(1 << 4) | \
|
||||||
|
((cp) << 8) | \
|
||||||
|
((rd) << 12) | \
|
||||||
|
((rn) << 16) | \
|
||||||
|
((0xc5) << 20) | \
|
||||||
|
ARM_DEF_COND(cond)
|
||||||
|
|
||||||
|
#define ARM_FMRRD(p,rd,rn,dm) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_FMRRD(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,(rn),(rd),(dm) >> 1, (dm) & 1))
|
||||||
|
|
||||||
|
#define ARM_DEF_FUITOS(cond,Dd,D,Fm,M) ((cond) << 28) | ((0x1d) << 23) | ((D) << 22) | ((0x3) << 20) | ((8) << 16) | ((Dd) << 12) | ((0xa) << 8) | ((1) << 6) | ((M) << 5) | ((Fm) << 0)
|
||||||
|
|
||||||
|
#define ARM_FUITOS(p,dreg,sreg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_FUITOS (ARMCOND_AL, (dreg) >> 1, (dreg) & 1, (sreg) >> 1, (sreg) & 1))
|
||||||
|
|
||||||
|
#define ARM_DEF_FUITOD(cond,Dd,D,Fm,M) ((cond) << 28) | ((0x1d) << 23) | ((D) << 22) | ((0x3) << 20) | ((8) << 16) | ((Dd) << 12) | ((0xb) << 8) | ((1) << 6) | ((M) << 5) | ((Fm) << 0)
|
||||||
|
|
||||||
|
#define ARM_FUITOD(p,dreg,sreg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_FUITOD (ARMCOND_AL, (dreg) >> 1, (dreg) & 1, (sreg) >> 1, (sreg) & 1))
|
||||||
|
|
||||||
|
#define ARM_DEF_FSITOS(cond,Dd,D,Fm,M) ((cond) << 28) | ((0x1d) << 23) | ((D) << 22) | ((0x3) << 20) | ((8) << 16) | ((Dd) << 12) | ((0xa) << 8) | ((1) << 7) | ((1) << 6) | ((M) << 5) | ((Fm) << 0)
|
||||||
|
|
||||||
|
#define ARM_FSITOS(p,dreg,sreg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_FSITOS (ARMCOND_AL, (dreg) >> 1, (dreg) & 1, (sreg) >> 1, (sreg) & 1))
|
||||||
|
|
||||||
|
#define ARM_DEF_FSITOD(cond,Dd,D,Fm,M) ((cond) << 28) | ((0x1d) << 23) | ((D) << 22) | ((0x3) << 20) | ((8) << 16) | ((Dd) << 12) | ((0xb) << 8) | ((1) << 7) | ((1) << 6) | ((M) << 5) | ((Fm) << 0)
|
||||||
|
|
||||||
|
#define ARM_FSITOD(p,dreg,sreg) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_FSITOD (ARMCOND_AL, (dreg) >> 1, (dreg) & 1, (sreg) >> 1, (sreg) & 1))
|
||||||
|
|
||||||
|
#endif /* __MONO_ARM_VFP_CODEGEN_H__ */
|
||||||
|
|
||||||
177
src/arch/arm/arm-wmmx.h
Normal file
177
src/arch/arm/arm-wmmx.h
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* ARM CodeGen
|
||||||
|
* XScale WirelessMMX extensions
|
||||||
|
* Copyright 2002 Wild West Software
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WMMX_H__
|
||||||
|
#define __WMMX_H__ 1
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#include <arm-codegen.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_IASM)
|
||||||
|
# define WM_ASM(_expr) ARM_IASM(_expr)
|
||||||
|
#else
|
||||||
|
# define WM_ASM(_expr) __emit (_expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_EMIT)
|
||||||
|
# define WM_EMIT(p, i) ARM_EMIT(p, i)
|
||||||
|
#else
|
||||||
|
# define WM_EMIT(p, i)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum {
|
||||||
|
WM_CC_EQ = 0x0,
|
||||||
|
WM_CC_NE = 0x1,
|
||||||
|
WM_CC_CS = 0x2,
|
||||||
|
WM_CC_HS = WM_CC_CS,
|
||||||
|
WM_CC_CC = 0x3,
|
||||||
|
WM_CC_LO = WM_CC_CC,
|
||||||
|
WM_CC_MI = 0x4,
|
||||||
|
WM_CC_PL = 0x5,
|
||||||
|
WM_CC_VS = 0x6,
|
||||||
|
WM_CC_VC = 0x7,
|
||||||
|
WM_CC_HI = 0x8,
|
||||||
|
WM_CC_LS = 0x9,
|
||||||
|
WM_CC_GE = 0xA,
|
||||||
|
WM_CC_LT = 0xB,
|
||||||
|
WM_CC_GT = 0xC,
|
||||||
|
WM_CC_LE = 0xD,
|
||||||
|
WM_CC_AL = 0xE,
|
||||||
|
WM_CC_NV = 0xF,
|
||||||
|
WM_CC_SHIFT = 28
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(ARM_DEF_COND)
|
||||||
|
# define WM_DEF_CC(_cc) ARM_DEF_COND(_cc)
|
||||||
|
#else
|
||||||
|
# define WM_DEF_CC(_cc) ((_cc & 0xF) << WM_CC_SHIFT)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
WM_R0 = 0x0,
|
||||||
|
WM_R1 = 0x1,
|
||||||
|
WM_R2 = 0x2,
|
||||||
|
WM_R3 = 0x3,
|
||||||
|
WM_R4 = 0x4,
|
||||||
|
WM_R5 = 0x5,
|
||||||
|
WM_R6 = 0x6,
|
||||||
|
WM_R7 = 0x7,
|
||||||
|
WM_R8 = 0x8,
|
||||||
|
WM_R9 = 0x9,
|
||||||
|
WM_R10 = 0xA,
|
||||||
|
WM_R11 = 0xB,
|
||||||
|
WM_R12 = 0xC,
|
||||||
|
WM_R13 = 0xD,
|
||||||
|
WM_R14 = 0xE,
|
||||||
|
WM_R15 = 0xF,
|
||||||
|
|
||||||
|
WM_wR0 = 0x0,
|
||||||
|
WM_wR1 = 0x1,
|
||||||
|
WM_wR2 = 0x2,
|
||||||
|
WM_wR3 = 0x3,
|
||||||
|
WM_wR4 = 0x4,
|
||||||
|
WM_wR5 = 0x5,
|
||||||
|
WM_wR6 = 0x6,
|
||||||
|
WM_wR7 = 0x7,
|
||||||
|
WM_wR8 = 0x8,
|
||||||
|
WM_wR9 = 0x9,
|
||||||
|
WM_wR10 = 0xA,
|
||||||
|
WM_wR11 = 0xB,
|
||||||
|
WM_wR12 = 0xC,
|
||||||
|
WM_wR13 = 0xD,
|
||||||
|
WM_wR14 = 0xE,
|
||||||
|
WM_wR15 = 0xF
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Qualifiers:
|
||||||
|
* H - 16-bit (HalfWord) SIMD
|
||||||
|
* W - 32-bit (Word) SIMD
|
||||||
|
* D - 64-bit (Double)
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
WM_B = 0,
|
||||||
|
WM_H = 1,
|
||||||
|
WM_D = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* B.2.3 Transfers From Coprocessor Register (MRC)
|
||||||
|
* Table B-5
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
WM_TMRC_OP2 = 0,
|
||||||
|
WM_TMRC_CPNUM = 1,
|
||||||
|
|
||||||
|
WM_TMOVMSK_OP2 = 1,
|
||||||
|
WM_TMOVMSK_CPNUM = 0,
|
||||||
|
|
||||||
|
WM_TANDC_OP2 = 1,
|
||||||
|
WM_TANDC_CPNUM = 1,
|
||||||
|
|
||||||
|
WM_TORC_OP2 = 2,
|
||||||
|
WM_TORC_CPNUM = 1,
|
||||||
|
|
||||||
|
WM_TEXTRC_OP2 = 3,
|
||||||
|
WM_TEXTRC_CPNUM = 1,
|
||||||
|
|
||||||
|
WM_TEXTRM_OP2 = 3,
|
||||||
|
WM_TEXTRM_CPNUM = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TANDC<B,H,W>{Cond} R15
|
||||||
|
* Performs AND across the fields of the SIMD PSR register (wCASF) and sends the result
|
||||||
|
* to CPSR; can be performed after a Byte, Half-word or Word operation that sets the flags.
|
||||||
|
* NOTE: R15 is omitted from the macro declaration;
|
||||||
|
*/
|
||||||
|
#define DEF_WM_TNADC_CC(_q, _cc) WM_DEF_CC((_cc)) + ((_q) << 0x16) + 0xE13F130
|
||||||
|
|
||||||
|
#define _WM_TNADC_CC(_q, _cc) WM_ASM(DEF_WM_TNADC_CC(_q, _cc))
|
||||||
|
#define ARM_WM_TNADC_CC(_p, _q, _cc) WM_EMIT(_p, DEF_WM_TNADC_CC(_q, _cc))
|
||||||
|
|
||||||
|
/* inline assembly */
|
||||||
|
#define _WM_TNADC(_q) _WM_TNADC_CC((_q), WM_CC_AL)
|
||||||
|
#define _WM_TNADCB() _WM_TNADC(WM_B)
|
||||||
|
#define _WM_TNADCH() _WM_TNADC(WM_H)
|
||||||
|
#define _WM_TNADCD() _WM_TNADC(WM_D)
|
||||||
|
|
||||||
|
/* codegen */
|
||||||
|
#define ARM_WM_TNADC(_p, _q) ARM_WM_TNADC_CC((_p), (_q), WM_CC_AL)
|
||||||
|
#define ARM_WM_TNADCB(_p) ARM_WM_TNADC(_p, WM_B)
|
||||||
|
#define ARM_WM_TNADCH(_p) ARM_WM_TNADC(_p, WM_H)
|
||||||
|
#define ARM_WM_TNADCD(_p) ARM_WM_TNADC(_p, WM_D)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TBCST<B,H,W>{Cond} wRd, Rn
|
||||||
|
* Broadcasts a value from the ARM Source reg (Rn) to every SIMD position
|
||||||
|
* in the WMMX Destination reg (wRd).
|
||||||
|
*/
|
||||||
|
#define DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn) \
|
||||||
|
WM_DEF_CC((_cc)) + ((_q) << 6) + ((_wrd) << 16) + ((_rn) << 12) + 0xE200010
|
||||||
|
|
||||||
|
#define _WM_TBCST_CC(_q, _cc, _wrd, _rn) WM_ASM(DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))
|
||||||
|
#define ARM_WM_TBCST_CC(_p, _q, _cc, _wrd, _rn) WM_EMIT(_p, DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))
|
||||||
|
|
||||||
|
/* inline */
|
||||||
|
#define _WM_TBCST(_q, _wrd, _rn) _WM_TBCST_CC(_q, WM_CC_AL, _wrd, _rn)
|
||||||
|
#define _WM_TBCSTB(_wrd, _rn) _WM_TBCST(WM_B)
|
||||||
|
#define _WM_TBCSTH(_wrd, _rn) _WM_TBCST(WM_H)
|
||||||
|
#define _WM_TBCSTD(_wrd, _rn) _WM_TBCST(WM_D)
|
||||||
|
|
||||||
|
/* codegen */
|
||||||
|
#define ARM_WM_TBCST(_p, _q, _wrd, _rn) ARM_WM_TBCST_CC(_p, _q, WM_CC_AL, _wrd, _rn)
|
||||||
|
#define ARM_WM_TBCSTB(_p, _wrd, _rn) _WM_TBCST(_p, WM_B)
|
||||||
|
#define ARM_WM_TBCSTH(_p, _wrd, _rn) _WM_TBCST(_p, WM_H)
|
||||||
|
#define ARM_WM_TBCSTD(_p, _wrd, _rn) _WM_TBCST(_p, WM_D)
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __WMMX_H__ */
|
||||||
56
src/arch/arm/cmp_macros.th
Normal file
56
src/arch/arm/cmp_macros.th
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/* PSR := <Op> Rn, (imm8 ROR 2*rot) */
|
||||||
|
#define ARM_<Op>_REG_IMM_COND(p, rn, imm8, rot, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_<Op>, 0, rn, imm8, rot, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM(p, rn, imm8, rot) \
|
||||||
|
ARM_<Op>_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM_COND(rn, imm8, rot, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_<Op>, 0, rn, imm8, rot, cond)
|
||||||
|
#define _<Op>_REG_IMM(rn, imm8, rot) \
|
||||||
|
_<Op>_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* PSR := <Op> Rn, imm8 */
|
||||||
|
#define ARM_<Op>_REG_IMM8_COND(p, rn, imm8, cond) \
|
||||||
|
ARM_<Op>_REG_IMM_COND(p, rn, imm8, 0, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM8(p, rn, imm8) \
|
||||||
|
ARM_<Op>_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM8_COND(rn, imm8, cond) \
|
||||||
|
_<Op>_REG_IMM_COND(rn, imm8, 0, cond)
|
||||||
|
#define _<Op>_REG_IMM8(rn, imm8) \
|
||||||
|
_<Op>_REG_IMM8_COND(rn, imm8, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* PSR := <Op> Rn, Rm */
|
||||||
|
#define ARM_<Op>_REG_REG_COND(p, rn, rm, cond) \
|
||||||
|
ARM_DPIOP_S_REG_REG_COND(p, ARMOP_<Op>, 0, rn, rm, cond)
|
||||||
|
#define ARM_<Op>_REG_REG(p, rn, rm) \
|
||||||
|
ARM_<Op>_REG_REG_COND(p, rn, rm, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_REG_COND(rn, rm, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_<Op>, 0, rn, rm, cond)
|
||||||
|
#define _<Op>_REG_REG(rn, rm) \
|
||||||
|
_<Op>_REG_REG_COND(rn, rm, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* PSR := <Op> Rn, (Rm <shift_type> imm8) */
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_<Op>, 0, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \
|
||||||
|
ARM_<Op>_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_<Op>, 0, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define _<Op>_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \
|
||||||
|
_<Op>_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
112
src/arch/arm/dpi_macros.th
Normal file
112
src/arch/arm/dpi_macros.th
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/* -- <Op> -- */
|
||||||
|
|
||||||
|
/* Rd := Rn <Op> (imm8 ROR rot) ; rot is power of 2 */
|
||||||
|
#define ARM_<Op>_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \
|
||||||
|
ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_<Op>, rd, rn, imm8, rot, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM(p, rd, rn, imm8, rot) \
|
||||||
|
ARM_<Op>_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)
|
||||||
|
#define ARM_<Op>S_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_<Op>, rd, rn, imm8, rot, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMM(p, rd, rn, imm8, rot) \
|
||||||
|
ARM_<Op>S_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM_COND(rd, rn, imm8, rot, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_<Op>, rd, rn, imm8, rot, cond)
|
||||||
|
#define _<Op>_REG_IMM(rd, rn, imm8, rot) \
|
||||||
|
_<Op>_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)
|
||||||
|
#define _<Op>S_REG_IMM_COND(rd, rn, imm8, rot, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_<Op>, rd, rn, imm8, rot, cond)
|
||||||
|
#define _<Op>S_REG_IMM(rd, rn, imm8, rot) \
|
||||||
|
_<Op>S_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rn <Op> imm8 */
|
||||||
|
#define ARM_<Op>_REG_IMM8_COND(p, rd, rn, imm8, cond) \
|
||||||
|
ARM_<Op>_REG_IMM_COND(p, rd, rn, imm8, 0, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM8(p, rd, rn, imm8) \
|
||||||
|
ARM_<Op>_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)
|
||||||
|
#define ARM_<Op>S_REG_IMM8_COND(p, rd, rn, imm8, cond) \
|
||||||
|
ARM_<Op>S_REG_IMM_COND(p, rd, rn, imm8, 0, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMM8(p, rd, rn, imm8) \
|
||||||
|
ARM_<Op>S_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM8_COND(rd, rn, imm8, cond) \
|
||||||
|
_<Op>_REG_IMM_COND(rd, rn, imm8, 0, cond)
|
||||||
|
#define _<Op>_REG_IMM8(rd, rn, imm8) \
|
||||||
|
_<Op>_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)
|
||||||
|
#define _<Op>S_REG_IMM8_COND(rd, rn, imm8, cond) \
|
||||||
|
_<Op>S_REG_IMM_COND(rd, rn, imm8, 0, cond)
|
||||||
|
#define _<Op>S_REG_IMM8(rd, rn, imm8) \
|
||||||
|
_<Op>S_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rn <Op> Rm */
|
||||||
|
#define ARM_<Op>_REG_REG_COND(p, rd, rn, rm, cond) \
|
||||||
|
ARM_DPIOP_REG_REG_COND(p, ARMOP_<Op>, rd, rn, rm, cond)
|
||||||
|
#define ARM_<Op>_REG_REG(p, rd, rn, rm) \
|
||||||
|
ARM_<Op>_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)
|
||||||
|
#define ARM_<Op>S_REG_REG_COND(p, rd, rn, rm, cond) \
|
||||||
|
ARM_DPIOP_S_REG_REG_COND(p, ARMOP_<Op>, rd, rn, rm, cond)
|
||||||
|
#define ARM_<Op>S_REG_REG(p, rd, rn, rm) \
|
||||||
|
ARM_<Op>S_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_REG_COND(rd, rn, rm, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_REG_COND(ARMOP_<Op>, rd, rn, rm, cond)
|
||||||
|
#define _<Op>_REG_REG(rd, rn, rm) \
|
||||||
|
_<Op>_REG_REG_COND(rd, rn, rm, ARMCOND_AL)
|
||||||
|
#define _<Op>S_REG_REG_COND(rd, rn, rm, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_<Op>, rd, rn, rm, cond)
|
||||||
|
#define _<Op>S_REG_REG(rd, rn, rm) \
|
||||||
|
_<Op>S_REG_REG_COND(rd, rn, rm, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rn <Op> (Rm <shift_type> imm_shift) */
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_<Op>, rd, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \
|
||||||
|
ARM_<Op>_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
#define ARM_<Op>S_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_<Op>, rd, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \
|
||||||
|
ARM_<Op>S_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_<Op>, rd, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define _<Op>_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \
|
||||||
|
_<Op>_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
#define _<Op>S_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_<Op>, rd, rn, rm, shift_type, imm_shift, cond)
|
||||||
|
#define _<Op>S_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \
|
||||||
|
_<Op>S_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rn <Op> (Rm <shift_type> Rs) */
|
||||||
|
#define ARM_<Op>_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \
|
||||||
|
ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_<Op>, rd, rn, rm, shift_t, rs, cond)
|
||||||
|
#define ARM_<Op>_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \
|
||||||
|
ARM_<Op>_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
#define ARM_<Op>S_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \
|
||||||
|
ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_<Op>, rd, rn, rm, shift_t, rs, cond)
|
||||||
|
#define ARM_<Op>S_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \
|
||||||
|
ARM_<Op>S_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_<Op>, rd, rn, rm, shift_t, rs, cond)
|
||||||
|
#define _<Op>_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \
|
||||||
|
_<Op>_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
#define _<Op>S_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_<Op>, rd, rn, rm, shift_t, rs, cond)
|
||||||
|
#define _<Op>S_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \
|
||||||
|
_<Op>S_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
30
src/arch/arm/dpiops.sh
Executable file
30
src/arch/arm/dpiops.sh
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
OPCODES="AND EOR SUB RSB ADD ADC SBC RSC ORR BIC"
|
||||||
|
CMP_OPCODES="TST TEQ CMP CMN"
|
||||||
|
MOV_OPCODES="MOV MVN"
|
||||||
|
|
||||||
|
# $1: opcode list
|
||||||
|
# $2: template
|
||||||
|
gen() {
|
||||||
|
for i in $1; do
|
||||||
|
sed "s/<Op>/$i/g" $2.th
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "/* Macros for DPI ops, auto-generated from template */\n"
|
||||||
|
|
||||||
|
echo -e "\n/* mov/mvn */\n"
|
||||||
|
gen "$MOV_OPCODES" mov_macros
|
||||||
|
|
||||||
|
echo -e "\n/* DPIs, arithmetic and logical */\n"
|
||||||
|
gen "$OPCODES" dpi_macros
|
||||||
|
|
||||||
|
echo -e "\n\n"
|
||||||
|
|
||||||
|
echo -e "\n/* DPIs, comparison */\n"
|
||||||
|
gen "$CMP_OPCODES" cmp_macros
|
||||||
|
|
||||||
|
echo -e "\n/* end generated */\n"
|
||||||
121
src/arch/arm/mov_macros.th
Normal file
121
src/arch/arm/mov_macros.th
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/* Rd := imm8 ROR rot */
|
||||||
|
#define ARM_<Op>_REG_IMM_COND(p, reg, imm8, rot, cond) \
|
||||||
|
ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_<Op>, reg, 0, imm8, rot, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM(p, reg, imm8, rot) \
|
||||||
|
ARM_<Op>_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define ARM_<Op>S_REG_IMM_COND(p, reg, imm8, rot, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_<Op>, reg, 0, imm8, rot, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMM(p, reg, imm8, rot) \
|
||||||
|
ARM_<Op>S_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM_COND(reg, imm8, rot, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_<Op>, reg, 0, imm8, rot, cond)
|
||||||
|
#define _<Op>_REG_IMM(reg, imm8, rot) \
|
||||||
|
_<Op>_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define _<Op>S_REG_IMM_COND(reg, imm8, rot, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_<Op>, reg, 0, imm8, rot, cond)
|
||||||
|
#define _<Op>S_REG_IMM(reg, imm8, rot) \
|
||||||
|
_<Op>S_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := imm8 */
|
||||||
|
#define ARM_<Op>_REG_IMM8_COND(p, reg, imm8, cond) \
|
||||||
|
ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_<Op>, reg, 0, imm8, 0, cond)
|
||||||
|
#define ARM_<Op>_REG_IMM8(p, reg, imm8) \
|
||||||
|
ARM_<Op>_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define ARM_<Op>S_REG_IMM8_COND(p, reg, imm8, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_<Op>, reg, 0, imm8, 0, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMM8(p, reg, imm8) \
|
||||||
|
ARM_<Op>S_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMM8_COND(reg, imm8, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_<Op>, reg, 0, imm8, 0, cond)
|
||||||
|
#define _<Op>_REG_IMM8(reg, imm8) \
|
||||||
|
_<Op>_REG_IMM8_COND(reg, imm8, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define _<Op>S_REG_IMM8_COND(reg, imm8, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_<Op>, reg, 0, imm8, 0, cond)
|
||||||
|
#define _<Op>S_REG_IMM8(reg, imm8) \
|
||||||
|
_<Op>S_REG_IMM8_COND(reg, imm8, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rm */
|
||||||
|
#define ARM_<Op>_REG_REG_COND(p, rd, rm, cond) \
|
||||||
|
ARM_DPIOP_REG_REG_COND(p, ARMOP_<Op>, rd, 0, rm, cond)
|
||||||
|
#define ARM_<Op>_REG_REG(p, rd, rm) \
|
||||||
|
ARM_<Op>_REG_REG_COND(p, rd, rm, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define ARM_<Op>S_REG_REG_COND(p, rd, rm, cond) \
|
||||||
|
ARM_DPIOP_S_REG_REG_COND(p, ARMOP_<Op>, rd, 0, rm, cond)
|
||||||
|
#define ARM_<Op>S_REG_REG(p, rd, rm) \
|
||||||
|
ARM_<Op>S_REG_REG_COND(p, rd, rm, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_REG_COND(rd, rm, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_REG_COND(ARMOP_<Op>, rd, 0, rm, cond)
|
||||||
|
#define _<Op>_REG_REG(rd, rm) \
|
||||||
|
_<Op>_REG_REG_COND(rd, rm, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define _<Op>S_REG_REG_COND(rd, rm, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_<Op>, rd, 0, rm, cond)
|
||||||
|
#define _<Op>S_REG_REG(rd, rm) \
|
||||||
|
_<Op>S_REG_REG_COND(rd, rm, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := Rm <shift_type> imm_shift */
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_<Op>, rd, 0, rm, shift_type, imm_shift, cond)
|
||||||
|
#define ARM_<Op>_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \
|
||||||
|
ARM_<Op>_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define ARM_<Op>S_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_<Op>, rd, 0, rm, shift_type, imm_shift, cond)
|
||||||
|
#define ARM_<Op>S_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \
|
||||||
|
ARM_<Op>S_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_<Op>, rd, 0, rm, shift_type, imm_shift, cond)
|
||||||
|
#define _<Op>_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \
|
||||||
|
_<Op>_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define _<Op>S_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_<Op>, rd, 0, rm, shift_type, imm_shift, cond)
|
||||||
|
#define _<Op>S_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \
|
||||||
|
_<Op>S_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Rd := (Rm <shift_type> Rs) */
|
||||||
|
#define ARM_<Op>_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \
|
||||||
|
ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_<Op>, rd, 0, rm, shift_type, rs, cond)
|
||||||
|
#define ARM_<Op>_REG_REGSHIFT(p, rd, rm, shift_type, rs) \
|
||||||
|
ARM_<Op>_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define ARM_<Op>S_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \
|
||||||
|
ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_<Op>, rd, 0, rm, shift_type, rs, cond)
|
||||||
|
#define ARM_<Op>S_REG_REGSHIFT(p, rd, rm, shift_type, rs) \
|
||||||
|
ARM_<Op>S_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
|
||||||
|
#ifndef ARM_NOIASM
|
||||||
|
#define _<Op>_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \
|
||||||
|
ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_<Op>, rd, 0, rm, shift_type, rs, cond)
|
||||||
|
#define _<Op>_REG_REGSHIFT(rd, rm, shift_type, rs) \
|
||||||
|
_<Op>_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
/* S */
|
||||||
|
#define _<Op>S_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \
|
||||||
|
ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_<Op>, rd, 0, rm, shift_type, rs, cond)
|
||||||
|
#define _<Op>S_REG_REGSHIFT(rd, rm, shift_type, rs) \
|
||||||
|
_<Op>S_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
710
src/arch/arm/tramp.c
Normal file
710
src/arch/arm/tramp.c
Normal file
@@ -0,0 +1,710 @@
|
|||||||
|
/*
|
||||||
|
* Create trampolines to invoke arbitrary functions.
|
||||||
|
* Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
|
||||||
|
*
|
||||||
|
* Contributions by Malte Hildingson
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "arm-codegen.h"
|
||||||
|
#include "arm-dis.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32_WCE) || defined (UNDER_CE)
|
||||||
|
# include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PLATFORM_MACOSX)
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "mono/metadata/class.h"
|
||||||
|
#include "mono/metadata/tabledefs.h"
|
||||||
|
#include "mono/interpreter/interp.h"
|
||||||
|
#include "mono/metadata/appdomain.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
# define ARM_DUMP_DISASM 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* prototypes for private functions (to avoid compiler warnings) */
|
||||||
|
void flush_icache (void);
|
||||||
|
void* alloc_code_buff (int num_instr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The resulting function takes the form:
|
||||||
|
* void func (void (*callme)(), void *retval, void *this_obj, stackval *arguments);
|
||||||
|
* NOTE: all args passed in ARM registers (A1-A4),
|
||||||
|
* then copied to R4-R7 (see definitions below).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define REG_FUNC_ADDR ARMREG_R4
|
||||||
|
#define REG_RETVAL ARMREG_R5
|
||||||
|
#define REG_THIS ARMREG_R6
|
||||||
|
#define REG_ARGP ARMREG_R7
|
||||||
|
|
||||||
|
|
||||||
|
#define ARG_SIZE sizeof(stackval)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void flush_icache ()
|
||||||
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
FlushInstructionCache(GetCurrentProcess(), NULL, 0);
|
||||||
|
#else
|
||||||
|
# if 0
|
||||||
|
asm ("mov r0, r0");
|
||||||
|
asm ("mov r0, #0");
|
||||||
|
asm ("mcr p15, 0, r0, c7, c7, 0");
|
||||||
|
# else
|
||||||
|
/* TODO: use (movnv pc, rx) method */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void* alloc_code_buff (int num_instr)
|
||||||
|
{
|
||||||
|
void* code_buff;
|
||||||
|
int code_size = num_instr * sizeof(arminstr_t);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(UNDER_CE)
|
||||||
|
int old_prot = 0;
|
||||||
|
|
||||||
|
code_buff = malloc(code_size);
|
||||||
|
VirtualProtect(code_buff, code_size, PAGE_EXECUTE_READWRITE, &old_prot);
|
||||||
|
#else
|
||||||
|
int page_size = sysconf(_SC_PAGESIZE);
|
||||||
|
int new_code_size;
|
||||||
|
|
||||||
|
new_code_size = code_size + page_size - 1;
|
||||||
|
code_buff = malloc(new_code_size);
|
||||||
|
code_buff = (void *) (((int) code_buff + page_size - 1) & ~(page_size - 1));
|
||||||
|
|
||||||
|
if (mprotect(code_buff, code_size, PROT_READ|PROT_WRITE|PROT_EXEC) != 0) {
|
||||||
|
g_critical (G_GNUC_PRETTY_FUNCTION
|
||||||
|
": mprotect error: %s", g_strerror (errno));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return code_buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Refer to ARM Procedure Call Standard (APCS) for more info.
|
||||||
|
*/
|
||||||
|
MonoPIFunc mono_arch_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor)
|
||||||
|
{
|
||||||
|
MonoType* param;
|
||||||
|
MonoPIFunc code_buff;
|
||||||
|
arminstr_t* p;
|
||||||
|
guint32 code_size, stack_size;
|
||||||
|
guint32 simple_type;
|
||||||
|
int i, hasthis, aregs, regc, stack_offs;
|
||||||
|
int this_loaded;
|
||||||
|
guchar reg_alloc [ARM_NUM_ARG_REGS];
|
||||||
|
|
||||||
|
/* pessimistic estimation for prologue/epilogue size */
|
||||||
|
code_size = 16 + 16;
|
||||||
|
/* push/pop work regs */
|
||||||
|
code_size += 2;
|
||||||
|
/* call */
|
||||||
|
code_size += 2;
|
||||||
|
/* handle retval */
|
||||||
|
code_size += 2;
|
||||||
|
|
||||||
|
stack_size = 0;
|
||||||
|
hasthis = sig->hasthis ? 1 : 0;
|
||||||
|
|
||||||
|
aregs = ARM_NUM_ARG_REGS - hasthis;
|
||||||
|
|
||||||
|
for (i = 0, regc = aregs; i < sig->param_count; ++i) {
|
||||||
|
param = sig->params [i];
|
||||||
|
|
||||||
|
/* keep track of argument sizes */
|
||||||
|
if (i < ARM_NUM_ARG_REGS) reg_alloc [i] = 0;
|
||||||
|
|
||||||
|
if (param->byref) {
|
||||||
|
if (regc > 0) {
|
||||||
|
code_size += 1;
|
||||||
|
reg_alloc [i] = regc;
|
||||||
|
--regc;
|
||||||
|
} else {
|
||||||
|
code_size += 2;
|
||||||
|
stack_size += sizeof(gpointer);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
simple_type = param->type;
|
||||||
|
enum_calc_size:
|
||||||
|
switch (simple_type) {
|
||||||
|
case MONO_TYPE_BOOLEAN:
|
||||||
|
case MONO_TYPE_CHAR:
|
||||||
|
case MONO_TYPE_I1:
|
||||||
|
case MONO_TYPE_U1:
|
||||||
|
case MONO_TYPE_I2:
|
||||||
|
case MONO_TYPE_U2:
|
||||||
|
case MONO_TYPE_I4:
|
||||||
|
case MONO_TYPE_U4:
|
||||||
|
case MONO_TYPE_I:
|
||||||
|
case MONO_TYPE_U:
|
||||||
|
case MONO_TYPE_PTR:
|
||||||
|
case MONO_TYPE_R4:
|
||||||
|
case MONO_TYPE_SZARRAY:
|
||||||
|
case MONO_TYPE_CLASS:
|
||||||
|
case MONO_TYPE_OBJECT:
|
||||||
|
case MONO_TYPE_STRING:
|
||||||
|
if (regc > 0) {
|
||||||
|
/* register arg */
|
||||||
|
code_size += 1;
|
||||||
|
reg_alloc [i] = regc;
|
||||||
|
--regc;
|
||||||
|
} else {
|
||||||
|
/* stack arg */
|
||||||
|
code_size += 2;
|
||||||
|
stack_size += 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
/* keep track of argument sizes */
|
||||||
|
if (regc > 1) {
|
||||||
|
/* fits into registers, two LDRs */
|
||||||
|
code_size += 2;
|
||||||
|
reg_alloc [i] = regc;
|
||||||
|
regc -= 2;
|
||||||
|
} else if (regc > 0) {
|
||||||
|
/* first half fits into register, one LDR */
|
||||||
|
code_size += 1;
|
||||||
|
reg_alloc [i] = regc;
|
||||||
|
--regc;
|
||||||
|
/* the rest on the stack, LDR/STR */
|
||||||
|
code_size += 2;
|
||||||
|
stack_size += 4;
|
||||||
|
} else {
|
||||||
|
/* stack arg, 4 instrs - 2x(LDR/STR) */
|
||||||
|
code_size += 4;
|
||||||
|
stack_size += 2 * 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VALUETYPE:
|
||||||
|
if (param->data.klass->enumtype) {
|
||||||
|
simple_type = param->data.klass->enum_basetype->type;
|
||||||
|
goto enum_calc_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mono_class_value_size(param->data.klass, NULL) != 4) {
|
||||||
|
g_error("can only marshal enums, not generic structures (size: %d)", mono_class_value_size(param->data.klass, NULL));
|
||||||
|
}
|
||||||
|
if (regc > 0) {
|
||||||
|
/* register arg */
|
||||||
|
code_size += 1;
|
||||||
|
reg_alloc [i] = regc;
|
||||||
|
--regc;
|
||||||
|
} else {
|
||||||
|
/* stack arg */
|
||||||
|
code_size += 2;
|
||||||
|
stack_size += 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code_buff = (MonoPIFunc)alloc_code_buff(code_size);
|
||||||
|
p = (arminstr_t*)code_buff;
|
||||||
|
|
||||||
|
/* prologue */
|
||||||
|
p = arm_emit_lean_prologue(p, stack_size,
|
||||||
|
/* save workset (r4-r7) */
|
||||||
|
(1 << ARMREG_R4) | (1 << ARMREG_R5) | (1 << ARMREG_R6) | (1 << ARMREG_R7));
|
||||||
|
|
||||||
|
|
||||||
|
/* copy args into workset */
|
||||||
|
/* callme - always present */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_R4, ARMREG_A1);
|
||||||
|
/* retval */
|
||||||
|
if (sig->ret->byref || string_ctor || (sig->ret->type != MONO_TYPE_VOID)) {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_R5, ARMREG_A2);
|
||||||
|
}
|
||||||
|
/* this_obj */
|
||||||
|
if (sig->hasthis) {
|
||||||
|
this_loaded = 0;
|
||||||
|
if (stack_size == 0) {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_A1, ARMREG_A3);
|
||||||
|
this_loaded = 1;
|
||||||
|
} else {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_R6, ARMREG_A3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* args */
|
||||||
|
if (sig->param_count != 0) {
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_R7, ARMREG_A4);
|
||||||
|
}
|
||||||
|
|
||||||
|
stack_offs = stack_size;
|
||||||
|
|
||||||
|
/* handle arguments */
|
||||||
|
/* in reverse order so we could use r0 (arg1) for memory transfers */
|
||||||
|
for (i = sig->param_count; --i >= 0;) {
|
||||||
|
param = sig->params [i];
|
||||||
|
if (param->byref) {
|
||||||
|
if (i < aregs && reg_alloc[i] > 0) {
|
||||||
|
ARM_LDR_IMM(p, ARMREG_A1 + i, REG_ARGP, i*ARG_SIZE);
|
||||||
|
} else {
|
||||||
|
stack_offs -= sizeof(armword_t);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i*ARG_SIZE);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
simple_type = param->type;
|
||||||
|
enum_marshal:
|
||||||
|
switch (simple_type) {
|
||||||
|
case MONO_TYPE_BOOLEAN:
|
||||||
|
case MONO_TYPE_CHAR:
|
||||||
|
case MONO_TYPE_I1:
|
||||||
|
case MONO_TYPE_U1:
|
||||||
|
case MONO_TYPE_I2:
|
||||||
|
case MONO_TYPE_U2:
|
||||||
|
case MONO_TYPE_I4:
|
||||||
|
case MONO_TYPE_U4:
|
||||||
|
case MONO_TYPE_I:
|
||||||
|
case MONO_TYPE_U:
|
||||||
|
case MONO_TYPE_PTR:
|
||||||
|
case MONO_TYPE_R4:
|
||||||
|
case MONO_TYPE_SZARRAY:
|
||||||
|
case MONO_TYPE_CLASS:
|
||||||
|
case MONO_TYPE_OBJECT:
|
||||||
|
case MONO_TYPE_STRING:
|
||||||
|
if (i < aregs && reg_alloc [i] > 0) {
|
||||||
|
/* pass in register */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_A1 + hasthis + (aregs - reg_alloc [i]), REG_ARGP, i*ARG_SIZE);
|
||||||
|
} else {
|
||||||
|
stack_offs -= sizeof(armword_t);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i*ARG_SIZE);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
if (i < aregs && reg_alloc [i] > 0) {
|
||||||
|
if (reg_alloc [i] > 1) {
|
||||||
|
/* pass in registers */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_A1 + hasthis + (aregs - reg_alloc [i]), REG_ARGP, i*ARG_SIZE);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_A1 + hasthis + (aregs - reg_alloc [i]) + 1, REG_ARGP, i*ARG_SIZE + 4);
|
||||||
|
} else {
|
||||||
|
stack_offs -= sizeof(armword_t);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i*ARG_SIZE + 4);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_A1 + hasthis + (aregs - reg_alloc [i]), REG_ARGP, i*ARG_SIZE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* two words transferred on the stack */
|
||||||
|
stack_offs -= 2*sizeof(armword_t);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i*ARG_SIZE);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i*ARG_SIZE + 4);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs + 4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VALUETYPE:
|
||||||
|
if (param->data.klass->enumtype) {
|
||||||
|
/* it's an enum value, proceed based on its base type */
|
||||||
|
simple_type = param->data.klass->enum_basetype->type;
|
||||||
|
goto enum_marshal;
|
||||||
|
} else {
|
||||||
|
if (i < aregs && reg_alloc[i] > 0) {
|
||||||
|
int vtreg = ARMREG_A1 + hasthis +
|
||||||
|
hasthis + (aregs - reg_alloc[i]);
|
||||||
|
ARM_LDR_IMM(p, vtreg, REG_ARGP, i * ARG_SIZE);
|
||||||
|
ARM_LDR_IMM(p, vtreg, vtreg, 0);
|
||||||
|
} else {
|
||||||
|
stack_offs -= sizeof(armword_t);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, REG_ARGP, i * ARG_SIZE);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, ARMREG_R0, 0);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, ARMREG_SP, stack_offs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sig->hasthis && !this_loaded) {
|
||||||
|
/* [this] always passed in A1, regardless of sig->call_convention */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_A1, REG_THIS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* call [func] */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_LR, ARMREG_PC);
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_PC, REG_FUNC_ADDR);
|
||||||
|
|
||||||
|
/* handle retval */
|
||||||
|
if (sig->ret->byref || string_ctor) {
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, REG_RETVAL, 0);
|
||||||
|
} else {
|
||||||
|
simple_type = sig->ret->type;
|
||||||
|
enum_retvalue:
|
||||||
|
switch (simple_type) {
|
||||||
|
case MONO_TYPE_BOOLEAN:
|
||||||
|
case MONO_TYPE_I1:
|
||||||
|
case MONO_TYPE_U1:
|
||||||
|
ARM_STRB_IMM(p, ARMREG_R0, REG_RETVAL, 0);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_CHAR:
|
||||||
|
case MONO_TYPE_I2:
|
||||||
|
case MONO_TYPE_U2:
|
||||||
|
ARM_STRH_IMM(p, ARMREG_R0, REG_RETVAL, 0);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* A 32-bit integer and integer-equivalent return value
|
||||||
|
* is returned in R0.
|
||||||
|
* Single-precision floating-point values are returned in R0.
|
||||||
|
*/
|
||||||
|
case MONO_TYPE_I:
|
||||||
|
case MONO_TYPE_U:
|
||||||
|
case MONO_TYPE_I4:
|
||||||
|
case MONO_TYPE_U4:
|
||||||
|
case MONO_TYPE_R4:
|
||||||
|
case MONO_TYPE_OBJECT:
|
||||||
|
case MONO_TYPE_CLASS:
|
||||||
|
case MONO_TYPE_ARRAY:
|
||||||
|
case MONO_TYPE_SZARRAY:
|
||||||
|
case MONO_TYPE_STRING:
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, REG_RETVAL, 0);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* A 64-bit integer is returned in R0 and R1.
|
||||||
|
* Double-precision floating-point values are returned in R0 and R1.
|
||||||
|
*/
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
ARM_STR_IMM(p, ARMREG_R0, REG_RETVAL, 0);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R1, REG_RETVAL, 4);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VALUETYPE:
|
||||||
|
if (sig->ret->data.klass->enumtype) {
|
||||||
|
simple_type = sig->ret->data.klass->enum_basetype->type;
|
||||||
|
goto enum_retvalue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VOID:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p = arm_emit_std_epilogue(p, stack_size,
|
||||||
|
/* restore R4-R7 */
|
||||||
|
(1 << ARMREG_R4) | (1 << ARMREG_R5) | (1 << ARMREG_R6) | (1 << ARMREG_R7));
|
||||||
|
|
||||||
|
flush_icache();
|
||||||
|
|
||||||
|
#ifdef ARM_DUMP_DISASM
|
||||||
|
_armdis_decode((arminstr_t*)code_buff, ((guint8*)p) - ((guint8*)code_buff));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return code_buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MINV_OFFS(member) G_STRUCT_OFFSET(MonoInvocation, member)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a pointer to a native function that can be used to
|
||||||
|
* call the specified method.
|
||||||
|
* The function created will receive the arguments according
|
||||||
|
* to the call convention specified in the method.
|
||||||
|
* This function works by creating a MonoInvocation structure,
|
||||||
|
* filling the fields in and calling ves_exec_method on it.
|
||||||
|
* Still need to figure out how to handle the exception stuff
|
||||||
|
* across the managed/unmanaged boundary.
|
||||||
|
*/
|
||||||
|
void* mono_arch_create_method_pointer (MonoMethod* method)
|
||||||
|
{
|
||||||
|
MonoMethodSignature* sig;
|
||||||
|
guchar* p, * p_method, * p_stackval_from_data, * p_exec;
|
||||||
|
void* code_buff;
|
||||||
|
int i, stack_size, arg_pos, arg_add, stackval_pos, offs;
|
||||||
|
int areg, reg_args, shift, pos;
|
||||||
|
MonoJitInfo *ji;
|
||||||
|
|
||||||
|
code_buff = alloc_code_buff(128);
|
||||||
|
p = (guchar*)code_buff;
|
||||||
|
|
||||||
|
sig = method->signature;
|
||||||
|
|
||||||
|
ARM_B(p, 3);
|
||||||
|
|
||||||
|
/* embed magic number followed by method pointer */
|
||||||
|
*p++ = 'M';
|
||||||
|
*p++ = 'o';
|
||||||
|
*p++ = 'n';
|
||||||
|
*p++ = 'o';
|
||||||
|
/* method ptr */
|
||||||
|
*(void**)p = method;
|
||||||
|
p_method = p;
|
||||||
|
p += 4;
|
||||||
|
|
||||||
|
/* call table */
|
||||||
|
*(void**)p = stackval_from_data;
|
||||||
|
p_stackval_from_data = p;
|
||||||
|
p += 4;
|
||||||
|
*(void**)p = ves_exec_method;
|
||||||
|
p_exec = p;
|
||||||
|
p += 4;
|
||||||
|
|
||||||
|
stack_size = sizeof(MonoInvocation) + ARG_SIZE*(sig->param_count + 1) + ARM_NUM_ARG_REGS*2*sizeof(armword_t);
|
||||||
|
|
||||||
|
/* prologue */
|
||||||
|
p = (guchar*)arm_emit_lean_prologue((arminstr_t*)p, stack_size,
|
||||||
|
(1 << ARMREG_R4) |
|
||||||
|
(1 << ARMREG_R5) |
|
||||||
|
(1 << ARMREG_R6) |
|
||||||
|
(1 << ARMREG_R7));
|
||||||
|
|
||||||
|
/* R7 - ptr to stack args */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_R7, ARMREG_IP);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize MonoInvocation fields, first the ones known now.
|
||||||
|
*/
|
||||||
|
ARM_MOV_REG_IMM8(p, ARMREG_R4, 0);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_SP, MINV_OFFS(ex));
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_SP, MINV_OFFS(ex_handler));
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_SP, MINV_OFFS(parent));
|
||||||
|
|
||||||
|
/* Set the method pointer. */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R4, ARMREG_PC, -(int)(p - p_method + sizeof(arminstr_t)*2));
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_SP, MINV_OFFS(method));
|
||||||
|
|
||||||
|
if (sig->hasthis) {
|
||||||
|
/* [this] in A1 */
|
||||||
|
ARM_STR_IMM(p, ARMREG_A1, ARMREG_SP, MINV_OFFS(obj));
|
||||||
|
} else {
|
||||||
|
/* else set minv.obj to NULL */
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_SP, MINV_OFFS(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy args from registers to stack */
|
||||||
|
areg = ARMREG_A1 + sig->hasthis;
|
||||||
|
arg_pos = -(int)(ARM_NUM_ARG_REGS - sig->hasthis) * 2 * sizeof(armword_t);
|
||||||
|
arg_add = 0;
|
||||||
|
for (i = 0; i < sig->param_count; ++i) {
|
||||||
|
if (areg >= ARM_NUM_ARG_REGS) break;
|
||||||
|
ARM_STR_IMM(p, areg, ARMREG_R7, arg_pos);
|
||||||
|
++areg;
|
||||||
|
if (!sig->params[i]->byref) {
|
||||||
|
switch (sig->params[i]->type) {
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
if (areg >= ARM_NUM_ARG_REGS) {
|
||||||
|
/* load second half of 64-bit arg */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R4, ARMREG_R7, 0);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R4, ARMREG_R7, arg_pos + sizeof(armword_t));
|
||||||
|
arg_add = sizeof(armword_t);
|
||||||
|
} else {
|
||||||
|
/* second half is already the register */
|
||||||
|
ARM_STR_IMM(p, areg, ARMREG_R7, arg_pos + sizeof(armword_t));
|
||||||
|
++areg;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VALUETYPE:
|
||||||
|
/* assert */
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arg_pos += 2 * sizeof(armword_t);
|
||||||
|
}
|
||||||
|
/* number of args passed in registers */
|
||||||
|
reg_args = i;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calc and save stack args ptr,
|
||||||
|
* args follow MonoInvocation struct on the stack.
|
||||||
|
*/
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_R1, ARMREG_SP, sizeof(MonoInvocation));
|
||||||
|
ARM_STR_IMM(p, ARMREG_R1, ARMREG_SP, MINV_OFFS(stack_args));
|
||||||
|
|
||||||
|
/* convert method args to stackvals */
|
||||||
|
arg_pos = -(int)(ARM_NUM_ARG_REGS - sig->hasthis) * 2 * sizeof(armword_t);
|
||||||
|
stackval_pos = sizeof(MonoInvocation);
|
||||||
|
for (i = 0; i < sig->param_count; ++i) {
|
||||||
|
if (i < reg_args) {
|
||||||
|
ARM_SUB_REG_IMM8(p, ARMREG_A3, ARMREG_R7, -arg_pos);
|
||||||
|
arg_pos += 2 * sizeof(armword_t);
|
||||||
|
} else {
|
||||||
|
if (arg_pos < 0) arg_pos = 0;
|
||||||
|
pos = arg_pos + arg_add;
|
||||||
|
if (pos <= 0xFF) {
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_A3, ARMREG_R7, pos);
|
||||||
|
} else {
|
||||||
|
if (is_arm_const((armword_t)pos)) {
|
||||||
|
shift = calc_arm_mov_const_shift((armword_t)pos);
|
||||||
|
ARM_ADD_REG_IMM(p, ARMREG_A3, ARMREG_R7, pos >> ((32 - shift) & 31), shift >> 1);
|
||||||
|
} else {
|
||||||
|
p = (guchar*)arm_mov_reg_imm32((arminstr_t*)p, ARMREG_R6, (armword_t)pos);
|
||||||
|
ARM_ADD_REG_REG(p, ARMREG_A2, ARMREG_R7, ARMREG_R6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arg_pos += sizeof(armword_t);
|
||||||
|
if (!sig->params[i]->byref) {
|
||||||
|
switch (sig->params[i]->type) {
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
arg_pos += sizeof(armword_t);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VALUETYPE:
|
||||||
|
/* assert */
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A2 = result */
|
||||||
|
if (stackval_pos <= 0xFF) {
|
||||||
|
ARM_ADD_REG_IMM8(p, ARMREG_A2, ARMREG_SP, stackval_pos);
|
||||||
|
} else {
|
||||||
|
if (is_arm_const((armword_t)stackval_pos)) {
|
||||||
|
shift = calc_arm_mov_const_shift((armword_t)stackval_pos);
|
||||||
|
ARM_ADD_REG_IMM(p, ARMREG_A2, ARMREG_SP, stackval_pos >> ((32 - shift) & 31), shift >> 1);
|
||||||
|
} else {
|
||||||
|
p = (guchar*)arm_mov_reg_imm32((arminstr_t*)p, ARMREG_R6, (armword_t)stackval_pos);
|
||||||
|
ARM_ADD_REG_REG(p, ARMREG_A2, ARMREG_SP, ARMREG_R6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A1 = type */
|
||||||
|
p = (guchar*)arm_mov_reg_imm32((arminstr_t*)p, ARMREG_A1, (armword_t)sig->params [i]);
|
||||||
|
|
||||||
|
stackval_pos += ARG_SIZE;
|
||||||
|
|
||||||
|
offs = -(p + 2*sizeof(arminstr_t) - p_stackval_from_data);
|
||||||
|
/* load function address */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R4, ARMREG_PC, offs);
|
||||||
|
/* call stackval_from_data */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_LR, ARMREG_PC);
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_PC, ARMREG_R4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store retval ptr */
|
||||||
|
p = (guchar*)arm_mov_reg_imm32((arminstr_t*)p, ARMREG_R5, (armword_t)stackval_pos);
|
||||||
|
ARM_ADD_REG_REG(p, ARMREG_R5, ARMREG_SP, ARMREG_R4);
|
||||||
|
ARM_STR_IMM(p, ARMREG_R5, ARMREG_SP, MINV_OFFS(retval));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Call the method.
|
||||||
|
*/
|
||||||
|
/* A1 = MonoInvocation ptr */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_A1, ARMREG_SP);
|
||||||
|
offs = -(p + 2*sizeof(arminstr_t) - p_exec);
|
||||||
|
/* load function address */
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R4, ARMREG_PC, offs);
|
||||||
|
/* call ves_exec */
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_LR, ARMREG_PC);
|
||||||
|
ARM_MOV_REG_REG(p, ARMREG_PC, ARMREG_R4);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Move retval into reg.
|
||||||
|
*/
|
||||||
|
if (sig->ret->byref) {
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, ARMREG_R5, 0);
|
||||||
|
} else {
|
||||||
|
switch (sig->ret->type) {
|
||||||
|
case MONO_TYPE_BOOLEAN:
|
||||||
|
case MONO_TYPE_I1:
|
||||||
|
case MONO_TYPE_U1:
|
||||||
|
ARM_LDRB_IMM(p, ARMREG_R0, ARMREG_R5, 0);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_CHAR:
|
||||||
|
case MONO_TYPE_I2:
|
||||||
|
case MONO_TYPE_U2:
|
||||||
|
ARM_LDRH_IMM(p, ARMREG_R0, ARMREG_R5, 0);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_I:
|
||||||
|
case MONO_TYPE_U:
|
||||||
|
case MONO_TYPE_I4:
|
||||||
|
case MONO_TYPE_U4:
|
||||||
|
case MONO_TYPE_R4:
|
||||||
|
case MONO_TYPE_OBJECT:
|
||||||
|
case MONO_TYPE_CLASS:
|
||||||
|
case MONO_TYPE_ARRAY:
|
||||||
|
case MONO_TYPE_SZARRAY:
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, ARMREG_R5, 0);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_I8:
|
||||||
|
case MONO_TYPE_U8:
|
||||||
|
case MONO_TYPE_R8:
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R0, ARMREG_R5, 0);
|
||||||
|
ARM_LDR_IMM(p, ARMREG_R1, ARMREG_R5, 4);
|
||||||
|
break;
|
||||||
|
case MONO_TYPE_VOID:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
p = (guchar*)arm_emit_std_epilogue((arminstr_t*)p, stack_size,
|
||||||
|
(1 << ARMREG_R4) |
|
||||||
|
(1 << ARMREG_R5) |
|
||||||
|
(1 << ARMREG_R6) |
|
||||||
|
(1 << ARMREG_R7));
|
||||||
|
|
||||||
|
flush_icache();
|
||||||
|
|
||||||
|
#ifdef ARM_DUMP_DISASM
|
||||||
|
_armdis_decode((arminstr_t*)code_buff, ((guint8*)p) - ((guint8*)code_buff));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ji = g_new0(MonoJitInfo, 1);
|
||||||
|
ji->method = method;
|
||||||
|
ji->code_size = ((guint8 *) p) - ((guint8 *) code_buff);
|
||||||
|
ji->code_start = (gpointer) code_buff;
|
||||||
|
|
||||||
|
mono_jit_info_table_add(mono_get_root_domain (), ji);
|
||||||
|
|
||||||
|
return code_buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mono_create_method_pointer () will insert a pointer to the MonoMethod
|
||||||
|
* so that the interp can easily get at the data: this function will retrieve
|
||||||
|
* the method from the code stream.
|
||||||
|
*/
|
||||||
|
MonoMethod* mono_method_pointer_get (void* code)
|
||||||
|
{
|
||||||
|
unsigned char* c = code;
|
||||||
|
/* check out magic number that follows unconditional branch */
|
||||||
|
if (c[4] == 'M' &&
|
||||||
|
c[5] == 'o' &&
|
||||||
|
c[6] == 'n' &&
|
||||||
|
c[7] == 'o') return ((MonoMethod**)code)[2];
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
15
src/arch/arm/vfp_macros.th
Normal file
15
src/arch/arm/vfp_macros.th
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/* -- <Op> -- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Fd := Fn <Op> Fm */
|
||||||
|
#define ARM_VFP_<Op>D_COND(p, rd, rn, rm, cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_DYADIC(cond,ARM_VFP_COPROC_DOUBLE,ARM_VFP_<Op>,rd,rn,rm))
|
||||||
|
#define ARM_VFP_<Op>D(p, rd, rn, rm) \
|
||||||
|
ARM_VFP_<Op>D_COND(p, rd, rn, rm, ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_VFP_<Op>S_COND(p, rd, rn, rm, cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_DYADIC(cond,ARM_VFP_COPROC_SINGLE,ARM_VFP_<Op>,rd,rn,rm))
|
||||||
|
#define ARM_VFP_<Op>S(p, rd, rn, rm) \
|
||||||
|
ARM_VFP_<Op>S_COND(p, rd, rn, rm, ARMCOND_AL)
|
||||||
|
|
||||||
|
|
||||||
14
src/arch/arm/vfpm_macros.th
Normal file
14
src/arch/arm/vfpm_macros.th
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* -- <Op> -- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Fd := <Op> Fm */
|
||||||
|
|
||||||
|
#define ARM_<Op>D_COND(p,dreg,sreg,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_MONADIC((cond),ARM_VFP_COPROC_DOUBLE,ARM_VFP_<Op>,(dreg),(sreg)))
|
||||||
|
#define ARM_<Op>D(p,dreg,sreg) ARM_<Op>D_COND(p,dreg,sreg,ARMCOND_AL)
|
||||||
|
|
||||||
|
#define ARM_<Op>S_COND(p,dreg,sreg,cond) \
|
||||||
|
ARM_EMIT((p), ARM_DEF_VFP_MONADIC((cond),ARM_VFP_COPROC_SINGLE,ARM_VFP_<Op>,(dreg),(sreg)))
|
||||||
|
#define ARM_<Op>S(p,dreg,sreg) ARM_<Op>S_COND(p,dreg,sreg,ARMCOND_AL)
|
||||||
|
|
||||||
|
|
||||||
24
src/arch/arm/vfpops.sh
Executable file
24
src/arch/arm/vfpops.sh
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
DYADIC="ADD SUB MUL NMUL DIV"
|
||||||
|
MONADIC="CPY ABS NEG SQRT CMP CMPE CMPZ CMPEZ CVT UITO SITO TOUI TOSI TOUIZ TOSIZ"
|
||||||
|
|
||||||
|
# $1: opcode list
|
||||||
|
# $2: template
|
||||||
|
gen() {
|
||||||
|
for i in $1; do
|
||||||
|
sed "s/<Op>/$i/g" $2.th
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
echo -e "/* Macros for VFP ops, auto-generated from template */\n"
|
||||||
|
|
||||||
|
echo -e "\n/* dyadic */\n"
|
||||||
|
gen "$DYADIC" vfp_macros
|
||||||
|
|
||||||
|
echo -e "\n/* monadic */\n"
|
||||||
|
gen "$MONADIC" vfpm_macros
|
||||||
|
|
||||||
|
echo -e "\n\n"
|
||||||
|
|
||||||
|
echo -e "\n/* end generated */\n"
|
||||||
6
src/arch/arm64/.gitignore
vendored
Normal file
6
src/arch/arm64/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/
|
||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/*.o
|
||||||
|
/*.lo
|
||||||
|
/.deps
|
||||||
0
src/arch/arm64/Makefile.am
Normal file
0
src/arch/arm64/Makefile.am
Normal file
3
src/arch/arm64/arm64-codegen.h
Normal file
3
src/arch/arm64/arm64-codegen.h
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#include "../../../../mono-extensions/mono/arch/arm64/arm64-codegen.h"
|
||||||
|
|
||||||
|
|
||||||
2
src/arch/ia64/.gitignore
vendored
Normal file
2
src/arch/ia64/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
3
src/arch/ia64/Makefile.am
Normal file
3
src/arch/ia64/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
EXTRA_DIST = ia64-codegen.h
|
||||||
|
|
||||||
|
|
||||||
861
src/arch/ia64/codegen.c
Normal file
861
src/arch/ia64/codegen.c
Normal file
@@ -0,0 +1,861 @@
|
|||||||
|
/*
|
||||||
|
* codegen.c: Tests for the IA64 code generation macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#define IA64_SIMPLE_EMIT_BUNDLE
|
||||||
|
|
||||||
|
#include <mono/arch/ia64/ia64-codegen.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
mono_disassemble_code (guint8 *code, int size, char *id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
FILE *ofd;
|
||||||
|
const char *tmp = g_get_tmp_dir ();
|
||||||
|
const char *objdump_args = g_getenv ("MONO_OBJDUMP_ARGS");
|
||||||
|
char *as_file;
|
||||||
|
char *o_file;
|
||||||
|
char *cmd;
|
||||||
|
|
||||||
|
as_file = g_strdup_printf ("%s/test.s", tmp);
|
||||||
|
|
||||||
|
if (!(ofd = fopen (as_file, "w")))
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
for (i = 0; id [i]; ++i) {
|
||||||
|
if (!isalnum (id [i]))
|
||||||
|
fprintf (ofd, "_");
|
||||||
|
else
|
||||||
|
fprintf (ofd, "%c", id [i]);
|
||||||
|
}
|
||||||
|
fprintf (ofd, ":\n");
|
||||||
|
|
||||||
|
for (i = 0; i < size; ++i)
|
||||||
|
fprintf (ofd, ".byte %d\n", (unsigned int) code [i]);
|
||||||
|
|
||||||
|
fclose (ofd);
|
||||||
|
|
||||||
|
#ifdef __ia64__
|
||||||
|
#define DIS_CMD "objdump -d"
|
||||||
|
#define AS_CMD "as"
|
||||||
|
#else
|
||||||
|
#define DIS_CMD "ia64-linux-gnu-objdump -d"
|
||||||
|
#define AS_CMD "ia64-linux-gnu-as"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
o_file = g_strdup_printf ("%s/test.o", tmp);
|
||||||
|
cmd = g_strdup_printf (AS_CMD " %s -o %s", as_file, o_file);
|
||||||
|
system (cmd);
|
||||||
|
g_free (cmd);
|
||||||
|
if (!objdump_args)
|
||||||
|
objdump_args = "";
|
||||||
|
|
||||||
|
cmd = g_strdup_printf (DIS_CMD " %s %s", objdump_args, o_file);
|
||||||
|
system (cmd);
|
||||||
|
g_free (cmd);
|
||||||
|
|
||||||
|
g_free (o_file);
|
||||||
|
g_free (as_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
Ia64CodegenState code;
|
||||||
|
|
||||||
|
guint8 *buf = g_malloc0 (40960);
|
||||||
|
|
||||||
|
ia64_codegen_init (code, buf);
|
||||||
|
|
||||||
|
ia64_add (code, 1, 2, 3);
|
||||||
|
ia64_add1 (code, 1, 2, 3);
|
||||||
|
ia64_sub (code, 1, 2, 3);
|
||||||
|
ia64_sub1 (code, 1, 2, 3);
|
||||||
|
ia64_addp4 (code, 1, 2, 3);
|
||||||
|
ia64_and (code, 1, 2, 3);
|
||||||
|
ia64_andcm (code, 1, 2, 3);
|
||||||
|
ia64_or (code, 1, 2, 3);
|
||||||
|
ia64_xor (code, 1, 2, 3);
|
||||||
|
ia64_shladd (code, 1, 2, 3, 4);
|
||||||
|
ia64_shladdp4 (code, 1, 2, 3, 4);
|
||||||
|
ia64_sub_imm (code, 1, 0x7f, 2);
|
||||||
|
ia64_sub_imm (code, 1, -1, 2);
|
||||||
|
ia64_and_imm (code, 1, -128, 2);
|
||||||
|
ia64_andcm_imm (code, 1, -128, 2);
|
||||||
|
ia64_or_imm (code, 1, -128, 2);
|
||||||
|
ia64_xor_imm (code, 1, -128, 2);
|
||||||
|
ia64_adds_imm (code, 1, 8191, 2);
|
||||||
|
ia64_adds_imm (code, 1, -8192, 2);
|
||||||
|
ia64_adds_imm (code, 1, 1234, 2);
|
||||||
|
ia64_adds_imm (code, 1, -1234, 2);
|
||||||
|
ia64_addp4_imm (code, 1, -1234, 2);
|
||||||
|
ia64_addl_imm (code, 1, 1234, 2);
|
||||||
|
ia64_addl_imm (code, 1, -1234, 2);
|
||||||
|
ia64_addl_imm (code, 1, 2097151, 2);
|
||||||
|
ia64_addl_imm (code, 1, -2097152, 2);
|
||||||
|
|
||||||
|
ia64_cmp_lt (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_ltu (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_eq (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_lt_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_ltu_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_eq_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_eq_and (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_eq_or (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_eq_or_andcm (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_ne_and (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_ne_or (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp_ne_or_andcm (code, 1, 2, 1, 2);
|
||||||
|
|
||||||
|
ia64_cmp4_lt (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_ltu (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_eq (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_lt_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_ltu_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_eq_unc (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_eq_and (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_eq_or (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_eq_or_andcm (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_ne_and (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_ne_or (code, 1, 2, 1, 2);
|
||||||
|
ia64_cmp4_ne_or_andcm (code, 1, 2, 1, 2);
|
||||||
|
|
||||||
|
ia64_cmp_gt_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_gt_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_gt_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_le_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_le_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_le_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_ge_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_ge_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_ge_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_lt_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_lt_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp_lt_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
|
||||||
|
ia64_cmp4_gt_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_gt_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_gt_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_le_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_le_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_le_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_ge_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_ge_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_ge_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_lt_and (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_lt_or (code, 1, 2, 0, 2);
|
||||||
|
ia64_cmp4_lt_or_andcm (code, 1, 2, 0, 2);
|
||||||
|
|
||||||
|
ia64_cmp_lt_imm (code, 1, 2, 127, 2);
|
||||||
|
ia64_cmp_lt_imm (code, 1, 2, -128, 2);
|
||||||
|
|
||||||
|
ia64_cmp_lt_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_ltu_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_eq_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_lt_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_ltu_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_eq_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_eq_and_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_eq_or_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_eq_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_ne_and_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_ne_or_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp_ne_or_andcm_imm (code, 1, 2, -128, 2);
|
||||||
|
|
||||||
|
ia64_cmp4_lt_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_ltu_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_eq_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_lt_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_ltu_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_eq_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_eq_and_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_eq_or_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_eq_unc_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_ne_and_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_ne_or_imm (code, 1, 2, -128, 2);
|
||||||
|
ia64_cmp4_ne_or_andcm_imm (code, 1, 2, -128, 2);
|
||||||
|
|
||||||
|
ia64_padd1 (code, 1, 2, 3);
|
||||||
|
ia64_padd2 (code, 1, 2, 3);
|
||||||
|
ia64_padd4 (code, 1, 2, 3);
|
||||||
|
ia64_padd1_sss (code, 1, 2, 3);
|
||||||
|
ia64_padd2_sss (code, 1, 2, 3);
|
||||||
|
ia64_padd1_uuu (code, 1, 2, 3);
|
||||||
|
ia64_padd2_uuu (code, 1, 2, 3);
|
||||||
|
ia64_padd1_uus (code, 1, 2, 3);
|
||||||
|
ia64_padd2_uus (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_psub1 (code, 1, 2, 3);
|
||||||
|
ia64_psub2 (code, 1, 2, 3);
|
||||||
|
ia64_psub4 (code, 1, 2, 3);
|
||||||
|
ia64_psub1_sss (code, 1, 2, 3);
|
||||||
|
ia64_psub2_sss (code, 1, 2, 3);
|
||||||
|
ia64_psub1_uuu (code, 1, 2, 3);
|
||||||
|
ia64_psub2_uuu (code, 1, 2, 3);
|
||||||
|
ia64_psub1_uus (code, 1, 2, 3);
|
||||||
|
ia64_psub2_uus (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_pavg1 (code, 1, 2, 3);
|
||||||
|
ia64_pavg2 (code, 1, 2, 3);
|
||||||
|
ia64_pavg1_raz (code, 1, 2, 3);
|
||||||
|
ia64_pavg2_raz (code, 1, 2, 3);
|
||||||
|
ia64_pavgsub1 (code, 1, 2, 3);
|
||||||
|
ia64_pavgsub2 (code, 1, 2, 3);
|
||||||
|
ia64_pcmp1_eq (code, 1, 2, 3);
|
||||||
|
ia64_pcmp2_eq (code, 1, 2, 3);
|
||||||
|
ia64_pcmp4_eq (code, 1, 2, 3);
|
||||||
|
ia64_pcmp1_gt (code, 1, 2, 3);
|
||||||
|
ia64_pcmp2_gt (code, 1, 2, 3);
|
||||||
|
ia64_pcmp4_gt (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_pshladd2 (code, 1, 2, 3, 4);
|
||||||
|
ia64_pshradd2 (code, 1, 2, 3, 4);
|
||||||
|
|
||||||
|
ia64_pmpyshr2 (code, 1, 2, 3, 0);
|
||||||
|
ia64_pmpyshr2_u (code, 1, 2, 3, 0);
|
||||||
|
ia64_pmpyshr2 (code, 1, 2, 3, 7);
|
||||||
|
ia64_pmpyshr2_u (code, 1, 2, 3, 7);
|
||||||
|
ia64_pmpyshr2 (code, 1, 2, 3, 15);
|
||||||
|
ia64_pmpyshr2_u (code, 1, 2, 3, 15);
|
||||||
|
ia64_pmpyshr2 (code, 1, 2, 3, 16);
|
||||||
|
ia64_pmpyshr2_u (code, 1, 2, 3, 16);
|
||||||
|
|
||||||
|
ia64_pmpy2_r (code, 1, 2, 3);
|
||||||
|
ia64_pmpy2_l (code, 1, 2, 3);
|
||||||
|
ia64_mix1_r (code, 1, 2, 3);
|
||||||
|
ia64_mix2_r (code, 1, 2, 3);
|
||||||
|
ia64_mix4_r (code, 1, 2, 3);
|
||||||
|
ia64_mix1_l (code, 1, 2, 3);
|
||||||
|
ia64_mix2_l (code, 1, 2, 3);
|
||||||
|
ia64_mix4_l (code, 1, 2, 3);
|
||||||
|
ia64_pack2_uss (code, 1, 2, 3);
|
||||||
|
ia64_pack2_sss (code, 1, 2, 3);
|
||||||
|
ia64_pack4_sss (code, 1, 2, 3);
|
||||||
|
ia64_unpack1_h (code, 1, 2, 3);
|
||||||
|
ia64_unpack2_h (code, 1, 2, 3);
|
||||||
|
ia64_unpack4_h (code, 1, 2, 3);
|
||||||
|
ia64_unpack1_l (code, 1, 2, 3);
|
||||||
|
ia64_unpack2_l (code, 1, 2, 3);
|
||||||
|
ia64_unpack4_l (code, 1, 2, 3);
|
||||||
|
ia64_pmin1_u (code, 1, 2, 3);
|
||||||
|
ia64_pmax1_u (code, 1, 2, 3);
|
||||||
|
ia64_pmin2 (code, 1, 2, 3);
|
||||||
|
ia64_pmax2 (code, 1, 2, 3);
|
||||||
|
ia64_psad1 (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_mux1 (code, 1, 2, IA64_MUX1_BRCST);
|
||||||
|
ia64_mux1 (code, 1, 2, IA64_MUX1_MIX);
|
||||||
|
ia64_mux1 (code, 1, 2, IA64_MUX1_SHUF);
|
||||||
|
ia64_mux1 (code, 1, 2, IA64_MUX1_ALT);
|
||||||
|
ia64_mux1 (code, 1, 2, IA64_MUX1_REV);
|
||||||
|
|
||||||
|
ia64_mux2 (code, 1, 2, 0x8d);
|
||||||
|
|
||||||
|
ia64_pshr2 (code, 1, 2, 3);
|
||||||
|
ia64_pshr4 (code, 1, 2, 3);
|
||||||
|
ia64_shr (code, 1, 2, 3);
|
||||||
|
ia64_pshr2_u (code, 1, 2, 3);
|
||||||
|
ia64_pshr4_u (code, 1, 2, 3);
|
||||||
|
ia64_shr_u (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_pshr2_imm (code, 1, 2, 20);
|
||||||
|
ia64_pshr4_imm (code, 1, 2, 20);
|
||||||
|
ia64_pshr2_u_imm (code, 1, 2, 20);
|
||||||
|
ia64_pshr4_u_imm (code, 1, 2, 20);
|
||||||
|
|
||||||
|
ia64_pshl2 (code, 1, 2, 3);
|
||||||
|
ia64_pshl4 (code, 1, 2, 3);
|
||||||
|
ia64_shl (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_pshl2_imm (code, 1, 2, 20);
|
||||||
|
ia64_pshl4_imm (code, 1, 2, 20);
|
||||||
|
|
||||||
|
ia64_popcnt (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_shrp (code, 1, 2, 3, 62);
|
||||||
|
|
||||||
|
ia64_extr_u (code, 1, 2, 62, 61);
|
||||||
|
ia64_extr (code, 1, 2, 62, 61);
|
||||||
|
|
||||||
|
ia64_dep_z (code, 1, 2, 62, 61);
|
||||||
|
|
||||||
|
ia64_dep_z_imm (code, 1, 127, 62, 61);
|
||||||
|
ia64_dep_z_imm (code, 1, -128, 62, 61);
|
||||||
|
ia64_dep_imm (code, 1, 0, 2, 62, 61);
|
||||||
|
ia64_dep_imm (code, 1, -1, 2, 62, 61);
|
||||||
|
ia64_dep (code, 1, 2, 3, 10, 15);
|
||||||
|
|
||||||
|
ia64_tbit_z (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_tbit_z (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_z_unc (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_z_and (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_nz_and (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_z_or (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_nz_or (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_z_or_andcm (code, 1, 2, 3, 63);
|
||||||
|
ia64_tbit_nz_or_andcm (code, 1, 2, 3, 63);
|
||||||
|
|
||||||
|
ia64_tnat_z (code, 1, 2, 3);
|
||||||
|
ia64_tnat_z_unc (code, 1, 2, 3);
|
||||||
|
ia64_tnat_z_and (code, 1, 2, 3);
|
||||||
|
ia64_tnat_nz_and (code, 1, 2, 3);
|
||||||
|
ia64_tnat_z_or (code, 1, 2, 3);
|
||||||
|
ia64_tnat_nz_or (code, 1, 2, 3);
|
||||||
|
ia64_tnat_z_or_andcm (code, 1, 2, 3);
|
||||||
|
ia64_tnat_nz_or_andcm (code, 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_nop_i (code, 0x1234);
|
||||||
|
ia64_hint_i (code, 0x1234);
|
||||||
|
|
||||||
|
ia64_break_i (code, 0x1234);
|
||||||
|
|
||||||
|
ia64_chk_s_i (code, 1, 0);
|
||||||
|
ia64_chk_s_i (code, 1, -1);
|
||||||
|
ia64_chk_s_i (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_br_hint (code, 1, 1, -1, IA64_MOV_TO_BR_WH_NONE, 0);
|
||||||
|
ia64_mov_to_br_hint (code, 1, 1, -1, IA64_MOV_TO_BR_WH_SPTK, 0);
|
||||||
|
ia64_mov_to_br_hint (code, 1, 1, -1, IA64_MOV_TO_BR_WH_DPTK, 0);
|
||||||
|
ia64_mov_to_br_hint (code, 1, 1, -1, IA64_MOV_TO_BR_WH_DPTK, IA64_BR_IH_IMP);
|
||||||
|
ia64_mov_ret_to_br_hint (code, 1, 1, -1, IA64_MOV_TO_BR_WH_NONE, 0);
|
||||||
|
|
||||||
|
ia64_mov_from_br (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_pred (code, 1, 0xfe);
|
||||||
|
|
||||||
|
ia64_mov_to_pred_rot_imm (code, 0xff0000);
|
||||||
|
|
||||||
|
ia64_mov_from_ip (code, 1);
|
||||||
|
ia64_mov_from_pred (code, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_ar_i (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_ar_imm_i (code, 1, 127);
|
||||||
|
|
||||||
|
ia64_mov_from_ar_i (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_zxt1 (code, 1, 2);
|
||||||
|
ia64_zxt2 (code, 1, 2);
|
||||||
|
ia64_zxt4 (code, 1, 2);
|
||||||
|
ia64_sxt1 (code, 1, 2);
|
||||||
|
ia64_sxt2 (code, 1, 2);
|
||||||
|
ia64_sxt4 (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_czx1_l (code, 1, 2);
|
||||||
|
ia64_czx2_l (code, 1, 2);
|
||||||
|
ia64_czx1_r (code, 1, 2);
|
||||||
|
ia64_czx2_r (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_ld1_hint (code, 1, 2, IA64_LD_HINT_NONE);
|
||||||
|
ia64_ld1_hint (code, 1, 2, IA64_LD_HINT_NT1);
|
||||||
|
ia64_ld1_hint (code, 1, 2, IA64_LD_HINT_NTA);
|
||||||
|
|
||||||
|
ia64_ld1_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld2_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld4_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld8_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ld1_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld2_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld4_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld8_s_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ld1_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld2_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld4_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld8_a_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ld1_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld2_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld4_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld8_sa_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ld1_bias_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld2_bias_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld4_bias_hint (code, 1, 2, 0);
|
||||||
|
ia64_ld8_bias_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ld1_inc_hint (code, 1, 2, 3, IA64_LD_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_ld1_inc_imm_hint (code, 1, 2, 255, IA64_LD_HINT_NONE);
|
||||||
|
ia64_ld1_inc_imm_hint (code, 1, 2, -256, IA64_LD_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st1_hint (code, 1, 2, IA64_ST_HINT_NTA);
|
||||||
|
|
||||||
|
ia64_st1_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st2_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st4_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st8_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st1_rel_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st2_rel_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st4_rel_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st8_rel_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st8_spill_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st16_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st16_rel_hint (code, 1, 2, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st1_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st2_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st4_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st8_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st1_rel_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st2_rel_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st4_rel_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
ia64_st8_rel_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_st8_spill_inc_imm_hint (code, 1, 2, 255, IA64_ST_HINT_NONE);
|
||||||
|
|
||||||
|
ia64_ldfs_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_s_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_s_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_a_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_a_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_sa_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_sa_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_clr_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_c_clr_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_c_clr_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_c_clr_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_nc_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfd_c_nc_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldf8_c_nc_hint (code, 1, 2, 0);
|
||||||
|
ia64_ldfe_c_nc_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldf_fill_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfd_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldf8_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfe_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldf_fill_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_s_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_s_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_s_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_s_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_a_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_a_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_a_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_a_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_sa_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_sa_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_sa_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_sa_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_clr_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_c_clr_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_c_clr_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_c_clr_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfs_c_nc_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfd_c_nc_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldf8_c_nc_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_ldfe_c_nc_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldf_fill_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_stfs_hint (code, 1, 2, 0);
|
||||||
|
ia64_stfd_hint (code, 1, 2, 0);
|
||||||
|
ia64_stf8_hint (code, 1, 2, 0);
|
||||||
|
ia64_stfe_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_stf_spill_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_stfs_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_stfd_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_stf8_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
ia64_stfe_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_stf_spill_inc_imm_hint (code, 1, 2, 255, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_s_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_s_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_s_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_a_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_a_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_a_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_sa_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_sa_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_sa_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_c_clr_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_c_clr_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_c_clr_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_c_nc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_c_nc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_c_nc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_s_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_a_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_sa_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_c_clr_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_ldfps_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfpd_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_ldfp8_c_nc_inc_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_lfetch_hint (code, 1, 0);
|
||||||
|
ia64_lfetch_excl_hint (code, 1, 0);
|
||||||
|
ia64_lfetch_fault_hint (code, 1, 0);
|
||||||
|
ia64_lfetch_fault_excl_hint (code, 1, 0);
|
||||||
|
|
||||||
|
ia64_lfetch_hint (code, 1, IA64_LFHINT_NT1);
|
||||||
|
ia64_lfetch_hint (code, 1, IA64_LFHINT_NT2);
|
||||||
|
ia64_lfetch_hint (code, 1, IA64_LFHINT_NTA);
|
||||||
|
|
||||||
|
ia64_lfetch_inc_hint (code, 1, 2, 0);
|
||||||
|
ia64_lfetch_excl_inc_hint (code, 1, 2, 0);
|
||||||
|
ia64_lfetch_fault_inc_hint (code, 1, 2, 0);
|
||||||
|
ia64_lfetch_fault_excl_inc_hint (code, 1, 2, 0);
|
||||||
|
|
||||||
|
ia64_lfetch_inc_imm_hint (code, 1, 255, 0);
|
||||||
|
ia64_lfetch_excl_inc_imm_hint (code, 1, 255, 0);
|
||||||
|
ia64_lfetch_fault_inc_imm_hint (code, 1, 255, 0);
|
||||||
|
ia64_lfetch_fault_excl_inc_imm_hint (code, 1, 255, 0);
|
||||||
|
|
||||||
|
ia64_cmpxchg1_acq_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg2_acq_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg4_acq_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg8_acq_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg1_rel_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg2_rel_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg4_rel_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg8_rel_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg16_acq_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_cmpxchg16_rel_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_xchg1_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_xchg2_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_xchg4_hint (code, 1, 2, 3, 0);
|
||||||
|
ia64_xchg8_hint (code, 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, -16, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, -8, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, -4, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, -1, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, 1, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, 4, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, 8, 0);
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, 16, 0);
|
||||||
|
|
||||||
|
ia64_fetchadd4_acq_hint (code, 1, 2, 16, 0);
|
||||||
|
ia64_fetchadd8_acq_hint (code, 1, 2, 16, 0);
|
||||||
|
ia64_fetchadd4_rel_hint (code, 1, 2, 16, 0);
|
||||||
|
ia64_fetchadd8_rel_hint (code, 1, 2, 16, 0);
|
||||||
|
|
||||||
|
ia64_setf_sig (code, 1, 2);
|
||||||
|
ia64_setf_exp (code, 1, 2);
|
||||||
|
ia64_setf_s (code, 1, 2);
|
||||||
|
ia64_setf_d (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_getf_sig (code, 1, 2);
|
||||||
|
ia64_getf_exp (code, 1, 2);
|
||||||
|
ia64_getf_s (code, 1, 2);
|
||||||
|
ia64_getf_d (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_chk_s_m (code, 1, 0);
|
||||||
|
ia64_chk_s_m (code, 1, 1);
|
||||||
|
ia64_chk_s_m (code, 1, -1);
|
||||||
|
|
||||||
|
ia64_chk_s_float_m (code, 1, 0);
|
||||||
|
|
||||||
|
ia64_chk_a_nc (code, 1, 0);
|
||||||
|
ia64_chk_a_nc (code, 1, 1);
|
||||||
|
ia64_chk_a_nc (code, 1, -1);
|
||||||
|
|
||||||
|
ia64_chk_a_nc (code, 1, 0);
|
||||||
|
ia64_chk_a_clr (code, 1, 0);
|
||||||
|
|
||||||
|
ia64_chk_a_nc_float (code, 1, 0);
|
||||||
|
ia64_chk_a_clr_float (code, 1, 0);
|
||||||
|
|
||||||
|
ia64_invala (code);
|
||||||
|
ia64_fwb (code);
|
||||||
|
ia64_mf (code);
|
||||||
|
ia64_mf_a (code);
|
||||||
|
ia64_srlz_d (code);
|
||||||
|
ia64_stlz_i (code);
|
||||||
|
ia64_sync_i (code);
|
||||||
|
|
||||||
|
ia64_flushrs (code);
|
||||||
|
ia64_loadrs (code);
|
||||||
|
|
||||||
|
ia64_invala_e (code, 1);
|
||||||
|
ia64_invala_e_float (code, 1);
|
||||||
|
|
||||||
|
ia64_fc (code, 1);
|
||||||
|
ia64_fc_i (code, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_ar_m (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_ar_imm_m (code, 1, 127);
|
||||||
|
|
||||||
|
ia64_mov_from_ar_m (code, 1, 1);
|
||||||
|
|
||||||
|
ia64_mov_to_cr (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_mov_from_cr (code, 1, 2);
|
||||||
|
|
||||||
|
ia64_alloc (code, 1, 3, 4, 5, 0);
|
||||||
|
ia64_alloc (code, 1, 3, 4, 5, 8);
|
||||||
|
|
||||||
|
ia64_mov_to_psr_l (code, 1);
|
||||||
|
ia64_mov_to_psr_um (code, 1);
|
||||||
|
|
||||||
|
ia64_mov_from_psr (code, 1);
|
||||||
|
ia64_mov_from_psr_um (code, 1);
|
||||||
|
|
||||||
|
ia64_break_m (code, 0x1234);
|
||||||
|
ia64_nop_m (code, 0x1234);
|
||||||
|
ia64_hint_m (code, 0x1234);
|
||||||
|
|
||||||
|
ia64_br_cond_hint (code, 0, 0, 0, 0);
|
||||||
|
ia64_br_wexit_hint (code, 0, 0, 0, 0);
|
||||||
|
ia64_br_wtop_hint (code, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_br_cloop_hint (code, 0, 0, 0, 0);
|
||||||
|
ia64_br_cexit_hint (code, 0, 0, 0, 0);
|
||||||
|
ia64_br_ctop_hint (code, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_br_call_hint (code, 1, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_br_cond_reg_hint (code, 1, 0, 0, 0);
|
||||||
|
ia64_br_ia_reg_hint (code, 1, 0, 0, 0);
|
||||||
|
ia64_br_ret_reg_hint (code, 1, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_br_call_reg_hint (code, 1, 2, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_cover (code);
|
||||||
|
ia64_clrrrb (code);
|
||||||
|
ia64_clrrrb_pr (code);
|
||||||
|
ia64_rfi (code);
|
||||||
|
ia64_bsw_0 (code);
|
||||||
|
ia64_bsw_1 (code);
|
||||||
|
ia64_epc (code);
|
||||||
|
|
||||||
|
ia64_break_b (code, 0x1234);
|
||||||
|
ia64_nop_b (code, 0x1234);
|
||||||
|
ia64_hint_b (code, 0x1234);
|
||||||
|
|
||||||
|
ia64_break_x (code, 0x2123456789ABCDEFULL);
|
||||||
|
|
||||||
|
ia64_movl (code, 1, 0x123456789ABCDEF0LL);
|
||||||
|
|
||||||
|
ia64_brl_cond_hint (code, 0, 0, 0, 0);
|
||||||
|
ia64_brl_cond_hint (code, -1, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_brl_call_hint (code, 1, 0, 0, 0, 0);
|
||||||
|
ia64_brl_call_hint (code, 1, -1, 0, 0, 0);
|
||||||
|
|
||||||
|
ia64_nop_x (code, 0x2123456789ABCDEFULL);
|
||||||
|
ia64_hint_x (code, 0x2123456789ABCDEFULL);
|
||||||
|
|
||||||
|
ia64_movl_pred (code, 1, 1, 0x123456789ABCDEF0LL);
|
||||||
|
|
||||||
|
/* FLOATING-POINT */
|
||||||
|
ia64_fma_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fma_s_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fma_d_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fpma_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fms_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fms_s_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fms_d_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fpms_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fnma_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fnma_s_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fnma_d_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
ia64_fpnma_sf_pred (code, 1, 1, 2, 3, 4, 2);
|
||||||
|
|
||||||
|
ia64_xma_l_pred (code, 1, 1, 2, 3, 4);
|
||||||
|
ia64_xma_h_pred (code, 1, 1, 2, 3, 4);
|
||||||
|
ia64_xma_hu_pred (code, 1, 1, 2, 3, 4);
|
||||||
|
|
||||||
|
ia64_fselect_pred (code, 1, 1, 2, 3, 4);
|
||||||
|
|
||||||
|
ia64_fcmp_eq_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_lt_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_le_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_unord_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_eq_unc_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_lt_unc_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_le_unc_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fcmp_unord_unc_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
|
||||||
|
ia64_fclass_m_pred (code, 1, 1, 2, 3, 0x1ff);
|
||||||
|
ia64_fclass_m_unc_pred (code, 1, 1, 2, 3, 0x1ff);
|
||||||
|
|
||||||
|
ia64_frcpa_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fprcpa_sf_pred (code, 1, 1, 2, 3, 4, 0);
|
||||||
|
|
||||||
|
ia64_frsqrta_sf_pred (code, 1, 1, 2, 4, 0);
|
||||||
|
ia64_fprsqrta_sf_pred (code, 1, 1, 2, 4, 0);
|
||||||
|
|
||||||
|
ia64_fmin_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fman_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_famin_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_famax_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpmin_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpman_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpamin_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpamax_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_eq_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_lt_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_le_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_unord_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_neq_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_nlt_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_nle_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
ia64_fpcmp_ord_sf_pred (code, 1, 2, 3, 4, 0);
|
||||||
|
|
||||||
|
ia64_fmerge_s_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fmerge_ns_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fmerge_se_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fmix_lr_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fmix_r_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fmix_l_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fsxt_r_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fsxt_l_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fpack_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fswap_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fswap_nl_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fswap_nr_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fand_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fandcm_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_for_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fxor_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fpmerge_s_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fpmerge_ns_pred (code, 1, 2, 3, 4);
|
||||||
|
ia64_fpmerge_se_pred (code, 1, 2, 3, 4);
|
||||||
|
|
||||||
|
ia64_fcvt_fx_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fcvt_fxu_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fcvt_fx_trunc_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fcvt_fxu_trunc_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fpcvt_fx_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fpcvt_fxu_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fpcvt_fx_trunc_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
ia64_fpcvt_fxu_trunc_sf_pred ((code), 1, 2, 3, 0);
|
||||||
|
|
||||||
|
ia64_fcvt_xf_pred ((code), 1, 2, 3);
|
||||||
|
|
||||||
|
ia64_fsetc_sf_pred ((code), 1, 0x33, 0x33, 3);
|
||||||
|
|
||||||
|
ia64_fclrf_sf_pred ((code), 1, 3);
|
||||||
|
|
||||||
|
ia64_fchkf_sf_pred ((code), 1, -1, 3);
|
||||||
|
|
||||||
|
ia64_break_f_pred ((code), 1, 0x1234);
|
||||||
|
|
||||||
|
ia64_movl (code, 31, -123456);
|
||||||
|
|
||||||
|
ia64_codegen_close (code);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* disassembly */
|
||||||
|
{
|
||||||
|
guint8 *buf = code.buf;
|
||||||
|
int template;
|
||||||
|
guint64 dw1, dw2;
|
||||||
|
guint64 ins1, ins2, ins3;
|
||||||
|
|
||||||
|
ia64_break_i (code, 0x1234);
|
||||||
|
|
||||||
|
ia64_codegen_close (code);
|
||||||
|
|
||||||
|
dw1 = ((guint64*)buf) [0];
|
||||||
|
dw2 = ((guint64*)buf) [1];
|
||||||
|
|
||||||
|
template = ia64_bundle_template (buf);
|
||||||
|
ins1 = ia64_bundle_ins1 (buf);
|
||||||
|
ins2 = ia64_bundle_ins2 (buf);
|
||||||
|
ins3 = ia64_bundle_ins3 (buf);
|
||||||
|
|
||||||
|
code.buf = buf;
|
||||||
|
ia64_emit_bundle_template (&code, template, ins1, ins2, ins3);
|
||||||
|
|
||||||
|
g_assert (dw1 == ((guint64*)buf) [0]);
|
||||||
|
g_assert (dw2 == ((guint64*)buf) [1]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mono_disassemble_code (buf, 40960, "code");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
3183
src/arch/ia64/ia64-codegen.h
Normal file
3183
src/arch/ia64/ia64-codegen.h
Normal file
File diff suppressed because it is too large
Load Diff
6
src/arch/mips/.gitignore
vendored
Normal file
6
src/arch/mips/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/
|
||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/*.o
|
||||||
|
/*.lo
|
||||||
|
/.deps
|
||||||
8
src/arch/mips/Makefile.am
Normal file
8
src/arch/mips/Makefile.am
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libmonoarch-mips.la
|
||||||
|
|
||||||
|
libmonoarch_mips_la_SOURCES = mips-codegen.h
|
||||||
|
|
||||||
|
noinst_PROGRAMS = test
|
||||||
435
src/arch/mips/mips-codegen.h
Normal file
435
src/arch/mips/mips-codegen.h
Normal file
@@ -0,0 +1,435 @@
|
|||||||
|
#ifndef __MIPS_CODEGEN_H__
|
||||||
|
#define __MIPS_CODEGEN_H__
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004 Novell, Inc
|
||||||
|
* Author: Paolo Molaro (lupus@ximian.com)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* registers */
|
||||||
|
enum {
|
||||||
|
mips_zero,
|
||||||
|
mips_at, /* assembler temp */
|
||||||
|
mips_v0, /* return values */
|
||||||
|
mips_v1,
|
||||||
|
mips_a0, /* 4 - func arguments */
|
||||||
|
mips_a1,
|
||||||
|
mips_a2,
|
||||||
|
mips_a3,
|
||||||
|
#if _MIPS_SIM == _ABIO32
|
||||||
|
mips_t0, /* 8 temporaries */
|
||||||
|
mips_t1,
|
||||||
|
mips_t2,
|
||||||
|
mips_t3,
|
||||||
|
mips_t4,
|
||||||
|
mips_t5,
|
||||||
|
mips_t6,
|
||||||
|
mips_t7,
|
||||||
|
#elif _MIPS_SIM == _ABIN32
|
||||||
|
mips_a4, /* 4 more argument registers */
|
||||||
|
mips_a5,
|
||||||
|
mips_a6,
|
||||||
|
mips_a7,
|
||||||
|
mips_t0, /* 4 temporaries */
|
||||||
|
mips_t1,
|
||||||
|
mips_t2,
|
||||||
|
mips_t3,
|
||||||
|
#endif
|
||||||
|
mips_s0, /* 16 calle saved */
|
||||||
|
mips_s1,
|
||||||
|
mips_s2,
|
||||||
|
mips_s3,
|
||||||
|
mips_s4,
|
||||||
|
mips_s5,
|
||||||
|
mips_s6,
|
||||||
|
mips_s7,
|
||||||
|
mips_t8, /* 24 temps */
|
||||||
|
mips_t9, /* 25 temp / pic call-through register */
|
||||||
|
mips_k0, /* 26 kernel-reserved */
|
||||||
|
mips_k1,
|
||||||
|
mips_gp, /* 28 */
|
||||||
|
mips_sp, /* stack pointer */
|
||||||
|
mips_fp, /* frame pointer */
|
||||||
|
mips_ra /* return address */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* we treat the register file as containing just doubles... */
|
||||||
|
enum {
|
||||||
|
mips_f0, /* return regs */
|
||||||
|
mips_f1,
|
||||||
|
mips_f2,
|
||||||
|
mips_f3,
|
||||||
|
mips_f4, /* temps */
|
||||||
|
mips_f5,
|
||||||
|
mips_f6,
|
||||||
|
mips_f7,
|
||||||
|
mips_f8,
|
||||||
|
mips_f9,
|
||||||
|
mips_f10,
|
||||||
|
mips_f11,
|
||||||
|
mips_f12, /* first arg */
|
||||||
|
mips_f13,
|
||||||
|
mips_f14, /* second arg */
|
||||||
|
mips_f15,
|
||||||
|
mips_f16, /* temps */
|
||||||
|
mips_f17,
|
||||||
|
mips_f18,
|
||||||
|
mips_f19,
|
||||||
|
mips_f20, /* callee saved */
|
||||||
|
mips_f21,
|
||||||
|
mips_f22,
|
||||||
|
mips_f23,
|
||||||
|
mips_f24,
|
||||||
|
mips_f25,
|
||||||
|
mips_f26,
|
||||||
|
mips_f27,
|
||||||
|
mips_f28,
|
||||||
|
mips_f29,
|
||||||
|
mips_f30,
|
||||||
|
mips_f31
|
||||||
|
};
|
||||||
|
|
||||||
|
/* prefetch hints */
|
||||||
|
enum {
|
||||||
|
MIPS_FOR_LOAD,
|
||||||
|
MIPS_FOR_STORE,
|
||||||
|
MIPS_FOR_LOAD_STREAMED = 4,
|
||||||
|
MIPS_FOR_STORE_STREAMED,
|
||||||
|
MIPS_FOR_LOAD_RETAINED,
|
||||||
|
MIPS_FOR_STORE_RETAINED
|
||||||
|
};
|
||||||
|
|
||||||
|
/* coprocessors */
|
||||||
|
enum {
|
||||||
|
MIPS_COP0,
|
||||||
|
MIPS_COP1,
|
||||||
|
MIPS_COP2,
|
||||||
|
MIPS_COP3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MIPS_FMT_SINGLE = 16,
|
||||||
|
MIPS_FMT_DOUBLE = 17,
|
||||||
|
MIPS_FMT_WORD = 20,
|
||||||
|
MIPS_FMT_LONG = 21,
|
||||||
|
MIPS_FMT3_SINGLE = 0,
|
||||||
|
MIPS_FMT3_DOUBLE = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/* fpu rounding mode */
|
||||||
|
enum {
|
||||||
|
MIPS_ROUND_TO_NEAREST,
|
||||||
|
MIPS_ROUND_TO_ZERO,
|
||||||
|
MIPS_ROUND_TO_POSINF,
|
||||||
|
MIPS_ROUND_TO_NEGINF,
|
||||||
|
MIPS_ROUND_MASK = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
/* fpu enable/cause flags, cc */
|
||||||
|
enum {
|
||||||
|
MIPS_FPU_C_MASK = 1 << 23,
|
||||||
|
MIPS_INEXACT = 1,
|
||||||
|
MIPS_UNDERFLOW = 2,
|
||||||
|
MIPS_OVERFLOW = 4,
|
||||||
|
MIPS_DIVZERO = 8,
|
||||||
|
MIPS_INVALID = 16,
|
||||||
|
MIPS_NOTIMPL = 32,
|
||||||
|
MIPS_FPU_FLAGS_OFFSET = 2,
|
||||||
|
MIPS_FPU_ENABLES_OFFSET = 7,
|
||||||
|
MIPS_FPU_CAUSES_OFFSET = 12
|
||||||
|
};
|
||||||
|
|
||||||
|
/* fpu condition values - see manual entry for C.cond.fmt instructions */
|
||||||
|
enum {
|
||||||
|
MIPS_FPU_F,
|
||||||
|
MIPS_FPU_UN,
|
||||||
|
MIPS_FPU_EQ,
|
||||||
|
MIPS_FPU_UEQ,
|
||||||
|
MIPS_FPU_OLT,
|
||||||
|
MIPS_FPU_ULT,
|
||||||
|
MIPS_FPU_OLE,
|
||||||
|
MIPS_FPU_ULE,
|
||||||
|
MIPS_FPU_SF,
|
||||||
|
MIPS_FPU_NGLE,
|
||||||
|
MIPS_FPU_SEQ,
|
||||||
|
MIPS_FPU_NGL,
|
||||||
|
MIPS_FPU_LT,
|
||||||
|
MIPS_FPU_NGE,
|
||||||
|
MIPS_FPU_LE,
|
||||||
|
MIPS_FPU_NGT
|
||||||
|
};
|
||||||
|
|
||||||
|
#if SIZEOF_REGISTER == 4
|
||||||
|
|
||||||
|
#define MIPS_SW mips_sw
|
||||||
|
#define MIPS_LW mips_lw
|
||||||
|
#define MIPS_ADDU mips_addu
|
||||||
|
#define MIPS_ADDIU mips_addiu
|
||||||
|
#define MIPS_SWC1 mips_swc1
|
||||||
|
#define MIPS_LWC1 mips_lwc1
|
||||||
|
#define MIPS_MOVE mips_move
|
||||||
|
|
||||||
|
#elif SIZEOF_REGISTER == 8
|
||||||
|
|
||||||
|
#define MIPS_SW mips_sd
|
||||||
|
#define MIPS_LW mips_ld
|
||||||
|
#define MIPS_ADDU mips_daddu
|
||||||
|
#define MIPS_ADDIU mips_daddiu
|
||||||
|
#define MIPS_SWC1 mips_sdc1
|
||||||
|
#define MIPS_LWC1 mips_ldc1
|
||||||
|
#define MIPS_MOVE mips_dmove
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown SIZEOF_REGISTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define mips_emit32(c,x) do { \
|
||||||
|
*((guint32 *) (void *)(c)) = x; \
|
||||||
|
(c) = (typeof(c))(((guint32 *)(void *)(c)) + 1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define mips_format_i(code,op,rs,rt,imm) mips_emit32 ((code), (((op)<<26)|((rs)<<21)|((rt)<<16)|((imm)&0xffff)))
|
||||||
|
#define mips_format_j(code,op,imm) mips_emit32 ((code), (((op)<<26)|((imm)&0x03ffffff)))
|
||||||
|
#define mips_format_r(code,op,rs,rt,rd,sa,func) mips_emit32 ((code), (((op)<<26)|((rs)<<21)|((rt)<<16)|((rd)<<11)|((sa)<<6)|(func)))
|
||||||
|
#define mips_format_divmul(code,op,src1,src2,fun) mips_emit32 ((code), (((op)<<26)|((src1)<<21)|((src2)<<16)|(fun)))
|
||||||
|
|
||||||
|
#define mips_is_imm16(val) ((gint)(gshort)(gint)(val) == (gint)(val))
|
||||||
|
|
||||||
|
/* Load always using lui/addiu pair (for later patching) */
|
||||||
|
#define mips_load(c,D,v) do { \
|
||||||
|
if (((guint32)(v)) & (1 << 15)) { \
|
||||||
|
mips_lui ((c), (D), mips_zero, (((guint32)(v))>>16)+1); \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
mips_lui ((c), (D), mips_zero, (((guint32)(v))>>16)); \
|
||||||
|
} \
|
||||||
|
mips_addiu ((c), (D), (D), ((guint32)(v)) & 0xffff); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* load constant - no patch-up */
|
||||||
|
#define mips_load_const(c,D,v) do { \
|
||||||
|
if (!mips_is_imm16 ((v))) { \
|
||||||
|
if (((guint32)(v)) & (1 << 15)) { \
|
||||||
|
mips_lui ((c), (D), mips_zero, (((guint32)(v))>>16)+1); \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
mips_lui ((c), (D), mips_zero, (((guint32)(v))>>16)); \
|
||||||
|
} \
|
||||||
|
if (((guint32)(v)) & 0xffff) \
|
||||||
|
mips_addiu ((c), (D), (D), ((guint32)(v)) & 0xffff); \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
mips_addiu ((c), (D), mips_zero, ((guint32)(v)) & 0xffff); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* arithmetric ops */
|
||||||
|
#define mips_add(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,32)
|
||||||
|
#define mips_addi(c,dest,src1,imm) mips_format_i(c,8,src1,dest,imm)
|
||||||
|
#define mips_addu(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,33)
|
||||||
|
#define mips_addiu(c,dest,src1,imm) mips_format_i(c,9,src1,dest,imm)
|
||||||
|
#define mips_dadd(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,44)
|
||||||
|
#define mips_daddi(c,dest,src1,imm) mips_format_i(c,24,src1,dest,imm)
|
||||||
|
#define mips_daddu(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,45)
|
||||||
|
#define mips_daddiu(c,dest,src1,imm) mips_format_i(c,25,src1,dest,imm)
|
||||||
|
#define mips_dsub(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,46)
|
||||||
|
#define mips_dsubu(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,47)
|
||||||
|
#define mips_mul(c,dest,src1,src2) mips_format_r(c,28,src1,src2,dest,0,2)
|
||||||
|
#define mips_sub(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,34)
|
||||||
|
#define mips_subu(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,35)
|
||||||
|
|
||||||
|
/* div and mul ops */
|
||||||
|
#define mips_ddiv(c,src1,src2) mips_format_divmul(c,0,src1,src2,30)
|
||||||
|
#define mips_ddivu(c,src1,src2) mips_format_divmul(c,0,src1,src2,31)
|
||||||
|
#define mips_div(c,src1,src2) mips_format_divmul(c,0,src1,src2,26)
|
||||||
|
#define mips_divu(c,src1,src2) mips_format_divmul(c,0,src1,src2,27)
|
||||||
|
#define mips_dmult(c,src1,src2) mips_format_divmul(c,0,src1,src2,28)
|
||||||
|
#define mips_dmultu(c,src1,src2) mips_format_divmul(c,0,src1,src2,29)
|
||||||
|
#define mips_mult(c,src1,src2) mips_format_divmul(c,0,src1,src2,24)
|
||||||
|
#define mips_multu(c,src1,src2) mips_format_divmul(c,0,src1,src2,25)
|
||||||
|
|
||||||
|
/* shift ops */
|
||||||
|
#define mips_dsll(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,56)
|
||||||
|
#define mips_dsll32(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,60)
|
||||||
|
#define mips_dsllv(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,20)
|
||||||
|
#define mips_dsra(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,59)
|
||||||
|
#define mips_dsra32(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,63)
|
||||||
|
#define mips_dsrav(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,23)
|
||||||
|
#define mips_dsrl(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,58)
|
||||||
|
#define mips_dsrl32(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,62)
|
||||||
|
#define mips_dsrlv(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,22)
|
||||||
|
#define mips_sll(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,0)
|
||||||
|
#define mips_sllv(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,4)
|
||||||
|
#define mips_sra(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,3)
|
||||||
|
#define mips_srav(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,7)
|
||||||
|
#define mips_srl(c,dest,src1,imm) mips_format_r(c,0,0,src1,dest,imm,2)
|
||||||
|
#define mips_srlv(c,dest,src1,src2) mips_format_r(c,0,src2,src1,dest,0,6)
|
||||||
|
|
||||||
|
/* logical ops */
|
||||||
|
#define mips_and(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,36)
|
||||||
|
#define mips_andi(c,dest,src1,imm) mips_format_i(c,12,src1,dest,imm)
|
||||||
|
#define mips_nor(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,39)
|
||||||
|
#define mips_or(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,37)
|
||||||
|
#define mips_ori(c,dest,src1,uimm) mips_format_i(c,13,src1,dest,uimm)
|
||||||
|
#define mips_xor(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,38)
|
||||||
|
#define mips_xori(c,dest,src1,uimm) mips_format_i(c,14,src1,dest,uimm)
|
||||||
|
|
||||||
|
/* compares */
|
||||||
|
#define mips_slt(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,42)
|
||||||
|
#define mips_slti(c,dest,src1,imm) mips_format_i(c,10,src1,dest,imm)
|
||||||
|
#define mips_sltiu(c,dest,src1,imm) mips_format_i(c,11,src1,dest,imm)
|
||||||
|
#define mips_sltu(c,dest,src1,src2) mips_format_r(c,0,src1,src2,dest,0,43)
|
||||||
|
/* missing traps: teq, teqi, tge, tgei, tgeiu, tgeu, tlt, tlti, tltiu, tltu, tne, tnei, */
|
||||||
|
|
||||||
|
/* conditional branches */
|
||||||
|
#define mips_beq(c,src1,src2,offset) mips_format_i(c,4,src1,src2,offset)
|
||||||
|
#define mips_beql(c,src1,src2,offset) mips_format_i(c,20,src1,src2,offset)
|
||||||
|
#define mips_bgez(c,src1,offset) mips_format_i(c,1,src1,1,offset)
|
||||||
|
#define mips_bgezal(c,src1,offset) mips_format_i(c,1,src1,17,offset)
|
||||||
|
#define mips_bgezall(c,src1,offset) mips_format_i(c,1,src1,19,offset)
|
||||||
|
#define mips_bgezl(c,src1,offset) mips_format_i(c,1,src1,3,offset)
|
||||||
|
#define mips_bgtz(c,src1,offset) mips_format_i(c,7,src1,0,offset)
|
||||||
|
#define mips_bgtzl(c,src1,offset) mips_format_i(c,23,src1,0,offset)
|
||||||
|
#define mips_blez(c,src1,offset) mips_format_i(c,6,src1,0,offset)
|
||||||
|
#define mips_blezl(c,src1,offset) mips_format_i(c,22,src1,0,offset)
|
||||||
|
#define mips_bltz(c,src1,offset) mips_format_i(c,1,src1,0,offset)
|
||||||
|
#define mips_bltzal(c,src1,offset) mips_format_i(c,1,src1,16,offset)
|
||||||
|
#define mips_bltzall(c,src1,offset) mips_format_i(c,1,src1,18,offset)
|
||||||
|
#define mips_bltzl(c,src1,offset) mips_format_i(c,1,src1,2,offset)
|
||||||
|
#define mips_bne(c,src1,src2,offset) mips_format_i(c,5,src1,src2,offset)
|
||||||
|
#define mips_bnel(c,src1,src2,offset) mips_format_i(c,21,src1,src2,offset)
|
||||||
|
|
||||||
|
/* uncond branches and calls */
|
||||||
|
#define mips_jump(c,target) mips_format_j(c,2,target)
|
||||||
|
#define mips_jumpl(c,target) mips_format_j(c,3,target)
|
||||||
|
#define mips_jalr(c,src1,retreg) mips_format_r(c,0,src1,0,retreg,0,9)
|
||||||
|
#define mips_jr(c,src1) mips_emit32(c,((src1)<<21)|8)
|
||||||
|
|
||||||
|
/* loads and stores */
|
||||||
|
#define mips_lb(c,dest,base,offset) mips_format_i(c,32,base,dest,offset)
|
||||||
|
#define mips_lbu(c,dest,base,offset) mips_format_i(c,36,base,dest,offset)
|
||||||
|
#define mips_ld(c,dest,base,offset) mips_format_i(c,55,base,dest,offset)
|
||||||
|
#define mips_ldl(c,dest,base,offset) mips_format_i(c,26,base,dest,offset)
|
||||||
|
#define mips_ldr(c,dest,base,offset) mips_format_i(c,27,base,dest,offset)
|
||||||
|
#define mips_lh(c,dest,base,offset) mips_format_i(c,33,base,dest,offset)
|
||||||
|
#define mips_lhu(c,dest,base,offset) mips_format_i(c,37,base,dest,offset)
|
||||||
|
#define mips_ll(c,dest,base,offset) mips_format_i(c,48,base,dest,offset)
|
||||||
|
#define mips_lld(c,dest,base,offset) mips_format_i(c,52,base,dest,offset)
|
||||||
|
#define mips_lui(c,dest,base,uimm) mips_format_i(c,15,base,dest,uimm)
|
||||||
|
#define mips_lw(c,dest,base,offset) mips_format_i(c,35,base,dest,offset)
|
||||||
|
#define mips_lwl(c,dest,base,offset) mips_format_i(c,34,base,dest,offset)
|
||||||
|
#define mips_lwr(c,dest,base,offset) mips_format_i(c,38,base,dest,offset)
|
||||||
|
#define mips_lwu(c,dest,base,offset) mips_format_i(c,39,base,dest,offset)
|
||||||
|
|
||||||
|
#define mips_sb(c,src,base,offset) mips_format_i(c,40,base,src,offset)
|
||||||
|
#define mips_sc(c,src,base,offset) mips_format_i(c,56,base,src,offset)
|
||||||
|
#define mips_scd(c,src,base,offset) mips_format_i(c,60,base,src,offset)
|
||||||
|
#define mips_sd(c,src,base,offset) mips_format_i(c,63,base,src,offset)
|
||||||
|
#define mips_sdl(c,src,base,offset) mips_format_i(c,44,base,src,offset)
|
||||||
|
#define mips_sdr(c,src,base,offset) mips_format_i(c,45,base,src,offset)
|
||||||
|
#define mips_sh(c,src,base,offset) mips_format_i(c,41,base,src,offset)
|
||||||
|
#define mips_sw(c,src,base,offset) mips_format_i(c,43,base,src,offset)
|
||||||
|
#define mips_swl(c,src,base,offset) mips_format_i(c,50,base,src,offset)
|
||||||
|
#define mips_swr(c,src,base,offset) mips_format_i(c,54,base,src,offset)
|
||||||
|
|
||||||
|
/* misc and coprocessor ops */
|
||||||
|
#define mips_move(c,dest,src) mips_addu(c,dest,src,mips_zero)
|
||||||
|
#define mips_dmove(c,dest,src) mips_daddu(c,dest,src,mips_zero)
|
||||||
|
#define mips_nop(c) mips_or(c,mips_at,mips_at,0)
|
||||||
|
#define mips_break(c,code) mips_emit32(c, ((code)<<6)|13)
|
||||||
|
#define mips_mfhi(c,dest) mips_format_r(c,0,0,0,dest,0,16)
|
||||||
|
#define mips_mflo(c,dest) mips_format_r(c,0,0,0,dest,0,18)
|
||||||
|
#define mips_mthi(c,src) mips_format_r(c,0,src,0,0,0,17)
|
||||||
|
#define mips_mtlo(c,src) mips_format_r(c,0,src,0,0,0,19)
|
||||||
|
#define mips_movn(c,dest,src,test) mips_format_r(c,0,src,test,dest,0,11)
|
||||||
|
#define mips_movz(c,dest,src,test) mips_format_r(c,0,src,test,dest,0,10)
|
||||||
|
#define mips_pref(c,hint,base,offset) mips_format_i(c,51,base,hint,offset)
|
||||||
|
#define mips_prefidx(c,hint,base,idx) mips_format_r(c,19,base,idx,hint,0,15)
|
||||||
|
#define mips_sync(c,stype) mips_emit32(c, ((stype)<<6)|15)
|
||||||
|
#define mips_syscall(c,code) mips_emit32(c, ((code)<<6)|12)
|
||||||
|
|
||||||
|
#define mips_cop(c,cop,fun) mips_emit32(c, ((16|(cop))<<26)|(fun))
|
||||||
|
#define mips_ldc(c,cop,dest,base,offset) mips_format_i(c,(52|(cop)),base,dest,offset)
|
||||||
|
#define mips_lwc(c,cop,dest,base,offset) mips_format_i(c,(48|(cop)),base,dest,offset)
|
||||||
|
#define mips_sdc(c,cop,src,base,offset) mips_format_i(c,(60|(cop)),base,src,offset)
|
||||||
|
#define mips_swc(c,cop,src,base,offset) mips_format_i(c,(56|(cop)),base,src,offset)
|
||||||
|
#define mips_cfc1(c,dest,src) mips_format_r(c,17,2,dest,src,0,0)
|
||||||
|
#define mips_ctc1(c,dest,src) mips_format_r(c,17,6,dest,src,0,0)
|
||||||
|
|
||||||
|
/* fpu ops */
|
||||||
|
#define mips_fabss(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,5)
|
||||||
|
#define mips_fabsd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,5)
|
||||||
|
#define mips_fadds(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_SINGLE,src2,src1,dest,0)
|
||||||
|
#define mips_faddd(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_DOUBLE,src2,src1,dest,0)
|
||||||
|
#define mips_fdivs(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_SINGLE,src2,src1,dest,3)
|
||||||
|
#define mips_fdivd(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_DOUBLE,src2,src1,dest,3)
|
||||||
|
#define mips_fmuls(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_SINGLE,src2,src1,dest,2)
|
||||||
|
#define mips_fmuld(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_DOUBLE,src2,src1,dest,2)
|
||||||
|
#define mips_fnegs(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,7)
|
||||||
|
#define mips_fnegd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,7)
|
||||||
|
#define mips_fsqrts(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,4)
|
||||||
|
#define mips_fsqrtd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,4)
|
||||||
|
#define mips_fsubs(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_SINGLE,src2,src1,dest,1)
|
||||||
|
#define mips_fsubd(c,dest,src1,src2) mips_format_r(c,17,MIPS_FMT_DOUBLE,src2,src1,dest,1)
|
||||||
|
#define mips_madds(c,dest,src1,src2,srcadd) mips_format_r(c,19,srcadd,src2,src1,dest,32|MIPS_FMT_SINGLE)
|
||||||
|
#define mips_maddd(c,dest,src1,src2,srcadd) mips_format_r(c,19,srcadd,src2,src1,dest,32|MIPS_FMT_DOUBLE)
|
||||||
|
#define mips_nmadds(c,dest,src1,src2,srcadd) mips_format_r(c,19,srcadd,src2,src1,dest,48|MIPS_FMT_SINGLE)
|
||||||
|
#define mips_nmaddd(c,dest,src1,src2,srcadd) mips_format_r(c,19,srcadd,src2,src1,dest,48|MIPS_FMT_DOUBLE)
|
||||||
|
#define mips_msubs(c,dest,src1,src2,srcsub) mips_format_r(c,19,srcsub,src2,src1,dest,40|MIPS_FMT_SINGLE)
|
||||||
|
#define mips_msubd(c,dest,src1,src2,srcsub) mips_format_r(c,19,srcsub,src2,src1,dest,40|MIPS_FMT_DOUBLE)
|
||||||
|
#define mips_nmsubs(c,dest,src1,src2,srcsub) mips_format_r(c,19,srcsub,src2,src1,dest,56|MIPS_FMT_SINGLE)
|
||||||
|
#define mips_nmsubd(c,dest,src1,src2,srcsub) mips_format_r(c,19,srcsub,src2,src1,dest,56|MIPS_FMT_DOUBLE)
|
||||||
|
|
||||||
|
/* fp compare and branch */
|
||||||
|
#define mips_fcmps(c,cond,src1,src2) mips_format_r(c,17,MIPS_FMT_SINGLE,src2,src1,0,(3<<4)|(cond))
|
||||||
|
#define mips_fcmpd(c,cond,src1,src2) mips_format_r(c,17,MIPS_FMT_DOUBLE,src2,src1,0,(3<<4)|(cond))
|
||||||
|
#define mips_fbfalse(c,offset) mips_format_i(c,17,8,0,offset)
|
||||||
|
#define mips_fbfalsel(c,offset) mips_format_i(c,17,8,2,offset)
|
||||||
|
#define mips_fbtrue(c,offset) mips_format_i(c,17,8,1,offset)
|
||||||
|
#define mips_fbtruel(c,offset) mips_format_i(c,17,8,3,offset)
|
||||||
|
|
||||||
|
/* fp convert */
|
||||||
|
#define mips_ceills(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,10)
|
||||||
|
#define mips_ceilld(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,10)
|
||||||
|
#define mips_ceilws(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,14)
|
||||||
|
#define mips_ceilwd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,14)
|
||||||
|
#define mips_cvtds(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,33)
|
||||||
|
#define mips_cvtdw(c,dest,src) mips_format_r(c,17,MIPS_FMT_WORD,0,src,dest,33)
|
||||||
|
#define mips_cvtdl(c,dest,src) mips_format_r(c,17,MIPS_FMT_LONG,0,src,dest,33)
|
||||||
|
#define mips_cvtls(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,37)
|
||||||
|
#define mips_cvtld(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,37)
|
||||||
|
#define mips_cvtsd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,32)
|
||||||
|
#define mips_cvtsw(c,dest,src) mips_format_r(c,17,MIPS_FMT_WORD,0,src,dest,32)
|
||||||
|
#define mips_cvtsl(c,dest,src) mips_format_r(c,17,MIPS_FMT_LONG,0,src,dest,32)
|
||||||
|
#define mips_cvtws(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,36)
|
||||||
|
#define mips_cvtwd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,36)
|
||||||
|
#define mips_floorls(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,11)
|
||||||
|
#define mips_floorld(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,11)
|
||||||
|
#define mips_floorws(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,15)
|
||||||
|
#define mips_floorwd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,15)
|
||||||
|
#define mips_roundls(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,8)
|
||||||
|
#define mips_roundld(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,8)
|
||||||
|
#define mips_roundws(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,12)
|
||||||
|
#define mips_roundwd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,12)
|
||||||
|
#define mips_truncls(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,9)
|
||||||
|
#define mips_truncld(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,9)
|
||||||
|
#define mips_truncws(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,13)
|
||||||
|
#define mips_truncwd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,13)
|
||||||
|
|
||||||
|
/* fp moves, loads */
|
||||||
|
#define mips_fmovs(c,dest,src) mips_format_r(c,17,MIPS_FMT_SINGLE,0,src,dest,6)
|
||||||
|
#define mips_fmovd(c,dest,src) mips_format_r(c,17,MIPS_FMT_DOUBLE,0,src,dest,6)
|
||||||
|
#define mips_mfc1(c,dest,src) mips_format_r(c,17,0,dest,src,0,0)
|
||||||
|
#define mips_mtc1(c,dest,src) mips_format_r(c,17,4,src,dest,0,0)
|
||||||
|
#define mips_dmfc1(c,dest,src) mips_format_r(c,17,1,0,dest,src,0)
|
||||||
|
#define mips_dmtc1(c,dest,src) mips_format_r(c,17,1,0,src,dest,0)
|
||||||
|
#define mips_ldc1(c,dest,base,offset) mips_ldc(c,1,dest,base,offset)
|
||||||
|
#define mips_ldxc1(c,dest,base,idx) mips_format_r(c,19,base,idx,0,dest,1)
|
||||||
|
#define mips_lwc1(c,dest,base,offset) mips_lwc(c,1,dest,base,offset)
|
||||||
|
#define mips_lwxc1(c,dest,base,idx) mips_format_r(c,19,base,idx,0,dest,0)
|
||||||
|
#define mips_sdc1(c,src,base,offset) mips_sdc(c,1,src,base,offset)
|
||||||
|
#define mips_sdxc1(c,src,base,idx) mips_format_r(c,19,base,idx,src,0,9)
|
||||||
|
#define mips_swc1(c,src,base,offset) mips_swc(c,1,src,base,offset)
|
||||||
|
#define mips_swxc1(c,src,base,idx) mips_format_r(c,19,base,idx,src,0,8)
|
||||||
|
|
||||||
|
#endif /* __MIPS_CODEGEN_H__ */
|
||||||
|
|
||||||
159
src/arch/mips/test.c
Normal file
159
src/arch/mips/test.c
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
#include "config.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define NO_MIPS_JIT_DEBUG
|
||||||
|
|
||||||
|
#include "mips-codegen.h"
|
||||||
|
#include "mono/metadata/class.h"
|
||||||
|
|
||||||
|
/* don't run the resulting program, it will destroy your computer,
|
||||||
|
* just objdump -d it to inspect we generated the correct assembler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main (int argc, char *argv[]) {
|
||||||
|
guint32 *code, * p;
|
||||||
|
|
||||||
|
code = p = (guint32 *) malloc (sizeof (guint32) * 1024);
|
||||||
|
|
||||||
|
mips_add (p, 3, 4, 5);
|
||||||
|
mips_addi (p, 3, 4, 5);
|
||||||
|
mips_addu (p, 3, 4, 5);
|
||||||
|
mips_addiu (p, 3, 4, 5);
|
||||||
|
mips_sub (p, 3, 4, 5);
|
||||||
|
mips_subu (p, 3, 4, 5);
|
||||||
|
mips_dadd (p, 3, 4, 5);
|
||||||
|
mips_daddi (p, 3, 4, 5);
|
||||||
|
mips_daddu (p, 3, 4, 5);
|
||||||
|
mips_daddiu (p, 3, 4, 5);
|
||||||
|
mips_dsub (p, 3, 4, 5);
|
||||||
|
mips_dsubu (p, 3, 4, 5);
|
||||||
|
|
||||||
|
mips_mult (p, 6, 7);
|
||||||
|
mips_multu (p, 6, 7);
|
||||||
|
mips_div (p, 6, 7);
|
||||||
|
mips_divu (p, 6, 7);
|
||||||
|
mips_dmult (p, 6, 7);
|
||||||
|
mips_dmultu (p, 6, 7);
|
||||||
|
mips_ddiv (p, 6, 7);
|
||||||
|
mips_ddivu (p, 6, 7);
|
||||||
|
|
||||||
|
mips_sll (p, 3, 4, 5);
|
||||||
|
mips_sllv (p, 3, 4, 5);
|
||||||
|
mips_sra (p, 3, 4, 5);
|
||||||
|
mips_srav (p, 3, 4, 5);
|
||||||
|
mips_srl (p, 3, 4, 5);
|
||||||
|
mips_srlv (p, 3, 4, 5);
|
||||||
|
mips_dsll (p, 3, 4, 5);
|
||||||
|
mips_dsll32 (p, 3, 4, 5);
|
||||||
|
mips_dsllv (p, 3, 4, 5);
|
||||||
|
mips_dsra (p, 3, 4, 5);
|
||||||
|
mips_dsra32 (p, 3, 4, 5);
|
||||||
|
mips_dsrav (p, 3, 4, 5);
|
||||||
|
mips_dsrl (p, 3, 4, 5);
|
||||||
|
mips_dsrl32 (p, 3, 4, 5);
|
||||||
|
mips_dsrlv (p, 3, 4, 5);
|
||||||
|
|
||||||
|
mips_and (p, 8, 9, 10);
|
||||||
|
mips_andi (p, 8, 9, 10);
|
||||||
|
mips_nor (p, 8, 9, 10);
|
||||||
|
mips_or (p, 8, 9, 10);
|
||||||
|
mips_ori (p, 8, 9, 10);
|
||||||
|
mips_xor (p, 8, 9, 10);
|
||||||
|
mips_xori (p, 8, 9, 10);
|
||||||
|
|
||||||
|
mips_slt (p, 8, 9, 10);
|
||||||
|
mips_slti (p, 8, 9, 10);
|
||||||
|
mips_sltu (p, 8, 9, 10);
|
||||||
|
mips_sltiu (p, 8, 9, 10);
|
||||||
|
|
||||||
|
mips_beq (p, 8, 9, 0xff1f);
|
||||||
|
mips_beql (p, 8, 9, 0xff1f);
|
||||||
|
mips_bne (p, 8, 9, 0xff1f);
|
||||||
|
mips_bnel (p, 8, 9, 0xff1f);
|
||||||
|
mips_bgez (p, 11, 0xff1f);
|
||||||
|
mips_bgezal (p, 11, 0xff1f);
|
||||||
|
mips_bgezall (p, 11, 0xff1f);
|
||||||
|
mips_bgezl (p, 11, 0xff1f);
|
||||||
|
mips_bgtz (p, 11, 0xff1f);
|
||||||
|
mips_bgtzl (p, 11, 0xff1f);
|
||||||
|
mips_blez (p, 11, 0xff1f);
|
||||||
|
mips_blezl (p, 11, 0xff1f);
|
||||||
|
mips_bltz (p, 11, 0xff1f);
|
||||||
|
mips_bltzal (p, 11, 0xff1f);
|
||||||
|
mips_bltzall (p, 11, 0xff1f);
|
||||||
|
mips_bltzl (p, 11, 0xff1f);
|
||||||
|
|
||||||
|
mips_jump (p, 0xff1f);
|
||||||
|
mips_jumpl (p, 0xff1f);
|
||||||
|
mips_jalr (p, 12, mips_ra);
|
||||||
|
mips_jr (p, 12);
|
||||||
|
|
||||||
|
mips_lb (p, 13, 14, 128);
|
||||||
|
mips_lbu (p, 13, 14, 128);
|
||||||
|
mips_ld (p, 13, 14, 128);
|
||||||
|
mips_ldl (p, 13, 14, 128);
|
||||||
|
mips_ldr (p, 13, 14, 128);
|
||||||
|
mips_lh (p, 13, 14, 128);
|
||||||
|
mips_lhu (p, 13, 14, 128);
|
||||||
|
mips_ll (p, 13, 14, 128);
|
||||||
|
mips_lld (p, 13, 14, 128);
|
||||||
|
mips_lui (p, 13, 14, 128);
|
||||||
|
mips_lw (p, 13, 14, 128);
|
||||||
|
mips_lwl (p, 13, 14, 128);
|
||||||
|
mips_lwr (p, 13, 14, 128);
|
||||||
|
mips_lwu (p, 13, 14, 128);
|
||||||
|
mips_sb (p, 13, 14, 128);
|
||||||
|
mips_sc (p, 13, 14, 128);
|
||||||
|
mips_scd (p, 13, 14, 128);
|
||||||
|
mips_sd (p, 13, 14, 128);
|
||||||
|
mips_sdl (p, 13, 14, 128);
|
||||||
|
mips_sdr (p, 13, 14, 128);
|
||||||
|
mips_sh (p, 13, 14, 128);
|
||||||
|
mips_sw (p, 13, 14, 128);
|
||||||
|
mips_swl (p, 13, 14, 128);
|
||||||
|
mips_swr (p, 13, 14, 128);
|
||||||
|
|
||||||
|
mips_move (p, 15, 16);
|
||||||
|
mips_nop (p);
|
||||||
|
mips_break (p, 0);
|
||||||
|
mips_sync (p, 0);
|
||||||
|
mips_mfhi (p, 17);
|
||||||
|
mips_mflo (p, 17);
|
||||||
|
mips_mthi (p, 17);
|
||||||
|
mips_mtlo (p, 17);
|
||||||
|
|
||||||
|
mips_fabsd (p, 16, 18);
|
||||||
|
mips_fnegd (p, 16, 18);
|
||||||
|
mips_fsqrtd (p, 16, 18);
|
||||||
|
mips_faddd (p, 16, 18, 20);
|
||||||
|
mips_fdivd (p, 16, 18, 20);
|
||||||
|
mips_fmuld (p, 16, 18, 20);
|
||||||
|
mips_fsubd (p, 16, 18, 20);
|
||||||
|
|
||||||
|
mips_fcmpd (p, MIPS_FPU_EQ, 18, 20);
|
||||||
|
mips_fbfalse (p, 0xff1f);
|
||||||
|
mips_fbfalsel (p, 0xff1f);
|
||||||
|
mips_fbtrue (p, 0xff1f);
|
||||||
|
mips_fbtruel (p, 0xff1f);
|
||||||
|
|
||||||
|
mips_ceilwd (p, 20, 22);
|
||||||
|
mips_ceilld (p, 20, 22);
|
||||||
|
mips_floorwd (p, 20, 22);
|
||||||
|
mips_floorld (p, 20, 22);
|
||||||
|
mips_roundwd (p, 20, 22);
|
||||||
|
mips_roundld (p, 20, 22);
|
||||||
|
mips_truncwd (p, 20, 22);
|
||||||
|
mips_truncld (p, 20, 22);
|
||||||
|
mips_cvtdw (p, 20, 22);
|
||||||
|
mips_cvtds (p, 20, 22);
|
||||||
|
mips_cvtdl (p, 20, 22);
|
||||||
|
mips_cvtld (p, 20, 22);
|
||||||
|
mips_cvtsd (p, 20, 22);
|
||||||
|
mips_cvtwd (p, 20, 22);
|
||||||
|
|
||||||
|
mips_fmovd (p, 20, 22);
|
||||||
|
printf ("size: %d\n", p - code);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
7
src/arch/ppc/.gitignore
vendored
Normal file
7
src/arch/ppc/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/.libs
|
||||||
|
/.deps
|
||||||
|
/*.la
|
||||||
|
/*.lo
|
||||||
|
/test
|
||||||
1
src/arch/ppc/Makefile.am
Normal file
1
src/arch/ppc/Makefile.am
Normal file
@@ -0,0 +1 @@
|
|||||||
|
EXTRA_DIST = ppc-codegen.h
|
||||||
953
src/arch/ppc/ppc-codegen.h
Normal file
953
src/arch/ppc/ppc-codegen.h
Normal file
@@ -0,0 +1,953 @@
|
|||||||
|
/*
|
||||||
|
Authors:
|
||||||
|
Radek Doulik
|
||||||
|
Christopher Taylor <ct_AT_clemson_DOT_edu>
|
||||||
|
Andreas Faerber <andreas.faerber@web.de>
|
||||||
|
|
||||||
|
Copyright (C) 2001 Radek Doulik
|
||||||
|
Copyright (C) 2007-2008 Andreas Faerber
|
||||||
|
|
||||||
|
for testing do the following: ./test | as -o test.o
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MONO_PPC_CODEGEN_H__
|
||||||
|
#define __MONO_PPC_CODEGEN_H__
|
||||||
|
#include <glib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ppc_r0 = 0,
|
||||||
|
ppc_r1,
|
||||||
|
ppc_sp = ppc_r1,
|
||||||
|
ppc_r2,
|
||||||
|
ppc_r3,
|
||||||
|
ppc_r4,
|
||||||
|
ppc_r5,
|
||||||
|
ppc_r6,
|
||||||
|
ppc_r7,
|
||||||
|
ppc_r8,
|
||||||
|
ppc_r9,
|
||||||
|
ppc_r10,
|
||||||
|
ppc_r11,
|
||||||
|
ppc_r12,
|
||||||
|
ppc_r13,
|
||||||
|
ppc_r14,
|
||||||
|
ppc_r15,
|
||||||
|
ppc_r16,
|
||||||
|
ppc_r17,
|
||||||
|
ppc_r18,
|
||||||
|
ppc_r19,
|
||||||
|
ppc_r20,
|
||||||
|
ppc_r21,
|
||||||
|
ppc_r22,
|
||||||
|
ppc_r23,
|
||||||
|
ppc_r24,
|
||||||
|
ppc_r25,
|
||||||
|
ppc_r26,
|
||||||
|
ppc_r27,
|
||||||
|
ppc_r28,
|
||||||
|
ppc_r29,
|
||||||
|
ppc_r30,
|
||||||
|
ppc_r31
|
||||||
|
} PPCIntRegister;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ppc_f0 = 0,
|
||||||
|
ppc_f1,
|
||||||
|
ppc_f2,
|
||||||
|
ppc_f3,
|
||||||
|
ppc_f4,
|
||||||
|
ppc_f5,
|
||||||
|
ppc_f6,
|
||||||
|
ppc_f7,
|
||||||
|
ppc_f8,
|
||||||
|
ppc_f9,
|
||||||
|
ppc_f10,
|
||||||
|
ppc_f11,
|
||||||
|
ppc_f12,
|
||||||
|
ppc_f13,
|
||||||
|
ppc_f14,
|
||||||
|
ppc_f15,
|
||||||
|
ppc_f16,
|
||||||
|
ppc_f17,
|
||||||
|
ppc_f18,
|
||||||
|
ppc_f19,
|
||||||
|
ppc_f20,
|
||||||
|
ppc_f21,
|
||||||
|
ppc_f22,
|
||||||
|
ppc_f23,
|
||||||
|
ppc_f24,
|
||||||
|
ppc_f25,
|
||||||
|
ppc_f26,
|
||||||
|
ppc_f27,
|
||||||
|
ppc_f28,
|
||||||
|
ppc_f29,
|
||||||
|
ppc_f30,
|
||||||
|
ppc_f31
|
||||||
|
} PPCFloatRegister;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ppc_lr = 256,
|
||||||
|
ppc_ctr = 256 + 32,
|
||||||
|
ppc_xer = 32
|
||||||
|
} PPCSpecialRegister;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* B0 operand for branches */
|
||||||
|
PPC_BR_DEC_CTR_NONZERO_FALSE = 0,
|
||||||
|
PPC_BR_LIKELY = 1, /* can be or'ed with the conditional variants */
|
||||||
|
PPC_BR_DEC_CTR_ZERO_FALSE = 2,
|
||||||
|
PPC_BR_FALSE = 4,
|
||||||
|
PPC_BR_DEC_CTR_NONZERO_TRUE = 8,
|
||||||
|
PPC_BR_DEC_CTR_ZERO_TRUE = 10,
|
||||||
|
PPC_BR_TRUE = 12,
|
||||||
|
PPC_BR_DEC_CTR_NONZERO = 16,
|
||||||
|
PPC_BR_DEC_CTR_ZERO = 18,
|
||||||
|
PPC_BR_ALWAYS = 20,
|
||||||
|
/* B1 operand for branches */
|
||||||
|
PPC_BR_LT = 0,
|
||||||
|
PPC_BR_GT = 1,
|
||||||
|
PPC_BR_EQ = 2,
|
||||||
|
PPC_BR_SO = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PPC_TRAP_LT = 1,
|
||||||
|
PPC_TRAP_GT = 2,
|
||||||
|
PPC_TRAP_EQ = 4,
|
||||||
|
PPC_TRAP_LT_UN = 8,
|
||||||
|
PPC_TRAP_GT_UN = 16,
|
||||||
|
PPC_TRAP_LE = 1 + PPC_TRAP_EQ,
|
||||||
|
PPC_TRAP_GE = 2 + PPC_TRAP_EQ,
|
||||||
|
PPC_TRAP_LE_UN = 8 + PPC_TRAP_EQ,
|
||||||
|
PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ppc_emit32(c,x) do { *((guint32 *) (c)) = GUINT32_TO_BE (x); (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0)
|
||||||
|
|
||||||
|
#define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1))
|
||||||
|
#define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L)
|
||||||
|
#define ppc_ha(val) (((val >> 16) + ((val & 0x8000) ? 1 : 0)) & 0xffff)
|
||||||
|
|
||||||
|
#define ppc_load32(c,D,v) G_STMT_START { \
|
||||||
|
ppc_lis ((c), (D), (guint32)(v) >> 16); \
|
||||||
|
ppc_ori ((c), (D), (D), (guint32)(v) & 0xffff); \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
/* Macros to load/store pointer sized quantities */
|
||||||
|
|
||||||
|
#if defined(__mono_ppc64__) && !defined(__mono_ilp32__)
|
||||||
|
|
||||||
|
#define ppc_ldptr(c,D,d,A) ppc_ld ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldptr_update(c,D,d,A) ppc_ldu ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldptr_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B))
|
||||||
|
#define ppc_ldptr_update_indexed(c,D,A,B) ppc_ldux ((c), (D), (A), (B))
|
||||||
|
|
||||||
|
#define ppc_stptr(c,S,d,A) ppc_std ((c), (S), (d), (A))
|
||||||
|
#define ppc_stptr_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A))
|
||||||
|
#define ppc_stptr_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B))
|
||||||
|
#define ppc_stptr_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Same as ppc32 */
|
||||||
|
#define ppc_ldptr(c,D,d,A) ppc_lwz ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldptr_update(c,D,d,A) ppc_lwzu ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldptr_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B))
|
||||||
|
#define ppc_ldptr_update_indexed(c,D,A,B) ppc_lwzux ((c), (D), (A), (B))
|
||||||
|
|
||||||
|
#define ppc_stptr(c,S,d,A) ppc_stw ((c), (S), (d), (A))
|
||||||
|
#define ppc_stptr_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A))
|
||||||
|
#define ppc_stptr_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B))
|
||||||
|
#define ppc_stptr_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Macros to load pointer sized immediates */
|
||||||
|
#define ppc_load_ptr(c,D,v) ppc_load ((c),(D),(gsize)(v))
|
||||||
|
#define ppc_load_ptr_sequence(c,D,v) ppc_load_sequence ((c),(D),(gsize)(v))
|
||||||
|
|
||||||
|
/* Macros to load/store regsize quantities */
|
||||||
|
|
||||||
|
#ifdef __mono_ppc64__
|
||||||
|
#define ppc_ldr(c,D,d,A) ppc_ld ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldr_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B))
|
||||||
|
#define ppc_str(c,S,d,A) ppc_std ((c), (S), (d), (A))
|
||||||
|
#define ppc_str_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A))
|
||||||
|
#define ppc_str_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B))
|
||||||
|
#define ppc_str_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B))
|
||||||
|
#else
|
||||||
|
#define ppc_ldr(c,D,d,A) ppc_lwz ((c), (D), (d), (A))
|
||||||
|
#define ppc_ldr_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B))
|
||||||
|
#define ppc_str(c,S,d,A) ppc_stw ((c), (S), (d), (A))
|
||||||
|
#define ppc_str_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A))
|
||||||
|
#define ppc_str_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B))
|
||||||
|
#define ppc_str_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ppc_str_multiple(c,S,d,A) ppc_store_multiple_regs((c),(S),(d),(A))
|
||||||
|
#define ppc_ldr_multiple(c,D,d,A) ppc_load_multiple_regs((c),(D),(d),(A))
|
||||||
|
|
||||||
|
/* PPC32 macros */
|
||||||
|
|
||||||
|
#ifndef __mono_ppc64__
|
||||||
|
|
||||||
|
#define ppc_load_sequence(c,D,v) ppc_load32 ((c), (D), (guint32)(v))
|
||||||
|
|
||||||
|
#define PPC_LOAD_SEQUENCE_LENGTH 8
|
||||||
|
|
||||||
|
#define ppc_load(c,D,v) G_STMT_START { \
|
||||||
|
if (ppc_is_imm16 ((guint32)(v))) { \
|
||||||
|
ppc_li ((c), (D), (guint16)(guint32)(v)); \
|
||||||
|
} else { \
|
||||||
|
ppc_load32 ((c), (D), (guint32)(v)); \
|
||||||
|
} \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_load_func(c,D,V) ppc_load_sequence ((c), (D), (V))
|
||||||
|
|
||||||
|
#define ppc_load_multiple_regs(c,D,d,A) ppc_lmw ((c), (D), (d), (A))
|
||||||
|
|
||||||
|
#define ppc_store_multiple_regs(c,S,d,A) ppc_stmw ((c), (S), (d), (A))
|
||||||
|
|
||||||
|
#define ppc_compare(c,cfrD,A,B) ppc_cmp((c), (cfrD), 0, (A), (B))
|
||||||
|
#define ppc_compare_reg_imm(c,cfrD,A,B) ppc_cmpi((c), (cfrD), 0, (A), (B))
|
||||||
|
#define ppc_compare_log(c,cfrD,A,B) ppc_cmpl((c), (cfrD), 0, (A), (B))
|
||||||
|
|
||||||
|
#define ppc_shift_left(c,A,S,B) ppc_slw((c), (S), (A), (B))
|
||||||
|
#define ppc_shift_left_imm(c,A,S,n) ppc_slwi((c), (A), (S), (n))
|
||||||
|
|
||||||
|
#define ppc_shift_right_imm(c,A,S,B) ppc_srwi((c), (A), (S), (B))
|
||||||
|
#define ppc_shift_right_arith_imm(c,A,S,B) ppc_srawi((c), (A), (S), (B))
|
||||||
|
|
||||||
|
#define ppc_multiply(c,D,A,B) ppc_mullw((c), (D), (A), (B))
|
||||||
|
|
||||||
|
#define ppc_clear_right_imm(c,A,S,n) ppc_clrrwi((c), (A), (S), (n))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ppc_opcode(c) ((c) >> 26)
|
||||||
|
#define ppc_split_5_1_1(x) (((x) >> 5) & 0x1)
|
||||||
|
#define ppc_split_5_1_5(x) ((x) & 0x1F)
|
||||||
|
#define ppc_split_5_1(x) ((ppc_split_5_1_5(x) << 1) | ppc_split_5_1_1(x))
|
||||||
|
|
||||||
|
#define ppc_break(c) ppc_tw((c),31,0,0)
|
||||||
|
#define ppc_addi(c,D,A,i) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i))
|
||||||
|
#define ppc_addis(c,D,A,i) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i))
|
||||||
|
#define ppc_li(c,D,v) ppc_addi (c, D, 0, (guint16)(v))
|
||||||
|
#define ppc_lis(c,D,v) ppc_addis (c, D, 0, (guint16)(v))
|
||||||
|
#define ppc_lwz(c,D,d,A) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_lhz(c,D,d,A) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_lbz(c,D,d,A) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_stw(c,S,d,A) ppc_emit32 (c, (36 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_sth(c,S,d,A) ppc_emit32 (c, (44 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_stb(c,S,d,A) ppc_emit32 (c, (38 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_stwu(c,s,d,A) ppc_emit32 (c, (37 << 26) | ((s) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_or(c,a,s,b) ppc_emit32 (c, (31 << 26) | ((s) << 21) | ((a) << 16) | ((b) << 11) | 888)
|
||||||
|
#define ppc_mr(c,a,s) ppc_or (c, a, s, s)
|
||||||
|
#define ppc_ori(c,S,A,ui) ppc_emit32 (c, (24 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(ui))
|
||||||
|
#define ppc_nop(c) ppc_ori (c, 0, 0, 0)
|
||||||
|
#define ppc_mfspr(c,D,spr) ppc_emit32 (c, (31 << 26) | ((D) << 21) | ((spr) << 11) | (339 << 1))
|
||||||
|
#define ppc_mflr(c,D) ppc_mfspr (c, D, ppc_lr)
|
||||||
|
#define ppc_mtspr(c,spr,S) ppc_emit32 (c, (31 << 26) | ((S) << 21) | ((spr) << 11) | (467 << 1))
|
||||||
|
#define ppc_mtlr(c,S) ppc_mtspr (c, ppc_lr, S)
|
||||||
|
#define ppc_mtctr(c,S) ppc_mtspr (c, ppc_ctr, S)
|
||||||
|
#define ppc_mtxer(c,S) ppc_mtspr (c, ppc_xer, S)
|
||||||
|
|
||||||
|
#define ppc_b(c,li) ppc_emit32 (c, (18 << 26) | ((li) << 2))
|
||||||
|
#define ppc_bl(c,li) ppc_emit32 (c, (18 << 26) | ((li) << 2) | 1)
|
||||||
|
#define ppc_ba(c,li) ppc_emit32 (c, (18 << 26) | ((li) << 2) | 2)
|
||||||
|
#define ppc_bla(c,li) ppc_emit32 (c, (18 << 26) | ((li) << 2) | 3)
|
||||||
|
#define ppc_blrl(c) ppc_emit32 (c, 0x4e800021)
|
||||||
|
#define ppc_blr(c) ppc_emit32 (c, 0x4e800020)
|
||||||
|
|
||||||
|
#define ppc_lfs(c,D,d,A) ppc_emit32 (c, (48 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_lfd(c,D,d,A) ppc_emit32 (c, (50 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
|
||||||
|
#define ppc_stfs(c,S,d,a) ppc_emit32 (c, (52 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
|
||||||
|
#define ppc_stfd(c,S,d,a) ppc_emit32 (c, (54 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
The macros below were tapped out by Christopher Taylor <ct_AT_clemson_DOT_edu>
|
||||||
|
from 18 November 2002 to 19 December 2002.
|
||||||
|
|
||||||
|
Special thanks to rodo, lupus, dietmar, miguel, and duncan for patience,
|
||||||
|
and motivation.
|
||||||
|
|
||||||
|
The macros found in this file are based on the assembler instructions found
|
||||||
|
in Motorola and Digital DNA's:
|
||||||
|
|
||||||
|
"Programming Enviornments Manual For 32-bit Implementations of the PowerPC Architecture"
|
||||||
|
|
||||||
|
MPCFPE32B/AD
|
||||||
|
12/2001
|
||||||
|
REV2
|
||||||
|
|
||||||
|
see pages 326 - 524 for detailed information regarding each instruction
|
||||||
|
|
||||||
|
Also see the "Ximian Copyright Agreement, 2002" for more information regarding
|
||||||
|
my and Ximian's copyright to this code. ;)
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#define ppc_addx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (266 << 1) | Rc)
|
||||||
|
#define ppc_add(c,D,A,B) ppc_addx(c,D,A,B,0,0)
|
||||||
|
#define ppc_addd(c,D,A,B) ppc_addx(c,D,A,B,0,1)
|
||||||
|
#define ppc_addo(c,D,A,B) ppc_addx(c,D,A,B,1,0)
|
||||||
|
#define ppc_addod(c,D,A,B) ppc_addx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_addcx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (10 << 1) | Rc)
|
||||||
|
#define ppc_addc(c,D,A,B) ppc_addcx(c,D,A,B,0,0)
|
||||||
|
#define ppc_addcd(c,D,A,B) ppc_addcx(c,D,A,B,0,1)
|
||||||
|
#define ppc_addco(c,D,A,B) ppc_addcx(c,D,A,B,1,0)
|
||||||
|
#define ppc_addcod(c,D,A,B) ppc_addcx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_addex(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (138 << 1) | Rc)
|
||||||
|
#define ppc_adde(c,D,A,B) ppc_addex(c,D,A,B,0,0)
|
||||||
|
#define ppc_added(c,D,A,B) ppc_addex(c,D,A,B,0,1)
|
||||||
|
#define ppc_addeo(c,D,A,B) ppc_addex(c,D,A,B,1,0)
|
||||||
|
#define ppc_addeod(c,D,A,B) ppc_addex(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_addic(c,D,A,i) ppc_emit32(c, (12 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i))
|
||||||
|
#define ppc_addicd(c,D,A,i) ppc_emit32(c, (13 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(i))
|
||||||
|
|
||||||
|
#define ppc_addmex(c,D,A,OE,RC) ppc_emit32(c, (31 << 26) | ((D) << 21 ) | ((A) << 16) | (0 << 11) | ((OE) << 10) | (234 << 1) | RC)
|
||||||
|
#define ppc_addme(c,D,A) ppc_addmex(c,D,A,0,0)
|
||||||
|
#define ppc_addmed(c,D,A) ppc_addmex(c,D,A,0,1)
|
||||||
|
#define ppc_addmeo(c,D,A) ppc_addmex(c,D,A,1,0)
|
||||||
|
#define ppc_addmeod(c,D,A) ppc_addmex(c,D,A,1,1)
|
||||||
|
|
||||||
|
#define ppc_addzex(c,D,A,OE,RC) ppc_emit32(c, (31 << 26) | ((D) << 21 ) | ((A) << 16) | (0 << 11) | ((OE) << 10) | (202 << 1) | RC)
|
||||||
|
#define ppc_addze(c,D,A) ppc_addzex(c,D,A,0,0)
|
||||||
|
#define ppc_addzed(c,D,A) ppc_addzex(c,D,A,0,1)
|
||||||
|
#define ppc_addzeo(c,D,A) ppc_addzex(c,D,A,1,0)
|
||||||
|
#define ppc_addzeod(c,D,A) ppc_addzex(c,D,A,1,1)
|
||||||
|
|
||||||
|
#define ppc_andx(c,S,A,B,RC) ppc_emit32(c, (31 << 26) | ((S) << 21 ) | ((A) << 16) | ((B) << 11) | (28 << 1) | RC)
|
||||||
|
#define ppc_and(c,S,A,B) ppc_andx(c,S,A,B,0)
|
||||||
|
#define ppc_andd(c,S,A,B) ppc_andx(c,S,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_andcx(c,S,A,B,RC) ppc_emit32(c, (31 << 26) | ((S) << 21 ) | ((A) << 16) | ((B) << 11) | (60 << 1) | RC)
|
||||||
|
#define ppc_andc(c,S,A,B) ppc_andcx(c,S,A,B,0)
|
||||||
|
#define ppc_andcd(c,S,A,B) ppc_andcx(c,S,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_andid(c,S,A,ui) ppc_emit32(c, (28 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui)))
|
||||||
|
#define ppc_andisd(c,S,A,ui) ppc_emit32(c, (29 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui)))
|
||||||
|
|
||||||
|
#define ppc_bcx(c,BO,BI,BD,AA,LK) ppc_emit32(c, (16 << 26) | (BO << 21 )| (BI << 16) | (BD << 2) | ((AA) << 1) | LK)
|
||||||
|
#define ppc_bc(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,0)
|
||||||
|
#define ppc_bca(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,1,0)
|
||||||
|
#define ppc_bcl(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,1)
|
||||||
|
#define ppc_bcla(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,1,1)
|
||||||
|
|
||||||
|
#define ppc_bcctrx(c,BO,BI,LK) ppc_emit32(c, (19 << 26) | (BO << 21 )| (BI << 16) | (0 << 11) | (528 << 1) | LK)
|
||||||
|
#define ppc_bcctr(c,BO,BI) ppc_bcctrx(c,BO,BI,0)
|
||||||
|
#define ppc_bcctrl(c,BO,BI) ppc_bcctrx(c,BO,BI,1)
|
||||||
|
|
||||||
|
#define ppc_bnectrp(c,BO,BI) ppc_bcctr(c,BO,BI)
|
||||||
|
#define ppc_bnectrlp(c,BO,BI) ppc_bcctr(c,BO,BI)
|
||||||
|
|
||||||
|
#define ppc_bclrx(c,BO,BI,BH,LK) ppc_emit32(c, (19 << 26) | ((BO) << 21 )| ((BI) << 16) | (0 << 13) | ((BH) << 11) | (16 << 1) | (LK))
|
||||||
|
#define ppc_bclr(c,BO,BI,BH) ppc_bclrx(c,BO,BI,BH,0)
|
||||||
|
#define ppc_bclrl(c,BO,BI,BH) ppc_bclrx(c,BO,BI,BH,1)
|
||||||
|
|
||||||
|
#define ppc_bnelrp(c,BO,BI) ppc_bclr(c,BO,BI,0)
|
||||||
|
#define ppc_bnelrlp(c,BO,BI) ppc_bclr(c,BO,BI,0)
|
||||||
|
|
||||||
|
#define ppc_cmp(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | ((cfrD) << 23) | (0 << 22) | ((L) << 21) | ((A) << 16) | ((B) << 11) | (0 << 1) | 0)
|
||||||
|
#define ppc_cmpi(c,cfrD,L,A,B) ppc_emit32(c, (11 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
|
||||||
|
#define ppc_cmpl(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | ((cfrD) << 23) | (0 << 22) | ((L) << 21) | ((A) << 16) | ((B) << 11) | (32 << 1) | 0)
|
||||||
|
#define ppc_cmpli(c,cfrD,L,A,B) ppc_emit32(c, (10 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
|
||||||
|
#define ppc_cmpw(c,cfrD,A,B) ppc_cmp(c, (cfrD), 0, (A), (B))
|
||||||
|
|
||||||
|
#define ppc_cntlzwx(c,S,A,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (26 << 1) | Rc)
|
||||||
|
#define ppc_cntlzw(c,S,A) ppc_cntlzwx(c,S,A,0)
|
||||||
|
#define ppc_cntlzwd(c,S,A) ppc_cntlzwx(c,S,A,1)
|
||||||
|
|
||||||
|
#define ppc_crand(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (257 << 1) | 0)
|
||||||
|
#define ppc_crandc(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (129 << 1) | 0)
|
||||||
|
#define ppc_creqv(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (289 << 1) | 0)
|
||||||
|
#define ppc_crnand(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (225 << 1) | 0)
|
||||||
|
#define ppc_crnor(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (33 << 1) | 0)
|
||||||
|
#define ppc_cror(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (449 << 1) | 0)
|
||||||
|
#define ppc_crorc(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (417 << 1) | 0)
|
||||||
|
#define ppc_crxor(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (193 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_dcba(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (758 << 1) | 0)
|
||||||
|
#define ppc_dcbf(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (86 << 1) | 0)
|
||||||
|
#define ppc_dcbi(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (470 << 1) | 0)
|
||||||
|
#define ppc_dcbst(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (54 << 1) | 0)
|
||||||
|
#define ppc_dcbt(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (278 << 1) | 0)
|
||||||
|
#define ppc_dcbtst(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (246 << 1) | 0)
|
||||||
|
#define ppc_dcbz(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (1014 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_divwx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (491 << 1) | Rc)
|
||||||
|
#define ppc_divw(c,D,A,B) ppc_divwx(c,D,A,B,0,0)
|
||||||
|
#define ppc_divwd(c,D,A,B) ppc_divwx(c,D,A,B,0,1)
|
||||||
|
#define ppc_divwo(c,D,A,B) ppc_divwx(c,D,A,B,1,0)
|
||||||
|
#define ppc_divwod(c,D,A,B) ppc_divwx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_divwux(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (459 << 1) | Rc)
|
||||||
|
#define ppc_divwu(c,D,A,B) ppc_divwux(c,D,A,B,0,0)
|
||||||
|
#define ppc_divwud(c,D,A,B) ppc_divwux(c,D,A,B,0,1)
|
||||||
|
#define ppc_divwuo(c,D,A,B) ppc_divwux(c,D,A,B,1,0)
|
||||||
|
#define ppc_divwuod(c,D,A,B) ppc_divwux(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_eciwx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (310 << 1) | 0)
|
||||||
|
#define ppc_ecowx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (438 << 1) | 0)
|
||||||
|
#define ppc_eieio(c) ppc_emit32(c, (31 << 26) | (0 << 21) | (0 << 16) | (0 << 11) | (854 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_eqvx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (284 << 1) | Rc)
|
||||||
|
#define ppc_eqv(c,A,S,B) ppc_eqvx(c,A,S,B,0)
|
||||||
|
#define ppc_eqvd(c,A,S,B) ppc_eqvx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_extsbx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (954 << 1) | Rc)
|
||||||
|
#define ppc_extsb(c,A,S) ppc_extsbx(c,A,S,0)
|
||||||
|
#define ppc_extsbd(c,A,S) ppc_extsbx(c,A,S,1)
|
||||||
|
|
||||||
|
#define ppc_extshx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (922 << 1) | Rc)
|
||||||
|
#define ppc_extsh(c,A,S) ppc_extshx(c,A,S,0)
|
||||||
|
#define ppc_extshd(c,A,S) ppc_extshx(c,A,S,1)
|
||||||
|
|
||||||
|
#define ppc_fabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (264 << 1) | Rc)
|
||||||
|
#define ppc_fabs(c,D,B) ppc_fabsx(c,D,B,0)
|
||||||
|
#define ppc_fabsd(c,D,B) ppc_fabsx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_faddx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
|
||||||
|
#define ppc_fadd(c,D,A,B) ppc_faddx(c,D,A,B,0)
|
||||||
|
#define ppc_faddd(c,D,A,B) ppc_faddx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_faddsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
|
||||||
|
#define ppc_fadds(c,D,A,B) ppc_faddsx(c,D,A,B,0)
|
||||||
|
#define ppc_faddsd(c,D,A,B) ppc_faddsx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_fcmpo(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (32 << 1) | 0)
|
||||||
|
#define ppc_fcmpu(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (0 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_fctiwx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (14 << 1) | Rc)
|
||||||
|
#define ppc_fctiw(c,D,B) ppc_fctiwx(c,D,B,0)
|
||||||
|
#define ppc_fctiwd(c,D,B) ppc_fctiwx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fctiwzx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (15 << 1) | Rc)
|
||||||
|
#define ppc_fctiwz(c,D,B) ppc_fctiwzx(c,D,B,0)
|
||||||
|
#define ppc_fctiwzd(c,D,B) ppc_fctiwzx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fdivx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
|
||||||
|
#define ppc_fdiv(c,D,A,B) ppc_fdivx(c,D,A,B,0)
|
||||||
|
#define ppc_fdivd(c,D,A,B) ppc_fdivx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_fdivsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
|
||||||
|
#define ppc_fdivs(c,D,A,B) ppc_fdivsx(c,D,A,B,0)
|
||||||
|
#define ppc_fdivsd(c,D,A,B) ppc_fdivsx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_fmaddx(c,D,A,B,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
|
||||||
|
#define ppc_fmadd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,0)
|
||||||
|
#define ppc_fmaddd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,1)
|
||||||
|
|
||||||
|
#define ppc_fmaddsx(c,D,A,B,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
|
||||||
|
#define ppc_fmadds(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,0)
|
||||||
|
#define ppc_fmaddsd(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,1)
|
||||||
|
|
||||||
|
#define ppc_fmrx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (72 << 1) | Rc)
|
||||||
|
#define ppc_fmr(c,D,B) ppc_fmrx(c,D,B,0)
|
||||||
|
#define ppc_fmrd(c,D,B) ppc_fmrx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
|
||||||
|
#define ppc_fmsub(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fmsubd(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
|
||||||
|
#define ppc_fmsubs(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fmsubsd(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fmulx(c,D,A,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc)
|
||||||
|
#define ppc_fmul(c,D,A,C) ppc_fmulx(c,D,A,C,0)
|
||||||
|
#define ppc_fmuld(c,D,A,C) ppc_fmulx(c,D,A,C,1)
|
||||||
|
|
||||||
|
#define ppc_fmulsx(c,D,A,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc)
|
||||||
|
#define ppc_fmuls(c,D,A,C) ppc_fmulsx(c,D,A,C,0)
|
||||||
|
#define ppc_fmulsd(c,D,A,C) ppc_fmulsx(c,D,A,C,1)
|
||||||
|
|
||||||
|
#define ppc_fnabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (136 << 1) | Rc)
|
||||||
|
#define ppc_fnabs(c,D,B) ppc_fnabsx(c,D,B,0)
|
||||||
|
#define ppc_fnabsd(c,D,B) ppc_fnabsx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fnegx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (40 << 1) | Rc)
|
||||||
|
#define ppc_fneg(c,D,B) ppc_fnegx(c,D,B,0)
|
||||||
|
#define ppc_fnegd(c,D,B) ppc_fnegx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fnmaddx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
|
||||||
|
#define ppc_fnmadd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fnmaddd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fnmaddsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
|
||||||
|
#define ppc_fnmadds(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fnmaddsd(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fnmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
|
||||||
|
#define ppc_fnmsub(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fnmsubd(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fnmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
|
||||||
|
#define ppc_fnmsubs(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fnmsubsd(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fresx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (24 << 1) | Rc)
|
||||||
|
#define ppc_fres(c,D,B) ppc_fresx(c,D,B,0)
|
||||||
|
#define ppc_fresd(c,D,B) ppc_fresx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_frspx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (12 << 1) | Rc)
|
||||||
|
#define ppc_frsp(c,D,B) ppc_frspx(c,D,B,0)
|
||||||
|
#define ppc_frspd(c,D,B) ppc_frspx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_frsqrtex(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (26 << 1) | Rc)
|
||||||
|
#define ppc_frsqrte(c,D,B) ppc_frsqrtex(c,D,B,0)
|
||||||
|
#define ppc_frsqrted(c,D,B) ppc_frsqrtex(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fselx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (23 << 1) | Rc)
|
||||||
|
#define ppc_fsel(c,D,A,C,B) ppc_fselx(c,D,A,C,B,0)
|
||||||
|
#define ppc_fseld(c,D,A,C,B) ppc_fselx(c,D,A,C,B,1)
|
||||||
|
|
||||||
|
#define ppc_fsqrtx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
|
||||||
|
#define ppc_fsqrt(c,D,B) ppc_fsqrtx(c,D,B,0)
|
||||||
|
#define ppc_fsqrtd(c,D,B) ppc_fsqrtx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fsqrtsx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
|
||||||
|
#define ppc_fsqrts(c,D,B) ppc_fsqrtsx(c,D,B,0)
|
||||||
|
#define ppc_fsqrtsd(c,D,B) ppc_fsqrtsx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fsubx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
|
||||||
|
#define ppc_fsub(c,D,A,B) ppc_fsubx(c,D,A,B,0)
|
||||||
|
#define ppc_fsubd(c,D,A,B) ppc_fsubx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_fsubsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
|
||||||
|
#define ppc_fsubs(c,D,A,B) ppc_fsubsx(c,D,A,B,0)
|
||||||
|
#define ppc_fsubsd(c,D,A,B) ppc_fsubsx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_icbi(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (982 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_isync(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (150 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lbzu(c,D,d,A) ppc_emit32(c, (35 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lbzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (119 << 1) | 0)
|
||||||
|
#define ppc_lbzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (87 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lfdu(c,D,d,A) ppc_emit32(c, (51 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lfdux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (631 << 1) | 0)
|
||||||
|
#define ppc_lfdx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (599 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lfsu(c,D,d,A) ppc_emit32(c, (49 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lfsux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (567 << 1) | 0)
|
||||||
|
#define ppc_lfsx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (535 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lha(c,D,d,A) ppc_emit32(c, (42 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lhau(c,D,d,A) ppc_emit32(c, (43 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lhaux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (375 << 1) | 0)
|
||||||
|
#define ppc_lhax(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (343 << 1) | 0)
|
||||||
|
#define ppc_lhbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (790 << 1) | 0)
|
||||||
|
#define ppc_lhzu(c,D,d,A) ppc_emit32(c, (41 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
|
||||||
|
#define ppc_lhzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (311 << 1) | 0)
|
||||||
|
#define ppc_lhzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (279 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lmw(c,D,d,A) ppc_emit32(c, (46 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
|
||||||
|
#define ppc_lswi(c,D,A,NB) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (NB << 11) | (597 << 1) | 0)
|
||||||
|
#define ppc_lswx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (533 << 1) | 0)
|
||||||
|
#define ppc_lwarx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (20 << 1) | 0)
|
||||||
|
#define ppc_lwbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (534 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_lwzu(c,D,d,A) ppc_emit32(c, (33 << 26) | (D << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_lwzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (55 << 1) | 0)
|
||||||
|
#define ppc_lwzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (23 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mcrf(c,crfD,crfS) ppc_emit32(c, (19 << 26) | (crfD << 23) | (0 << 21) | (crfS << 18) | 0)
|
||||||
|
#define ppc_mcrfs(c,crfD,crfS) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (crfS << 18) | (0 << 16) | (64 << 1) | 0)
|
||||||
|
#define ppc_mcrxr(c,crfD) ppc_emit32(c, (31 << 26) | (crfD << 23) | (0 << 16) | (512 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mfcr(c,D) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (19 << 1) | 0)
|
||||||
|
#define ppc_mffsx(c,D,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (583 << 1) | Rc)
|
||||||
|
#define ppc_mffs(c,D) ppc_mffsx(c,D,0)
|
||||||
|
#define ppc_mffsd(c,D) ppc_mffsx(c,D,1)
|
||||||
|
#define ppc_mfmsr(c,D) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (83 << 1) | 0)
|
||||||
|
#define ppc_mfsr(c,D,SR) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 20) | (SR << 16) | (0 << 11) | (595 << 1) | 0)
|
||||||
|
#define ppc_mfsrin(c,D,B) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (B << 11) | (659 << 1) | 0)
|
||||||
|
#define ppc_mftb(c,D,TBR) ppc_emit32(c, (31 << 26) | (D << 21) | (TBR << 11) | (371 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mtcrf(c,CRM,S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 20) | (CRM << 12) | (0 << 11) | (144 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mtfsb0x(c,CRB,Rc) ppc_emit32(c, (63 << 26) | (CRB << 21) | (0 << 11) | (70 << 1) | Rc)
|
||||||
|
#define ppc_mtfsb0(c,CRB) ppc_mtfsb0x(c,CRB,0)
|
||||||
|
#define ppc_mtfsb0d(c,CRB) ppc_mtfsb0x(c,CRB,1)
|
||||||
|
|
||||||
|
#define ppc_mtfsb1x(c,CRB,Rc) ppc_emit32(c, (63 << 26) | (CRB << 21) | (0 << 11) | (38 << 1) | Rc)
|
||||||
|
#define ppc_mtfsb1(c,CRB) ppc_mtfsb1x(c,CRB,0)
|
||||||
|
#define ppc_mtfsb1d(c,CRB) ppc_mtfsb1x(c,CRB,1)
|
||||||
|
|
||||||
|
#define ppc_mtfsfx(c,FM,B,Rc) ppc_emit32(c, (63 << 26) | (0 << 25) | (FM << 22) | (0 << 21) | (B << 11) | (711 << 1) | Rc)
|
||||||
|
#define ppc_mtfsf(c,FM,B) ppc_mtfsfx(c,FM,B,0)
|
||||||
|
#define ppc_mtfsfd(c,FM,B) ppc_mtfsfx(c,FM,B,1)
|
||||||
|
|
||||||
|
#define ppc_mtfsfix(c,crfD,IMM,Rc) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 16) | (IMM << 12) | (0 << 11) | (134 << 1) | Rc)
|
||||||
|
#define ppc_mtfsfi(c,crfD,IMM) ppc_mtfsfix(c,crfD,IMM,0)
|
||||||
|
#define ppc_mtfsfid(c,crfD,IMM) ppc_mtfsfix(c,crfD,IMM,1)
|
||||||
|
|
||||||
|
#define ppc_mtmsr(c, S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 11) | (146 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mtsr(c,SR,S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 20) | (SR << 16) | (0 << 11) | (210 << 1) | 0)
|
||||||
|
#define ppc_mtsrin(c,S,B) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 16) | (B << 11) | (242 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mulhwx(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 10) | (75 << 1) | Rc)
|
||||||
|
#define ppc_mulhw(c,D,A,B) ppc_mulhwx(c,D,A,B,0)
|
||||||
|
#define ppc_mulhwd(c,D,A,B) ppc_mulhwx(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_mulhwux(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 10) | (11 << 1) | Rc)
|
||||||
|
#define ppc_mulhwu(c,D,A,B) ppc_mulhwux(c,D,A,B,0)
|
||||||
|
#define ppc_mulhwud(c,D,A,B) ppc_mulhwux(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_mulli(c,D,A,SIMM) ppc_emit32(c, ((07) << 26) | (D << 21) | (A << 16) | (guint16)(SIMM))
|
||||||
|
|
||||||
|
#define ppc_mullwx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (235 << 1) | Rc)
|
||||||
|
#define ppc_mullw(c,D,A,B) ppc_mullwx(c,D,A,B,0,0)
|
||||||
|
#define ppc_mullwd(c,D,A,B) ppc_mullwx(c,D,A,B,0,1)
|
||||||
|
#define ppc_mullwo(c,D,A,B) ppc_mullwx(c,D,A,B,1,0)
|
||||||
|
#define ppc_mullwod(c,D,A,B) ppc_mullwx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_nandx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (476 << 1) | Rc)
|
||||||
|
#define ppc_nand(c,A,S,B) ppc_nandx(c,A,S,B,0)
|
||||||
|
#define ppc_nandd(c,A,S,B) ppc_nandx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_negx(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (104 << 1) | Rc)
|
||||||
|
#define ppc_neg(c,D,A) ppc_negx(c,D,A,0,0)
|
||||||
|
#define ppc_negd(c,D,A) ppc_negx(c,D,A,0,1)
|
||||||
|
#define ppc_nego(c,D,A) ppc_negx(c,D,A,1,0)
|
||||||
|
#define ppc_negod(c,D,A) ppc_negx(c,D,A,1,1)
|
||||||
|
|
||||||
|
#define ppc_norx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (124 << 1) | Rc)
|
||||||
|
#define ppc_nor(c,A,S,B) ppc_norx(c,A,S,B,0)
|
||||||
|
#define ppc_nord(c,A,S,B) ppc_norx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_not(c,A,S) ppc_norx(c,A,S,S,0)
|
||||||
|
|
||||||
|
#define ppc_orx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (444 << 1) | Rc)
|
||||||
|
#define ppc_ord(c,A,S,B) ppc_orx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_orcx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (412 << 1) | Rc)
|
||||||
|
#define ppc_orc(c,A,S,B) ppc_orcx(c,A,S,B,0)
|
||||||
|
#define ppc_orcd(c,A,S,B) ppc_orcx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_oris(c,A,S,UIMM) ppc_emit32(c, (25 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
|
||||||
|
|
||||||
|
#define ppc_rfi(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (50 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_rlwimix(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (20 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
|
||||||
|
#define ppc_rlwimi(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,0)
|
||||||
|
#define ppc_rlwimid(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,1)
|
||||||
|
|
||||||
|
#define ppc_rlwinmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (21 << 26) | ((S) << 21) | ((A) << 16) | ((SH) << 11) | ((MB) << 6) | ((ME) << 1) | (Rc))
|
||||||
|
#define ppc_rlwinm(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,0)
|
||||||
|
#define ppc_rlwinmd(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,1)
|
||||||
|
#define ppc_extlwi(c,A,S,n,b) ppc_rlwinm(c,A,S, b, 0, (n) - 1)
|
||||||
|
#define ppc_extrwi(c,A,S,n,b) ppc_rlwinm(c,A,S, (b) + (n), 32 - (n), 31)
|
||||||
|
#define ppc_rotlwi(c,A,S,n) ppc_rlwinm(c,A,S, n, 0, 31)
|
||||||
|
#define ppc_rotrwi(c,A,S,n) ppc_rlwinm(c,A,S, 32 - (n), 0, 31)
|
||||||
|
#define ppc_slwi(c,A,S,n) ppc_rlwinm(c,A,S, n, 0, 31 - (n))
|
||||||
|
#define ppc_srwi(c,A,S,n) ppc_rlwinm(c,A,S, 32 - (n), n, 31)
|
||||||
|
#define ppc_clrlwi(c,A,S,n) ppc_rlwinm(c,A,S, 0, n, 31)
|
||||||
|
#define ppc_clrrwi(c,A,S,n) ppc_rlwinm(c,A,S, 0, 0, 31 - (n))
|
||||||
|
#define ppc_clrlslwi(c,A,S,b,n) ppc_rlwinm(c,A,S, n, (b) - (n), 31 - (n))
|
||||||
|
|
||||||
|
#define ppc_rlwnmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (23 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
|
||||||
|
#define ppc_rlwnm(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,0)
|
||||||
|
#define ppc_rlwnmd(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,1)
|
||||||
|
|
||||||
|
#define ppc_sc(c) ppc_emit32(c, (17 << 26) | (0 << 2) | (1 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_slwx(c,S,A,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (24 << 1) | Rc)
|
||||||
|
#define ppc_slw(c,S,A,B) ppc_slwx(c,S,A,B,0)
|
||||||
|
#define ppc_slwd(c,S,A,B) ppc_slwx(c,S,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_srawx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (792 << 1) | Rc)
|
||||||
|
#define ppc_sraw(c,A,S,B) ppc_srawx(c,A,S,B,0)
|
||||||
|
#define ppc_srawd(c,A,S,B) ppc_srawx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_srawix(c,A,S,SH,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (SH << 11) | (824 << 1) | Rc)
|
||||||
|
#define ppc_srawi(c,A,S,B) ppc_srawix(c,A,S,B,0)
|
||||||
|
#define ppc_srawid(c,A,S,B) ppc_srawix(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_srwx(c,A,S,SH,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (SH << 11) | (536 << 1) | Rc)
|
||||||
|
#define ppc_srw(c,A,S,B) ppc_srwx(c,A,S,B,0)
|
||||||
|
#define ppc_srwd(c,A,S,B) ppc_srwx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_stbu(c,S,d,A) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | (guint16)(d))
|
||||||
|
|
||||||
|
#define ppc_stbux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (247 << 1) | 0)
|
||||||
|
#define ppc_stbx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (215 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_stfdu(c,S,d,A) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | (guint16)(d))
|
||||||
|
|
||||||
|
#define ppc_stfdx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (727 << 1) | 0)
|
||||||
|
#define ppc_stfiwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (983 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_stfsu(c,S,d,A) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | (guint16)(d))
|
||||||
|
#define ppc_stfsux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (695 << 1) | 0)
|
||||||
|
#define ppc_stfsx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (663 << 1) | 0)
|
||||||
|
#define ppc_sthbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (918 << 1) | 0)
|
||||||
|
#define ppc_sthu(c,S,d,A) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | (guint16)(d))
|
||||||
|
#define ppc_sthux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (439 << 1) | 0)
|
||||||
|
#define ppc_sthx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (407 << 1) | 0)
|
||||||
|
#define ppc_stmw(c,S,d,A) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | (guint16)d)
|
||||||
|
#define ppc_stswi(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (725 << 1) | 0)
|
||||||
|
#define ppc_stswx(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (661 << 1) | 0)
|
||||||
|
#define ppc_stwbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (662 << 1) | 0)
|
||||||
|
#define ppc_stwcxd(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (150 << 1) | 1)
|
||||||
|
#define ppc_stwux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (183 << 1) | 0)
|
||||||
|
#define ppc_stwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (151 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_subfx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (40 << 1) | Rc)
|
||||||
|
#define ppc_subf(c,D,A,B) ppc_subfx(c,D,A,B,0,0)
|
||||||
|
#define ppc_subfd(c,D,A,B) ppc_subfx(c,D,A,B,0,1)
|
||||||
|
#define ppc_subfo(c,D,A,B) ppc_subfx(c,D,A,B,1,0)
|
||||||
|
#define ppc_subfod(c,D,A,B) ppc_subfx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_sub(c,D,A,B) ppc_subf(c,D,B,A)
|
||||||
|
|
||||||
|
#define ppc_subfcx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (8 << 1) | Rc)
|
||||||
|
#define ppc_subfc(c,D,A,B) ppc_subfcx(c,D,A,B,0,0)
|
||||||
|
#define ppc_subfcd(c,D,A,B) ppc_subfcx(c,D,A,B,0,1)
|
||||||
|
#define ppc_subfco(c,D,A,B) ppc_subfcx(c,D,A,B,1,0)
|
||||||
|
#define ppc_subfcod(c,D,A,B) ppc_subfcx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_subfex(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (136 << 1) | Rc)
|
||||||
|
#define ppc_subfe(c,D,A,B) ppc_subfex(c,D,A,B,0,0)
|
||||||
|
#define ppc_subfed(c,D,A,B) ppc_subfex(c,D,A,B,0,1)
|
||||||
|
#define ppc_subfeo(c,D,A,B) ppc_subfex(c,D,A,B,1,0)
|
||||||
|
#define ppc_subfeod(c,D,A,B) ppc_subfex(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_subfic(c,D,A,SIMM) ppc_emit32(c, (8 << 26) | (D << 21) | (A << 16) | (guint16)(SIMM))
|
||||||
|
|
||||||
|
#define ppc_subfmex(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (232 << 1) | Rc)
|
||||||
|
#define ppc_subfme(c,D,A) ppc_subfmex(c,D,A,0,0)
|
||||||
|
#define ppc_subfmed(c,D,A) ppc_subfmex(c,D,A,0,1)
|
||||||
|
#define ppc_subfmeo(c,D,A) ppc_subfmex(c,D,A,1,0)
|
||||||
|
#define ppc_subfmeod(c,D,A) ppc_subfmex(c,D,A,1,1)
|
||||||
|
|
||||||
|
#define ppc_subfzex(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (200 << 1) | Rc)
|
||||||
|
#define ppc_subfze(c,D,A) ppc_subfzex(c,D,A,0,0)
|
||||||
|
#define ppc_subfzed(c,D,A) ppc_subfzex(c,D,A,0,1)
|
||||||
|
#define ppc_subfzeo(c,D,A) ppc_subfzex(c,D,A,1,0)
|
||||||
|
#define ppc_subfzeod(c,D,A) ppc_subfzex(c,D,A,1,1)
|
||||||
|
|
||||||
|
#define ppc_sync(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (598 << 1) | 0)
|
||||||
|
#define ppc_tlbia(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (370 << 1) | 0)
|
||||||
|
#define ppc_tlbie(c,B) ppc_emit32(c, (31 << 26) | (0 << 16) | (B << 11) | (306 << 1) | 0)
|
||||||
|
#define ppc_tlbsync(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (566 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_tw(c,TO,A,B) ppc_emit32(c, (31 << 26) | (TO << 21) | (A << 16) | (B << 11) | (4 << 1) | 0)
|
||||||
|
#define ppc_twi(c,TO,A,SIMM) ppc_emit32(c, (3 << 26) | (TO << 21) | (A << 16) | (guint16)(SIMM))
|
||||||
|
|
||||||
|
#define ppc_xorx(c,A,S,B,RC) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (316 << 1) | RC)
|
||||||
|
#define ppc_xor(c,A,S,B) ppc_xorx(c,A,S,B,0)
|
||||||
|
#define ppc_xord(c,A,S,B) ppc_xorx(c,A,S,B,1)
|
||||||
|
|
||||||
|
#define ppc_xori(c,S,A,UIMM) ppc_emit32(c, (26 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
|
||||||
|
#define ppc_xoris(c,S,A,UIMM) ppc_emit32(c, (27 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
|
||||||
|
|
||||||
|
/* this marks the end of my work, ct */
|
||||||
|
|
||||||
|
/* PPC64 */
|
||||||
|
|
||||||
|
/* The following FP instructions are not are available to 32-bit
|
||||||
|
implementations (prior to PowerISA-V2.01 but are available to
|
||||||
|
32-bit mode programs on 64-bit PowerPC implementations and all
|
||||||
|
processors compliant with PowerISA-2.01 or later. */
|
||||||
|
|
||||||
|
#define ppc_fcfidx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | ((D) << 21) | (0 << 16) | ((B) << 11) | (846 << 1) | (Rc))
|
||||||
|
#define ppc_fcfid(c,D,B) ppc_fcfidx(c,D,B,0)
|
||||||
|
#define ppc_fcfidd(c,D,B) ppc_fcfidx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fctidx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | ((D) << 21) | (0 << 16) | ((B) << 11) | (814 << 1) | (Rc))
|
||||||
|
#define ppc_fctid(c,D,B) ppc_fctidx(c,D,B,0)
|
||||||
|
#define ppc_fctidd(c,D,B) ppc_fctidx(c,D,B,1)
|
||||||
|
|
||||||
|
#define ppc_fctidzx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | ((D) << 21) | (0 << 16) | ((B) << 11) | (815 << 1) | (Rc))
|
||||||
|
#define ppc_fctidz(c,D,B) ppc_fctidzx(c,D,B,0)
|
||||||
|
#define ppc_fctidzd(c,D,B) ppc_fctidzx(c,D,B,1)
|
||||||
|
|
||||||
|
#ifdef __mono_ppc64__
|
||||||
|
|
||||||
|
#define ppc_load_sequence(c,D,v) G_STMT_START { \
|
||||||
|
ppc_lis ((c), (D), ((guint64)(v) >> 48) & 0xffff); \
|
||||||
|
ppc_ori ((c), (D), (D), ((guint64)(v) >> 32) & 0xffff); \
|
||||||
|
ppc_sldi ((c), (D), (D), 32); \
|
||||||
|
ppc_oris ((c), (D), (D), ((guint64)(v) >> 16) & 0xffff); \
|
||||||
|
ppc_ori ((c), (D), (D), (guint64)(v) & 0xffff); \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define PPC_LOAD_SEQUENCE_LENGTH 20
|
||||||
|
|
||||||
|
#define ppc_is_imm32(val) (((((gint64)val)>> 31) == 0) || ((((gint64)val)>> 31) == -1))
|
||||||
|
#define ppc_is_imm48(val) (((((gint64)val)>> 47) == 0) || ((((gint64)val)>> 47) == -1))
|
||||||
|
|
||||||
|
#define ppc_load48(c,D,v) G_STMT_START { \
|
||||||
|
ppc_li ((c), (D), ((gint64)(v) >> 32) & 0xffff); \
|
||||||
|
ppc_sldi ((c), (D), (D), 32); \
|
||||||
|
ppc_oris ((c), (D), (D), ((guint64)(v) >> 16) & 0xffff); \
|
||||||
|
ppc_ori ((c), (D), (D), (guint64)(v) & 0xffff); \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_load(c,D,v) G_STMT_START { \
|
||||||
|
if (ppc_is_imm16 ((guint64)(v))) { \
|
||||||
|
ppc_li ((c), (D), (guint16)(guint64)(v)); \
|
||||||
|
} else if (ppc_is_imm32 ((guint64)(v))) { \
|
||||||
|
ppc_load32 ((c), (D), (guint32)(guint64)(v)); \
|
||||||
|
} else if (ppc_is_imm48 ((guint64)(v))) { \
|
||||||
|
ppc_load48 ((c), (D), (guint64)(v)); \
|
||||||
|
} else { \
|
||||||
|
ppc_load_sequence ((c), (D), (guint64)(v)); \
|
||||||
|
} \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_load_func(c,D,v) G_STMT_START { \
|
||||||
|
ppc_load_sequence ((c), ppc_r11, (guint64)(gsize)(v)); \
|
||||||
|
ppc_ldptr ((c), ppc_r2, sizeof (gpointer), ppc_r11); \
|
||||||
|
ppc_ldptr ((c), (D), 0, ppc_r11); \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_load_multiple_regs(c,D,d,A) G_STMT_START { \
|
||||||
|
int __i, __o = (d); \
|
||||||
|
for (__i = (D); __i <= 31; ++__i) { \
|
||||||
|
ppc_ldr ((c), __i, __o, (A)); \
|
||||||
|
__o += sizeof (guint64); \
|
||||||
|
} \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_store_multiple_regs(c,S,d,A) G_STMT_START { \
|
||||||
|
int __i, __o = (d); \
|
||||||
|
for (__i = (S); __i <= 31; ++__i) { \
|
||||||
|
ppc_str ((c), __i, __o, (A)); \
|
||||||
|
__o += sizeof (guint64); \
|
||||||
|
} \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
|
#define ppc_compare(c,cfrD,A,B) ppc_cmp((c), (cfrD), 1, (A), (B))
|
||||||
|
#define ppc_compare_reg_imm(c,cfrD,A,B) ppc_cmpi((c), (cfrD), 1, (A), (B))
|
||||||
|
#define ppc_compare_log(c,cfrD,A,B) ppc_cmpl((c), (cfrD), 1, (A), (B))
|
||||||
|
|
||||||
|
#define ppc_shift_left(c,A,S,B) ppc_sld((c), (A), (S), (B))
|
||||||
|
#define ppc_shift_left_imm(c,A,S,n) ppc_sldi((c), (A), (S), (n))
|
||||||
|
|
||||||
|
#define ppc_shift_right_imm(c,A,S,B) ppc_srdi((c), (A), (S), (B))
|
||||||
|
#define ppc_shift_right_arith_imm(c,A,S,B) ppc_sradi((c), (A), (S), (B))
|
||||||
|
|
||||||
|
#define ppc_multiply(c,D,A,B) ppc_mulld((c), (D), (A), (B))
|
||||||
|
|
||||||
|
#define ppc_clear_right_imm(c,A,S,n) ppc_clrrdi((c), (A), (S), (n))
|
||||||
|
|
||||||
|
#define ppc_divdx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | ((OE) << 10) | (489 << 1) | (Rc))
|
||||||
|
#define ppc_divd(c,D,A,B) ppc_divdx(c,D,A,B,0,0)
|
||||||
|
#define ppc_divdd(c,D,A,B) ppc_divdx(c,D,A,B,0,1)
|
||||||
|
#define ppc_divdo(c,D,A,B) ppc_divdx(c,D,A,B,1,0)
|
||||||
|
#define ppc_divdod(c,D,A,B) ppc_divdx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_divdux(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | ((OE) << 10) | (457 << 1) | (Rc))
|
||||||
|
#define ppc_divdu(c,D,A,B) ppc_divdux(c,D,A,B,0,0)
|
||||||
|
#define ppc_divdud(c,D,A,B) ppc_divdux(c,D,A,B,0,1)
|
||||||
|
#define ppc_divduo(c,D,A,B) ppc_divdux(c,D,A,B,1,0)
|
||||||
|
#define ppc_divduod(c,D,A,B) ppc_divdux(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_extswx(c,S,A,Rc) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | (0 << 11) | (986 << 1) | (Rc))
|
||||||
|
#define ppc_extsw(c,A,S) ppc_extswx(c,S,A,0)
|
||||||
|
#define ppc_extswd(c,A,S) ppc_extswx(c,S,A,1)
|
||||||
|
|
||||||
|
/* These move float to/from instuctions are only available on POWER6 in
|
||||||
|
native mode. These instruction are faster then the equivalent
|
||||||
|
store/load because they avoid the store queue and associated delays.
|
||||||
|
These instructions should only be used in 64-bit mode unless the
|
||||||
|
kernel preserves the 64-bit GPR on signals and dispatch in 32-bit
|
||||||
|
mode. The Linux kernel does not. */
|
||||||
|
#define ppc_mftgpr(c,T,B) ppc_emit32(c, (31 << 26) | ((T) << 21) | (0 << 16) | ((B) << 11) | (735 << 1) | 0)
|
||||||
|
#define ppc_mffgpr(c,T,B) ppc_emit32(c, (31 << 26) | ((T) << 21) | (0 << 16) | ((B) << 11) | (607 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_ld(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 0)
|
||||||
|
#define ppc_lwa(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((ds) & 0xfffc) | 2)
|
||||||
|
#define ppc_ldarx(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (84 << 1) | 0)
|
||||||
|
#define ppc_ldu(c,D,ds,A) ppc_emit32(c, (58 << 26) | ((D) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 1)
|
||||||
|
#define ppc_ldux(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (53 << 1) | 0)
|
||||||
|
#define ppc_lwaux(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (373 << 1) | 0)
|
||||||
|
#define ppc_ldx(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (21 << 1) | 0)
|
||||||
|
#define ppc_lwax(c,D,A,B) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (341 << 1) | 0)
|
||||||
|
|
||||||
|
#define ppc_mulhdx(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (0 << 10) | (73 << 1) | (Rc))
|
||||||
|
#define ppc_mulhd(c,D,A,B) ppc_mulhdx(c,D,A,B,0)
|
||||||
|
#define ppc_mulhdd(c,D,A,B) ppc_mulhdx(c,D,A,B,1)
|
||||||
|
#define ppc_mulhdux(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (0 << 10) | (9 << 1) | (Rc))
|
||||||
|
#define ppc_mulhdu(c,D,A,B) ppc_mulhdux(c,D,A,B,0)
|
||||||
|
#define ppc_mulhdud(c,D,A,B) ppc_mulhdux(c,D,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_mulldx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | ((OE) << 10) | (233 << 1) | (Rc))
|
||||||
|
#define ppc_mulld(c,D,A,B) ppc_mulldx(c,D,A,B,0,0)
|
||||||
|
#define ppc_mulldd(c,D,A,B) ppc_mulldx(c,D,A,B,0,1)
|
||||||
|
#define ppc_mulldo(c,D,A,B) ppc_mulldx(c,D,A,B,1,0)
|
||||||
|
#define ppc_mulldod(c,D,A,B) ppc_mulldx(c,D,A,B,1,1)
|
||||||
|
|
||||||
|
#define ppc_rldclx(c,A,S,B,MB,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (ppc_split_5_1(MB) << 5) | (8 << 1) | (Rc))
|
||||||
|
#define ppc_rldcl(c,A,S,B,MB) ppc_rldclx(c,A,S,B,MB,0)
|
||||||
|
#define ppc_rldcld(c,A,S,B,MB) ppc_rldclx(c,A,S,B,MB,1)
|
||||||
|
#define ppc_rotld(c,A,S,B) ppc_rldcl(c, A, S, B, 0)
|
||||||
|
|
||||||
|
#define ppc_rldcrx(c,A,S,B,ME,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (ppc_split_5_1(ME) << 5) | (9 << 1) | (Rc))
|
||||||
|
#define ppc_rldcr(c,A,S,B,ME) ppc_rldcrx(c,A,S,B,ME,0)
|
||||||
|
#define ppc_rldcrd(c,A,S,B,ME) ppc_rldcrx(c,A,S,B,ME,1)
|
||||||
|
|
||||||
|
#define ppc_rldicx(c,S,A,SH,MB,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | (ppc_split_5_1_5(SH) << 11) | (ppc_split_5_1(MB) << 5) | (2 << 2) | (ppc_split_5_1_1(SH) << 1) | (Rc))
|
||||||
|
#define ppc_rldic(c,A,S,SH,MB) ppc_rldicx(c,S,A,SH,MB,0)
|
||||||
|
#define ppc_rldicd(c,A,S,SH,MB) ppc_rldicx(c,S,A,SH,MB,1)
|
||||||
|
|
||||||
|
#define ppc_rldiclx(c,S,A,SH,MB,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | (ppc_split_5_1_5(SH) << 11) | (ppc_split_5_1(MB) << 5) | (0 << 2) | (ppc_split_5_1_1(SH) << 1) | (Rc))
|
||||||
|
#define ppc_rldicl(c,A,S,SH,MB) ppc_rldiclx(c,S,A,SH,MB,0)
|
||||||
|
#define ppc_rldicld(c,A,S,SH,MB) ppc_rldiclx(c,S,A,SH,MB,1)
|
||||||
|
#define ppc_extrdi(c,A,S,n,b) ppc_rldicl(c,A,S, (b) + (n), 64 - (n))
|
||||||
|
#define ppc_rotldi(c,A,S,n) ppc_rldicl(c,A,S, n, 0)
|
||||||
|
#define ppc_rotrdi(c,A,S,n) ppc_rldicl(c,A,S, 64 - (n), 0)
|
||||||
|
#define ppc_srdi(c,A,S,n) ppc_rldicl(c,A,S, 64 - (n), n)
|
||||||
|
#define ppc_clrldi(c,A,S,n) ppc_rldicl(c,A,S, 0, n)
|
||||||
|
|
||||||
|
#define ppc_rldicrx(c,A,S,SH,ME,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | (ppc_split_5_1_5(SH) << 11) | (ppc_split_5_1(ME) << 5) | (1 << 2) | (ppc_split_5_1_1(SH) << 1) | (Rc))
|
||||||
|
#define ppc_rldicr(c,A,S,SH,ME) ppc_rldicrx(c,A,S,SH,ME,0)
|
||||||
|
#define ppc_rldicrd(c,A,S,SH,ME) ppc_rldicrx(c,A,S,SH,ME,1)
|
||||||
|
#define ppc_extldi(c,A,S,n,b) ppc_rldicr(c, A, S, b, (n) - 1)
|
||||||
|
#define ppc_sldi(c,A,S,n) ppc_rldicr(c, A, S, n, 63 - (n))
|
||||||
|
#define ppc_clrrdi(c,A,S,n) ppc_rldicr(c, A, S, 0, 63 - (n))
|
||||||
|
|
||||||
|
#define ppc_rldimix(c,S,A,SH,MB,Rc) ppc_emit32(c, (30 << 26) | ((S) << 21) | ((A) << 16) | (ppc_split_5_1_5(SH) << 11) | (ppc_split_5_1(MB) << 5) | (3 << 2) | (ppc_split_5_1_1(SH) << 1) | (Rc))
|
||||||
|
#define ppc_rldimi(c,A,S,SH,MB) ppc_rldimix(c,S,A,SH,MB,0)
|
||||||
|
#define ppc_rldimid(c,A,S,SH,MB) ppc_rldimix(c,S,A,SH,MB,1)
|
||||||
|
|
||||||
|
#define ppc_slbia(c) ppc_emit32(c, (31 << 26) | (0 << 21) | (0 << 16) | (0 << 11) | (498 << 1) | 0)
|
||||||
|
#define ppc_slbie(c,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (0 << 16) | ((B) << 11) | (434 << 1) | 0)
|
||||||
|
#define ppc_sldx(c,S,A,B,Rc) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (27 << 1) | (Rc))
|
||||||
|
#define ppc_sld(c,A,S,B) ppc_sldx(c,S,A,B,0)
|
||||||
|
#define ppc_sldd(c,A,S,B) ppc_sldx(c,S,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_sradx(c,S,A,B,Rc) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (794 << 1) | (Rc))
|
||||||
|
#define ppc_srad(c,A,S,B) ppc_sradx(c,S,A,B,0)
|
||||||
|
#define ppc_sradd(c,A,S,B) ppc_sradx(c,S,A,B,1)
|
||||||
|
#define ppc_sradix(c,S,A,SH,Rc) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | (((SH) & 31) << 11) | (413 << 2) | (((SH) >> 5) << 1) | (Rc))
|
||||||
|
#define ppc_sradi(c,A,S,SH) ppc_sradix(c,S,A,SH,0)
|
||||||
|
#define ppc_sradid(c,A,S,SH) ppc_sradix(c,S,A,SH,1)
|
||||||
|
|
||||||
|
#define ppc_srdx(c,S,A,B,Rc) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (539 << 1) | (Rc))
|
||||||
|
#define ppc_srd(c,A,S,B) ppc_srdx(c,S,A,B,0)
|
||||||
|
#define ppc_srdd(c,A,S,B) ppc_srdx(c,S,A,B,1)
|
||||||
|
|
||||||
|
#define ppc_std(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 0)
|
||||||
|
#define ppc_stdcxd(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (214 << 1) | 1)
|
||||||
|
#define ppc_stdu(c,S,ds,A) ppc_emit32(c, (62 << 26) | ((S) << 21) | ((A) << 16) | ((guint32)(ds) & 0xfffc) | 1)
|
||||||
|
#define ppc_stdux(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (181 << 1) | 0)
|
||||||
|
#define ppc_stdx(c,S,A,B) ppc_emit32(c, (31 << 26) | ((S) << 21) | ((A) << 16) | ((B) << 11) | (149 << 1) | 0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Always true for 32-bit */
|
||||||
|
#define ppc_is_imm32(val) (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
6
src/arch/s390x/.gitignore
vendored
Normal file
6
src/arch/s390x/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/.libs
|
||||||
|
/.deps
|
||||||
|
/*.la
|
||||||
|
/*.lo
|
||||||
35
src/arch/s390x/ChangeLog
Normal file
35
src/arch/s390x/ChangeLog
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
2010-03-23 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Remove duplicate
|
||||||
|
|
||||||
|
2009-06-24 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Add some new instructions.
|
||||||
|
|
||||||
|
2007-04-12 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* tramp.c: Add MONO_TYPE_PTR case.
|
||||||
|
|
||||||
|
2007-01-23 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Add packed attribute to several instruction structures.
|
||||||
|
|
||||||
|
2006-03-13 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Fix immediate checks.
|
||||||
|
|
||||||
|
2006-01-06 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Add lpdbr instruction (OP_ABS).
|
||||||
|
|
||||||
|
2006-01-03 Neale Ferguson <neale@sinenomine.net>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Add some new instructions.
|
||||||
|
|
||||||
|
2004-12-15 Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
|
||||||
|
|
||||||
|
* s390x-codegen.h: Add some new instructions (CS, CSG, CSY, CDS, CDSG, CDSY)
|
||||||
|
|
||||||
|
2004-08-03 Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
|
||||||
|
|
||||||
|
* s390x-codegen.h Makefile.am tramp.c: S/390 64-bit interpreter
|
||||||
7
src/arch/s390x/Makefile.am
Normal file
7
src/arch/s390x/Makefile.am
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libmonoarch-s390x.la
|
||||||
|
|
||||||
|
libmonoarch_s390x_la_SOURCES = tramp.c s390x-codegen.h
|
||||||
|
|
||||||
997
src/arch/s390x/s390x-codegen.h
Normal file
997
src/arch/s390x/s390x-codegen.h
Normal file
@@ -0,0 +1,997 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2001 Radek Doulik
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef S390X_H
|
||||||
|
#define S390X_H
|
||||||
|
#include <glib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define FLOAT_REGS 2 /* No. float registers for parms */
|
||||||
|
#define GENERAL_REGS 5 /* No. general registers for parms */
|
||||||
|
|
||||||
|
#define ARG_BASE s390_r10 /* Register for addressing arguments*/
|
||||||
|
#define STKARG \
|
||||||
|
(i*(sizeof(stackval))) /* Displacement of ith argument */
|
||||||
|
|
||||||
|
#define MINV_POS 160 /* MonoInvocation stack offset */
|
||||||
|
#define STACK_POS (MINV_POS - sizeof (stackval) * sig->param_count)
|
||||||
|
#define OBJ_POS 8
|
||||||
|
#define TYPE_OFFSET (G_STRUCT_OFFSET (stackval, type))
|
||||||
|
|
||||||
|
#define MIN_CACHE_LINE 256
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
/* Sequence to add an int/long long to parameters to stack_from_data*/
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
#define ADD_ISTACK_PARM(r, i) \
|
||||||
|
if (reg_param < GENERAL_REGS-(r)) { \
|
||||||
|
s390_lay (p, s390_r4, 0, STK_BASE, \
|
||||||
|
local_start + (reg_param - this_flag) * sizeof(long)); \
|
||||||
|
reg_param += (i); \
|
||||||
|
} else { \
|
||||||
|
s390_lay (p, s390_r4, 0, STK_BASE, \
|
||||||
|
sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
|
||||||
|
stack_param += (i); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
/* Sequence to add a float/double to parameters to stack_from_data */
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
#define ADD_RSTACK_PARM(i) \
|
||||||
|
if (fpr_param < FLOAT_REGS) { \
|
||||||
|
s390_lay (p, s390_r4, 0, STK_BASE, \
|
||||||
|
float_pos + (fpr_param * sizeof(float) * (i))); \
|
||||||
|
fpr_param++; \
|
||||||
|
} else { \
|
||||||
|
stack_param += (stack_param % (i)); \
|
||||||
|
s390_lay (p, s390_r4, 0, STK_BASE, \
|
||||||
|
sz.stack_size + MINV_POS + stack_param * sizeof(float) * (i)); \
|
||||||
|
stack_param += (i); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
/* Sequence to add a structure ptr to parameters to stack_from_data */
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
#define ADD_TSTACK_PARM \
|
||||||
|
if (reg_param < GENERAL_REGS) { \
|
||||||
|
s390_ly (p, s390_r4, 0, STK_BASE, \
|
||||||
|
local_start + (reg_param - this_flag) * sizeof(long)); \
|
||||||
|
reg_param++; \
|
||||||
|
} else { \
|
||||||
|
s390_ly (p, s390_r4, 0, STK_BASE, \
|
||||||
|
sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
|
||||||
|
stack_param++; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD_PSTACK_PARM(r, i) \
|
||||||
|
if (reg_param < GENERAL_REGS-(r)) { \
|
||||||
|
s390_lay (p, s390_r4, 0, STK_BASE, \
|
||||||
|
local_start + (reg_param - this_flag) * sizeof(long)); \
|
||||||
|
reg_param += (i); \
|
||||||
|
} else { \
|
||||||
|
s390_ly (p, s390_r4, 0, STK_BASE, \
|
||||||
|
sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
|
||||||
|
stack_param++; \
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
s390_r0 = 0,
|
||||||
|
s390_r1,
|
||||||
|
s390_r2,
|
||||||
|
s390_r3,
|
||||||
|
s390_r4,
|
||||||
|
s390_r5,
|
||||||
|
s390_r6,
|
||||||
|
s390_r7,
|
||||||
|
s390_r8,
|
||||||
|
s390_r9,
|
||||||
|
s390_r10,
|
||||||
|
s390_r11,
|
||||||
|
s390_r12,
|
||||||
|
s390_r13,
|
||||||
|
s390_r14,
|
||||||
|
s390_r15,
|
||||||
|
} S390IntRegister;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
s390_f0 = 0,
|
||||||
|
s390_f1,
|
||||||
|
s390_f2,
|
||||||
|
s390_f3,
|
||||||
|
s390_f4,
|
||||||
|
s390_f5,
|
||||||
|
s390_f6,
|
||||||
|
s390_f7,
|
||||||
|
s390_f8,
|
||||||
|
s390_f9,
|
||||||
|
s390_f10,
|
||||||
|
s390_f11,
|
||||||
|
s390_f12,
|
||||||
|
s390_f13,
|
||||||
|
s390_f14,
|
||||||
|
s390_f15,
|
||||||
|
} S390FloatRegister;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
s390_a0 = 0,
|
||||||
|
s390_a1,
|
||||||
|
s390_a2,
|
||||||
|
s390_a3,
|
||||||
|
s390_a4,
|
||||||
|
s390_a5,
|
||||||
|
s390_a6,
|
||||||
|
s390_a7,
|
||||||
|
s390_a8,
|
||||||
|
s390_a9,
|
||||||
|
s390_a10,
|
||||||
|
s390_a11,
|
||||||
|
s390_a12,
|
||||||
|
s390_a13,
|
||||||
|
s390_a14,
|
||||||
|
s390_a15,
|
||||||
|
} S390AccRegister;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
s390_fpc = 256,
|
||||||
|
} S390SpecialRegister;
|
||||||
|
|
||||||
|
#define s390_is_imm16(val) ((glong)val >= (glong) SHRT_MIN && \
|
||||||
|
(glong)val <= (glong) SHRT_MAX)
|
||||||
|
#define s390_is_imm32(val) ((glong)val >= (glong) INT_MIN && \
|
||||||
|
(glong)val <= (glong) INT_MAX)
|
||||||
|
#define s390_is_uimm16(val) ((glong)val >= 0 && (glong)val <= (glong) USHRT_MAX)
|
||||||
|
#define s390_is_uimm32(val) ((glong)val >= 0 && (glong)val <= (glong) UINT_MAX)
|
||||||
|
#define s390_is_uimm20(val) ((glong)val >= 0 && (glong)val <= 1048575)
|
||||||
|
#define s390_is_imm20(val) ((glong)val >= -524288 && (glong)val <= 524287)
|
||||||
|
#define s390_is_imm12(val) ((glong)val >= (glong)-4096 && \
|
||||||
|
(glong)val <= (glong)4095)
|
||||||
|
#define s390_is_uimm12(val) ((glong)val >= 0 && (glong)val <= 4095)
|
||||||
|
|
||||||
|
#define STK_BASE s390_r15
|
||||||
|
#define S390_SP s390_r15
|
||||||
|
#define S390_FP s390_r11
|
||||||
|
#define S390_MINIMAL_STACK_SIZE 160
|
||||||
|
#define S390_REG_SAVE_OFFSET 48
|
||||||
|
#define S390_PARM_SAVE_OFFSET 16
|
||||||
|
#define S390_RET_ADDR_OFFSET 112
|
||||||
|
#define S390_FLOAT_SAVE_OFFSET 128
|
||||||
|
|
||||||
|
#define S390_CC_ZR 8
|
||||||
|
#define S390_CC_NE 7
|
||||||
|
#define S390_CC_NZ 7
|
||||||
|
#define S390_CC_LT 4
|
||||||
|
#define S390_CC_GT 2
|
||||||
|
#define S390_CC_GE 11
|
||||||
|
#define S390_CC_NM 11
|
||||||
|
#define S390_CC_LE 13
|
||||||
|
#define S390_CC_OV 1
|
||||||
|
#define S390_CC_NO 14
|
||||||
|
#define S390_CC_CY 3
|
||||||
|
#define S390_CC_NC 12
|
||||||
|
#define S390_CC_UN 15
|
||||||
|
|
||||||
|
#define s390_word(addr, value) do \
|
||||||
|
{ \
|
||||||
|
* (guint32 *) addr = (guint32) value; \
|
||||||
|
addr += sizeof(guint32); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define s390_float(addr, value) do \
|
||||||
|
{ \
|
||||||
|
* (gfloat *) addr = (gfloat) value; \
|
||||||
|
addr += sizeof(gfloat); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define s390_llong(addr, value) do \
|
||||||
|
{ \
|
||||||
|
* (guint64 *) addr = (guint64) value; \
|
||||||
|
addr += sizeof(guint64); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define s390_double(addr, value) do \
|
||||||
|
{ \
|
||||||
|
* (gdouble *) addr = (gdouble) value; \
|
||||||
|
addr += sizeof(gdouble); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
} E_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
int im;
|
||||||
|
} I_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char r2 : 4;
|
||||||
|
} RR_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char xx;
|
||||||
|
char r1 : 4;
|
||||||
|
char r2 : 4;
|
||||||
|
} RRE_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char r1 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
char r2 : 4;
|
||||||
|
} RRF_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char m3 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char r1 : 4;
|
||||||
|
char r2 : 4;
|
||||||
|
} RRF_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char r3 : 4;
|
||||||
|
char m4 : 4;
|
||||||
|
char r1 : 4;
|
||||||
|
char r2 : 4;
|
||||||
|
} RRF_Format_3;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char x2 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} RX_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char x2 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 12;
|
||||||
|
char xx;
|
||||||
|
char op2;
|
||||||
|
} RXE_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r3 : 4;
|
||||||
|
char x2 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 12;
|
||||||
|
char r1 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char op2;
|
||||||
|
} RXF_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char x2 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 20;
|
||||||
|
char op2;
|
||||||
|
} __attribute__ ((packed)) RXY_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 12;
|
||||||
|
} RS_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char m3 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 12;
|
||||||
|
} RS_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 12;
|
||||||
|
} RS_Format_3;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 20;
|
||||||
|
char op2;
|
||||||
|
} __attribute__ ((packed)) RSY_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char m3 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
int d2 : 20;
|
||||||
|
char op2;
|
||||||
|
} __attribute__ ((packed)) RSY_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char l1 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char b1 : 4;
|
||||||
|
int d1 : 12;
|
||||||
|
char yy;
|
||||||
|
char op2;
|
||||||
|
} RSL_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
short i2;
|
||||||
|
} RSI_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char m1 : 4;
|
||||||
|
char op2 : 4;
|
||||||
|
short i2;
|
||||||
|
} RI_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
short i2;
|
||||||
|
char xx;
|
||||||
|
char op2;
|
||||||
|
} RIE_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
short i2;
|
||||||
|
char m2 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char op2;
|
||||||
|
} RIE_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
short d;
|
||||||
|
char i;
|
||||||
|
char op2;
|
||||||
|
} RIE_Format_3;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char yy : 4;
|
||||||
|
short i2;
|
||||||
|
char m3 : 4;
|
||||||
|
char xx : 4;
|
||||||
|
char op2;
|
||||||
|
} RIE_Format_4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char r1 : 4;
|
||||||
|
char op2 : 4;
|
||||||
|
int i2;
|
||||||
|
} __attribute__ ((packed)) RIL_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char m1 : 4;
|
||||||
|
char op2 : 4;
|
||||||
|
int i2;
|
||||||
|
} __attribute__ ((packed)) RIL_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char i2;
|
||||||
|
char b1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
} SI_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op1;
|
||||||
|
char i2;
|
||||||
|
char b1 : 4;
|
||||||
|
int d1 : 20;
|
||||||
|
char op2;
|
||||||
|
} __attribute__ ((packed)) SIY_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} S_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char ll;
|
||||||
|
char b1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} SS_Format_1;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char l1 : 4;
|
||||||
|
char l2 : 4;
|
||||||
|
char b1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} SS_Format_2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
char b1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} SS_Format_3;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char op;
|
||||||
|
char r1 : 4;
|
||||||
|
char r3 : 4;
|
||||||
|
char b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
char b4 : 4;
|
||||||
|
short d4 : 12;
|
||||||
|
} SS_Format_4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
short tb1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
short b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} __attribute__ ((packed)) SSE_Format;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short op;
|
||||||
|
char r3 : 4;
|
||||||
|
char o2 : 4;
|
||||||
|
short b1 : 4;
|
||||||
|
short d1 : 12;
|
||||||
|
short b2 : 4;
|
||||||
|
short d2 : 12;
|
||||||
|
} __attribute__ ((packed)) SSF_Format;
|
||||||
|
|
||||||
|
#define s390_emit16(c, x) do \
|
||||||
|
{ \
|
||||||
|
*((guint16 *) c) = (guint16) x; \
|
||||||
|
c += sizeof(guint16); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define s390_emit32(c, x) do \
|
||||||
|
{ \
|
||||||
|
*((guint32 *) c) = (guint32) x; \
|
||||||
|
c += sizeof(guint32); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define S390_E(c,opc) s390_emit16(c,opc)
|
||||||
|
|
||||||
|
#define S390_I(c,opc,imm) s390_emit16(c, (opc << 8 | imm))
|
||||||
|
|
||||||
|
#define S390_RR(c,opc,g1,g2) s390_emit16(c, (opc << 8 | (g1) << 4 | g2))
|
||||||
|
|
||||||
|
#define S390_RRE(c,opc,g1,g2) s390_emit32(c, (opc << 16 | (g1) << 4 | g2))
|
||||||
|
|
||||||
|
#define S390_RRF_1(c,opc,g1,g2,g3) s390_emit32(c, (opc << 16 | (g1) << 12 | (g3) << 4 | g2))
|
||||||
|
|
||||||
|
#define S390_RRF_2(c,opc,g1,k3,g2) s390_emit32(c, (opc << 16 | (k3) << 12 | (g1) << 4 | g2))
|
||||||
|
|
||||||
|
#define S390_RRF_3(c,opc,g1,g2,k4,g3) s390_emit32(c, (opc << 16 | (g3) << 12 | (k4) << 8 | (g1) << 4 | g2))
|
||||||
|
|
||||||
|
#define S390_RX(c,opc,g1,n2,s2,p2) s390_emit32(c, (opc << 24 | (g1) << 20 | (n2) << 16 | (s2) << 12 | ((p2) & 0xfff)))
|
||||||
|
|
||||||
|
#define S390_RXE(c,opc,g1,n2,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | n2)); \
|
||||||
|
s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RXY(c,opc,g1,n2,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | n2)); \
|
||||||
|
s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) | \
|
||||||
|
((((p2) & 0xff000) >> 12) << 8) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RS_1(c,opc,g1,g3,s2,p2) s390_emit32(c, (opc << 24 | (g1) << 20 | (g3) << 16 | (s2) << 12 | ((p2) & 0xfff)))
|
||||||
|
|
||||||
|
#define S390_RS_2(c,opc,g1,k3,s2,p2) s390_emit32(c, (opc << 24 | (g1) << 20 | (k3) << 16 | (s2) << 12 | ((p2) & 0xfff)))
|
||||||
|
|
||||||
|
#define S390_RS_3(c,opc,g1,s2,p2) s390_emit32(c, (opc << 24 | (g1) << 20 | (s2) << 12 | ((p2) & 0xfff)))
|
||||||
|
|
||||||
|
#define S390_RSY_1(c,opc,g1,g3,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3)); \
|
||||||
|
s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) | \
|
||||||
|
((((p2) & 0xff000) >> 12) << 8) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RSY_2(c,opc,g1,k3,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | k3)); \
|
||||||
|
s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) | \
|
||||||
|
((((p2) & 0xff000) >> 12) << 8) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RSL(c,opc,ln,s1,p1) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (ln) << 4)); \
|
||||||
|
s390_emit32(c, ((s1) << 28 | ((s1 & 0xfff) << 16) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RSI(c,opc,g1,g3,m2) s390_emit32(c, (opc << 24 | (g1) << 20 | (g3) << 16 | (m2 & 0xffff)))
|
||||||
|
|
||||||
|
#define S390_RI(c,opc,g1,m2) s390_emit32(c, ((opc >> 4) << 24 | (g1) << 20 | (opc & 0x0f) << 16 | (m2 & 0xffff)))
|
||||||
|
|
||||||
|
#define S390_RIE_1(c,opc,g1,g3,m2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3)); \
|
||||||
|
s390_emit32(c, ((m2) << 16 | (opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIE_2(c,opc,g1,g2,m3,v) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3)); \
|
||||||
|
s390_emit16(c, (v)); \
|
||||||
|
s390_emit16(c, ((m2) << 12 | (opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIE_3(c,opc,g1,i,m3,d) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | m3)); \
|
||||||
|
s390_emit16(c, (d)); \
|
||||||
|
s390_emit16(c, ((i) << 8 | (opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIE_4(c,opc,g1,i2,m3) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | (g1) << 4); \
|
||||||
|
s390_emit16(c, (i2)); \
|
||||||
|
s390_emit16(c, ((m3) << 12 | (opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIL_1(c,opc,g1,m2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc >> 4) << 8 | (g1) << 4 | (opc & 0xf))); \
|
||||||
|
s390_emit32(c, m2); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIL_2(c,opc,k1,m2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc >> 4) << 8 | (k1) << 4 | (opc & 0xf))); \
|
||||||
|
s390_emit32(c, m2); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_RIS(c,opc,r,i,m3,b,d) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc, & 0xff00) | (r1) << 4) | (r2)); \
|
||||||
|
s390_emit16(c, ((b) << 12) | (d)); \
|
||||||
|
s390_emit16(c, ((i) << 4) | ((opc) & 0xff)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define S390_RRS(c,opc,r1,r2,m3,b,d) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc, & 0xff00) | (r1) << 4) | (r2)); \
|
||||||
|
s390_emit16(c, ((b) << 12) | (d)); \
|
||||||
|
s390_emit16(c, ((m3) << 12) | ((opc) & 0xff)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define S390_SI(c,opc,s1,p1,m2) s390_emit32(c, (opc << 24 | (m2) << 16 | (s1) << 12 | ((p1) & 0xfff)));
|
||||||
|
|
||||||
|
#define S390_SIY(c,opc,s1,p1,m2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, ((opc & 0xff00) | m2)); \
|
||||||
|
s390_emit32(c, ((s1) << 24 | (((p2) & 0xfffff) << 8) | \
|
||||||
|
(opc & 0xff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_S(c,opc,s2,p2) s390_emit32(c, (opc << 16 | (s2) << 12 | ((p2) & 0xfff)))
|
||||||
|
|
||||||
|
#define S390_SS_1(c,opc,ln,s1,p1,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit32(c, (opc << 24 | ((ln-1) & 0xff) << 16 | \
|
||||||
|
(s1) << 12 | ((p1) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_SS_2(c,opc,n1,n2,s1,p1,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit32(c, (opc << 24 | (n1) << 16 | (n2) << 12 | \
|
||||||
|
(s1) << 12 | ((p1) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_SS_3(c,opc,g1,g3,s1,p1,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit32(c, (opc << 24 | (g1) << 16 | (g3) << 12 | \
|
||||||
|
(s1) << 12 | ((p1) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_SS_4(c,opc,g1,g3,s2,p2,s4,p4) do \
|
||||||
|
{ \
|
||||||
|
s390_emit32(c, (opc << 24 | (g1) << 16 | (g3) << 12 | \
|
||||||
|
(s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s4) << 12 | ((p4) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_SSE(c,opc,s1,p1,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, opc); \
|
||||||
|
s390_emit16(c, ((s1) << 12 | ((p1) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define S390_SSF(c,opc,r3,s1,p1,s2,p2) do \
|
||||||
|
{ \
|
||||||
|
s390_emit16(c, (((opc) & 0xff00) << 8) | ((r3) << 4) | \
|
||||||
|
((opc) & 0xf)); \
|
||||||
|
s390_emit16(c, ((s1) << 12 | ((p1) & 0xfff))); \
|
||||||
|
s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define s390_a(c, r, x, b, d) S390_RX(c, 0x5a, r, x, b, d)
|
||||||
|
#define s390_adb(c, r, x, b, d) S390_RXE(c, 0xed1a, r, x, b, d)
|
||||||
|
#define s390_adbr(c, r1, r2) S390_RRE(c, 0xb31a, r1, r2)
|
||||||
|
#define s390_aebr(c, r1, r2) S390_RRE(c, 0xb30a, r1, r2)
|
||||||
|
#define s390_afi(c, r, v) S390_RIL_1(c, 0xc29, r, v);
|
||||||
|
#define s390_ag(c, r, x, b, d) S390_RXY(c, 0xe308, r, x, b, d)
|
||||||
|
#define s390_agf(c, r, x, b, d) S390_RXY(c, 0xe318, r, x, b, d)
|
||||||
|
#define s390_agfi(c, r, v) S390_RIL_1(c, 0xc28, r, v)
|
||||||
|
#define s390_afgr(c, r1, r2) S390_RRE(c, 0xb918, r1, r2)
|
||||||
|
#define s390_aghi(c, r, v) S390_RI(c, 0xa7b, r, v)
|
||||||
|
#define s390_aghik(c, r, v) S390_RIE_1(c, 0xecd9, r, v)
|
||||||
|
#define s390_agr(c, r1, r2) S390_RRE(c, 0xb908, r1, r2)
|
||||||
|
#define s390_agrk(c, r1, r2, r3) S390_RRF_1(c, 0xb9e8, r1, r2, r3)
|
||||||
|
#define s390_agsi(c, r, v) S390_SIY(c, 0xeb7a, r v)
|
||||||
|
#define s390_ahhhr(c, r1, r2, r3) S390_RRF_1(c, 0xb9c8, r1, r2, r3)
|
||||||
|
#define s390_ahhlr(c, r1, r2, r3) S390_RRF_1(c, 0xb9d8, r1, r2, r3)
|
||||||
|
#define s390_ahi(c, r, v) S390_RI(c, 0xa7a, r, v)
|
||||||
|
#define s390_ahik(c, r, v) S390_RIE_1(c, 0xecd8, r, v)
|
||||||
|
#define s390_ahy(c, r, x, b, d) S390_RXY(c, 0xe37a, r, b, d)
|
||||||
|
#define s390_aih(c, r, v) S390_RIL_1(c, 0xcc8, r, v)
|
||||||
|
#define s390_al(c, r, x, b, d) S390_RX(c, 0x5e, r, x, b, d)
|
||||||
|
#define s390_alc(c, r, x, b, d) S390_RXY(c, 0xe398, r, x, b, d)
|
||||||
|
#define s390_alcg(c, r, x, b, d) S390_RXY(c, 0xe388, r, x, b, d)
|
||||||
|
#define s390_alcgr(c, r1, r2) S390_RRE(c, 0xb988, r1, r2)
|
||||||
|
#define s390_alcr(c, r1, r2) S390_RRE(c, 0xb998, r1, r2)
|
||||||
|
#define s390_alfi(c, r, v) S390_RIL_1(c, 0xc2b, r, v)
|
||||||
|
#define s390_alg(c, r, x, b, d) S390_RXY(c, 0xe30a, r, x, b, d)
|
||||||
|
#define s390_algf(c, r, x, b, d) S390_RXY(c, 0xe31a, r, x, b, d)
|
||||||
|
#define s390_algfi(c, r, v) S390_RIL_1(c, 0xc2a, r, v)
|
||||||
|
#define s390_algfr(c, r1, r2) S390_RRE(c, 0xb91a, r1, r2)
|
||||||
|
#define s390_alghsik(c, r, v) S390_RIE_1(c, 0xecd8, r, v)
|
||||||
|
#define s390_algr(c, r1, r2) S390_RRE(c, 0xb90a, r1, r2)
|
||||||
|
#define s390_algsi(c, r, v) S390_SIY(c, 0xeb7e, r, v)
|
||||||
|
#define s390_alhhhr(c, r1, r2, r3) S390_RRF_1(c, 0xb9ca, r1, r2, r3)
|
||||||
|
#define s390_alhhlr(c, r1, r2, r3) S390_RRF_1(c, 0xb9da, r1, r2, r3)
|
||||||
|
#define s390_alhsik(c, r, v) S390_RIE_1(c, 0xecda, r, v)
|
||||||
|
#define s390_alr(c, r1, r2) S390_RR(c, 0x1e, r1, r2)
|
||||||
|
#define s390_alrk(c, r1, r2) S390_RRF(c, 0xb9fa, r1, r2)
|
||||||
|
#define s390_alsi(c, r, v) S390_SIY(c, 0xeb6e, r, v)
|
||||||
|
#define s390_alsih(c, r, v) S390_RIL_1(c, 0xcca, r, v)
|
||||||
|
#define s390_alsihn(c, r, v) S390_RIL_1(c, 0xccb, r, v)
|
||||||
|
#define s390_aly(c, r, x, b, d) S390_RXY(c, 0xe35e, r, x, b, d)
|
||||||
|
#define s390_ar(c, r1, r2) S390_RR(c, 0x1a, r1, r2)
|
||||||
|
#define s390_ark(c, r1, r2, r3) S390_RRF_1(c, 0xb9f8, r1, r2, r3)
|
||||||
|
#define s390_asi(c, r, v) S390_SIY(c, 0xeb6a, r, v)
|
||||||
|
#define s390_ay(c, r, x, b, d) S390_RXY(c, 0xe35a, r, x, b, d)
|
||||||
|
#define s390_basr(c, r1, r2) S390_RR(c, 0x0d, r1, r2)
|
||||||
|
#define s390_bctr(c, r1, r2) S390_RR(c, 0x06, r1, r2)
|
||||||
|
#define s390_bctrg(c, r1, r2) S390_RRE(c, 0xb946, r1, r2)
|
||||||
|
#define s390_bnzr(c, r) S390_RR(c, 0x07, 0x07, r)
|
||||||
|
#define s390_bras(c, r, o) S390_RI(c, 0xa75, r, o)
|
||||||
|
#define s390_brasl(c, r, o) S390_RIL_1(c, 0xc05, r, o)
|
||||||
|
#define s390_brc(c, m, d) S390_RI(c, 0xa74, m, d)
|
||||||
|
#define s390_brcl(c, m, d) S390_RIL_2(c, 0xc04, m, d)
|
||||||
|
#define s390_br(c, r) S390_RR(c, 0x07, 0xf, r)
|
||||||
|
#define s390_break(c) S390_RR(c, 0, 0, 0)
|
||||||
|
#define s390_bzr(c, r) S390_RR(c, 0x07, 0x08, r)
|
||||||
|
#define s390_c(c, r, x, b, d) S390_RX(c, 0x59, r, x, b, d)
|
||||||
|
#define s390_cdb(c, r, x, b, d) S390_RXE(c, 0xed19, r, x, b, d)
|
||||||
|
#define s390_cdbr(c, r1, r2) S390_RRE(c, 0xb319, r1, r2)
|
||||||
|
#define s390_cdfbr(c, r1, r2) S390_RRE(c, 0xb395, r1, r2)
|
||||||
|
#define s390_cdgbr(c, r1, r2) S390_RRE(c, 0xb3a5, r1, r2)
|
||||||
|
#define s390_cds(c, r1, r2, b, d) S390_RX(c, 0xbb, r1, r2, b, d)
|
||||||
|
#define s390_cdsg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb3e, r1, r2, b, d)
|
||||||
|
#define s390_cdsy(c, r1, r2, b, d) S390_RSY_1(c, 0xeb31, r1, r2, b, d)
|
||||||
|
#define s390_cebr(c, r1, r2) S390_RRE(c, 0xb309, r1, r2)
|
||||||
|
#define s390_cegbr(c, r1, r2) S390_RRE(c, 0xb3a4, r1, r2)
|
||||||
|
#define s390_cfdbr(c, r1, m, r2) S390_RRF_2(c, 0xb399, r1, m, r2)
|
||||||
|
#define s390_cfi(c, r, v) S390_RIL_1(c, 0xc2d, r, v)
|
||||||
|
#define s390_cgdbr(c, r1, m, r2) S390_RRF_2(c, 0xb3a9, r1, m, r2)
|
||||||
|
#define s390_cg(c, r, x, b, d) S390_RXY(c, 0xe320, r, x, b, d)
|
||||||
|
#define s390_cgfi(c, r, v) S390_RIL_1(c, 0xc2c, r, v)
|
||||||
|
#define s390_cgfrl(c, r, v) S390_RIL_1(c, 0xc6c, r, v)
|
||||||
|
#define s390_cghi(c, r, i) S390_RI(c, 0xa7f, r, i)
|
||||||
|
#define s390_cgib(c, r, i, m, b, d) S390_RIS(c, 0xecfc, r, i, m, b, d)
|
||||||
|
#define s390_cgij(c, r, i, m, d) S390_RIE_3(c, 0xec7c, r, i, m, d)
|
||||||
|
#define s390_cgit(c, r, i, m) S390_RIE_4(c, 0xec70, r, i m);
|
||||||
|
#define s390_cgr(c, r1, r2) S390_RRE(c, 0xb920, r1, r2)
|
||||||
|
#define s390_cgrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xece4, r1, r2, m3, b, d)
|
||||||
|
#define s390_cgrj(c, r1, r2, m3, v) S390_RIE_2(c, 0xec64, r1, r2, m3, v)
|
||||||
|
#define s390_cgrl(c, r, v) S390_RIL_1(c, 0xc68, r, v)
|
||||||
|
#define s390_chi(c, r, i) S390_RI(c, 0xa7e, r, i)
|
||||||
|
#define s390_cib(c, r, i, m, b, d) S390_RIS(c, 0xecfe, r, i, m, b, d)
|
||||||
|
#define s390_cij(c, r, i, m, d) S390_RIE_3(c, 0xec7e, r, i, m, d)
|
||||||
|
#define s390_cit(c, r, i, m) S390_RIE_4(c, 0xec72, r, i m);
|
||||||
|
#define s390_cl(c, r, x, b, d) S390_RX(c, 0x55, r, x, b, d)
|
||||||
|
#define s390_clg(c, r, x, b, d) S390_RXY(c, 0xe321, r, x, b, d)
|
||||||
|
#define s390_clgib(c, r, i, m, b, d) S390_RIS(c, 0xecfd, r, i, m, b, d)
|
||||||
|
#define s390_clgij(c, r, i, b) S390_RIE_3(c, 0xec7d, r, i, m, d)
|
||||||
|
#define s390_clgr(c, r1, r2) S390_RRE(c, 0xb921, r1, r2)
|
||||||
|
#define s390_clgrj(c, r1, r2, m, v) S390_RIE_2(c, 0xec65, r1, r2, m, v)
|
||||||
|
#define s390_clgrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xece5, r1, r2, m3, b, d)
|
||||||
|
#define s390_clib(c, r, i, m, b, d) S390_RIS(c, 0xecff, r, i, m, b, d)
|
||||||
|
#define s390_clij(c, r, i, b) S390_RIE_3(c, 0xec7f, r, i, m, d)
|
||||||
|
#define s390_clr(c, r1, r2) S390_RR(c, 0x15, r1, r2)
|
||||||
|
#define s390_clrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xecf7, r1, r2, m3, b, d)
|
||||||
|
#define s390_clrj(c, r1, r2, m, v) S390_RIE_2(c, 0xec77, r1, r2, m, v)
|
||||||
|
#define s390_cr(c, r1, r2) S390_RR(c, 0x19, r1, r2)
|
||||||
|
#define s390_crb(c, r1, r2, m3, b, d) S390_RRS(c, 0xecf6, r1, r2, m3, b, d)
|
||||||
|
#define s390_crj(c, r1, r2, m3, v) S390_RIE_2(c, 0xec76, r1, r2, m3, v)
|
||||||
|
#define s390_crl(c, r, v) S390_RIL_1(c, 0xc6d, r, v)
|
||||||
|
#define s390_crt(c, r1, r2, m3) S390_RRF_2(c, 0xb972, r1, r2, m3);
|
||||||
|
#define s390_cgrt(c, r1, r2, m3) S390_RRF_2(c, 0xb960, r1, r2, m3);
|
||||||
|
#define s390_cs(c, r1, r2, b, d) S390_RX(c, 0xba, r1, r2, b, d)
|
||||||
|
#define s390_csg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb30, r1, r2, b, d)
|
||||||
|
#define s390_csst(c, d1, b1, d2, b2, r) S390_SSF(c, 0xc82, b1, d1, b2, d2, r)
|
||||||
|
#define s390_csy(c, r1, r2, b, d) S390_RSY_1(c, 0xeb14, r1, r2, b, d)
|
||||||
|
#define s390_ddbr(c, r1, r2) S390_RRE(c, 0xb31d, r1, r2)
|
||||||
|
#define s390_debr(c, r1, r2) S390_RRE(c, 0xb30d, r1, r2)
|
||||||
|
#define s390_didbr(c, r1, r2, m, r3) S390_RRF_3(c, 0xb35b, r1, r2, m, r3)
|
||||||
|
#define s390_dlgr(c, r1, r2) S390_RRE(c, 0xb987, r1, r2)
|
||||||
|
#define s390_dlr(c, r1, r2) S390_RRE(c, 0xb997, r1, r2)
|
||||||
|
#define s390_dr(c, r1, r2) S390_RR(c, 0x1d, r1, r2)
|
||||||
|
#define s390_dsgfr(c, r1, r2) S390_RRE(c, 0xb91d, r1, r2)
|
||||||
|
#define s390_dsgr(c, r1, r2) S390_RRE(c, 0xb90d, r1, r2)
|
||||||
|
#define s390_ear(c, r1, r2) S390_RRE(c, 0xb24f, r1, r2)
|
||||||
|
#define s390_ic(c, r, x, b, d) S390_RX(c, 0x43, r, x, b, d)
|
||||||
|
#define s390_icm(c, r, m, b, d) S390_RX(c, 0xbf, r, m, b, d)
|
||||||
|
#define s390_icmy(c, r, x, b, d) S390_RXY(c, 0xeb81, r, x, b, d)
|
||||||
|
#define s390_icy(c, r, x, b, d) S390_RXY(c, 0xe373, r, x, b, d)
|
||||||
|
#define s390_iihf(c, r, v) S390_RIL_1(c, 0xc08, r, v)
|
||||||
|
#define s390_iihh(c, r, v) S390_RI(c, 0xa50, r, v)
|
||||||
|
#define s390_iihl(c, r, v) S390_RI(c, 0xa51, r, v)
|
||||||
|
#define s390_iilf(c, r, v) S390_RIL_1(c, 0xc09, r, v)
|
||||||
|
#define s390_iilh(c, r, v) S390_RI(c, 0xa52, r, v)
|
||||||
|
#define s390_iill(c, r, v) S390_RI(c, 0xa53, r, v)
|
||||||
|
#define s390_j(c,d) s390_brc(c, S390_CC_UN, d)
|
||||||
|
#define s390_jc(c, m, d) s390_brc(c, m, d)
|
||||||
|
#define s390_jcl(c, m, d) s390_brcl(c, m, d)
|
||||||
|
#define s390_jcy(c, d) s390_brc(c, S390_CC_CY, d)
|
||||||
|
#define s390_je(c, d) s390_brc(c, S390_CC_EQ, d)
|
||||||
|
#define s390_jeo(c, d) s390_brc(c, S390_CC_ZR|S390_CC_OV, d)
|
||||||
|
#define s390_jh(c, d) s390_brc(c, S390_CC_GT, d)
|
||||||
|
#define s390_jho(c, d) s390_brc(c, S390_CC_GT|S390_CC_OV, d)
|
||||||
|
#define s390_jl(c, d) s390_brc(c, S390_CC_LT, d)
|
||||||
|
#define s390_jlo(c, d) s390_brc(c, S390_CC_LT|S390_CC_OV, d)
|
||||||
|
#define s390_jm(c, d) s390_brc(c, S390_CC_LT, d)
|
||||||
|
#define s390_jnc(c, d) s390_brc(c, S390_CC_NC, d)
|
||||||
|
#define s390_jne(c, d) s390_brc(c, S390_CC_NZ, d)
|
||||||
|
#define s390_jnh(c, d) s390_brc(c, S390_CC_LE, d)
|
||||||
|
#define s390_jnl(c, d) s390_brc(c, S390_CC_GE, d)
|
||||||
|
#define s390_jnz(c, d) s390_brc(c, S390_CC_NZ, d)
|
||||||
|
#define s390_jo(c, d) s390_brc(c, S390_CC_OV, d)
|
||||||
|
#define s390_jno(c, d) s390_brc(c, S390_CC_NO, d)
|
||||||
|
#define s390_jp(c, d) s390_brc(c, S390_CC_GT, d)
|
||||||
|
#define s390_jz(c, d) s390_brc(c, S390_CC_ZR, d)
|
||||||
|
#define s390_jg(c,d) s390_brcl(c, S390_CC_UN, d)
|
||||||
|
#define s390_jgcy(c, d) s390_brcl(c, S390_CC_CY, d)
|
||||||
|
#define s390_jge(c, d) s390_brcl(c, S390_CC_EQ, d)
|
||||||
|
#define s390_jgeo(c, d) s390_brcl(c, S390_CC_ZR|S390_CC_OV, d)
|
||||||
|
#define s390_jgh(c, d) s390_brcl(c, S390_CC_GT, d)
|
||||||
|
#define s390_jgho(c, d) s390_brcl(c, S390_CC_GT|S390_CC_OV, d)
|
||||||
|
#define s390_jgl(c, d) s390_brcl(c, S390_CC_LT, d)
|
||||||
|
#define s390_jglo(c, d) s390_brcl(c, S390_CC_LT|S390_CC_OV, d)
|
||||||
|
#define s390_jgm(c, d) s390_brcl(c, S390_CC_LT, d)
|
||||||
|
#define s390_jgnc(c, d) s390_brcl(c, S390_CC_NC, d)
|
||||||
|
#define s390_jgne(c, d) s390_brcl(c, S390_CC_NZ, d)
|
||||||
|
#define s390_jgnh(c, d) s390_brcl(c, S390_CC_LE, d)
|
||||||
|
#define s390_jgnl(c, d) s390_brcl(c, S390_CC_GE, d)
|
||||||
|
#define s390_jgnz(c, d) s390_brcl(c, S390_CC_NZ, d)
|
||||||
|
#define s390_jgo(c, d) s390_brcl(c, S390_CC_OV, d)
|
||||||
|
#define s390_jgno(c, d) s390_brcl(c, S390_CC_NO, d)
|
||||||
|
#define s390_jgp(c, d) s390_brcl(c, S390_CC_GT, d)
|
||||||
|
#define s390_jgz(c, d) s390_brcl(c, S390_CC_ZR, d)
|
||||||
|
#define s390_l(c, r, x, b, d) S390_RX(c, 0x58, r, x, b, d)
|
||||||
|
#define s390_ly(c, r, x, b, d) S390_RXY(c, 0xe358, r, x, b, d)
|
||||||
|
#define s390_la(c, r, x, b, d) S390_RX(c, 0x41, r, x, b, d)
|
||||||
|
#define s390_lay(c, r, x, b, d) S390_RXY(c, 0xe371, r, x, b, d)
|
||||||
|
#define s390_lam(c, r1, r2, b, d) S390_RS_1(c, 0x9a, r1, r2, b, d)
|
||||||
|
#define s390_larl(c, r, o) S390_RIL_1(c, 0xc00, r, o)
|
||||||
|
#define s390_lb(c, r, x, b, d) S390_RXY(c, 0xe376, r, x, b, d)
|
||||||
|
#define s390_lbr(c, r1, r2) S390_RRE(c, 0xb926, r1, r2)
|
||||||
|
#define s390_lcdbr(c, r1, r2) S390_RRE(c, 0xb313, r1, r2)
|
||||||
|
#define s390_lcgr(c, r1, r2) S390_RRE(c, 0xb903, r1, r2)
|
||||||
|
#define s390_lcr(c, r1, r2) S390_RR(c, 0x13, r1, r2)
|
||||||
|
#define s390_ld(c, f, x, b, d) S390_RX(c, 0x68, f, x, b, d)
|
||||||
|
#define s390_ldy(c, r, x, b, d) S390_RXY(c, 0xed65, r, x, b, d)
|
||||||
|
#define s390_ldeb(c, r, x, b, d) S390_RXE(c, 0xed04, r, x, b, d)
|
||||||
|
#define s390_ldebr(c, r1, r2) S390_RRE(c, 0xb304, r1, r2)
|
||||||
|
#define s390_ldgr(c, r1, r2) S390_RRE(c, 0xb3c1, r1, r2)
|
||||||
|
#define s390_ldr(c, r1, r2) S390_RR(c, 0x28, r1, r2)
|
||||||
|
#define s390_le(c, f, x, b, d) S390_RX(c, 0x78, f, x, b, d)
|
||||||
|
#define s390_ledbr(c, r1, r2) S390_RRE(c, 0xb344, r1, r2)
|
||||||
|
#define s390_ler(c, r1, r2) S390_RR(c, 0x38, r1, r2)
|
||||||
|
#define s390_ley(c, r, x, b, d) S390_RXY(c, 0xed64, r, x, b, d)
|
||||||
|
#define s390_lg(c, r, x, b, d) S390_RXY(c, 0xe304, r, x, b, d)
|
||||||
|
#define s390_lgb(c, r, x, b, d) S390_RXY(c, 0xe377, r, x, b, d)
|
||||||
|
#define s390_lgbr(c, r1, r2) S390_RRE(c, 0xb906, r1, r2)
|
||||||
|
#define s390_lgdr(c, r1, r2) S390_RRE(c, 0xb3cd, r1, r2)
|
||||||
|
#define s390_lgf(c, r, x, b, d) S390_RXY(c, 0xe314, r, x, b, d)
|
||||||
|
#define s390_lgfi(c, r, v) S390_RIL_1(c, 0xc01, r, v)
|
||||||
|
#define s390_lgfrl(c, r1, d) S390_RIL_1(c, 0xc4c, r1, d)
|
||||||
|
#define s390_lgfr(c, r1, r2) S390_RRE(c, 0xb914, r1, r2)
|
||||||
|
#define s390_lgh(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d)
|
||||||
|
#define s390_lghi(c, r, v) S390_RI(c, 0xa79, r, v)
|
||||||
|
#define s390_lghr(c, r1, r2) S390_RRE(c, 0xb907, r1, r2)
|
||||||
|
#define s390_lgr(c, r1, r2) S390_RRE(c, 0xb904, r1, r2)
|
||||||
|
#define s390_lgrl(c, r1, d) S390_RIL_1(c, 0xc48, r1, d)
|
||||||
|
#define s390_lh(c, r, x, b, d) S390_RX(c, 0x48, r, x, b, d)
|
||||||
|
#define s390_lhr(c, r1, r2) S390_RRE(c, 0xb927, r1, r2)
|
||||||
|
#define s390_lhg(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d)
|
||||||
|
#define s390_lhi(c, r, v) S390_RI(c, 0xa78, r, v)
|
||||||
|
#define s390_lhy(c, r, x, b, d) S390_RXY(c, 0xe378, r, x, b, d)
|
||||||
|
#define s390_llcr(c, r1, r2) S390_RRE(c, 0xb994, r1, r2)
|
||||||
|
#define s390_llgc(c, r, x, b, d) S390_RXY(c, 0xe390, r, x, b, d)
|
||||||
|
#define s390_llgcr(c, r1, r2) S390_RRE(c, 0xb984, r1, r2)
|
||||||
|
#define s390_llgf(c, r, x, b, d) S390_RXY(c, 0xe316, r, x, b, d)
|
||||||
|
#define s390_llgfr(c, r1, r2) S390_RRE(c, 0xb916, r1, r2)
|
||||||
|
#define s390_llgh(c, r, x, b, d) S390_RXY(c, 0xe391, r, x, b, d)
|
||||||
|
#define s390_llghr(c, r1, r2) S390_RRE(c, 0xb985, r1, r2)
|
||||||
|
#define s390_llhr(c, r1, r2) S390_RRE(c, 0xb995, r1, r2)
|
||||||
|
#define s390_llihf(c, r, v) S390_RIL_1(c, 0xc0e, r, v)
|
||||||
|
#define s390_llihh(c, r, v) S390_RI(c, 0xa5c, r, v)
|
||||||
|
#define s390_llihl(c, r, v) S390_RI(c, 0xa5d, r, v)
|
||||||
|
#define s390_llilf(c, r, v) S390_RIL_1(c, 0xc0f, r, v)
|
||||||
|
#define s390_llilh(c, r, v) S390_RI(c, 0xa5e, r, v)
|
||||||
|
#define s390_llill(c, r, v) S390_RI(c, 0xa5f, r, v)
|
||||||
|
#define s390_lm(c, r1, r2, b, d) S390_RS_1(c, 0x98, r1, r2, b, d)
|
||||||
|
#define s390_lmg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb04, r1, r2, b, d)
|
||||||
|
#define s390_lndbr(c, r1, r2) S390_RRE(c, 0xb311, r1, r2)
|
||||||
|
#define s390_lngr(c, r1, r2) S390_RRE(c, 0xb901, r1, r2)
|
||||||
|
#define s390_lnr(c, r1, r2) S390_RR(c, 0x11, r1, r2)
|
||||||
|
#define s390_lpdbr(c, r1, r2) S390_RRE(c, 0xb310, r1, r2)
|
||||||
|
#define s390_lpgr(c, r1, r2) S390_RRE(c, 0xb900, r1, r2)
|
||||||
|
#define s390_lpr(c, r1, r2) S390_RR(c, 0x10, r1, r2)
|
||||||
|
#define s390_lr(c, r1, r2) S390_RR(c, 0x18, r1, r2)
|
||||||
|
#define s390_lrl(c, r1, d) S390_RIL_1(c, 0xc4d, r1, d)
|
||||||
|
#define s390_ltgfr(c, r1, r2) S390_RRE(c, 0xb912, r1, r2)
|
||||||
|
#define s390_ltgr(c, r1, r2) S390_RRE(c, 0xb902, r1, r2)
|
||||||
|
#define s390_ltr(c, r1, r2) S390_RR(c, 0x12, r1, r2)
|
||||||
|
#define s390_lzdr(c, r) S390_RRE(c, 0xb375, r, 0)
|
||||||
|
#define s390_lzer(c, r) S390_RRE(c, 0xb374, r, 0)
|
||||||
|
#define s390_m(c, r, x, b, d) S390_RX(c, 0x5c, r, x, b, d)
|
||||||
|
#define s390_mdbr(c, r1, r2) S390_RRE(c, 0xb31c, r1, r2)
|
||||||
|
#define s390_meebr(c, r1, r2) S390_RRE(c, 0xb317, r1, r2)
|
||||||
|
#define s390_mfy(c, r, x, b, d) S390_RXY(c, 0xe35c, r, x, b, d)
|
||||||
|
#define s390_mlgr(c, r1, r2) S390_RRE(c, 0xb986, r1, r2)
|
||||||
|
#define s390_mlr(c, r1, r2) S390_RRE(c, 0xb996, r1, r2)
|
||||||
|
#define s390_mr(c, r1, r2) S390_RR(c, 0x1c, r1, r2)
|
||||||
|
#define s390_ms(c, r, x, b, d) S390_RX(c, 0x71, r, x, b, d)
|
||||||
|
#define s390_msi(c, r, v) S390_RIL_1(c, 0xc21, r, v)
|
||||||
|
#define s390_msgfr(c, r1, r2) S390_RRE(c, 0xb91c, r1, r2)
|
||||||
|
#define s390_msgi(c, r, v) S390_RIL_1(c, 0xc20, r, v)
|
||||||
|
#define s390_msgr(c, r1, r2) S390_RRE(c, 0xb90c, r1, r2)
|
||||||
|
#define s390_msr(c, r1, r2) S390_RRE(c, 0xb252, r1, r2)
|
||||||
|
#define s390_mvc(c, l, b1, d1, b2, d2) S390_SS_1(c, 0xd2, l, b1, d1, b2, d2)
|
||||||
|
#define s390_mvcl(c, r1, r2) S390_RR(c, 0x0e, r1, r2)
|
||||||
|
#define s390_mvcle(c, r1, r3, d2, b2) S390_RS_1(c, 0xa8, r1, r3, d2, b2)
|
||||||
|
#define s390_n(c, r, x, b, d) S390_RX(c, 0x54, r, x, b, d)
|
||||||
|
#define s390_nc(c, l, b1, d1, b2, d2) S390_SS_1(c, 0xd4, l, b1, d1, b2, d2)
|
||||||
|
#define s390_ng(c, r, x, b, d) S390_RXY(c, 0xe380, r, x, b, d)
|
||||||
|
#define s390_ngr(c, r1, r2) S390_RRE(c, 0xb980, r1, r2)
|
||||||
|
#define s390_ngrk(c, r1, r2, r3) S390_RRF_1(c, 0xb9e4, r1, r2, r3)
|
||||||
|
#define s390_ni(c, b, d, v) S390_SI(c, 0x94, b, d, v)
|
||||||
|
#define s390_nihf(c, r, v) S390_RIL_1(c, 0xc0a, r, v)
|
||||||
|
#define s390_nihh(c, r, v) S390_RI(c, 0xa54, r, v)
|
||||||
|
#define s390_nihl(c, r, v) S390_RI(c, 0xa55, r, v)
|
||||||
|
#define s390_nilf(c, r, v) S390_RIL_1(c, 0xc0b, r, v)
|
||||||
|
#define s390_nilh(c, r, v) S390_RI(c, 0xa56, r, v)
|
||||||
|
#define s390_nill(c, r, v) S390_RI(c, 0xa57, r, v)
|
||||||
|
#define s390_niy(c, b, d, v) S390_SIY(c, 0xeb54, b, d, v)
|
||||||
|
#define s390_nop(c) S390_RR(c, 0x07, 0x0, 0)
|
||||||
|
#define s390_nr(c, r1, r2) S390_RR(c, 0x14, r1, r2)
|
||||||
|
#define s390_nrk(c, r1, r2) S390_RRF_1(c, 0xb9f4, r1, r2)
|
||||||
|
#define s390_ny(c, r, x, b, d) S390_RRY(c, 0xe354, r1, r2)
|
||||||
|
#define s390_o(c, r, x, b, d) S390_RX(c, 0x56, r, x, b, d)
|
||||||
|
#define s390_oihf(c, r, v) S390_RIL_1(c, 0xc0c, r, v)
|
||||||
|
#define s390_oihh(c, r, v) S390_RI(c, 0xa58, r, v)
|
||||||
|
#define s390_oihl(c, r, v) S390_RI(c, 0xa59, r, v)
|
||||||
|
#define s390_oilf(c, r, v) S390_RIL_1(c, 0xc0d, r, v)
|
||||||
|
#define s390_oilh(c, r, v) S390_RI(c, 0xa5a, r, v)
|
||||||
|
#define s390_oill(c, r, v) S390_RI(c, 0xa5b` r, v)
|
||||||
|
#define s390_oiy(c, b, d, v) S390_SIY(c, 0xeb56 b, d, v)
|
||||||
|
#define s390_og(c, r, x, b, d) S390_RXY(c, 0xe381, r, x, b, d)
|
||||||
|
#define s390_ogr(c, r1, r2) S390_RRE(c, 0xb981, r1, r2)
|
||||||
|
#define s390_or(c, r1, r2) S390_RR(c, 0x16, r1, r2)
|
||||||
|
#define s390_s(c, r, x, b, d) S390_RX(c, 0x5b, r, x, b, d)
|
||||||
|
#define s390_sdb(c, r, x, b, d) S390_RXE(c, 0xed1b, r, x, b, d)
|
||||||
|
#define s390_sdbr(c, r1, r2) S390_RRE(c, 0xb31b, r1, r2)
|
||||||
|
#define s390_sebr(c, r1, r2) S390_RRE(c, 0xb30b, r1, r2)
|
||||||
|
#define s390_sg(c, r, x, b, d) S390_RXY(c, 0xe309, r, x, b, d)
|
||||||
|
#define s390_sgf(c, r, x, b, d) S390_RXY(c, 0xe319, r, x, b, d)
|
||||||
|
#define s390_sgr(c, r1, r2) S390_RRE(c, 0xb909, r1, r2)
|
||||||
|
#define s390_sl(c, r, x, b, d) S390_RX(c, 0x5f, r, x, b, d)
|
||||||
|
#define s390_sla(c, r, b, d) S390_RS_3(c, 0x8b, r, b, d)
|
||||||
|
#define s390_slag(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0b, r1, r2, b, d)
|
||||||
|
#define s390_slbg(c, r, x, b, d) S390_RXY(c, 0xe389, r, x, b, d)
|
||||||
|
#define s390_slbgr(c, r1, r2) S390_RRE(c, 0xb989, r1, r2)
|
||||||
|
#define s390_slbr(c, r1, r2) S390_RRE(c, 0xb999, r1, r2)
|
||||||
|
#define s390_slda(c, r, b, d) S390_RS_3(c, 0x8f, r, b, d)
|
||||||
|
#define s390_sldl(c, r, b, d) S390_RS_3(c, 0x8d, r, b, d)
|
||||||
|
#define s390_slfi(c, r, v) S390_RIL_1(c, 0xc25, r, v)
|
||||||
|
#define s390_slg(c, r, x, b, d) S390_RXY(c, 0xe30b, r, x, b, d)
|
||||||
|
#define s390_slgf(c, r, x, b, d) S390_RXY(c, 0xe31b, r, x, b, d)
|
||||||
|
#define s390_slgfr(c, r1, r2) S390_RRE(c, 0xb91b, r1, r2)
|
||||||
|
#define s390_slgfi(c, r, v) S390_RIL_1(c, 0xc24, r, v)
|
||||||
|
#define s390_slgr(c, r1, r2) S390_RRE(c, 0xb90b, r1, r2)
|
||||||
|
#define s390_sll(c, r, b, d) S390_RS_3(c, 0x89, r, b, d)
|
||||||
|
#define s390_sllg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0d, r1, r2, b, d)
|
||||||
|
#define s390_slr(c, r1, r2) S390_RR(c, 0x1f, r1, r2)
|
||||||
|
#define s390_sqdbr(c, r1, r2) S390_RRE(c, 0xb315, r1, r2)
|
||||||
|
#define s390_sqebr(c, r1, r2) S390_RRE(c, 0xb314, r1, r2)
|
||||||
|
#define s390_sra(c, r, b, d) S390_RS_3(c, 0x8a, r, b, d)
|
||||||
|
#define s390_srag(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0a, r1, r2, b, d)
|
||||||
|
#define s390_sr(c, r1, r2) S390_RR(c, 0x1b, r1, r2)
|
||||||
|
#define s390_srda(c, r, b, d) S390_RS_3(c, 0x8e, r, b, d)
|
||||||
|
#define s390_srdl(c, r, b, d) S390_RS_3(c, 0x8c, r, b, d)
|
||||||
|
#define s390_srl(c, r, b, d) S390_RS_3(c, 0x88, r, b, d)
|
||||||
|
#define s390_srlg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0c, r1, r2, b, d)
|
||||||
|
#define s390_st(c, r, x, b, d) S390_RX(c, 0x50, r, x, b, d)
|
||||||
|
#define s390_stam(c, r1, r2, b, d) S390_RS_1(c, 0x9b, r1, r2, b, d)
|
||||||
|
#define s390_stc(c, r, x, b, d) S390_RX(c, 0x42, r, x, b, d)
|
||||||
|
#define s390_stcm(c, r, m, b, d) S390_RX(c, 0xbe, r, m, b, d)
|
||||||
|
#define s390_stcmy(c, r, x, b, d) S390_RXY(c, 0xeb2d, r, x, b, d)
|
||||||
|
#define s390_stcy(c, r, x, b, d) S390_RXY(c, 0xe372, r, x, b, d)
|
||||||
|
#define s390_std(c, f, x, b, d) S390_RX(c, 0x60, f, x, b, d)
|
||||||
|
#define s390_stdy(c, r, x, b, d) S390_RXY(c, 0xed67, r, x, b, d)
|
||||||
|
#define s390_ste(c, f, x, b, d) S390_RX(c, 0x70, f, x, b, d)
|
||||||
|
#define s390_stey(c, r, x, b, d) S390_RXY(c, 0xed66, r, x, b, d)
|
||||||
|
#define s390_stfpc(c, b, d) S390_S(c, 0xb29c, b, d)
|
||||||
|
#define s390_stg(c, r, x, b, d) S390_RXY(c, 0xe324, r, x, b, d)
|
||||||
|
#define s390_sth(c, r, x, b, d) S390_RX(c, 0x40, r, x, b, d)
|
||||||
|
#define s390_sthy(c, r, x, b, d) S390_RXY(c, 0xe370, r, x, b, d)
|
||||||
|
#define s390_stm(c, r1, r2, b, d) S390_RS_1(c, 0x90, r1, r2, b, d)
|
||||||
|
#define s390_stmg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb24, r1, r2, b, d)
|
||||||
|
#define s390_sty(c, r, x, b, d) S390_RXY(c, 0xe350, r, x, b, d)
|
||||||
|
#define s390_tcdb(c, r, x, b, d) S390_RXE(c, 0xed11, r, x, b, d)
|
||||||
|
#define s390_tceb(c, r, x, b, d) S390_RXE(c, 0xed10, r, x, b, d)
|
||||||
|
#define s390_x(c, r, x, b, d) S390_RX(c, 0x57, r, x, b, d)
|
||||||
|
#define s390_xihf(c, r, v) S390_RIL_1(c, 0xc06, r, v)
|
||||||
|
#define s390_xilf(c, r, v) S390_RIL_1(c, 0xc07, r, v)
|
||||||
|
#define s390_xg(c, r, x, b, d) S390_RXY(c, 0xe382, r, x, b, d)
|
||||||
|
#define s390_xgr(c, r1, r2) S390_RRE(c, 0xb982, r1, r2)
|
||||||
|
#define s390_xr(c, r1, r2) S390_RR(c, 0x17, r1, r2)
|
||||||
|
#define s390_xy(c, r, x, b, d) S390_RXY(c, 0xe357, r, x, b, d)
|
||||||
|
#endif
|
||||||
1149
src/arch/s390x/tramp.c
Normal file
1149
src/arch/s390x/tramp.c
Normal file
File diff suppressed because it is too large
Load Diff
3
src/arch/sparc/.gitignore
vendored
Normal file
3
src/arch/sparc/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/.deps
|
||||||
7
src/arch/sparc/Makefile.am
Normal file
7
src/arch/sparc/Makefile.am
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libmonoarch-sparc.la
|
||||||
|
|
||||||
|
libmonoarch_sparc_la_SOURCES = tramp.c sparc-codegen.h
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user