454de78ea3
Implement basic operation traits that get lowered to intrinsics. This includes codegen tests for implemented operations.
130 lines
2.8 KiB
Rust
130 lines
2.8 KiB
Rust
// Verify that our intrinsics generate the correct LLVM calls for f128
|
|
|
|
#![crate_type = "lib"]
|
|
#![feature(f128)]
|
|
#![feature(core_intrinsics)]
|
|
|
|
// CHECK-LABEL: i1 @f128_eq(
|
|
#[no_mangle]
|
|
pub fn f128_eq(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp oeq fp128 %{{.+}}, %{{.+}}
|
|
a == b
|
|
}
|
|
|
|
// CHECK-LABEL: i1 @f128_ne(
|
|
#[no_mangle]
|
|
pub fn f128_ne(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp une fp128 %{{.+}}, %{{.+}}
|
|
a != b
|
|
}
|
|
|
|
// CHECK-LABEL: i1 @f128_gt(
|
|
#[no_mangle]
|
|
pub fn f128_gt(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp ogt fp128 %{{.+}}, %{{.+}}
|
|
a > b
|
|
}
|
|
|
|
// CHECK-LABEL: i1 @f128_ge(
|
|
#[no_mangle]
|
|
pub fn f128_ge(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp oge fp128 %{{.+}}, %{{.+}}
|
|
a >= b
|
|
}
|
|
|
|
// CHECK-LABEL: i1 @f128_lt(
|
|
#[no_mangle]
|
|
pub fn f128_lt(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp olt fp128 %{{.+}}, %{{.+}}
|
|
a < b
|
|
}
|
|
|
|
// CHECK-LABEL: i1 @f128_le(
|
|
#[no_mangle]
|
|
pub fn f128_le(a: f128, b: f128) -> bool {
|
|
// CHECK: fcmp ole fp128 %{{.+}}, %{{.+}}
|
|
a <= b
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_neg(
|
|
#[no_mangle]
|
|
pub fn f128_neg(a: f128) -> f128 {
|
|
// CHECK: fneg fp128
|
|
-a
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_add(
|
|
#[no_mangle]
|
|
pub fn f128_add(a: f128, b: f128) -> f128 {
|
|
// CHECK: fadd fp128 %{{.+}}, %{{.+}}
|
|
a + b
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_sub(
|
|
#[no_mangle]
|
|
pub fn f128_sub(a: f128, b: f128) -> f128 {
|
|
// CHECK: fsub fp128 %{{.+}}, %{{.+}}
|
|
a - b
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_mul(
|
|
#[no_mangle]
|
|
pub fn f128_mul(a: f128, b: f128) -> f128 {
|
|
// CHECK: fmul fp128 %{{.+}}, %{{.+}}
|
|
a * b
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_div(
|
|
#[no_mangle]
|
|
pub fn f128_div(a: f128, b: f128) -> f128 {
|
|
// CHECK: fdiv fp128 %{{.+}}, %{{.+}}
|
|
a / b
|
|
}
|
|
|
|
// CHECK-LABEL: fp128 @f128_rem(
|
|
#[no_mangle]
|
|
pub fn f128_rem(a: f128, b: f128) -> f128 {
|
|
// CHECK: frem fp128 %{{.+}}, %{{.+}}
|
|
a % b
|
|
}
|
|
|
|
// CHECK-LABEL: void @f128_add_assign(
|
|
#[no_mangle]
|
|
pub fn f128_add_assign(a: &mut f128, b: f128) {
|
|
// CHECK: fadd fp128 %{{.+}}, %{{.+}}
|
|
// CHECK-NEXT: store fp128 %{{.+}}, ptr %{{.+}}
|
|
*a += b;
|
|
}
|
|
|
|
// CHECK-LABEL: void @f128_sub_assign(
|
|
#[no_mangle]
|
|
pub fn f128_sub_assign(a: &mut f128, b: f128) {
|
|
// CHECK: fsub fp128 %{{.+}}, %{{.+}}
|
|
// CHECK-NEXT: store fp128 %{{.+}}, ptr %{{.+}}
|
|
*a -= b;
|
|
}
|
|
|
|
// CHECK-LABEL: void @f128_mul_assign(
|
|
#[no_mangle]
|
|
pub fn f128_mul_assign(a: &mut f128, b: f128) {
|
|
// CHECK: fmul fp128 %{{.+}}, %{{.+}}
|
|
// CHECK-NEXT: store fp128 %{{.+}}, ptr %{{.+}}
|
|
*a *= b
|
|
}
|
|
|
|
// CHECK-LABEL: void @f128_div_assign(
|
|
#[no_mangle]
|
|
pub fn f128_div_assign(a: &mut f128, b: f128) {
|
|
// CHECK: fdiv fp128 %{{.+}}, %{{.+}}
|
|
// CHECK-NEXT: store fp128 %{{.+}}, ptr %{{.+}}
|
|
*a /= b
|
|
}
|
|
|
|
// CHECK-LABEL: void @f128_rem_assign(
|
|
#[no_mangle]
|
|
pub fn f128_rem_assign(a: &mut f128, b: f128) {
|
|
// CHECK: frem fp128 %{{.+}}, %{{.+}}
|
|
// CHECK-NEXT: store fp128 %{{.+}}, ptr %{{.+}}
|
|
*a %= b
|
|
}
|