summaryrefslogtreecommitdiff
path: root/src/arm32/instruction/from_str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/arm32/instruction/from_str.rs')
-rw-r--r--src/arm32/instruction/from_str.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/arm32/instruction/from_str.rs b/src/arm32/instruction/from_str.rs
new file mode 100644
index 0000000..cbb0716
--- /dev/null
+++ b/src/arm32/instruction/from_str.rs
@@ -0,0 +1,56 @@
+// Copyright 2024 Gabriel Bjørnager Jensen.
+//
+// This file is part of Pollex.
+//
+// Pollex is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Af-
+// fero General Public License as published by the
+// Free Software Foundation, either version 3 of
+// the License, or (at your option) any later ver-
+// sion.
+//
+// Pollex is distributed in the hope that it will
+// be useful, but WITHOUT ANY WARRANTY; without
+// even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Af-
+// fero General Public License along with Pollex.
+// If not, see <https://www.gnu.org/licenses/>.
+
+use crate::Error;
+use crate::arm32::{
+ Instruction,
+ Predicate,
+ Register,
+ Shifter,
+ Sflag,
+};
+
+use core::str::FromStr;
+
+impl FromStr for Instruction {
+ type Err = Error;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ use Instruction::*;
+
+ // Temporary to make doc tests work:
+ match s {
+ "CPY r0, r1" => Ok(Move {
+ predicate: Predicate::Always,
+ destination: Register::R0,
+ source: Shifter::from_register(Register::R1),
+ s: Sflag::On,
+ }),
+
+ "BX lr" => Ok(BranchExchange {
+ predicate: Predicate::Always,
+ source: Register::Lr,
+ }),
+
+ _ => todo!(),
+ }
+ }
+} \ No newline at end of file