Skip to content

Commit e085873

Browse files
committed
cl/instr:move to one asm
1 parent a272b5a commit e085873

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

cl/instr.go

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,19 @@ func cstr(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
7272
}
7373

7474
// func asm(string)
75-
// func asmFull(string, map[string]any)
75+
// func asm(string, map[string]any)
7676
func (p *context) asm(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
77-
if len(args) == 1 {
78-
if sv, ok := constStr(args[0]); ok {
79-
b.InlineAsm(sv)
80-
return llssa.Expr{Type: b.Prog.Void()}
81-
}
82-
} else if len(args) == 2 {
83-
return p.asmFull(b, args)
77+
if len(args) == 0 || len(args) > 2 {
78+
panic("asm: invalid arguments - expected asm(<string-literal>) or asm(<string-literal>, <map-literal>)")
8479
}
85-
panic("asm: invalid arguments - expected asm(<string-literal>) or asm(<string-literal>, <map-literal>)")
86-
}
8780

88-
// asmFull is a compiler builtin which emits inline assembly.
89-
func (p *context) asmFull(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
9081
asmString, ok := constStr(args[0])
9182
if !ok {
92-
panic("asmFull: inline assembly requires a constant string")
83+
panic("asm: inline assembly requires a constant string")
84+
}
85+
if len(args) == 1 {
86+
b.InlineAsm(asmString)
87+
return llssa.Expr{Type: b.Prog.Void()}
9388
}
9489

9590
registers := make(map[string]llssa.Expr)
@@ -101,16 +96,16 @@ func (p *context) asmFull(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
10196
// ignore
10297
case *ssa.MapUpdate:
10398
if r.Block() != registerMap.Block() {
104-
panic("asmFull: register value map must be created in the same basic block")
99+
panic("asm: register value map must be created in the same basic block")
105100
}
106101
key, ok := constStr(r.Key)
107102
if !ok {
108-
panic("asmFull: register key must be a string constant")
103+
panic("asm: register key must be a string constant")
109104
}
110105
llvmValue := p.compileValue(b, r.Value.(*ssa.MakeInterface).X)
111106
registers[key] = llvmValue
112107
default:
113-
panic("asmFull: don't know how to handle argument to inline assembly: " + r.String())
108+
panic(fmt.Sprintf("asm: don't know how to handle argument to inline assembly: %s", r.String()))
114109
}
115110
}
116111
}
@@ -134,7 +129,7 @@ func (p *context) asmFull(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
134129
name := s[1 : len(s)-1]
135130
value, ok := registers[name]
136131
if !ok {
137-
panic("asmFull: register not found: " + name)
132+
panic(fmt.Sprintf("asm: register not found: %s", name))
138133
}
139134
if _, ok := registerNumbers[name]; !ok {
140135
// Type checking - only allow integer basic types
@@ -145,15 +140,15 @@ func (p *context) asmFull(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) {
145140
constraints = append(constraints, "r")
146141
} else {
147142
// Pointer operands support was dropped, following TinyGo 0.23
148-
panic("asmFull: unsupported type in inline assembly for operand: " + name + ", only integer types are supported")
143+
panic(fmt.Sprintf("asm: unsupported type in inline assembly for operand: %s, only integer types are supported", name))
149144
}
150145
}
151146
return fmt.Sprintf("${%v}", registerNumbers[name])
152147
})
153148

154149
constraintStr := strings.Join(constraints, ",")
155150
if debugInstr {
156-
log.Printf("asmFull: %q -> %q, constraints: %q", asmString, finalAsm, constraintStr)
151+
log.Printf("asm: %q -> %q, constraints: %q", asmString, finalAsm, constraintStr)
157152
}
158153

159154
var retType llssa.Type

0 commit comments

Comments
 (0)