core: Implement bitwise not for unsigned ints and fix implementation
This commit is contained in:
parent
7e4dab15ae
commit
92d6f0a5d3
@ -1352,25 +1352,16 @@ pub fn gen_expr<'ctx, 'a, G: CodeGenerator>(
|
|||||||
}
|
}
|
||||||
_ => val.into(),
|
_ => val.into(),
|
||||||
}
|
}
|
||||||
} else if [ctx.primitives.int32, ctx.primitives.int64].contains(&ty) {
|
} else if [ctx.primitives.int32, ctx.primitives.int64, ctx.primitives.uint32, ctx.primitives.uint64].contains(&ty) {
|
||||||
let val = val.into_int_value();
|
let val = val.into_int_value();
|
||||||
match op {
|
match op {
|
||||||
ast::Unaryop::USub => ctx.builder.build_int_neg(val, "neg").into(),
|
ast::Unaryop::USub => ctx.builder.build_int_neg(val, "neg").into(),
|
||||||
ast::Unaryop::Invert => ctx.builder.build_not(val, "not").into(),
|
ast::Unaryop::Invert => ctx.builder.build_not(val, "not").into(),
|
||||||
ast::Unaryop::Not => ctx
|
ast::Unaryop::Not => ctx.builder.build_xor(val, val.get_type().const_all_ones(), "not").into(),
|
||||||
.builder
|
|
||||||
.build_int_compare(
|
|
||||||
IntPredicate::EQ,
|
|
||||||
val,
|
|
||||||
val.get_type().const_zero(),
|
|
||||||
"not",
|
|
||||||
)
|
|
||||||
.into(),
|
|
||||||
_ => val.into(),
|
_ => val.into(),
|
||||||
}
|
}
|
||||||
} else if ty == ctx.primitives.float {
|
} else if ty == ctx.primitives.float {
|
||||||
let val =
|
let val = val.into_float_value();
|
||||||
if let BasicValueEnum::FloatValue(val) = val { val } else { unreachable!() };
|
|
||||||
match op {
|
match op {
|
||||||
ast::Unaryop::USub => ctx.builder.build_float_neg(val, "neg").into(),
|
ast::Unaryop::USub => ctx.builder.build_float_neg(val, "neg").into(),
|
||||||
ast::Unaryop::Not => ctx
|
ast::Unaryop::Not => ctx
|
||||||
|
Loading…
Reference in New Issue
Block a user