https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61577
--- Comment #221 from John Buddery <jvb at cyberscience dot com> --- Thanks - that is neater, as it avoids the need to change the calls in ia64.c, which gets messy. The simplest variant I have is: (define_insn "call_nogp" [(call (mem:DI (match_operand:DI 0 "call_operand" "?b,s")) (const_int 0)) (clobber (match_operand:DI 1 "register_operand" "=b,b"))] "" { if (TARGET_HPUX && which_alternative == 1 ) return "brl.call%+.many %1 = %0"; else return "br.call%+.many %1 = %0"; } [(set_attr "itanium_class" "br,scall")]) but I need to work out how to vary the attribute, as you were right: scall maps to a "B" type attribute, but brl is an L+X instruction not a pure B unit instruction, so I think it should be type "L". Looks like cond and match-test are valid for attributes, so it should be possible to get this right.