Auto merge of #63649 - tlively:emscripten-upstream-upgrade, r=alexcrichton
Upgrade Emscripten targets to use upstream LLVM backend - Refactors the Emscripten target spec to share code with other wasm targets. - Replaces the incorrect wasm32 C call ABI with the old asmjs version, which is correct for both wasm32 and JS. - Updates the varargs ABI used by Emscripten and deletes the old one. - Removes the obsolete wasm32-experimental-emscripten target. - Temporarily makes Emscripten targets use panic=abort by default because supporting unwinding will require an LLVM patch.
This commit is contained in:
commit
7870050796
142 changed files with 377 additions and 537 deletions
|
@ -377,6 +377,7 @@
|
||||||
# but you can also optionally enable the "emscripten" backend for asm.js or
|
# but you can also optionally enable the "emscripten" backend for asm.js or
|
||||||
# make this an empty array (but that probably won't get too far in the
|
# make this an empty array (but that probably won't get too far in the
|
||||||
# bootstrap)
|
# bootstrap)
|
||||||
|
# FIXME: remove the obsolete emscripten backend option.
|
||||||
#codegen-backends = ["llvm"]
|
#codegen-backends = ["llvm"]
|
||||||
|
|
||||||
# This is the name of the directory in which codegen backends will get installed
|
# This is the name of the directory in which codegen backends will get installed
|
||||||
|
|
|
@ -970,6 +970,7 @@ impl<'a> Builder<'a> {
|
||||||
Some("-Wl,-rpath,@loader_path/../lib")
|
Some("-Wl,-rpath,@loader_path/../lib")
|
||||||
} else if !target.contains("windows") &&
|
} else if !target.contains("windows") &&
|
||||||
!target.contains("wasm32") &&
|
!target.contains("wasm32") &&
|
||||||
|
!target.contains("emscripten") &&
|
||||||
!target.contains("fuchsia") {
|
!target.contains("fuchsia") {
|
||||||
Some("-Wl,-rpath,$ORIGIN/../lib")
|
Some("-Wl,-rpath,$ORIGIN/../lib")
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1047,10 +1047,11 @@ impl Step for Compiletest {
|
||||||
// Also provide `rust_test_helpers` for the host.
|
// Also provide `rust_test_helpers` for the host.
|
||||||
builder.ensure(native::TestHelpers { target: compiler.host });
|
builder.ensure(native::TestHelpers { target: compiler.host });
|
||||||
|
|
||||||
// wasm32 can't build the test helpers
|
// As well as the target, except for plain wasm32, which can't build it
|
||||||
if !target.contains("wasm32") {
|
if !target.contains("wasm32") || target.contains("emscripten") {
|
||||||
builder.ensure(native::TestHelpers { target });
|
builder.ensure(native::TestHelpers { target });
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.ensure(RemoteCopyLibs { compiler, target });
|
builder.ensure(RemoteCopyLibs { compiler, target });
|
||||||
|
|
||||||
let mut cmd = builder.tool_cmd(Tool::Compiletest);
|
let mut cmd = builder.tool_cmd(Tool::Compiletest);
|
||||||
|
|
|
@ -11,7 +11,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
cmake \
|
cmake \
|
||||||
sudo \
|
sudo \
|
||||||
gdb \
|
gdb \
|
||||||
xz-utils
|
xz-utils \
|
||||||
|
bzip2
|
||||||
|
|
||||||
COPY scripts/emscripten.sh /scripts/
|
COPY scripts/emscripten.sh /scripts/
|
||||||
RUN bash /scripts/emscripten.sh
|
RUN bash /scripts/emscripten.sh
|
||||||
|
@ -20,28 +21,16 @@ COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/emsdk-portable
|
ENV PATH=$PATH:/emsdk-portable
|
||||||
ENV PATH=$PATH:/emsdk-portable/clang/e1.38.15_64bit/
|
ENV PATH=$PATH:/emsdk-portable/upstream/emscripten/
|
||||||
ENV PATH=$PATH:/emsdk-portable/emscripten/1.38.15/
|
ENV PATH=$PATH:/emsdk-portable/node/12.9.1_64bit/bin/
|
||||||
ENV PATH=$PATH:/emsdk-portable/node/8.9.1_64bit/bin/
|
ENV BINARYEN_ROOT=/emsdk-portable/upstream/
|
||||||
ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.38.15/
|
|
||||||
ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.38.15_64bit/binaryen/
|
|
||||||
ENV EM_CONFIG=/emsdk-portable/.emscripten
|
ENV EM_CONFIG=/emsdk-portable/.emscripten
|
||||||
|
|
||||||
ENV TARGETS=asmjs-unknown-emscripten
|
ENV TARGETS=asmjs-unknown-emscripten
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-emscripten --disable-optimize-tests
|
ENV SCRIPT python2.7 ../x.py test --target $TARGETS
|
||||||
|
|
||||||
ENV SCRIPT python2.7 ../x.py test --target $TARGETS \
|
# This is almost identical to the wasm32-unknown-emscripten target, so
|
||||||
src/test/ui \
|
# running with assertions again is not useful
|
||||||
src/test/run-fail \
|
|
||||||
src/libstd \
|
|
||||||
src/liballoc \
|
|
||||||
src/libcore
|
|
||||||
|
|
||||||
# Debug assertions in rustc are largely covered by other builders, and LLVM
|
|
||||||
# assertions cause this builder to slow down by quite a large amount and don't
|
|
||||||
# buy us a huge amount over other builders (not sure if we've ever seen an
|
|
||||||
# asmjs-specific backend assertion trip), so disable assertions for these
|
|
||||||
# tests.
|
|
||||||
ENV NO_LLVM_ASSERTIONS=1
|
|
||||||
ENV NO_DEBUG_ASSERTIONS=1
|
ENV NO_DEBUG_ASSERTIONS=1
|
||||||
|
ENV NO_LLVM_ASSERTIONS=1
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
FROM ubuntu:16.04
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
g++ \
|
|
||||||
make \
|
|
||||||
file \
|
|
||||||
curl \
|
|
||||||
ca-certificates \
|
|
||||||
python \
|
|
||||||
git \
|
|
||||||
cmake \
|
|
||||||
sudo \
|
|
||||||
gdb \
|
|
||||||
xz-utils \
|
|
||||||
jq \
|
|
||||||
bzip2
|
|
||||||
|
|
||||||
# emscripten
|
|
||||||
COPY scripts/emscripten-wasm.sh /scripts/
|
|
||||||
COPY wasm32-exp/node.sh /usr/local/bin/node
|
|
||||||
RUN bash /scripts/emscripten-wasm.sh
|
|
||||||
|
|
||||||
# cache
|
|
||||||
COPY scripts/sccache.sh /scripts/
|
|
||||||
RUN sh /scripts/sccache.sh
|
|
||||||
|
|
||||||
# env
|
|
||||||
ENV PATH=/wasm-install/emscripten:/wasm-install/bin:$PATH
|
|
||||||
ENV EM_CONFIG=/root/.emscripten
|
|
||||||
|
|
||||||
ENV TARGETS=wasm32-experimental-emscripten
|
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --experimental-targets=WebAssembly
|
|
||||||
|
|
||||||
ENV SCRIPT python2.7 ../x.py test --target $TARGETS
|
|
|
@ -1,9 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
path="$(dirname $1)"
|
|
||||||
file="$(basename $1)"
|
|
||||||
|
|
||||||
shift
|
|
||||||
|
|
||||||
cd "$path"
|
|
||||||
exec /node-v8.0.0-linux-x64/bin/node "$file" "$@"
|
|
|
@ -11,9 +11,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
cmake \
|
cmake \
|
||||||
sudo \
|
sudo \
|
||||||
gdb \
|
gdb \
|
||||||
xz-utils
|
xz-utils \
|
||||||
|
bzip2
|
||||||
|
|
||||||
# emscripten
|
|
||||||
COPY scripts/emscripten.sh /scripts/
|
COPY scripts/emscripten.sh /scripts/
|
||||||
RUN bash /scripts/emscripten.sh
|
RUN bash /scripts/emscripten.sh
|
||||||
|
|
||||||
|
@ -21,12 +21,18 @@ COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/emsdk-portable
|
ENV PATH=$PATH:/emsdk-portable
|
||||||
ENV PATH=$PATH:/emsdk-portable/clang/e1.38.15_64bit/
|
ENV PATH=$PATH:/emsdk-portable/upstream/emscripten/
|
||||||
ENV PATH=$PATH:/emsdk-portable/emscripten/1.38.15/
|
ENV PATH=$PATH:/emsdk-portable/node/12.9.1_64bit/bin/
|
||||||
ENV PATH=$PATH:/emsdk-portable/node/8.9.1_64bit/bin/
|
ENV BINARYEN_ROOT=/emsdk-portable/upstream/
|
||||||
ENV EMSCRIPTEN=/emsdk-portable/emscripten/1.38.15/
|
|
||||||
ENV BINARYEN_ROOT=/emsdk-portable/clang/e1.38.15_64bit/binaryen/
|
|
||||||
ENV EM_CONFIG=/emsdk-portable/.emscripten
|
ENV EM_CONFIG=/emsdk-portable/.emscripten
|
||||||
|
|
||||||
ENV TARGETS=wasm32-unknown-emscripten
|
ENV TARGETS=wasm32-unknown-emscripten
|
||||||
ENV SCRIPT python2.7 ../x.py test --target $TARGETS
|
|
||||||
|
# FIXME: Re-enable these tests once Cargo stops trying to execute wasms
|
||||||
|
ENV SCRIPT python2.7 ../x.py test --target $TARGETS \
|
||||||
|
--exclude src/libcore \
|
||||||
|
--exclude src/liballoc \
|
||||||
|
--exclude src/libproc_macro \
|
||||||
|
--exclude src/libstd \
|
||||||
|
--exclude src/libterm \
|
||||||
|
--exclude src/libtest
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
set -ex
|
|
||||||
|
|
||||||
hide_output() {
|
|
||||||
set +x
|
|
||||||
on_err="
|
|
||||||
echo ERROR: An error was encountered with the build.
|
|
||||||
cat /tmp/build.log
|
|
||||||
exit 1
|
|
||||||
"
|
|
||||||
trap "$on_err" ERR
|
|
||||||
bash -c "while true; do sleep 30; echo \$(date) - building ...; done" &
|
|
||||||
PING_LOOP_PID=$!
|
|
||||||
$@ &> /tmp/build.log
|
|
||||||
trap - ERR
|
|
||||||
kill $PING_LOOP_PID
|
|
||||||
rm -f /tmp/build.log
|
|
||||||
set -x
|
|
||||||
}
|
|
||||||
|
|
||||||
# Download last known good emscripten from WebAssembly waterfall
|
|
||||||
BUILD=$(curl -fL https://storage.googleapis.com/wasm-llvm/builds/linux/lkgr.json | \
|
|
||||||
jq '.build | tonumber')
|
|
||||||
curl -sL https://storage.googleapis.com/wasm-llvm/builds/linux/$BUILD/wasm-binaries.tbz2 | \
|
|
||||||
hide_output tar xvkj
|
|
||||||
|
|
||||||
# node 8 is required to run wasm
|
|
||||||
cd /
|
|
||||||
curl -sL https://nodejs.org/dist/v8.0.0/node-v8.0.0-linux-x64.tar.xz | \
|
|
||||||
tar -xJ
|
|
||||||
|
|
||||||
# Make emscripten use wasm-ready node and LLVM tools
|
|
||||||
echo "EMSCRIPTEN_ROOT = '/wasm-install/emscripten'" >> /root/.emscripten
|
|
||||||
echo "NODE_JS='/usr/local/bin/node'" >> /root/.emscripten
|
|
||||||
echo "LLVM_ROOT='/wasm-install/bin'" >> /root/.emscripten
|
|
||||||
echo "BINARYEN_ROOT = '/wasm-install'" >> /root/.emscripten
|
|
||||||
echo "COMPILER_ENGINE = NODE_JS" >> /root/.emscripten
|
|
||||||
echo "JS_ENGINES = [NODE_JS]" >> /root/.emscripten
|
|
|
@ -17,20 +17,15 @@ exit 1
|
||||||
set -x
|
set -x
|
||||||
}
|
}
|
||||||
|
|
||||||
cd /
|
git clone https://github.com/emscripten-core/emsdk.git /emsdk-portable
|
||||||
curl -fL https://mozilla-games.s3.amazonaws.com/emscripten/releases/emsdk-portable.tar.gz | \
|
|
||||||
tar -xz
|
|
||||||
|
|
||||||
cd /emsdk-portable
|
cd /emsdk-portable
|
||||||
./emsdk update
|
hide_output ./emsdk install 1.38.46-upstream
|
||||||
hide_output ./emsdk install sdk-1.38.15-64bit
|
./emsdk activate 1.38.46-upstream
|
||||||
./emsdk activate sdk-1.38.15-64bit
|
|
||||||
|
|
||||||
# Compile and cache libc
|
# Compile and cache libc
|
||||||
source ./emsdk_env.sh
|
source ./emsdk_env.sh
|
||||||
echo "main(){}" > a.c
|
echo "main(){}" > a.c
|
||||||
HOME=/emsdk-portable/ emcc a.c
|
HOME=/emsdk-portable/ emcc a.c
|
||||||
HOME=/emsdk-portable/ emcc -s BINARYEN=1 a.c
|
|
||||||
rm -f a.*
|
rm -f a.*
|
||||||
|
|
||||||
# Make emsdk usable by any user
|
# Make emsdk usable by any user
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
use std::cmp;
|
|
||||||
use std::collections::BinaryHeap;
|
use std::collections::BinaryHeap;
|
||||||
use std::collections::binary_heap::{Drain, PeekMut};
|
use std::collections::binary_heap::{Drain, PeekMut};
|
||||||
use std::panic::{self, AssertUnwindSafe};
|
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
||||||
|
|
||||||
use rand::{thread_rng, seq::SliceRandom};
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_iterator() {
|
fn test_iterator() {
|
||||||
|
@ -281,9 +276,15 @@ fn assert_covariance() {
|
||||||
// even if the order may not be correct.
|
// even if the order may not be correct.
|
||||||
//
|
//
|
||||||
// Destructors must be called exactly once per element.
|
// Destructors must be called exactly once per element.
|
||||||
|
// FIXME: re-enable emscripten once it can unwind again
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(not(miri))] // Miri does not support catching panics
|
#[cfg(not(any(miri, target_os = "emscripten")))] // Miri does not support catching panics
|
||||||
fn panic_safe() {
|
fn panic_safe() {
|
||||||
|
use std::cmp;
|
||||||
|
use std::panic::{self, AssertUnwindSafe};
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
use rand::{thread_rng, seq::SliceRandom};
|
||||||
|
|
||||||
static DROP_COUNTER: AtomicUsize = AtomicUsize::new(0);
|
static DROP_COUNTER: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Ord, Clone, Debug)]
|
#[derive(Eq, PartialEq, Ord, Clone, Debug)]
|
||||||
|
|
|
@ -483,7 +483,7 @@ mod slice_index {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(not(target_arch = "asmjs"))] // hits an OOM
|
#[cfg(not(target_os = "emscripten"))] // hits an OOM
|
||||||
#[cfg(not(miri))] // Miri is too slow
|
#[cfg(not(miri))] // Miri is too slow
|
||||||
fn simple_big() {
|
fn simple_big() {
|
||||||
fn a_million_letter_x() -> String {
|
fn a_million_letter_x() -> String {
|
||||||
|
|
10
src/liballoc/tests/str.rs.rej
Normal file
10
src/liballoc/tests/str.rs.rej
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
diff a/src/liballoc/tests/str.rs b/src/liballoc/tests/str.rs (rejected hunks)
|
||||||
|
@@ -483,7 +483,7 @@ mod slice_index {
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
- #[cfg(not(target_arch = "asmjs"))] // hits an OOM
|
||||||
|
+ #[cfg(not(target_arch = "js"))] // hits an OOM
|
||||||
|
#[cfg(not(miri))] // Miri is too slow
|
||||||
|
fn simple_big() {
|
||||||
|
fn a_million_letter_x() -> String {
|
|
@ -944,8 +944,10 @@ fn drain_filter_complex() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Miri does not support catching panics
|
||||||
|
// FIXME: re-enable emscripten once it can unwind again
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(not(miri))] // Miri does not support catching panics
|
#[cfg(not(any(miri, target_os = "emscripten")))]
|
||||||
fn drain_filter_consumed_panic() {
|
fn drain_filter_consumed_panic() {
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
@ -995,8 +997,9 @@ fn drain_filter_consumed_panic() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Re-enable emscripten once it can catch panics
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(not(miri))] // Miri does not support catching panics
|
#[cfg(not(any(miri, target_os = "emscripten")))] // Miri does not support catching panics
|
||||||
fn drain_filter_unconsumed_panic() {
|
fn drain_filter_unconsumed_panic() {
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
|
|
@ -49,8 +49,10 @@ impl fmt::Debug for c_void {
|
||||||
/// Basic implementation of a `va_list`.
|
/// Basic implementation of a `va_list`.
|
||||||
// The name is WIP, using `VaListImpl` for now.
|
// The name is WIP, using `VaListImpl` for now.
|
||||||
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
||||||
not(target_arch = "x86_64"), not(target_arch = "asmjs")),
|
not(target_arch = "x86_64")),
|
||||||
all(target_arch = "aarch64", target_os = "ios"),
|
all(target_arch = "aarch64", target_os = "ios"),
|
||||||
|
target_arch = "wasm32",
|
||||||
|
target_arch = "asmjs",
|
||||||
windows))]
|
windows))]
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[unstable(feature = "c_variadic",
|
#[unstable(feature = "c_variadic",
|
||||||
|
@ -67,8 +69,10 @@ pub struct VaListImpl<'f> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
||||||
not(target_arch = "x86_64"), not(target_arch = "asmjs")),
|
not(target_arch = "x86_64")),
|
||||||
all(target_arch = "aarch64", target_os = "ios"),
|
all(target_arch = "aarch64", target_os = "ios"),
|
||||||
|
target_arch = "wasm32",
|
||||||
|
target_arch = "asmjs",
|
||||||
windows))]
|
windows))]
|
||||||
#[unstable(feature = "c_variadic",
|
#[unstable(feature = "c_variadic",
|
||||||
reason = "the `c_variadic` feature has not been properly tested on \
|
reason = "the `c_variadic` feature has not been properly tested on \
|
||||||
|
@ -137,38 +141,6 @@ pub struct VaListImpl<'f> {
|
||||||
_marker: PhantomData<&'f mut &'f c_void>,
|
_marker: PhantomData<&'f mut &'f c_void>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// asm.js ABI implementation of a `va_list`.
|
|
||||||
// asm.js uses the PNaCl ABI, which specifies that a `va_list` is
|
|
||||||
// an array of 4 32-bit integers, according to the old PNaCl docs at
|
|
||||||
// https://web.archive.org/web/20130518054430/https://www.chromium.org/nativeclient/pnacl/bitcode-abi#TOC-Derived-Types
|
|
||||||
// and clang does the same in `CreatePNaClABIBuiltinVaListDecl` from `lib/AST/ASTContext.cpp`
|
|
||||||
#[cfg(all(target_arch = "asmjs", not(windows)))]
|
|
||||||
#[repr(C)]
|
|
||||||
#[unstable(feature = "c_variadic",
|
|
||||||
reason = "the `c_variadic` feature has not been properly tested on \
|
|
||||||
all supported platforms",
|
|
||||||
issue = "44930")]
|
|
||||||
#[lang = "va_list"]
|
|
||||||
pub struct VaListImpl<'f> {
|
|
||||||
inner: [crate::mem::MaybeUninit<i32>; 4],
|
|
||||||
_marker: PhantomData<&'f mut &'f c_void>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(all(target_arch = "asmjs", not(windows)))]
|
|
||||||
#[unstable(feature = "c_variadic",
|
|
||||||
reason = "the `c_variadic` feature has not been properly tested on \
|
|
||||||
all supported platforms",
|
|
||||||
issue = "44930")]
|
|
||||||
impl<'f> fmt::Debug for VaListImpl<'f> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
unsafe {
|
|
||||||
write!(f, "va_list* [{:#x}, {:#x}, {:#x}, {:#x}]",
|
|
||||||
self.inner[0].read(), self.inner[1].read(),
|
|
||||||
self.inner[2].read(), self.inner[3].read())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A wrapper for a `va_list`
|
/// A wrapper for a `va_list`
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -178,14 +150,18 @@ impl<'f> fmt::Debug for VaListImpl<'f> {
|
||||||
issue = "44930")]
|
issue = "44930")]
|
||||||
pub struct VaList<'a, 'f: 'a> {
|
pub struct VaList<'a, 'f: 'a> {
|
||||||
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
||||||
not(target_arch = "x86_64"), not(target_arch = "asmjs")),
|
not(target_arch = "x86_64")),
|
||||||
all(target_arch = "aarch64", target_os = "ios"),
|
all(target_arch = "aarch64", target_os = "ios"),
|
||||||
|
target_arch = "wasm32",
|
||||||
|
target_arch = "asmjs",
|
||||||
windows))]
|
windows))]
|
||||||
inner: VaListImpl<'f>,
|
inner: VaListImpl<'f>,
|
||||||
|
|
||||||
#[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
|
#[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
|
||||||
target_arch = "x86_64", target_arch = "asmjs"),
|
target_arch = "x86_64"),
|
||||||
any(not(target_arch = "aarch64"), not(target_os = "ios")),
|
any(not(target_arch = "aarch64"), not(target_os = "ios")),
|
||||||
|
not(target_arch = "wasm32"),
|
||||||
|
not(target_arch = "asmjs"),
|
||||||
not(windows)))]
|
not(windows)))]
|
||||||
inner: &'a mut VaListImpl<'f>,
|
inner: &'a mut VaListImpl<'f>,
|
||||||
|
|
||||||
|
@ -193,8 +169,10 @@ pub struct VaList<'a, 'f: 'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
#[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
|
||||||
not(target_arch = "x86_64"), not(target_arch = "asmjs")),
|
not(target_arch = "x86_64")),
|
||||||
all(target_arch = "aarch64", target_os = "ios"),
|
all(target_arch = "aarch64", target_os = "ios"),
|
||||||
|
target_arch = "wasm32",
|
||||||
|
target_arch = "asmjs",
|
||||||
windows))]
|
windows))]
|
||||||
#[unstable(feature = "c_variadic",
|
#[unstable(feature = "c_variadic",
|
||||||
reason = "the `c_variadic` feature has not been properly tested on \
|
reason = "the `c_variadic` feature has not been properly tested on \
|
||||||
|
@ -212,8 +190,10 @@ impl<'f> VaListImpl<'f> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
|
#[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
|
||||||
target_arch = "x86_64", target_arch = "asmjs"),
|
target_arch = "x86_64"),
|
||||||
any(not(target_arch = "aarch64"), not(target_os = "ios")),
|
any(not(target_arch = "aarch64"), not(target_os = "ios")),
|
||||||
|
not(target_arch = "wasm32"),
|
||||||
|
not(target_arch = "asmjs"),
|
||||||
not(windows)))]
|
not(windows)))]
|
||||||
#[unstable(feature = "c_variadic",
|
#[unstable(feature = "c_variadic",
|
||||||
reason = "the `c_variadic` feature has not been properly tested on \
|
reason = "the `c_variadic` feature has not been properly tested on \
|
||||||
|
|
|
@ -114,24 +114,8 @@ pub fn black_box<T>(dummy: T) -> T {
|
||||||
// this. LLVM's intepretation of inline assembly is that it's, well, a black
|
// this. LLVM's intepretation of inline assembly is that it's, well, a black
|
||||||
// box. This isn't the greatest implementation since it probably deoptimizes
|
// box. This isn't the greatest implementation since it probably deoptimizes
|
||||||
// more than we want, but it's so far good enough.
|
// more than we want, but it's so far good enough.
|
||||||
#[cfg(not(any(
|
|
||||||
target_arch = "asmjs",
|
|
||||||
all(
|
|
||||||
target_arch = "wasm32",
|
|
||||||
target_os = "emscripten"
|
|
||||||
)
|
|
||||||
)))]
|
|
||||||
unsafe {
|
unsafe {
|
||||||
asm!("" : : "r"(&dummy));
|
asm!("" : : "r"(&dummy));
|
||||||
return dummy;
|
return dummy;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not all platforms support inline assembly so try to do something without
|
|
||||||
// inline assembly which in theory still hinders at least some optimizations
|
|
||||||
// on those targets. This is the "best effort" scenario.
|
|
||||||
unsafe {
|
|
||||||
let ret = crate::ptr::read_volatile(&dummy);
|
|
||||||
crate::mem::forget(dummy);
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,8 +257,7 @@ pub fn target_feature_whitelist(sess: &Session)
|
||||||
"hexagon" => HEXAGON_WHITELIST,
|
"hexagon" => HEXAGON_WHITELIST,
|
||||||
"mips" | "mips64" => MIPS_WHITELIST,
|
"mips" | "mips64" => MIPS_WHITELIST,
|
||||||
"powerpc" | "powerpc64" => POWERPC_WHITELIST,
|
"powerpc" | "powerpc64" => POWERPC_WHITELIST,
|
||||||
// wasm32 on emscripten does not support these target features
|
"wasm32" => WASM_WHITELIST,
|
||||||
"wasm32" if !sess.target.target.options.is_like_emscripten => WASM_WHITELIST,
|
|
||||||
_ => &[],
|
_ => &[],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,15 +142,12 @@ impl ModuleConfig {
|
||||||
// Copy what clang does by turning on loop vectorization at O2 and
|
// Copy what clang does by turning on loop vectorization at O2 and
|
||||||
// slp vectorization at O3. Otherwise configure other optimization aspects
|
// slp vectorization at O3. Otherwise configure other optimization aspects
|
||||||
// of this pass manager builder.
|
// of this pass manager builder.
|
||||||
// Turn off vectorization for emscripten, as it's not very well supported.
|
|
||||||
self.vectorize_loop = !sess.opts.cg.no_vectorize_loops &&
|
self.vectorize_loop = !sess.opts.cg.no_vectorize_loops &&
|
||||||
(sess.opts.optimize == config::OptLevel::Default ||
|
(sess.opts.optimize == config::OptLevel::Default ||
|
||||||
sess.opts.optimize == config::OptLevel::Aggressive) &&
|
sess.opts.optimize == config::OptLevel::Aggressive);
|
||||||
!sess.target.target.options.is_like_emscripten;
|
|
||||||
|
|
||||||
self.vectorize_slp = !sess.opts.cg.no_vectorize_slp &&
|
self.vectorize_slp = !sess.opts.cg.no_vectorize_slp &&
|
||||||
sess.opts.optimize == config::OptLevel::Aggressive &&
|
sess.opts.optimize == config::OptLevel::Aggressive;
|
||||||
!sess.target.target.options.is_like_emscripten;
|
|
||||||
|
|
||||||
// Some targets (namely, NVPTX) interact badly with the MergeFunctions
|
// Some targets (namely, NVPTX) interact badly with the MergeFunctions
|
||||||
// pass. This is because MergeFunctions can generate new function calls
|
// pass. This is because MergeFunctions can generate new function calls
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
use crate::abi::call::{FnType, ArgType, Uniform};
|
|
||||||
use crate::abi::{HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods};
|
|
||||||
|
|
||||||
// Data layout: e-p:32:32-i64:64-v128:32:128-n32-S128
|
|
||||||
|
|
||||||
// See the https://github.com/kripken/emscripten-fastcomp-clang repository.
|
|
||||||
// The class `EmscriptenABIInfo` in `/lib/CodeGen/TargetInfo.cpp` contains the ABI definitions.
|
|
||||||
|
|
||||||
fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'a, Ty>)
|
|
||||||
where Ty: TyLayoutMethods<'a, C> + Copy,
|
|
||||||
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
|
||||||
{
|
|
||||||
if ret.layout.is_aggregate() {
|
|
||||||
if let Some(unit) = ret.layout.homogeneous_aggregate(cx).unit() {
|
|
||||||
let size = ret.layout.size;
|
|
||||||
if unit.size == size {
|
|
||||||
ret.cast_to(Uniform {
|
|
||||||
unit,
|
|
||||||
total: size
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.make_indirect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn classify_arg_ty<Ty>(arg: &mut ArgType<'_, Ty>) {
|
|
||||||
if arg.layout.is_aggregate() {
|
|
||||||
arg.make_indirect_byval();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
|
|
||||||
where Ty: TyLayoutMethods<'a, C> + Copy,
|
|
||||||
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
|
||||||
{
|
|
||||||
if !fty.ret.is_ignore() {
|
|
||||||
classify_ret_ty(cx, &mut fty.ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
for arg in &mut fty.args {
|
|
||||||
if arg.is_ignore() { continue; }
|
|
||||||
classify_arg_ty(arg);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,6 @@ use crate::spec::{self, HasTargetSpec};
|
||||||
mod aarch64;
|
mod aarch64;
|
||||||
mod amdgpu;
|
mod amdgpu;
|
||||||
mod arm;
|
mod arm;
|
||||||
mod asmjs;
|
|
||||||
mod hexagon;
|
mod hexagon;
|
||||||
mod mips;
|
mod mips;
|
||||||
mod mips64;
|
mod mips64;
|
||||||
|
@ -22,6 +21,7 @@ mod x86;
|
||||||
mod x86_64;
|
mod x86_64;
|
||||||
mod x86_win64;
|
mod x86_win64;
|
||||||
mod wasm32;
|
mod wasm32;
|
||||||
|
mod wasm32_bindgen_compat;
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||||
pub enum PassMode {
|
pub enum PassMode {
|
||||||
|
@ -557,14 +557,6 @@ impl<'a, Ty> FnType<'a, Ty> {
|
||||||
"powerpc" => powerpc::compute_abi_info(cx, self),
|
"powerpc" => powerpc::compute_abi_info(cx, self),
|
||||||
"powerpc64" => powerpc64::compute_abi_info(cx, self),
|
"powerpc64" => powerpc64::compute_abi_info(cx, self),
|
||||||
"s390x" => s390x::compute_abi_info(cx, self),
|
"s390x" => s390x::compute_abi_info(cx, self),
|
||||||
"asmjs" => asmjs::compute_abi_info(cx, self),
|
|
||||||
"wasm32" => {
|
|
||||||
if cx.target_spec().llvm_target.contains("emscripten") {
|
|
||||||
asmjs::compute_abi_info(cx, self)
|
|
||||||
} else {
|
|
||||||
wasm32::compute_abi_info(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"msp430" => msp430::compute_abi_info(self),
|
"msp430" => msp430::compute_abi_info(self),
|
||||||
"sparc" => sparc::compute_abi_info(cx, self),
|
"sparc" => sparc::compute_abi_info(cx, self),
|
||||||
"sparc64" => sparc64::compute_abi_info(cx, self),
|
"sparc64" => sparc64::compute_abi_info(cx, self),
|
||||||
|
@ -573,6 +565,9 @@ impl<'a, Ty> FnType<'a, Ty> {
|
||||||
"hexagon" => hexagon::compute_abi_info(self),
|
"hexagon" => hexagon::compute_abi_info(self),
|
||||||
"riscv32" => riscv::compute_abi_info(self, 32),
|
"riscv32" => riscv::compute_abi_info(self, 32),
|
||||||
"riscv64" => riscv::compute_abi_info(self, 64),
|
"riscv64" => riscv::compute_abi_info(self, 64),
|
||||||
|
"wasm32" if cx.target_spec().target_os != "emscripten"
|
||||||
|
=> wasm32_bindgen_compat::compute_abi_info(self),
|
||||||
|
"wasm32" | "asmjs" => wasm32::compute_abi_info(cx, self),
|
||||||
a => return Err(format!("unrecognized arch \"{}\" in target specification", a))
|
a => return Err(format!("unrecognized arch \"{}\" in target specification", a))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,60 @@
|
||||||
use crate::abi::call::{FnType, ArgType};
|
use crate::abi::call::{FnType, ArgType, Uniform};
|
||||||
|
use crate::abi::{HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods};
|
||||||
|
|
||||||
fn classify_ret_ty<Ty>(ret: &mut ArgType<'_, Ty>) {
|
fn unwrap_trivial_aggregate<'a, Ty, C>(cx: &C, val: &mut ArgType<'a, Ty>) -> bool
|
||||||
|
where Ty: TyLayoutMethods<'a, C> + Copy,
|
||||||
|
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
||||||
|
{
|
||||||
|
if val.layout.is_aggregate() {
|
||||||
|
if let Some(unit) = val.layout.homogeneous_aggregate(cx).unit() {
|
||||||
|
let size = val.layout.size;
|
||||||
|
if unit.size == size {
|
||||||
|
val.cast_to(Uniform {
|
||||||
|
unit,
|
||||||
|
total: size
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'a, Ty>)
|
||||||
|
where Ty: TyLayoutMethods<'a, C> + Copy,
|
||||||
|
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
||||||
|
{
|
||||||
ret.extend_integer_width_to(32);
|
ret.extend_integer_width_to(32);
|
||||||
|
if ret.layout.is_aggregate() {
|
||||||
|
if !unwrap_trivial_aggregate(cx, ret) {
|
||||||
|
ret.make_indirect();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn classify_arg_ty<Ty>(arg: &mut ArgType<'_, Ty>) {
|
fn classify_arg_ty<'a, Ty, C>(cx: &C, arg: &mut ArgType<'a, Ty>)
|
||||||
|
where Ty: TyLayoutMethods<'a, C> + Copy,
|
||||||
|
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
||||||
|
{
|
||||||
arg.extend_integer_width_to(32);
|
arg.extend_integer_width_to(32);
|
||||||
|
if arg.layout.is_aggregate() {
|
||||||
|
if !unwrap_trivial_aggregate(cx, arg) {
|
||||||
|
arg.make_indirect_byval();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compute_abi_info<Ty>(fty: &mut FnType<'_, Ty>) {
|
pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
|
||||||
|
where Ty: TyLayoutMethods<'a, C> + Copy,
|
||||||
|
C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
|
||||||
|
{
|
||||||
if !fty.ret.is_ignore() {
|
if !fty.ret.is_ignore() {
|
||||||
classify_ret_ty(&mut fty.ret);
|
classify_ret_ty(cx, &mut fty.ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
for arg in &mut fty.args {
|
for arg in &mut fty.args {
|
||||||
if arg.is_ignore() { continue; }
|
if arg.is_ignore() { continue; }
|
||||||
classify_arg_ty(arg);
|
classify_arg_ty(cx, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
27
src/librustc_target/abi/call/wasm32_bindgen_compat.rs
Normal file
27
src/librustc_target/abi/call/wasm32_bindgen_compat.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// This is not and has never been a correct C ABI for WebAssembly, but
|
||||||
|
// for a long time this was the C ABI that Rust used. wasm-bindgen
|
||||||
|
// depends on ABI details for this ABI and is incompatible with the
|
||||||
|
// correct C ABI, so this ABI is being kept around until wasm-bindgen
|
||||||
|
// can be fixed to work with the correct ABI. See #63649 for further
|
||||||
|
// discussion.
|
||||||
|
|
||||||
|
use crate::abi::call::{FnType, ArgType};
|
||||||
|
|
||||||
|
fn classify_ret_ty<Ty>(ret: &mut ArgType<'_, Ty>) {
|
||||||
|
ret.extend_integer_width_to(32);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn classify_arg_ty<Ty>(arg: &mut ArgType<'_, Ty>) {
|
||||||
|
arg.extend_integer_width_to(32);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn compute_abi_info<Ty>(fty: &mut FnType<'_, Ty>) {
|
||||||
|
if !fty.ret.is_ignore() {
|
||||||
|
classify_ret_ty(&mut fty.ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
for arg in &mut fty.args {
|
||||||
|
if arg.is_ignore() { continue; }
|
||||||
|
classify_arg_ty(arg);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,40 +1,10 @@
|
||||||
use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
|
use super::{LinkerFlavor, Target, wasm32_unknown_emscripten};
|
||||||
|
|
||||||
pub fn target() -> Result<Target, String> {
|
pub fn target() -> Result<Target, String> {
|
||||||
let mut args = LinkArgs::new();
|
let mut target = wasm32_unknown_emscripten::target()?;
|
||||||
args.insert(LinkerFlavor::Em,
|
target.options.post_link_args
|
||||||
vec!["-s".to_string(),
|
.entry(LinkerFlavor::Em)
|
||||||
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
|
.or_default()
|
||||||
"-s".to_string(),
|
.extend(vec!["-s".to_string(), "WASM=0".to_string()]);
|
||||||
"ABORTING_MALLOC=0".to_string(),
|
Ok(target)
|
||||||
"-s".to_string(),
|
|
||||||
"WASM=0".to_string()]);
|
|
||||||
|
|
||||||
let opts = TargetOptions {
|
|
||||||
dynamic_linking: false,
|
|
||||||
executables: true,
|
|
||||||
exe_suffix: ".js".to_string(),
|
|
||||||
linker_is_gnu: true,
|
|
||||||
allow_asm: false,
|
|
||||||
obj_is_bitcode: true,
|
|
||||||
is_like_emscripten: true,
|
|
||||||
max_atomic_width: Some(32),
|
|
||||||
post_link_args: args,
|
|
||||||
target_family: Some("unix".to_string()),
|
|
||||||
codegen_backend: "emscripten".to_string(),
|
|
||||||
.. Default::default()
|
|
||||||
};
|
|
||||||
Ok(Target {
|
|
||||||
llvm_target: "asmjs-unknown-emscripten".to_string(),
|
|
||||||
target_endian: "little".to_string(),
|
|
||||||
target_pointer_width: "32".to_string(),
|
|
||||||
target_c_int_width: "32".to_string(),
|
|
||||||
target_os: "emscripten".to_string(),
|
|
||||||
target_env: String::new(),
|
|
||||||
target_vendor: "unknown".to_string(),
|
|
||||||
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
|
||||||
arch: "asmjs".to_string(),
|
|
||||||
linker_flavor: LinkerFlavor::Em,
|
|
||||||
options: opts,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -462,7 +462,6 @@ supported_targets! {
|
||||||
("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
|
("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
|
||||||
("wasm32-unknown-unknown", wasm32_unknown_unknown),
|
("wasm32-unknown-unknown", wasm32_unknown_unknown),
|
||||||
("wasm32-wasi", wasm32_wasi),
|
("wasm32-wasi", wasm32_wasi),
|
||||||
("wasm32-experimental-emscripten", wasm32_experimental_emscripten),
|
|
||||||
|
|
||||||
("thumbv6m-none-eabi", thumbv6m_none_eabi),
|
("thumbv6m-none-eabi", thumbv6m_none_eabi),
|
||||||
("thumbv7m-none-eabi", thumbv7m_none_eabi),
|
("thumbv7m-none-eabi", thumbv7m_none_eabi),
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
|
|
||||||
|
|
||||||
pub fn target() -> Result<Target, String> {
|
|
||||||
let mut post_link_args = LinkArgs::new();
|
|
||||||
post_link_args.insert(LinkerFlavor::Em,
|
|
||||||
vec!["-s".to_string(),
|
|
||||||
"WASM=1".to_string(),
|
|
||||||
"-s".to_string(),
|
|
||||||
"ASSERTIONS=1".to_string(),
|
|
||||||
"-s".to_string(),
|
|
||||||
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
|
|
||||||
"-g3".to_string()]);
|
|
||||||
|
|
||||||
let opts = TargetOptions {
|
|
||||||
dynamic_linking: false,
|
|
||||||
executables: true,
|
|
||||||
// Today emcc emits two files - a .js file to bootstrap and
|
|
||||||
// possibly interpret the wasm, and a .wasm file
|
|
||||||
exe_suffix: ".js".to_string(),
|
|
||||||
linker_is_gnu: true,
|
|
||||||
link_env: vec![("EMCC_WASM_BACKEND".to_string(), "1".to_string())],
|
|
||||||
allow_asm: false,
|
|
||||||
obj_is_bitcode: true,
|
|
||||||
is_like_emscripten: true,
|
|
||||||
max_atomic_width: Some(32),
|
|
||||||
post_link_args,
|
|
||||||
limit_rdylib_exports: false,
|
|
||||||
target_family: Some("unix".to_string()),
|
|
||||||
.. Default::default()
|
|
||||||
};
|
|
||||||
Ok(Target {
|
|
||||||
llvm_target: "wasm32-unknown-unknown".to_string(),
|
|
||||||
target_endian: "little".to_string(),
|
|
||||||
target_pointer_width: "32".to_string(),
|
|
||||||
target_c_int_width: "32".to_string(),
|
|
||||||
target_os: "emscripten".to_string(),
|
|
||||||
target_env: String::new(),
|
|
||||||
target_vendor: "unknown".to_string(),
|
|
||||||
data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(),
|
|
||||||
arch: "wasm32".to_string(),
|
|
||||||
linker_flavor: LinkerFlavor::Em,
|
|
||||||
options: opts,
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,45 +1,46 @@
|
||||||
use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
|
use super::wasm32_base;
|
||||||
|
use super::{LinkArgs, LinkerFlavor, Target, TargetOptions, PanicStrategy};
|
||||||
|
|
||||||
pub fn target() -> Result<Target, String> {
|
pub fn target() -> Result<Target, String> {
|
||||||
// FIXME(nikic) BINARYEN_TRAP_MODE=clamp is needed to avoid trapping in our
|
|
||||||
// -Zsaturating-float-casts implementation. This can be dropped if/when
|
|
||||||
// we have native fpto[su]i.sat intrinsics, or the implementation otherwise
|
|
||||||
// stops relying on non-trapping fpto[su]i.
|
|
||||||
let mut post_link_args = LinkArgs::new();
|
let mut post_link_args = LinkArgs::new();
|
||||||
post_link_args.insert(LinkerFlavor::Em,
|
post_link_args.insert(LinkerFlavor::Em,
|
||||||
vec!["-s".to_string(),
|
vec!["-s".to_string(),
|
||||||
"BINARYEN=1".to_string(),
|
|
||||||
"-s".to_string(),
|
|
||||||
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
|
"ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
|
||||||
"-s".to_string(),
|
"-s".to_string(),
|
||||||
"BINARYEN_TRAP_MODE='clamp'".to_string()]);
|
"ASSERTIONS=1".to_string(),
|
||||||
|
"-s".to_string(),
|
||||||
|
"DISABLE_EXCEPTION_CATCHING=1".to_string(),
|
||||||
|
"-s".to_string(),
|
||||||
|
"ABORTING_MALLOC=0".to_string(),
|
||||||
|
// FIXME(tlively): Enable this linker option once libc type errors
|
||||||
|
// are resolved. See https://github.com/rust-lang/libc/pull/1478.
|
||||||
|
// "-Wl,--fatal-warnings".to_string(),
|
||||||
|
]);
|
||||||
|
|
||||||
let opts = TargetOptions {
|
let opts = TargetOptions {
|
||||||
dynamic_linking: false,
|
// emcc emits two files - a .js file to instantiate the wasm and supply platform
|
||||||
executables: true,
|
// functionality, and a .wasm file.
|
||||||
// Today emcc emits two files - a .js file to bootstrap and
|
|
||||||
// possibly interpret the wasm, and a .wasm file
|
|
||||||
exe_suffix: ".js".to_string(),
|
exe_suffix: ".js".to_string(),
|
||||||
|
linker: None,
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
allow_asm: false,
|
|
||||||
obj_is_bitcode: true,
|
|
||||||
is_like_emscripten: true,
|
is_like_emscripten: true,
|
||||||
max_atomic_width: Some(32),
|
// FIXME(tlively): Emscripten supports unwinding, but we would have to pass
|
||||||
|
// -enable-emscripten-cxx-exceptions to LLVM at codegen time and merge
|
||||||
|
// https://reviews.llvm.org/rG5c3cdef84b82464756bb571c13c31cf7773860c3to use it.
|
||||||
|
panic_strategy: PanicStrategy::Abort,
|
||||||
post_link_args,
|
post_link_args,
|
||||||
limit_rdylib_exports: false,
|
|
||||||
target_family: Some("unix".to_string()),
|
target_family: Some("unix".to_string()),
|
||||||
codegen_backend: "emscripten".to_string(),
|
.. wasm32_base::options()
|
||||||
.. Default::default()
|
|
||||||
};
|
};
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "asmjs-unknown-emscripten".to_string(),
|
llvm_target: "wasm32-unknown-emscripten".to_string(),
|
||||||
target_endian: "little".to_string(),
|
target_endian: "little".to_string(),
|
||||||
target_pointer_width: "32".to_string(),
|
target_pointer_width: "32".to_string(),
|
||||||
target_c_int_width: "32".to_string(),
|
target_c_int_width: "32".to_string(),
|
||||||
target_os: "emscripten".to_string(),
|
target_os: "emscripten".to_string(),
|
||||||
target_env: String::new(),
|
target_env: String::new(),
|
||||||
target_vendor: "unknown".to_string(),
|
target_vendor: "unknown".to_string(),
|
||||||
data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
|
data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(),
|
||||||
arch: "wasm32".to_string(),
|
arch: "wasm32".to_string(),
|
||||||
linker_flavor: LinkerFlavor::Em,
|
linker_flavor: LinkerFlavor::Em,
|
||||||
options: opts,
|
options: opts,
|
||||||
|
|
|
@ -360,7 +360,7 @@ impl<'a> fmt::Display for Html<'a> {
|
||||||
("target_arch", Some(arch)) => match &*arch.as_str() {
|
("target_arch", Some(arch)) => match &*arch.as_str() {
|
||||||
"aarch64" => "AArch64",
|
"aarch64" => "AArch64",
|
||||||
"arm" => "ARM",
|
"arm" => "ARM",
|
||||||
"asmjs" => "asm.js",
|
"asmjs" => "JavaScript",
|
||||||
"mips" => "MIPS",
|
"mips" => "MIPS",
|
||||||
"mips64" => "MIPS-64",
|
"mips64" => "MIPS-64",
|
||||||
"msp430" => "MSP430",
|
"msp430" => "MSP430",
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
// fallback implementation to use as well.
|
// fallback implementation to use as well.
|
||||||
//
|
//
|
||||||
// Due to rust-lang/rust#18804, make sure this is not generic!
|
// Due to rust-lang/rust#18804, make sure this is not generic!
|
||||||
#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "hermit", target_os = "redox"))]
|
#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "hermit", target_os = "redox",
|
||||||
|
target_os = "emscripten"))]
|
||||||
pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern fn(*mut u8)) {
|
pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern fn(*mut u8)) {
|
||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::sys_common::thread_local::register_dtor_fallback;
|
use crate::sys_common::thread_local::register_dtor_fallback;
|
||||||
|
|
|
@ -1478,9 +1478,9 @@ pub fn run_test(
|
||||||
) {
|
) {
|
||||||
let TestDescAndFn { desc, testfn } = test;
|
let TestDescAndFn { desc, testfn } = test;
|
||||||
|
|
||||||
let ignore_because_no_process_support = cfg!(target_arch = "wasm32")
|
// FIXME: Re-enable emscripten once it can catch panics again
|
||||||
&& !cfg!(target_os = "emscripten")
|
let ignore_because_no_process_support = desc.should_panic != ShouldPanic::No
|
||||||
&& desc.should_panic != ShouldPanic::No;
|
&& (cfg!(target_arch = "wasm32") || cfg!(target_os = "emscripten"));
|
||||||
|
|
||||||
if force_ignore || desc.ignore || ignore_because_no_process_support {
|
if force_ignore || desc.ignore || ignore_because_no_process_support {
|
||||||
monitor_ch.send((desc, TrIgnored, None, Vec::new())).unwrap();
|
monitor_ch.send((desc, TrIgnored, None, Vec::new())).unwrap();
|
||||||
|
|
|
@ -2,7 +2,7 @@ use super::*;
|
||||||
|
|
||||||
use crate::test::{
|
use crate::test::{
|
||||||
filter_tests, parse_opts, run_test, DynTestFn, DynTestName, MetricMap, RunIgnored, RunStrategy,
|
filter_tests, parse_opts, run_test, DynTestFn, DynTestName, MetricMap, RunIgnored, RunStrategy,
|
||||||
ShouldPanic, StaticTestName, TestDesc, TestDescAndFn, TestOpts, TrFailedMsg,
|
ShouldPanic, StaticTestName, TestDesc, TestDescAndFn, TestOpts,
|
||||||
TrIgnored, TrOk,
|
TrIgnored, TrOk,
|
||||||
};
|
};
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
|
@ -90,7 +90,9 @@ pub fn ignored_tests_result_in_ignored() {
|
||||||
assert!(res == TrIgnored);
|
assert!(res == TrIgnored);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Re-enable emscripten once it can catch panics again
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(not(target_os = "emscripten"))]
|
||||||
fn test_should_panic() {
|
fn test_should_panic() {
|
||||||
fn f() {
|
fn f() {
|
||||||
panic!();
|
panic!();
|
||||||
|
@ -110,7 +112,9 @@ fn test_should_panic() {
|
||||||
assert!(res == TrOk);
|
assert!(res == TrOk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Re-enable emscripten once it can catch panics again
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(not(target_os = "emscripten"))]
|
||||||
fn test_should_panic_good_message() {
|
fn test_should_panic_good_message() {
|
||||||
fn f() {
|
fn f() {
|
||||||
panic!("an error message");
|
panic!("an error message");
|
||||||
|
@ -130,8 +134,11 @@ fn test_should_panic_good_message() {
|
||||||
assert!(res == TrOk);
|
assert!(res == TrOk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Re-enable emscripten once it can catch panics again
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(not(target_os = "emscripten"))]
|
||||||
fn test_should_panic_bad_message() {
|
fn test_should_panic_bad_message() {
|
||||||
|
use crate::tests::TrFailedMsg;
|
||||||
fn f() {
|
fn f() {
|
||||||
panic!("an error message");
|
panic!("an error message");
|
||||||
}
|
}
|
||||||
|
@ -152,7 +159,9 @@ fn test_should_panic_bad_message() {
|
||||||
assert!(res == TrFailedMsg(format!("{} '{}'", failed_msg, expected)));
|
assert!(res == TrFailedMsg(format!("{} '{}'", failed_msg, expected)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Re-enable emscripten once it can catch panics again
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(not(target_os = "emscripten"))]
|
||||||
fn test_should_panic_but_succeeds() {
|
fn test_should_panic_but_succeeds() {
|
||||||
fn f() {}
|
fn f() {}
|
||||||
let desc = TestDescAndFn {
|
let desc = TestDescAndFn {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten default visibility is hidden
|
||||||
// compile-flags: -O
|
// compile-flags: -O
|
||||||
// `#[no_mangle]`d static variables always have external linkage, i.e., no `internal` in their
|
// `#[no_mangle]`d static variables always have external linkage, i.e., no `internal` in their
|
||||||
// definitions
|
// definitions
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten default visibility is hidden
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
// compile-flags: -O
|
// compile-flags: -O
|
||||||
|
|
||||||
// ignore-asmjs
|
|
||||||
|
|
||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// ignore-msvc
|
// ignore-msvc
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// compile-flags: -O -C no-prepopulate-passes
|
// compile-flags: -O -C no-prepopulate-passes
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
// ignore-aarch64
|
// ignore-aarch64
|
||||||
// ignore-asmjs
|
// ignore-emscripten
|
||||||
// ignore-mips64
|
// ignore-mips64
|
||||||
// ignore-powerpc
|
// ignore-powerpc
|
||||||
// ignore-powerpc64
|
// ignore-powerpc64
|
||||||
|
@ -9,7 +9,6 @@
|
||||||
// ignore-s390x
|
// ignore-s390x
|
||||||
// ignore-sparc
|
// ignore-sparc
|
||||||
// ignore-sparc64
|
// ignore-sparc64
|
||||||
// ignore-wasm
|
|
||||||
// ignore-x86
|
// ignore-x86
|
||||||
// ignore-x86_64
|
// ignore-x86_64
|
||||||
// See repr-transparent.rs
|
// See repr-transparent.rs
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
// min-llvm-version 7.0
|
// min-llvm-version 7.0
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
|
@ -119,140 +119,140 @@ extern "platform-intrinsic" {
|
||||||
// CHECK-LABEL: @sadd_i8x2
|
// CHECK-LABEL: @sadd_i8x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x2(x: i8x2, y: i8x2) -> i8x2 {
|
pub unsafe fn sadd_i8x2(x: i8x2, y: i8x2) -> i8x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %{{[0-9]+}}, <2 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %{{[0-9a-z]+}}, <2 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i8x4
|
// CHECK-LABEL: @sadd_i8x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x4(x: i8x4, y: i8x4) -> i8x4 {
|
pub unsafe fn sadd_i8x4(x: i8x4, y: i8x4) -> i8x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %{{[0-9]+}}, <4 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %{{[0-9a-z]+}}, <4 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i8x8
|
// CHECK-LABEL: @sadd_i8x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x8(x: i8x8, y: i8x8) -> i8x8 {
|
pub unsafe fn sadd_i8x8(x: i8x8, y: i8x8) -> i8x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %{{[0-9]+}}, <8 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %{{[0-9a-z]+}}, <8 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i8x16
|
// CHECK-LABEL: @sadd_i8x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x16(x: i8x16, y: i8x16) -> i8x16 {
|
pub unsafe fn sadd_i8x16(x: i8x16, y: i8x16) -> i8x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %{{[0-9a-z]+}}, <16 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i8x32
|
// CHECK-LABEL: @sadd_i8x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x32(x: i8x32, y: i8x32) -> i8x32 {
|
pub unsafe fn sadd_i8x32(x: i8x32, y: i8x32) -> i8x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %{{[0-9a-z]+}}, <32 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i8x64
|
// CHECK-LABEL: @sadd_i8x64
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i8x64(x: i8x64, y: i8x64) -> i8x64 {
|
pub unsafe fn sadd_i8x64(x: i8x64, y: i8x64) -> i8x64 {
|
||||||
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %{{[0-9a-z]+}}, <64 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i16x2
|
// CHECK-LABEL: @sadd_i16x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i16x2(x: i16x2, y: i16x2) -> i16x2 {
|
pub unsafe fn sadd_i16x2(x: i16x2, y: i16x2) -> i16x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %{{[0-9]+}}, <2 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %{{[0-9a-z]+}}, <2 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i16x4
|
// CHECK-LABEL: @sadd_i16x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i16x4(x: i16x4, y: i16x4) -> i16x4 {
|
pub unsafe fn sadd_i16x4(x: i16x4, y: i16x4) -> i16x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %{{[0-9]+}}, <4 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %{{[0-9a-z]+}}, <4 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i16x8
|
// CHECK-LABEL: @sadd_i16x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i16x8(x: i16x8, y: i16x8) -> i16x8 {
|
pub unsafe fn sadd_i16x8(x: i16x8, y: i16x8) -> i16x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %{{[0-9a-z]+}}, <8 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i16x16
|
// CHECK-LABEL: @sadd_i16x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i16x16(x: i16x16, y: i16x16) -> i16x16 {
|
pub unsafe fn sadd_i16x16(x: i16x16, y: i16x16) -> i16x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %{{[0-9]+}}, <16 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %{{[0-9a-z]+}}, <16 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i16x32
|
// CHECK-LABEL: @sadd_i16x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i16x32(x: i16x32, y: i16x32) -> i16x32 {
|
pub unsafe fn sadd_i16x32(x: i16x32, y: i16x32) -> i16x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %{{[0-9]+}}, <32 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %{{[0-9a-z]+}}, <32 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i32x2
|
// CHECK-LABEL: @sadd_i32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i32x2(x: i32x2, y: i32x2) -> i32x2 {
|
pub unsafe fn sadd_i32x2(x: i32x2, y: i32x2) -> i32x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %{{[0-9]+}}, <2 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %{{[0-9a-z]+}}, <2 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i32x4
|
// CHECK-LABEL: @sadd_i32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i32x4(x: i32x4, y: i32x4) -> i32x4 {
|
pub unsafe fn sadd_i32x4(x: i32x4, y: i32x4) -> i32x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %{{[0-9a-z]+}}, <4 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i32x8
|
// CHECK-LABEL: @sadd_i32x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i32x8(x: i32x8, y: i32x8) -> i32x8 {
|
pub unsafe fn sadd_i32x8(x: i32x8, y: i32x8) -> i32x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %{{[0-9]+}}, <8 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %{{[0-9a-z]+}}, <8 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i32x16
|
// CHECK-LABEL: @sadd_i32x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i32x16(x: i32x16, y: i32x16) -> i32x16 {
|
pub unsafe fn sadd_i32x16(x: i32x16, y: i32x16) -> i32x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %{{[0-9]+}}, <16 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %{{[0-9a-z]+}}, <16 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i64x2
|
// CHECK-LABEL: @sadd_i64x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i64x2(x: i64x2, y: i64x2) -> i64x2 {
|
pub unsafe fn sadd_i64x2(x: i64x2, y: i64x2) -> i64x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %{{[0-9a-z]+}}, <2 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i64x4
|
// CHECK-LABEL: @sadd_i64x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i64x4(x: i64x4, y: i64x4) -> i64x4 {
|
pub unsafe fn sadd_i64x4(x: i64x4, y: i64x4) -> i64x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %{{[0-9]+}}, <4 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %{{[0-9a-z]+}}, <4 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i64x8
|
// CHECK-LABEL: @sadd_i64x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i64x8(x: i64x8, y: i64x8) -> i64x8 {
|
pub unsafe fn sadd_i64x8(x: i64x8, y: i64x8) -> i64x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %{{[0-9]+}}, <8 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %{{[0-9a-z]+}}, <8 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i128x2
|
// CHECK-LABEL: @sadd_i128x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i128x2(x: i128x2, y: i128x2) -> i128x2 {
|
pub unsafe fn sadd_i128x2(x: i128x2, y: i128x2) -> i128x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %{{[0-9]+}}, <2 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %{{[0-9a-z]+}}, <2 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @sadd_i128x4
|
// CHECK-LABEL: @sadd_i128x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn sadd_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
pub unsafe fn sadd_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.sadd.sat.v4i128(<4 x i128> %{{[0-9]+}}, <4 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.sadd.sat.v4i128(<4 x i128> %{{[0-9a-z]+}}, <4 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,140 +261,140 @@ pub unsafe fn sadd_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
||||||
// CHECK-LABEL: @uadd_u8x2
|
// CHECK-LABEL: @uadd_u8x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x2(x: u8x2, y: u8x2) -> u8x2 {
|
pub unsafe fn uadd_u8x2(x: u8x2, y: u8x2) -> u8x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %{{[0-9]+}}, <2 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %{{[0-9a-z]+}}, <2 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u8x4
|
// CHECK-LABEL: @uadd_u8x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x4(x: u8x4, y: u8x4) -> u8x4 {
|
pub unsafe fn uadd_u8x4(x: u8x4, y: u8x4) -> u8x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %{{[0-9]+}}, <4 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %{{[0-9a-z]+}}, <4 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u8x8
|
// CHECK-LABEL: @uadd_u8x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x8(x: u8x8, y: u8x8) -> u8x8 {
|
pub unsafe fn uadd_u8x8(x: u8x8, y: u8x8) -> u8x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %{{[0-9]+}}, <8 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %{{[0-9a-z]+}}, <8 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u8x16
|
// CHECK-LABEL: @uadd_u8x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x16(x: u8x16, y: u8x16) -> u8x16 {
|
pub unsafe fn uadd_u8x16(x: u8x16, y: u8x16) -> u8x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %{{[0-9a-z]+}}, <16 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u8x32
|
// CHECK-LABEL: @uadd_u8x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x32(x: u8x32, y: u8x32) -> u8x32 {
|
pub unsafe fn uadd_u8x32(x: u8x32, y: u8x32) -> u8x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %{{[0-9a-z]+}}, <32 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u8x64
|
// CHECK-LABEL: @uadd_u8x64
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u8x64(x: u8x64, y: u8x64) -> u8x64 {
|
pub unsafe fn uadd_u8x64(x: u8x64, y: u8x64) -> u8x64 {
|
||||||
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %{{[0-9a-z]+}}, <64 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u16x2
|
// CHECK-LABEL: @uadd_u16x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u16x2(x: u16x2, y: u16x2) -> u16x2 {
|
pub unsafe fn uadd_u16x2(x: u16x2, y: u16x2) -> u16x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %{{[0-9]+}}, <2 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %{{[0-9a-z]+}}, <2 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u16x4
|
// CHECK-LABEL: @uadd_u16x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u16x4(x: u16x4, y: u16x4) -> u16x4 {
|
pub unsafe fn uadd_u16x4(x: u16x4, y: u16x4) -> u16x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %{{[0-9]+}}, <4 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %{{[0-9a-z]+}}, <4 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u16x8
|
// CHECK-LABEL: @uadd_u16x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u16x8(x: u16x8, y: u16x8) -> u16x8 {
|
pub unsafe fn uadd_u16x8(x: u16x8, y: u16x8) -> u16x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %{{[0-9a-z]+}}, <8 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u16x16
|
// CHECK-LABEL: @uadd_u16x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u16x16(x: u16x16, y: u16x16) -> u16x16 {
|
pub unsafe fn uadd_u16x16(x: u16x16, y: u16x16) -> u16x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %{{[0-9]+}}, <16 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %{{[0-9a-z]+}}, <16 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u16x32
|
// CHECK-LABEL: @uadd_u16x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u16x32(x: u16x32, y: u16x32) -> u16x32 {
|
pub unsafe fn uadd_u16x32(x: u16x32, y: u16x32) -> u16x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %{{[0-9]+}}, <32 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %{{[0-9a-z]+}}, <32 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u32x2
|
// CHECK-LABEL: @uadd_u32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u32x2(x: u32x2, y: u32x2) -> u32x2 {
|
pub unsafe fn uadd_u32x2(x: u32x2, y: u32x2) -> u32x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %{{[0-9]+}}, <2 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %{{[0-9a-z]+}}, <2 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u32x4
|
// CHECK-LABEL: @uadd_u32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u32x4(x: u32x4, y: u32x4) -> u32x4 {
|
pub unsafe fn uadd_u32x4(x: u32x4, y: u32x4) -> u32x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %{{[0-9a-z]+}}, <4 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u32x8
|
// CHECK-LABEL: @uadd_u32x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u32x8(x: u32x8, y: u32x8) -> u32x8 {
|
pub unsafe fn uadd_u32x8(x: u32x8, y: u32x8) -> u32x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %{{[0-9]+}}, <8 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %{{[0-9a-z]+}}, <8 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u32x16
|
// CHECK-LABEL: @uadd_u32x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u32x16(x: u32x16, y: u32x16) -> u32x16 {
|
pub unsafe fn uadd_u32x16(x: u32x16, y: u32x16) -> u32x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %{{[0-9]+}}, <16 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %{{[0-9a-z]+}}, <16 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u64x2
|
// CHECK-LABEL: @uadd_u64x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u64x2(x: u64x2, y: u64x2) -> u64x2 {
|
pub unsafe fn uadd_u64x2(x: u64x2, y: u64x2) -> u64x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %{{[0-9a-z]+}}, <2 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u64x4
|
// CHECK-LABEL: @uadd_u64x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u64x4(x: u64x4, y: u64x4) -> u64x4 {
|
pub unsafe fn uadd_u64x4(x: u64x4, y: u64x4) -> u64x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %{{[0-9]+}}, <4 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %{{[0-9a-z]+}}, <4 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u64x8
|
// CHECK-LABEL: @uadd_u64x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u64x8(x: u64x8, y: u64x8) -> u64x8 {
|
pub unsafe fn uadd_u64x8(x: u64x8, y: u64x8) -> u64x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %{{[0-9]+}}, <8 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %{{[0-9a-z]+}}, <8 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u128x2
|
// CHECK-LABEL: @uadd_u128x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u128x2(x: u128x2, y: u128x2) -> u128x2 {
|
pub unsafe fn uadd_u128x2(x: u128x2, y: u128x2) -> u128x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %{{[0-9]+}}, <2 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %{{[0-9a-z]+}}, <2 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @uadd_u128x4
|
// CHECK-LABEL: @uadd_u128x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn uadd_u128x4(x: u128x4, y: u128x4) -> u128x4 {
|
pub unsafe fn uadd_u128x4(x: u128x4, y: u128x4) -> u128x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.uadd.sat.v4i128(<4 x i128> %{{[0-9]+}}, <4 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.uadd.sat.v4i128(<4 x i128> %{{[0-9a-z]+}}, <4 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_add(x, y)
|
simd_saturating_add(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,140 +405,140 @@ pub unsafe fn uadd_u128x4(x: u128x4, y: u128x4) -> u128x4 {
|
||||||
// CHECK-LABEL: @ssub_i8x2
|
// CHECK-LABEL: @ssub_i8x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x2(x: i8x2, y: i8x2) -> i8x2 {
|
pub unsafe fn ssub_i8x2(x: i8x2, y: i8x2) -> i8x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %{{[0-9]+}}, <2 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %{{[0-9a-z]+}}, <2 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i8x4
|
// CHECK-LABEL: @ssub_i8x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x4(x: i8x4, y: i8x4) -> i8x4 {
|
pub unsafe fn ssub_i8x4(x: i8x4, y: i8x4) -> i8x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %{{[0-9]+}}, <4 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %{{[0-9a-z]+}}, <4 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i8x8
|
// CHECK-LABEL: @ssub_i8x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x8(x: i8x8, y: i8x8) -> i8x8 {
|
pub unsafe fn ssub_i8x8(x: i8x8, y: i8x8) -> i8x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %{{[0-9]+}}, <8 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %{{[0-9a-z]+}}, <8 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i8x16
|
// CHECK-LABEL: @ssub_i8x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x16(x: i8x16, y: i8x16) -> i8x16 {
|
pub unsafe fn ssub_i8x16(x: i8x16, y: i8x16) -> i8x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %{{[0-9a-z]+}}, <16 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i8x32
|
// CHECK-LABEL: @ssub_i8x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x32(x: i8x32, y: i8x32) -> i8x32 {
|
pub unsafe fn ssub_i8x32(x: i8x32, y: i8x32) -> i8x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %{{[0-9a-z]+}}, <32 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i8x64
|
// CHECK-LABEL: @ssub_i8x64
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i8x64(x: i8x64, y: i8x64) -> i8x64 {
|
pub unsafe fn ssub_i8x64(x: i8x64, y: i8x64) -> i8x64 {
|
||||||
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %{{[0-9a-z]+}}, <64 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i16x2
|
// CHECK-LABEL: @ssub_i16x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i16x2(x: i16x2, y: i16x2) -> i16x2 {
|
pub unsafe fn ssub_i16x2(x: i16x2, y: i16x2) -> i16x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %{{[0-9]+}}, <2 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %{{[0-9a-z]+}}, <2 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i16x4
|
// CHECK-LABEL: @ssub_i16x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i16x4(x: i16x4, y: i16x4) -> i16x4 {
|
pub unsafe fn ssub_i16x4(x: i16x4, y: i16x4) -> i16x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %{{[0-9]+}}, <4 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %{{[0-9a-z]+}}, <4 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i16x8
|
// CHECK-LABEL: @ssub_i16x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i16x8(x: i16x8, y: i16x8) -> i16x8 {
|
pub unsafe fn ssub_i16x8(x: i16x8, y: i16x8) -> i16x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %{{[0-9a-z]+}}, <8 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i16x16
|
// CHECK-LABEL: @ssub_i16x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i16x16(x: i16x16, y: i16x16) -> i16x16 {
|
pub unsafe fn ssub_i16x16(x: i16x16, y: i16x16) -> i16x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %{{[0-9]+}}, <16 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %{{[0-9a-z]+}}, <16 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i16x32
|
// CHECK-LABEL: @ssub_i16x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i16x32(x: i16x32, y: i16x32) -> i16x32 {
|
pub unsafe fn ssub_i16x32(x: i16x32, y: i16x32) -> i16x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %{{[0-9]+}}, <32 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %{{[0-9a-z]+}}, <32 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i32x2
|
// CHECK-LABEL: @ssub_i32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i32x2(x: i32x2, y: i32x2) -> i32x2 {
|
pub unsafe fn ssub_i32x2(x: i32x2, y: i32x2) -> i32x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %{{[0-9]+}}, <2 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %{{[0-9a-z]+}}, <2 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i32x4
|
// CHECK-LABEL: @ssub_i32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i32x4(x: i32x4, y: i32x4) -> i32x4 {
|
pub unsafe fn ssub_i32x4(x: i32x4, y: i32x4) -> i32x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %{{[0-9a-z]+}}, <4 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i32x8
|
// CHECK-LABEL: @ssub_i32x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i32x8(x: i32x8, y: i32x8) -> i32x8 {
|
pub unsafe fn ssub_i32x8(x: i32x8, y: i32x8) -> i32x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %{{[0-9]+}}, <8 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %{{[0-9a-z]+}}, <8 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i32x16
|
// CHECK-LABEL: @ssub_i32x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i32x16(x: i32x16, y: i32x16) -> i32x16 {
|
pub unsafe fn ssub_i32x16(x: i32x16, y: i32x16) -> i32x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %{{[0-9]+}}, <16 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %{{[0-9a-z]+}}, <16 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i64x2
|
// CHECK-LABEL: @ssub_i64x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i64x2(x: i64x2, y: i64x2) -> i64x2 {
|
pub unsafe fn ssub_i64x2(x: i64x2, y: i64x2) -> i64x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %{{[0-9a-z]+}}, <2 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i64x4
|
// CHECK-LABEL: @ssub_i64x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i64x4(x: i64x4, y: i64x4) -> i64x4 {
|
pub unsafe fn ssub_i64x4(x: i64x4, y: i64x4) -> i64x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %{{[0-9]+}}, <4 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %{{[0-9a-z]+}}, <4 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i64x8
|
// CHECK-LABEL: @ssub_i64x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i64x8(x: i64x8, y: i64x8) -> i64x8 {
|
pub unsafe fn ssub_i64x8(x: i64x8, y: i64x8) -> i64x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %{{[0-9]+}}, <8 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %{{[0-9a-z]+}}, <8 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i128x2
|
// CHECK-LABEL: @ssub_i128x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i128x2(x: i128x2, y: i128x2) -> i128x2 {
|
pub unsafe fn ssub_i128x2(x: i128x2, y: i128x2) -> i128x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %{{[0-9]+}}, <2 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %{{[0-9a-z]+}}, <2 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @ssub_i128x4
|
// CHECK-LABEL: @ssub_i128x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn ssub_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
pub unsafe fn ssub_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.ssub.sat.v4i128(<4 x i128> %{{[0-9]+}}, <4 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.ssub.sat.v4i128(<4 x i128> %{{[0-9a-z]+}}, <4 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,139 +547,139 @@ pub unsafe fn ssub_i128x4(x: i128x4, y: i128x4) -> i128x4 {
|
||||||
// CHECK-LABEL: @usub_u8x2
|
// CHECK-LABEL: @usub_u8x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x2(x: u8x2, y: u8x2) -> u8x2 {
|
pub unsafe fn usub_u8x2(x: u8x2, y: u8x2) -> u8x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %{{[0-9]+}}, <2 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %{{[0-9a-z]+}}, <2 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u8x4
|
// CHECK-LABEL: @usub_u8x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x4(x: u8x4, y: u8x4) -> u8x4 {
|
pub unsafe fn usub_u8x4(x: u8x4, y: u8x4) -> u8x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %{{[0-9]+}}, <4 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %{{[0-9a-z]+}}, <4 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u8x8
|
// CHECK-LABEL: @usub_u8x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x8(x: u8x8, y: u8x8) -> u8x8 {
|
pub unsafe fn usub_u8x8(x: u8x8, y: u8x8) -> u8x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %{{[0-9]+}}, <8 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %{{[0-9a-z]+}}, <8 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u8x16
|
// CHECK-LABEL: @usub_u8x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x16(x: u8x16, y: u8x16) -> u8x16 {
|
pub unsafe fn usub_u8x16(x: u8x16, y: u8x16) -> u8x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %{{[0-9a-z]+}}, <16 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u8x32
|
// CHECK-LABEL: @usub_u8x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x32(x: u8x32, y: u8x32) -> u8x32 {
|
pub unsafe fn usub_u8x32(x: u8x32, y: u8x32) -> u8x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %{{[0-9]+}}, <32 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %{{[0-9a-z]+}}, <32 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u8x64
|
// CHECK-LABEL: @usub_u8x64
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u8x64(x: u8x64, y: u8x64) -> u8x64 {
|
pub unsafe fn usub_u8x64(x: u8x64, y: u8x64) -> u8x64 {
|
||||||
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %{{[0-9]+}}, <64 x i8> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %{{[0-9a-z]+}}, <64 x i8> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u16x2
|
// CHECK-LABEL: @usub_u16x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u16x2(x: u16x2, y: u16x2) -> u16x2 {
|
pub unsafe fn usub_u16x2(x: u16x2, y: u16x2) -> u16x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %{{[0-9]+}}, <2 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %{{[0-9a-z]+}}, <2 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u16x4
|
// CHECK-LABEL: @usub_u16x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u16x4(x: u16x4, y: u16x4) -> u16x4 {
|
pub unsafe fn usub_u16x4(x: u16x4, y: u16x4) -> u16x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %{{[0-9]+}}, <4 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %{{[0-9a-z]+}}, <4 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u16x8
|
// CHECK-LABEL: @usub_u16x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u16x8(x: u16x8, y: u16x8) -> u16x8 {
|
pub unsafe fn usub_u16x8(x: u16x8, y: u16x8) -> u16x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %{{[0-9a-z]+}}, <8 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u16x16
|
// CHECK-LABEL: @usub_u16x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u16x16(x: u16x16, y: u16x16) -> u16x16 {
|
pub unsafe fn usub_u16x16(x: u16x16, y: u16x16) -> u16x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %{{[0-9]+}}, <16 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %{{[0-9a-z]+}}, <16 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u16x32
|
// CHECK-LABEL: @usub_u16x32
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u16x32(x: u16x32, y: u16x32) -> u16x32 {
|
pub unsafe fn usub_u16x32(x: u16x32, y: u16x32) -> u16x32 {
|
||||||
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %{{[0-9]+}}, <32 x i16> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %{{[0-9a-z]+}}, <32 x i16> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u32x2
|
// CHECK-LABEL: @usub_u32x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u32x2(x: u32x2, y: u32x2) -> u32x2 {
|
pub unsafe fn usub_u32x2(x: u32x2, y: u32x2) -> u32x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %{{[0-9]+}}, <2 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %{{[0-9a-z]+}}, <2 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u32x4
|
// CHECK-LABEL: @usub_u32x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u32x4(x: u32x4, y: u32x4) -> u32x4 {
|
pub unsafe fn usub_u32x4(x: u32x4, y: u32x4) -> u32x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %{{[0-9a-z]+}}, <4 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u32x8
|
// CHECK-LABEL: @usub_u32x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u32x8(x: u32x8, y: u32x8) -> u32x8 {
|
pub unsafe fn usub_u32x8(x: u32x8, y: u32x8) -> u32x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %{{[0-9]+}}, <8 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %{{[0-9a-z]+}}, <8 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u32x16
|
// CHECK-LABEL: @usub_u32x16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u32x16(x: u32x16, y: u32x16) -> u32x16 {
|
pub unsafe fn usub_u32x16(x: u32x16, y: u32x16) -> u32x16 {
|
||||||
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %{{[0-9]+}}, <16 x i32> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %{{[0-9a-z]+}}, <16 x i32> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u64x2
|
// CHECK-LABEL: @usub_u64x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u64x2(x: u64x2, y: u64x2) -> u64x2 {
|
pub unsafe fn usub_u64x2(x: u64x2, y: u64x2) -> u64x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %{{[0-9a-z]+}}, <2 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u64x4
|
// CHECK-LABEL: @usub_u64x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u64x4(x: u64x4, y: u64x4) -> u64x4 {
|
pub unsafe fn usub_u64x4(x: u64x4, y: u64x4) -> u64x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %{{[0-9]+}}, <4 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %{{[0-9a-z]+}}, <4 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u64x8
|
// CHECK-LABEL: @usub_u64x8
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u64x8(x: u64x8, y: u64x8) -> u64x8 {
|
pub unsafe fn usub_u64x8(x: u64x8, y: u64x8) -> u64x8 {
|
||||||
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %{{[0-9]+}}, <8 x i64> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %{{[0-9a-z]+}}, <8 x i64> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u128x2
|
// CHECK-LABEL: @usub_u128x2
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u128x2(x: u128x2, y: u128x2) -> u128x2 {
|
pub unsafe fn usub_u128x2(x: u128x2, y: u128x2) -> u128x2 {
|
||||||
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %{{[0-9]+}}, <2 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %{{[0-9a-z]+}}, <2 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @usub_u128x4
|
// CHECK-LABEL: @usub_u128x4
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn usub_u128x4(x: u128x4, y: u128x4) -> u128x4 {
|
pub unsafe fn usub_u128x4(x: u128x4, y: u128x4) -> u128x4 {
|
||||||
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.usub.sat.v4i128(<4 x i128> %{{[0-9]+}}, <4 x i128> %{{[0-9]+}})
|
// CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.usub.sat.v4i128(<4 x i128> %{{[0-9a-z]+}}, <4 x i128> %{{[0-9a-z]+}})
|
||||||
simd_saturating_sub(x, y)
|
simd_saturating_sub(x, y)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ extern "platform-intrinsic" {
|
||||||
// CHECK-LABEL: @bitmask_int
|
// CHECK-LABEL: @bitmask_int
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn bitmask_int(x: i32x2) -> u8 {
|
pub unsafe fn bitmask_int(x: i32x2) -> u8 {
|
||||||
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{[0-9]+}}, <i32 31, i32 31>
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{[0-9a-z]+}}, <i32 31, i32 31>
|
||||||
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
// CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2
|
// CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2
|
||||||
// CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8
|
// CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8
|
||||||
|
@ -39,7 +39,7 @@ pub unsafe fn bitmask_int(x: i32x2) -> u8 {
|
||||||
// CHECK-LABEL: @bitmask_uint
|
// CHECK-LABEL: @bitmask_uint
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn bitmask_uint(x: u32x2) -> u8 {
|
pub unsafe fn bitmask_uint(x: u32x2) -> u8 {
|
||||||
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{[0-9]+}}, <i32 31, i32 31>
|
// CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{[0-9a-z]+}}, <i32 31, i32 31>
|
||||||
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
// CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1>
|
||||||
// CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2
|
// CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2
|
||||||
// CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8
|
// CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8
|
||||||
|
@ -49,7 +49,7 @@ pub unsafe fn bitmask_uint(x: u32x2) -> u8 {
|
||||||
// CHECK-LABEL: @bitmask_int16
|
// CHECK-LABEL: @bitmask_int16
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn bitmask_int16(x: i8x16) -> u16 {
|
pub unsafe fn bitmask_int16(x: i8x16) -> u16 {
|
||||||
// CHECK: [[A:%[0-9]+]] = lshr <16 x i8> %{{[0-9]+}}, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
|
// CHECK: [[A:%[0-9]+]] = lshr <16 x i8> %{{[0-9a-z]+}}, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
|
||||||
// CHECK: [[B:%[0-9]+]] = trunc <16 x i8> [[A]] to <16 x i1>
|
// CHECK: [[B:%[0-9]+]] = trunc <16 x i8> [[A]] to <16 x i1>
|
||||||
// CHECK: %{{[0-9]+}} = bitcast <16 x i1> [[B]] to i16
|
// CHECK: %{{[0-9]+}} = bitcast <16 x i1> [[B]] to i16
|
||||||
// CHECK-NOT: zext
|
// CHECK-NOT: zext
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
// ignore-emscripten
|
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// ignore-emscripten vectors passed directly
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
|
||||||
// This test that using union forward the abi of the inner type, as
|
// This test that using union forward the abi of the inner type, as
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// aux-build:weak-lang-items.rs
|
// aux-build:weak-lang-items.rs
|
||||||
// error-pattern: `#[panic_handler]` function required, but not found
|
// error-pattern: `#[panic_handler]` function required, but not found
|
||||||
// error-pattern: language item required, but not found: `eh_personality`
|
// error-pattern: language item required, but not found: `eh_personality`
|
||||||
// ignore-wasm32-bare compiled with panic=abort, personality not required
|
// ignore-emscripten compiled with panic=abort, personality not required
|
||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// Test that we detect changes to the `dep_kind` query. If the change is not
|
// Test that we detect changes to the `dep_kind` query. If the change is not
|
||||||
// detected then -Zincremental-verify-ich will trigger an assertion.
|
// detected then -Zincremental-verify-ich will trigger an assertion.
|
||||||
|
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
// revisions:cfail1 cfail2
|
// revisions:cfail1 cfail2
|
||||||
// compile-flags: -Z query-dep-graph -Cpanic=unwind
|
// compile-flags: -Z query-dep-graph -Cpanic=unwind
|
||||||
// build-pass (FIXME(62277): could be check-pass?)
|
// build-pass (FIXME(62277): could be check-pass?)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// Test that changing a tracked commandline argument invalidates
|
// Test that changing a tracked commandline argument invalidates
|
||||||
// the cache while changing an untracked one doesn't.
|
// the cache while changing an untracked one doesn't.
|
||||||
|
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// revisions:rpass1 rpass2 rpass3
|
// revisions:rpass1 rpass2 rpass3
|
||||||
// compile-flags: -Z query-dep-graph
|
// compile-flags: -Z query-dep-graph
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// compile-flags: -Z query-dep-graph -g
|
// compile-flags: -Z query-dep-graph -g
|
||||||
// aux-build:extern_crate.rs
|
// aux-build:extern_crate.rs
|
||||||
|
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// This test case makes sure that we detect if paths emitted into debuginfo
|
// This test case makes sure that we detect if paths emitted into debuginfo
|
||||||
// are changed, even when the change happens in an external crate.
|
// are changed, even when the change happens in an external crate.
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// the spans and this test makes sure that we handle them correctly by hashing
|
// the spans and this test makes sure that we handle them correctly by hashing
|
||||||
// file:line:column instead of raw byte offset.
|
// file:line:column instead of raw byte offset.
|
||||||
|
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// revisions:rpass1 rpass2
|
// revisions:rpass1 rpass2
|
||||||
// compile-flags: -g -Z query-dep-graph
|
// compile-flags: -g -Z query-dep-graph
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// Test that moving a type definition within a source file does not affect
|
// Test that moving a type definition within a source file does not affect
|
||||||
// re-compilation.
|
// re-compilation.
|
||||||
|
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// revisions:rpass1 rpass2
|
// revisions:rpass1 rpass2
|
||||||
// compile-flags: -Z query-dep-graph -g
|
// compile-flags: -Z query-dep-graph -g
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
// revisions:rpass1 rpass2
|
// revisions:rpass1 rpass2
|
||||||
|
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// compile-flags: -g -Z query-dep-graph
|
// compile-flags: -g -Z query-dep-graph
|
||||||
|
|
||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(box_syntax)]
|
#![feature(box_syntax)]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// Test that we generate StorageDead on unwind paths for generators.
|
// Test that we generate StorageDead on unwind paths for generators.
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// check that we don't emit multiple drop flags when they are not needed.
|
// check that we don't emit multiple drop flags when they are not needed.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// check that we don't forget to drop the Box if we early return before
|
// check that we don't forget to drop the Box if we early return before
|
||||||
// initializing it
|
// initializing it
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(box_syntax)]
|
#![feature(box_syntax)]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// Test that after the call to `std::mem::drop` we do not generate a
|
// Test that after the call to `std::mem::drop` we do not generate a
|
||||||
// MIR drop of the argument. (We used to have a `DROP(_2)` in the code
|
// MIR drop of the argument. (We used to have a `DROP(_2)` in the code
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut x = Packed(Aligned(Droppy(0)));
|
let mut x = Packed(Aligned(Droppy(0)));
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Test that the fake borrows for matches are removed after borrow checking.
|
// Test that the fake borrows for matches are removed after borrow checking.
|
||||||
|
|
||||||
// ignore-wasm32-bare
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
fn match_guard(x: Option<&&i32>, c: bool) -> i32 {
|
fn match_guard(x: Option<&&i32>, c: bool) -> i32 {
|
||||||
match x {
|
match x {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
// compile-flags: -Z mir-emit-retag -Z mir-opt-level=0 -Z span_free_formats
|
// compile-flags: -Z mir-emit-retag -Z mir-opt-level=0 -Z span_free_formats
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs -O --target wasm32-unknown-unknown
|
$(RUSTC) foo.rs -O --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) bar.rs --target wasm32-unknown-unknown
|
$(RUSTC) bar.rs --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs -C lto -O --target wasm32-unknown-unknown --cfg a
|
$(RUSTC) foo.rs -C lto -O --target wasm32-unknown-unknown --cfg a
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-include ../../run-make-fulldeps/tools.mk
|
-include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
# only-wasm32
|
# only-wasm32-bare
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
$(RUSTC) foo.rs --target wasm32-unknown-unknown
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
// ignore-wasm32-bare no libc to test ffi with
|
// ignore-wasm32-bare no libc to test ffi with
|
||||||
|
|
||||||
|
// FIXME: This will work on emscripten once libc is updated to include
|
||||||
|
// rust-lang/libc/#1478
|
||||||
|
// ignore-emscripten libc type mismatch
|
||||||
|
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// See issue #59123 for a full explanation.
|
// See issue #59123 for a full explanation.
|
||||||
|
|
||||||
// ignore-wasm32-bare (sizes don't match)
|
// ignore-emscripten (sizes don't match)
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
// edition:2018
|
// edition:2018
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// compile-flags: -Copt-level=z -Cdebuginfo=2 --edition=2018
|
// compile-flags: -Copt-level=z -Cdebuginfo=2 --edition=2018
|
||||||
|
|
||||||
// run-pass
|
// run-pass
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
|
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::task::Poll;
|
use std::task::Poll;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Check that partially moved from function parameters are dropped after the
|
// Check that partially moved from function parameters are dropped after the
|
||||||
// named bindings that move from them.
|
// named bindings that move from them.
|
||||||
|
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
use std::{panic, cell::RefCell};
|
use std::{panic, cell::RefCell};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
// compile-flags: -g
|
// compile-flags: -g
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
|
|
||||||
#[derive(PartialEq, Eq)]
|
#[derive(PartialEq, Eq)]
|
||||||
struct NewBool(bool);
|
struct NewBool(bool);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#![allow(unused_variables)]
|
#![allow(unused_variables)]
|
||||||
#![allow(unused_imports)]
|
#![allow(unused_imports)]
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// Test that builtin implementations of `Clone` cleanup everything
|
// Test that builtin implementations of `Clone` cleanup everything
|
||||||
// in case of unwinding.
|
// in case of unwinding.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
fn worker() -> ! {
|
fn worker() -> ! {
|
||||||
panic!()
|
panic!()
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// ignore-emscripten no i128 support
|
|
||||||
#![feature(const_saturating_int_methods)]
|
#![feature(const_saturating_int_methods)]
|
||||||
|
|
||||||
const INT_U32_NO: u32 = (42 as u32).saturating_add(2);
|
const INT_U32_NO: u32 = (42 as u32).saturating_add(2);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
// aux-build:debuginfo-lto-aux.rs
|
// aux-build:debuginfo-lto-aux.rs
|
||||||
// compile-flags: -C lto -g
|
// compile-flags: -C lto -g
|
||||||
// no-prefer-dynamic
|
// no-prefer-dynamic
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
|
|
||||||
extern crate debuginfo_lto_aux;
|
extern crate debuginfo_lto_aux;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
// run-pass
|
// run-pass
|
||||||
// edition:2018
|
// edition:2018
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(slice_patterns)]
|
#![feature(slice_patterns)]
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#![allow(unused_assignments)]
|
#![allow(unused_assignments)]
|
||||||
#![allow(unused_variables)]
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(generators, generator_trait, untagged_unions)]
|
#![feature(generators, generator_trait, untagged_unions)]
|
||||||
#![feature(slice_patterns)]
|
#![feature(slice_patterns)]
|
||||||
|
|
3
src/test/ui/extern/extern-const.fixed
vendored
3
src/test/ui/extern/extern-const.fixed
vendored
|
@ -5,7 +5,8 @@
|
||||||
// compile. To sidestep this by using one that *is* defined.
|
// compile. To sidestep this by using one that *is* defined.
|
||||||
|
|
||||||
// run-rustfix
|
// run-rustfix
|
||||||
// ignore-wasm32 no external library to link to.
|
// ignore-wasm32-bare no external library to link to.
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// compile-flags: -g
|
// compile-flags: -g
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
3
src/test/ui/extern/extern-const.rs
vendored
3
src/test/ui/extern/extern-const.rs
vendored
|
@ -5,7 +5,8 @@
|
||||||
// compile. To sidestep this by using one that *is* defined.
|
// compile. To sidestep this by using one that *is* defined.
|
||||||
|
|
||||||
// run-rustfix
|
// run-rustfix
|
||||||
// ignore-wasm32 no external library to link to.
|
// ignore-wasm32-bare no external library to link to.
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
// compile-flags: -g
|
// compile-flags: -g
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
2
src/test/ui/extern/extern-const.stderr
vendored
2
src/test/ui/extern/extern-const.stderr
vendored
|
@ -1,5 +1,5 @@
|
||||||
error: extern items cannot be `const`
|
error: extern items cannot be `const`
|
||||||
--> $DIR/extern-const.rs:15:5
|
--> $DIR/extern-const.rs:16:5
|
||||||
|
|
|
|
||||||
LL | const rust_dbg_static_mut: libc::c_int;
|
LL | const rust_dbg_static_mut: libc::c_int;
|
||||||
| ^^^^^ help: try using a static value: `static`
|
| ^^^^^ help: try using a static value: `static`
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// compile-flags: -g
|
// compile-flags: -g
|
||||||
|
// ignore-asmjs wasm2js does not support source maps yet
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
// ignore-wasm32-bare compiled as panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
// ignore-wasm32-bare compiled with panic=abort by default
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
// edition:2018
|
// edition:2018
|
||||||
// ignore-wasm32 issue #62807
|
// ignore-wasm32 issue #62807
|
||||||
|
// ignore-asmjs issue #62807
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// ignore-emscripten no i128 support
|
|
||||||
|
|
||||||
#![feature(intrinsics)]
|
#![feature(intrinsics)]
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// ignore-wasm32-bare always compiled as panic=abort right now
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
|
||||||
// Check that values are not leaked when a dtor panics (#14875)
|
// Check that values are not leaked when a dtor panics (#14875)
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue