Skip to content

Commit e02bc82

Browse files
authored
Merge pull request #7 from it-is-final/arm-extra
Add `RSC` and `RSB` instructions.
2 parents cafca11 + 88d209b commit e02bc82

5 files changed

Lines changed: 11 additions & 6 deletions

File tree

ARM/arm.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type reg_or_imm = Reg of register | Imm of int32
1313

1414
type operand = Immediate of int32 | Register of register | ScaledRegister of register * reg_or_imm scale_type
1515
type register_offset = OImmediate of register * sign * int32 | ORegister of register * sign * register | OScaledRegister of register * sign * register * int32 scale_type
16-
type data_proc_instr = ADC | SBC | BIC | AND (* for JP: *) | ADD | SUB | ORR | EOR
16+
type data_proc_instr = ADC | SBC | RSC | BIC | AND (* for JP: *) | ADD | SUB | ORR | EOR | RSB
1717
type mov_instr = MOV | MVN
1818
type mem_instr = LDR | STR
1919

@@ -282,12 +282,14 @@ let calculation_to_binary instr s cond rd rn op2 =
282282
let opcode = match instr with
283283
| ADC -> 0b0000_1010_0000_0000_0000_0000_0000
284284
| SBC -> 0b0000_1100_0000_0000_0000_0000_0000
285+
| RSC -> 0b0000_1110_0000_0000_0000_0000_0000
285286
| BIC -> 0b0001_1100_0000_0000_0000_0000_0000
286287
| AND -> 0b0000_0000_0000_0000_0000_0000_0000
287288
| ADD -> 0b0000_1000_0000_0000_0000_0000_0000
288289
| SUB -> 0b0000_0100_0000_0000_0000_0000_0000
289290
| ORR -> 0b0001_1000_0000_0000_0000_0000_0000
290291
| EOR -> 0b0000_0010_0000_0000_0000_0000_0000
292+
| RSB -> 0b0000_0110_0000_0000_0000_0000_0000
291293
in
292294
let scode = if s then 1 else 0 in
293295
let scode = shift_left (of_int scode) 20 in

ARM/arm.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type reg_or_imm = Reg of register | Imm of int32
1313

1414
type operand = Immediate of int32 | Register of register | ScaledRegister of register * reg_or_imm scale_type
1515
type register_offset = OImmediate of register * sign * int32 | ORegister of register * sign * register | OScaledRegister of register * sign * register * int32 scale_type
16-
type data_proc_instr = ADC | SBC | BIC | AND (* for JP: *) | ADD | SUB | ORR | EOR
16+
type data_proc_instr = ADC | SBC | RSC | BIC | AND (* for JP: *) | ADD | SUB | ORR | EOR | RSB
1717
type mov_instr = MOV | MVN
1818
type mem_instr = LDR | STR
1919

@@ -55,4 +55,4 @@ val arm_to_binary : arm -> int32 list
5555
val reverse_endianness : int32 -> int32
5656

5757
val rotate_right : int32 -> int32
58-
val rotate_left : int32 -> int32
58+
val rotate_left : int32 -> int32

ARM/arm_printer.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ let data_proc_instr_to_str instr =
8686
match instr with
8787
| ADC -> "ADC" | SBC -> "SBC" | AND -> "AND" | BIC -> "BIC"
8888
| ADD -> "ADD" | SUB -> "SUB" | ORR -> "ORR" | EOR -> "EOR"
89+
| RSC -> "RSC" | RSB -> "RSB"
8990

9091
let pp_arm fmt arm =
9192
match arm with

ARM/parser_ast.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,17 @@ let asm_cmd3_to_arm env cmd args =
230230
| "LDR" -> Mem { instr=LDR ; typ ; cond ; rd=get_rd args ; ro=get_ro env args }
231231
| "STR" -> Mem { instr=STR ; typ ; cond ; rd=get_rd args ; ro=get_ro env args }
232232
| "MOV" -> Mov { instr=MOV ; s ; cond ; rd=get_rd args ; rs=get_rs env args }
233-
| "MVN" -> Mov { instr=MVN; s ; cond ; rd=get_rd args ; rs=get_rs env args }
233+
| "MVN" -> Mov { instr=MVN ; s ; cond ; rd=get_rd args ; rs=get_rs env args }
234234
| "ADC" -> DataProc { instr=ADC ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
235235
| "SBC" -> DataProc { instr=SBC ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
236+
| "RSC" -> DataProc { instr=RSC ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
236237
| "BIC" -> DataProc { instr=BIC ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
237238
| "AND" -> DataProc { instr=AND ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
238239
| "ADD" -> DataProc { instr=ADD ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
239240
| "SUB" -> DataProc { instr=SUB ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
240241
| "ORR" -> DataProc { instr=ORR ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
241242
| "EOR" -> DataProc { instr=EOR ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
243+
| "RSB" -> DataProc { instr=RSB ; s ; cond ; rd=get_rd args ; rn=get_rn args ; op2=get_op2 env args }
242244
| _ -> raise StructError
243245
with Failure _ | Invalid_argument _ -> raise StructError
244246

html/doc/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ <h4>USA/European versions</h4>
9898
<ul>
9999
<li>LDR (B/SB/H/SH/W/T/BT) and STR (B/H/W/T/BT)</li>
100100
<li>MOV and MVN</li>
101-
<li>ADC, SBC, BIC and AND (the latter is writable only if the first operand is r0)</li>
101+
<li>ADC, SBC, RSC, BIC and AND (the latter is writable only if the first operand is r0)</li>
102102
<li>B and BL</li>
103103
</ul>
104104

@@ -118,7 +118,7 @@ <h4>Japanese version</h4>
118118

119119
<p>The information above still applies to the Japanese version. However, as more characters are available in the Japanese version, some additional commands are available:</p>
120120
<ul>
121-
<li>ADD, SUB, ORR and EOR</li>
121+
<li>ADD, SUB, ORR, EOR and RSB</li>
122122
<li>BX and BLX</li>
123123
</ul>
124124

0 commit comments

Comments
 (0)