Index: src/cmd/compile/internal/amd64/ggen.go
--- src/cmd/compile/internal/amd64/ggen.go.orig
+++ src/cmd/compile/internal/amd64/ggen.go
@@ -10,8 +10,11 @@ import (
 	"cmd/compile/internal/types"
 	"cmd/internal/obj"
 	"cmd/internal/obj/x86"
+	"internal/buildcfg"
 )
 
+var isOpenBSD = buildcfg.GOOS == "openbsd"
+
 // DUFFZERO consists of repeated blocks of 4 MOVUPSs + LEAQ,
 // See runtime/mkduff.go.
 const (
@@ -68,7 +71,7 @@ func zerorange(pp *objw.Progs, p *obj.Prog, off, cnt i
 		if cnt%16 != 0 {
 			p = pp.Append(p, x86.AMOVUPS, obj.TYPE_REG, x86.REG_X15, 0, obj.TYPE_MEM, x86.REG_SP, off+cnt-int64(16))
 		}
-	} else if cnt <= int64(128*types.RegSize) {
+	} else if !isOpenBSD && (cnt <= int64(128*types.RegSize)) {
 		// Save DI to r12. With the amd64 Go register abi, DI can contain
 		// an incoming parameter, whereas R12 is always scratch.
 		p = pp.Append(p, x86.AMOVQ, obj.TYPE_REG, x86.REG_DI, 0, obj.TYPE_REG, x86.REG_R12, 0)
