1
2
3
4
5 package asmgen
6
7 var ArchARM = &Arch{
8 Name: "arm",
9 WordBits: 32,
10 WordBytes: 4,
11 CarrySafeLoop: true,
12
13 regs: []string{
14
15
16
17
18
19 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R11", "R12",
20 },
21 regShift: true,
22
23 mov: "MOVW",
24 add: "ADD",
25 adds: "ADD.S",
26 adc: "ADC",
27 adcs: "ADC.S",
28 sub: "SUB",
29 subs: "SUB.S",
30 sbc: "SBC",
31 sbcs: "SBC.S",
32 rsb: "RSB",
33 and: "AND",
34 or: "ORR",
35 xor: "EOR",
36
37 mulWideF: armMulWide,
38
39 addWords: "ADD %s<<2, %s, %s",
40
41 jmpZero: "TEQ $0, %s; BEQ %s",
42 jmpNonZero: "TEQ $0, %s; BNE %s",
43
44 loadIncN: armLoadIncN,
45 loadDecN: armLoadDecN,
46 storeIncN: armStoreIncN,
47 storeDecN: armStoreDecN,
48 }
49
50 func armMulWide(a *Asm, src1, src2, dstlo, dsthi Reg) {
51 a.Printf("\tMULLU %s, %s, (%s, %s)\n", src1, src2, dsthi, dstlo)
52 }
53
54 func armLoadIncN(a *Asm, p RegPtr, regs []Reg) {
55 for _, r := range regs {
56 a.Printf("\tMOVW.P %d(%s), %s\n", a.Arch.WordBytes, p, r)
57 }
58 }
59
60 func armLoadDecN(a *Asm, p RegPtr, regs []Reg) {
61 for _, r := range regs {
62 a.Printf("\tMOVW.W %d(%s), %s\n", -a.Arch.WordBytes, p, r)
63 }
64 }
65
66 func armStoreIncN(a *Asm, p RegPtr, regs []Reg) {
67 for _, r := range regs {
68 a.Printf("\tMOVW.P %s, %d(%s)\n", r, a.Arch.WordBytes, p)
69 }
70 }
71
72 func armStoreDecN(a *Asm, p RegPtr, regs []Reg) {
73 for _, r := range regs {
74 a.Printf("\tMOVW.W %s, %d(%s)\n", r, -a.Arch.WordBytes, p)
75 }
76 }
77
View as plain text