// Copyright 2025 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package asmgen import "fmt" var Arch386 = &Arch{ Name: "386", WordBits: 32, WordBytes: 4, regs: []string{ "BX", "SI", "DI", "BP", "CX", "DX", "AX", // last, to leave available for hinted allocation }, op3: x86Op3, hint: x86Hint, memOK: true, subCarryIsBorrow: true, maxColumns: 1, // not enough registers for more // Note: It would be nice to not set memIndex and then // delete all the code in pipe.go that supports it. // But a few routines, notably lshVU and mulAddVWW, // benefit dramatically from the use of index registers. // Perhaps some day we will decide 386 performance // does not matter enough to keep this code. memIndex: _386MemIndex, mov: "MOVL", adds: "ADDL", adcs: "ADCL", subs: "SUBL", sbcs: "SBBL", lsh: "SHLL", lshd: "SHLL", rsh: "SHRL", rshd: "SHRL", and: "ANDL", or: "ORL", xor: "XORL", neg: "NEGL", lea: "LEAL", mulWideF: x86MulWide, addWords: "LEAL (%[2]s)(%[1]s*4), %[3]s", jmpZero: "TESTL %[1]s, %[1]s; JZ %[2]s", jmpNonZero: "TESTL %[1]s, %[1]s; JNZ %[2]s", loopBottom: "SUBL $1, %[1]s; JNZ %[2]s", loopBottomNeg: "ADDL $1, %[1]s; JNZ %[2]s", } func _386MemIndex(a *Asm, off int, ix Reg, p RegPtr) Reg { return Reg{fmt.Sprintf("%d(%s)(%s*%d)", off, p, ix, a.Arch.WordBytes)} }