| //@ revisions: DEBUG OPTIM |
| //@ [DEBUG] compile-flags: -C opt-level=0 |
| //@ [OPTIM] compile-flags: -C opt-level=3 |
| //@ assembly-output: emit-asm |
| //@ compile-flags: --crate-type=lib -C llvm-args=-x86-asm-syntax=intel |
| //@ only-x86_64 |
| //@ ignore-sgx |
| |
| #![feature(core_intrinsics)] |
| |
| use std::intrinsics::three_way_compare; |
| |
| #[no_mangle] |
| // CHECK-LABEL: signed_cmp: |
| pub fn signed_cmp(a: i16, b: i16) -> std::cmp::Ordering { |
| // DEBUG: cmp |
| // DEBUG: setg |
| // DEBUG: and |
| // DEBUG: cmp |
| // DEBUG: setl |
| // DEBUG: and |
| // DEBUG: sub |
| |
| // OPTIM: xor |
| // OPTIM: cmp |
| // OPTIM: setne |
| // OPTIM: mov |
| // OPTIM: cmovge |
| // OPTIM: ret |
| three_way_compare(a, b) |
| } |
| |
| #[no_mangle] |
| // CHECK-LABEL: unsigned_cmp: |
| pub fn unsigned_cmp(a: u16, b: u16) -> std::cmp::Ordering { |
| // DEBUG: cmp |
| // DEBUG: seta |
| // DEBUG: and |
| // DEBUG: cmp |
| // DEBUG: setb |
| // DEBUG: and |
| // DEBUG: sub |
| |
| // OPTIM: xor |
| // OPTIM: cmp |
| // OPTIM: setne |
| // OPTIM: mov |
| // OPTIM: cmovae |
| // OPTIM: ret |
| three_way_compare(a, b) |
| } |