2021-10-14 02:23:09 -05:00
|
|
|
// run-pass
|
|
|
|
// needs-asm-support
|
|
|
|
// only-x86_64
|
|
|
|
|
|
|
|
// Checks that multiple clobber_abi options can be used
|
|
|
|
|
2021-12-09 18:15:33 -06:00
|
|
|
use std::arch::asm;
|
2021-10-14 02:23:09 -05:00
|
|
|
|
|
|
|
extern "sysv64" fn foo(x: i32) -> i32 {
|
|
|
|
x + 16
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "win64" fn bar(x: i32) -> i32 {
|
|
|
|
x / 2
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let x = 8;
|
|
|
|
let y: i32;
|
|
|
|
// call `foo` with `x` as the input, and then `bar` with the output of `foo`
|
|
|
|
// and output that to `y`
|
|
|
|
unsafe {
|
|
|
|
asm!(
|
|
|
|
"call {}; mov rcx, rax; call {}",
|
|
|
|
sym foo,
|
|
|
|
sym bar,
|
|
|
|
in("rdi") x,
|
|
|
|
out("rax") y,
|
|
|
|
clobber_abi("sysv64", "win64"),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
assert_eq!((x, y), (8, 12));
|
|
|
|
}
|