Permalink
Browse files

Merge pull request #180 from dawgfoto/fix5689

fix issue 5689
  • Loading branch information...
2 parents 4c011b3 + 5cf68bd commit c7dc74a32ea823a86304bb874e7308309dce6f37 @WalterBright WalterBright committed Mar 21, 2012
Showing with 81 additions and 11 deletions.
  1. +81 −11 src/rt/trace.d
View
@@ -774,25 +774,39 @@ void _trace_pro_n()
{
naked ;
pushad ;
- mov ECX,8*4[ESP] ;
+
+ sub RSP, 4*16 ;
+ movdqu 0*16[RSP], XMM0 ;
+ movdqu 1*16[RSP], XMM1 ;
+ movdqu 2*16[RSP], XMM2 ;
+ movdqu 3*16[RSP], XMM3 ;
+
+ mov ECX,8*4+4*16[ESP] ;
xor EAX,EAX ;
mov AL,[ECX] ;
cmp AL,0xFF ;
jne L1 ;
cmp byte ptr 1[ECX],0 ;
jne L1 ;
mov AX,2[ECX] ;
- add 8*4[ESP],3 ;
+ add 8*4+4*16[ESP],3 ;
add ECX,3 ;
L1: inc EAX ;
inc ECX ;
- add 8*4[ESP],EAX ;
+ add 8*4+4*16[ESP],EAX ;
dec EAX ;
sub ESP,4 ;
push ECX ;
push EAX ;
call trace_pro ;
add ESP,12 ;
+
+ movdqu XMM0, 0*16[RSP] ;
+ movdqu XMM1, 1*16[RSP] ;
+ movdqu XMM2, 2*16[RSP] ;
+ movdqu XMM3, 3*16[RSP] ;
+ add RSP, 4*16 ;
+
popad ;
ret ;
}
@@ -810,24 +824,46 @@ void _trace_pro_n()
push R9 ;
push R10 ;
push R11 ;
- mov RCX,9*8[RSP] ;
+
+ sub RSP, 8*16 ;
+ movdqu 0*16[RSP], XMM0 ;
+ movdqu 1*16[RSP], XMM1 ;
+ movdqu 2*16[RSP], XMM2 ;
+ movdqu 3*16[RSP], XMM3 ;
+ movdqu 4*16[RSP], XMM4 ;
+ movdqu 5*16[RSP], XMM5 ;
+ movdqu 6*16[RSP], XMM6 ;
+ movdqu 7*16[RSP], XMM7 ;
+
+ mov RCX,9*8+8*16[RSP] ;
xor RAX,RAX ;
mov AL,[RCX] ;
cmp AL,0xFF ;
jne L1 ;
cmp byte ptr 1[RCX],0 ;
jne L1 ;
mov AX,2[RCX] ;
- add 9*8[RSP],3 ;
+ add 9*8+8*16[RSP],3 ;
add RCX,3 ;
L1: inc RAX ;
inc RCX ;
- add 9*8[RSP],RAX ;
+ add 9*8+8*16[RSP],RAX ;
dec RAX ;
push RCX ;
push RAX ;
call trace_pro ;
add RSP,16 ;
+
+ movdqu XMM0, 0*16[RSP] ;
+ movdqu XMM1, 1*16[RSP] ;
+ movdqu XMM2, 2*16[RSP] ;
+ movdqu XMM3, 3*16[RSP] ;
+ movdqu XMM4, 4*16[RSP] ;
+ movdqu XMM5, 5*16[RSP] ;
+ movdqu XMM6, 6*16[RSP] ;
+ movdqu XMM7, 7*16[RSP] ;
+ add RSP, 8*16 ;
+
pop R11 ;
pop R10 ;
pop R9 ;
@@ -887,24 +923,46 @@ void _trace_pro_n()
push R9 ;
push R10 ;
push R11 ;
- mov RCX,9*8[RSP] ;
+
+ sub RSP, 8*16 ;
+ movdqu 0*16[RSP], XMM0 ;
+ movdqu 1*16[RSP], XMM1 ;
+ movdqu 2*16[RSP], XMM2 ;
+ movdqu 3*16[RSP], XMM3 ;
+ movdqu 4*16[RSP], XMM4 ;
+ movdqu 5*16[RSP], XMM5 ;
+ movdqu 6*16[RSP], XMM6 ;
+ movdqu 7*16[RSP], XMM7 ;
+
+ mov RCX,9*8+8*16[RSP] ;
xor RAX,RAX ;
mov AL,[RCX] ;
cmp AL,0xFF ;
jne L1 ;
cmp byte ptr 1[RCX],0 ;
jne L1 ;
mov AX,2[RCX] ;
- add 9*8[RSP],3 ;
+ add 9*8+8*16[RSP],3 ;
add RCX,3 ;
L1: inc RAX ;
inc RCX ;
- add 9*8[RSP],RAX ;
+ add 9*8+8*16[RSP],RAX ;
dec RAX ;
push RCX ;
push RAX ;
call trace_pro ;
add RSP,16 ;
+
+ movdqu XMM0, 0*16[RSP] ;
+ movdqu XMM1, 1*16[RSP] ;
+ movdqu XMM2, 2*16[RSP] ;
+ movdqu XMM3, 3*16[RSP] ;
+ movdqu XMM4, 4*16[RSP] ;
+ movdqu XMM5, 5*16[RSP] ;
+ movdqu XMM6, 6*16[RSP] ;
+ movdqu XMM7, 7*16[RSP] ;
+ add RSP, 8*16 ;
+
pop R11 ;
pop R10 ;
pop R9 ;
@@ -959,13 +1017,19 @@ void _trace_epi_n()
push R9 ;
push R10 ;
push R11 ;
- /* Don't worry about saving XMM0/1 or ST0/1
+ sub RSP, 2*16 ;
+ movdqu 0*16[RSP], XMM0;
+ movdqu 1*16[RSP], XMM1;
+ /* Don't worry about saving ST0/1
* Hope trace_epi() doesn't change them
*/
}
trace_epi();
asm
{
+ movdqu XMM0, 0*16[RSP];
+ movdqu XMM1, 1*16[RSP];
+ add RSP, 2*16 ;
pop R11 ;
pop R10 ;
pop R9 ;
@@ -1011,13 +1075,19 @@ void _trace_epi_n()
push R9 ;
push R10 ;
push R11 ;
- /* Don't worry about saving XMM0/1 or ST0/1
+ sub RSP, 2*16 ;
+ movdqu 0*16[RSP], XMM0;
+ movdqu 1*16[RSP], XMM1;
+ /* Don't worry about saving ST0/1
* Hope trace_epi() doesn't change them
*/
}
trace_epi();
asm
{
+ movdqu XMM0, 0*16[RSP];
+ movdqu XMM1, 1*16[RSP];
+ add RSP, 2*16 ;
pop R11 ;
pop R10 ;
pop R9 ;

0 comments on commit c7dc74a

Please sign in to comment.