@@ -12,7 +12,7 @@ use super::{
1212 WrappedZeroValue ,
1313 } ,
1414 storage:: StoreValue ,
15- BackendResult , Error , FragmentEntryPoint , Options ,
15+ BackendResult , Error , FragmentEntryPoint , Options , ShaderModel ,
1616} ;
1717use crate :: {
1818 back:: { self , Baked } ,
@@ -3751,33 +3751,48 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> {
37513751 fun @ ( Function :: Dot4I8Packed | Function :: Dot4U8Packed ) => {
37523752 let arg1 = arg1. unwrap ( ) ;
37533753
3754- write ! ( self . out, "dot(" ) ?;
3754+ if self . options . shader_model >= ShaderModel :: V6_4 {
3755+ // Intrinsics `dot4add_{i, u}8packed` are available in SM 6.4 and later.
3756+ let function_name = match fun {
3757+ Function :: Dot4I8Packed => "dot4add_i8packed" ,
3758+ Function :: Dot4U8Packed => "dot4add_u8packed" ,
3759+ _ => unreachable ! ( ) ,
3760+ } ;
3761+ write ! ( self . out, "{function_name}(" ) ?;
3762+ self . write_expr ( module, arg, func_ctx) ?;
3763+ write ! ( self . out, ", " ) ?;
3764+ self . write_expr ( module, arg1, func_ctx) ?;
3765+ write ! ( self . out, ", 0)" ) ?;
3766+ } else {
3767+ // Fall back to a polyfill as `dot4add_u8packed` is not available.
3768+ write ! ( self . out, "dot(" ) ?;
37553769
3756- if matches ! ( fun, Function :: Dot4U8Packed ) {
3757- write ! ( self . out, "u" ) ?;
3758- }
3759- write ! ( self . out, "int4(" ) ?;
3760- self . write_expr ( module, arg, func_ctx) ?;
3761- write ! ( self . out, ", " ) ?;
3762- self . write_expr ( module, arg, func_ctx) ?;
3763- write ! ( self . out, " >> 8, " ) ?;
3764- self . write_expr ( module, arg, func_ctx) ?;
3765- write ! ( self . out, " >> 16, " ) ?;
3766- self . write_expr ( module, arg, func_ctx) ?;
3767- write ! ( self . out, " >> 24) << 24 >> 24, " ) ?;
3770+ if matches ! ( fun, Function :: Dot4U8Packed ) {
3771+ write ! ( self . out, "u" ) ?;
3772+ }
3773+ write ! ( self . out, "int4(" ) ?;
3774+ self . write_expr ( module, arg, func_ctx) ?;
3775+ write ! ( self . out, ", " ) ?;
3776+ self . write_expr ( module, arg, func_ctx) ?;
3777+ write ! ( self . out, " >> 8, " ) ?;
3778+ self . write_expr ( module, arg, func_ctx) ?;
3779+ write ! ( self . out, " >> 16, " ) ?;
3780+ self . write_expr ( module, arg, func_ctx) ?;
3781+ write ! ( self . out, " >> 24) << 24 >> 24, " ) ?;
37683782
3769- if matches ! ( fun, Function :: Dot4U8Packed ) {
3770- write ! ( self . out, "u" ) ?;
3783+ if matches ! ( fun, Function :: Dot4U8Packed ) {
3784+ write ! ( self . out, "u" ) ?;
3785+ }
3786+ write ! ( self . out, "int4(" ) ?;
3787+ self . write_expr ( module, arg1, func_ctx) ?;
3788+ write ! ( self . out, ", " ) ?;
3789+ self . write_expr ( module, arg1, func_ctx) ?;
3790+ write ! ( self . out, " >> 8, " ) ?;
3791+ self . write_expr ( module, arg1, func_ctx) ?;
3792+ write ! ( self . out, " >> 16, " ) ?;
3793+ self . write_expr ( module, arg1, func_ctx) ?;
3794+ write ! ( self . out, " >> 24) << 24 >> 24)" ) ?;
37713795 }
3772- write ! ( self . out, "int4(" ) ?;
3773- self . write_expr ( module, arg1, func_ctx) ?;
3774- write ! ( self . out, ", " ) ?;
3775- self . write_expr ( module, arg1, func_ctx) ?;
3776- write ! ( self . out, " >> 8, " ) ?;
3777- self . write_expr ( module, arg1, func_ctx) ?;
3778- write ! ( self . out, " >> 16, " ) ?;
3779- self . write_expr ( module, arg1, func_ctx) ?;
3780- write ! ( self . out, " >> 24) << 24 >> 24)" ) ?;
37813796 }
37823797 Function :: QuantizeToF16 => {
37833798 write ! ( self . out, "f16tof32(f32tof16(" ) ?;
0 commit comments