Source file src/math/big/internal/asmgen/arm.go

     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: []string{
    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  

View as plain text