@@ -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)
7676func (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