111 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
DEF(void,primitive_fixnum_add,(void)):
 | 
						|
	mov (DS_REG),ARG0
 | 
						|
	mov -CELL_SIZE(DS_REG),ARG1
 | 
						|
	sub $CELL_SIZE,DS_REG
 | 
						|
	mov ARG1,ARITH_TEMP_1
 | 
						|
	add ARG0,ARITH_TEMP_1
 | 
						|
	jo MANGLE(overflow_fixnum_add)
 | 
						|
	mov ARITH_TEMP_1,(DS_REG)
 | 
						|
	ret
 | 
						|
 | 
						|
DEF(void,primitive_fixnum_subtract,(void)):
 | 
						|
	mov (DS_REG),ARG1
 | 
						|
	mov -CELL_SIZE(DS_REG),ARG0
 | 
						|
	sub $CELL_SIZE,DS_REG
 | 
						|
	mov ARG0,ARITH_TEMP_1
 | 
						|
	sub ARG1,ARITH_TEMP_1
 | 
						|
	jo MANGLE(overflow_fixnum_subtract)
 | 
						|
	mov ARITH_TEMP_1,(DS_REG)
 | 
						|
	ret
 | 
						|
 | 
						|
DEF(void,primitive_fixnum_multiply,(void)):
 | 
						|
	mov (DS_REG),ARITH_TEMP_1
 | 
						|
	mov ARITH_TEMP_1,DIV_RESULT
 | 
						|
	mov -CELL_SIZE(DS_REG),ARITH_TEMP_2
 | 
						|
	sar $3,ARITH_TEMP_2
 | 
						|
	sub $CELL_SIZE,DS_REG
 | 
						|
	imul ARITH_TEMP_2
 | 
						|
	jo multiply_overflow
 | 
						|
	mov DIV_RESULT,(DS_REG)
 | 
						|
	ret
 | 
						|
multiply_overflow:
 | 
						|
	sar $3,ARITH_TEMP_1
 | 
						|
	mov ARITH_TEMP_1,ARG0
 | 
						|
	mov ARITH_TEMP_2,ARG1
 | 
						|
	jmp MANGLE(overflow_fixnum_multiply)
 | 
						|
 | 
						|
DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)):
 | 
						|
	PUSH_NONVOLATILE
 | 
						|
	mov ARG0,NV_TEMP_REG
 | 
						|
	/* Create register shadow area for Win64 */
 | 
						|
	sub $32,STACK_REG
 | 
						|
 | 
						|
	/* Save stack pointer */
 | 
						|
	lea -CELL_SIZE(STACK_REG),ARG0
 | 
						|
	push ARG1  /* save vm ptr */
 | 
						|
	call MANGLE(save_callstack_bottom)
 | 
						|
	pop ARG1
 | 
						|
	
 | 
						|
	/* Call quot-xt */
 | 
						|
	mov NV_TEMP_REG,ARG0
 | 
						|
	call *QUOT_XT_OFFSET(ARG0)
 | 
						|
 | 
						|
	/* Tear down register shadow area */
 | 
						|
	add $32,STACK_REG
 | 
						|
 | 
						|
	POP_NONVOLATILE
 | 
						|
	ret
 | 
						|
 | 
						|
DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot, void *vm)):
 | 
						|
	mov ARG1,NV_TEMP_REG         /* stash vm ptr */
 | 
						|
	mov STACK_REG,ARG1           /* Save stack pointer */
 | 
						|
	sub $STACK_PADDING,STACK_REG
 | 
						|
	push NV_TEMP_REG             /* push vm ptr as arg3 */
 | 
						|
	call MANGLE(lazy_jit_compile_impl)
 | 
						|
	pop NV_TEMP_REG
 | 
						|
	mov RETURN_REG,ARG0          /* No-op on 32-bit */
 | 
						|
	add $STACK_PADDING,STACK_REG
 | 
						|
        jmp *QUOT_XT_OFFSET(ARG0)    /* Call the quotation */
 | 
						|
 | 
						|
/* cpu.x86.features calls this */
 | 
						|
DEF(bool,sse_version,(void)):
 | 
						|
	mov $0x1,RETURN_REG
 | 
						|
	cpuid
 | 
						|
	/* test $0x100000,%ecx
 | 
						|
	jnz sse_42
 | 
						|
	test $0x80000,%ecx
 | 
						|
	jnz sse_41
 | 
						|
	test $0x200,%ecx
 | 
						|
	jnz ssse_3 */
 | 
						|
	test $0x1,%ecx
 | 
						|
	jnz sse_3
 | 
						|
	test $0x4000000,%edx
 | 
						|
	jnz sse_2
 | 
						|
	test $0x2000000,%edx
 | 
						|
	jnz sse_1
 | 
						|
	mov $0,%eax
 | 
						|
	ret
 | 
						|
sse_42:
 | 
						|
	mov $42,RETURN_REG
 | 
						|
	ret
 | 
						|
sse_41:
 | 
						|
	mov $41,RETURN_REG
 | 
						|
	ret
 | 
						|
ssse_3:
 | 
						|
	mov $33,RETURN_REG
 | 
						|
	ret
 | 
						|
sse_3:
 | 
						|
	mov $30,RETURN_REG
 | 
						|
	ret
 | 
						|
sse_2:
 | 
						|
	mov $20,RETURN_REG
 | 
						|
	ret
 | 
						|
sse_1:
 | 
						|
	mov $10,RETURN_REG
 | 
						|
	ret
 | 
						|
#ifdef WINDOWS
 | 
						|
	.section .drectve
 | 
						|
	.ascii " -export:sse_version"
 | 
						|
	.ascii " -export:c_to_factor"
 | 
						|
#endif
 |