mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 11:39:40 +01:00 
			
		
		
		
	* Fixed size suffix generated for CVTSI2SS, CVTSI2SD, VCVTSI2SS, VCVTSI2SD instructions. Mantis #31550.
* tasm2.pp already detected this bug if run with -al option. Added a copy of tasm2.pp and configured it with -al, so it is run daily on all suitable machines. git-svn-id: trunk@35626 -
This commit is contained in:
		
							parent
							
								
									051f8568b3
								
							
						
					
					
						commit
						2357ca1fe6
					
				
							
								
								
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@ -12040,7 +12040,9 @@ tests/test/tarrconstr2.pp svneol=native#text/pascal
 | 
				
			|||||||
tests/test/tarrconstr3.pp svneol=native#text/pascal
 | 
					tests/test/tarrconstr3.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/tarrconstr4.pp svneol=native#text/pascal
 | 
					tests/test/tarrconstr4.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/tasm1.pp svneol=native#text/plain
 | 
					tests/test/tasm1.pp svneol=native#text/plain
 | 
				
			||||||
 | 
					tests/test/tasm2.inc svneol=native#text/plain
 | 
				
			||||||
tests/test/tasm2.pp svneol=native#text/plain
 | 
					tests/test/tasm2.pp svneol=native#text/plain
 | 
				
			||||||
 | 
					tests/test/tasm2a.pp svneol=native#text/plain
 | 
				
			||||||
tests/test/tasm3.pp svneol=native#text/plain
 | 
					tests/test/tasm3.pp svneol=native#text/plain
 | 
				
			||||||
tests/test/tasm4.pp svneol=native#text/plain
 | 
					tests/test/tasm4.pp svneol=native#text/plain
 | 
				
			||||||
tests/test/tasm5.pp svneol=native#text/plain
 | 
					tests/test/tasm5.pp svneol=native#text/plain
 | 
				
			||||||
 | 
				
			|||||||
@ -896,13 +896,25 @@ begin
 | 
				
			|||||||
            exit;
 | 
					            exit;
 | 
				
			||||||
          A_MOVQ :
 | 
					          A_MOVQ :
 | 
				
			||||||
            opsize:=S_IQ;
 | 
					            opsize:=S_IQ;
 | 
				
			||||||
 | 
					          A_CVTSI2SS,
 | 
				
			||||||
 | 
					          A_CVTSI2SD,
 | 
				
			||||||
          A_OUT :
 | 
					          A_OUT :
 | 
				
			||||||
            opsize:=tx86operand(operands[1]).opsize;
 | 
					            opsize:=tx86operand(operands[1]).opsize;
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            opsize:=tx86operand(operands[2]).opsize;
 | 
					            opsize:=tx86operand(operands[2]).opsize;
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
    3,4 :
 | 
					    3 :
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        case opcode of
 | 
				
			||||||
 | 
					          A_VCVTSI2SS,
 | 
				
			||||||
 | 
					          A_VCVTSI2SD:
 | 
				
			||||||
 | 
					            opsize:=tx86operand(operands[1]).opsize;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          opsize:=tx86operand(operands[ops]).opsize;
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					    4 :
 | 
				
			||||||
        opsize:=tx86operand(operands[ops]).opsize;
 | 
					        opsize:=tx86operand(operands[ops]).opsize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										325
									
								
								tests/test/tasm2.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								tests/test/tasm2.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,325 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					// (Almost) every of these instructions use a high register and thus generate REX.
 | 
				
			||||||
 | 
					{$asmmode att}
 | 
				
			||||||
 | 
					procedure test; assembler; nostackframe;
 | 
				
			||||||
 | 
					asm
 | 
				
			||||||
 | 
					    addsubpd  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    addsubps  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    comisd    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    comiss    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    cvtdq2pd  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    cvtpd2dq  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    cvtps2pd  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    cvttps2dq 0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    cvtsi2ss  %eax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2ssl %eax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2ss  %rax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2ssq %rax, %xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtsi2ss  (%rax), %xmm8
 | 
				
			||||||
 | 
					    cvtsi2ssl (%rax), %xmm8
 | 
				
			||||||
 | 
					    cvtsi2ssq (%rax), %xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtsi2sd  %eax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sdl %eax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sd  %rax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sdq %rax, %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sd  (%rax), %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sdl (%rax), %xmm8
 | 
				
			||||||
 | 
					    cvtsi2sdq (%rax), %xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    movdqu    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movdqu    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movdqa    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movdqa    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    haddps    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    haddpd    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movshdup  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movsldup  0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    movhpd    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movhpd    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movhps    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movhps    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movlpd    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movlpd    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    movlps    %xmm8,0x12345678(%rip)
 | 
				
			||||||
 | 
					    movlps    0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pshufhw   $0x90,0x12345678(%rip),%xmm1      { Fixed: unable to determine size }
 | 
				
			||||||
 | 
					    pshuflw   $0x90,0x12345678(%rip),%xmm1
 | 
				
			||||||
 | 
					    punpcklbw 0x12345678(%rip),%mm1
 | 
				
			||||||
 | 
					    punpckldq 0x12345678(%rip),%mm1
 | 
				
			||||||
 | 
					    punpcklwd 0x12345678(%rip),%mm1
 | 
				
			||||||
 | 
					    punpcklbw 0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    punpckldq 0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    punpcklwd 0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    punpcklqdq 0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ucomisd   0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					    ucomiss   0x12345678(%rip),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmpeqsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    cmpeqss (%rax),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtpi2pd %mm0,%xmm8
 | 
				
			||||||
 | 
					    cvtpi2pd (%rax),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtpi2ps %mm0,%xmm8
 | 
				
			||||||
 | 
					    cvtpi2ps (%rax),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtps2pi (%r8),%mm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtsd2si (%r8),%eax
 | 
				
			||||||
 | 
					    cvtsd2siq (%r8),%rax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvttsd2si (%r8),%eax
 | 
				
			||||||
 | 
					    cvttsd2siq (%r8),%rax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtsd2ss (%r8),%xmm0
 | 
				
			||||||
 | 
					    cvtss2sd (%r8),%xmm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvtss2si (%r8),%eax
 | 
				
			||||||
 | 
					    cvtss2siq (%r8),%rax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cvttss2si (%r8),%eax
 | 
				
			||||||
 | 
					    cvttss2siq (%r8),%rax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    divsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    divss (%rax),%xmm8
 | 
				
			||||||
 | 
					    maxsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    maxss (%rax),%xmm8
 | 
				
			||||||
 | 
					    minss (%rax),%xmm8
 | 
				
			||||||
 | 
					    minss (%rax),%xmm8
 | 
				
			||||||
 | 
					    movntsd %xmm8,(%rax)
 | 
				
			||||||
 | 
					    movntss %xmm8,(%rax)
 | 
				
			||||||
 | 
					    movss (%rax),%xmm8
 | 
				
			||||||
 | 
					    movss %xmm8,(%rax)
 | 
				
			||||||
 | 
					    mulsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    mulss (%rax),%xmm8
 | 
				
			||||||
 | 
					    rcpss (%rax),%xmm8
 | 
				
			||||||
 | 
					    rcpps (%rax),%xmm8
 | 
				
			||||||
 | 
					    roundsd $0,(%rax),%xmm8             { (Fixed) unable to determine size }
 | 
				
			||||||
 | 
					    roundss $0,(%rax),%xmm8
 | 
				
			||||||
 | 
					    rsqrtss (%rax),%xmm8
 | 
				
			||||||
 | 
					    rsqrtps (%rax),%xmm8
 | 
				
			||||||
 | 
					    sqrtsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    sqrtss (%rax),%xmm8
 | 
				
			||||||
 | 
					    sqrtpd (%rax),%xmm8
 | 
				
			||||||
 | 
					    sqrtps (%rax),%xmm8
 | 
				
			||||||
 | 
					    subsd (%rax),%xmm8
 | 
				
			||||||
 | 
					    subss (%rax),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pmovsxbw (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovsxbd (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovsxbq (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovsxwd (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovsxwq (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovsxdq (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxbw (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxbd (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxbq (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxwd (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxwq (%rax),%xmm8
 | 
				
			||||||
 | 
					    pmovzxdq (%rax),%xmm8
 | 
				
			||||||
 | 
					    insertps $0x0,(%rax),%xmm8          { (Fixed) unable to determine size }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    unpckhpd (%rax),%xmm8               { (Fixed) invalid combination of opcode and operands }
 | 
				
			||||||
 | 
					    unpckhps (%rax),%xmm8
 | 
				
			||||||
 | 
					    unpcklpd (%rax),%xmm8
 | 
				
			||||||
 | 
					    unpcklps (%rax),%xmm8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmpss   $0x10,%xmm7,%xmm6
 | 
				
			||||||
 | 
					    cmpss   $0x10,(%rax),%xmm7          { (Fixed) unable to determine size }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    paddq   %mm1,%mm0
 | 
				
			||||||
 | 
					    paddq   (%rax),%mm0
 | 
				
			||||||
 | 
					    paddq   %xmm1,%xmm0
 | 
				
			||||||
 | 
					    paddq   (%rax),%xmm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    psubq   %mm1,%mm0
 | 
				
			||||||
 | 
					    psubq   (%rax),%mm0
 | 
				
			||||||
 | 
					    psubq   %xmm1,%xmm0
 | 
				
			||||||
 | 
					    psubq   (%rax),%xmm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pmuludq  %mm1,%mm0
 | 
				
			||||||
 | 
					    pmuludq  (%rax),%mm0
 | 
				
			||||||
 | 
					    pmuludq  %xmm1,%xmm0
 | 
				
			||||||
 | 
					    pmuludq  (%rax),%xmm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    addps   (%r8),%xmm0
 | 
				
			||||||
 | 
					    addss   (%r8),%xmm0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pmulhuw (%r8),%xmm0
 | 
				
			||||||
 | 
					    psadbw (%r8), %xmm0
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure tmovd; assembler; nostackframe;
 | 
				
			||||||
 | 
					asm
 | 
				
			||||||
 | 
					    movd  0x12345678(%rip), %xmm0
 | 
				
			||||||
 | 
					    movd  %xmm0, 0x12345678(%rip)
 | 
				
			||||||
 | 
					    movd  %eax, %xmm0
 | 
				
			||||||
 | 
					    movd  %xmm0, %eax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ same for MMX registers }
 | 
				
			||||||
 | 
					    movd  0x12345678(%rip), %mm0
 | 
				
			||||||
 | 
					    movd  %mm0, 0x12345678(%rip)
 | 
				
			||||||
 | 
					    movd  %eax, %mm0
 | 
				
			||||||
 | 
					    movd  %mm0, %eax
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure tmovq; assembler; nostackframe;
 | 
				
			||||||
 | 
					asm
 | 
				
			||||||
 | 
					    movq  0x12345678(%rip), %xmm0
 | 
				
			||||||
 | 
					    movq  %xmm0, 0x12345678(%rip)
 | 
				
			||||||
 | 
					    movq  %xmm1, %xmm0
 | 
				
			||||||
 | 
					    movq  %rax, %xmm0
 | 
				
			||||||
 | 
					    movq  %xmm0, %rax
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ same for MMX registers }
 | 
				
			||||||
 | 
					    movq  0x12345678(%rip), %mm0
 | 
				
			||||||
 | 
					    movq  %mm0, 0x12345678(%rip)
 | 
				
			||||||
 | 
					    movq  %mm1, %mm0
 | 
				
			||||||
 | 
					    movq  %rax, %mm0
 | 
				
			||||||
 | 
					    movq  %mm0, %rax
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Here are some more tough nuts to crack...
 | 
				
			||||||
 | 
					procedure test2; assembler; nostackframe;
 | 
				
			||||||
 | 
					asm
 | 
				
			||||||
 | 
					//    cmpsd     $0x10,%xmm7,%xmm6         { unrecognized opcode }
 | 
				
			||||||
 | 
					//    cmpsd     $0x10,(%rax),%xmm7
 | 
				
			||||||
 | 
					//    movsd     (%rax),%xmm8              { unrecognized opcode }
 | 
				
			||||||
 | 
					//    movsd     %xmm8,(%rax)
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure tcalljump; assembler; nostackframe;
 | 
				
			||||||
 | 
					asm
 | 
				
			||||||
 | 
					    call   *0x12345678(%rip)
 | 
				
			||||||
 | 
					    call   *(%rax)
 | 
				
			||||||
 | 
					    jmp    *0x12345678(%rip)
 | 
				
			||||||
 | 
					    jmp    *(%rax)
 | 
				
			||||||
 | 
					    lcall  *0x12345678(%rip)
 | 
				
			||||||
 | 
					    lcall  *(%rax)
 | 
				
			||||||
 | 
					    ljmp   *0x12345678(%rip)
 | 
				
			||||||
 | 
					    ljmp   *(%rax)
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const
 | 
				
			||||||
 | 
					  test_expected : array[0..745] of byte = (
 | 
				
			||||||
 | 
					    $66,$44,$0F,$D0,$05,$78,$56,$34,$12, // addsubpd
 | 
				
			||||||
 | 
					    $F2,$44,$0F,$D0,$05,$78,$56,$34,$12, // addsubps
 | 
				
			||||||
 | 
					    $66,$44,$0F,$2F,$05,$78,$56,$34,$12, // comisd
 | 
				
			||||||
 | 
					    $44,$0F,$2F,$05,$78,$56,$34,$12,     // comiss
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$E6,$05,$78,$56,$34,$12, // cvtdq2pd
 | 
				
			||||||
 | 
					    $F2,$44,$0F,$E6,$05,$78,$56,$34,$12, // cvtpd2dq
 | 
				
			||||||
 | 
					    $44,$0F,$5A,$05,$78,$56,$34,$12,     // cvtps2pd
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$5B,$05,$78,$56,$34,$12, // cvttps2dq
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$2A,$C0,                 // cvtsi2ss
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$2A,$C0,                 // cvtsi2ss
 | 
				
			||||||
 | 
					    $F3,$4C,$0F,$2A,$C0,                 // cvtsi2ss
 | 
				
			||||||
 | 
					    $F3,$4C,$0F,$2A,$C0,                 // cvtsi2ss
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$2A,$00,                 // cvtsi2ss  (%rax),%xmm8
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$2A,$00,                 // cvtsi2ssl (%rax),%xmm8
 | 
				
			||||||
 | 
					    $F3,$4C,$0F,$2A,$00,                 // cvtsi2ssq (%rax),%xmm8
 | 
				
			||||||
 | 
					    $F2,$44,$0F,$2A,$C0,$F2,$44,$0F,
 | 
				
			||||||
 | 
					    $2A,$C0,$F2,$4C,$0F,$2A,$C0,$F2,$4C,$0F,$2A,$C0,$F2,$44,$0F,
 | 
				
			||||||
 | 
					    $2A,$00,$F2,$44,$0F,$2A,$00,$F2,$4C,$0F,$2A,$00,$F3,$44,$0F,
 | 
				
			||||||
 | 
					    $7F,$05,$78,$56,$34,$12,$F3,$44,$0F,$6F,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $66,$44,$0F,$7F,$05,$78,$56,$34,$12,$66,$44,$0F,$6F,$05,$78,
 | 
				
			||||||
 | 
					    $56,$34,$12,$F2,$44,$0F,$7C,$05,$78,$56,$34,$12,$66,$44,$0F,
 | 
				
			||||||
 | 
					    $7C,$05,$78,$56,$34,$12,$F3,$44,$0F,$16,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $F3,$44,$0F,$12,$05,$78,$56,$34,$12,$66,$44,$0F,$17,$05,$78,
 | 
				
			||||||
 | 
					    $56,$34,$12,$66,$44,$0F,$16,$05,$78,$56,$34,$12,$44,$0F,$17,
 | 
				
			||||||
 | 
					    $05,$78,$56,$34,$12,$44,$0F,$16,$05,$78,$56,$34,$12,$66,$44,
 | 
				
			||||||
 | 
					    $0F,$13,$05,$78,$56,$34,$12,$66,$44,$0F,$12,$05,$78,$56,$34,
 | 
				
			||||||
 | 
					    $12,$44,$0F,$13,$05,$78,$56,$34,$12,$44,$0F,$12,$05,$78,$56,
 | 
				
			||||||
 | 
					    $34,$12,$F3,$0F,$70,$0D,$78,$56,$34,$12,$90,$F2,$0F,$70,$0D,
 | 
				
			||||||
 | 
					    $78,$56,$34,$12,$90,$0F,$60,$0D,$78,$56,$34,$12,$0F,$62,$0D,
 | 
				
			||||||
 | 
					    $78,$56,$34,$12,$0F,$61,$0D,$78,$56,$34,$12,$66,$44,$0F,$60,
 | 
				
			||||||
 | 
					    $05,$78,$56,$34,$12,$66,$44,$0F,$62,$05,$78,$56,$34,$12,$66,
 | 
				
			||||||
 | 
					    $44,$0F,$61,$05,$78,$56,$34,$12,$66,$44,$0F,$6C,$05,$78,$56,
 | 
				
			||||||
 | 
					    $34,$12,$66,$44,$0F,$2E,$05,$78,$56,$34,$12,$44,$0F,$2E,$05,
 | 
				
			||||||
 | 
					    $78,$56,$34,$12,$F2,$44,$0F,$C2,$00,$00,$F3,$44,$0F,$C2,$00,
 | 
				
			||||||
 | 
					    $00,$66,$44,$0F,$2A,$C0,$66,$44,$0F,$2A,$00,$44,$0F,$2A,$C0,
 | 
				
			||||||
 | 
					    $44,$0F,$2A,$00,$41,$0F,$2D,$00,$F2,$41,$0F,$2D,$00,$F2,$49,
 | 
				
			||||||
 | 
					    $0F,$2D,$00,$F2,$41,$0F,$2C,$00,$F2,$49,$0F,$2C,$00,$F2,$41,
 | 
				
			||||||
 | 
					    $0F,$5A,$00,$F3,$41,$0F,$5A,$00,$F3,$41,$0F,$2D,$00,$F3,$49,
 | 
				
			||||||
 | 
					    $0F,$2D,$00,$F3,$41,$0F,$2C,$00,$F3,$49,$0F,$2C,$00,$F2,$44,
 | 
				
			||||||
 | 
					    $0F,$5E,$00,$F3,$44,$0F,$5E,$00,$F2,$44,$0F,$5F,$00,$F3,$44,
 | 
				
			||||||
 | 
					    $0F,$5F,$00,$F3,$44,$0F,$5D,$00,$F3,$44,$0F,$5D,$00,$F2,$44,
 | 
				
			||||||
 | 
					    $0F,$2B,$00,$F3,$44,$0F,$2B,$00,$F3,$44,$0F,$10,$00,$F3,$44,
 | 
				
			||||||
 | 
					    $0F,$11,$00,$F2,$44,$0F,$59,$00,$F3,$44,$0F,$59,$00,$F3,$44,
 | 
				
			||||||
 | 
					    $0F,$53,$00,$44,$0F,$53,$00,$66,$44,$0F,$3A,$0B,$00,$00,$66,
 | 
				
			||||||
 | 
					    $44,$0F,$3A,$0A,$00,$00,$F3,$44,$0F,$52,$00,$44,$0F,$52,$00,
 | 
				
			||||||
 | 
					    $F2,$44,$0F,$51,$00,$F3,$44,$0F,$51,$00,$66,$44,$0F,$51,$00,
 | 
				
			||||||
 | 
					    $44,$0F,$51,$00,$F2,$44,$0F,$5C,$00,$F3,$44,$0F,$5C,$00,$66,
 | 
				
			||||||
 | 
					    $44,$0F,$38,$20,$00,$66,$44,$0F,$38,$21,$00,$66,$44,$0F,$38,
 | 
				
			||||||
 | 
					    $22,$00,$66,$44,$0F,$38,$23,$00,$66,$44,$0F,$38,$24,$00,$66,
 | 
				
			||||||
 | 
					    $44,$0F,$38,$25,$00,$66,$44,$0F,$38,$30,$00,$66,$44,$0F,$38,
 | 
				
			||||||
 | 
					    $31,$00,$66,$44,$0F,$38,$32,$00,$66,$44,$0F,$38,$33,$00,$66,
 | 
				
			||||||
 | 
					    $44,$0F,$38,$34,$00,$66,$44,$0F,$38,$35,$00,$66,$44,$0F,$3A,
 | 
				
			||||||
 | 
					    $21,$00,$00,$66,$44,$0F,$15,$00,$44,$0F,$15,$00,$66,$44,$0F,
 | 
				
			||||||
 | 
					    $14,$00,$44,$0F,$14,$00,$F3,$0F,$C2,$F7,$10,$F3,$0F,$C2,$38,
 | 
				
			||||||
 | 
					    $10,$0F,$D4,$C1,$0F,$D4,$00,$66,$0F,$D4,$C1,$66,$0F,$D4,$00,
 | 
				
			||||||
 | 
					    $0F,$FB,$C1,$0F,$FB,$00,$66,$0F,$FB,$C1,$66,$0F,$FB,$00,$0F,
 | 
				
			||||||
 | 
					    $F4,$C1,$0F,$F4,$00,$66,$0F,$F4,$C1,$66,$0F,$F4,$00,$41,$0F,
 | 
				
			||||||
 | 
					    $58,$00,$F3,$41,$0F,$58,$00,$66,$41,$0F,$E4,$00,$66,$41,$0F,
 | 
				
			||||||
 | 
					    $F6,$00,$C3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 tmovq_expected: array[0..54] of byte = (
 | 
				
			||||||
 | 
					    $F3,$0F,$7E,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $66,$0F,$D6,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $F3,$0F,$7E,$C1,
 | 
				
			||||||
 | 
					    $66,$48,$0F,$6E,$C0,
 | 
				
			||||||
 | 
					    $66,$48,$0F,$7E,$C0,
 | 
				
			||||||
 | 
					    $0F,$6F,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $0F,$7F,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $0F,$6F,$C1,
 | 
				
			||||||
 | 
					    $48,$0F,$6E,$C0,
 | 
				
			||||||
 | 
					    $48,$0F,$7E,$C0
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tmovd_expected: array[0..43] of byte = (
 | 
				
			||||||
 | 
					    $66,$0F,$6E,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $66,$0F,$7E,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $66,$0F,$6E,$C0,
 | 
				
			||||||
 | 
					    $66,$0F,$7E,$C0,
 | 
				
			||||||
 | 
					    $0F,$6E,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $0F,$7E,$05,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $0F,$6E,$C0,
 | 
				
			||||||
 | 
					    $0F,$7E,$C0
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tcalljump_expected: array[0..31] of byte = (
 | 
				
			||||||
 | 
					    $ff,$15,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $ff,$10,
 | 
				
			||||||
 | 
					    $ff,$25,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $ff,$20,
 | 
				
			||||||
 | 
					    $ff,$1d,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $ff,$18,
 | 
				
			||||||
 | 
					    $ff,$2d,$78,$56,$34,$12,
 | 
				
			||||||
 | 
					    $ff,$28
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure check(const id: string; const expected: array of byte; p: pointer);
 | 
				
			||||||
 | 
					var
 | 
				
			||||||
 | 
					  i : longint;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  for i:=0 to high(expected) do
 | 
				
			||||||
 | 
					    if expected[i]<>pbyte(p)[i] then
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        writeln(id, ' mismatch at offset $',hexstr(i,4), ', expected=$',hexstr(expected[i],2),' actual=$',hexstr(pbyte(p)[i],2));
 | 
				
			||||||
 | 
					        halt(1);
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure TestAll;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  check('generic', test_expected, @test);
 | 
				
			||||||
 | 
					  check('movq', tmovq_expected, @tmovq);
 | 
				
			||||||
 | 
					  check('movd', tmovd_expected, @tmovd);
 | 
				
			||||||
 | 
					  check('calljmp', tcalljump_expected, @tcalljump);
 | 
				
			||||||
 | 
					  writeln('ok');
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
@ -1,325 +1,7 @@
 | 
				
			|||||||
{ %CPU=x86_64 }
 | 
					{ %CPU=x86_64 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// (Almost) every of these instructions use a high register and thus generate REX.
 | 
					{$include tasm2.inc}
 | 
				
			||||||
{$asmmode att}
 | 
					 | 
				
			||||||
procedure test; assembler; nostackframe;
 | 
					 | 
				
			||||||
asm
 | 
					 | 
				
			||||||
    addsubpd  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    addsubps  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    comisd    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    comiss    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    cvtdq2pd  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    cvtpd2dq  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    cvtps2pd  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    cvttps2dq 0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    cvtsi2ss  %eax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2ssl %eax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2ss  %rax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2ssq %rax, %xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtsi2ss  (%rax), %xmm8
 | 
					 | 
				
			||||||
    cvtsi2ssl (%rax), %xmm8
 | 
					 | 
				
			||||||
    cvtsi2ssq (%rax), %xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtsi2sd  %eax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sdl %eax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sd  %rax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sdq %rax, %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sd  (%rax), %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sdl (%rax), %xmm8
 | 
					 | 
				
			||||||
    cvtsi2sdq (%rax), %xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    movdqu    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movdqu    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movdqa    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movdqa    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    haddps    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    haddpd    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movshdup  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movsldup  0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    movhpd    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movhpd    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movhps    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movhps    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movlpd    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movlpd    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    movlps    %xmm8,0x12345678(%rip)
 | 
					 | 
				
			||||||
    movlps    0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pshufhw   $0x90,0x12345678(%rip),%xmm1      { Fixed: unable to determine size }
 | 
					 | 
				
			||||||
    pshuflw   $0x90,0x12345678(%rip),%xmm1
 | 
					 | 
				
			||||||
    punpcklbw 0x12345678(%rip),%mm1
 | 
					 | 
				
			||||||
    punpckldq 0x12345678(%rip),%mm1
 | 
					 | 
				
			||||||
    punpcklwd 0x12345678(%rip),%mm1
 | 
					 | 
				
			||||||
    punpcklbw 0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    punpckldq 0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    punpcklwd 0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    punpcklqdq 0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ucomisd   0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
    ucomiss   0x12345678(%rip),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cmpeqsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    cmpeqss (%rax),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtpi2pd %mm0,%xmm8
 | 
					 | 
				
			||||||
    cvtpi2pd (%rax),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtpi2ps %mm0,%xmm8
 | 
					 | 
				
			||||||
    cvtpi2ps (%rax),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtps2pi (%r8),%mm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtsd2si (%r8),%eax
 | 
					 | 
				
			||||||
    cvtsd2siq (%r8),%rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvttsd2si (%r8),%eax
 | 
					 | 
				
			||||||
    cvttsd2siq (%r8),%rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtsd2ss (%r8),%xmm0
 | 
					 | 
				
			||||||
    cvtss2sd (%r8),%xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvtss2si (%r8),%eax
 | 
					 | 
				
			||||||
    cvtss2siq (%r8),%rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cvttss2si (%r8),%eax
 | 
					 | 
				
			||||||
    cvttss2siq (%r8),%rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    divsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    divss (%rax),%xmm8
 | 
					 | 
				
			||||||
    maxsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    maxss (%rax),%xmm8
 | 
					 | 
				
			||||||
    minss (%rax),%xmm8
 | 
					 | 
				
			||||||
    minss (%rax),%xmm8
 | 
					 | 
				
			||||||
    movntsd %xmm8,(%rax)
 | 
					 | 
				
			||||||
    movntss %xmm8,(%rax)
 | 
					 | 
				
			||||||
    movss (%rax),%xmm8
 | 
					 | 
				
			||||||
    movss %xmm8,(%rax)
 | 
					 | 
				
			||||||
    mulsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    mulss (%rax),%xmm8
 | 
					 | 
				
			||||||
    rcpss (%rax),%xmm8
 | 
					 | 
				
			||||||
    rcpps (%rax),%xmm8
 | 
					 | 
				
			||||||
    roundsd $0,(%rax),%xmm8             { (Fixed) unable to determine size }
 | 
					 | 
				
			||||||
    roundss $0,(%rax),%xmm8
 | 
					 | 
				
			||||||
    rsqrtss (%rax),%xmm8
 | 
					 | 
				
			||||||
    rsqrtps (%rax),%xmm8
 | 
					 | 
				
			||||||
    sqrtsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    sqrtss (%rax),%xmm8
 | 
					 | 
				
			||||||
    sqrtpd (%rax),%xmm8
 | 
					 | 
				
			||||||
    sqrtps (%rax),%xmm8
 | 
					 | 
				
			||||||
    subsd (%rax),%xmm8
 | 
					 | 
				
			||||||
    subss (%rax),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pmovsxbw (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovsxbd (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovsxbq (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovsxwd (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovsxwq (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovsxdq (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxbw (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxbd (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxbq (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxwd (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxwq (%rax),%xmm8
 | 
					 | 
				
			||||||
    pmovzxdq (%rax),%xmm8
 | 
					 | 
				
			||||||
    insertps $0x0,(%rax),%xmm8          { (Fixed) unable to determine size }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    unpckhpd (%rax),%xmm8               { (Fixed) invalid combination of opcode and operands }
 | 
					 | 
				
			||||||
    unpckhps (%rax),%xmm8
 | 
					 | 
				
			||||||
    unpcklpd (%rax),%xmm8
 | 
					 | 
				
			||||||
    unpcklps (%rax),%xmm8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cmpss   $0x10,%xmm7,%xmm6
 | 
					 | 
				
			||||||
    cmpss   $0x10,(%rax),%xmm7          { (Fixed) unable to determine size }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    paddq   %mm1,%mm0
 | 
					 | 
				
			||||||
    paddq   (%rax),%mm0
 | 
					 | 
				
			||||||
    paddq   %xmm1,%xmm0
 | 
					 | 
				
			||||||
    paddq   (%rax),%xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    psubq   %mm1,%mm0
 | 
					 | 
				
			||||||
    psubq   (%rax),%mm0
 | 
					 | 
				
			||||||
    psubq   %xmm1,%xmm0
 | 
					 | 
				
			||||||
    psubq   (%rax),%xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pmuludq  %mm1,%mm0
 | 
					 | 
				
			||||||
    pmuludq  (%rax),%mm0
 | 
					 | 
				
			||||||
    pmuludq  %xmm1,%xmm0
 | 
					 | 
				
			||||||
    pmuludq  (%rax),%xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    addps   (%r8),%xmm0
 | 
					 | 
				
			||||||
    addss   (%r8),%xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pmulhuw (%r8),%xmm0
 | 
					 | 
				
			||||||
    psadbw (%r8), %xmm0
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
procedure tmovd; assembler; nostackframe;
 | 
					 | 
				
			||||||
asm
 | 
					 | 
				
			||||||
    movd  0x12345678(%rip), %xmm0
 | 
					 | 
				
			||||||
    movd  %xmm0, 0x12345678(%rip)
 | 
					 | 
				
			||||||
    movd  %eax, %xmm0
 | 
					 | 
				
			||||||
    movd  %xmm0, %eax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{ same for MMX registers }
 | 
					 | 
				
			||||||
    movd  0x12345678(%rip), %mm0
 | 
					 | 
				
			||||||
    movd  %mm0, 0x12345678(%rip)
 | 
					 | 
				
			||||||
    movd  %eax, %mm0
 | 
					 | 
				
			||||||
    movd  %mm0, %eax
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
procedure tmovq; assembler; nostackframe;
 | 
					 | 
				
			||||||
asm
 | 
					 | 
				
			||||||
    movq  0x12345678(%rip), %xmm0
 | 
					 | 
				
			||||||
    movq  %xmm0, 0x12345678(%rip)
 | 
					 | 
				
			||||||
    movq  %xmm1, %xmm0
 | 
					 | 
				
			||||||
    movq  %rax, %xmm0
 | 
					 | 
				
			||||||
    movq  %xmm0, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{ same for MMX registers }
 | 
					 | 
				
			||||||
    movq  0x12345678(%rip), %mm0
 | 
					 | 
				
			||||||
    movq  %mm0, 0x12345678(%rip)
 | 
					 | 
				
			||||||
    movq  %mm1, %mm0
 | 
					 | 
				
			||||||
    movq  %rax, %mm0
 | 
					 | 
				
			||||||
    movq  %mm0, %rax
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Here are some more tough nuts to crack...
 | 
					 | 
				
			||||||
procedure test2; assembler; nostackframe;
 | 
					 | 
				
			||||||
asm
 | 
					 | 
				
			||||||
//    cmpsd     $0x10,%xmm7,%xmm6         { unrecognized opcode }
 | 
					 | 
				
			||||||
//    cmpsd     $0x10,(%rax),%xmm7
 | 
					 | 
				
			||||||
//    movsd     (%rax),%xmm8              { unrecognized opcode }
 | 
					 | 
				
			||||||
//    movsd     %xmm8,(%rax)
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
procedure tcalljump; assembler; nostackframe;
 | 
					 | 
				
			||||||
asm
 | 
					 | 
				
			||||||
    call   *0x12345678(%rip)
 | 
					 | 
				
			||||||
    call   *(%rax)
 | 
					 | 
				
			||||||
    jmp    *0x12345678(%rip)
 | 
					 | 
				
			||||||
    jmp    *(%rax)
 | 
					 | 
				
			||||||
    lcall  *0x12345678(%rip)
 | 
					 | 
				
			||||||
    lcall  *(%rax)
 | 
					 | 
				
			||||||
    ljmp   *0x12345678(%rip)
 | 
					 | 
				
			||||||
    ljmp   *(%rax)
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const
 | 
					 | 
				
			||||||
  test_expected : array[0..745] of byte = (
 | 
					 | 
				
			||||||
    $66,$44,$0F,$D0,$05,$78,$56,$34,$12, // addsubpd
 | 
					 | 
				
			||||||
    $F2,$44,$0F,$D0,$05,$78,$56,$34,$12, // addsubps
 | 
					 | 
				
			||||||
    $66,$44,$0F,$2F,$05,$78,$56,$34,$12, // comisd
 | 
					 | 
				
			||||||
    $44,$0F,$2F,$05,$78,$56,$34,$12,     // comiss
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$E6,$05,$78,$56,$34,$12, // cvtdq2pd
 | 
					 | 
				
			||||||
    $F2,$44,$0F,$E6,$05,$78,$56,$34,$12, // cvtpd2dq
 | 
					 | 
				
			||||||
    $44,$0F,$5A,$05,$78,$56,$34,$12,     // cvtps2pd
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$5B,$05,$78,$56,$34,$12, // cvttps2dq
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$2A,$C0,                 // cvtsi2ss
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$2A,$C0,                 // cvtsi2ss
 | 
					 | 
				
			||||||
    $F3,$4C,$0F,$2A,$C0,                 // cvtsi2ss
 | 
					 | 
				
			||||||
    $F3,$4C,$0F,$2A,$C0,                 // cvtsi2ss
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$2A,$00,                 // cvtsi2ss  (%rax),%xmm8
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$2A,$00,                 // cvtsi2ssl (%rax),%xmm8
 | 
					 | 
				
			||||||
    $F3,$4C,$0F,$2A,$00,                 // cvtsi2ssq (%rax),%xmm8
 | 
					 | 
				
			||||||
    $F2,$44,$0F,$2A,$C0,$F2,$44,$0F,
 | 
					 | 
				
			||||||
    $2A,$C0,$F2,$4C,$0F,$2A,$C0,$F2,$4C,$0F,$2A,$C0,$F2,$44,$0F,
 | 
					 | 
				
			||||||
    $2A,$00,$F2,$44,$0F,$2A,$00,$F2,$4C,$0F,$2A,$00,$F3,$44,$0F,
 | 
					 | 
				
			||||||
    $7F,$05,$78,$56,$34,$12,$F3,$44,$0F,$6F,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $66,$44,$0F,$7F,$05,$78,$56,$34,$12,$66,$44,$0F,$6F,$05,$78,
 | 
					 | 
				
			||||||
    $56,$34,$12,$F2,$44,$0F,$7C,$05,$78,$56,$34,$12,$66,$44,$0F,
 | 
					 | 
				
			||||||
    $7C,$05,$78,$56,$34,$12,$F3,$44,$0F,$16,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $F3,$44,$0F,$12,$05,$78,$56,$34,$12,$66,$44,$0F,$17,$05,$78,
 | 
					 | 
				
			||||||
    $56,$34,$12,$66,$44,$0F,$16,$05,$78,$56,$34,$12,$44,$0F,$17,
 | 
					 | 
				
			||||||
    $05,$78,$56,$34,$12,$44,$0F,$16,$05,$78,$56,$34,$12,$66,$44,
 | 
					 | 
				
			||||||
    $0F,$13,$05,$78,$56,$34,$12,$66,$44,$0F,$12,$05,$78,$56,$34,
 | 
					 | 
				
			||||||
    $12,$44,$0F,$13,$05,$78,$56,$34,$12,$44,$0F,$12,$05,$78,$56,
 | 
					 | 
				
			||||||
    $34,$12,$F3,$0F,$70,$0D,$78,$56,$34,$12,$90,$F2,$0F,$70,$0D,
 | 
					 | 
				
			||||||
    $78,$56,$34,$12,$90,$0F,$60,$0D,$78,$56,$34,$12,$0F,$62,$0D,
 | 
					 | 
				
			||||||
    $78,$56,$34,$12,$0F,$61,$0D,$78,$56,$34,$12,$66,$44,$0F,$60,
 | 
					 | 
				
			||||||
    $05,$78,$56,$34,$12,$66,$44,$0F,$62,$05,$78,$56,$34,$12,$66,
 | 
					 | 
				
			||||||
    $44,$0F,$61,$05,$78,$56,$34,$12,$66,$44,$0F,$6C,$05,$78,$56,
 | 
					 | 
				
			||||||
    $34,$12,$66,$44,$0F,$2E,$05,$78,$56,$34,$12,$44,$0F,$2E,$05,
 | 
					 | 
				
			||||||
    $78,$56,$34,$12,$F2,$44,$0F,$C2,$00,$00,$F3,$44,$0F,$C2,$00,
 | 
					 | 
				
			||||||
    $00,$66,$44,$0F,$2A,$C0,$66,$44,$0F,$2A,$00,$44,$0F,$2A,$C0,
 | 
					 | 
				
			||||||
    $44,$0F,$2A,$00,$41,$0F,$2D,$00,$F2,$41,$0F,$2D,$00,$F2,$49,
 | 
					 | 
				
			||||||
    $0F,$2D,$00,$F2,$41,$0F,$2C,$00,$F2,$49,$0F,$2C,$00,$F2,$41,
 | 
					 | 
				
			||||||
    $0F,$5A,$00,$F3,$41,$0F,$5A,$00,$F3,$41,$0F,$2D,$00,$F3,$49,
 | 
					 | 
				
			||||||
    $0F,$2D,$00,$F3,$41,$0F,$2C,$00,$F3,$49,$0F,$2C,$00,$F2,$44,
 | 
					 | 
				
			||||||
    $0F,$5E,$00,$F3,$44,$0F,$5E,$00,$F2,$44,$0F,$5F,$00,$F3,$44,
 | 
					 | 
				
			||||||
    $0F,$5F,$00,$F3,$44,$0F,$5D,$00,$F3,$44,$0F,$5D,$00,$F2,$44,
 | 
					 | 
				
			||||||
    $0F,$2B,$00,$F3,$44,$0F,$2B,$00,$F3,$44,$0F,$10,$00,$F3,$44,
 | 
					 | 
				
			||||||
    $0F,$11,$00,$F2,$44,$0F,$59,$00,$F3,$44,$0F,$59,$00,$F3,$44,
 | 
					 | 
				
			||||||
    $0F,$53,$00,$44,$0F,$53,$00,$66,$44,$0F,$3A,$0B,$00,$00,$66,
 | 
					 | 
				
			||||||
    $44,$0F,$3A,$0A,$00,$00,$F3,$44,$0F,$52,$00,$44,$0F,$52,$00,
 | 
					 | 
				
			||||||
    $F2,$44,$0F,$51,$00,$F3,$44,$0F,$51,$00,$66,$44,$0F,$51,$00,
 | 
					 | 
				
			||||||
    $44,$0F,$51,$00,$F2,$44,$0F,$5C,$00,$F3,$44,$0F,$5C,$00,$66,
 | 
					 | 
				
			||||||
    $44,$0F,$38,$20,$00,$66,$44,$0F,$38,$21,$00,$66,$44,$0F,$38,
 | 
					 | 
				
			||||||
    $22,$00,$66,$44,$0F,$38,$23,$00,$66,$44,$0F,$38,$24,$00,$66,
 | 
					 | 
				
			||||||
    $44,$0F,$38,$25,$00,$66,$44,$0F,$38,$30,$00,$66,$44,$0F,$38,
 | 
					 | 
				
			||||||
    $31,$00,$66,$44,$0F,$38,$32,$00,$66,$44,$0F,$38,$33,$00,$66,
 | 
					 | 
				
			||||||
    $44,$0F,$38,$34,$00,$66,$44,$0F,$38,$35,$00,$66,$44,$0F,$3A,
 | 
					 | 
				
			||||||
    $21,$00,$00,$66,$44,$0F,$15,$00,$44,$0F,$15,$00,$66,$44,$0F,
 | 
					 | 
				
			||||||
    $14,$00,$44,$0F,$14,$00,$F3,$0F,$C2,$F7,$10,$F3,$0F,$C2,$38,
 | 
					 | 
				
			||||||
    $10,$0F,$D4,$C1,$0F,$D4,$00,$66,$0F,$D4,$C1,$66,$0F,$D4,$00,
 | 
					 | 
				
			||||||
    $0F,$FB,$C1,$0F,$FB,$00,$66,$0F,$FB,$C1,$66,$0F,$FB,$00,$0F,
 | 
					 | 
				
			||||||
    $F4,$C1,$0F,$F4,$00,$66,$0F,$F4,$C1,$66,$0F,$F4,$00,$41,$0F,
 | 
					 | 
				
			||||||
    $58,$00,$F3,$41,$0F,$58,$00,$66,$41,$0F,$E4,$00,$66,$41,$0F,
 | 
					 | 
				
			||||||
    $F6,$00,$C3);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 tmovq_expected: array[0..54] of byte = (
 | 
					 | 
				
			||||||
    $F3,$0F,$7E,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $66,$0F,$D6,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $F3,$0F,$7E,$C1,
 | 
					 | 
				
			||||||
    $66,$48,$0F,$6E,$C0,
 | 
					 | 
				
			||||||
    $66,$48,$0F,$7E,$C0,
 | 
					 | 
				
			||||||
    $0F,$6F,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $0F,$7F,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $0F,$6F,$C1,
 | 
					 | 
				
			||||||
    $48,$0F,$6E,$C0,
 | 
					 | 
				
			||||||
    $48,$0F,$7E,$C0
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tmovd_expected: array[0..43] of byte = (
 | 
					 | 
				
			||||||
    $66,$0F,$6E,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $66,$0F,$7E,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $66,$0F,$6E,$C0,
 | 
					 | 
				
			||||||
    $66,$0F,$7E,$C0,
 | 
					 | 
				
			||||||
    $0F,$6E,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $0F,$7E,$05,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $0F,$6E,$C0,
 | 
					 | 
				
			||||||
    $0F,$7E,$C0
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tcalljump_expected: array[0..31] of byte = (
 | 
					 | 
				
			||||||
    $ff,$15,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $ff,$10,
 | 
					 | 
				
			||||||
    $ff,$25,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $ff,$20,
 | 
					 | 
				
			||||||
    $ff,$1d,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $ff,$18,
 | 
					 | 
				
			||||||
    $ff,$2d,$78,$56,$34,$12,
 | 
					 | 
				
			||||||
    $ff,$28
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
procedure check(const id: string; const expected: array of byte; p: pointer);
 | 
					 | 
				
			||||||
var
 | 
					 | 
				
			||||||
  i : longint;
 | 
					 | 
				
			||||||
begin
 | 
					 | 
				
			||||||
  for i:=0 to high(expected) do
 | 
					 | 
				
			||||||
    if expected[i]<>pbyte(p)[i] then
 | 
					 | 
				
			||||||
      begin
 | 
					 | 
				
			||||||
        writeln(id, ' mismatch at offset $',hexstr(i,4), ', expected=$',hexstr(expected[i],2),' actual=$',hexstr(pbyte(p)[i],2));
 | 
					 | 
				
			||||||
        halt(1);
 | 
					 | 
				
			||||||
      end;
 | 
					 | 
				
			||||||
end;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  check('generic', test_expected, @test);
 | 
					  TestAll;
 | 
				
			||||||
  check('movq', tmovq_expected, @tmovq);
 | 
					 | 
				
			||||||
  check('movd', tmovd_expected, @tmovd);
 | 
					 | 
				
			||||||
  check('calljmp', tcalljump_expected, @tcalljump);
 | 
					 | 
				
			||||||
  writeln('ok');
 | 
					 | 
				
			||||||
end.
 | 
					end.
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								tests/test/tasm2a.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tests/test/tasm2a.pp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					{ %CPU=x86_64 }
 | 
				
			||||||
 | 
					{ %OPT=-al }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$include tasm2.inc}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  TestAll;
 | 
				
			||||||
 | 
					end.
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user