mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 05:11:19 +00:00 
			
		
		
		
	 db695fada4
			
		
	
	
		db695fada4
		
			
		
	
	
	
	
		
			
			Implement XIP (Execution In Place) feature for AOT mode to enable running the AOT code inside AOT file directly, without memory mapping the executable memory for AOT code and applying relocations for text section. Developer can use wamrc with "--enable-indirect-mode --disable-llvm-intrinsics" flags to generate the AOT file and run iwasm with "--xip" flag. Known issues: there might still be some relocations in the text section which access the ".rodata" like sections. And also enable ARC target support for both interpreter mode and AOT mode. Signed-off-by: Wenyong Huang <wenyong.huang@intel.com>
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved.
 | |
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
|  */
 | |
| 
 | |
|     .text
 | |
|     .align  2
 | |
| #ifndef BH_PLATFORM_DARWIN
 | |
|     .globl invokeNative
 | |
|     .type  invokeNative, function
 | |
| invokeNative:
 | |
| #else
 | |
|     .globl _invokeNative
 | |
| _invokeNative:
 | |
| #endif /* end of BH_PLATFORM_DARWIN */
 | |
| 
 | |
| /*
 | |
|  * Arguments passed in:
 | |
|  *   r0: function ptr
 | |
|  *   r1: argv
 | |
|  *   r2: nstacks
 | |
|  * ARC ABI:
 | |
|  *   r0-r7:  function arguments, caller-saved
 | |
|  *   r8-r12: temp registers, caller-saved
 | |
|  */
 | |
| 
 | |
|     push_s  blink               /* push return addr */
 | |
|     st.aw   fp, [sp, -4]        /* push fp */
 | |
|     mov     fp, sp              /* fp = sp */
 | |
| 
 | |
|     mov     r8, r0              /* r8 = func_ptr */
 | |
|     mov     r9, r1              /* r9 = argv */
 | |
|     mov     r10, r2             /* r10 = nstacks */
 | |
| 
 | |
|     ld      r0, [r9, 0]         /* r0 = argv[0] */
 | |
|     ld      r1, [r9, 4]         /* r1 = argv[1] */
 | |
|     ld      r2, [r9, 8]         /* r2 = argv[2] */
 | |
|     ld      r3, [r9, 12]        /* r3 = argv[3] */
 | |
|     ld      r4, [r9, 16]        /* r4 = argv[4] */
 | |
|     ld      r5, [r9, 20]        /* r5 = argv[5] */
 | |
|     ld      r6, [r9, 24]        /* r6 = argv[6] */
 | |
|     ld      r7, [r9, 28]        /* r7 = argv[7] */
 | |
| 
 | |
|     add     r9, r9, 32          /* r9 = stack_args */
 | |
|     breq    r10, 0, call_func   /* if (r10 == 0) goto call_func */
 | |
| 
 | |
|     asl     r11, r10, 2         /* r11 = nstacks * 4 */
 | |
|     sub     sp, sp, r11         /* sp = sp - nstacks * 4 */
 | |
|     and     sp, sp, ~7          /* make sp 8-byte aligned */
 | |
|     mov     r11, sp             /* r11 = sp */
 | |
| 
 | |
| loop_stack_args:
 | |
|     breq    r10, 0, call_func   /* if (r10 == 0) goto call_func */
 | |
|     ld      r12, [r9]           /* r12 = stack_args[i] */
 | |
|     st      r12, [r11]          /* stack[i] = r12 */
 | |
|     add     r9, r9, 4           /* r9 = r9 + 4 */
 | |
|     add     r11, r11, 4         /* r11 = r11 + 4 */
 | |
|     sub     r10, r10, 1         /* r10 = r10 + 1 */
 | |
|     j       loop_stack_args
 | |
| 
 | |
| call_func:
 | |
|     jl      [r8]                /* call function */
 | |
| 
 | |
|     mov     sp, fp              /* sp = fp */
 | |
|     ld.ab   fp, [sp, 4]         /* pop fp */
 | |
|     pop_s   blink               /* pop return addr */
 | |
|     j_s     [blink]             /* ret */
 | |
|     nop_s
 | |
| 
 |