weening@GANG-OF-FOUR.STANFORD.EDU (Joe Weening) (03/23/89)
I'm trying to figure out why the following program produces the assem-
bly code shown below, in GCC 1.34 on a Sun-2 running Sun OS 4.0.
--------------------------------------------------
Source code:
int i = 4;
int j = -5;
main () {
if (i+j <= 0)
printf ("negative\n");
else printf ("non-negative\n");
}
--------------------------------------------------
Assembly code:
#NO_APP
gcc_compiled.:
.globl _i
.data
.even
_i:
.long 4
.globl _j
.even
_j:
.long -5
.text
LC0:
.ascii "negative\12\0"
LC1:
.ascii "non-negative\12\0"
.even
.globl _main
_main:
link a6,#0
movel _i,d0
addl _j,d0
tstl d0
jgt L2
pea LC0
jra L4
L2:
pea LC1
L4:
jbsr _printf
unlk a6
rts
--------------------------------------------------
The "tstl" instruction after the "addl" doesn't seem to be necessary,
because the addl will set the condition codes.
The above example arose as I was trying to answer a different
question, which is how m68k.md can get away with giving OUTPUT_JUMP a
third argument of 0 in patterns such as:
(define_insn "bgt"
[(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
#ifdef MOTOROLA
OUTPUT_JUMP (\"jbgt %l0\", \"fbgt %l0\", 0);
#else
OUTPUT_JUMP (\"jgt %l0\", \"fjgt %l0\", 0);
#endif
")
Isn't the third argument sometimes going to be used?