| // 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 } |