mirror of
https://github.com/vosen/ZLUDA.git
synced 2025-08-05 07:41:25 +00:00
Pass parser state to instruction callbacks
This commit is contained in:
parent
dbd37f97ad
commit
ba17906de8
2 changed files with 21 additions and 20 deletions
|
@ -383,7 +383,7 @@ fn emit_parse_function(
|
||||||
let code_block = &def.code_block.0;
|
let code_block = &def.code_block.0;
|
||||||
let args = def.function_arguments_declarations();
|
let args = def.function_arguments_declarations();
|
||||||
quote! {
|
quote! {
|
||||||
fn #fn_name<'input>( #(#args),* ) -> Instruction<ParsedOperand<'input>> #code_block
|
fn #fn_name<'input>(state: &mut PtxParserState, #(#args),* ) -> Instruction<ParsedOperand<'input>> #code_block
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -473,7 +473,7 @@ fn emit_parse_function(
|
||||||
|
|
||||||
#(#fns_)*
|
#(#fns_)*
|
||||||
|
|
||||||
fn parse_instruction<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> winnow::error::PResult<Instruction<ParsedOperand<'input>>>
|
fn parse_instruction<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult<Instruction<ParsedOperand<'input>>>
|
||||||
{
|
{
|
||||||
use winnow::Parser;
|
use winnow::Parser;
|
||||||
use winnow::token::*;
|
use winnow::token::*;
|
||||||
|
@ -695,7 +695,7 @@ fn emit_definition_parser(
|
||||||
let fn_args = definition.function_arguments();
|
let fn_args = definition.function_arguments();
|
||||||
let fn_name = format_ident!("{}_{}", opcode, fn_idx);
|
let fn_name = format_ident!("{}_{}", opcode, fn_idx);
|
||||||
let fn_call = quote! {
|
let fn_call = quote! {
|
||||||
#fn_name( #(#fn_args),* )
|
#fn_name(&mut stream.state, #(#fn_args),* )
|
||||||
};
|
};
|
||||||
quote! {
|
quote! {
|
||||||
#(#unordered_parse_declarations)*
|
#(#unordered_parse_declarations)*
|
||||||
|
|
|
@ -199,9 +199,10 @@ pub struct RetData {
|
||||||
pub uniform: bool,
|
pub uniform: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
type ParserState<'a, 'input> = Stateful<&'a [Token<'input>], Vec<PtxError>>;
|
type PtxParserState = Vec<PtxError>;
|
||||||
|
type PtxParser<'a, 'input> = Stateful<&'a [Token<'input>], PtxParserState>;
|
||||||
|
|
||||||
fn ident<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<&'input str> {
|
fn ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> {
|
||||||
any.verify_map(|t| {
|
any.verify_map(|t| {
|
||||||
if let Token::Ident(text) = t {
|
if let Token::Ident(text) = t {
|
||||||
Some(text)
|
Some(text)
|
||||||
|
@ -214,7 +215,7 @@ fn ident<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<&'input st
|
||||||
.parse_next(stream)
|
.parse_next(stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn num<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<(&'input str, u32, bool)> {
|
fn num<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<(&'input str, u32, bool)> {
|
||||||
any.verify_map(|t| {
|
any.verify_map(|t| {
|
||||||
Some(match t {
|
Some(match t {
|
||||||
Token::Hex(s) => {
|
Token::Hex(s) => {
|
||||||
|
@ -239,9 +240,9 @@ fn num<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<(&'input str
|
||||||
}
|
}
|
||||||
|
|
||||||
fn take_error<'a, 'input: 'a, O, E>(
|
fn take_error<'a, 'input: 'a, O, E>(
|
||||||
mut parser: impl Parser<ParserState<'a, 'input>, Result<O, (O, PtxError)>, E>,
|
mut parser: impl Parser<PtxParser<'a, 'input>, Result<O, (O, PtxError)>, E>,
|
||||||
) -> impl Parser<ParserState<'a, 'input>, O, E> {
|
) -> impl Parser<PtxParser<'a, 'input>, O, E> {
|
||||||
move |input: &mut ParserState<'a, 'input>| {
|
move |input: &mut PtxParser<'a, 'input>| {
|
||||||
Ok(match parser.parse_next(input)? {
|
Ok(match parser.parse_next(input)? {
|
||||||
Ok(x) => x,
|
Ok(x) => x,
|
||||||
Err((x, err)) => {
|
Err((x, err)) => {
|
||||||
|
@ -252,7 +253,7 @@ fn take_error<'a, 'input: 'a, O, E>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn int_immediate<'a, 'input>(input: &mut ParserState<'a, 'input>) -> PResult<ast::ImmediateValue> {
|
fn int_immediate<'a, 'input>(input: &mut PtxParser<'a, 'input>) -> PResult<ast::ImmediateValue> {
|
||||||
take_error((opt(Token::Minus), num).map(|(neg, x)| {
|
take_error((opt(Token::Minus), num).map(|(neg, x)| {
|
||||||
let (num, radix, is_unsigned) = x;
|
let (num, radix, is_unsigned) = x;
|
||||||
if neg.is_some() {
|
if neg.is_some() {
|
||||||
|
@ -278,7 +279,7 @@ fn int_immediate<'a, 'input>(input: &mut ParserState<'a, 'input>) -> PResult<ast
|
||||||
.parse_next(input)
|
.parse_next(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn f32<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<f32> {
|
fn f32<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<f32> {
|
||||||
take_error(any.verify_map(|t| match t {
|
take_error(any.verify_map(|t| match t {
|
||||||
Token::F32(f) => Some(match u32::from_str_radix(&f[2..], 16) {
|
Token::F32(f) => Some(match u32::from_str_radix(&f[2..], 16) {
|
||||||
Ok(x) => Ok(f32::from_bits(x)),
|
Ok(x) => Ok(f32::from_bits(x)),
|
||||||
|
@ -289,7 +290,7 @@ fn f32<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<f32> {
|
||||||
.parse_next(stream)
|
.parse_next(stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn f64<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<f64> {
|
fn f64<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<f64> {
|
||||||
take_error(any.verify_map(|t| match t {
|
take_error(any.verify_map(|t| match t {
|
||||||
Token::F64(f) => Some(match u64::from_str_radix(&f[2..], 16) {
|
Token::F64(f) => Some(match u64::from_str_radix(&f[2..], 16) {
|
||||||
Ok(x) => Ok(f64::from_bits(x)),
|
Ok(x) => Ok(f64::from_bits(x)),
|
||||||
|
@ -300,7 +301,7 @@ fn f64<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<f64> {
|
||||||
.parse_next(stream)
|
.parse_next(stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn s32<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<i32> {
|
fn s32<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<i32> {
|
||||||
take_error((opt(Token::Minus), num).map(|(sign, x)| {
|
take_error((opt(Token::Minus), num).map(|(sign, x)| {
|
||||||
let (text, radix, _) = x;
|
let (text, radix, _) = x;
|
||||||
match i32::from_str_radix(text, radix) {
|
match i32::from_str_radix(text, radix) {
|
||||||
|
@ -312,7 +313,7 @@ fn s32<'a, 'input>(stream: &mut ParserState<'a, 'input>) -> PResult<i32> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn immediate_value<'a, 'input>(
|
fn immediate_value<'a, 'input>(
|
||||||
stream: &mut ParserState<'a, 'input>,
|
stream: &mut PtxParser<'a, 'input>,
|
||||||
) -> PResult<ast::ImmediateValue> {
|
) -> PResult<ast::ImmediateValue> {
|
||||||
alt((
|
alt((
|
||||||
int_immediate,
|
int_immediate,
|
||||||
|
@ -324,7 +325,7 @@ fn immediate_value<'a, 'input>(
|
||||||
|
|
||||||
impl<Ident> ast::ParsedOperand<Ident> {
|
impl<Ident> ast::ParsedOperand<Ident> {
|
||||||
fn parse<'a, 'input>(
|
fn parse<'a, 'input>(
|
||||||
stream: &mut ParserState<'a, 'input>,
|
stream: &mut PtxParser<'a, 'input>,
|
||||||
) -> PResult<ast::ParsedOperand<&'input str>> {
|
) -> PResult<ast::ParsedOperand<&'input str>> {
|
||||||
use winnow::combinator::*;
|
use winnow::combinator::*;
|
||||||
use winnow::token::any;
|
use winnow::token::any;
|
||||||
|
@ -338,7 +339,7 @@ impl<Ident> ast::ParsedOperand<Ident> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn ident_operands<'a, 'input>(
|
fn ident_operands<'a, 'input>(
|
||||||
stream: &mut ParserState<'a, 'input>,
|
stream: &mut PtxParser<'a, 'input>,
|
||||||
) -> PResult<ast::ParsedOperand<&'input str>> {
|
) -> PResult<ast::ParsedOperand<&'input str>> {
|
||||||
let main_ident = ident.parse_next(stream)?;
|
let main_ident = ident.parse_next(stream)?;
|
||||||
alt((
|
alt((
|
||||||
|
@ -354,7 +355,7 @@ impl<Ident> ast::ParsedOperand<Ident> {
|
||||||
.parse_next(stream)
|
.parse_next(stream)
|
||||||
}
|
}
|
||||||
fn vector_operand<'a, 'input>(
|
fn vector_operand<'a, 'input>(
|
||||||
stream: &mut ParserState<'a, 'input>,
|
stream: &mut PtxParser<'a, 'input>,
|
||||||
) -> PResult<Vec<&'input str>> {
|
) -> PResult<Vec<&'input str>> {
|
||||||
let (_, r1, _, r2) =
|
let (_, r1, _, r2) =
|
||||||
(Token::LBracket, ident, Token::Comma, ident).parse_next(stream)?;
|
(Token::LBracket, ident, Token::Comma, ident).parse_next(stream)?;
|
||||||
|
@ -565,9 +566,9 @@ derive_parser!(
|
||||||
|
|
||||||
// https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-mov
|
// https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-mov
|
||||||
mov.type d, a => {
|
mov.type d, a => {
|
||||||
Instruction::Mov{
|
Instruction::Mov {
|
||||||
data: MovDetails::new(type_.into()),
|
data: MovDetails::new(type_.into()),
|
||||||
arguments: MovArgs { dst: d, src: a }
|
arguments: MovArgs { dst: d, src: a },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.type: ScalarType = { .pred,
|
.type: ScalarType = { .pred,
|
||||||
|
@ -704,7 +705,7 @@ fn main() {
|
||||||
);
|
);
|
||||||
let tokens = lexer.map(|t| t.unwrap()).collect::<Vec<_>>();
|
let tokens = lexer.map(|t| t.unwrap()).collect::<Vec<_>>();
|
||||||
println!("{:?}", &tokens);
|
println!("{:?}", &tokens);
|
||||||
let mut stream = ParserState {
|
let mut stream = PtxParser {
|
||||||
input: &tokens[..],
|
input: &tokens[..],
|
||||||
state: Vec::new(),
|
state: Vec::new(),
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue