Skip to content

Commit

Permalink
depend on embedded SoftFloat-3d instead of __float128
Browse files Browse the repository at this point in the history
See #302
See #467
  • Loading branch information
andrewrk committed Sep 14, 2017
1 parent 7ddc259 commit 14cda27
Show file tree
Hide file tree
Showing 15 changed files with 435 additions and 187 deletions.
141 changes: 130 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -169,12 +169,135 @@ else()
)
endif()

find_package(Threads)

include_directories(
${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}
# No patches have been applied to SoftFloat-3d
set(EMBEDDED_SOFTFLOAT_SOURCES
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/f128M_isSignalingNaN.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_commonNaNToF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_commonNaNToF32UI.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_commonNaNToF64UI.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_f128MToCommonNaN.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_f32UIToCommonNaN.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_f64UIToCommonNaN.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/s_propagateNaNF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086/softfloat_raiseFlags.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_add.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_div.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_eq.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_eq_signaling.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_le.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_le_quiet.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_lt.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_lt_quiet.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_mul.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_mulAdd.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_rem.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_roundToInt.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_sqrt.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_sub.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_f16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_f32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_f64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_i32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_i32_r_minMag.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_i64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_i64_r_minMag.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_ui32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_ui32_r_minMag.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_ui64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f128M_to_ui64_r_minMag.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f32_to_f128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/f64_to_f128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_add256M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addCarryM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addComplCarryM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addMagsF16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addMagsF32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_addMagsF64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_approxRecip32_1.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_approxRecipSqrt32_1.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_approxRecipSqrt_1Ks.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_approxRecip_1Ks.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_compare128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_compare96M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_countLeadingZeros16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_countLeadingZeros32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_countLeadingZeros64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_countLeadingZeros8.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_eq128.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_invalidF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_isNaNF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_le128.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_lt128.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mul128MTo256M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mul64To128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mulAddF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mulAddF16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mulAddF32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_mulAddF64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_negXM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normRoundPackMToF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normRoundPackToF16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normRoundPackToF32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normRoundPackToF64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normSubnormalF128SigM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normSubnormalF16Sig.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normSubnormalF32Sig.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_normSubnormalF64Sig.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_remStepMBy32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundMToI64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundMToUI64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundPackMToF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundPackToF16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundPackToF32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundPackToF64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundToI32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundToI64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundToUI32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_roundToUI64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftLeftM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftNormSigF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftRightJam256M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftRightJam32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftRightJam64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftRightJamM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shiftRightM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftLeft64To96M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftLeftM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftRightExtendM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftRightJam64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftRightJamM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_shortShiftRightM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_sub1XM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_sub256M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_subM.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_subMagsF16.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_subMagsF32.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_subMagsF64.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/s_tryPropagateNaNF128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/softfloat_state.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/ui32_to_f128M.c"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/ui64_to_f128M.c"
)
add_library(embedded_softfloat ${EMBEDDED_SOFTFLOAT_SOURCES})
if(MSVC)
set_target_properties(embedded_softfloat PROPERTIES
COMPILE_FLAGS "-std=c99"
)
else()
set_target_properties(embedded_softfloat PROPERTIES
COMPILE_FLAGS "-std=c99"
)
endif()
target_include_directories(embedded_softfloat PUBLIC
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d-prebuilt"
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/8086"
)
include_directories("${CMAKE_SOURCE_DIR}/deps/SoftFloat-3d/source/include")
set(SOFTFLOAT_LIBRARIES embedded_softfloat)

find_package(Threads)

set(ZIG_SOURCES
"${CMAKE_SOURCE_DIR}/src/analyze.cpp"
Expand Down Expand Up @@ -241,18 +364,14 @@ set_target_properties(zig PROPERTIES
)

target_link_libraries(zig LINK_PUBLIC
${SOFTFLOAT_LIBRARIES}
${CLANG_LIBRARIES}
${LLD_LIBRARIES}
${LLVM_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
${PLATFORM_LIBRARIES}
)
if(MSVC)
if(MSVC OR MINGW)
target_link_libraries(zig LINK_PUBLIC version)
elseif(MINGW)
target_link_libraries(zig LINK_PUBLIC version quadmath)
else()
target_link_libraries(zig LINK_PUBLIC quadmath)
endif()
install(TARGETS zig DESTINATION bin)

Expand Down
16 changes: 2 additions & 14 deletions ci/travis_osx_install
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,6 @@

set -x

brew install gcc@7
brew outdated gcc@7 || brew upgrade gcc@7
brew link --overwrite gcc@7
brew install llvm@5
brew outdated llvm@5 || brew upgrade llvm@5

SRC_DIR=$(pwd)
PREFIX_DIR=$HOME/local/llvm5
export CC=/usr/local/opt/gcc/bin/gcc-7
export CXX=/usr/local/opt/gcc/bin/g++-7

mkdir -p $HOME/local
cd $HOME/local
wget http://s3.amazonaws.com/superjoe/temp/llvm5.tar.xz
tar xfp llvm5.tar.xz

cd $SRC_DIR
7 changes: 1 addition & 6 deletions ci/travis_osx_script
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,9 @@

set -x

PREFIX_DIR=$HOME/local/llvm5
export CC=/usr/local/opt/gcc/bin/gcc-7
export CXX=/usr/local/opt/gcc/bin/g++-7

echo $PATH
mkdir build
cd build
cmake .. -DCMAKE_PREFIX_PATH=$PREFIX_DIR -DCMAKE_INSTALL_PREFIX=$(pwd) -DZIG_LIBC_LIB_DIR=$(dirname $($CC -print-file-name=crt1.o)) -DZIG_LIBC_INCLUDE_DIR=$(echo -n | $CC -E -x c - -v 2>&1 | grep -B1 "End of search list." | head -n1 | cut -c 2- | sed "s/ .*//") -DZIG_LIBC_STATIC_LIB_DIR=$(dirname $($CC -print-file-name=crtbegin.o)) -DZIG_FORCE_EXTERNAL_LLD=ON
cmake .. -DCMAKE_PREFIX_PATH=/usr/local/opt/llvm@5/ -DCMAKE_INSTALL_PREFIX=$(pwd) -DZIG_LIBC_LIB_DIR=$(dirname $($CC -print-file-name=crt1.o)) -DZIG_LIBC_INCLUDE_DIR=$(echo -n | $CC -E -x c - -v 2>&1 | grep -B1 "End of search list." | head -n1 | cut -c 2- | sed "s/ .*//") -DZIG_LIBC_STATIC_LIB_DIR=$(dirname $($CC -print-file-name=crtbegin.o))
make VERBOSE=1
make install
./zig build --build-file ../build.zig test
93 changes: 93 additions & 0 deletions deps/SoftFloat-3d-prebuilt/platform.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#ifndef ZIG_DEP_SOFTFLOAT_PLATFORM_H
#define ZIG_DEP_SOFTFLOAT_PLATFORM_H

#if defined(__BIG_ENDIAN__)
#define BIGENDIAN 1
#elif defined(__ARMEB__)
#define BIGENDIAN 1
#elif defined(__THUMBEB__)
#define BIGENDIAN 1
#elif defined(__AARCH64EB__)
#define BIGENDIAN 1
#elif defined(_MIPSEB)
#define BIGENDIAN 1
#elif defined(__MIPSEB)
#define BIGENDIAN 1
#elif defined(__MIPSEB__)
#define BIGENDIAN 1
#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define BIGENDIAN 1
#elif defined(_BIG_ENDIAN)
#define BIGENDIAN 1
#elif defined(__sparc)
#define BIGENDIAN 1
#elif defined(__sparc__)
#define BIGENDIAN 1
#elif defined(_POWER)
#define BIGENDIAN 1
#elif defined(__powerpc__)
#define BIGENDIAN 1
#elif defined(__ppc__)
#define BIGENDIAN 1
#elif defined(__hpux)
#define BIGENDIAN 1
#elif defined(__hppa)
#define BIGENDIAN 1
#elif defined(_POWER)
#define BIGENDIAN 1
#elif defined(__s390__)
#define BIGENDIAN 1
#elif defined(__LITTLE_ENDIAN__)
#define LITTLEENDIAN 1
#elif defined(__ARMEL__)
#define LITTLEENDIAN 1
#elif defined(__THUMBEL__)
#define LITTLEENDIAN 1
#elif defined(__AARCH64EL__)
#define LITTLEENDIAN 1
#elif defined(_MIPSEL)
#define LITTLEENDIAN 1
#elif defined(__MIPSEL)
#define LITTLEENDIAN 1
#elif defined(__MIPSEL__)
#define LITTLEENDIAN 1
#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define LITTLEENDIAN 1
#elif defined(_LITTLE_ENDIAN)
#define LITTLEENDIAN 1
#elif defined(__i386__)
#define LITTLEENDIAN 1
#elif defined(__alpha__)
#define LITTLEENDIAN 1
#elif defined(__ia64)
#define LITTLEENDIAN 1
#elif defined(__ia64__)
#define LITTLEENDIAN 1
#elif defined(_M_IX86)
#define LITTLEENDIAN 1
#elif defined(_M_IA64)
#define LITTLEENDIAN 1
#elif defined(_M_ALPHA)
#define LITTLEENDIAN 1
#elif defined(__amd64)
#define LITTLEENDIAN 1
#elif defined(__amd64__)
#define LITTLEENDIAN 1
#elif defined(_M_AMD64)
#define LITTLEENDIAN 1
#elif defined(__x86_64)
#define LITTLEENDIAN 1
#elif defined(__x86_64__)
#define LITTLEENDIAN 1
#elif defined(_M_X64)
#define LITTLEENDIAN 1
#elif defined(__bfin__)
#define LITTLEENDIAN 1
#else
#error unable to detect endianness
#endif

#define INLINE inline
#define THREAD_LOCAL __thread

#endif
2 changes: 1 addition & 1 deletion src/all_types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ struct ConstExprValue {
BigFloat x_bigfloat;
float x_f32;
double x_f64;
__float128 x_f128;
float128_t x_f128;
bool x_bool;
ConstFn x_fn;
ConstBoundFnValue x_bound_fn;
Expand Down
15 changes: 10 additions & 5 deletions src/analyze.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
#include "ir_print.hpp"
#include "os.hpp"
#include "parser.hpp"
#include "quadmath.hpp"
#include "softfloat.hpp"
#include "zig_llvm.hpp"


static const size_t default_backward_branch_quota = 1000;

static void resolve_enum_type(CodeGen *g, TypeTableEntry *enum_type);
Expand Down Expand Up @@ -3462,7 +3463,7 @@ static uint32_t hash_const_val(ConstExprValue *const_val) {
}
case TypeTableEntryIdNumLitFloat:
{
__float128 f128 = bigfloat_to_f128(&const_val->data.x_bigfloat);
float128_t f128 = bigfloat_to_f128(&const_val->data.x_bigfloat);
uint32_t ints[4];
memcpy(&ints[0], &f128, 16);
return ints[0] ^ ints[1] ^ ints[2] ^ ints[3] ^ 0xed8b3dfb;
Expand Down Expand Up @@ -3778,7 +3779,7 @@ void init_const_float(ConstExprValue *const_val, TypeTableEntry *type, double va
const_val->data.x_f64 = value;
break;
case 128:
// if we need this, we should add a function that accepts a __float128 param
// if we need this, we should add a function that accepts a float128_t param
zig_unreachable();
default:
zig_unreachable();
Expand Down Expand Up @@ -4035,7 +4036,7 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {
case 64:
return a->data.x_f64 == b->data.x_f64;
case 128:
return a->data.x_f128 == b->data.x_f128;
return f128M_eq(&a->data.x_f128, &b->data.x_f128);
default:
zig_unreachable();
}
Expand Down Expand Up @@ -4222,7 +4223,11 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) {
const size_t extra_len = 100;
size_t old_len = buf_len(buf);
buf_resize(buf, old_len + extra_len);
int len = quadmath_snprintf(buf_ptr(buf) + old_len, extra_len, "%Qf", const_val->data.x_f128);
float64_t f64_value = f128M_to_f64(&const_val->data.x_f128);
double double_value;
memcpy(&double_value, &f64_value, sizeof(double));
// TODO actual f128 printing to decimal
int len = snprintf(buf_ptr(buf) + old_len, extra_len, "%f", double_value);
assert(len > 0);
buf_resize(buf, old_len + len);
return;
Expand Down
Loading

0 comments on commit 14cda27

Please sign in to comment.