Add support for Float16, Float32, Float64 and Float128

Upgrade libgccjit.version

Limit new Floatxx types to master branch only

apply rustfmt

Make new types available only when requested

Make new types available only when requested

Check if Float16 and Float128 are supported by the target platform

Replace Float with Float32 and Double with Float64 if target dependent type is defined

Add support for Float16|32|64|128 in the builder

Fix cargo fmt errors

Update gccjit wrapper

update hash of ligccjit
This commit is contained in:
Robert Zakrzewski 2024-04-10 23:08:01 +02:00
parent a63b83eb4e
commit d0977e3e2a
4 changed files with 90 additions and 8 deletions

8
Cargo.lock generated
View File

@ -79,16 +79,16 @@ dependencies = [
[[package]]
name = "gccjit"
version = "1.0.0"
source = "git+https://github.com/antoyo/gccjit.rs#9f8f67edc006d543b17529a001803ffece48349e"
version = "2.0.0"
source = "git+https://github.com/antoyo/gccjit.rs#f1545d7c2c13e42d78eaac8032d49ab8f7d43b6e"
dependencies = [
"gccjit_sys",
]
[[package]]
name = "gccjit_sys"
version = "0.0.1"
source = "git+https://github.com/antoyo/gccjit.rs#9f8f67edc006d543b17529a001803ffece48349e"
version = "0.1.0"
source = "git+https://github.com/antoyo/gccjit.rs#f1545d7c2c13e42d78eaac8032d49ab8f7d43b6e"
dependencies = [
"libc",
]

View File

@ -1 +1 @@
b6f163f52
ac1853f579dbfdc53f2c22317e673ae99686eca2

View File

@ -748,6 +748,24 @@ fn frem(&mut self, a: RValue<'gcc>, b: RValue<'gcc>) -> RValue<'gcc> {
// FIXME(antoyo): this seems to produce the wrong result.
return self.context.new_call(self.location, fmodf, &[a, b]);
}
#[cfg(feature = "master")]
match self.cx.type_kind(a_type) {
TypeKind::Half | TypeKind::Float => {
let fmodf = self.context.get_builtin_function("fmodf");
return self.context.new_call(self.location, fmodf, &[a, b]);
}
TypeKind::Double => {
let fmod = self.context.get_builtin_function("fmod");
return self.context.new_call(self.location, fmod, &[a, b]);
}
TypeKind::FP128 => {
let fmodl = self.context.get_builtin_function("fmodl");
return self.context.new_call(self.location, fmodl, &[a, b]);
}
_ => (),
}
if let Some(vector_type) = a_type_unqualified.dyncast_vector() {
assert_eq!(a_type_unqualified, b.get_type().unqualified());

View File

@ -1,4 +1,6 @@
use gccjit::{RValue, Struct, Type};
use std::convert::TryInto;
use gccjit::{CType, RValue, Struct, Type};
use rustc_codegen_ssa::common::TypeKind;
use rustc_codegen_ssa::traits::{BaseTypeMethods, DerivedTypeMethods, TypeMembershipMethods};
use rustc_middle::ty::layout::TyAndLayout;
@ -120,10 +122,28 @@ fn type_isize(&self) -> Type<'gcc> {
self.isize_type
}
#[cfg(feature = "master")]
fn type_f16(&self) -> Type<'gcc> {
unimplemented!("f16_f128")
if self.context.get_target_info().supports_target_dependent_type(CType::Float16) {
return self.context.new_c_type(CType::Float16);
}
unimplemented!("f16")
}
#[cfg(not(feature = "master"))]
fn type_f16(&self) -> Type<'gcc> {
unimplemented!("f16")
}
#[cfg(feature = "master")]
fn type_f32(&self) -> Type<'gcc> {
if self.context.get_target_info().supports_target_dependent_type(CType::Float32) {
return self.context.new_c_type(CType::Float32);
}
self.float_type
}
#[cfg(not(feature = "master"))]
fn type_f32(&self) -> Type<'gcc> {
self.float_type
}
@ -132,8 +152,17 @@ fn type_f64(&self) -> Type<'gcc> {
self.double_type
}
#[cfg(feature = "master")]
fn type_f128(&self) -> Type<'gcc> {
unimplemented!("f16_f128")
if self.context.get_target_info().supports_target_dependent_type(CType::Float128) {
return self.context.new_c_type(CType::Float128);
}
unimplemented!("f128")
}
#[cfg(not(feature = "master"))]
fn type_f128(&self) -> Type<'gcc> {
unimplemented!("f128")
}
fn type_func(&self, params: &[Type<'gcc>], return_type: Type<'gcc>) -> Type<'gcc> {
@ -161,6 +190,31 @@ fn type_struct(&self, fields: &[Type<'gcc>], packed: bool) -> Type<'gcc> {
typ
}
#[cfg(feature = "master")]
fn type_kind(&self, typ: Type<'gcc>) -> TypeKind {
if self.is_int_type_or_bool(typ) {
TypeKind::Integer
} else if typ.is_compatible_with(self.float_type) {
TypeKind::Float
} else if typ.is_compatible_with(self.double_type) {
TypeKind::Double
} else if typ.is_vector() {
TypeKind::Vector
} else if typ.is_floating_point() {
match typ.get_size() {
2 => TypeKind::Half,
4 => TypeKind::Float,
8 => TypeKind::Double,
16 => TypeKind::FP128,
_ => TypeKind::Void,
}
} else {
// TODO(antoyo): support other types.
TypeKind::Void
}
}
#[cfg(not(feature = "master"))]
fn type_kind(&self, typ: Type<'gcc>) -> TypeKind {
if self.is_int_type_or_bool(typ) {
TypeKind::Integer
@ -210,6 +264,16 @@ fn vector_length(&self, _ty: Type<'gcc>) -> usize {
unimplemented!();
}
#[cfg(feature = "master")]
fn float_width(&self, typ: Type<'gcc>) -> usize {
if typ.is_floating_point() {
(typ.get_size() * u8::BITS).try_into().unwrap()
} else {
panic!("Cannot get width of float type {:?}", typ);
}
}
#[cfg(not(feature = "master"))]
fn float_width(&self, typ: Type<'gcc>) -> usize {
let f32 = self.context.new_type::<f32>();
let f64 = self.context.new_type::<f64>();