[pypy-svn] r68714 - in pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc: . test/msvc

afa at codespeak.net afa at codespeak.net
Thu Oct 22 18:26:52 CEST 2009


Author: afa
Date: Thu Oct 22 18:26:51 2009
New Revision: 68714

Added:
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track1.s
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track2.s
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track_switch0.s
Modified:
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py
Log:
More fixes found during pypy translation:

- update the list of non-returning functions

- implement the famous table-based switches...

- handle some functions with the __fastcall calling convention
(Can we do it without this ugly list?)

pypy-c-jit almost compiles, still some problems remaining


Added: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track1.s
==============================================================================
--- (empty file)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track1.s	Thu Oct 22 18:26:51 2009
@@ -0,0 +1,31 @@
+; Function compile flags: /Odtp
+_TEXT	SEGMENT
+_pypy_g_frameworkgc_setup PROC
+
+; 46   : void pypy_g_frameworkgc_setup(void) {
+
+	push	ebp
+	mov	ebp, esp
+$block0$37400:
+
+; 47   : 
+; 48   :     block0:
+; 49   : 	pypy_g_SemiSpaceGC_setup((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC));
+
+	push	OFFSET _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC
+	call	_pypy_g_SemiSpaceGC_setup
+      ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 4
+$block1$37401:
+
+; 50   : 	goto block1;
+; 51   : 
+; 52   :     block1:
+; 53   : 	RPY_DEBUG_RETURN();
+; 54   : 	return /* nothing */;
+; 55   : }
+
+	pop	ebp
+	ret	0
+_pypy_g_frameworkgc_setup ENDP
+_TEXT	ENDS

Added: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track2.s
==============================================================================
--- (empty file)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track2.s	Thu Oct 22 18:26:51 2009
@@ -0,0 +1,747 @@
+; Function compile flags: /Odtpy
+;	COMDAT _pypy_g__inplace_divrem1
+_TEXT	SEGMENT
+tv158 = -292						; size = 4
+tv152 = -288						; size = 4
+tv72 = -284						; size = 4
+tv65 = -280						; size = 4
+_l_v30733$ = -273					; size = 1
+_l_v30737$ = -272					; size = 8
+_l_v30740$ = -257					; size = 1
+_l_v30744$ = -256					; size = 4
+_l_v30753$ = -252					; size = 4
+_l_v30748$ = -248					; size = 8
+_l_v30709$ = -233					; size = 1
+_l_v30710$ = -232					; size = 1
+_l_v30714$ = -231					; size = 1
+_l_v30718$ = -230					; size = 1
+_l_v30729$ = -229					; size = 1
+_l_v30725$ = -228					; size = 4
+_l_v30705$ = -224					; size = 8
+_l_evalue_70$ = -216					; size = 4
+_l_index_219$ = -212					; size = 4
+_l_v30738$ = -205					; size = 1
+_l_v30730$ = -204					; size = 4
+_l_v30734$ = -200					; size = 4
+_l_length_82$ = -196					; size = 4
+_l_v30745$ = -189					; size = 1
+_l_v30752$ = -188					; size = 4
+_l_v30749$ = -184					; size = 8
+_l_l_100$ = -172					; size = 4
+_l_l_101$ = -168					; size = 4
+_l_length_83$ = -164					; size = 4
+_l_v30704$ = -160					; size = 4
+_l_v30722$ = -156					; size = 4
+_l_v30715$ = -152					; size = 8
+_l_v30726$ = -144					; size = 8
+_l_v30711$ = -132					; size = 4
+_l_x_97$ = -128						; size = 4
+_l_v30739$ = -121					; size = 1
+_l_v30731$ = -120					; size = 8
+_l_v30735$ = -112					; size = 8
+_l_v30742$ = -97					; size = 1
+_l_v30751$ = -96					; size = 4
+_l_v30707$ = -90					; size = 1
+_l_v30723$ = -89					; size = 1
+_l_v30712$ = -88					; size = 4
+_l_v30716$ = -84					; size = 4
+_l_v30703$ = -80					; size = 8
+_l_v30727$ = -72					; size = 8
+_l_v30732$ = -64					; size = 8
+_l_v30736$ = -56					; size = 8
+_l_index_218$ = -44					; size = 4
+_l_v30750$ = -40					; size = 4
+_l_v30754$ = -36					; size = 4
+_l_v30717$ = -30					; size = 1
+_l_v30720$ = -29					; size = 1
+_l_v30713$ = -28					; size = 4
+_l_v30702$ = -24					; size = 8
+_l_v30706$ = -16					; size = 8
+_l_v30728$ = -8						; size = 8
+_l_self_3688$ = 8					; size = 4
+_l_pin_1$ = 12						; size = 4
+_l_n_38$ = 16						; size = 8
+_l_size_53$ = 24					; size = 4
+_pypy_g__inplace_divrem1 PROC				; COMDAT
+
+; 16550: long pypy_g__inplace_divrem1(struct pypy_pypy_rlib_rbigint_rbigint0 *l_self_3688, struct pypy_pypy_rlib_rbigint_rbigint0 *l_pin_1, long long l_n_38, long l_size_53) {
+
+	push	ebp
+	mov	ebp, esp
+	sub	esp, 292				; 00000124H
+$block0$210880:
+
+; 16551: 	struct pypy_object0 *l_evalue_70; long l_index_218; long l_index_219;
+; 16552: 	struct pypy_array5 *l_l_100; struct pypy_array5 *l_l_101;
+; 16553: 	long l_length_82; long l_length_83; bool_t l_v30707; bool_t l_v30709;
+; 16554: 	bool_t l_v30710; bool_t l_v30714; bool_t l_v30717; bool_t l_v30718;
+; 16555: 	bool_t l_v30720; bool_t l_v30723; bool_t l_v30729; bool_t l_v30733;
+; 16556: 	bool_t l_v30738; bool_t l_v30739; bool_t l_v30740; bool_t l_v30742;
+; 16557: 	bool_t l_v30745; long l_v30704; long l_v30712; long l_v30713;
+; 16558: 	long l_v30716; long l_v30722; long l_v30725; long l_v30730;
+; 16559: 	long l_v30734; long l_v30744; long l_v30750; long l_v30751;
+; 16560: 	long l_v30752; long l_v30753; long l_v30754; long long l_v30702;
+; 16561: 	long long l_v30703; long long l_v30705; long long l_v30706;
+; 16562: 	long long l_v30715; long long l_v30726; long long l_v30727;
+; 16563: 	long long l_v30728; long long l_v30731; long long l_v30732;
+; 16564: 	long long l_v30735; long long l_v30736; long long l_v30737;
+; 16565: 	long long l_v30748; long long l_v30749; struct pypy_array5 *l_v30711;
+; 16566: 	long l_x_97;
+; 16567: 
+; 16568:     block0:
+; 16569: 	OP_LLONG_GT(l_n_38, 0LL, l_v30707);
+
+	cmp	DWORD PTR _l_n_38$[ebp+4], 0
+	jl	SHORT $LN11 at pypy_g__in
+	jg	SHORT $LN19 at pypy_g__in
+	cmp	DWORD PTR _l_n_38$[ebp], 0
+	jbe	SHORT $LN11 at pypy_g__in
+$LN19 at pypy_g__in:
+	mov	DWORD PTR tv65[ebp], 1
+	jmp	SHORT $LN12 at pypy_g__in
+$LN11 at pypy_g__in:
+	mov	DWORD PTR tv65[ebp], 0
+$LN12 at pypy_g__in:
+	mov	al, BYTE PTR tv65[ebp]
+	mov	BYTE PTR _l_v30707$[ebp], al
+
+; 16570: 	if (l_v30707) {
+
+	movzx	ecx, BYTE PTR _l_v30707$[ebp]
+	test	ecx, ecx
+	je	SHORT $LN8 at pypy_g__in
+
+; 16571: 		goto block3;
+
+	jmp	SHORT $block3$210882
+$LN8 at pypy_g__in:
+
+; 16572: 	}
+; 16573: 	l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super);
+
+	mov	DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError
+$block1$210883:
+
+; 16574: 	goto block1;
+; 16575: 
+; 16576:     block1:
+; 16577: 	pypy_g_RPyRaiseException((&pypy_g_exceptions_AssertionError_vtable.ae_super.se_super.e_super), l_evalue_70);
+
+	mov	edx, DWORD PTR _l_evalue_70$[ebp]
+	push	edx
+	push	OFFSET _pypy_g_exceptions_AssertionError_vtable
+	call	_pypy_g_RPyRaiseException
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 8
+
+; 16578: 	l_v30753 = -1L;
+
+	mov	DWORD PTR _l_v30753$[ebp], -1
+$block2$210884:
+
+; 16579: 	goto block2;
+; 16580: 
+; 16581:     block2:
+; 16582: 	RPY_DEBUG_RETURN();
+; 16583: 	return l_v30753;
+
+	mov	eax, DWORD PTR _l_v30753$[ebp]
+	jmp	$LN9 at pypy_g__in
+$block3$210882:
+
+; 16584: 
+; 16585:     block3:
+; 16586: 	OP_LLONG_LE(l_n_38, 2147483647LL, l_v30709);
+
+	cmp	DWORD PTR _l_n_38$[ebp+4], 0
+	jg	SHORT $LN13 at pypy_g__in
+	jl	SHORT $LN20 at pypy_g__in
+	cmp	DWORD PTR _l_n_38$[ebp], 2147483647	; 7fffffffH
+	ja	SHORT $LN13 at pypy_g__in
+$LN20 at pypy_g__in:
+	mov	DWORD PTR tv72[ebp], 1
+	jmp	SHORT $LN14 at pypy_g__in
+$LN13 at pypy_g__in:
+	mov	DWORD PTR tv72[ebp], 0
+$LN14 at pypy_g__in:
+	mov	al, BYTE PTR tv72[ebp]
+	mov	BYTE PTR _l_v30709$[ebp], al
+
+; 16587: 	if (l_v30709) {
+
+	movzx	ecx, BYTE PTR _l_v30709$[ebp]
+	test	ecx, ecx
+	je	SHORT $LN7 at pypy_g__in
+
+; 16588: 		goto block4;
+
+	jmp	SHORT $block4$210886
+$LN7 at pypy_g__in:
+
+; 16589: 	}
+; 16590: 	l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super);
+
+	mov	DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError
+
+; 16591: 	goto block1;
+
+	jmp	SHORT $block1$210883
+$block4$210886:
+
+; 16592: 
+; 16593:     block4:
+; 16594: 	OP_INT_IS_TRUE(l_size_53, l_v30710);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_size_53$[ebp], 0
+	setne	dl
+	mov	BYTE PTR _l_v30710$[ebp], dl
+
+; 16595: 	if (l_v30710) {
+
+	movzx	eax, BYTE PTR _l_v30710$[ebp]
+	test	eax, eax
+	je	SHORT $block5$210889
+
+; 16596: 		l_v30754 = l_size_53;
+
+	mov	ecx, DWORD PTR _l_size_53$[ebp]
+	mov	DWORD PTR _l_v30754$[ebp], ecx
+
+; 16597: 		goto block6;
+
+	jmp	SHORT $block6$210888
+$block5$210889:
+
+; 16598: 	}
+; 16599: 	goto block5;
+; 16600: 
+; 16601:     block5:
+; 16602: 	l_v30711 = RPyField(l_pin_1, prrr_inst_digits);
+
+	mov	edx, DWORD PTR _l_pin_1$[ebp]
+	mov	eax, DWORD PTR [edx+8]
+	mov	DWORD PTR _l_v30711$[ebp], eax
+
+; 16603: 	l_v30712 = l_v30711->length;
+
+	mov	ecx, DWORD PTR _l_v30711$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_v30712$[ebp], edx
+
+; 16604: 	l_v30754 = l_v30712;
+
+	mov	eax, DWORD PTR _l_v30712$[ebp]
+	mov	DWORD PTR _l_v30754$[ebp], eax
+$block6$210888:
+
+; 16605: 	goto block6;
+; 16606: 
+; 16607:     block6:
+; 16608: 	OP_INT_SUB(l_v30754, 1L, l_v30713);
+
+	mov	ecx, DWORD PTR _l_v30754$[ebp]
+	sub	ecx, 1
+	mov	DWORD PTR _l_v30713$[ebp], ecx
+
+; 16609: 	l_v30702 = 0LL;
+
+	mov	DWORD PTR _l_v30702$[ebp], 0
+	mov	DWORD PTR _l_v30702$[ebp+4], 0
+
+; 16610: 	l_x_97 = l_v30713;
+
+	mov	edx, DWORD PTR _l_v30713$[ebp]
+	mov	DWORD PTR _l_x_97$[ebp], edx
+$block7$210890:
+
+; 16611: 	goto block7;
+; 16612: 
+; 16613:     block7:
+; 16614: 	OP_INT_GE(l_x_97, 0L, l_v30714);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_x_97$[ebp], 0
+	setge	al
+	mov	BYTE PTR _l_v30714$[ebp], al
+$LN5 at pypy_g__in:
+
+; 16615: 	while (l_v30714) {
+
+	movzx	ecx, BYTE PTR _l_v30714$[ebp]
+	test	ecx, ecx
+	je	SHORT $block8$210896
+
+; 16616: 		goto block9;
+
+	jmp	SHORT $block9$210894
+$block7_back$210895:
+
+; 16617: 		  block7_back: ;
+; 16618: 		OP_INT_GE(l_x_97, 0L, l_v30714);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_x_97$[ebp], 0
+	setge	dl
+	mov	BYTE PTR _l_v30714$[ebp], dl
+
+; 16619: 	}
+
+	jmp	SHORT $LN5 at pypy_g__in
+$block8$210896:
+
+; 16620: 	goto block8;
+; 16621: 
+; 16622:     block8:
+; 16623: 	OP_LLONG_AND(l_v30702, 2147483647LL, l_v30715);
+
+	mov	eax, DWORD PTR _l_v30702$[ebp]
+	and	eax, 2147483647				; 7fffffffH
+	mov	ecx, DWORD PTR _l_v30702$[ebp+4]
+	and	ecx, 0
+	mov	DWORD PTR _l_v30715$[ebp], eax
+	mov	DWORD PTR _l_v30715$[ebp+4], ecx
+
+; 16624: 	OP_TRUNCATE_LONGLONG_TO_INT(l_v30715, l_v30716);
+
+	mov	edx, DWORD PTR _l_v30715$[ebp]
+	mov	DWORD PTR _l_v30716$[ebp], edx
+
+; 16625: 	l_v30753 = l_v30716;
+
+	mov	eax, DWORD PTR _l_v30716$[ebp]
+	mov	DWORD PTR _l_v30753$[ebp], eax
+
+; 16626: 	goto block2;
+
+	jmp	$block2$210884
+$block9$210894:
+
+; 16627: 
+; 16628:     block9:
+; 16629: 	OP_LLONG_LSHIFT(l_v30702, 31LL, l_v30703);
+
+	mov	eax, DWORD PTR _l_v30702$[ebp]
+	mov	edx, DWORD PTR _l_v30702$[ebp+4]
+	mov	cl, 31					; 0000001fH
+	call	__allshl
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	mov	DWORD PTR _l_v30703$[ebp], eax
+	mov	DWORD PTR _l_v30703$[ebp+4], edx
+
+; 16630: 	l_l_100 = RPyField(l_pin_1, prrr_inst_digits);
+
+	mov	ecx, DWORD PTR _l_pin_1$[ebp]
+	mov	edx, DWORD PTR [ecx+8]
+	mov	DWORD PTR _l_l_100$[ebp], edx
+
+; 16631: 	l_length_83 = l_l_100->length;
+
+	mov	eax, DWORD PTR _l_l_100$[ebp]
+	mov	ecx, DWORD PTR [eax+4]
+	mov	DWORD PTR _l_length_83$[ebp], ecx
+
+; 16632: 	OP_INT_LT(l_x_97, 0L, l_v30717);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_x_97$[ebp], 0
+	setl	dl
+	mov	BYTE PTR _l_v30717$[ebp], dl
+
+; 16633: 	if (l_v30717) {
+
+	movzx	eax, BYTE PTR _l_v30717$[ebp]
+	test	eax, eax
+	je	SHORT $LN3 at pypy_g__in
+
+; 16634: 		goto block14;
+
+	jmp	$block14$210899
+$LN3 at pypy_g__in:
+
+; 16635: 	}
+; 16636: 	l_index_218 = l_x_97;
+
+	mov	ecx, DWORD PTR _l_x_97$[ebp]
+	mov	DWORD PTR _l_index_218$[ebp], ecx
+$block10$210900:
+
+; 16637: 	goto block10;
+; 16638: 
+; 16639:     block10:
+; 16640: 	OP_INT_GE(l_index_218, 0L, l_v30718);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_index_218$[ebp], 0
+	setge	dl
+	mov	BYTE PTR _l_v30718$[ebp], dl
+
+; 16641: 	RPyAssert(l_v30718, "negative list getitem index out of bound");
+; 16642: 	OP_INT_LT(l_index_218, l_length_83, l_v30720);
+
+	mov	eax, DWORD PTR _l_index_218$[ebp]
+	xor	ecx, ecx
+	cmp	eax, DWORD PTR _l_length_83$[ebp]
+	setl	cl
+	mov	BYTE PTR _l_v30720$[ebp], cl
+
+; 16643: 	RPyAssert(l_v30720, "list getitem index out of bound");
+; 16644: 	l_v30722 = l_l_100->length;
+
+	mov	edx, DWORD PTR _l_l_100$[ebp]
+	mov	eax, DWORD PTR [edx+4]
+	mov	DWORD PTR _l_v30722$[ebp], eax
+
+; 16645: 	OP_INT_LT(l_index_218, l_v30722, l_v30723);
+
+	mov	ecx, DWORD PTR _l_index_218$[ebp]
+	xor	edx, edx
+	cmp	ecx, DWORD PTR _l_v30722$[ebp]
+	setl	dl
+	mov	BYTE PTR _l_v30723$[ebp], dl
+
+; 16646: 	RPyAssert(l_v30723, "fixed getitem out of bounds");
+; 16647: 	l_v30725 = RPyItem(l_l_100, l_index_218);
+
+	mov	eax, DWORD PTR _l_index_218$[ebp]
+	mov	ecx, DWORD PTR _l_l_100$[ebp]
+	mov	edx, DWORD PTR [ecx+eax*4+8]
+	mov	DWORD PTR _l_v30725$[ebp], edx
+
+; 16648: 	OP_CAST_INT_TO_LONGLONG(l_v30725, l_v30726);
+
+	mov	eax, DWORD PTR _l_v30725$[ebp]
+	cdq
+	mov	DWORD PTR _l_v30726$[ebp], eax
+	mov	DWORD PTR _l_v30726$[ebp+4], edx
+
+; 16649: 	OP_LLONG_ADD(l_v30703, l_v30726, l_v30706);
+
+	mov	eax, DWORD PTR _l_v30703$[ebp]
+	add	eax, DWORD PTR _l_v30726$[ebp]
+	mov	ecx, DWORD PTR _l_v30703$[ebp+4]
+	adc	ecx, DWORD PTR _l_v30726$[ebp+4]
+	mov	DWORD PTR _l_v30706$[ebp], eax
+	mov	DWORD PTR _l_v30706$[ebp+4], ecx
+
+; 16650: 	OP_LLONG_FLOORDIV(l_v30706, l_n_38, l_v30727);
+
+	mov	edx, DWORD PTR _l_n_38$[ebp+4]
+	push	edx
+	mov	eax, DWORD PTR _l_n_38$[ebp]
+	push	eax
+	mov	ecx, DWORD PTR _l_v30706$[ebp+4]
+	push	ecx
+	mov	edx, DWORD PTR _l_v30706$[ebp]
+	push	edx
+	call	__alldiv
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	mov	DWORD PTR _l_v30727$[ebp], eax
+	mov	DWORD PTR _l_v30727$[ebp+4], edx
+
+; 16651: 	OP_LLONG_XOR(l_v30706, l_n_38, l_v30728);
+
+	mov	eax, DWORD PTR _l_v30706$[ebp]
+	xor	eax, DWORD PTR _l_n_38$[ebp]
+	mov	ecx, DWORD PTR _l_v30706$[ebp+4]
+	xor	ecx, DWORD PTR _l_n_38$[ebp+4]
+	mov	DWORD PTR _l_v30728$[ebp], eax
+	mov	DWORD PTR _l_v30728$[ebp+4], ecx
+
+; 16652: 	OP_LLONG_LE(l_v30728, 0LL, l_v30729);
+
+	jg	SHORT $LN15 at pypy_g__in
+	jl	SHORT $LN21 at pypy_g__in
+	cmp	DWORD PTR _l_v30728$[ebp], 0
+	ja	SHORT $LN15 at pypy_g__in
+$LN21 at pypy_g__in:
+	mov	DWORD PTR tv152[ebp], 1
+	jmp	SHORT $LN16 at pypy_g__in
+$LN15 at pypy_g__in:
+	mov	DWORD PTR tv152[ebp], 0
+$LN16 at pypy_g__in:
+	mov	dl, BYTE PTR tv152[ebp]
+	mov	BYTE PTR _l_v30729$[ebp], dl
+
+; 16653: 	OP_CAST_BOOL_TO_INT(l_v30729, l_v30730);
+
+	movzx	eax, BYTE PTR _l_v30729$[ebp]
+	mov	DWORD PTR _l_v30730$[ebp], eax
+
+; 16654: 	OP_CAST_INT_TO_LONGLONG(l_v30730, l_v30731);
+
+	mov	eax, DWORD PTR _l_v30730$[ebp]
+	cdq
+	mov	DWORD PTR _l_v30731$[ebp], eax
+	mov	DWORD PTR _l_v30731$[ebp+4], edx
+
+; 16655: 	OP_LLONG_MOD(l_v30706, l_n_38, l_v30732);
+
+	mov	ecx, DWORD PTR _l_n_38$[ebp+4]
+	push	ecx
+	mov	edx, DWORD PTR _l_n_38$[ebp]
+	push	edx
+	mov	eax, DWORD PTR _l_v30706$[ebp+4]
+	push	eax
+	mov	ecx, DWORD PTR _l_v30706$[ebp]
+	push	ecx
+	call	__allrem
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	mov	DWORD PTR _l_v30732$[ebp], eax
+	mov	DWORD PTR _l_v30732$[ebp+4], edx
+
+; 16656: 	OP_LLONG_NE(l_v30732, 0LL, l_v30733);
+
+	mov	edx, DWORD PTR _l_v30732$[ebp]
+	or	edx, DWORD PTR _l_v30732$[ebp+4]
+	je	SHORT $LN17 at pypy_g__in
+	mov	DWORD PTR tv158[ebp], 1
+	jmp	SHORT $LN18 at pypy_g__in
+$LN17 at pypy_g__in:
+	mov	DWORD PTR tv158[ebp], 0
+$LN18 at pypy_g__in:
+	mov	al, BYTE PTR tv158[ebp]
+	mov	BYTE PTR _l_v30733$[ebp], al
+
+; 16657: 	OP_CAST_BOOL_TO_INT(l_v30733, l_v30734);
+
+	movzx	ecx, BYTE PTR _l_v30733$[ebp]
+	mov	DWORD PTR _l_v30734$[ebp], ecx
+
+; 16658: 	OP_CAST_INT_TO_LONGLONG(l_v30734, l_v30735);
+
+	mov	eax, DWORD PTR _l_v30734$[ebp]
+	cdq
+	mov	DWORD PTR _l_v30735$[ebp], eax
+	mov	DWORD PTR _l_v30735$[ebp+4], edx
+
+; 16659: 	OP_LLONG_AND(l_v30731, l_v30735, l_v30736);
+
+	mov	edx, DWORD PTR _l_v30731$[ebp]
+	and	edx, DWORD PTR _l_v30735$[ebp]
+	mov	eax, DWORD PTR _l_v30731$[ebp+4]
+	and	eax, DWORD PTR _l_v30735$[ebp+4]
+	mov	DWORD PTR _l_v30736$[ebp], edx
+	mov	DWORD PTR _l_v30736$[ebp+4], eax
+
+; 16660: 	OP_LLONG_SUB(l_v30727, l_v30736, l_v30705);
+
+	mov	ecx, DWORD PTR _l_v30727$[ebp]
+	sub	ecx, DWORD PTR _l_v30736$[ebp]
+	mov	edx, DWORD PTR _l_v30727$[ebp+4]
+	sbb	edx, DWORD PTR _l_v30736$[ebp+4]
+	mov	DWORD PTR _l_v30705$[ebp], ecx
+	mov	DWORD PTR _l_v30705$[ebp+4], edx
+
+; 16661: 	OP_LLONG_AND(l_v30705, 2147483647LL, l_v30737);
+
+	mov	eax, DWORD PTR _l_v30705$[ebp]
+	and	eax, 2147483647				; 7fffffffH
+	mov	ecx, DWORD PTR _l_v30705$[ebp+4]
+	and	ecx, 0
+	mov	DWORD PTR _l_v30737$[ebp], eax
+	mov	DWORD PTR _l_v30737$[ebp+4], ecx
+
+; 16662: 	OP_TRUNCATE_LONGLONG_TO_INT(l_v30737, l_v30704);
+
+	mov	edx, DWORD PTR _l_v30737$[ebp]
+	mov	DWORD PTR _l_v30704$[ebp], edx
+
+; 16663: 	OP_INT_GE(l_v30704, 0L, l_v30738);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_v30704$[ebp], 0
+	setge	al
+	mov	BYTE PTR _l_v30738$[ebp], al
+
+; 16664: 	if (l_v30738) {
+
+	movzx	ecx, BYTE PTR _l_v30738$[ebp]
+	test	ecx, ecx
+	je	SHORT $LN2 at pypy_g__in
+
+; 16665: 		goto block11;
+
+	jmp	SHORT $block11$210908
+$LN2 at pypy_g__in:
+
+; 16666: 	}
+; 16667: 	l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super);
+
+	mov	DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError
+
+; 16668: 	goto block1;
+
+	jmp	$block1$210883
+$block11$210908:
+
+; 16669: 
+; 16670:     block11:
+; 16671: 	l_l_101 = RPyField(l_self_3688, prrr_inst_digits);
+
+	mov	edx, DWORD PTR _l_self_3688$[ebp]
+	mov	eax, DWORD PTR [edx+8]
+	mov	DWORD PTR _l_l_101$[ebp], eax
+
+; 16672: 	l_length_82 = l_l_101->length;
+
+	mov	ecx, DWORD PTR _l_l_101$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_length_82$[ebp], edx
+
+; 16673: 	OP_INT_LT(l_x_97, 0L, l_v30739);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_x_97$[ebp], 0
+	setl	al
+	mov	BYTE PTR _l_v30739$[ebp], al
+
+; 16674: 	if (l_v30739) {
+
+	movzx	ecx, BYTE PTR _l_v30739$[ebp]
+	test	ecx, ecx
+	je	SHORT $LN1 at pypy_g__in
+
+; 16675: 		goto block13;
+
+	jmp	$block13$210910
+$LN1 at pypy_g__in:
+
+; 16676: 	}
+; 16677: 	l_index_219 = l_x_97;
+
+	mov	edx, DWORD PTR _l_x_97$[ebp]
+	mov	DWORD PTR _l_index_219$[ebp], edx
+$block12$210911:
+
+; 16678: 	goto block12;
+; 16679: 
+; 16680:     block12:
+; 16681: 	OP_INT_GE(l_index_219, 0L, l_v30740);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_index_219$[ebp], 0
+	setge	al
+	mov	BYTE PTR _l_v30740$[ebp], al
+
+; 16682: 	RPyAssert(l_v30740, "negative list setitem index out of bound");
+; 16683: 	OP_INT_LT(l_index_219, l_length_82, l_v30742);
+
+	mov	ecx, DWORD PTR _l_index_219$[ebp]
+	xor	edx, edx
+	cmp	ecx, DWORD PTR _l_length_82$[ebp]
+	setl	dl
+	mov	BYTE PTR _l_v30742$[ebp], dl
+
+; 16684: 	RPyAssert(l_v30742, "list setitem index out of bound");
+; 16685: 	l_v30744 = l_l_101->length;
+
+	mov	eax, DWORD PTR _l_l_101$[ebp]
+	mov	ecx, DWORD PTR [eax+4]
+	mov	DWORD PTR _l_v30744$[ebp], ecx
+
+; 16686: 	OP_INT_LT(l_index_219, l_v30744, l_v30745);
+
+	mov	edx, DWORD PTR _l_index_219$[ebp]
+	xor	eax, eax
+	cmp	edx, DWORD PTR _l_v30744$[ebp]
+	setl	al
+	mov	BYTE PTR _l_v30745$[ebp], al
+
+; 16687: 	RPyAssert(l_v30745, "fixed setitem out of bounds");
+; 16688: 	RPyItem(l_l_101, l_index_219) = l_v30704;
+
+	mov	ecx, DWORD PTR _l_index_219$[ebp]
+	mov	edx, DWORD PTR _l_l_101$[ebp]
+	mov	eax, DWORD PTR _l_v30704$[ebp]
+	mov	DWORD PTR [edx+ecx*4+8], eax
+
+; 16689: 	OP_LLONG_MUL(l_v30705, l_n_38, l_v30748);
+
+	mov	ecx, DWORD PTR _l_n_38$[ebp+4]
+	push	ecx
+	mov	edx, DWORD PTR _l_n_38$[ebp]
+	push	edx
+	mov	eax, DWORD PTR _l_v30705$[ebp+4]
+	push	eax
+	mov	ecx, DWORD PTR _l_v30705$[ebp]
+	push	ecx
+	call	__allmul
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	mov	DWORD PTR _l_v30748$[ebp], eax
+	mov	DWORD PTR _l_v30748$[ebp+4], edx
+
+; 16690: 	OP_LLONG_SUB(l_v30706, l_v30748, l_v30749);
+
+	mov	edx, DWORD PTR _l_v30706$[ebp]
+	sub	edx, DWORD PTR _l_v30748$[ebp]
+	mov	eax, DWORD PTR _l_v30706$[ebp+4]
+	sbb	eax, DWORD PTR _l_v30748$[ebp+4]
+	mov	DWORD PTR _l_v30749$[ebp], edx
+	mov	DWORD PTR _l_v30749$[ebp+4], eax
+
+; 16691: 	OP_INT_SUB(l_x_97, 1L, l_v30750);
+
+	mov	ecx, DWORD PTR _l_x_97$[ebp]
+	sub	ecx, 1
+	mov	DWORD PTR _l_v30750$[ebp], ecx
+
+; 16692: 	l_v30702 = l_v30749;
+
+	mov	edx, DWORD PTR _l_v30749$[ebp]
+	mov	DWORD PTR _l_v30702$[ebp], edx
+	mov	eax, DWORD PTR _l_v30749$[ebp+4]
+	mov	DWORD PTR _l_v30702$[ebp+4], eax
+
+; 16693: 	l_x_97 = l_v30750;
+
+	mov	ecx, DWORD PTR _l_v30750$[ebp]
+	mov	DWORD PTR _l_x_97$[ebp], ecx
+
+; 16694: 	goto block7_back;
+
+	jmp	$block7_back$210895
+$block13$210910:
+
+; 16695: 
+; 16696:     block13:
+; 16697: 	OP_INT_ADD(l_x_97, l_length_82, l_v30751);
+
+	mov	edx, DWORD PTR _l_x_97$[ebp]
+	add	edx, DWORD PTR _l_length_82$[ebp]
+	mov	DWORD PTR _l_v30751$[ebp], edx
+
+; 16698: 	l_index_219 = l_v30751;
+
+	mov	eax, DWORD PTR _l_v30751$[ebp]
+	mov	DWORD PTR _l_index_219$[ebp], eax
+
+; 16699: 	goto block12;
+
+	jmp	$block12$210911
+$block14$210899:
+
+; 16700: 
+; 16701:     block14:
+; 16702: 	OP_INT_ADD(l_x_97, l_length_83, l_v30752);
+
+	mov	ecx, DWORD PTR _l_x_97$[ebp]
+	add	ecx, DWORD PTR _l_length_83$[ebp]
+	mov	DWORD PTR _l_v30752$[ebp], ecx
+
+; 16703: 	l_index_218 = l_v30752;
+
+	mov	edx, DWORD PTR _l_v30752$[ebp]
+	mov	DWORD PTR _l_index_218$[ebp], edx
+
+; 16704: 	goto block10;
+
+	jmp	$block10$210900
+$LN9 at pypy_g__in:
+
+; 16705: }
+
+	mov	esp, ebp
+	pop	ebp
+	ret	0
+_pypy_g__inplace_divrem1 ENDP

Added: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track_switch0.s
==============================================================================
--- (empty file)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track_switch0.s	Thu Oct 22 18:26:51 2009
@@ -0,0 +1,419 @@
+; Function compile flags: /Odtpy
+;	COMDAT _pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root
+_TEXT	SEGMENT
+tv138 = -116						; size = 4
+_l_v271568$ = -109					; size = 1
+_l_v271567$ = -108					; size = 4
+_l_v271575$ = -104					; size = 4
+_l_v271551$ = -97					; size = 1
+_l_v271579$ = -96					; size = 4
+_l_v271576$ = -89					; size = 1
+_l_v271572$ = -88					; size = 4
+_l_v271583$ = -84					; size = 4
+_l_v271556$ = -80					; size = 4
+_l_v271559$ = -76					; size = 4
+_l_v271544$ = -72					; size = 4
+_l_v271545$ = -68					; size = 4
+_l_v271580$ = -64					; size = 4
+_l_v271557$ = -60					; size = 4
+_l_v271581$ = -56					; size = 4
+_l_v271553$ = -52					; size = 4
+_l_v271570$ = -48					; size = 4
+_l_v271554$ = -42					; size = 1
+_l_v271565$ = -41					; size = 1
+_l_v271558$ = -40					; size = 4
+_l_v271562$ = -33					; size = 1
+_l_v271561$ = -32					; size = 4
+_l_v271547$ = -28					; size = 4
+_l_v271548$ = -24					; size = 4
+_l_v271573$ = -18					; size = 1
+_l_v271546$ = -17					; size = 1
+_l_v271582$ = -16					; size = 4
+_l_v271550$ = -12					; size = 4
+_l_v271564$ = -8					; size = 4
+_l_v271578$ = -4					; size = 4
+_l_self_596$ = 8					; size = 4
+_l_scope_w_259$ = 12					; size = 4
+_pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root PROC ; COMDAT
+
+; 15629: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root(struct pypy_pypy_interpreter_gateway_BuiltinActivation0 *l_self_596, struct pypy_array1 *l_scope_w_259) {
+
+	push	ebp
+	mov	ebp, esp
+	sub	esp, 116				; 00000074H
+$block0$211591:
+
+; 15630: 	bool_t l_v271551; bool_t l_v271554; bool_t l_v271562;
+; 15631: 	bool_t l_v271565; bool_t l_v271568; bool_t l_v271573;
+; 15632: 	bool_t l_v271576; char l_v271546; long l_v271550; long l_v271553;
+; 15633: 	long l_v271564; long l_v271567; long l_v271572; long l_v271575;
+; 15634: 	struct pypy_object0 *l_v271556; struct pypy_object0 *l_v271570;
+; 15635: 	struct pypy_object0 *l_v271578;
+; 15636: 	struct pypy_object_vtable0 *l_v271561;
+; 15637: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271544;
+; 15638: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271545;
+; 15639: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271557;
+; 15640: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271579;
+; 15641: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271580;
+; 15642: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271581;
+; 15643: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271582;
+; 15644: 	struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271583;
+; 15645: 	struct pypy_pypy_interpreter_gateway_BuiltinActivation_UwS_UCD0 *l_v271548;
+; 15646: 	struct pypy_pypy_module_unicodedata_interp_ucd_UCD0 *l_v271547;
+; 15647: 	void* l_v271558; void* l_v271559;
+; 15648: 
+; 15649:     block0:
+; 15650: 	l_v271548 = (struct pypy_pypy_interpreter_gateway_BuiltinActivation_UwS_UCD0 *)l_self_596;
+
+	mov	eax, DWORD PTR _l_self_596$[ebp]
+	mov	DWORD PTR _l_v271548$[ebp], eax
+
+; 15651: 	l_v271546 = RPyField(l_v271548, bausucdoswrwr_inst_behavior);
+
+	mov	ecx, DWORD PTR _l_v271548$[ebp]
+	mov	dl, BYTE PTR [ecx+8]
+	mov	BYTE PTR _l_v271546$[ebp], dl
+
+; 15652: 	RPyAssert(1, "unexpectedly negative list getitem index");
+; 15653: 	l_v271550 = l_scope_w_259->length;
+
+	mov	eax, DWORD PTR _l_scope_w_259$[ebp]
+	mov	ecx, DWORD PTR [eax+4]
+	mov	DWORD PTR _l_v271550$[ebp], ecx
+
+; 15654: 	OP_INT_LT(0L, l_v271550, l_v271551);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_v271550$[ebp], 0
+	setg	dl
+	mov	BYTE PTR _l_v271551$[ebp], dl
+
+; 15655: 	RPyAssert(l_v271551, "list getitem index out of bound");
+; 15656: 	l_v271553 = l_scope_w_259->length;
+
+	mov	eax, DWORD PTR _l_scope_w_259$[ebp]
+	mov	ecx, DWORD PTR [eax+4]
+	mov	DWORD PTR _l_v271553$[ebp], ecx
+
+; 15657: 	OP_INT_LT(0L, l_v271553, l_v271554);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_v271553$[ebp], 0
+	setg	dl
+	mov	BYTE PTR _l_v271554$[ebp], dl
+
+; 15658: 	RPyAssert(l_v271554, "fixed getitem out of bounds");
+; 15659: 	l_v271556 = RPyItem(l_scope_w_259, 0L);
+
+	mov	eax, DWORD PTR _l_scope_w_259$[ebp]
+	mov	ecx, DWORD PTR [eax+8]
+	mov	DWORD PTR _l_v271556$[ebp], ecx
+
+; 15660: 	l_v271557 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271556;
+
+	mov	edx, DWORD PTR _l_v271556$[ebp]
+	mov	DWORD PTR _l_v271557$[ebp], edx
+
+; 15661: 	l_v271547 = pypy_g_interp_w__UCD(l_v271557, 0);
+
+	push	0
+	mov	eax, DWORD PTR _l_v271557$[ebp]
+	push	eax
+	call	_pypy_g_interp_w__UCD
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | 12(%ebp)}
+	add	esp, 8
+	mov	DWORD PTR _l_v271547$[ebp], eax
+
+; 15662: 	l_v271558 = (void*)l_scope_w_259;
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	DWORD PTR _l_v271558$[ebp], ecx
+
+; 15663: 	l_v271559 = pypy_asm_gcroot(l_v271558);
+
+	test	DWORD PTR _l_v271558$[ebp], 0
+	mov	edx, DWORD PTR _l_v271558$[ebp]
+	mov	DWORD PTR _l_v271559$[ebp], edx
+
+; 15664: 	l_scope_w_259 = l_v271559; /* for moving GCs */
+
+	mov	eax, DWORD PTR _l_v271559$[ebp]
+	mov	DWORD PTR _l_scope_w_259$[ebp], eax
+
+; 15665: 	l_v271561 = RPyField((&pypy_g_ExcData), ed_exc_type);
+
+	mov	ecx, DWORD PTR _pypy_g_ExcData
+	mov	DWORD PTR _l_v271561$[ebp], ecx
+
+; 15666: 	l_v271562 = (l_v271561 == NULL);
+
+	xor	edx, edx
+	cmp	DWORD PTR _l_v271561$[ebp], 0
+	sete	dl
+	mov	BYTE PTR _l_v271562$[ebp], dl
+
+; 15667: 	if (!l_v271562) {
+
+	movzx	eax, BYTE PTR _l_v271562$[ebp]
+	test	eax, eax
+	jne	SHORT $block1$211600
+
+; 15668: 		l_v271583 = ((struct pypy_pypy_interpreter_baseobjspace_W_Root0 *) NULL);
+
+	mov	DWORD PTR _l_v271583$[ebp], 0
+
+; 15669: 		goto block3;
+
+	jmp	$block3$211599
+$block1$211600:
+
+; 15670: 	}
+; 15671: 	goto block1;
+; 15672: 
+; 15673:     block1:
+; 15674: 	RPyAssert(1, "unexpectedly negative list getitem index");
+; 15675: 	l_v271564 = l_scope_w_259->length;
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_v271564$[ebp], edx
+
+; 15676: 	OP_INT_LT(1L, l_v271564, l_v271565);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_v271564$[ebp], 1
+	setg	al
+	mov	BYTE PTR _l_v271565$[ebp], al
+
+; 15677: 	RPyAssert(l_v271565, "list getitem index out of bound");
+; 15678: 	l_v271567 = l_scope_w_259->length;
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_v271567$[ebp], edx
+
+; 15679: 	OP_INT_LT(1L, l_v271567, l_v271568);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_v271567$[ebp], 1
+	setg	al
+	mov	BYTE PTR _l_v271568$[ebp], al
+
+; 15680: 	RPyAssert(l_v271568, "fixed getitem out of bounds");
+; 15681: 	l_v271570 = RPyItem(l_scope_w_259, 1L);
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+12]
+	mov	DWORD PTR _l_v271570$[ebp], edx
+
+; 15682: 	l_v271544 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271570;
+
+	mov	eax, DWORD PTR _l_v271570$[ebp]
+	mov	DWORD PTR _l_v271544$[ebp], eax
+
+; 15683: 	RPyAssert(1, "unexpectedly negative list getitem index");
+; 15684: 	l_v271572 = l_scope_w_259->length;
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_v271572$[ebp], edx
+
+; 15685: 	OP_INT_LT(2L, l_v271572, l_v271573);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_v271572$[ebp], 2
+	setg	al
+	mov	BYTE PTR _l_v271573$[ebp], al
+
+; 15686: 	RPyAssert(l_v271573, "list getitem index out of bound");
+; 15687: 	l_v271575 = l_scope_w_259->length;
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+4]
+	mov	DWORD PTR _l_v271575$[ebp], edx
+
+; 15688: 	OP_INT_LT(2L, l_v271575, l_v271576);
+
+	xor	eax, eax
+	cmp	DWORD PTR _l_v271575$[ebp], 2
+	setg	al
+	mov	BYTE PTR _l_v271576$[ebp], al
+
+; 15689: 	RPyAssert(l_v271576, "fixed getitem out of bounds");
+; 15690: 	l_v271578 = RPyItem(l_scope_w_259, 2L);
+
+	mov	ecx, DWORD PTR _l_scope_w_259$[ebp]
+	mov	edx, DWORD PTR [ecx+16]
+	mov	DWORD PTR _l_v271578$[ebp], edx
+
+; 15691: 	l_v271545 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271578;
+
+	mov	eax, DWORD PTR _l_v271578$[ebp]
+	mov	DWORD PTR _l_v271545$[ebp], eax
+
+; 15692: 	switch (l_v271546) {
+
+	movsx	ecx, BYTE PTR _l_v271546$[ebp]
+	mov	DWORD PTR tv138[ebp], ecx
+	cmp	DWORD PTR tv138[ebp], 3
+	ja	SHORT $LN1 at pypy_g_Bui@2
+	mov	edx, DWORD PTR tv138[ebp]
+	jmp	DWORD PTR $LN14 at pypy_g_Bui@2[edx*4]
+$LN5 at pypy_g_Bui@2:
+
+; 15693:     case 0:
+; 15694: 		goto block2;
+
+	jmp	SHORT $block2$211608
+$LN4 at pypy_g_Bui@2:
+
+; 15695:     case 1:
+; 15696: 		goto block4;
+
+	jmp	SHORT $block4$211610
+$LN3 at pypy_g_Bui@2:
+
+; 15697:     case 2:
+; 15698: 		goto block5;
+
+	jmp	SHORT $block5$211612
+$LN2 at pypy_g_Bui@2:
+
+; 15699:     case 3:
+; 15700: 		goto block6;
+
+	jmp	$block6$211614
+$LN1 at pypy_g_Bui@2:
+
+; 15701:     default:
+; 15702: 		assert(!"bad switch!!");
+
+	mov	eax, OFFSET ??_C at _0N@PGLFNKFI at bad?5switch?$CB?$CB?$AA@
+	test	eax, eax
+	je	SHORT $block2$211608
+	push	15702					; 00003d56H
+	push	OFFSET ??_C at _1BO@DMBFIACJ@?$AAi?$AAm?$AAp?$AAl?$AAe?$AAm?$AAe?$AAn?$AAt?$AA_?$AA1?$AA1?$AA?4?$AAc?$AA?$AA@
+	push	OFFSET ??_C at _1CA@EIJBLFPJ@?$AA?$CB?$AA?$CC?$AAb?$AAa?$AAd?$AA?5?$AAs?$AAw?$AAi?$AAt?$AAc?$AAh?$AA?$CB?$AA?$CB?$AA?$CC?$AA?$AA@
+	call	DWORD PTR __imp___wassert
+	add	esp, 12					; 0000000cH
+$block2$211608:
+
+; 15703: 	}
+; 15704: 
+; 15705:     block2:
+; 15706: 	l_v271579 = pypy_g_UCD_digit(l_v271547, l_v271544, l_v271545);
+
+	mov	edx, DWORD PTR _l_v271545$[ebp]
+	push	edx
+	mov	eax, DWORD PTR _l_v271544$[ebp]
+	push	eax
+	mov	ecx, DWORD PTR _l_v271547$[ebp]
+	push	ecx
+	call	_pypy_g_UCD_digit
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 12					; 0000000cH
+	mov	DWORD PTR _l_v271579$[ebp], eax
+
+; 15707: 	l_v271583 = l_v271579;
+
+	mov	edx, DWORD PTR _l_v271579$[ebp]
+	mov	DWORD PTR _l_v271583$[ebp], edx
+$block3$211599:
+
+; 15708: 	goto block3;
+; 15709: 
+; 15710:     block3:
+; 15711: 	RPY_DEBUG_RETURN();
+; 15712: 	return l_v271583;
+
+	mov	eax, DWORD PTR _l_v271583$[ebp]
+	jmp	SHORT $LN9 at pypy_g_Bui@2
+$block4$211610:
+
+; 15713: 
+; 15714:     block4:
+; 15715: 	l_v271580 = pypy_g_UCD_name(l_v271547, l_v271544, l_v271545);
+
+	mov	eax, DWORD PTR _l_v271545$[ebp]
+	push	eax
+	mov	ecx, DWORD PTR _l_v271544$[ebp]
+	push	ecx
+	mov	edx, DWORD PTR _l_v271547$[ebp]
+	push	edx
+	call	_pypy_g_UCD_name
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 12					; 0000000cH
+	mov	DWORD PTR _l_v271580$[ebp], eax
+
+; 15716: 	l_v271583 = l_v271580;
+
+	mov	eax, DWORD PTR _l_v271580$[ebp]
+	mov	DWORD PTR _l_v271583$[ebp], eax
+
+; 15717: 	goto block3;
+
+	jmp	SHORT $block3$211599
+$block5$211612:
+
+; 15718: 
+; 15719:     block5:
+; 15720: 	l_v271581 = pypy_g_UCD_decimal(l_v271547, l_v271544, l_v271545);
+
+	mov	ecx, DWORD PTR _l_v271545$[ebp]
+	push	ecx
+	mov	edx, DWORD PTR _l_v271544$[ebp]
+	push	edx
+	mov	eax, DWORD PTR _l_v271547$[ebp]
+	push	eax
+	call	_pypy_g_UCD_decimal
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 12					; 0000000cH
+	mov	DWORD PTR _l_v271581$[ebp], eax
+
+; 15721: 	l_v271583 = l_v271581;
+
+	mov	ecx, DWORD PTR _l_v271581$[ebp]
+	mov	DWORD PTR _l_v271583$[ebp], ecx
+
+; 15722: 	goto block3;
+
+	jmp	SHORT $block3$211599
+$block6$211614:
+
+; 15723: 
+; 15724:     block6:
+; 15725: 	l_v271582 = pypy_g_UCD_numeric(l_v271547, l_v271544, l_v271545);
+
+	mov	edx, DWORD PTR _l_v271545$[ebp]
+	push	edx
+	mov	eax, DWORD PTR _l_v271544$[ebp]
+	push	eax
+	mov	ecx, DWORD PTR _l_v271547$[ebp]
+	push	ecx
+	call	_pypy_g_UCD_numeric
+    ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | }
+	add	esp, 12					; 0000000cH
+	mov	DWORD PTR _l_v271582$[ebp], eax
+
+; 15726: 	l_v271583 = l_v271582;
+
+	mov	edx, DWORD PTR _l_v271582$[ebp]
+	mov	DWORD PTR _l_v271583$[ebp], edx
+
+; 15727: 	goto block3;
+
+	jmp	SHORT $block3$211599
+$LN9 at pypy_g_Bui@2:
+
+; 15728: }
+
+	mov	esp, ebp
+	pop	ebp
+	ret	0
+	npad	3
+$LN14 at pypy_g_Bui@2:
+	DD	$LN5 at pypy_g_Bui@2
+	DD	$LN4 at pypy_g_Bui@2
+	DD	$LN3 at pypy_g_Bui@2
+	DD	$LN2 at pypy_g_Bui@2
+_pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root ENDP

Modified: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py
==============================================================================
--- pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py	(original)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py	Thu Oct 22 18:26:51 2009
@@ -32,8 +32,6 @@
 r_insn          = re.compile(r"\t([a-z]\w*)\s")
 r_jmp_switch    = re.compile(r"\tjmp\t[*]"+LABEL+"[(]")
 r_jmp_source    = re.compile(r"\d*[(](%[\w]+)[,)]")
-r_jmptable_item = re.compile(r"\t.long\t"+LABEL+"(-\"[A-Za-z0-9$]+\")?\s*$")
-r_jmptable_end  = re.compile(r"\t.text|\t.section\s+.text|\t\.align|"+LABEL)
 
 class FunctionGcRootTracker(object):
     skip = 0
@@ -41,7 +39,6 @@
     @classmethod
     def init_regexp(cls):
         cls.r_unaryinsn     = re.compile(r"\t[a-z]\w*\s+("+cls.OPERAND+")\s*$")
-        cls.r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+([*]"+cls.OPERAND+")\s*$")
         cls.r_binaryinsn    = re.compile(r"\t[a-z]\w*\s+(?P<source>"+cls.OPERAND+"),\s*(?P<target>"+cls.OPERAND+")\s*$")
 
         cls.r_jump          = re.compile(r"\tj\w+\s+"+cls.LABEL+"\s*$")
@@ -539,7 +536,7 @@
             # registry:
             #     movl L9341(%eax), %eax
             #     jmp *%eax
-            operand = self.r_unaryinsn_star.match(line).group(1)[1:]
+            operand = self.r_unaryinsn_star.match(line).group(1)
             def walker(insn, locs):
                 sources = []
                 for loc in locs:
@@ -567,10 +564,10 @@
         assert len(tablelabels) <= 1
         if tablelabels:
             tablelin = self.labels[tablelabels[0]].lineno + 1
-            while not r_jmptable_end.match(self.lines[tablelin]):
-                match = r_jmptable_item.match(self.lines[tablelin])
+            while not self.r_jmptable_end.match(self.lines[tablelin]):
+                match = self.r_jmptable_item.match(self.lines[tablelin])
                 if not match:
-                    raise NoPatternMatch(self.lines[tablelin])
+                    raise NoPatternMatch(repr(self.lines[tablelin]))
                 label = match.group(1)
                 if label != '0':
                     self.register_jump_to(label)
@@ -660,6 +657,10 @@
             # Function name is decorated with "@N" where N is the stack size
             if match and '@' in target:
                 insns.append(InsnStackAdjust(int(target.rsplit('@', 1)[1])))
+            # XXX some functions seem use the "fastcall" calling convention
+            # without their declaration, how can we guess the stack effect?
+            if match and target in ['__alldiv', '__allrem', '__allmul']:
+                insns.append(InsnStackAdjust(16))
         return insns
 
 
@@ -685,6 +686,10 @@
     r_localvar_esp  = re.compile(r"(\d*)[(]%esp[)]")
     r_localvar_ebp  = re.compile(r"(-?\d*)[(]%ebp[)]")
 
+    r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+[*]("+OPERAND+")\s*$")
+    r_jmptable_item = re.compile(r"\t.long\t"+LABEL+"(-\"[A-Za-z0-9$]+\")?\s*$")
+    r_jmptable_end  = re.compile(r"\t.text|\t.section\s+.text|\t\.align|"+LABEL)
+
     r_gcroot_marker = re.compile(r"\t/[*] GCROOT ("+LOCALVARFP+") [*]/")
     r_bottom_marker = re.compile(r"\t/[*] GC_STACK_BOTTOM [*]/")
 
@@ -746,6 +751,10 @@
     r_gcroot_marker = re.compile(r";.+ = pypy_asm_gcroot\(")
     r_bottom_marker = re.compile(r"\tcall\t_pypy_asm_stack_bottom\s*")
 
+    r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+DWORD PTR ("+OPERAND+")\s*$")
+    r_jmptable_item = re.compile(r"\tDD\t"+LABEL+"(-\"[A-Za-z0-9$]+\")?\s*$")
+    r_jmptable_end  = re.compile(r"[^\t]")
+
     @classmethod
     def init_regexp(cls):
         super(MsvcFunctionGcRootTracker, cls).init_regexp()
@@ -1264,10 +1273,13 @@
 else:
     FUNCTIONS_NOT_RETURNING = {
         '_abort': None,
-        '__imp__abort': None,
         '__exit': None,
         '__assert': None,
         '__wassert': None,
+        '__imp__abort': None,
+        '__imp___wassert': None,
+        'DWORD PTR __imp__abort': None,
+        'DWORD PTR __imp___wassert': None,
         }
 
 # __________ debugging output __________



More information about the Pypy-commit mailing list