2018-12-26 16:42:39 -08:00
|
|
|
package operand
|
|
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
2019-01-04 21:38:23 -08:00
|
|
|
// Constant represents a constant literal.
|
2018-12-26 16:42:39 -08:00
|
|
|
type Constant interface {
|
|
|
|
|
Op
|
|
|
|
|
Bytes() int
|
|
|
|
|
constant()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:generate go run make_const.go -output zconst.go
|
|
|
|
|
|
|
|
|
|
// String is a string constant.
|
|
|
|
|
type String string
|
|
|
|
|
|
2019-01-04 21:38:23 -08:00
|
|
|
// Asm returns an assembly syntax representation of the string s.
|
2018-12-26 16:42:39 -08:00
|
|
|
func (s String) Asm() string { return fmt.Sprintf("$%q", s) }
|
2019-01-04 21:38:23 -08:00
|
|
|
|
|
|
|
|
// Bytes returns the length of s.
|
|
|
|
|
func (s String) Bytes() int { return len(s) }
|
|
|
|
|
|
|
|
|
|
func (s String) constant() {}
|
2018-12-26 16:42:39 -08:00
|
|
|
|
|
|
|
|
// Imm returns an unsigned integer constant with size guessed from x.
|
|
|
|
|
func Imm(x uint64) Constant {
|
|
|
|
|
switch {
|
|
|
|
|
case uint64(uint8(x)) == x:
|
|
|
|
|
return U8(x)
|
|
|
|
|
case uint64(uint16(x)) == x:
|
|
|
|
|
return U16(x)
|
|
|
|
|
case uint64(uint32(x)) == x:
|
|
|
|
|
return U32(x)
|
|
|
|
|
}
|
|
|
|
|
return U64(x)
|
|
|
|
|
}
|