mirror of
https://github.com/golang/go
synced 2024-11-20 09:54:45 -07:00
[dev.cc] cmd/asm: add addr package
This simple package holds the definition of the Addr (address) type that represents addresses inside the assembler. It has no dependencies. Change-Id: I7573fd70f1847ef68e3d6b663dc4c39eb2ebf8b3 Reviewed-on: https://go-review.googlesource.com/3193 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
6017f68029
commit
40eb0ed0d8
112
src/cmd/asm/internal/addr/addr.go
Normal file
112
src/cmd/asm/internal/addr/addr.go
Normal file
@ -0,0 +1,112 @@
|
||||
// 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 addr holds the definition of an instruction address.
|
||||
package addr
|
||||
|
||||
// Addr represents a parsed address.
|
||||
type Addr struct {
|
||||
IsStatic bool // symbol<>
|
||||
IsImmediateConstant bool // $3
|
||||
IsImmediateAddress bool // $main·main(SB)
|
||||
IsIndirect bool // (R1)
|
||||
HasRegister bool // register is set
|
||||
HasRegister2 bool // register2 is set
|
||||
HasFloat bool // float is set
|
||||
HasOffset bool // offset is set
|
||||
HasString bool // string is set
|
||||
Symbol string // "main·main"
|
||||
Register int16 // R1
|
||||
Register2 int16 // R1 in R0:R1
|
||||
Offset int64 // 3
|
||||
Float float64 // 1.0e2 (floating constant)
|
||||
String string // "hi" (string constant)
|
||||
Index int16 // R1 in (R1*8)
|
||||
Scale int8 // 8 in (R1*8)
|
||||
}
|
||||
|
||||
const (
|
||||
// IsStatic does not appear here; Is and Has methods ignore it.
|
||||
ImmediateConstant = 1 << iota
|
||||
ImmediateAddress
|
||||
Indirect
|
||||
Symbol
|
||||
Register
|
||||
Register2
|
||||
Offset
|
||||
Float
|
||||
String
|
||||
Index
|
||||
Scale
|
||||
)
|
||||
|
||||
// Has reports whether the address has any of the specified elements.
|
||||
// Indirect and immediate are not checked.
|
||||
func (a *Addr) Has(mask int) bool {
|
||||
if mask&Symbol != 0 && a.Symbol != "" {
|
||||
return true
|
||||
}
|
||||
if mask&Register != 0 && a.HasRegister {
|
||||
return true
|
||||
}
|
||||
if mask&Register2 != 0 && a.HasRegister2 {
|
||||
return true
|
||||
}
|
||||
if mask&Offset != 0 && a.HasOffset {
|
||||
return true
|
||||
}
|
||||
if mask&Float != 0 && a.HasFloat {
|
||||
return true
|
||||
}
|
||||
if mask&String != 0 && a.HasString {
|
||||
return true
|
||||
}
|
||||
if mask&Index != 0 && a.Index != 0 {
|
||||
return true
|
||||
}
|
||||
if mask&Scale != 0 && a.Scale != 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Is reports whether the address has exactly the specified elements.
|
||||
// Indirect and immediate are checked.
|
||||
func (a *Addr) Is(mask int) bool {
|
||||
if (mask&ImmediateConstant == 0) != !a.IsImmediateConstant {
|
||||
return false
|
||||
}
|
||||
if (mask&ImmediateAddress == 0) != !a.IsImmediateAddress {
|
||||
return false
|
||||
}
|
||||
if (mask&Indirect == 0) != !a.IsIndirect {
|
||||
return false
|
||||
}
|
||||
if (mask&Symbol == 0) != (a.Symbol == "") {
|
||||
return false
|
||||
}
|
||||
if (mask&Register == 0) != !a.HasRegister {
|
||||
return false
|
||||
}
|
||||
if (mask&Register2 == 0) != !a.HasRegister2 {
|
||||
return false
|
||||
}
|
||||
if (mask&Offset == 0) != !a.HasOffset {
|
||||
// $0 has the immediate bit but value 0.
|
||||
return false
|
||||
}
|
||||
if (mask&Float == 0) != !a.HasFloat {
|
||||
return false
|
||||
}
|
||||
if (mask&String == 0) != !a.HasString {
|
||||
return false
|
||||
}
|
||||
if (mask&Index == 0) != (a.Index == 0) {
|
||||
return false
|
||||
}
|
||||
if (mask&Scale == 0) != (a.Scale == 0) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
Loading…
Reference in New Issue
Block a user