mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-12 23:13:40 +00:00
device: add new cross-arch Asm and AsmFull functions
This is necessary to avoid a circular dependency between the device/avr and runtime/interrupts package in the next commit. It may be worth replacing existing calls like device/arm.Asm to device.Asm, to have a single place where these are defined.
This commit is contained in:
committed by
Jaden Weiss
parent
4d1d0c2d3b
commit
e2bf7bbb49
@@ -1327,9 +1327,9 @@ func (b *builder) createFunctionCall(instr *ssa.CallCommon) (llvm.Value, error)
|
|||||||
return b.createMemoryCopyCall(fn, instr.Args)
|
return b.createMemoryCopyCall(fn, instr.Args)
|
||||||
case name == "runtime.memzero":
|
case name == "runtime.memzero":
|
||||||
return b.createMemoryZeroCall(instr.Args)
|
return b.createMemoryZeroCall(instr.Args)
|
||||||
case name == "device/arm.Asm" || name == "device/avr.Asm" || name == "device/riscv.Asm":
|
case name == "device.Asm" || name == "device/arm.Asm" || name == "device/avr.Asm" || name == "device/riscv.Asm":
|
||||||
return b.createInlineAsm(instr.Args)
|
return b.createInlineAsm(instr.Args)
|
||||||
case name == "device/arm.AsmFull" || name == "device/avr.AsmFull" || name == "device/riscv.AsmFull":
|
case name == "device.AsmFull" || name == "device/arm.AsmFull" || name == "device/avr.AsmFull" || name == "device/riscv.AsmFull":
|
||||||
return b.createInlineAsmFull(instr)
|
return b.createInlineAsmFull(instr)
|
||||||
case strings.HasPrefix(name, "device/arm.SVCall"):
|
case strings.HasPrefix(name, "device/arm.SVCall"):
|
||||||
return b.emitSVCall(instr.Args)
|
return b.emitSVCall(instr.Args)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package device
|
||||||
|
|
||||||
|
// Run the given assembly code. The code will be marked as having side effects,
|
||||||
|
// as it doesn't produce output and thus would normally be eliminated by the
|
||||||
|
// optimizer.
|
||||||
|
func Asm(asm string)
|
||||||
|
|
||||||
|
// Run the given inline assembly. The code will be marked as having side
|
||||||
|
// effects, as it would otherwise be optimized away. The inline assembly string
|
||||||
|
// recognizes template values in the form {name}, like so:
|
||||||
|
//
|
||||||
|
// arm.AsmFull(
|
||||||
|
// "str {value}, {result}",
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "value": 1
|
||||||
|
// "result": &dest,
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// You can use {} in the asm string (which expands to a register) to set the
|
||||||
|
// return value.
|
||||||
|
func AsmFull(asm string, regs map[string]interface{}) uintptr
|
||||||
Reference in New Issue
Block a user