IntKind::{get_int_type -> int_type}
This commit is contained in:
parent
44ee84b1d0
commit
cc5950e88c
|
@ -12,7 +12,7 @@ use crate::codegen::{CodeGenContext, CodeGenerator};
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
pub trait IntKind<'ctx>: fmt::Debug + Clone + Copy {
|
pub trait IntKind<'ctx>: fmt::Debug + Clone + Copy {
|
||||||
fn get_int_type(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx>;
|
fn int_type(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Default)]
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
@ -27,31 +27,31 @@ pub struct Int64;
|
||||||
pub struct SizeT;
|
pub struct SizeT;
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for Bool {
|
impl<'ctx> IntKind<'ctx> for Bool {
|
||||||
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
ctx.bool_type()
|
ctx.bool_type()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for Byte {
|
impl<'ctx> IntKind<'ctx> for Byte {
|
||||||
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
ctx.i8_type()
|
ctx.i8_type()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for Int32 {
|
impl<'ctx> IntKind<'ctx> for Int32 {
|
||||||
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
ctx.i32_type()
|
ctx.i32_type()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for Int64 {
|
impl<'ctx> IntKind<'ctx> for Int64 {
|
||||||
fn get_int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, _size_t: IntType<'ctx>, ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
ctx.i64_type()
|
ctx.i64_type()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for SizeT {
|
impl<'ctx> IntKind<'ctx> for SizeT {
|
||||||
fn get_int_type(&self, size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
size_t
|
size_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ impl<'ctx> IntKind<'ctx> for SizeT {
|
||||||
pub struct AnyInt<'ctx>(pub IntType<'ctx>);
|
pub struct AnyInt<'ctx>(pub IntType<'ctx>);
|
||||||
|
|
||||||
impl<'ctx> IntKind<'ctx> for AnyInt<'ctx> {
|
impl<'ctx> IntKind<'ctx> for AnyInt<'ctx> {
|
||||||
fn get_int_type(&self, _size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
|
fn int_type(&self, _size_t: IntType<'ctx>, _ctx: &'ctx Context) -> IntType<'ctx> {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ pub struct Int<'ctx, N: IntKind<'ctx>> {
|
||||||
|
|
||||||
impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> {
|
impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> {
|
||||||
fn llvm_type_impl(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> BasicTypeEnum<'ctx> {
|
fn llvm_type_impl(&self, size_t: IntType<'ctx>, ctx: &'ctx Context) -> BasicTypeEnum<'ctx> {
|
||||||
self.kind.get_int_type(size_t, ctx).into()
|
self.kind.int_type(size_t, ctx).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_type_impl(
|
fn check_type_impl(
|
||||||
|
@ -86,7 +86,7 @@ impl<'ctx, N: IntKind<'ctx>> ModelBase<'ctx> for Int<'ctx, N> {
|
||||||
return Err(ModelError(format!("Expecting IntType, but got {ty:?}")));
|
return Err(ModelError(format!("Expecting IntType, but got {ty:?}")));
|
||||||
};
|
};
|
||||||
|
|
||||||
let exp_ty = self.kind.get_int_type(size_t, ctx);
|
let exp_ty = self.kind.int_type(size_t, ctx);
|
||||||
if ty.get_bit_width() != exp_ty.get_bit_width() {
|
if ty.get_bit_width() != exp_ty.get_bit_width() {
|
||||||
return Err(ModelError(format!(
|
return Err(ModelError(format!(
|
||||||
"Expecting IntType to have {} bit(s), but got {} bit(s)",
|
"Expecting IntType to have {} bit(s), but got {} bit(s)",
|
||||||
|
@ -153,10 +153,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
<= self
|
<= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
.kind
|
|
||||||
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
|
|
||||||
.get_bit_width()
|
|
||||||
);
|
);
|
||||||
let value = ctx
|
let value = ctx
|
||||||
.builder
|
.builder
|
||||||
|
@ -173,7 +170,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
< self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
< self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
);
|
);
|
||||||
let value =
|
let value =
|
||||||
ctx.builder.build_int_s_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
ctx.builder.build_int_s_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
||||||
|
@ -188,10 +185,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
<= self
|
<= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
.kind
|
|
||||||
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
|
|
||||||
.get_bit_width()
|
|
||||||
);
|
);
|
||||||
let value = ctx
|
let value = ctx
|
||||||
.builder
|
.builder
|
||||||
|
@ -208,7 +202,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
< self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
< self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
);
|
);
|
||||||
let value =
|
let value =
|
||||||
ctx.builder.build_int_z_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
ctx.builder.build_int_z_extend(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
||||||
|
@ -223,10 +217,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
>= self
|
>= self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
.kind
|
|
||||||
.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx)
|
|
||||||
.get_bit_width()
|
|
||||||
);
|
);
|
||||||
let value = ctx
|
let value = ctx
|
||||||
.builder
|
.builder
|
||||||
|
@ -243,7 +234,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
assert!(
|
assert!(
|
||||||
value.get_type().get_bit_width()
|
value.get_type().get_bit_width()
|
||||||
> self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
> self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width()
|
||||||
);
|
);
|
||||||
let value =
|
let value =
|
||||||
ctx.builder.build_int_truncate(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
ctx.builder.build_int_truncate(value, self.llvm_type(generator, ctx.ctx), "").unwrap();
|
||||||
|
@ -259,7 +250,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
let their_width = value.get_type().get_bit_width();
|
let their_width = value.get_type().get_bit_width();
|
||||||
let our_width =
|
let our_width =
|
||||||
self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
|
self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
|
||||||
match their_width.cmp(&our_width) {
|
match their_width.cmp(&our_width) {
|
||||||
Ordering::Less => self.s_extend(generator, ctx, value),
|
Ordering::Less => self.s_extend(generator, ctx, value),
|
||||||
Ordering::Equal => unsafe { self.believe_value(value) },
|
Ordering::Equal => unsafe { self.believe_value(value) },
|
||||||
|
@ -276,7 +267,7 @@ impl<'ctx, N: IntKind<'ctx>> Int<'ctx, N> {
|
||||||
) -> Instance<'ctx, Self> {
|
) -> Instance<'ctx, Self> {
|
||||||
let their_width = value.get_type().get_bit_width();
|
let their_width = value.get_type().get_bit_width();
|
||||||
let our_width =
|
let our_width =
|
||||||
self.kind.get_int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
|
self.kind.int_type(generator.get_size_type(ctx.ctx), ctx.ctx).get_bit_width();
|
||||||
match their_width.cmp(&our_width) {
|
match their_width.cmp(&our_width) {
|
||||||
Ordering::Less => self.z_extend(generator, ctx, value),
|
Ordering::Less => self.z_extend(generator, ctx, value),
|
||||||
Ordering::Equal => unsafe { self.believe_value(value) },
|
Ordering::Equal => unsafe { self.believe_value(value) },
|
||||||
|
|
Loading…
Reference in New Issue