On Wed, 27 Jun 2007 08:17:47 +0200, "Paolo Bonzini" <[EMAIL PROTECTED]> said: > > > if (get_attr_cirrus (prev_active_insn(insn)) == CIRRUS_COMPARE) > > return \"beq\\t%l0\;bvs\\t%l0\"; else return \"bge\\t%l0\;nop\"; > > " > > [(set_attr "conds" "jump_clob") > > (set_attr "length" "8")] > > ) > > > > As you can see, I need to replace all bge with a maverick crunch > > equivalent. However, "bge" is still also used with integer comparisons, > > e.g: > > I think you should generate the compare using a different mode for the > CC register (like cc:CCMAV) and then use two patterns: > > ; Special pattern to match GE for MAVERICK. Most restrictive > ; pattern goes first. > (define_insn "*arm_cirrus_bge" > [(set (pc) > (if_then_else (ge (match_operand:CCMAV 1 "cc_register" "") (const_int > 0)) > (label_ref (match_operand 0 "" "")) > (pc)))] > "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" > "beq\\t%l0\;bvs\\t%l0\" > [(set_attr "conds" "jump_clob") > (set_attr "length" "8")] > ) > > ; Special pattern to match GE for ARM. > (define_insn "*arm_bge" > [(set (pc) > (if_then_else (ge (match_operand 1 "cc_register" "") (const_int 0)) > (label_ref (match_operand 0 "" "")) > (pc)))] > "TARGET_ARM && TARGET_HARD_FLOAT" > "bge\\t%l0\" > [(set_attr "conds" "jump_clob") > (set_attr "length" "4")] > )
Yep, this will work. Floating point comparisons are already done in CCFP mode, so I have used that. NB, I already tried this earlier, but I think most of my problem comes from conditional execution ... I tried changing: (define_cond_exec [(match_operator 0 "arm_comparison_operator" [(match_operand 1 "cc_register" "") (const_int 0)])] "TARGET_ARM" "" ) to: (define_cond_exec [(match_operator 0 "maverick_comparison_operator" [(match_operand:CCFP 1 "cc_register" "") (const_int 0)])] "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" "" ) (define_cond_exec [(match_operator 0 "arm_comparison_operator" [(match_operand 1 "cc_register" "") (const_int 0)])] "TARGET_ARM" "" ) But I think I also need to modify or add to all the other scc and / ior etc lines, since I think combining scc's / condexecs doesn't work correctly. I think the if the above define_cond_exec is still there, then gcc thinks it can optimize all ge execution, and so optimises the above output from arm_bge, and deletes the label. I rebuilt gcc with all conditional execution disabled to see if it would work. I did this by commenting out any line referencing arm_comparison_operator or define_cond_exec. However, when I compile a c++ program, the compiler still can't generate the label again, and it fails with: internal compiler error: output_operand: '%l' operand isn't a label then of course the assembler fails with: undefined local label NB, I shouldn't need the second arm_bge as it should be handled by the code in arm_condition_code, for non MAVERICK and Maverick non-floating point. I've also disabled DImode on Maverick, since it is only signed or unsigned, and not both at the same time. I think it will also cause similar comparison-based problems too. Incidentally, is it possible to do something like: (if_then_else (ge (match_operand:CCFP,CCDI 1 "cc_register" "") (const_int 0)) And can someone explain what is the difference between these two lines: if_then_else (ge (match_operand:CCFP 1 "cc_register" "") (const_int 0)) if_then_else (ge:CCFP (match_operand 1 "cc_register" "") (const_int 0)) Is the second line still valid syntax?