}
w.WriteString("<html>")
w.WriteString(`<head>
+<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<style>
#helplink {
s := fmt.Sprintf("<span class=\"%s ssa-long-value\">", v.String())
s += fmt.Sprintf("%s = %s", v.HTML(), v.Op.String())
s += " <" + html.EscapeString(v.Type.String()) + ">"
- if v.AuxInt != 0 {
- s += fmt.Sprintf(" [%d]", v.AuxInt)
- }
- if v.Aux != nil {
- if _, ok := v.Aux.(string); ok {
- s += html.EscapeString(fmt.Sprintf(" {%q}", v.Aux))
- } else {
- s += html.EscapeString(fmt.Sprintf(" {%v}", v.Aux))
- }
- }
+ s += html.EscapeString(v.auxString())
for _, a := range v.Args {
s += fmt.Sprintf(" %s", a.HTML())
}
if int(v.ID) < len(r) && r[v.ID] != nil {
s += " : " + r[v.ID].Name()
}
-
s += "</span>"
return s
}
func (v *Value) LongString() string {
s := fmt.Sprintf("v%d = %s", v.ID, v.Op.String())
s += " <" + v.Type.String() + ">"
+ s += v.auxString()
+ for _, a := range v.Args {
+ s += fmt.Sprintf(" %v", a)
+ }
+ r := v.Block.Func.RegAlloc
+ if int(v.ID) < len(r) && r[v.ID] != nil {
+ s += " : " + r[v.ID].Name()
+ }
+ return s
+}
+
+func (v *Value) auxString() string {
switch opcodeTable[v.Op].auxType {
case auxBool:
if v.AuxInt == 0 {
- s += " [false]"
+ return " [false]"
} else {
- s += " [true]"
+ return " [true]"
}
case auxInt8:
- s += fmt.Sprintf(" [%d]", v.AuxInt8())
+ return fmt.Sprintf(" [%d]", v.AuxInt8())
case auxInt16:
- s += fmt.Sprintf(" [%d]", v.AuxInt16())
+ return fmt.Sprintf(" [%d]", v.AuxInt16())
case auxInt32:
- s += fmt.Sprintf(" [%d]", v.AuxInt32())
- case auxInt64:
- s += fmt.Sprintf(" [%d]", v.AuxInt)
+ return fmt.Sprintf(" [%d]", v.AuxInt32())
+ case auxInt64, auxInt128:
+ return fmt.Sprintf(" [%d]", v.AuxInt)
case auxFloat32, auxFloat64:
- s += fmt.Sprintf(" [%g]", v.AuxFloat())
+ return fmt.Sprintf(" [%g]", v.AuxFloat())
case auxString:
- s += fmt.Sprintf(" {%s}", v.Aux)
+ return fmt.Sprintf(" {%q}", v.Aux)
case auxSym:
if v.Aux != nil {
- s += fmt.Sprintf(" {%s}", v.Aux)
+ return fmt.Sprintf(" {%s}", v.Aux)
}
- case auxSymOff:
+ case auxSymOff, auxSymInt32:
+ s := ""
if v.Aux != nil {
- s += fmt.Sprintf(" {%s}", v.Aux)
+ s = fmt.Sprintf(" {%s}", v.Aux)
}
- s += fmt.Sprintf(" [%d]", v.AuxInt)
+ if v.AuxInt != 0 {
+ s += fmt.Sprintf(" [%v]", v.AuxInt)
+ }
+ return s
case auxSymValAndOff:
+ s := ""
if v.Aux != nil {
- s += fmt.Sprintf(" {%s}", v.Aux)
+ s = fmt.Sprintf(" {%s}", v.Aux)
}
- s += fmt.Sprintf(" [%s]", v.AuxValAndOff())
+ return s + fmt.Sprintf(" [%s]", v.AuxValAndOff())
}
- for _, a := range v.Args {
- s += fmt.Sprintf(" %v", a)
- }
- r := v.Block.Func.RegAlloc
- if int(v.ID) < len(r) && r[v.ID] != nil {
- s += " : " + r[v.ID].Name()
- }
- return s
+ return ""
}
func (v *Value) AddArg(w *Value) {