Implement enough asm generation to compile rule110

This commit is contained in:
0x4261756D 2023-01-03 21:52:48 +01:00
parent 870dcb105d
commit 3d2cd64c6d
2 changed files with 80 additions and 10 deletions

View File

@ -361,6 +361,17 @@ fn generate_assembly_linux_x64_block(operations: &Vec<Operation>, functions: &Ve
data.code += "\tinc r12\n"; data.code += "\tinc r12\n";
data.code += "\tinc r13\n"; data.code += "\tinc r13\n";
} }
Operation::Swap(line, col) =>
{
data.code += format!("\t;;swp {}:{}\n", line, col).as_str();
data.code += "\tmov rax, [queue+8*r12]\n";
data.code += "\tmov rbx, [queue+8*r12+8]\n";
data.code += "\tadd r12, 2\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += "\tmov [queue+8*r13], rbx\n";
data.code += "\tmov [queue+8*r13+8], rax\n";
data.code += "\tadd r13, 2\n";
}
Operation::While(while_operations, line, col) => Operation::While(while_operations, line, col) =>
{ {
data.code += format!("\t;;while {}:{}\n", line, col).as_str(); data.code += format!("\t;;while {}:{}\n", line, col).as_str();
@ -468,6 +479,28 @@ fn generate_assembly_linux_x64_block(operations: &Vec<Operation>, functions: &Ve
data.code += "\tmov [queue+8*r13], rax\n"; data.code += "\tmov [queue+8*r13], rax\n";
data.code += "\tinc r13\n"; data.code += "\tinc r13\n";
} }
"+" =>
{
data.code += "\tmov qword rax, [queue+8*r12]\n";
data.code += "\tinc r12\n";
data.code += "\tmov qword rbx, [queue+8*r12]\n";
data.code += "\tinc r12\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += "\tadd rax, rbx\n";
data.code += "\tmov [queue+8*r13], rax\n";
data.code += "\tinc r13\n";
}
"*" =>
{
data.code += "\tmov qword rax, [queue+8*r12]\n";
data.code += "\tinc r12\n";
data.code += "\tmov qword rbx, [queue+8*r12]\n";
data.code += "\tinc r12\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += "\tmul rbx\n";
data.code += "\tmov [queue+8*r13], rax\n";
data.code += "\tinc r13\n";
}
">" => ">" =>
{ {
data.code += "\tmov rbx, 0\n"; data.code += "\tmov rbx, 0\n";
@ -516,6 +549,28 @@ fn generate_assembly_linux_x64_block(operations: &Vec<Operation>, functions: &Ve
data.code += "\tmov qword [queue+8*r13], rbx\n"; data.code += "\tmov qword [queue+8*r13], rbx\n";
data.code += "\tinc r13\n"; data.code += "\tinc r13\n";
} }
"==" =>
{
data.code += "\tmov rbx, 0\n";
data.code += "\tmov rcx, 1\n";
data.code += "\tmov rax, [queue+8*r12]\n";
data.code += "\tcmp qword rax, [queue+8*r12+8]\n";
data.code += "\tcmove rbx, rcx\n";
data.code += "\tadd r12, 2\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += "\tmov qword [queue+8*r13], rbx\n";
data.code += "\tinc r13\n";
}
"&&" =>
{
data.code += "\tmov rax, [queue+8*r12]\n";
data.code += "\tmov rbx, [queue+8*r12+8]\n";
data.code += "\tand rax, rbx\n";
data.code += "\tadd r12, 2\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += "\tmov [queue+8*r13], rax\n";
data.code += "\tinc r13\n";
}
_ => todo!("intrinsic {} {}:{}", name, line, col) _ => todo!("intrinsic {} {}:{}", name, line, col)
} }
} }
@ -529,7 +584,8 @@ fn generate_assembly_linux_x64_block(operations: &Vec<Operation>, functions: &Ve
data.code += "\tmov rax, [queue+8*r12]\n"; data.code += "\tmov rax, [queue+8*r12]\n";
data.code += "\tinc r12\n"; data.code += "\tinc r12\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE; data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += format!("\tmov qword [queue+8*r13], [arr_{}+rax]\n", name).as_str(); data.code += format!("\tmov qword rbx, [arr_{}+8*rax]\n", name).as_str();
data.code += "\tmov qword [queue+8*r13], rbx\n";
data.code += "\tinc r13\n"; data.code += "\tinc r13\n";
} }
"write" => "write" =>
@ -537,10 +593,17 @@ fn generate_assembly_linux_x64_block(operations: &Vec<Operation>, functions: &Ve
data.code += "\tmov rax, [queue+8*r12]\n"; data.code += "\tmov rax, [queue+8*r12]\n";
data.code += "\tinc r12\n"; data.code += "\tinc r12\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE; data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
data.code += format!("\tmov qword [arr_{}+rax], [queue+8*r12]\n", name).as_str(); data.code += "\tmov qword rbx, [queue+8*r12]\n";
data.code += format!("\tmov qword [arr_{}+8*rax], rbx\n", name).as_str();
data.code += "\tinc r12\n"; data.code += "\tinc r12\n";
data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE; data.code += ASSEMBLY_LINUX_X64_TRY_RESET_QUEUE;
} }
"length" =>
{
let array = arrays.iter().find(|x| &x.name == name).unwrap();
data.code += format!("\tmov qword [queue+8*r13], {}\n", array.length).as_str();
data.code += "\tinc r13\n";
}
_ => todo!("apply {}", word) _ => todo!("apply {}", word)
} }
} }
@ -1217,7 +1280,7 @@ fn extract_arrays(tokens: &mut Vec<Token>, intrinsics: &HashMap<&str, (Vec<Datat
{ {
data.push(default_val.clone()); data.push(default_val.clone());
} }
arrays.push(Arr { name: name.clone(), datatype, length: size , data }); arrays.push(Arr { name: sanitize_name(name.clone()), datatype, length: size , data });
} }
} }
else else
@ -1245,6 +1308,11 @@ fn extract_arrays(tokens: &mut Vec<Token>, intrinsics: &HashMap<&str, (Vec<Datat
return Ok(arrays); return Ok(arrays);
} }
fn sanitize_name(name: String) -> String
{
return name.replace("-", "_").replace("+", "_");
}
fn str_to_datatype(s: &str, line: i32, col: i32) -> Result<Datatype, String> fn str_to_datatype(s: &str, line: i32, col: i32) -> Result<Datatype, String>
{ {
match s match s
@ -1350,7 +1418,7 @@ fn extract_functions(tokens: &mut Vec<Token>, intrinsics: &HashMap<&str, (Vec<Da
println!("outs: {:?}", outs); println!("outs: {:?}", outs);
} }
let block = parse_block(&mut tokens_iter, intrinsics, debug)?; let block = parse_block(&mut tokens_iter, intrinsics, debug)?;
functions.push(Function {name: word.clone(), ins, outs, content: block}); functions.push(Function {name: sanitize_name(word.clone()), ins, outs, content: block});
break; break;
} }
} }
@ -1418,7 +1486,7 @@ fn parse_until_delimiter(tokens_iter: &mut Peekable<std::slice::Iter<Token>>, in
} }
Token::Apply(name, word, line, col) => Token::Apply(name, word, line, col) =>
{ {
operations.push(Operation::Apply(name.clone(), word.clone(), *line, *col)); operations.push(Operation::Apply(sanitize_name(name.clone()), word.clone(), *line, *col));
} }
Token::Keyword(word, line, col) => Token::Keyword(word, line, col) =>
{ {
@ -1490,7 +1558,7 @@ fn parse_until_delimiter(tokens_iter: &mut Peekable<std::slice::Iter<Token>>, in
} }
else else
{ {
operations.push(Operation::FunctionCall(word.clone(), *line, *col)); operations.push(Operation::FunctionCall(sanitize_name(word.clone()), *line, *col));
} }
} }
} }
@ -1594,7 +1662,7 @@ fn tokenize(text: &str) -> Result<Vec<Token>, String>
} }
else else
{ {
tokens.push(Token::Apply(application_name.clone(), word.clone(), line, col)); tokens.push(Token::Apply(sanitize_name(application_name.clone()), word.clone(), line, col));
application_name.clear(); application_name.clear();
} }
word.clear(); word.clear();
@ -1639,7 +1707,7 @@ fn tokenize(text: &str) -> Result<Vec<Token>, String>
} }
else else
{ {
tokens.push(Token::Apply(application_name.clone(), word.clone(), line, col)); tokens.push(Token::Apply(sanitize_name(application_name.clone()), word.clone(), line, col));
} }
} }
} }

View File

@ -24,8 +24,10 @@ function bool => str boolToStr
1 0 < boolToStr println 1 0 < boolToStr println
1 0 >= boolToStr println 1 0 >= boolToStr println
1 0 <= boolToStr println 1 0 <= boolToStr println
1 0 == boolToStr println
"" println
1 1 > boolToStr println 1 1 > boolToStr println
1 1 < boolToStr println 1 1 < boolToStr println
1 1 >= boolToStr println 1 1 >= boolToStr println
1 1 <= boolToStr println 1 1 <= boolToStr println
1 1 == boolToStr println