Skip to content

Commit 5c7ec6c

Browse files
committed
Introduce assembly tests
1 parent b57fe74 commit 5c7ec6c

23 files changed

+328
-141
lines changed

src/bootstrap/builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,8 @@ impl<'a> Builder<'a> {
411411
test::Bootstrap,
412412
// Run run-make last, since these won't pass without make on Windows
413413
test::RunMake,
414-
test::RustdocUi
414+
test::RustdocUi,
415+
test::Assembly,
415416
),
416417
Kind::Bench => describe!(test::Crate, test::CrateLibrustc),
417418
Kind::Doc => describe!(

src/bootstrap/test.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,12 @@ host_test!(RunMakeFullDeps {
895895
suite: "run-make-fulldeps"
896896
});
897897

898+
default_test!(Assembly {
899+
path: "src/test/assembly",
900+
mode: "assembly",
901+
suite: "assembly"
902+
});
903+
898904
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
899905
struct Compiletest {
900906
compiler: Compiler,

src/ci/docker/test-various/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ ENV WASM_SCRIPT python2.7 /checkout/x.py test --target $WASM_TARGETS \
4545

4646
ENV NVPTX_TARGETS=nvptx64-nvidia-cuda
4747
ENV NVPTX_SCRIPT python2.7 /checkout/x.py test --target $NVPTX_TARGETS \
48-
src/test/run-make
48+
src/test/run-make \
49+
src/test/assembly
4950

5051
ENV SCRIPT $WASM_SCRIPT && $NVPTX_SCRIPT
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#![feature(core_intrinsics)]
2+
#![no_std]
3+
4+
#[panic_handler]
5+
unsafe fn breakpoint_panic_handler(_: &::core::panic::PanicInfo) -> ! {
6+
core::intrinsics::breakpoint();
7+
core::hint::unreachable_unchecked();
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// assembly-output: ptx-linker
2+
// compile-flags: --crate-type cdylib
3+
// only-nvptx64
4+
5+
#![no_std]
6+
7+
// aux-build: breakpoint-panic-handler.rs
8+
extern crate breakpoint_panic_handler;
9+
10+
// Verify default target arch with ptx-linker.
11+
// CHECK: .target sm_30
12+
// CHECK: .address_size 64
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// assembly-output: emit-asm
2+
// compile-flags: --crate-type rlib
3+
// only-nvptx64
4+
5+
#![no_std]
6+
7+
// Verify default arch without ptx-linker involved.
8+
// CHECK: .target sm_30
9+
// CHECK: .address_size 64
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// assembly-output: ptx-linker
2+
// compile-flags: --crate-type cdylib -C link-arg=--arch=sm_60
3+
// only-nvptx64
4+
5+
#![no_std]
6+
7+
// aux-build: breakpoint-panic-handler.rs
8+
extern crate breakpoint_panic_handler;
9+
10+
// Verify target arch override via `link-arg`.
11+
// CHECK: .target sm_60
12+
// CHECK: .address_size 64
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// assembly-output: ptx-linker
2+
// compile-flags: --crate-type cdylib -C target-cpu=sm_50
3+
// only-nvptx64
4+
5+
#![no_std]
6+
7+
// aux-build: breakpoint-panic-handler.rs
8+
extern crate breakpoint_panic_handler;
9+
10+
// Verify target arch override via `target-cpu`.
11+
// CHECK: .target sm_50
12+
// CHECK: .address_size 64

src/test/assembly/nvptx-atomics.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// assembly-output: ptx-linker
2+
// compile-flags: --crate-type cdylib
3+
// only-nvptx64
4+
5+
#![feature(abi_ptx, core_intrinsics)]
6+
#![no_std]
7+
8+
use core::intrinsics::*;
9+
10+
// aux-build: breakpoint-panic-handler.rs
11+
extern crate breakpoint_panic_handler;
12+
13+
// Currently, LLVM NVPTX backend can only emit atomic instructions with
14+
// `relaxed` (PTX default) ordering. But it's also useful to make sure
15+
// the backend won't fail with other orders. Apparently, the backend
16+
// doesn't support fences as well. As a workaround `llvm.nvvm.membar.*`
17+
// could work, and perhaps on the long run, all the atomic operations
18+
// should rather be provided by `core::arch::nvptx`.
19+
20+
// Also, PTX ISA doesn't have atomic `load`, `store` and `nand`.
21+
22+
// FIXME(denzp): add tests for `core::sync::atomic::*`.
23+
24+
#[no_mangle]
25+
pub unsafe extern "ptx-kernel" fn atomics_kernel(a: *mut u32) {
26+
// CHECK: atom.global.and.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
27+
// CHECK: atom.global.and.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
28+
atomic_and(a, 1);
29+
atomic_and_relaxed(a, 1);
30+
31+
// CHECK: atom.global.cas.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1, 2;
32+
// CHECK: atom.global.cas.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1, 2;
33+
atomic_cxchg(a, 1, 2);
34+
atomic_cxchg_relaxed(a, 1, 2);
35+
36+
// CHECK: atom.global.max.s32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
37+
// CHECK: atom.global.max.s32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
38+
atomic_max(a, 1);
39+
atomic_max_relaxed(a, 1);
40+
41+
// CHECK: atom.global.min.s32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
42+
// CHECK: atom.global.min.s32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
43+
atomic_min(a, 1);
44+
atomic_min_relaxed(a, 1);
45+
46+
// CHECK: atom.global.or.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
47+
// CHECK: atom.global.or.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
48+
atomic_or(a, 1);
49+
atomic_or_relaxed(a, 1);
50+
51+
// CHECK: atom.global.max.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
52+
// CHECK: atom.global.max.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
53+
atomic_umax(a, 1);
54+
atomic_umax_relaxed(a, 1);
55+
56+
// CHECK: atom.global.min.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
57+
// CHECK: atom.global.min.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
58+
atomic_umin(a, 1);
59+
atomic_umin_relaxed(a, 1);
60+
61+
// CHECK: atom.global.add.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
62+
// CHECK: atom.global.add.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
63+
atomic_xadd(a, 1);
64+
atomic_xadd_relaxed(a, 1);
65+
66+
// CHECK: atom.global.exch.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
67+
// CHECK: atom.global.exch.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
68+
atomic_xchg(a, 1);
69+
atomic_xchg_relaxed(a, 1);
70+
71+
// CHECK: atom.global.xor.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
72+
// CHECK: atom.global.xor.b32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], 1;
73+
atomic_xor(a, 1);
74+
atomic_xor_relaxed(a, 1);
75+
76+
// CHECK: mov.u32 %[[sub_0_arg:r[0-9]+]], 100;
77+
// CHECK: neg.s32 temp, %[[sub_0_arg]];
78+
// CHECK: atom.global.add.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], temp;
79+
atomic_xsub(a, 100);
80+
81+
// CHECK: mov.u32 %[[sub_1_arg:r[0-9]+]], 200;
82+
// CHECK: neg.s32 temp, %[[sub_1_arg]];
83+
// CHECK: atom.global.add.u32 %{{r[0-9]+}}, [%{{rd[0-9]+}}], temp;
84+
atomic_xsub_relaxed(a, 200);
85+
}

0 commit comments

Comments
 (0)