| // 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. | |
| //go:build ignore | |
| // This program can be compiled with -S to produce a “cheat sheet” | |
| // for filling out a new Arch: the compiler will show you how to implement | |
| // the various operations. | |
| // | |
| // Usage (replace TARGET with your target architecture): | |
| // | |
| // GOOS=linux GOARCH=TARGET go build -gcflags='-p=cheat -S' cheat.go | |
| package p | |
| import "math/bits" | |
| func mov(x, y uint) uint { return y } | |
| func zero() uint { return 0 } | |
| func add(x, y uint) uint { return x + y } | |
| func adds(x, y, c uint) (uint, uint) { return bits.Add(x, y, 0) } | |
| func adcs(x, y, c uint) (uint, uint) { return bits.Add(x, y, c) } | |
| func sub(x, y uint) uint { return x + y } | |
| func subs(x, y uint) (uint, uint) { return bits.Sub(x, y, 0) } | |
| func sbcs(x, y, c uint) (uint, uint) { return bits.Sub(x, y, c) } | |
| func mul(x, y uint) uint { return x * y } | |
| func mulWide(x, y uint) (uint, uint) { return bits.Mul(x, y) } | |
| func lsh(x, s uint) uint { return x << s } | |
| func rsh(x, s uint) uint { return x >> s } | |
| func and(x, y uint) uint { return x & y } | |
| func or(x, y uint) uint { return x | y } | |
| func xor(x, y uint) uint { return x ^ y } | |
| func neg(x uint) uint { return -x } | |
| func loop(x int) int { | |
| s := 0 | |
| for i := 1; i < x; i++ { | |
| s += i | |
| if s == 98 { // useful for jmpEqual | |
| return 99 | |
| } | |
| if s == 99 { | |
| return 100 | |
| } | |
| if s == 0 { // useful for jmpZero | |
| return 101 | |
| } | |
| if s != 0 { // useful for jmpNonZero | |
| s *= 3 | |
| } | |
| s += 2 // keep last condition from being inverted | |
| } | |
| return s | |
| } | |
| func mem(x *[10]struct{ a, b uint }, i int) uint { return x[i].b } |