{ %CPU=x86_64 }
{$mode objfpc}{$asmmode att}

// Test correct assembling of cmov instructions
// they should receive condition and size separately,
// iow cmovbq should not be processed as cmov+bq

function test: Pointer; assembler; nostackframe;
asm
    jmp    .L3
.L1:
    cmovbq   %rcx,%rax     // 48 0f 42 c1
    cmovbl   %ecx,%eax     // 0f 42 c1
    cmovbw   %cx,%ax       // 66 0f 42 c1
    cmovlq   %rcx,%rax     // 48 0f 4c c1
.L3:
    lea    .L1(%rip), %rax
end;

var
  x: PByte;

begin
  x := test;
  if (x[0]<>$48) or (x[1]<>$0F) or (x[2]<>$42) or (x[3]<>$C1) then
    Halt(1);
  Inc(x,4);
  if (x[0]<>$0F) or (x[1]<>$42) or (x[2]<>$C1) then
    Halt(2);
  Inc(x,3);
  if (x[0]<>$66) or (x[1]<>$0F) or (x[2]<>$42) or (x[3]<>$C1) then
    Halt(3);
  Inc(x,4);
  if (x[0]<>$48) or (x[1]<>$0F) or (x[2]<>$4C) or (x[3]<>$C1) then
    Halt(4);
end.