This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: md description for intruction that modifies multiple operands
- From: Richard Earnshaw <rearnsha at arm dot com>
- To: fnf at intrinsity dot com
- Cc: Richard dot Earnshaw at arm dot com, echristo at redhat dot com (Eric Christopher), gcc at gcc dot gnu dot org
- Date: Thu, 29 May 2003 18:20:55 +0100
- Subject: Re: md description for intruction that modifies multiple operands
- Organization: ARM Ltd.
- Reply-to: Richard dot Earnshaw at arm dot com
> So two insn matches that insns of the form
Err, I should re-read what I write before I post :-(
Take that as:
So two insn matchers that match insns of the form:
>
> insn_a: (set x (unspec [(y) (z)] 0))
> insn_b: (set a (unspec [(b)] 0))
>
> is not illegal, though it is bad style.
>
Note also that it is regarded as good style now do define constants in the
MD file for unspec operations. Hence on ARM we now have
(define_constants
[(UNSPEC_SIN 0) ; `sin' operation (MODE_FLOAT):
; operand 0 is the result,
; operand 1 the parameter.
(UNPSEC_COS 1) ; `cos' operation (MODE_FLOAT):
; operand 0 is the result,
; operand 1 the parameter.
(UNSPEC_PUSH_MULT 2) ; `push multiple' operation:
; operand 0 is the first register,
; subsequent registers are in parallel (use ...)
; expressions.
(UNSPEC_PIC_SYM 3) ; A symbol that has been treated properly for pic
; usage, that is, we will add the pic_register
; value to it before trying to dereference it.
(UNSPEC_PIC_BASE 4) ; Adding the PC value to the offset to the
; GLOBAL_OFFSET_TABLE. The operation is fully
; described by the RTL but must be wrapped to
; prevent combine from trying to rip it apart.
(UNSPEC_PRLG_STK 5) ; A special barrier that prevents frame accesses
; being scheduled before the stack adjustment
insn.
...
])
Then
(define_insn "pic_load_addr_arm"
[(set (match_operand:SI 0 "s_register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "" "mX")] UNSPEC_PIC_SYM))]
"TARGET_ARM && flag_pic"
"ldr%?\\t%0, %1"
[(set_attr "type" "load")
(set (attr "pool_range") (const_int 4096))
(set (attr "neg_pool_range") (const_int 4084))]
)
This reduces the risk of getting two unspecs that conflict in their
discriminator field.
R.