Add support for inline assembly

This depends on support in LLVM, which hasn't been merged yet.
See: https://reviews.llvm.org/D46437
This commit is contained in:
Ayke van Laethem
2018-06-07 18:29:35 +02:00
parent 808cb991af
commit 802302a1aa
3 changed files with 13 additions and 1 deletions
+3
View File
@@ -32,6 +32,9 @@ package arm
type __reg uint32
type RegValue = __reg
type __asm string
func Asm(s __asm)
const (
SCS_BASE = 0xE000E000
NVIC_BASE = SCS_BASE + 0x0100
+1 -1
View File
@@ -74,8 +74,8 @@ func monotime() uint64 {
}
func abort() {
// TODO: wfi
for {
arm.Asm("wfi")
}
}
+9
View File
@@ -1038,6 +1038,15 @@ func (c *Compiler) parseCall(frame *Frame, instr *ssa.CallCommon, parentHandle l
case *ssa.Builtin:
return c.parseBuiltin(frame, instr.Args, call.Name())
case *ssa.Function:
if call.Name() == "Asm" && len(instr.Args) == 1 {
// Magic function: insert inline assembly instead of calling it.
if named, ok := instr.Args[0].Type().(*types.Named); ok && named.Obj().Name() == "__asm" {
fnType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{}, false)
asm := constant.StringVal(instr.Args[0].(*ssa.Const).Value)
target := llvm.InlineAsm(fnType, asm, "", true, false, 0)
return c.builder.CreateCall(target, nil, ""), nil
}
}
targetBlocks := false
name := getFunctionName(call, targetBlocks)
llvmFn := c.mod.NamedFunction(name)