mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
Use *Node of type ONAME instead of string as the key for variable maps. This will prevent aliasing between two identically named but differently scoped variables. Introduce an Aux value that encodes the offset of a variable from a base pointer (either global base pointer or stack pointer). Allow LEAQ and derivatives (MOVQ, etc.) to also have such an Aux field. Allocate space for AUTO variables in stackalloc. Change-Id: Ibdccdaea4bbc63a1f4882959ac374f2b467e3acd Reviewed-on: https://go-review.googlesource.com/11238 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
42 lines
1.8 KiB
Go
42 lines
1.8 KiB
Go
// Copyright 2015 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 ssa
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestShiftConstAMD64(t *testing.T) {
|
|
c := NewConfig("amd64", DummyFrontend{t})
|
|
fun := makeConstShiftFunc(c, 18, OpLsh, TypeUInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
|
|
fun = makeConstShiftFunc(c, 66, OpLsh, TypeUInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHLQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
|
|
fun = makeConstShiftFunc(c, 18, OpRsh, TypeUInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 1, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
|
|
fun = makeConstShiftFunc(c, 66, OpRsh, TypeUInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SHRQconst: 0, OpAMD64CMPQconst: 0, OpAMD64ANDQconst: 0})
|
|
fun = makeConstShiftFunc(c, 18, OpRsh, TypeInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0})
|
|
fun = makeConstShiftFunc(c, 66, OpRsh, TypeInt64)
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{OpAMD64SARQconst: 1, OpAMD64CMPQconst: 0})
|
|
}
|
|
|
|
func makeConstShiftFunc(c *Config, amount int64, op Op, typ Type) fun {
|
|
ptyp := &TypeImpl{Size_: 8, Ptr: true, Name: "ptr"}
|
|
fun := Fun(c, "entry",
|
|
Bloc("entry",
|
|
Valu("mem", OpArg, TypeMem, 0, ".mem"),
|
|
Valu("SP", OpSP, TypeUInt64, 0, nil),
|
|
Valu("argptr", OpOffPtr, ptyp, 8, nil, "SP"),
|
|
Valu("resptr", OpOffPtr, ptyp, 16, nil, "SP"),
|
|
Valu("load", OpLoad, typ, 0, nil, "argptr", "mem"),
|
|
Valu("c", OpConst, TypeUInt64, amount, nil),
|
|
Valu("shift", op, typ, 0, nil, "load", "c"),
|
|
Valu("store", OpStore, TypeMem, 0, nil, "resptr", "shift", "mem"),
|
|
Exit("store")))
|
|
Compile(fun.f)
|
|
return fun
|
|
}
|