| // Verify that our intrinsics generate the correct LLVM calls for f16 |
| |
| #![crate_type = "lib"] |
| #![feature(f16)] |
| #![feature(core_intrinsics)] |
| |
| // CHECK-LABEL: i1 @f16_eq( |
| #[no_mangle] |
| pub fn f16_eq(a: f16, b: f16) -> bool { |
| // CHECK: fcmp oeq half %{{.+}}, %{{.+}} |
| a == b |
| } |
| |
| // CHECK-LABEL: i1 @f16_ne( |
| #[no_mangle] |
| pub fn f16_ne(a: f16, b: f16) -> bool { |
| // CHECK: fcmp une half %{{.+}}, %{{.+}} |
| a != b |
| } |
| |
| // CHECK-LABEL: i1 @f16_gt( |
| #[no_mangle] |
| pub fn f16_gt(a: f16, b: f16) -> bool { |
| // CHECK: fcmp ogt half %{{.+}}, %{{.+}} |
| a > b |
| } |
| |
| // CHECK-LABEL: i1 @f16_ge( |
| #[no_mangle] |
| pub fn f16_ge(a: f16, b: f16) -> bool { |
| // CHECK: fcmp oge half %{{.+}}, %{{.+}} |
| a >= b |
| } |
| |
| // CHECK-LABEL: i1 @f16_lt( |
| #[no_mangle] |
| pub fn f16_lt(a: f16, b: f16) -> bool { |
| // CHECK: fcmp olt half %{{.+}}, %{{.+}} |
| a < b |
| } |
| |
| // CHECK-LABEL: i1 @f16_le( |
| #[no_mangle] |
| pub fn f16_le(a: f16, b: f16) -> bool { |
| // CHECK: fcmp ole half %{{.+}}, %{{.+}} |
| a <= b |
| } |
| |
| // CHECK-LABEL: half @f16_neg( |
| #[no_mangle] |
| pub fn f16_neg(a: f16) -> f16 { |
| // CHECK: fneg half %{{.+}} |
| -a |
| } |
| |
| // CHECK-LABEL: half @f16_add( |
| #[no_mangle] |
| pub fn f16_add(a: f16, b: f16) -> f16 { |
| // CHECK: fadd half %{{.+}}, %{{.+}} |
| a + b |
| } |
| |
| // CHECK-LABEL: half @f16_sub( |
| #[no_mangle] |
| pub fn f16_sub(a: f16, b: f16) -> f16 { |
| // CHECK: fsub half %{{.+}}, %{{.+}} |
| a - b |
| } |
| |
| // CHECK-LABEL: half @f16_mul( |
| #[no_mangle] |
| pub fn f16_mul(a: f16, b: f16) -> f16 { |
| // CHECK: fmul half %{{.+}}, %{{.+}} |
| a * b |
| } |
| |
| // CHECK-LABEL: half @f16_div( |
| #[no_mangle] |
| pub fn f16_div(a: f16, b: f16) -> f16 { |
| // CHECK: fdiv half %{{.+}}, %{{.+}} |
| a / b |
| } |
| |
| // CHECK-LABEL: half @f16_rem( |
| #[no_mangle] |
| pub fn f16_rem(a: f16, b: f16) -> f16 { |
| // CHECK: frem half %{{.+}}, %{{.+}} |
| a % b |
| } |
| |
| // CHECK-LABEL: void @f16_add_assign( |
| #[no_mangle] |
| pub fn f16_add_assign(a: &mut f16, b: f16) { |
| // CHECK: fadd half %{{.+}}, %{{.+}} |
| // CHECK-NEXT: store half %{{.+}}, ptr %{{.+}} |
| *a += b; |
| } |
| |
| // CHECK-LABEL: void @f16_sub_assign( |
| #[no_mangle] |
| pub fn f16_sub_assign(a: &mut f16, b: f16) { |
| // CHECK: fsub half %{{.+}}, %{{.+}} |
| // CHECK-NEXT: store half %{{.+}}, ptr %{{.+}} |
| *a -= b; |
| } |
| |
| // CHECK-LABEL: void @f16_mul_assign( |
| #[no_mangle] |
| pub fn f16_mul_assign(a: &mut f16, b: f16) { |
| // CHECK: fmul half %{{.+}}, %{{.+}} |
| // CHECK-NEXT: store half %{{.+}}, ptr %{{.+}} |
| *a *= b |
| } |
| |
| // CHECK-LABEL: void @f16_div_assign( |
| #[no_mangle] |
| pub fn f16_div_assign(a: &mut f16, b: f16) { |
| // CHECK: fdiv half %{{.+}}, %{{.+}} |
| // CHECK-NEXT: store half %{{.+}}, ptr %{{.+}} |
| *a /= b |
| } |
| |
| // CHECK-LABEL: void @f16_rem_assign( |
| #[no_mangle] |
| pub fn f16_rem_assign(a: &mut f16, b: f16) { |
| // CHECK: frem half %{{.+}}, %{{.+}} |
| // CHECK-NEXT: store half %{{.+}}, ptr %{{.+}} |
| *a %= b |
| } |