Skip to content

Commit a14abef

Browse files
committed
Added SUBS support
1 parent 0627a6e commit a14abef

4 files changed

Lines changed: 31 additions & 3 deletions

File tree

immediates/set_flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const (
99

1010
func (s SetFlags) Binary() uint32 {
1111
if s {
12-
return 1 << 29
12+
return 1
1313
} else {
1414
return 0
1515
}

instructions/add.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func ADD(
1919
) Add {
2020
return Add(
2121
0x8B000000 |
22-
(setFlags.Binary()) |
22+
(setFlags.Binary() << 29) |
2323
(Xm.Binary() << 16) |
2424
(Xn.Binary() << 5) |
2525
(Xd.Binary()),

instructions/sub.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ func SUB(
1414
Xd registers.GPRegister,
1515
Xn registers.GPRegister,
1616
Xm registers.GPRegister,
17+
setFlags immediates.SetFlags,
1718
) Sub {
1819
return Sub(
1920
0xCB000000 |
21+
(setFlags.Binary() << 29) |
2022
(Xm.Binary() << 16) |
2123
(Xn.Binary() << 5) |
2224
(Xd.Binary()),
@@ -39,8 +41,12 @@ func (i Sub) Xm() registers.GPRegister {
3941
return registers.GPRegister((i >> 16) & 0x1F)
4042
}
4143

44+
func (i Sub) SetFlags() immediates.SetFlags {
45+
return immediates.SetFlagsFromBinary(uint32(i))
46+
}
47+
4248
func (i Sub) String() string {
43-
return fmt.Sprintf("sub %s, %s, %s", i.Xd(), i.Xn(), i.Xm())
49+
return fmt.Sprintf("sub%s %s, %s, %s", i.SetFlags(), i.Xd(), i.Xn(), i.Xm())
4450
}
4551

4652
// SUBI instruction (SUB with immediate)

instructions/sub_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ func TestSub(t *testing.T) {
1414
registers.GPRegisterX3,
1515
registers.GPRegisterX4,
1616
registers.GPRegisterX5,
17+
immediates.DoNotSetFlags,
1718
))
1819

1920
// SUB X27, X26, X25
2021
AssertExpectedInstruction(t, "sub x27, x26, x25", instructions.SUB(
2122
registers.GPRegisterX27,
2223
registers.GPRegisterX26,
2324
registers.GPRegisterX25,
25+
immediates.DoNotSetFlags,
2426
))
2527
}
2628

@@ -30,27 +32,31 @@ func TestSubWithXZR(t *testing.T) {
3032
registers.GPRegisterXZR,
3133
registers.GPRegisterX4,
3234
registers.GPRegisterX5,
35+
immediates.DoNotSetFlags,
3336
))
3437

3538
// Test SUB with XZR as first source
3639
AssertExpectedInstruction(t, "sub x3, xzr, x5", instructions.SUB(
3740
registers.GPRegisterX3,
3841
registers.GPRegisterXZR,
3942
registers.GPRegisterX5,
43+
immediates.DoNotSetFlags,
4044
))
4145

4246
// Test SUB with XZR as second source
4347
AssertExpectedInstruction(t, "sub x3, x4, xzr", instructions.SUB(
4448
registers.GPRegisterX3,
4549
registers.GPRegisterX4,
4650
registers.GPRegisterXZR,
51+
immediates.DoNotSetFlags,
4752
))
4853

4954
// Multiple XZR registers
5055
AssertExpectedInstruction(t, "sub xzr, xzr, xzr", instructions.SUB(
5156
registers.GPRegisterXZR,
5257
registers.GPRegisterXZR,
5358
registers.GPRegisterXZR,
59+
immediates.DoNotSetFlags,
5460
))
5561
}
5662

@@ -69,3 +75,19 @@ func TestSubImm(t *testing.T) {
6975
immediates.Immediate12(1000),
7076
))
7177
}
78+
79+
func TestSubDoSetFlags(t *testing.T) {
80+
AssertExpectedInstruction(t, "subs x0, x1, x2", instructions.SUB(
81+
registers.GPRegisterX0,
82+
registers.GPRegisterX1,
83+
registers.GPRegisterX2,
84+
immediates.DoSetFlags,
85+
))
86+
87+
AssertExpectedInstruction(t, "subs xzr, x30, x29", instructions.SUB(
88+
registers.GPRegisterXZR,
89+
registers.GPRegisterX30,
90+
registers.GPRegisterX29,
91+
immediates.DoSetFlags,
92+
))
93+
}

0 commit comments

Comments
 (0)