Questions tagged [conditional-move]

8 questions
23
votes
4 answers

Purpose of cmove instruction in x86 assembly?

When disassembling an executable I encountered the cmove instruction. I've already searched on the Internet but I've only found that it's a conditional move, and if the source and destination are equal a mov occurs. What I don't understand yet is…
maluz
  • 265
  • 1
  • 3
  • 10
7
votes
2 answers

Hard to debug SEGV due to skipped cmov from out-of-bounds memory

I'm trying to code a few high-performance assembly functions as an exercise, and have encountered a weird segfault that happens when running the program, but not in valgrind or nemiver. Basically a cmov that shouldn't be run, with an out-of-bound…
Lou Garczynski
  • 624
  • 3
  • 10
6
votes
2 answers

Conditional move (cmov) for AVX vector registers based on scalar integer condition?

For 64-bit registers, there is the CMOVcc A, B instruction, that only writes B to A if condition cc is satisfied: ; Do rax <- rdx iff rcx == 0 test rcx, rcx cmove rax, rdx However, I wasn't able to find anything equivalent for AVX. I still want to…
janw
  • 8,758
  • 11
  • 40
  • 62
5
votes
1 answer

In assembly, should branchless code use complementary CMOVs?

It's well known that we can use the CMOV instruction to write branchless code, but I was wondering if I'm writing the equivalent of x = cond ? 1 : 2, should I prefer CMOVE rax, 1 #1a CMOVNE rax, 2 #1b or MOV rax, 1 #2a CMOVNE rax, 2 …
Daniel
  • 2,869
  • 4
  • 26
  • 28
5
votes
1 answer

Why does x86 only have 1 form of conditional move, not immediate or 8-bit?

I've noticed that the Conditional Move instruction is less extensible than the normal mov. For example, it doesn't support immediates and doesn't support the low-byte of a register. Out of curiosity, why is the Cmov command much more restrictive…
David542
  • 104,438
  • 178
  • 489
  • 842
4
votes
1 answer

RISCV branchless coding

On Intel AVX, there is a possibility of branchless code. Instead of branching for case0 or case1, you can compute both cases, and blend the results based on a condition. AVX does this 8 way for float using the vblendps instruction. You can also do…
Bram
  • 7,440
  • 3
  • 52
  • 94
3
votes
1 answer

Conditional move zero into register?

Is there a way to conditional move a zero into a register in assembly? I'm trying to do cmpb %r9b, %r8b #compare r9 and r8 cmovgq $0, %rcx #If r8>r9, move zero to rcx But the compiler is complaining about "operand type mismatch for cmovg" due to…
Tony S
  • 35
  • 4
-1
votes
1 answer

How to force compiler to generate conditional move by using inline assembly

I've spent several hours trying to convert the following code to inline assembly (GCC) but in vain: int new_low = mid + 1; int new_high = mid - 1; if (middle < key) { low = new_low; } if (!(middle < key)) { high = new_high; } I want the…
Bogi
  • 2,274
  • 5
  • 26
  • 34