arm.mx raw

   1  // Copyright 2025 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package asmgen
   6  
   7  var ArchARM = &Arch{
   8  	Name:          "arm",
   9  	WordBits:      32,
  10  	WordBytes:     4,
  11  	CarrySafeLoop: true,
  12  
  13  	regs: [][]byte{
  14  		// R10 is g.
  15  		// R11 is the assembler/linker temporary (but we use it as a regular register).
  16  		// R13 is SP.
  17  		// R14 is LR.
  18  		// R15 is PC.
  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