Index: config/arm/types.md =================================================================== --- config/arm/types.md (revision 0) +++ config/arm/types.md (revision 0) @@ -0,0 +1,354 @@ +;; Instruction Classification for ARM for GNU compiler. + +;; Copyright (C) 1991-2013 Free Software Foundation, Inc. +;; Contributed by ARM Ltd. + +;; This file is part of GCC. + +;; GCC is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published +;; by the Free Software Foundation; either version 3, or (at your +;; option) any later version. + +;; GCC is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +;; License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GCC; see the file COPYING3. If not see +;; . + +; TYPE attribute is used to classify instructions for use in scheduling. +; +; Instruction classification: +; +; arlo_imm any arithmetic or logical instruction that doesn't have +; a shifted operand and has an immediate operand. This +; excludes MOV, MVN and RSB(S) immediate. +; arlo_reg any arithmetic or logical instruction that doesn't have +; a shifted or an immediate operand. This excludes +; MOV and MVN but includes MOVT. This is also the default. +; arlo_shift any arithmetic or logical instruction that has a source +; operand shifted by a constant. This excludes +; simple shifts. +; arlo_shift_reg as arlo_shift, with the shift amount specified in a +; register. +; block blockage insn, this blocks all functional units. +; branch branch. +; call subroutine call. +; clz count leading zeros (CLZ). +; extend extend instruction (SXTB, SXTH, UXTB, UXTH). +; f_2_r transfer from float to core (no memory needed). +; f_cvt conversion between float and integral. +; f_flag transfer of co-processor flags to the CPSR. +; f_load[d,s] double/single load from memory. Used for VFP unit. +; f_minmax[d,s] double/single floating point minimum/maximum. +; f_rint[d,s] double/single floating point rount to integral. +; f_sel[d,s] double/single floating byte select. +; f_store[d,s] double/single store to memory. Used for VFP unit. +; fadd[d,s] double/single floating-point scalar addition. +; fcmp[d,s] double/single floating-point compare. +; fconst[d,s] double/single load immediate. +; fcpys single precision floating point cpy. +; fdiv[d,s] double/single precision floating point division. +; ffarith[d,s] double/single floating point abs/neg/cpy. +; ffma[d,s] double/single floating point fused multiply-accumulate. +; float floating point arithmetic operation. +; fmac[d,s] double/single floating point multiply-accumulate. +; fmul[d,s] double/single floating point multiply. +; load_byte load byte(s) from memory to arm registers. +; load1 load 1 word from memory to arm registers. +; load2 load 2 words from memory to arm registers. +; load3 load 3 words from memory to arm registers. +; load4 load 4 words from memory to arm registers. +; mla integer multiply accumulate. +; mlas integer multiply accumulate, flag setting. +; mov_imm simple MOV instruction that moves an immediate to +; register. This includes MOVW, but not MOVT. +; mov_reg simple MOV instruction that moves a register to another +; register. This includes MOVW, but not MOVT. +; mov_shift simple MOV instruction, shifted operand by a constant. +; mov_shift_reg simple MOV instruction, shifted operand by a register. +; mul integer multiply. +; muls integer multiply, flag setting. +; mvn_imm inverting move instruction, immediate. +; mvn_reg inverting move instruction, register. +; mvn_shift inverting move instruction, shifted operand by a constant. +; mvn_shift_reg inverting move instruction, shifted operand by a register. +; r_2_f transfer from core to float. +; sdiv signed division. +; shift simple shift operation (LSL, LSR, ASR, ROR) with an +; immediate. +; shift_reg simple shift by a register. +; smlad signed multiply accumulate dual. +; smladx signed multiply accumulate dual reverse. +; smlal signed multiply accumulate long. +; smlald signed multiply accumulate long dual. +; smlals signed multiply accumulate long, flag setting. +; smlalxy signed multiply accumulate, 16x16-bit, 64-bit accumulate. +; smlawx signed multiply accumulate, 32x16-bit, 32-bit accumulate. +; smlawy signed multiply accumulate wide, 32x16-bit, +; 32-bit accumulate. +; smlaxy signed multiply accumulate, 16x16-bit, 32-bit accumulate. +; smlsd signed multiply subtract dual. +; smlsdx signed multiply subtract dual reverse. +; smlsld signed multiply subtract long dual. +; smmla signed most significant word multiply accumulate. +; smmul signed most significant word multiply. +; smmulr signed most significant word multiply, rounded. +; smuad signed dual multiply add. +; smuadx signed dual multiply add reverse. +; smull signed multiply long. +; smulls signed multiply long, flag setting. +; smulwy signed multiply wide, 32x16-bit, 32-bit accumulate. +; smulxy signed multiply, 16x16-bit, 32-bit accumulate. +; smusd signed dual multiply subtract. +; smusdx signed dual multiply subtract reverse. +; store1 store 1 word to memory from arm registers. +; store2 store 2 words to memory from arm registers. +; store3 store 3 words to memory from arm registers. +; store4 store 4 (or more) words to memory from arm registers. +; udiv unsigned division. +; umaal unsigned multiply accumulate accumulate long. +; umlal unsigned multiply accumulate long. +; umlals unsigned multiply accumulate long, flag setting. +; umull unsigned multiply long. +; umulls unsigned multiply long, flag setting. +; +; The classification below is for instructions used by the Wireless MMX +; Technology. Each attribute value is used to classify an instruction of the +; same name or family. +; +; wmmx_tandc +; wmmx_tbcst +; wmmx_textrc +; wmmx_textrm +; wmmx_tinsr +; wmmx_tmcr +; wmmx_tmcrr +; wmmx_tmia +; wmmx_tmiaph +; wmmx_tmiaxy +; wmmx_tmrc +; wmmx_tmrrc +; wmmx_tmovmsk +; wmmx_torc +; wmmx_torvsc +; wmmx_wabs +; wmmx_wdiff +; wmmx_wacc +; wmmx_wadd +; wmmx_waddbhus +; wmmx_waddsubhx +; wmmx_waligni +; wmmx_walignr +; wmmx_wand +; wmmx_wandn +; wmmx_wavg2 +; wmmx_wavg4 +; wmmx_wcmpeq +; wmmx_wcmpgt +; wmmx_wmac +; wmmx_wmadd +; wmmx_wmax +; wmmx_wmerge +; wmmx_wmiawxy +; wmmx_wmiaxy +; wmmx_wmin +; wmmx_wmov +; wmmx_wmul +; wmmx_wmulw +; wmmx_wldr +; wmmx_wor +; wmmx_wpack +; wmmx_wqmiaxy +; wmmx_wqmulm +; wmmx_wqmulwm +; wmmx_wror +; wmmx_wsad +; wmmx_wshufh +; wmmx_wsll +; wmmx_wsra +; wmmx_wsrl +; wmmx_wstr +; wmmx_wsub +; wmmx_wsubaddhx +; wmmx_wunpckeh +; wmmx_wunpckel +; wmmx_wunpckih +; wmmx_wunpckil +; wmmx_wxor + +(define_attr "type" + "arlo_imm,\ + arlo_reg,\ + arlo_shift,\ + arlo_shift_reg,\ + block,\ + branch,\ + call,\ + clz,\ + extend,\ + f_2_r,\ + f_cvt,\ + f_flag,\ + f_loadd,\ + f_loads,\ + f_minmaxd,\ + f_minmaxs,\ + f_rintd,\ + f_rints,\ + f_seld,\ + f_sels,\ + f_stored,\ + f_stores,\ + faddd,\ + fadds,\ + fcmpd,\ + fcmps,\ + fconstd,\ + fconsts,\ + fcpys,\ + fdivd,\ + fdivs,\ + ffarithd,\ + ffariths,\ + ffmad,\ + ffmas,\ + float,\ + fmacd,\ + fmacs,\ + fmuld,\ + fmuls,\ + load_byte,\ + load1,\ + load2,\ + load3,\ + load4,\ + mla,\ + mlas,\ + mov_imm,\ + mov_reg,\ + mov_shift,\ + mov_shift_reg,\ + mul,\ + muls,\ + mvn_imm,\ + mvn_reg,\ + mvn_shift,\ + mvn_shift_reg,\ + r_2_f,\ + sdiv,\ + shift,\ + shift_reg,\ + smlad,\ + smladx,\ + smlal,\ + smlald,\ + smlals,\ + smlalxy,\ + smlawx,\ + smlawy,\ + smlaxy,\ + smlsd,\ + smlsdx,\ + smlsld,\ + smmla,\ + smmul,\ + smmulr,\ + smuad,\ + smuadx,\ + smull,\ + smulls,\ + smulwy,\ + smulxy,\ + smusd,\ + smusdx,\ + store1,\ + store2,\ + store3,\ + store4,\ + udiv,\ + umaal,\ + umlal,\ + umlals,\ + umull,\ + umulls,\ + wmmx_tandc,\ + wmmx_tbcst,\ + wmmx_textrc,\ + wmmx_textrm,\ + wmmx_tinsr,\ + wmmx_tmcr,\ + wmmx_tmcrr,\ + wmmx_tmia,\ + wmmx_tmiaph,\ + wmmx_tmiaxy,\ + wmmx_tmrc,\ + wmmx_tmrrc,\ + wmmx_tmovmsk,\ + wmmx_torc,\ + wmmx_torvsc,\ + wmmx_wabs,\ + wmmx_wabsdiff,\ + wmmx_wacc,\ + wmmx_wadd,\ + wmmx_waddbhus,\ + wmmx_waddsubhx,\ + wmmx_waligni,\ + wmmx_walignr,\ + wmmx_wand,\ + wmmx_wandn,\ + wmmx_wavg2,\ + wmmx_wavg4,\ + wmmx_wcmpeq,\ + wmmx_wcmpgt,\ + wmmx_wmac,\ + wmmx_wmadd,\ + wmmx_wmax,\ + wmmx_wmerge,\ + wmmx_wmiawxy,\ + wmmx_wmiaxy,\ + wmmx_wmin,\ + wmmx_wmov,\ + wmmx_wmul,\ + wmmx_wmulw,\ + wmmx_wldr,\ + wmmx_wor,\ + wmmx_wpack,\ + wmmx_wqmiaxy,\ + wmmx_wqmulm,\ + wmmx_wqmulwm,\ + wmmx_wror,\ + wmmx_wsad,\ + wmmx_wshufh,\ + wmmx_wsll,\ + wmmx_wsra,\ + wmmx_wsrl,\ + wmmx_wstr,\ + wmmx_wsub,\ + wmmx_wsubaddhx,\ + wmmx_wunpckeh,\ + wmmx_wunpckel,\ + wmmx_wunpckih,\ + wmmx_wunpckil,\ + wmmx_wxor" + (const_string "arlo_reg")) + +; Is this an (integer side) multiply with a 32-bit (or smaller) result? +(define_attr "mul32" "no,yes" + (if_then_else + (eq_attr "type" + "smulxy,smlaxy,smulwy,smlawx,mul,muls,mla,mlas,smlawy,smuad,smuadx,\ + smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,smlald,smlsld") + (const_string "yes") + (const_string "no"))) + +; Is this an (integer side) multiply with a 64-bit result? +(define_attr "mul64" "no,yes" + (if_then_else + (eq_attr "type" + "smlalxy,umull,umulls,umaal,umlal,umlals,smull,smulls,smlal,smlals") + (const_string "yes") + (const_string "no"))) Index: config/arm/arm.md =================================================================== --- config/arm/arm.md (revision 201372) +++ config/arm/arm.md (working copy) @@ -245,339 +245,8 @@ (set_attr "length" "4") (set_attr "pool_range" "250")]) -; TYPE attribute is used to classify instructions for use in scheduling. -; -; Instruction classification: -; -; arlo_imm any arithmetic or logical instruction that doesn't have -; a shifted operand and has an immediate operand. This -; excludes MOV, MVN and RSB(S) immediate. -; arlo_reg any arithmetic or logical instruction that doesn't have -; a shifted or an immediate operand. This excludes -; MOV and MVN but includes MOVT. This is also the default. -; arlo_shift any arithmetic or logical instruction that has a source -; operand shifted by a constant. This excludes -; simple shifts. -; arlo_shift_reg as arlo_shift, with the shift amount specified in a -; register. -; block blockage insn, this blocks all functional units. -; branch branch. -; call subroutine call. -; clz count leading zeros (CLZ). -; extend extend instruction (SXTB, SXTH, UXTB, UXTH). -; f_2_r transfer from float to core (no memory needed). -; f_cvt conversion between float and integral. -; f_flag transfer of co-processor flags to the CPSR. -; f_load[d,s] double/single load from memory. Used for VFP unit. -; f_minmax[d,s] double/single floating point minimum/maximum. -; f_rint[d,s] double/single floating point rount to integral. -; f_sel[d,s] double/single floating byte select. -; f_store[d,s] double/single store to memory. Used for VFP unit. -; fadd[d,s] double/single floating-point scalar addition. -; fcmp[d,s] double/single floating-point compare. -; fconst[d,s] double/single load immediate. -; fcpys single precision floating point cpy. -; fdiv[d,s] double/single precision floating point division. -; ffarith[d,s] double/single floating point abs/neg/cpy. -; ffma[d,s] double/single floating point fused multiply-accumulate. -; float floating point arithmetic operation. -; fmac[d,s] double/single floating point multiply-accumulate. -; fmul[d,s] double/single floating point multiply. -; load_byte load byte(s) from memory to arm registers. -; load1 load 1 word from memory to arm registers. -; load2 load 2 words from memory to arm registers. -; load3 load 3 words from memory to arm registers. -; load4 load 4 words from memory to arm registers. -; mla integer multiply accumulate. -; mlas integer multiply accumulate, flag setting. -; mov_imm simple MOV instruction that moves an immediate to -; register. This includes MOVW, but not MOVT. -; mov_reg simple MOV instruction that moves a register to another -; register. This includes MOVW, but not MOVT. -; mov_shift simple MOV instruction, shifted operand by a constant. -; mov_shift_reg simple MOV instruction, shifted operand by a register. -; mul integer multiply. -; muls integer multiply, flag setting. -; mvn_imm inverting move instruction, immediate. -; mvn_reg inverting move instruction, register. -; mvn_shift inverting move instruction, shifted operand by a constant. -; mvn_shift_reg inverting move instruction, shifted operand by a register. -; r_2_f transfer from core to float. -; sdiv signed division. -; shift simple shift operation (LSL, LSR, ASR, ROR) with an -; immediate. -; shift_reg simple shift by a register. -; smlad signed multiply accumulate dual. -; smladx signed multiply accumulate dual reverse. -; smlal signed multiply accumulate long. -; smlald signed multiply accumulate long dual. -; smlals signed multiply accumulate long, flag setting. -; smlalxy signed multiply accumulate, 16x16-bit, 64-bit accumulate. -; smlawx signed multiply accumulate, 32x16-bit, 32-bit accumulate. -; smlawy signed multiply accumulate wide, 32x16-bit, -; 32-bit accumulate. -; smlaxy signed multiply accumulate, 16x16-bit, 32-bit accumulate. -; smlsd signed multiply subtract dual. -; smlsdx signed multiply subtract dual reverse. -; smlsld signed multiply subtract long dual. -; smmla signed most significant word multiply accumulate. -; smmul signed most significant word multiply. -; smmulr signed most significant word multiply, rounded. -; smuad signed dual multiply add. -; smuadx signed dual multiply add reverse. -; smull signed multiply long. -; smulls signed multiply long, flag setting. -; smulwy signed multiply wide, 32x16-bit, 32-bit accumulate. -; smulxy signed multiply, 16x16-bit, 32-bit accumulate. -; smusd signed dual multiply subtract. -; smusdx signed dual multiply subtract reverse. -; store1 store 1 word to memory from arm registers. -; store2 store 2 words to memory from arm registers. -; store3 store 3 words to memory from arm registers. -; store4 store 4 (or more) words to memory from arm registers. -; udiv unsigned division. -; umaal unsigned multiply accumulate accumulate long. -; umlal unsigned multiply accumulate long. -; umlals unsigned multiply accumulate long, flag setting. -; umull unsigned multiply long. -; umulls unsigned multiply long, flag setting. -; -; The classification below is for instructions used by the Wireless MMX -; Technology. Each attribute value is used to classify an instruction of the -; same name or family. -; -; wmmx_tandc -; wmmx_tbcst -; wmmx_textrc -; wmmx_textrm -; wmmx_tinsr -; wmmx_tmcr -; wmmx_tmcrr -; wmmx_tmia -; wmmx_tmiaph -; wmmx_tmiaxy -; wmmx_tmrc -; wmmx_tmrrc -; wmmx_tmovmsk -; wmmx_torc -; wmmx_torvsc -; wmmx_wabs -; wmmx_wdiff -; wmmx_wacc -; wmmx_wadd -; wmmx_waddbhus -; wmmx_waddsubhx -; wmmx_waligni -; wmmx_walignr -; wmmx_wand -; wmmx_wandn -; wmmx_wavg2 -; wmmx_wavg4 -; wmmx_wcmpeq -; wmmx_wcmpgt -; wmmx_wmac -; wmmx_wmadd -; wmmx_wmax -; wmmx_wmerge -; wmmx_wmiawxy -; wmmx_wmiaxy -; wmmx_wmin -; wmmx_wmov -; wmmx_wmul -; wmmx_wmulw -; wmmx_wldr -; wmmx_wor -; wmmx_wpack -; wmmx_wqmiaxy -; wmmx_wqmulm -; wmmx_wqmulwm -; wmmx_wror -; wmmx_wsad -; wmmx_wshufh -; wmmx_wsll -; wmmx_wsra -; wmmx_wsrl -; wmmx_wstr -; wmmx_wsub -; wmmx_wsubaddhx -; wmmx_wunpckeh -; wmmx_wunpckel -; wmmx_wunpckih -; wmmx_wunpckil -; wmmx_wxor - -(define_attr "type" - "arlo_imm,\ - arlo_reg,\ - arlo_shift,\ - arlo_shift_reg,\ - block,\ - branch,\ - call,\ - clz,\ - extend,\ - f_2_r,\ - f_cvt,\ - f_flag,\ - f_loadd,\ - f_loads,\ - f_minmaxd,\ - f_minmaxs,\ - f_rintd,\ - f_rints,\ - f_seld,\ - f_sels,\ - f_stored,\ - f_stores,\ - faddd,\ - fadds,\ - fcmpd,\ - fcmps,\ - fconstd,\ - fconsts,\ - fcpys,\ - fdivd,\ - fdivs,\ - ffarithd,\ - ffariths,\ - ffmad,\ - ffmas,\ - float,\ - fmacd,\ - fmacs,\ - fmuld,\ - fmuls,\ - load_byte,\ - load1,\ - load2,\ - load3,\ - load4,\ - mla,\ - mlas,\ - mov_imm,\ - mov_reg,\ - mov_shift,\ - mov_shift_reg,\ - mul,\ - muls,\ - mvn_imm,\ - mvn_reg,\ - mvn_shift,\ - mvn_shift_reg,\ - r_2_f,\ - sdiv,\ - shift,\ - shift_reg,\ - smlad,\ - smladx,\ - smlal,\ - smlald,\ - smlals,\ - smlalxy,\ - smlawx,\ - smlawy,\ - smlaxy,\ - smlsd,\ - smlsdx,\ - smlsld,\ - smmla,\ - smmul,\ - smmulr,\ - smuad,\ - smuadx,\ - smull,\ - smulls,\ - smulwy,\ - smulxy,\ - smusd,\ - smusdx,\ - store1,\ - store2,\ - store3,\ - store4,\ - udiv,\ - umaal,\ - umlal,\ - umlals,\ - umull,\ - umulls,\ - wmmx_tandc,\ - wmmx_tbcst,\ - wmmx_textrc,\ - wmmx_textrm,\ - wmmx_tinsr,\ - wmmx_tmcr,\ - wmmx_tmcrr,\ - wmmx_tmia,\ - wmmx_tmiaph,\ - wmmx_tmiaxy,\ - wmmx_tmrc,\ - wmmx_tmrrc,\ - wmmx_tmovmsk,\ - wmmx_torc,\ - wmmx_torvsc,\ - wmmx_wabs,\ - wmmx_wabsdiff,\ - wmmx_wacc,\ - wmmx_wadd,\ - wmmx_waddbhus,\ - wmmx_waddsubhx,\ - wmmx_waligni,\ - wmmx_walignr,\ - wmmx_wand,\ - wmmx_wandn,\ - wmmx_wavg2,\ - wmmx_wavg4,\ - wmmx_wcmpeq,\ - wmmx_wcmpgt,\ - wmmx_wmac,\ - wmmx_wmadd,\ - wmmx_wmax,\ - wmmx_wmerge,\ - wmmx_wmiawxy,\ - wmmx_wmiaxy,\ - wmmx_wmin,\ - wmmx_wmov,\ - wmmx_wmul,\ - wmmx_wmulw,\ - wmmx_wldr,\ - wmmx_wor,\ - wmmx_wpack,\ - wmmx_wqmiaxy,\ - wmmx_wqmulm,\ - wmmx_wqmulwm,\ - wmmx_wror,\ - wmmx_wsad,\ - wmmx_wshufh,\ - wmmx_wsll,\ - wmmx_wsra,\ - wmmx_wsrl,\ - wmmx_wstr,\ - wmmx_wsub,\ - wmmx_wsubaddhx,\ - wmmx_wunpckeh,\ - wmmx_wunpckel,\ - wmmx_wunpckih,\ - wmmx_wunpckil,\ - wmmx_wxor" - (const_string "arlo_reg")) - -; Is this an (integer side) multiply with a 32-bit (or smaller) result? -(define_attr "mul32" "no,yes" - (if_then_else - (eq_attr "type" - "smulxy,smlaxy,smulwy,smlawx,mul,muls,mla,mlas,smlawy,smuad,smuadx,\ - smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,smlald,smlsld") - (const_string "yes") - (const_string "no"))) - -; Is this an (integer side) multiply with a 64-bit result? -(define_attr "mul64" "no,yes" - (if_then_else - (eq_attr "type" - "smlalxy,umull,umulls,umaal,umlal,umlals,smull,smulls,smlal,smlals") - (const_string "yes") - (const_string "no"))) +;; Instruction classification types +(include "types.md") ; Load scheduling, set from the arm_ld_sched variable ; initialized by arm_option_override()