blob: 066c9d1a718182952cd72aee1dd7f1deeaf3d954 [file]
// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
// { dg-options "-mrdrnd -mrdseed -fdump-tree-gimple" }
#![feature(no_core, abi_unadjusted)]
#![no_core]
#[allow(improper_ctypes)]
extern "unadjusted" {
#[link_name = "llvm.x86.rdrand.16"]
fn x86_rdrand16_step() -> (u16, i32);
#[link_name = "llvm.x86.rdrand.32"]
fn x86_rdrand32_step() -> (u32, i32);
#[link_name = "llvm.x86.rdseed.16"]
fn x86_rdseed16_step() -> (u16, i32);
#[link_name = "llvm.x86.rdseed.32"]
fn x86_rdseed32_step() -> (u32, i32);
#[link_name = "llvm.x86.addcarry.32"]
fn llvm_addcarry_u32(a: u8, b: u32, c: u32) -> (u8, u32);
#[link_name = "llvm.x86.addcarryx.u32"]
fn llvm_addcarryx_u32(a: u8, b: u32, c: u32, d: *mut u8) -> u8;
#[link_name = "llvm.x86.subborrow.32"]
fn llvm_subborrow_u32(a: u8, b: u32, c: u32) -> (u8, u32);
// TODO implement the SIMD types (i16x8, f32x4, f32x8) before
// enabling these tests
// #[link_name = "llvm.x86.vcvtph2ps.128"]
// fn llvm_vcvtph2ps_128(a: i16x8) -> f32x4;
// #[link_name = "llvm.x86.vcvtph2ps.256"]
// fn llvm_vcvtph2ps_256(a: i16x8) -> f32x8;
// #[link_name = "llvm.x86.vcvtps2ph.128"]
// fn llvm_vcvtps2ph_128(a: f32x4, rounding: i32) -> i16x8;
// #[link_name = "llvm.x86.vcvtps2ph.256"]
// fn llvm_vcvtps2ph_256(a: f32x8, rounding: i32) -> i16x8;
}
fn main() {
let (_v1, _s1) = unsafe {
x86_rdrand16_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdrand16_step} 1 gimple } }
};
let (_v2, _s2) = unsafe {
x86_rdrand32_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdrand32_step} 1 gimple } }
};
let (_v3, _s3) = unsafe {
x86_rdseed16_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdseed_hi_step} 1 gimple } }
};
let (_v4, _s4) = unsafe {
x86_rdseed32_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdseed_si_step} 1 gimple } }
};
// { dg-final { scan-tree-dump-times {__builtin_ia32_addcarryx_u32} 2 gimple } }
let (_v5, _s5) = unsafe {
llvm_addcarry_u32(0, 1, 2)
};
let _s6 = unsafe {
let _temp_ptr: *mut u8;
llvm_addcarryx_u32(0, 1, 2, _temp_ptr)
};
let (_v7, _s7) = unsafe {
llvm_subborrow_u32(0, 1, 2) // { dg-final { scan-tree-dump-times {__builtin_ia32_sbb_u32} 1 gimple } }
};
}