@ -128,24 +128,27 @@ auto Arg(EmitContext& ctx, const IR::Value& arg) {
}
}
}
}
template < auto func , bool is_first_arg_inst , typename . . . Args >
template < auto func , bool is_first_arg_inst >
void InvokeCall ( EmitContext & ctx , IR : : Inst * inst , Args & & . . . args ) {
struct InvokeCall {
if constexpr ( is_first_arg_inst ) {
template < typename . . . Args >
func ( ctx , * inst , args . Extract ( ) . . . ) ;
InvokeCall ( EmitContext & ctx , IR : : Inst * inst , Args & & . . . args ) {
} else {
if constexpr ( is_first_arg_inst ) {
func ( ctx , args . Extract ( ) . . . ) ;
func ( ctx , * inst , args . Extract ( ) . . . ) ;
} else {
func ( ctx , args . Extract ( ) . . . ) ;
}
}
}
}
} ;
template < auto func , bool is_first_arg_inst , size_t . . . I >
template < auto func , bool is_first_arg_inst , size_t . . . I >
void Invoke ( EmitContext & ctx , IR : : Inst * inst , std : : index_sequence < I . . . > ) {
void Invoke ( EmitContext & ctx , IR : : Inst * inst , std : : index_sequence < I . . . > ) {
using Traits = FuncTraits < decltype ( func ) > ;
using Traits = FuncTraits < decltype ( func ) > ;
if constexpr ( is_first_arg_inst ) {
if constexpr ( is_first_arg_inst ) {
InvokeCall < func , is_first_arg_inst > (
InvokeCall < func , is_first_arg_inst > {
ctx , inst , Arg < typename Traits : : template ArgType < I + 2 > > ( ctx , inst - > Arg ( I ) ) . . . ) ;
ctx , inst , Arg < typename Traits : : template ArgType < I + 2 > > ( ctx , inst - > Arg ( I ) ) . . . } ;
} else {
} else {
InvokeCall < func , is_first_arg_inst > (
InvokeCall < func , is_first_arg_inst > {
ctx , inst , Arg < typename Traits : : template ArgType < I + 1 > > ( ctx , inst - > Arg ( I ) ) . . . ) ;
ctx , inst , Arg < typename Traits : : template ArgType < I + 1 > > ( ctx , inst - > Arg ( I ) ) . . . } ;
}
}
}
}