Translation of Relations
Consider translation of <,=, < = ,>,>=,=,!= on integers
Operations of type
Note: there are no instructions that take two integers from stack and leave the result of comparison on stack
There are conditional branches for comparison of two stack operands:
- in general called if_icmpCOND for different 'COND'
Compilation scheme
- assuming translations compute results on top of the stack
What should be the compiled code?
[[ e1 COND e2 ]] = [[ e1 ]] [[ e2 ]] if_icmpCOND nTrue bipush 0 goto nAfter nTrue: bipush 1 nAfter:
Example
static boolean test(int x, int y) { return (x < y); }
Bytecode:
static boolean test(int, int); Code: 0: iload_0 1: iload_1 2: if_icmpge 9 5: iconst_1 6: goto 10 9: iconst_0 10: ireturn
Note:
- iconst is a shorter form for bipush
- the code above uses the dual branch and swaps constants true and false