c - Assembler generates negative forms of conditions, not positive one -
i wondered why gcc assembler use negative form of conditions instead of positive one. suppose have following c code:
if (x == 10) { x ++; } y ++; when use gcc compile , produce object file, result of assembly code in powerpc assembly follows:
20: 2c 00 00 0a cmpwi r0,10 24: 40 82 00 10 bne 34 <main+0x34> 28: 81 3f 00 08 lwz r9,8(r31) 2c: 38 09 00 01 addi r0,r9,1 30: 90 1f 00 08 stw r0,8(r31) 34: 81 3f 00 0c lwz r9,12(r31) 38: 38 09 00 01 addi r0,r9,1 3c: 90 1f 00 0c stw r0,12(r31) the assembly uses bne while used equal == in c code.
edit 1:
i know code working perfectly. means why assembler use negative form not positive one.
edit 2: using compiler level 0 optimizer , know that, not intelligent. means question that, why assembler couldn't produce assembly such below:
cmpi x, 10 beq label1 b label2 label1: add x, x, 1 label2: add y, y, 1 could 1 please explain happens?
thanks in advance.
the reason the negative form simple : branching opposite of if. branching means "skip if", while if means "execute if". so, assembly conditional branching model, if conditions negated translate single branch. if+else, doesn't matter because 2 can swapped, negation preserved.
negating intuitive thing here ; take example :
if (x == 10) { x++; } y++; when "run" code in head, do ? @ condition, , check if true. if is, x++, y++. if isn't, jump directly y++. in other words, jump (branch) y++ if condition false ; intuitively negate condition.
Comments
Post a Comment