Commit 2feae6cd by Monk Chiang Committed by Chung-Ju Wu

[NDS32] Add intrinsic functions for particular instructions.

gcc/
	* config/nds32/constants.md (unspec_element, unspec_volatile_element):
	Add enum values for particular instructions.
	* config/nds32/nds32-intrinsic.c: Implementation of expanding
	particular intrinsic functions.
	* config/nds32/nds32-intrinsic.md: Likewise.
	* config/nds32/nds32_intrinsic.h: Likewise.
	* config/nds32/nds32.h (nds32_builtins): Likewise.
	* config/nds32/nds32.md (type): Add pbsad and pbsada.
	(btst, ave): New patterns for particular instructions.

From-SVN: r259208
parent 154e3ea6
2018-04-07 Monk Chiang <sh.chiang04@gmail.com> 2018-04-07 Monk Chiang <sh.chiang04@gmail.com>
* config/nds32/constants.md (unspec_element, unspec_volatile_element): * config/nds32/constants.md (unspec_element, unspec_volatile_element):
Add enum values for particular instructions.
* config/nds32/nds32-intrinsic.c: Implementation of expanding
particular intrinsic functions.
* config/nds32/nds32-intrinsic.md: Likewise.
* config/nds32/nds32_intrinsic.h: Likewise.
* config/nds32/nds32.h (nds32_builtins): Likewise.
* config/nds32/nds32.md (type): Add pbsad and pbsada.
(btst, ave): New patterns for particular instructions.
2018-04-07 Monk Chiang <sh.chiang04@gmail.com>
* config/nds32/constants.md (unspec_element, unspec_volatile_element):
Add enum values for atomic load/store and memory sync. Add enum values for atomic load/store and memory sync.
* config/nds32/nds32-intrinsic.c: Implementation for atomic load/store * config/nds32/nds32-intrinsic.c: Implementation for atomic load/store
and memory sync. and memory sync.
......
...@@ -37,9 +37,21 @@ ...@@ -37,9 +37,21 @@
UNSPEC_FCPYNSS UNSPEC_FCPYNSS
UNSPEC_FCPYSD UNSPEC_FCPYSD
UNSPEC_FCPYSS UNSPEC_FCPYSS
UNSPEC_CLIP
UNSPEC_CLIPS
UNSPEC_CLO
UNSPEC_PBSAD
UNSPEC_PBSADA
UNSPEC_BSE
UNSPEC_BSE_2
UNSPEC_BSP
UNSPEC_BSP_2
UNSPEC_FFB UNSPEC_FFB
UNSPEC_FFMISM UNSPEC_FFMISM
UNSPEC_FLMISM UNSPEC_FLMISM
UNSPEC_SVA
UNSPEC_SVS
UNSPEC_WSBH
UNSPEC_LWUP UNSPEC_LWUP
UNSPEC_LBUP UNSPEC_LBUP
UNSPEC_SWUP UNSPEC_SWUP
...@@ -69,6 +81,23 @@ ...@@ -69,6 +81,23 @@
UNSPEC_VOLATILE_FMFCSR UNSPEC_VOLATILE_FMFCSR
UNSPEC_VOLATILE_FMTCSR UNSPEC_VOLATILE_FMTCSR
UNSPEC_VOLATILE_FMFCFG UNSPEC_VOLATILE_FMFCFG
UNSPEC_VOLATILE_JR_ITOFF
UNSPEC_VOLATILE_JR_TOFF
UNSPEC_VOLATILE_JRAL_ITON
UNSPEC_VOLATILE_JRAL_TON
UNSPEC_VOLATILE_RET_ITOFF
UNSPEC_VOLATILE_RET_TOFF
UNSPEC_VOLATILE_STANDBY_NO_WAKE_GRANT
UNSPEC_VOLATILE_STANDBY_WAKE_GRANT
UNSPEC_VOLATILE_STANDBY_WAKE_DONE
UNSPEC_VOLATILE_TEQZ
UNSPEC_VOLATILE_TNEZ
UNSPEC_VOLATILE_TRAP
UNSPEC_VOLATILE_SETEND_BIG
UNSPEC_VOLATILE_SETEND_LITTLE
UNSPEC_VOLATILE_BREAK
UNSPEC_VOLATILE_SYSCALL
UNSPEC_VOLATILE_NOP
UNSPEC_VOLATILE_LLW UNSPEC_VOLATILE_LLW
UNSPEC_VOLATILE_SCW UNSPEC_VOLATILE_SCW
UNSPEC_VOLATILE_CCTL_L1D_INVALALL UNSPEC_VOLATILE_CCTL_L1D_INVALALL
......
...@@ -454,9 +454,51 @@ enum nds32_builtins ...@@ -454,9 +454,51 @@ enum nds32_builtins
NDS32_BUILTIN_FCPYSS, NDS32_BUILTIN_FCPYSS,
NDS32_BUILTIN_FCPYNSD, NDS32_BUILTIN_FCPYNSD,
NDS32_BUILTIN_FCPYSD, NDS32_BUILTIN_FCPYSD,
NDS32_BUILTIN_ABS,
NDS32_BUILTIN_AVE,
NDS32_BUILTIN_BCLR,
NDS32_BUILTIN_BSET,
NDS32_BUILTIN_BTGL,
NDS32_BUILTIN_BTST,
NDS32_BUILTIN_CLIP,
NDS32_BUILTIN_CLIPS,
NDS32_BUILTIN_CLZ,
NDS32_BUILTIN_CLO,
NDS32_BUILTIN_MAX,
NDS32_BUILTIN_MIN,
NDS32_BUILTIN_PBSAD,
NDS32_BUILTIN_PBSADA,
NDS32_BUILTIN_BSE,
NDS32_BUILTIN_BSP,
NDS32_BUILTIN_FFB, NDS32_BUILTIN_FFB,
NDS32_BUILTIN_FFMISM, NDS32_BUILTIN_FFMISM,
NDS32_BUILTIN_FLMISM, NDS32_BUILTIN_FLMISM,
NDS32_BUILTIN_ROTR,
NDS32_BUILTIN_SVA,
NDS32_BUILTIN_SVS,
NDS32_BUILTIN_WSBH,
NDS32_BUILTIN_JR_ITOFF,
NDS32_BUILTIN_JR_TOFF,
NDS32_BUILTIN_JRAL_ITON,
NDS32_BUILTIN_JRAL_TON,
NDS32_BUILTIN_RET_ITOFF,
NDS32_BUILTIN_RET_TOFF,
NDS32_BUILTIN_STANDBY_NO_WAKE_GRANT,
NDS32_BUILTIN_STANDBY_WAKE_GRANT,
NDS32_BUILTIN_STANDBY_WAKE_DONE,
NDS32_BUILTIN_TEQZ,
NDS32_BUILTIN_TNEZ,
NDS32_BUILTIN_TRAP,
NDS32_BUILTIN_SETEND_BIG,
NDS32_BUILTIN_SETEND_LITTLE,
NDS32_BUILTIN_SYSCALL,
NDS32_BUILTIN_BREAK,
NDS32_BUILTIN_NOP,
NDS32_BUILTIN_SCHE_BARRIER,
NDS32_BUILTIN_GET_CURRENT_SP,
NDS32_BUILTIN_SET_CURRENT_SP,
NDS32_BUILTIN_RETURN_ADDRESS,
NDS32_BUILTIN_LLW, NDS32_BUILTIN_LLW,
NDS32_BUILTIN_LWUP, NDS32_BUILTIN_LWUP,
NDS32_BUILTIN_LBUP, NDS32_BUILTIN_LBUP,
......
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
;; Insn type, it is used to default other attribute values. ;; Insn type, it is used to default other attribute values.
(define_attr "type" (define_attr "type"
"unknown,load,store,load_multiple,store_multiple,alu,alu_shift,mul,mac,div,branch,mmu,misc,\ "unknown,load,store,load_multiple,store_multiple,alu,alu_shift,pbsad,pbsada,mul,mac,div,branch,mmu,misc,\
falu,fmuls,fmuld,fmacs,fmacd,fdivs,fdivd,fsqrts,fsqrtd,fcmp,fabs,fcpy,fcmov,fmfsr,fmfdr,fmtsr,fmtdr,fload,fstore" falu,fmuls,fmuld,fmacs,fmacd,fdivs,fdivd,fsqrts,fsqrtd,fcmp,fabs,fcpy,fcmov,fmfsr,fmfdr,fmtsr,fmtdr,fload,fstore"
(const_string "unknown")) (const_string "unknown"))
...@@ -1922,16 +1922,31 @@ ...@@ -1922,16 +1922,31 @@
[(set_attr "type" "alu") [(set_attr "type" "alu")
(set_attr "length" "4")]) (set_attr "length" "4")])
(define_insn "*btst" (define_insn "btst"
[(set (match_operand:SI 0 "register_operand" "= r") [(set (match_operand:SI 0 "register_operand" "= r")
(zero_extract:SI (match_operand:SI 1 "register_operand" " r") (zero_extract:SI (match_operand:SI 1 "register_operand" " r")
(const_int 1) (const_int 1)
(match_operand:SI 2 "immediate_operand" " Iu05")))] (match_operand:SI 2 "nds32_imm5u_operand" " Iu05")))]
"TARGET_EXT_PERF" "TARGET_EXT_PERF"
"btst\t%0, %1, %2" "btst\t%0, %1, %2"
[(set_attr "type" "alu") [(set_attr "type" "alu")
(set_attr "length" "4")]) (set_attr "length" "4")])
(define_insn "ave"
[(set (match_operand:SI 0 "register_operand" "=r")
(truncate:SI
(ashiftrt:DI
(plus:DI
(plus:DI
(sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
(sign_extend:DI (match_operand:SI 2 "register_operand" "r")))
(const_int 1))
(const_int 1))))]
"TARGET_EXT_PERF"
"ave\t%0, %1, %2"
[(set_attr "type" "alu")
(set_attr "length" "4")])
;; ---------------------------------------------------------------------------- ;; ----------------------------------------------------------------------------
;; Pseudo NOPs ;; Pseudo NOPs
......
...@@ -425,6 +425,22 @@ enum nds32_cctl_idxwrite ...@@ -425,6 +425,22 @@ enum nds32_cctl_idxwrite
(__builtin_nds32_swup ((a), (b))) (__builtin_nds32_swup ((a), (b)))
#define __nds32__sbup(a, b) \ #define __nds32__sbup(a, b) \
(__builtin_nds32_sbup ((a), (b))) (__builtin_nds32_sbup ((a), (b)))
#define __nds32__mfsr(srname) \
(__builtin_nds32_mfsr ((srname)))
#define __nds32__mfusr(usrname) \
(__builtin_nds32_mfusr ((usrname)))
#define __nds32__mtsr(val, srname) \
(__builtin_nds32_mtsr ((val), (srname)))
#define __nds32__mtsr_isb(val, srname) \
(__builtin_nds32_mtsr_isb ((val), (srname)))
#define __nds32__mtsr_dsb(val, srname) \
(__builtin_nds32_mtsr_dsb ((val), (srname)))
#define __nds32__mtusr(val, usrname) \
(__builtin_nds32_mtusr ((val), (usrname)))
#define __nds32__break(swid) \
(__builtin_nds32_break(swid))
#define __nds32__cctlva_lck(subtype, va) \ #define __nds32__cctlva_lck(subtype, va) \
(__builtin_nds32_cctl_va_lck ((subtype), (va))) (__builtin_nds32_cctl_va_lck ((subtype), (va)))
#define __nds32__cctlidx_wbinval(subtype, idx) \ #define __nds32__cctlidx_wbinval(subtype, idx) \
...@@ -452,6 +468,96 @@ enum nds32_cctl_idxwrite ...@@ -452,6 +468,96 @@ enum nds32_cctl_idxwrite
(__builtin_nds32_msync_store()) (__builtin_nds32_msync_store())
#define __nds32__msync_all() \ #define __nds32__msync_all() \
(__builtin_nds32_msync_all()) (__builtin_nds32_msync_all())
#define __nds32__nop() \
(__builtin_nds32_nop())
#define __nds32__standby_wait_done() \
(__builtin_nds32_standby_wait_done())
#define __nds32__standby_no_wake_grant() \
(__builtin_nds32_standby_no_wake_grant())
#define __nds32__standby_wake_grant() \
(__builtin_nds32_standby_wake_grant())
#define __nds32__schedule_barrier() \
(__builtin_nds32_schedule_barrier())
#define __nds32__setend_big() \
(__builtin_nds32_setend_big())
#define __nds32__setend_little() \
(__builtin_nds32_setend_little())
#define __nds32__setgie_en() \
#define __nds32__jr_itoff(a) \
(__builtin_nds32_jr_itoff ((a)))
#define __nds32__jr_toff(a) \
(__builtin_nds32_jr_toff ((a)))
#define __nds32__jral_iton(a) \
(__builtin_nds32_jral_iton ((a)))
#define __nds32__jral_ton(a) \
(__builtin_nds32_jral_ton ((a)))
#define __nds32__ret_itoff(a) \
(__builtin_nds32_ret_itoff ((a)))
#define __nds32__ret_toff(a) \
(__builtin_nds32_ret_toff ((a)))
#define __nds32__svs(a, b) \
(__builtin_nds32_svs ((a), (b)))
#define __nds32__sva(a, b) \
(__builtin_nds32_sva ((a), (b)))
#define __nds32__teqz(a, swid) \
(__builtin_nds32_teqz ((a), (swid)))
#define __nds32__tnez(a, swid) \
( __builtin_nds32_tnez ((a), (swid)))
#define __nds32__trap(swid) \
(__builtin_nds32_trap ((swid)))
#define __nds32__isync(a) \
(__builtin_nds32_isync ((a)))
#define __nds32__rotr(val, ror) \
(__builtin_nds32_rotr ((val), (ror)))
#define __nds32__wsbh(a) \
(__builtin_nds32_wsbh ((a)))
#define __nds32__syscall(a) \
(__builtin_nds32_syscall ((a)))
#define __nds32__return_address() \
(__builtin_nds32_return_address())
#define __nds32__get_current_sp() \
(__builtin_nds32_get_current_sp())
#define __nds32__set_current_sp(a) \
(__builtin_nds32_set_current_sp ((a)))
#define __nds32__abs(a) \
(__builtin_nds32_pe_abs ((a)))
#define __nds32__ave(a, b) \
(__builtin_nds32_pe_ave ((a), (b)))
#define __nds32__bclr(a, pos) \
(__builtin_nds32_pe_bclr ((a), (pos)))
#define __nds32__bset(a, pos) \
(__builtin_nds32_pe_bset ((a), (pos)))
#define __nds32__btgl(a, pos) \
(__builtin_nds32_pe_btgl ((a), (pos)))
#define __nds32__btst(a, pos) \
(__builtin_nds32_pe_btst ((a), (pos)))
#define __nds32__clip(a, imm) \
(__builtin_nds32_pe_clip ((a), (imm)))
#define __nds32__clips(a, imm) \
(__builtin_nds32_pe_clips ((a), (imm)))
#define __nds32__clz(a) \
(__builtin_nds32_pe_clz ((a)))
#define __nds32__clo(a) \
(__builtin_nds32_pe_clo ((a)))
#define __nds32__bse(r, a, b) \
(__builtin_nds32_pe2_bse ((r), (a), (b)))
#define __nds32__bsp(r, a, b) \
(__builtin_nds32_pe2_bsp ((r), (a), (b)))
#define __nds32__pbsad(a, b) \
(__builtin_nds32_pe2_pbsad ((a), (b)))
#define __nds32__pbsada(acc, a, b) \
(__builtin_nds32_pe2_pbsada ((acc), (a), (b)))
#define __nds32__ffb(a, b) \
(__builtin_nds32_se_ffb ((a), (b)))
#define __nds32__ffmism(a, b) \
(__builtin_nds32_se_ffmism ((a), (b)))
#define __nds32__flmism(a, b) \
(__builtin_nds32_se_flmism ((a), (b)))
#define __nds32__fcpynsd(a, b) \ #define __nds32__fcpynsd(a, b) \
(__builtin_nds32_fcpynsd ((a), (b))) (__builtin_nds32_fcpynsd ((a), (b)))
#define __nds32__fcpynss(a, b) \ #define __nds32__fcpynss(a, b) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment