Fix sub with saturation

This commit is contained in:
Andrzej Janik
2025-07-04 00:56:01 +00:00
parent ef0c4afcf9
commit 958aba37d1

View File

@ -1418,7 +1418,7 @@ impl<'a> MethodEmitContext<'a> {
arguments: ptx_parser::SubArgs<SpirvWord>, arguments: ptx_parser::SubArgs<SpirvWord>,
) -> Result<(), TranslateError> { ) -> Result<(), TranslateError> {
if arith_integer.saturate { if arith_integer.saturate {
todo!() return self.emit_sub_sat(arith_integer.type_, arguments);
} }
let src1 = self.resolver.value(arguments.src1)?; let src1 = self.resolver.value(arguments.src1)?;
let src2 = self.resolver.value(arguments.src2)?; let src2 = self.resolver.value(arguments.src2)?;
@ -1428,13 +1428,36 @@ impl<'a> MethodEmitContext<'a> {
Ok(()) Ok(())
} }
fn emit_sub_sat(
&mut self,
type_: ast::ScalarType,
arguments: ast::SubArgs<SpirvWord>,
) -> Result<(), TranslateError> {
let llvm_type = get_scalar_type(self.context, type_);
let src1 = self.resolver.value(arguments.src1)?;
let src2 = self.resolver.value(arguments.src2)?;
let op = if type_.kind() == ast::ScalarKind::Signed {
"ssub"
} else {
"usub"
};
let intrinsic = format!("llvm.{}.sat.{}\0", op, LLVMTypeDisplay(type_));
self.emit_intrinsic(
unsafe { CStr::from_bytes_with_nul_unchecked(intrinsic.as_bytes()) },
Some(arguments.dst),
Some(&type_.into()),
vec![(src1, llvm_type), (src2, llvm_type)],
)?;
Ok(())
}
fn emit_sub_float( fn emit_sub_float(
&mut self, &mut self,
arith_float: ptx_parser::ArithFloat, arith_float: ptx_parser::ArithFloat,
arguments: ptx_parser::SubArgs<SpirvWord>, arguments: ptx_parser::SubArgs<SpirvWord>,
) -> Result<(), TranslateError> { ) -> Result<(), TranslateError> {
if arith_float.saturate { if arith_float.saturate {
todo!() return Err(error_unreachable());
} }
let src1 = self.resolver.value(arguments.src1)?; let src1 = self.resolver.value(arguments.src1)?;
let src2 = self.resolver.value(arguments.src2)?; let src2 = self.resolver.value(arguments.src2)?;