1;; Machine description for C-SKY processors. 2;; Copyright (C) 2018-2020 Free Software Foundation, Inc. 3;; Contributed by C-SKY Microsystems and Mentor Graphics. 4;; 5;; This file is part of GCC. 6;; 7;; GCC is free software; you can redistribute it and/or modify it 8;; under the terms of the GNU General Public License as published by 9;; the Free Software Foundation; either version 3, or (at your option) 10;; any later version. 11;; 12;; GCC is distributed in the hope that it will be useful, but 13;; WITHOUT ANY WARRANTY; without even the implied warranty of 14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15;; General Public License for more details. 16;; 17;; You should have received a copy of the GNU General Public License 18;; along with GCC; see the file COPYING3. If not see 19;; <http://www.gnu.org/licenses/>. */ 20 21 22;; ------------------------------------------------------------------------ 23;; Constant 24;; ------------------------------------------------------------------------ 25 26;; Register numbering. 27 28(define_constants 29 [(CSKY_NGPR_REGS 32) 30 (CSKY_NPARM_REGS 4) 31 (CSKY_FIRST_PARM_REGNUM 0) 32 (CSKY_FIRST_RET_REGNUM 0) 33 (CSKY_FIRST_VFP_REGNUM 52) 34 (CSKY_LAST_VFP_REGNUM 67) 35 (CSKY_FIRST_HIGH_REGNUM 16) 36 (CSKY_LAST_HIGH_REGNUM 31) 37 (CSKY_FIRST_MINI_REGNUM 0) 38 (CSKY_LAST_MINI_REGNUM 7) 39 (CSKY_T0_REGNUM 12) 40 (CSKY_T1_REGNUM 13) 41 (CSKY_SP_REGNUM 14) 42 (CSKY_CC_REGNUM 33) 43 (CSKY_HI_REGNUM 34) 44 (CSKY_LO_REGNUM 35) 45 (CSKY_LR_REGNUM 15) 46 (CSKY_LAST_HIGH_UNFIXED_REGNUM 25) 47 (CSKY_GB_REGNUM 28) 48 (CSKY_TLS_REGNUM 31) 49 (CSKY_FIRST_EH_RETDATA_REGNUM 0) 50 (CSKY_LAST_EH_RETDATA_REGNUM 1) 51 (CSKY_EH_STACKADJ_REGNUM 2) 52 (CSKY_STACKADJUST_REGNUM 4) 53]) 54 55;; Supported TLS relocations. 56 57(define_constants 58 [(TLS_GD32 0) 59 (TLS_LDM32 1) 60 (TLS_LDO32 2) 61 (TLS_IE32 3) 62 (TLS_LE32 4) 63]) 64 65;; Unspec constants. 66 67(define_c_enum "unspec" 68 [ 69 ; Push or pop multiple operation: operand 0 is the first register, 70 ; subsequent registers are in parallel (use ...) expressions. 71 UNSPEC_PUSHPOP_MULT 72 73 ; Represent TLS base, TLS offset, and TLS base + offset, respectively. 74 UNSPEC_TLS_BASE 75 UNSPEC_TLS_LABEL 76 UNSPEC_TLS 77 78 ; PIC symbol relocations. 79 UNSPEC_PIC_SYMBOL_GOTPC 80 UNSPEC_PIC_SYMBOL_GOTPC_GRS 81 UNSPEC_PIC_SYMBOL_GOTOFF 82 UNSPEC_PIC_SYMBOL_GOT 83 UNSPEC_PIC_SYMBOL_PLT 84 UNSPEC_PIC_SYMBOL_BSR 85 UNSPEC_PIC_SYMBOL_GRS 86 87 ; casesi dispatch table. 88 UNSPEC_CSKY_CASESI 89 ]) 90 91 92(define_c_enum "unspecv" 93 [ 94 ; Used for constant pools. 95 VUNSPEC_ALIGN 96 VUNSPEC_POOL_LABEL 97 VUNSPEC_POOL_4 98 VUNSPEC_POOL_8 99 VUNSPEC_SYMBOL_REF 100 101 ; Support for the eh_return pattern. 102 VUNSPEC_EH_RETURN 103 ]) 104 105 106;; ------------------------------------------------------------------------ 107;; Attributes 108;; ------------------------------------------------------------------------ 109 110;; LENGTH of an instruction (in bytes). 111 112(define_attr "length" "" 113 (if_then_else (match_test "CSKY_TARGET_ARCH (CK801)") 114 (const_int 2) 115 (const_int 4))) 116 117;; Used for ck801 to represent whether we need to use bsr for long 118;; distance jumps. If set to yes, the function will save lr in the 119;; prologue. 120 121(define_attr "far_jump" "yes,no" (const_string "no")) 122 123;; Used for insn schedule. 124 125(define_attr "type" 126 "alu,load,store,cmp,branch,cbranch,addsub,alu_ix,branch_jmp,call_jsr,call" 127 (const_string "alu")) 128 129 130;; ------------------------------------------------------------------------ 131;; Include files 132;; ------------------------------------------------------------------------ 133 134(include "constraints.md") 135(include "predicates.md") 136(include "csky_insn_fpu.md") 137(include "csky_insn_dsp.md") 138(include "csky_pipeline_ck801.md") 139(include "csky_pipeline_ck802.md") 140(include "csky_pipeline_ck803.md") 141(include "csky_pipeline_ck810.md") 142 143;; ------------------------------------------------------------------------ 144;; Mov insns 145;; ------------------------------------------------------------------------ 146 147(define_mode_iterator QHI [QI HI]) 148 149(define_expand "movsi" 150 [(set (match_operand:SI 0 "general_operand" "") 151 (match_operand:SI 1 "general_operand" ""))] 152 "" 153 " 154 { 155 rtx scratch = !can_create_pseudo_p () ? operands[0] : 0; 156 if (can_create_pseudo_p () && MEM_P (operands[0])) 157 { 158 operands[1] = force_reg (SImode, operands[1]); 159 emit_insn (gen_rtx_SET (operands[0], operands[1])); 160 DONE; 161 } 162 163 /* Recognize the case where operand[1] is a reference to thread-local 164 data and load its address to a register. */ 165 if (csky_tls_referenced_p (operands[1])) 166 { 167 rtx tmp = operands[1]; 168 rtx addend = NULL; 169 170 if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS) 171 { 172 addend = XEXP (XEXP (tmp, 0), 1); 173 tmp = XEXP (XEXP (tmp, 0), 0); 174 } 175 176 gcc_assert (GET_CODE (tmp) == SYMBOL_REF); 177 gcc_assert (SYMBOL_REF_TLS_MODEL (tmp) != 0); 178 179 tmp = csky_legitimize_tls_address (tmp, scratch); 180 if (addend) 181 { 182 tmp = gen_rtx_PLUS (SImode, tmp, addend); 183 tmp = force_operand (tmp, operands[0]); 184 } 185 operands[1] = tmp; 186 } 187 else if (flag_pic 188 && (CONSTANT_P (operands[1]) 189 || csky_symbol_mentioned_p (operands[1]) 190 || csky_label_mentioned_p (operands[1]))) 191 operands[1] = csky_legitimize_pic_address (operands[1], scratch, true); 192 }" 193) 194 195;; Note that we conservatively estimate all load and store insns as having 196;; a size of 4 bytes throughout even though some variants can be encoded 197;; as 2-byte machine instructions. Getting more accurate instruction counts 198;; would be better handled by calling into a C function than encoding it 199;; as an RTL conditional here. 200;; Also note that we don't count the extra space required for constant 201;; pool entries here; that's handled by the constant pool entries themselves. 202;; In -mno-constpool cases where we're relying on the assembler to create 203;; the constant pool, we'll undercount branch lengths, but in that case the 204;; assembler also handles branch relaxation as needed. It's only ck801 that 205;; requires compiler cooperation when long branches are needed. 206 207(define_insn "*cskyv2_movsi" 208 [(set (match_operand:SI 0 "nonimmediate_operand" "=b,r,r,r, r, r, r,r, m,r,*y,*r,*v,*r,*v") 209 (match_operand:SI 1 "general_operand" " b,r,I,Un,Uc,Uo,m,miF,r,c,*r,*y,*r,*v,*v"))] 210 "CSKY_ISA_FEATURE (E2)" 211 "* return csky_output_move (insn, operands, SImode);" 212 [(set_attr "length" "2,4,4,4,4,8,4,4,4,4,4,4,4,4,4") 213 (set_attr "type" "alu,alu,alu,alu,alu,alu,load,load,store,alu,alu,alu,alu,alu,alu")] 214) 215 216(define_insn "*ck801_movsi" 217 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,a, a,r,r, m,r") 218 (match_operand:SI 1 "general_operand" "r, Up,T,m,miF,r,c"))] 219 "CSKY_ISA_FEATURE (E1)" 220 "* return csky_output_ck801_move (insn, operands, SImode);" 221 [(set_attr "length" "2,2,2,4,4,4,2") 222 (set_attr "type" "alu,alu,alu,load,load,store,alu")] 223) 224 225;; Convert negative assignments to zero minus positive numbers. 226(define_split 227 [(set (match_operand:SI 0 "register_operand" "") 228 (match_operand:SI 1 "const_int_operand" ""))] 229 "satisfies_constraint_T (operands[1])" 230 [(set (match_dup 0) (match_dup 2)) 231 (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] 232 "operands[2] = const0_rtx;" 233) 234 235;; Convert const assignments to small number of assignments and left shift. 236(define_split 237 [(set (match_operand:SI 0 "register_operand" "") 238 (match_operand:SI 1 "const_int_operand" ""))] 239 "" 240 [(set (match_dup 0) (match_dup 1)) 241 (set (match_dup 0) (ashift:SI (match_dup 0) (match_dup 2)))] 242 " 243 { 244 unsigned int base, shift; 245 246 if (!csky_shifted_imm8_constant (INTVAL (operands[1]), &base, &shift)) 247 FAIL; 248 if (shift == 0) 249 FAIL; 250 operands[1] = GEN_INT (base); 251 operands[2] = GEN_INT (shift); 252 }" 253) 254 255 256(define_expand "movhi" 257 [(set (match_operand:HI 0 "general_operand" "") 258 (match_operand:HI 1 "general_operand" ""))] 259 "" 260 " 261 { 262 if (GET_CODE (operands[0]) == MEM) 263 operands[1] = force_reg (HImode, operands[1]); 264 else if (CONSTANT_P (operands[1]) 265 && (GET_CODE (operands[1]) != CONST_INT 266 || (! CSKY_CONST_OK_FOR_I (INTVAL (operands[1])) 267 && ! CSKY_CONST_OK_FOR_Ub (INTVAL (operands[1])) 268 && ! CSKY_CONST_OK_FOR_Uc (INTVAL (operands[1])))) 269 && ! reload_completed && ! reload_in_progress) 270 { 271 rtx reg = gen_reg_rtx (SImode); 272 emit_insn (gen_movsi (reg, operands[1])); 273 operands[1] = gen_lowpart (HImode, reg); 274 } 275 }" 276) 277 278(define_insn "*cskyv2_movhi" 279 [(set (match_operand:HI 0 "nonimmediate_operand" "=b,r,r,r, r, r, r,r, m,r,*y,*r,*v,*r,*v") 280 (match_operand:HI 1 "general_operand" " b,r,I,Un,Uc,Uo,m,miF,r,c,*r,*y,*r,*v,*v"))] 281 "CSKY_ISA_FEATURE (E2)" 282 "* return csky_output_move (insn, operands, HImode);" 283 [(set_attr "length" "2,4,4,4,4,8,4,4,4,4,4,4,4,4,4") 284 (set_attr "type" "alu,alu,alu,alu,alu,alu,load,load,store,alu,alu,alu,alu,alu,alu")] 285) 286 287(define_insn "*ck801_movhi" 288 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,a, a,r,r, m,r") 289 (match_operand:HI 1 "general_operand" "r, Up,T,m,miF,r,c"))] 290 "CSKY_ISA_FEATURE (E1)" 291 "* return csky_output_ck801_move (insn, operands, HImode);" 292 [(set_attr "length" "2,2,2,4,4,4,2") 293 (set_attr "type" "alu,alu,alu,load,load,store,alu")] 294) 295 296 297(define_expand "movqi" 298 [(set (match_operand:QI 0 "general_operand" "") 299 (match_operand:QI 1 "general_operand" ""))] 300 "" 301 " 302 { 303 if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM) 304 operands[1] = force_reg (QImode, operands[1]); 305 else if (CONSTANT_P (operands[1]) 306 && (GET_CODE (operands[1]) != CONST_INT 307 || (! CSKY_CONST_OK_FOR_I (INTVAL (operands[1])) 308 && ! CSKY_CONST_OK_FOR_Ub (INTVAL (operands[1])) 309 && ! CSKY_CONST_OK_FOR_Uc (INTVAL (operands[1])))) 310 && ! reload_completed && ! reload_in_progress) 311 { 312 rtx reg = gen_reg_rtx (SImode); 313 emit_insn (gen_movsi (reg, operands[1])); 314 operands[1] = gen_lowpart (QImode, reg); 315 } 316 }" 317) 318 319(define_insn "*cskyv2_movqi" 320 [(set (match_operand:QI 0 "nonimmediate_operand" "=b,r,r,r, r, r, r,r, m,r,*y,*r,*v,*r,*v") 321 (match_operand:QI 1 "general_operand" " b,r,I,Un,Uc,Uo,m,miF,r,c,*r,*y,*r,*v,*v"))] 322 "CSKY_ISA_FEATURE (E2)" 323 "* return csky_output_move (insn, operands, QImode);" 324 [(set_attr "length" "2,4,4,4,4,8,4,4,4,4,4,4,4,4,4") 325 (set_attr "type" "alu,alu,alu,alu,alu,alu,load,load,store,alu,alu,alu,alu,alu,alu")] 326) 327 328(define_insn "*ck801_movqi" 329 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,a, a,r,r, m,r") 330 (match_operand:QI 1 "general_operand" "r, Up,T,m,miF,r,c"))] 331 "CSKY_ISA_FEATURE (E1)" 332 "* return csky_output_ck801_move (insn, operands, QImode);" 333 [(set_attr "length" "2,2,2,4,4,4,2") 334 (set_attr "type" "alu,alu,alu,load,load,store,alu")] 335) 336 337 338(define_expand "movdi" 339 [(set (match_operand:DI 0 "general_operand" "") 340 (match_operand:DI 1 "general_operand" ""))] 341 "" 342 "if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM) 343 operands[1] = force_reg (DImode, operands[1]);" 344) 345 346;; Convert negative assignments to zero minus positive numbers. 347(define_split 348 [(set (match_operand:QHI 0 "register_operand" "") 349 (match_operand:QHI 1 "const_int_operand" ""))] 350 "satisfies_constraint_T (operands[1])" 351 [(set (match_dup 4) (match_dup 2)) 352 (set (match_dup 4) (match_dup 3)) 353 (set (match_dup 0) (match_dup 5))] 354 " 355 { 356 int low; 357 358 if (TARGET_BIG_ENDIAN) 359 low = 4 - mode_size[GET_MODE (operands[0])]; 360 else 361 low = 0; 362 operands[2] = const0_rtx; 363 if (can_create_pseudo_p ()) 364 operands[4] = gen_reg_rtx (SImode); 365 else 366 operands[4] = gen_rtx_REG (SImode, REGNO (operands[0])); 367 operands[3] = gen_rtx_PLUS (SImode, operands[4], operands[1]); 368 operands[5] = gen_rtx_SUBREG (GET_MODE (operands[0]), operands[4], low); 369 }" 370) 371 372;; Convert const assignments to small number of assignments and left shift. 373(define_split 374 [(set (match_operand:QHI 0 "register_operand" "") 375 (match_operand:QHI 1 "const_int_operand" ""))] 376 "" 377 [(set (match_dup 3) (match_dup 1)) 378 (set (match_dup 3) (ashift:SI (match_dup 3) (match_dup 2))) 379 (set (match_dup 0) (match_dup 4))] 380 " 381 { 382 unsigned int base, shift; 383 int low; 384 385 if (!csky_shifted_imm8_constant (INTVAL (operands[1]), &base, &shift)) 386 FAIL; 387 if (shift == 0) 388 FAIL; 389 390 if (TARGET_BIG_ENDIAN) 391 low = 4 - mode_size[GET_MODE (operands[0])]; 392 else 393 low = 0; 394 395 operands[1] = GEN_INT (base); 396 operands[2] = GEN_INT (shift); 397 if (can_create_pseudo_p ()) 398 operands[3] = gen_reg_rtx (SImode); 399 else 400 operands[3] = gen_rtx_REG (SImode, REGNO (operands[0])); 401 operands[4] = gen_rtx_SUBREG (GET_MODE (operands[0]), operands[3], low); 402 }" 403) 404 405 406(define_insn "*csky_movdi" 407 [(set (match_operand:DI 0 "nonimmediate_operand" "=b,r,r, r,r, m,*r,*y,*v,*r,*v") 408 (match_operand:DI 1 "general_operand" " b,r,Ud,m,miF,r,*y,*r,*r,*v,*v"))] 409 "CSKY_ISA_FEATURE (E2)" 410 "* return csky_output_movedouble (operands, DImode);" 411 [(set_attr "length" "4,8,8,8,8,8,16,16,16,16,16") 412 (set_attr "type" "alu,alu,alu,load,load,store,alu,alu,alu,alu,alu")] 413) 414 415(define_insn "*ck801_movdi" 416 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,a, a,r,r, m") 417 (match_operand:DI 1 "general_operand" "r, Up,T,m,miF,r"))] 418 "CSKY_ISA_FEATURE (E1)" 419 "* return csky_output_ck801_movedouble (operands, DImode);" 420 [(set_attr "length" "4,4,4,8,8,8") 421 (set_attr "type" "alu,alu,alu,load,load,store")] 422) 423 424;; Float mov instructions. 425 426(define_expand "movsf" 427 [(set (match_operand:SF 0 "general_operand" "") 428 (match_operand:SF 1 "general_operand" ""))] 429 "" 430 " 431 if (GET_CODE (operands[0]) == MEM && can_create_pseudo_p ()) 432 operands[1] = force_reg (SFmode, operands[1]); 433 " 434) 435 436;; FIXME: maybe the vreg load/stores should have their own type attr. 437(define_insn "*csky_movsf_fpv2" 438 [(set (match_operand:SF 0 "nonimmediate_operand" "=b,r,v,r,r,r, m,Q,v,v,v") 439 (match_operand:SF 1 "general_operand" " b,r,r,v,m,mF,r,v,Q,v,m"))] 440 "CSKY_ISA_FEATURE (fpv2_sf)" 441 "* return csky_output_move (insn, operands, SFmode);" 442 [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4") 443 (set_attr "type" "alu,alu,alu,alu,load,load,store,alu,alu,alu,alu")] 444) 445 446(define_insn "*ck801_movsf" 447 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r, m") 448 (match_operand:SF 1 "general_operand" " r,m,mF,r"))] 449 "CSKY_ISA_FEATURE (E1)" 450 "* return csky_output_ck801_move (insn, operands, SFmode);" 451 [(set_attr "length" "2,4,4,4") 452 (set_attr "type" "alu,load,load,store")] 453) 454 455(define_insn "*csky_movsf" 456 [(set (match_operand:SF 0 "nonimmediate_operand" "=b,r,r,r, m") 457 (match_operand:SF 1 "general_operand" " b,r,m,mF,r"))] 458 "CSKY_ISA_FEATURE (E2) && !CSKY_ISA_FEATURE (fpv2_sf)" 459 "* return csky_output_move (insn, operands, SFmode);" 460 [(set_attr "length" "2,4,4,4,4") 461 (set_attr "type" "alu,alu,load,load,store")] 462) 463 464 465(define_expand "movdf" 466 [(set (match_operand:DF 0 "general_operand" "") 467 (match_operand:DF 1 "general_operand" ""))] 468 "" 469 " 470 if (GET_CODE (operands[0]) == MEM && can_create_pseudo_p ()) 471 operands[1] = force_reg (DFmode, operands[1]); 472 " 473) 474 475;; FIXME: maybe the vreg load/stores should have their own type attr. 476(define_insn "*csky_movdf_fpv2" 477 [(set (match_operand:DF 0 "nonimmediate_operand" "=b,r,v,r,r,r, m,Q,v,v,v") 478 (match_operand:DF 1 "general_operand" "b,r,r,v,m,mF,r,v,Q,v,m"))] 479 "CSKY_ISA_FEATURE (fpv2_df)" 480 "* return csky_output_movedouble (operands, DFmode);" 481 [(set_attr "length" "4,8,8,8,8,8,8,8,8,8,8") 482 (set_attr "type" "alu,alu,alu,alu,load,load,store,alu,alu,alu,alu")] 483) 484 485(define_insn "*ck801_movdf" 486 [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,r, m") 487 (match_operand:DF 1 "general_operand" " r,m,mF,r"))] 488 "CSKY_ISA_FEATURE (E1)" 489 "* return csky_output_ck801_movedouble (operands, DFmode);" 490 [(set_attr "length" "4,8,8,8") 491 (set_attr "type" "alu,load,load,store")] 492) 493 494(define_insn "*csky_movdf" 495 [(set (match_operand:DF 0 "nonimmediate_operand" "=b,r,r,r, m") 496 (match_operand:DF 1 "general_operand" " b,r,m,mF,r"))] 497 "CSKY_ISA_FEATURE (E2) && !CSKY_ISA_FEATURE (fpv2_df)" 498 "* return csky_output_movedouble (operands, DFmode);" 499 [(set_attr "length" "4,8,8,8,8") 500 (set_attr "type" "alu,alu,load,load,store")] 501) 502 503;; The only CCmode move supported is a nop. Without this pattern, 504;; CSE is unable to eliminate redundant comparisons in conditional 505;; execution expressions. 506 507(define_insn "*movcc_nop" 508 [(set (reg:CC CSKY_CC_REGNUM) (reg:CC CSKY_CC_REGNUM))] 509 "" 510 "" 511 [(set_attr "length" "0")] 512) 513 514;; ------------------------------------------------------------------------ 515;; Conditional mov insns 516;; ------------------------------------------------------------------------ 517 518;; Only handle integer comparisons because float and double require 519;; library calls. 520 521(define_expand "movsicc" 522 [(set (match_operand 0 "register_operand" "") 523 (if_then_else:SI (match_operand 1 "ordered_comparison_operator" "") 524 (match_operand:SI 2 "register_operand" "") 525 (match_operand:SI 3 "register_operand" "")))] 526 "CSKY_ISA_FEATURE (E2)" 527 " 528 { 529 bool invert = csky_emit_compare (GET_CODE (operands[1]), 530 XEXP (operands[1], 0), 531 XEXP (operands[1], 1)); 532 533 if (invert) 534 emit_insn (gen_movf (operands[0], operands[2], operands[3])); 535 else 536 emit_insn (gen_movt (operands[0], operands[2], operands[3])); 537 DONE; 538 }") 539 540(define_insn "movt" 541 [(set (match_operand:SI 0 "register_operand" "=r, r") 542 (if_then_else:SI (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 543 (match_operand:SI 1 "register_operand" "r, 0") 544 (match_operand:SI 2 "register_operand" "0, r")))] 545 "CSKY_ISA_FEATURE (E2)" 546 "@ 547 movt\t%0, %1 548 movf\t%0, %2" 549 [(set_attr "length" "4,4")] 550) 551 552(define_insn "movf" 553 [(set (match_operand:SI 0 "register_operand" "=r, r") 554 (if_then_else:SI (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 555 (match_operand:SI 1 "register_operand" "r, 0") 556 (match_operand:SI 2 "register_operand" "0, r")))] 557 "CSKY_ISA_FEATURE (E2)" 558 "@ 559 movf\t%0, %1 560 movt\t%0, %2" 561 [(set_attr "length" "4,4")] 562) 563 564(define_expand "cstoresi4" 565 [(set (match_operand:SI 0 "register_operand" "") 566 (match_operator 1 "ordered_comparison_operator" 567 [(match_operand:SI 2 "csky_compare_operand" "") 568 (match_operand:SI 3 "nonmemory_operand" "")]))] 569 "" 570 " 571 { 572 bool invert = csky_emit_compare (GET_CODE (operands[1]), 573 operands[2], operands[3]); 574 575 if (invert) 576 emit_insn (gen_mvcv (operands[0])); 577 else if (CSKY_ISA_FEATURE (E1)) 578 { 579 emit_insn (gen_movsi (operands[0], const0_rtx)); 580 emit_insn (gen_ck801_addc (operands[0], operands[0], operands[0])); 581 } 582 else 583 emit_insn (gen_mvc (operands[0])); 584 DONE; 585 }" 586) 587 588(define_insn "mvc" 589 [(set (match_operand:SI 0 "register_operand" "=r") 590 (ne:SI (reg:CC CSKY_CC_REGNUM) (const_int 0)))] 591 "CSKY_ISA_FEATURE (E2)" 592 "mvc\t%0" 593) 594 595(define_insn "mvcv" 596 [(set (match_operand:SI 0 "register_operand" "=r") 597 (eq:SI (reg:CC CSKY_CC_REGNUM) (const_int 0)))] 598 "" 599 "mvcv\t%0" 600) 601 602;; ------------------------------------------------------------------------ 603;; Arithmetic insns 604;; ------------------------------------------------------------------------ 605 606(define_insn "abssi2" 607 [(set (match_operand:SI 0 "register_operand" "=r") 608 (abs:SI (match_operand:SI 1 "register_operand" "r")))] 609 "CSKY_ISA_FEATURE (2E3)" 610 "abs\t%0, %1" 611 [(set_attr "type" "alu")] 612) 613 614(define_insn "extvsi" 615 [(set (match_operand:SI 0 "register_operand" "=r") 616 (sign_extract:SI (match_operand:SI 1 "register_operand" "r") 617 (match_operand:SI 2 "const_int_operand" "") 618 (match_operand:SI 3 "const_int_operand" "")))] 619 "CSKY_ISA_FEATURE (2E3)" 620 { 621 operands[2] = GEN_INT (INTVAL (operands[3]) + INTVAL (operands[2]) - 1); 622 return \"sext\t%0, %1, %2, %3\"; 623 } 624) 625 626(define_insn "insvsi" 627 [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") 628 (match_operand:SI 1 "const_int_operand" "i") 629 (match_operand:SI 2 "const_int_operand" "i")) 630 (match_operand:SI 3 "register_operand" "r"))] 631 "CSKY_ISA_FEATURE (2E3)" 632 { 633 operands[1] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[1]) - 1); 634 return \"ins\t%0, %3, %1, %2\"; 635 } 636) 637 638(define_expand "bseti" 639 [(set (match_operand:SI 0 "register_operand" "") 640 (ior:SI (match_operand:SI 1 "register_operand" "") 641 (ashift:SI (const_int 1) 642 (match_operand:SI 2 "csky_literal_K_operand" ""))))] 643 "" 644 "") 645 646(define_insn "smart_bseti" 647 [(set (match_operand:SI 0 "register_operand" "=r") 648 (ior:SI (match_operand:SI 1 "register_operand" "0") 649 (ashift:SI (const_int 1) 650 (match_operand:SI 2 "csky_literal_K_operand" "K"))))] 651 "TARGET_MINI_REGISTERS" 652 "bseti\t%0, %2" 653 [(set_attr "length" "2")]) 654 655(define_insn "fast_bseti" 656 [(set (match_operand:SI 0 "register_operand" "=a,r") 657 (ior:SI (match_operand:SI 1 "register_operand" "0,r") 658 (ashift:SI (const_int 1) 659 (match_operand:SI 2 "csky_literal_K_operand" "K,K"))))] 660 "!TARGET_MINI_REGISTERS" 661 "bseti\t%0, %1, %2" 662 [(set_attr "length" "2,4")]) 663 664(define_expand "bclri" 665 [(set (match_operand:SI 0 "register_operand" "") 666 (and:SI (match_operand:SI 1 "register_operand" "") 667 (not:SI (ashift:SI (const_int 1) 668 (match_operand:SI 2 "csky_literal_K_operand" "")))))] 669 "" 670 "") 671 672(define_insn "smart_bclri" 673 [(set (match_operand:SI 0 "register_operand" "=r") 674 (and:SI (match_operand:SI 1 "register_operand" "0") 675 (not:SI (ashift:SI (const_int 1) 676 (match_operand:SI 2 "csky_literal_K_operand" "K")))))] 677 "TARGET_MINI_REGISTERS" 678 "bclri\t%0, %2" 679 [(set_attr "length" "2")]) 680 681(define_insn "fast_bclri" 682 [(set (match_operand:SI 0 "register_operand" "=a,r") 683 (and:SI (match_operand:SI 1 "register_operand" "0,r") 684 (not:SI (ashift:SI (const_int 1) 685 (match_operand:SI 2 "csky_literal_K_operand" "K,K")))))] 686 "!TARGET_MINI_REGISTERS" 687 "bclri\t%0, %1, %2" 688 [(set_attr "length" "2,4")]) 689 690 691;; Shift instructions. 692 693(define_expand "ashlsi3" 694 [(set (match_operand:SI 0 "register_operand" "") 695 (ashift:SI (match_operand:SI 1 "register_operand" "") 696 (match_operand:SI 2 "csky_arith_K_operand" "")))] 697 "" 698 "" 699) 700 701(define_insn "*cskyv2_ashlsi3" 702 [(set (match_operand:SI 0 "register_operand" "=b,r,a,r") 703 (ashift:SI (match_operand:SI 1 "register_operand" "0,r,a,r") 704 (match_operand:SI 2 "csky_arith_K_operand" "b,r,K,K")))] 705 "CSKY_ISA_FEATURE (E2)" 706 "@ 707 lsl %0, %1, %2 708 lsl %0, %1, %2 709 lsli %0, %1, %2 710 lsli %0, %1, %2" 711 [(set_attr "length" "2,4,2,4")] 712) 713 714(define_insn "ck801_ashlsi3" 715 [(set (match_operand:SI 0 "register_operand" "=a,r") 716 (ashift:SI (match_operand:SI 1 "register_operand" "a,0") 717 (match_operand:SI 2 "csky_arith_K_operand" "K,r")))] 718 "CSKY_ISA_FEATURE (E1)" 719 "@ 720 lsli %0, %1, %2 721 lsl %0, %1, %2" 722) 723 724 725(define_expand "ashrsi3" 726 [(set (match_operand:SI 0 "register_operand" "") 727 (ashiftrt:SI (match_operand:SI 1 "register_operand" "") 728 (match_operand:SI 2 "csky_arith_K_operand" "")))] 729 "" 730 "" 731) 732 733(define_insn "*cskyv2_ashrsi3" 734 [(set (match_operand:SI 0 "register_operand" "=b,r,a,r") 735 (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,r,a,r") 736 (match_operand:SI 2 "csky_arith_K_operand" "b,r,K,K")))] 737 "CSKY_ISA_FEATURE (E2)" 738 "@ 739 asr %0, %1, %2 740 asr %0, %1, %2 741 asri %0, %1, %2 742 asri %0, %1, %2" 743 [(set_attr "length" "2,4,2,4")] 744) 745 746(define_insn "*ck801_ashrsi3" 747 [(set (match_operand:SI 0 "register_operand" "=a,r") 748 (ashiftrt:SI (match_operand:SI 1 "register_operand" "a,0") 749 (match_operand:SI 2 "csky_arith_K_operand" "K,r")))] 750 "CSKY_ISA_FEATURE (E1)" 751 "@ 752 asri %0, %1, %2 753 asr %0, %1, %2" 754) 755 756 757(define_expand "lshrsi3" 758 [(set (match_operand:SI 0 "register_operand" "") 759 (lshiftrt:SI (match_operand:SI 1 "register_operand" "") 760 (match_operand:SI 2 "csky_arith_K_operand" "")))] 761 "" 762 "" 763) 764 765(define_insn "*cskyv2_lshrsi3" 766 [(set (match_operand:SI 0 "register_operand" "=b,r,a,r") 767 (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,r,a,r") 768 (match_operand:SI 2 "csky_arith_K_operand" "b,r,K,K")))] 769 "CSKY_ISA_FEATURE (E2)" 770 "@ 771 lsr %0, %1, %2 772 lsr %0, %1, %2 773 lsri %0, %1, %2 774 lsri %0, %1, %2" 775 [(set_attr "length" "2,4,2,4")] 776) 777 778(define_insn "ck801_lshrsi3" 779 [(set (match_operand:SI 0 "register_operand" "=a,r") 780 (lshiftrt:SI (match_operand:SI 1 "register_operand" "a,0") 781 (match_operand:SI 2 "csky_arith_K_operand" "K,r")))] 782 "CSKY_ISA_FEATURE (E1)" 783 "@ 784 lsri %0, %1, %2 785 lsr %0, %1, %2" 786) 787 788 789(define_expand "rotlsi3" 790 [(set (match_operand:SI 0 "register_operand" "") 791 (rotate:SI (match_operand:SI 1 "register_operand" "") 792 (match_operand:SI 2 "csky_arith_K_operand" "")))] 793 "" 794 "" 795) 796 797(define_insn "*cskyv2_rotlsi3" 798 [(set (match_operand:SI 0 "register_operand" "=b,r,r") 799 (rotate:SI (match_operand:SI 1 "register_operand" "0,r,r") 800 (match_operand:SI 2 "csky_arith_K_operand" "b,r,K")))] 801 "CSKY_ISA_FEATURE (E2)" 802 "@ 803 rotl %0, %1, %2 804 rotl %0, %1, %2 805 rotli %0, %1, %2" 806 [(set_attr "length" "2,4,4")] 807) 808 809(define_insn "*ck801_rotlsi3" 810 [(set (match_operand:SI 0 "register_operand" "=r") 811 (rotate:SI (match_operand:SI 1 "register_operand" "0") 812 (match_operand:SI 2 "csky_arith_K_operand" "r")))] 813 "CSKY_ISA_FEATURE (E1)" 814 "rotl %0, %1, %2" 815) 816 817 818;; Add instructions. 819;; C-SKY addi and subi machine instructions only accept positive immediate 820;; values, so we have to special case immediates <= 0 in these patterns. 821 822(define_expand "addsi3" 823 [(set (match_operand:SI 0 "register_operand" "") 824 (plus:SI (match_operand:SI 1 "register_operand" "") 825 (match_operand:SI 2 "nonmemory_operand" "")))] 826 "" 827 "" 828) 829 830(define_insn "smart_addsi3" 831 [(set (match_operand:SI 0 "register_operand" "=a,r,a,a,a,a, r,r") 832 (plus:SI (match_operand:SI 1 "register_operand" "%a,0,0,a,0,a, r,r") 833 (match_operand:SI 2 "nonmemory_operand" "a, r,N,L,T,Us,M,Um")))] 834 "TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2) 835 && operands[0] != stack_pointer_rtx 836 && operands[1] != stack_pointer_rtx" 837 "@ 838 addu\t%0, %1, %2 839 addu\t%0, %1, %2 840 addi\t%0, %1, %2 841 addi\t%0, %1, %2 842 subi\t%0, %1, %M2 843 subi\t%0, %1, %M2 844 addi\t%0, %1, %2 845 subi\t%0, %1, %M2" 846 [(set_attr "length" "2,2,2,2,2,2,4,4") 847 (set_attr "type" "addsub")] 848) 849 850(define_insn_and_split "*smart_addsi3_sp" 851 [(set (match_operand:SI 0 "register_operand" "=z,z, z,a,&a,z,a,r") 852 (plus:SI (match_operand:SI 1 "register_operand" "0, 0, 0,z, z,a,z,r") 853 (match_operand:SI 2 "nonmemory_operand" "P, Ug,r,Uq,i,a,a,M")))] 854 "TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2) 855 && (operands[0] == stack_pointer_rtx || operands[1] == stack_pointer_rtx)" 856 "@ 857 addi\t%0, %1, %2 858 subi\t%0, %1, %M2 859 addu\t%0, %1, %2 860 addi\t%0, %1, %2 861 # 862 addu\t%0, %1, %2 863 addu\t%0, %1, %2 864 addi\t%0, %1, %2" 865 "(operands[0] != stack_pointer_rtx 866 && operands[1] == stack_pointer_rtx 867 && !satisfies_constraint_Uq (operands[2]))" 868 [(set (match_dup 0) 869 (plus:SI (match_dup 1) (match_dup 0)))] 870 "emit_move_insn (operands[0], operands[2]);" 871 [(set_attr "type" "addsub")] 872) 873 874(define_insn "*ck801_addsi3" 875 [(set (match_operand:SI 0 "register_operand" "=r,a,a,a,a,a, !z,!z,!z,a") 876 (plus:SI (match_operand:SI 1 "register_operand" "%0,a,0,a,0,a, 0, 0, 0, !z") 877 (match_operand:SI 2 "nonmemory_operand" "r, a,N,L,T,Us,P, Ug,r, Uq")))] 878 "CSKY_ISA_FEATURE (E1)" 879 "@ 880 addu\t%0, %1, %2 881 addu\t%0, %1, %2 882 addi\t%0, %1, %2 883 addi\t%0, %1, %2 884 subi\t%0, %1, %M2 885 subi\t%0, %1, %M2 886 addi\t%0, %1, %2 887 subi\t%0, %1, %M2 888 addu\t%0, %1, %2 889 addi\t%0, %1, %2" 890 [(set_attr "type" "addsub")] 891) 892 893(define_insn "fast_addsi3" 894 [(set (match_operand:SI 0 "register_operand" "=r,r, r") 895 (plus:SI (match_operand:SI 1 "register_operand" "%r,r, r") 896 (match_operand:SI 2 "nonmemory_operand" "M, Um,r")))] 897 "!TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2)" 898 "@ 899 addi\t%0, %1, %2 900 subi\t%0, %1, %M2 901 addu\t%0, %1, %2" 902 [(set_attr "type" "addsub")] 903) 904 905(define_expand "adddi3" 906 [(parallel [(set (match_operand:DI 0 "register_operand" "") 907 (plus:DI (match_operand:DI 1 "register_operand" "") 908 (match_operand:DI 2 "csky_arith_int1_operand" ""))) 909 (clobber (reg:CC CSKY_CC_REGNUM))])] 910 "" 911 " 912 if (CSKY_ISA_FEATURE (E1) && (GET_CODE (operands[2]) != REG)) 913 operands[2] = force_reg (DImode, operands[2]); 914 " 915) 916 917/* Note that the csky addc instruction both reads and writes the carry bit. 918 The purpose of the initial cmplt instruction in the expansion is to 919 clear the carry bit before adding the lo words. */ 920 921(define_insn_and_split "*cskyv2_adddi3" 922 [(set (match_operand:DI 0 "register_operand" "=&b,&r") 923 (plus:DI (match_operand:DI 1 "register_operand" "%0,r") 924 (match_operand:DI 2 "register_operand" "b, r"))) 925 (clobber (reg:CC CSKY_CC_REGNUM))] 926 "CSKY_ISA_FEATURE (E2)" 927 "#" 928 "reload_completed" 929 [(const_int 0)] 930 { 931 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 932 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 933 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 934 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 935 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 936 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 937 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 938 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 939 940 emit_insn (gen_cmpltsi_r (copy_rtx (l1), copy_rtx (l1))); 941 emit_insn (gen_cskyv2_addc (l0, l1, l2)); 942 emit_insn (gen_cskyv2_addc (h0, h1, h2)); 943 DONE; 944 } 945 [(set_attr "length" "6,12")] 946) 947 948(define_insn_and_split "*ck801_adddi3" 949 [(set (match_operand:DI 0 "register_operand" "=r") 950 (plus:DI (match_operand:DI 1 "register_operand" "%0") 951 (match_operand:DI 2 "register_operand" "r"))) 952 (clobber (reg:CC CSKY_CC_REGNUM))] 953 "CSKY_ISA_FEATURE (E1)" 954 "#" 955 "reload_completed" 956 [(const_int 0)] 957 { 958 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 959 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 960 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 961 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 962 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 963 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 964 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 965 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 966 967 emit_insn (gen_cmpltsi_r (copy_rtx (l1), copy_rtx (l1))); 968 emit_insn (gen_ck801_addc (l0, l1, l2)); 969 emit_insn (gen_ck801_addc (h0, h1, h2)); 970 DONE; 971 } 972 [(set_attr "length" "6")] 973) 974 975;; Special case for "longlong += 1". 976 977(define_insn_and_split "*cskyv2_adddi1_1" 978 [(set (match_operand:DI 0 "register_operand" "=&r") 979 (plus:DI (match_operand:DI 1 "register_operand" "0") 980 (const_int 1))) 981 (clobber (reg:CC CSKY_CC_REGNUM))] 982 "CSKY_ISA_FEATURE (E2)" 983 "#" 984 "reload_completed" 985 [(const_int 0)] 986 { 987 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 988 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 989 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 990 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 991 992 if (TARGET_MINI_REGISTERS) 993 { 994 emit_insn (gen_smart_addsi3 (l0, copy_rtx (l0), 995 gen_int_mode (1, SImode))); 996 emit_insn (gen_smart_cmpnesi_i (copy_rtx (l0), 997 gen_int_mode (0, SImode))); 998 emit_insn (gen_cskyv2_addcc_invert (h0, copy_rtx (h0), 999 gen_int_mode (1, SImode))); 1000 } 1001 else 1002 { 1003 emit_insn (gen_fast_addsi3 (l0, copy_rtx (l0), 1004 gen_int_mode (1, SImode))); 1005 emit_insn (gen_fast_cmpnesi_i (copy_rtx (l0), 1006 gen_int_mode (0, SImode))); 1007 emit_insn (gen_cskyv2_addcc_invert (h0, copy_rtx (h0), 1008 gen_int_mode (1, SImode))); 1009 } 1010 DONE; 1011 } 1012 [(set (attr "length") 1013 (if_then_else (match_test "TARGET_MINI_REGISTERS") 1014 (const_int 8) 1015 (const_int 12)))] 1016) 1017 1018;; sub instructions. 1019 1020(define_expand "subsi3" 1021 [(set (match_operand:SI 0 "register_operand" "") 1022 (minus:SI (match_operand:SI 1 "register_operand" "") 1023 (match_operand:SI 2 "nonmemory_operand" "")))] 1024 "" 1025 "" 1026) 1027 1028(define_insn "smart_subsi3" 1029 [(set (match_operand:SI 0 "register_operand" "=a,a,a,a,a,a") 1030 (minus:SI (match_operand:SI 1 "register_operand" "a, 0,0,a,0,a") 1031 (match_operand:SI 2 "nonmemory_operand" "a, a,N,L,T,Us")))] 1032 "TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2) 1033 && operands[0] != stack_pointer_rtx 1034 && operands[1] != stack_pointer_rtx" 1035 "@ 1036 subu\t%0, %1, %2 1037 subu\t%0, %1, %2 1038 subi\t%0, %1, %2 1039 subi\t%0, %1, %2 1040 addi\t%0, %1, %M2 1041 addi\t%0, %1, %M2" 1042 [(set_attr "length" "2,2,2,2,2,2") 1043 (set_attr "type" "addsub")] 1044) 1045 1046(define_insn "*smart_subsi3_sp" 1047 [(set (match_operand:SI 0 "register_operand" "=z,z, z,a, a,r") 1048 (minus:SI (match_operand:SI 1 "register_operand" "0, 0, 0,z, a,r") 1049 (match_operand:SI 2 "nonmemory_operand" "P, Ug,a,Ur,a,M")))] 1050 "TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2) 1051 && (operands[0] == stack_pointer_rtx || operands[1] == stack_pointer_rtx)" 1052 "@ 1053 subi\t%0, %1, %2 1054 addi\t%0, %1, %M2 1055 subu\t%0, %1, %2 1056 addi\t%0, %1, %M2 1057 subu\t%0, %1, %2 1058 subi\t%0, %1, %2" 1059 [(set_attr "length" "2,2,2,2,2,4") 1060 (set_attr "type" "addsub")] 1061) 1062 1063(define_insn "*ck801_subsi3" 1064 [(set (match_operand:SI 0 "register_operand" "=a,a,a,a,a,a") 1065 (minus:SI (match_operand:SI 1 "register_operand" "0, a,0,a,0,a") 1066 (match_operand:SI 2 "nonmemory_operand" "a, a,N,L,T,Us")))] 1067 "CSKY_ISA_FEATURE (E1) 1068 && operands[0] != stack_pointer_rtx 1069 && operands[1] != stack_pointer_rtx" 1070 "@ 1071 subu\t%0, %1, %2 1072 subu\t%0, %1, %2 1073 subi\t%0, %1, %2 1074 subi\t%0, %1, %2 1075 addi\t%0, %1, %M2 1076 addi\t%0, %1, %M2" 1077 [(set_attr "type" "addsub")] 1078) 1079 1080(define_insn "*ck801_subsi3_sp" 1081 [(set (match_operand:SI 0 "register_operand" "=a,z,z, z") 1082 (minus:SI (match_operand:SI 1 "register_operand" "z, 0,0, 0") 1083 (match_operand:SI 2 "nonmemory_operand" "Ur,P,Ug,r")))] 1084 "CSKY_ISA_FEATURE (E1) 1085 && (operands[0] == stack_pointer_rtx || operands[1] == stack_pointer_rtx)" 1086 "@ 1087 addi\t%0, %1, %M2 1088 subi\t%0, %1, %2 1089 addi\t%0, %1, %M2 1090 subu\t%0, %1, %2" 1091 [(set_attr "type" "addsub")] 1092) 1093 1094(define_insn "fast_subsi3" 1095 [(set (match_operand:SI 0 "register_operand" "=r,r,r") 1096 (minus:SI (match_operand:SI 1 "register_operand" "r, r,r") 1097 (match_operand:SI 2 "nonmemory_operand" "r, M,Um")))] 1098 "!TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2)" 1099 "@ 1100 subu\t%0, %1, %2 1101 subi\t%0, %1, %2 1102 addi\t%0, %1, %M2" 1103 [(set_attr "type" "addsub")] 1104) 1105 1106(define_expand "subdi3" 1107 [(parallel [(set (match_operand:DI 0 "register_operand" "") 1108 (minus:DI (match_operand:DI 1 "register_operand" "") 1109 (match_operand:DI 2 "register_operand" ""))) 1110 (clobber (reg:CC CSKY_CC_REGNUM))])] 1111 "" 1112 "" 1113) 1114 1115/* Note that the csky subc instruction both reads and writes the C bit. 1116 The purpose of the initial cmphs instruction in the expansion is to 1117 set the C bit before subtracting the lo words. */ 1118 1119(define_insn_and_split "*cskyv2_subdi3" 1120 [(set (match_operand:DI 0 "register_operand" "=&b,&r") 1121 (minus:DI (match_operand:DI 1 "register_operand" "0, r") 1122 (match_operand:DI 2 "register_operand" "b, r"))) 1123 (clobber (reg:CC CSKY_CC_REGNUM))] 1124 "CSKY_ISA_FEATURE (E2)" 1125 "#" 1126 "reload_completed" 1127 [(const_int 0)] 1128 { 1129 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1130 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1131 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1132 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1133 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1134 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1135 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1136 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1137 1138 emit_insn (gen_cmpgeusi_r (copy_rtx (l1), copy_rtx (l1))); 1139 emit_insn (gen_cskyv2_subc (l0, l1, l2)); 1140 emit_insn (gen_cskyv2_subc (h0, h1, h2)); 1141 DONE; 1142 } 1143 [(set_attr "length" "6,12")] 1144) 1145 1146(define_insn_and_split "*ck801_subdi3" 1147 [(set (match_operand:DI 0 "register_operand" "=r") 1148 (minus:DI (match_operand:DI 1 "register_operand" "0") 1149 (match_operand:DI 2 "register_operand" "r"))) 1150 (clobber (reg:CC CSKY_CC_REGNUM))] 1151 "CSKY_ISA_FEATURE (E1)" 1152 "#" 1153 "reload_completed" 1154 [(const_int 0)] 1155 { 1156 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1157 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1158 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1159 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1160 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1161 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1162 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1163 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1164 1165 emit_insn (gen_cmpgeusi_r (copy_rtx (l1), copy_rtx (l1))); 1166 emit_insn (gen_ck801_subc (l0, l1, l2)); 1167 emit_insn (gen_ck801_subc (h0, h1, h2)); 1168 DONE; 1169 } 1170 [(set_attr "length" "6")] 1171) 1172 1173;; Special case for "longlong -= 1". 1174 1175(define_insn_and_split "*cskyv2_subdi1_1" 1176 [(set (match_operand:DI 0 "register_operand" "=&r") 1177 (plus:DI (match_operand:DI 1 "register_operand" "0") 1178 (const_int -1))) 1179 (clobber (reg:CC CSKY_CC_REGNUM))] 1180 "CSKY_ISA_FEATURE (E2)" 1181 "#" 1182 "reload_completed" 1183 [(const_int 0)] 1184 { 1185 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1186 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1187 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1188 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1189 1190 if (TARGET_MINI_REGISTERS) 1191 { 1192 emit_insn (gen_smart_cmpnesi_i (copy_rtx (l0), 1193 gen_int_mode (0, SImode))); 1194 emit_insn (gen_cskyv2_addcc_invert (h0, copy_rtx (h0), 1195 gen_int_mode (-1, SImode))); 1196 emit_insn (gen_smart_subsi3 (l0, copy_rtx (l0), 1197 gen_int_mode (1, SImode))); 1198 } 1199 else 1200 { 1201 emit_insn (gen_fast_cmpnesi_i (copy_rtx (l0), 1202 gen_int_mode (0, SImode))); 1203 emit_insn (gen_cskyv2_addcc_invert (h0, copy_rtx (h0), 1204 gen_int_mode (-1, SImode))); 1205 emit_insn (gen_fast_subsi3 (l0, copy_rtx (l0), 1206 gen_int_mode (1, SImode))); 1207 } 1208 DONE; 1209 } 1210 [(set (attr "length") 1211 (if_then_else (match_test "TARGET_MINI_REGISTERS") 1212 (const_int 8) 1213 (const_int 12)))] 1214) 1215 1216;; Add with carry. 1217 1218(define_insn "cskyv2_addc" 1219 [(set (match_operand:SI 0 "register_operand" "=r,r") 1220 (plus:SI (ne:SI (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1221 (plus:SI (match_operand:SI 1 "register_operand" "%0,r") 1222 (match_operand:SI 2 "register_operand" "r,r")))) 1223 (set (reg:CC CSKY_CC_REGNUM) 1224 (compare:CC 1225 (plus:SI (match_dup 1) (match_dup 2)) 1226 (match_dup 1)))] 1227 "CSKY_ISA_FEATURE (E2)" 1228 "addc\t%0, %1, %2" 1229 [(set_attr "length" "2,4") 1230 (set_attr "type" "addsub")] 1231) 1232 1233(define_insn "ck801_addc" 1234 [(set (match_operand:SI 0 "register_operand" "=r") 1235 (plus:SI (ne:SI (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1236 (plus:SI (match_operand:SI 1 "register_operand" "%0") 1237 (match_operand:SI 2 "register_operand" "r")))) 1238 (set (reg:CC CSKY_CC_REGNUM) 1239 (compare:CC 1240 (plus:SI (match_dup 1) (match_dup 2)) 1241 (match_dup 1)))] 1242 "CSKY_ISA_FEATURE (E1)" 1243 "addc\t%0, %1, %2" 1244 [(set_attr "length" "2") 1245 (set_attr "type" "addsub")] 1246) 1247 1248;; Subtract with borrow. 1249;; Note that in these insns, the sense of C bit is reversed; they subtract 1 1250;; if the C bit is not set, and on output the bit is set to 0 for borrow 1251;; and 1 for no borrow. 1252 1253(define_insn "cskyv2_subc" 1254 [(set (match_operand:SI 0 "register_operand" "=r,r") 1255 (minus:SI (match_operand:SI 1 "register_operand" "0, r") 1256 (plus:SI (match_operand:SI 2 "register_operand" "r, r") 1257 (eq:SI (reg:CC CSKY_CC_REGNUM) (const_int 0))))) 1258 (set (reg:CC CSKY_CC_REGNUM) 1259 (not (compare:CC (match_dup 1) (match_dup 2))))] 1260 "CSKY_ISA_FEATURE (E2)" 1261 "subc\t%0, %1, %2" 1262 [(set_attr "length" "2,4") 1263 (set_attr "type" "addsub")] 1264) 1265 1266(define_insn "ck801_subc" 1267 [(set (match_operand:SI 0 "register_operand" "=r") 1268 (minus:SI (match_operand:SI 1 "register_operand" "0") 1269 (plus:SI (match_operand:SI 2 "register_operand" "r") 1270 (eq:SI (reg:CC CSKY_CC_REGNUM) (const_int 0))))) 1271 (set (reg:CC CSKY_CC_REGNUM) 1272 (not (compare:CC (match_dup 1) (match_dup 2))))] 1273 "CSKY_ISA_FEATURE (E1)" 1274 "subc\t%0, %1, %2" 1275 [(set_attr "length" "2") 1276 (set_attr "type" "addsub")] 1277) 1278 1279;; ------------------------------------------------------------------------ 1280;; Multiplication insns 1281;; ------------------------------------------------------------------------ 1282 1283(define_expand "mulsi3" 1284 [(set (match_operand:SI 0 "register_operand" "") 1285 (mult:SI (match_operand:SI 1 "register_operand" "") 1286 (match_operand:SI 2 "register_operand" "")))] 1287 "" 1288 "" 1289) 1290 1291(define_insn "*cskyv2_mulsi3" 1292 [(set (match_operand:SI 0 "register_operand" "=r") 1293 (mult:SI (match_operand:SI 1 "register_operand" "%r") 1294 (match_operand:SI 2 "register_operand" "r")))] 1295 "CSKY_ISA_FEATURE (E2)" 1296 "mult\t%0, %1, %2" 1297) 1298 1299(define_insn "*ck801_mulsi3" 1300 [(set (match_operand:SI 0 "register_operand" "=r") 1301 (mult:SI (match_operand:SI 1 "register_operand" "%0") 1302 (match_operand:SI 2 "register_operand" "r")))] 1303 "CSKY_ISA_FEATURE (E1)" 1304 "mult\t%0, %1, %2" 1305) 1306 1307(define_insn "mulhisi3" 1308 [(set (match_operand:SI 0 "register_operand" "=r") 1309 (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%r")) 1310 (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] 1311 "CSKY_ISA_FEATURE (2E3)" 1312 "mulsh\t%0, %1, %2" 1313) 1314 1315 1316;; ------------------------------------------------------------------------ 1317;; Conditional add insns 1318;; ------------------------------------------------------------------------ 1319 1320(define_expand "addsicc" 1321 [(match_operand:SI 0 "register_operand" "") 1322 (match_operand 1 "ordered_comparison_operator" "") 1323 (match_operand:SI 2 "register_operand" "") 1324 (match_operand:SI 3 "csky_literal_K_Uh_operand" "")] 1325 "CSKY_ISA_FEATURE (E2)" 1326 " 1327 { 1328 bool invert = csky_emit_compare (GET_CODE (operands[1]), 1329 XEXP (operands[1], 0), 1330 XEXP (operands[1], 1)); 1331 if (invert) 1332 emit_insn (gen_cskyv2_addcc_invert (operands[0], operands[2], 1333 operands[3])); 1334 else 1335 emit_insn (gen_cskyv2_addcc (operands[0], operands[2], operands[3])); 1336 1337 DONE; 1338 }" 1339) 1340 1341(define_insn_and_split "cskyv2_addcc" 1342 [(set (match_operand:SI 0 "register_operand" "=r,r,&r,&r") 1343 (if_then_else:SI 1344 (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1345 (plus:SI (match_operand:SI 1 "register_operand" "0,0,r,r") 1346 (match_operand:SI 2 "csky_literal_K_Uh_operand" "K,Uh,K,Uh")) 1347 (match_dup 1)))] 1348 "CSKY_ISA_FEATURE (E2)" 1349 "@ 1350 inct\t%0, %1, %2 1351 dect\t%0, %1, %M2 1352 # 1353 #" 1354 "reload_completed && !rtx_equal_p (operands[0], operands[1])" 1355 [(set (match_dup 0) 1356 (if_then_else:SI (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1357 (plus:SI (match_dup 0) (match_dup 2))))] 1358 { 1359 emit_insn (gen_movf (copy_rtx (operands[0]), 1360 copy_rtx (operands[1]), 1361 copy_rtx (operands[0]))); 1362 } 1363 [(set_attr "length" "4,4,8,8") 1364 (set_attr "type" "addsub")] 1365) 1366 1367(define_insn_and_split "cskyv2_addcc_invert" 1368 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") 1369 (if_then_else:SI 1370 (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1371 (plus:SI (match_operand:SI 1 "register_operand" "0,0,r,r") 1372 (match_operand:SI 2 "csky_literal_K_Uh_operand" "K,Uh,K,Uh")) 1373 (match_dup 1)))] 1374 "CSKY_ISA_FEATURE (E2)" 1375 "@ 1376 incf\t%0, %1, %2 1377 decf\t%0, %1, %M2 1378 # 1379 #" 1380 "reload_completed && !rtx_equal_p (operands[0], operands[1])" 1381 [(set (match_dup 0) 1382 (if_then_else:SI (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 1383 (plus:SI (match_dup 0) (match_dup 2))))] 1384 { 1385 emit_insn (gen_movt (copy_rtx (operands[0]), 1386 copy_rtx (operands[1]), 1387 copy_rtx (operands[0]))); 1388 } 1389 [(set_attr "length" "4,4,8,8") 1390 (set_attr "type" "addsub")] 1391) 1392 1393 1394;; ------------------------------------------------------------------------ 1395;; Extzv insns 1396;; ------------------------------------------------------------------------ 1397 1398(define_expand "extzvsi" 1399 [(set (match_operand:SI 0 "register_operand" "") 1400 (zero_extract:SI (match_operand:SI 1 "register_operand" "") 1401 (match_operand:SI 2 "const_int_operand" "") 1402 (match_operand:SI 3 "const_int_operand" "")))] 1403 "" 1404 "{ 1405 /* ck802 has xtrb but not zext, so we'll use xtrb if we can. */ 1406 if (CSKY_ISA_FEATURE (E2) && !CSKY_ISA_FEATURE (2E3) 1407 && (INTVAL (operands[2]) == 8) 1408 && (INTVAL (operands[3]) % 8 == 0)) 1409 { 1410 rtx xtrb = gen_rtx_SET (operands[0], 1411 gen_rtx_ZERO_EXTRACT (SImode, 1412 operands[1], 1413 operands[2], 1414 operands[3])); 1415 emit (gen_rtx_PARALLEL (VOIDmode, 1416 gen_rtvec (2, xtrb, 1417 gen_hard_reg_clobber (CCmode, 33)))); 1418 DONE; 1419 } 1420 else if (!CSKY_ISA_FEATURE (2E3)) 1421 { 1422 /* Use lsri and lsli to do extzv on targets without zext. */ 1423 rtx lshft = GEN_INT (32 - (INTVAL (operands[2]) 1424 + INTVAL (operands[3]))); 1425 rtx rshft = GEN_INT (32 - INTVAL (operands[2])); 1426 rtx tmp1 = gen_reg_rtx (SImode); 1427 rtx tmp2 = gen_reg_rtx (SImode); 1428 1429 emit_insn (gen_rtx_SET (tmp1, operands[1])); 1430 emit_insn (gen_rtx_SET (tmp2, gen_rtx_ASHIFT (SImode, tmp1, lshft))); 1431 emit_insn (gen_rtx_SET (operands[0], 1432 gen_rtx_LSHIFTRT (SImode, tmp2, rshft))); 1433 DONE; 1434 } 1435 else 1436 { 1437 emit_insn (gen_cskyv2_extzv (operands[0], operands[1], 1438 operands[2], operands[3])); 1439 DONE; 1440 } 1441}") 1442 1443(define_insn "cskyv2_extzv" 1444 [(set (match_operand:SI 0 "register_operand" "=r") 1445 (zero_extract:SI (match_operand:SI 1 "register_operand" "r") 1446 (match_operand:SI 2 "csky_literal_K_operand" "K") 1447 (match_operand:SI 3 "csky_literal_K_operand" "K")))] 1448 "CSKY_ISA_FEATURE (2E3)" 1449 { 1450 operands[2] = GEN_INT (INTVAL (operands[3]) + INTVAL (operands[2]) - 1); 1451 return \"zext\t%0, %1, %2, %3\"; 1452 } 1453) 1454 1455(define_insn "*cskyv2_xtrb0" 1456 [(set (match_operand:SI 0 "register_operand" "=r,r") 1457 (zero_extract:SI (match_operand:SI 1 "register_operand" "0,r") 1458 (const_int 8) 1459 (const_int 24))) 1460 (clobber (reg:CC CSKY_CC_REGNUM))] 1461 "CSKY_ISA_FEATURE (E2)" 1462 "@ 1463 lsri\t%0, %0, 24 1464 xtrb0\t%0, %1" 1465) 1466 1467(define_insn "*cskyv2_xtrb1" 1468 [(set (match_operand:SI 0 "register_operand" "=r") 1469 (zero_extract:SI (match_operand:SI 1 "register_operand" "r") 1470 (const_int 8) 1471 (const_int 16))) 1472 (clobber (reg:CC CSKY_CC_REGNUM))] 1473 "CSKY_ISA_FEATURE (E2)" 1474 "xtrb1\t%0, %1" 1475) 1476 1477(define_insn "*cskyv2_xtrb2" 1478 [(set (match_operand:SI 0 "register_operand" "=r") 1479 (zero_extract:SI (match_operand:SI 1 "register_operand" "r") 1480 (const_int 8) 1481 (const_int 8))) 1482 (clobber (reg:CC CSKY_CC_REGNUM))] 1483 "CSKY_ISA_FEATURE (E2)" 1484 "xtrb2\t%0, %1" 1485) 1486 1487 1488;; ------------------------------------------------------------------------- 1489;; Zero extension instructions 1490;; ------------------------------------------------------------------------- 1491 1492(define_insn "zero_extendhisi2" 1493 [(set (match_operand:SI 0 "register_operand" "=r") 1494 (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))] 1495 "" 1496 "zexth\t%0, %1" 1497) 1498 1499(define_insn "*cskyv2_zextend_ldh" 1500 [(set (match_operand:SI 0 "register_operand" "=r") 1501 (zero_extend:SI (match_operand:HI 1 "csky_simple_mem_operand" "m")))] 1502 "" 1503 "ld.h\t%0, %1" 1504 [(set_attr "length" "4") 1505 (set_attr "type" "load")] 1506) 1507 1508(define_insn "zero_extendqisi2" 1509 [(set (match_operand:SI 0 "register_operand" "=r") 1510 (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))] 1511 "" 1512 "zextb\t%0, %1" 1513) 1514 1515(define_insn "*cskyv2_zextend_ldb" 1516 [(set (match_operand:SI 0 "register_operand" "=r") 1517 (zero_extend:SI (match_operand:QI 1 "csky_simple_mem_operand" "m")))] 1518 "" 1519 "ld.b\t%0, %1" 1520 [(set_attr "length" "4") 1521 (set_attr "type" "load")] 1522) 1523 1524(define_insn "zero_extendqihi2" 1525 [(set (match_operand:HI 0 "register_operand" "=r") 1526 (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))] 1527 "" 1528 "zextb\t%0, %1" 1529) 1530 1531(define_insn "*cskyv2_zextend_ldbhi" 1532 [(set (match_operand:HI 0 "register_operand" "=r") 1533 (zero_extend:HI (match_operand:QI 1 "csky_simple_mem_operand" "m")))] 1534 "" 1535 "ld.b\t%0, %1" 1536 [(set_attr "length" "4") 1537 (set_attr "type" "load")] 1538) 1539 1540;; ------------------------------------------------------------------------- 1541;; clzm2 instructions 1542;; ------------------------------------------------------------------------- 1543 1544(define_insn "clzsi2" 1545 [(set (match_operand:SI 0 "register_operand" "=r") 1546 (clz:SI (match_operand:SI 1 "register_operand" "r")))] 1547 "CSKY_ISA_FEATURE (E2)" 1548 "ff1 %0,%1" 1549) 1550 1551;; ------------------------------------------------------------------------- 1552;; one_cmplm2 instructions 1553;; ------------------------------------------------------------------------- 1554 1555(define_expand "one_cmplsi2" 1556 [(set (match_operand:SI 0 "register_operand" "") 1557 (not:SI (match_operand:SI 1 "register_operand" "")))] 1558 "" 1559 "" 1560) 1561 1562(define_insn "cskyv2_one_cmplsi2" 1563 [(set (match_operand:SI 0 "register_operand" "=b,r") 1564 (not:SI (match_operand:SI 1 "register_operand" "0,r")))] 1565 "CSKY_ISA_FEATURE (E2)" 1566 "not %0, %1" 1567 [(set_attr "length" "2,4") 1568 (set_attr "type" "alu,alu")] 1569) 1570 1571(define_insn "ck801_one_cmplsi2" 1572 [(set (match_operand:SI 0 "register_operand" "=r") 1573 (not:SI (match_operand:SI 1 "register_operand" "0")))] 1574 "CSKY_ISA_FEATURE (E1)" 1575 "not %0, %1" 1576 [(set_attr "length" "2") 1577 (set_attr "type" "alu")] 1578) 1579 1580;; ------------------------------------------------------------------------- 1581;; Sign extension instructions 1582;; ------------------------------------------------------------------------- 1583 1584;; One test shows that the following code helps to 1585;; reduce one 'load' and two 'mov'. 1586(define_expand "extendsidi2" 1587 [(set (match_operand:DI 0 "register_operand" "=r") 1588 (match_operand:SI 1 "register_operand" "r"))] 1589 "" 1590 "{ 1591 int low, high; 1592 1593 if (TARGET_BIG_ENDIAN) 1594 low = 4, high = 0; 1595 else 1596 low = 0, high = 4; 1597 1598 emit_insn (gen_rtx_SET (gen_rtx_SUBREG (SImode, operands[0], low), 1599 operands[1])); 1600 1601 emit_insn (gen_rtx_SET (gen_rtx_SUBREG (SImode, operands[0], high), 1602 gen_rtx_ASHIFTRT (SImode, 1603 gen_rtx_SUBREG (SImode, 1604 operands[0], 1605 low), 1606 GEN_INT (31)))); 1607 DONE; 1608 }" 1609) 1610 1611(define_insn "extendhisi2" 1612 [(set (match_operand:SI 0 "register_operand" "=r") 1613 (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))] 1614 "" 1615 "sexth %0, %1" 1616) 1617 1618(define_insn "*cskyv2_sextend_ldhs" 1619 [(set (match_operand:SI 0 "register_operand" "=r") 1620 (sign_extend:SI (match_operand:HI 1 "csky_simple_mem_operand" "m")))] 1621 "CSKY_ISA_FEATURE (E2)" 1622 "ld.hs\t%0, %1" 1623 [(set_attr "length" "4") 1624 (set_attr "type" "load")] 1625) 1626 1627;; qi -> si 1628(define_insn "extendqisi2" 1629 [(set (match_operand:SI 0 "register_operand" "=r") 1630 (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))] 1631 "" 1632 "sextb %0, %1" 1633) 1634 1635;; qi -> hi 1636(define_insn "extendqihi2" 1637 [(set (match_operand:HI 0 "register_operand" "=r") 1638 (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))] 1639 "" 1640 "sextb %0, %1" 1641) 1642 1643;; ------------------------------------------------------------------------- 1644;; And instructions 1645;; ------------------------------------------------------------------------- 1646 1647(define_expand "andsi3" 1648 [(set (match_operand:SI 0 "register_operand" "") 1649 (and:SI (match_operand:SI 1 "register_operand" "") 1650 (match_operand:SI 2 "csky_arith_any_imm_operand" "")))] 1651 "" 1652 "") 1653 1654(define_insn_and_split "cskyv2_andsi3" 1655 [(set (match_operand:SI 0 "register_operand" "=b,r,r,&r") 1656 (and:SI (match_operand:SI 1 "register_operand" "%0,r,r,r") 1657 (match_operand:SI 2 "csky_arith_any_imm_operand" "b,r,O,i")))] 1658 "CSKY_ISA_FEATURE (E2)" 1659 "@ 1660 and\t%0, %1, %2 1661 and\t%0, %1, %2 1662 andi\t%0, %1, %2 1663 #" 1664 "(CONST_INT_P (operands[2]) 1665 && (operands[2] == const0_rtx 1666 || !csky_arith_O_operand (operands[2], SImode)))" 1667 [(set (match_dup 0) (and:SI (match_dup 1) (match_dup 2)))] 1668 { 1669 if (csky_split_and (operands)) 1670 DONE; 1671 } 1672 [(set_attr "length" "2,4,4,8") 1673 (set_attr "type" "alu,alu,alu,alu")] 1674) 1675 1676(define_insn_and_split "ck801_andsi3" 1677 [(set (match_operand:SI 0 "register_operand" "=r,&r") 1678 (and:SI (match_operand:SI 1 "register_operand" "%0,r") 1679 (match_operand:SI 2 "csky_arith_any_imm_operand" "r,i")))] 1680 "CSKY_ISA_FEATURE (E1)" 1681 "@ 1682 and\t%0, %1, %2 1683 #" 1684 "CONST_INT_P (operands[2])" 1685 [(set (match_dup 0) (and:SI (match_dup 1) (match_dup 2)))] 1686 { 1687 if (csky_split_and (operands)) 1688 DONE; 1689 } 1690 [(set_attr "length" "2,4") 1691 (set_attr "type" "alu,alu")] 1692) 1693 1694;; Note that the operands for the andnsi3 patterns are reversed compared 1695;; to the actual machine insn: operand 1 is the inverted operand. 1696 1697(define_insn "cskyv2_andnsi3" 1698 [(use (and:SI (not:SI (match_operand:SI 1 "csky_arith_O_operand" "b,r,O")) 1699 (match_operand:SI 2 "register_operand" "0,r,r"))) 1700 (set (match_operand:SI 0 "register_operand" "=b,r,r") 1701 (and:SI (not:SI (match_dup 1)) 1702 (match_dup 2)))] 1703 "CSKY_ISA_FEATURE (E2)" 1704 "@ 1705 andn\t%0, %2, %1 1706 andn\t%0, %2, %1 1707 andni\t%0, %2, %1" 1708 [(set_attr "length" "2,4,4") 1709 (set_attr "type" "alu,alu,alu")] 1710) 1711 1712(define_insn "ck801_andnsi3" 1713 [(use (and:SI (not:SI (match_operand:SI 1 "register_operand" "r")) 1714 (match_operand:SI 2 "register_operand" "0"))) 1715 (set (match_operand:SI 0 "register_operand" "=r") 1716 (and:SI (not:SI (match_dup 1)) 1717 (match_dup 2)))] 1718 "CSKY_ISA_FEATURE (E1)" 1719 "andn\t%0, %2, %1" 1720) 1721 1722(define_expand "anddi3" 1723 [(set (match_operand:DI 0 "register_operand" "") 1724 (and:DI (match_operand:DI 1 "register_operand" "") 1725 (match_operand:DI 2 "csky_arith_any_imm_operand" "")))] 1726 "" 1727 " 1728 { 1729 if (CONST_INT_P (operands[2])) 1730 { 1731 HOST_WIDE_INT ival = INTVAL (operands[2]); 1732 if (ival == (HOST_WIDE_INT) 0xffffffff) 1733 { 1734 emit_move_insn (gen_lowpart (SImode, operands[0]), 1735 gen_lowpart (SImode, operands[1])); 1736 emit_move_insn (gen_highpart (SImode, operands[0]), const0_rtx); 1737 DONE; 1738 } 1739 else if (ival == (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) -1 << 32)) 1740 { 1741 emit_move_insn (gen_lowpart (SImode, operands[0]), const0_rtx); 1742 emit_move_insn (gen_highpart (SImode, operands[0]), 1743 gen_highpart (SImode, operands[1])); 1744 DONE; 1745 } 1746 else 1747 FAIL; 1748 } 1749 }") 1750 1751 1752 1753(define_insn_and_split "*cskyv2_anddi3" 1754 [(set (match_operand:DI 0 "register_operand" "=&b,&r") 1755 (and:DI (match_operand:DI 1 "register_operand" "%0,r") 1756 (match_operand:DI 2 "register_operand" "b,r")))] 1757 "CSKY_ISA_FEATURE (E2)" 1758 "#" 1759 "reload_completed" 1760 [(const_int 0)] 1761 { 1762 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1763 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1764 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1765 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1766 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1767 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1768 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1769 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1770 1771 emit_insn (gen_cskyv2_andsi3 (l0, l1, l2)); 1772 emit_insn (gen_cskyv2_andsi3 (h0, h1, h2)); 1773 DONE; 1774 } 1775 [(set_attr "length" "4,8")] 1776) 1777 1778(define_insn_and_split "*ck801_anddi3" 1779 [(set (match_operand:DI 0 "register_operand" "=&r") 1780 (and:DI (match_operand:DI 1 "register_operand" "%0") 1781 (match_operand:DI 2 "register_operand" "r")))] 1782 "CSKY_ISA_FEATURE (E1)" 1783 "#" 1784 "reload_completed" 1785 [(const_int 0)] 1786 { 1787 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1788 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1789 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1790 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1791 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1792 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1793 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1794 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1795 1796 emit_insn (gen_ck801_andsi3 (l0, l1, l2)); 1797 emit_insn (gen_ck801_andsi3 (h0, h1, h2)); 1798 DONE; 1799 } 1800 [(set_attr "length" "4")] 1801) 1802 1803 1804;; ------------------------------------------------------------------------- 1805;; Ior instructions 1806;; ------------------------------------------------------------------------- 1807 1808(define_expand "iorsi3" 1809 [(set (match_operand:SI 0 "register_operand" "") 1810 (ior:SI (match_operand:SI 1 "register_operand" "") 1811 (match_operand:SI 2 "csky_arith_any_imm_operand" "")))] 1812 "" 1813 "") 1814 1815(define_insn_and_split "cskyv2_iorsi3" 1816 [(set (match_operand:SI 0 "register_operand" "=b,r,r,&r") 1817 (ior:SI (match_operand:SI 1 "register_operand" "%0,r,r,r") 1818 (match_operand:SI 2 "csky_arith_any_imm_operand" "b, r,I,i")))] 1819 "CSKY_ISA_FEATURE (E2)" 1820 "@ 1821 or\t%0, %1, %2 1822 or\t%0, %1, %2 1823 ori\t%0, %1, %2 1824 #" 1825 "(CONST_INT_P (operands[2]) 1826 && (operands[2] == const0_rtx 1827 || !csky_literal_I_operand (operands[2], SImode)))" 1828 [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2)))] 1829 { 1830 if (csky_split_ior (operands)) 1831 DONE; 1832 } 1833 [(set_attr "length" "2,4,4,8") 1834 (set_attr "type" "alu,alu,alu,alu")] 1835) 1836 1837(define_insn_and_split "ck801_iorsi3" 1838 [(set (match_operand:SI 0 "register_operand" "=r,&r") 1839 (ior:SI (match_operand:SI 1 "register_operand" "%0,r") 1840 (match_operand:SI 2 "csky_arith_any_imm_operand" "r,i")))] 1841 "CSKY_ISA_FEATURE (E1)" 1842 "@ 1843 or\t%0, %1, %2 1844 #" 1845 "CONST_INT_P (operands[2])" 1846 [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2)))] 1847 { 1848 if (csky_split_ior (operands)) 1849 DONE; 1850 } 1851 [(set_attr "length" "2,4") 1852 (set_attr "type" "alu,alu")] 1853) 1854 1855(define_expand "iordi3" 1856 [(set (match_operand:DI 0 "register_operand" "") 1857 (ior:DI (match_operand:DI 1 "register_operand" "") 1858 (match_operand:DI 2 "register_operand" "")))] 1859 "" 1860 "" 1861) 1862 1863(define_insn_and_split "*cskyv2_iordi3" 1864 [(set (match_operand:DI 0 "register_operand" "=&b,&r") 1865 (ior:DI (match_operand:DI 1 "register_operand" "%0, r") 1866 (match_operand:DI 2 "register_operand" "b, r")))] 1867 "CSKY_ISA_FEATURE (E2)" 1868 "#" 1869 "reload_completed" 1870 [(const_int 0)] 1871 { 1872 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1873 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1874 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1875 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1876 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1877 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1878 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1879 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1880 1881 emit_insn (gen_cskyv2_iorsi3 (l0, l1, l2)); 1882 emit_insn (gen_cskyv2_iorsi3 (h0, h1, h2)); 1883 DONE; 1884 } 1885 [(set_attr "length" "4,8")] 1886) 1887 1888(define_insn_and_split "*ck801_iordi3" 1889 [(set (match_operand:DI 0 "register_operand" "=&r") 1890 (ior:DI (match_operand:DI 1 "register_operand" "%0") 1891 (match_operand:DI 2 "register_operand" "r")))] 1892 "CSKY_ISA_FEATURE (E1)" 1893 "#" 1894 "reload_completed" 1895 [(const_int 0)] 1896 { 1897 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1898 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1899 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1900 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1901 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1902 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1903 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1904 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1905 1906 emit_insn (gen_ck801_iorsi3 (l0, l1, l2)); 1907 emit_insn (gen_ck801_iorsi3 (h0, h1, h2)); 1908 DONE; 1909 } 1910 [(set_attr "length" "4")] 1911) 1912 1913 1914;; ------------------------------------------------------------------------- 1915;; Xor instructions 1916;; ------------------------------------------------------------------------- 1917 1918(define_expand "xorsi3" 1919 [(set (match_operand:SI 0 "register_operand" "") 1920 (xor:SI (match_operand:SI 1 "register_operand" "") 1921 (match_operand:SI 2 "csky_arith_any_imm_operand" "")))] 1922 "" 1923 "") 1924 1925(define_insn_and_split "cskyv2_xorsi3" 1926 [(set (match_operand:SI 0 "register_operand" "=b,r,r,&r") 1927 (xor:SI (match_operand:SI 1 "register_operand" "%0,r,r,r") 1928 (match_operand:SI 2 "csky_arith_any_imm_operand" "b, r,O,i")))] 1929 "CSKY_ISA_FEATURE (E2)" 1930 "@ 1931 xor\t%0, %1, %2 1932 xor\t%0, %1, %2 1933 xori\t%0, %1, %2 1934 #" 1935 "(CONST_INT_P (operands[2]) 1936 && (operands[2] == const0_rtx 1937 || !csky_arith_O_operand (operands[2], SImode)))" 1938 [(set (match_dup 0) (xor:SI (match_dup 1) (match_dup 2)))] 1939 { 1940 if (csky_split_xor (operands)) 1941 DONE; 1942 } 1943 [(set_attr "length" "2,4,4,8") 1944 (set_attr "type" "alu,alu,alu,alu")] 1945) 1946 1947(define_insn_and_split "ck801_xorsi3" 1948 [(set (match_operand:SI 0 "register_operand" "=r,&r") 1949 (xor:SI (match_operand:SI 1 "register_operand" "%0,r") 1950 (match_operand:SI 2 "csky_arith_any_imm_operand" "r,i")))] 1951 "CSKY_ISA_FEATURE (E1)" 1952 "@ 1953 xor\t%0, %1, %2 1954 #" 1955 "CONST_INT_P (operands[2])" 1956 [(set (match_dup 0) (xor:SI (match_dup 1) (match_dup 2)))] 1957 { 1958 if (csky_split_xor (operands)) 1959 DONE; 1960 } 1961 [(set_attr "length" "2,4") 1962 (set_attr "type" "alu,alu")] 1963) 1964 1965(define_expand "xordi3" 1966 [(set (match_operand:DI 0 "register_operand" "") 1967 (xor:DI (match_operand:DI 1 "register_operand" "") 1968 (match_operand:DI 2 "register_operand" "")))] 1969 "" 1970 "" 1971) 1972 1973(define_insn_and_split "*cskyv2_xordi3" 1974 [(set (match_operand:DI 0 "register_operand" "=&b,&r") 1975 (xor:DI (match_operand:DI 1 "register_operand" "%0, r") 1976 (match_operand:DI 2 "register_operand" "b, r")))] 1977 "CSKY_ISA_FEATURE (E2)" 1978 "#" 1979 "reload_completed" 1980 [(const_int 0)] 1981 { 1982 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 1983 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 1984 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 1985 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 1986 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 1987 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 1988 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 1989 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 1990 1991 emit_insn (gen_cskyv2_xorsi3 (l0, l1, l2)); 1992 emit_insn (gen_cskyv2_xorsi3 (h0, h1, h2)); 1993 DONE; 1994 } 1995 [(set_attr "length" "4,8")] 1996) 1997 1998(define_insn_and_split "*ck801_xordi3" 1999 [(set (match_operand:DI 0 "register_operand" "=&r") 2000 (xor:DI (match_operand:DI 1 "register_operand" "%0") 2001 (match_operand:DI 2 "register_operand" "r")))] 2002 "CSKY_ISA_FEATURE (E1)" 2003 "#" 2004 "reload_completed" 2005 [(const_int 0)] 2006 { 2007 int hi = TARGET_BIG_ENDIAN ? 0 : UNITS_PER_WORD; 2008 int lo = TARGET_BIG_ENDIAN ? UNITS_PER_WORD : 0; 2009 rtx l0 = simplify_gen_subreg (SImode, operands[0], DImode, lo); 2010 rtx h0 = simplify_gen_subreg (SImode, operands[0], DImode, hi); 2011 rtx l1 = simplify_gen_subreg (SImode, operands[1], DImode, lo); 2012 rtx h1 = simplify_gen_subreg (SImode, operands[1], DImode, hi); 2013 rtx l2 = simplify_gen_subreg (SImode, operands[2], DImode, lo); 2014 rtx h2 = simplify_gen_subreg (SImode, operands[2], DImode, hi); 2015 2016 emit_insn (gen_ck801_xorsi3 (l0, l1, l2)); 2017 emit_insn (gen_ck801_xorsi3 (h0, h1, h2)); 2018 DONE; 2019 } 2020 [(set_attr "length" "4")] 2021) 2022 2023;; ------------------------------------------------------------------------- 2024;; Div instructions 2025;; ------------------------------------------------------------------------- 2026 2027(define_insn "divsi3" 2028 [(set (match_operand:SI 0 "register_operand" "=r") 2029 (div:SI (match_operand:SI 1 "register_operand" "r") 2030 (match_operand:SI 2 "register_operand" "r")))] 2031 "TARGET_DIV" 2032 "divs\t%0, %1, %2" 2033) 2034 2035(define_insn "udivsi3" 2036 [(set (match_operand:SI 0 "register_operand" "=r") 2037 (udiv:SI (match_operand:SI 1 "register_operand" "r") 2038 (match_operand:SI 2 "register_operand" "r")))] 2039 "TARGET_DIV" 2040 "divu\t%0, %1, %2" 2041) 2042 2043 2044;; ----------------------------------------------------------------- 2045;; Multiple load and store insns 2046;; ----------------------------------------------------------------- 2047 2048(define_expand "load_multiple" 2049 [(match_par_dup 3 [(set (match_operand:SI 0 "" "") 2050 (match_operand:SI 1 "" "")) 2051 (use (match_operand:SI 2 "" ""))])] 2052 "TARGET_MULTIPLE_STLD" 2053 "{ 2054 int regno, count, i; 2055 rtx base,src; 2056 2057 if (GET_CODE (operands[2]) != CONST_INT 2058 || INTVAL (operands[2]) < 2 2059 || INTVAL (operands[2]) > CSKY_MAX_MULTIPLE_STLD 2060 || GET_CODE (operands[1]) != MEM 2061 || !REG_P (XEXP (operands[1], 0)) 2062 || XEXP (operands[1], 0) != stack_pointer_rtx 2063 || GET_CODE (operands[0]) != REG 2064 || (REGNO (XEXP (operands[1], 0)) > REGNO (operands[0]) 2065 && (REGNO (XEXP (operands[1], 0)) 2066 < REGNO (operands[0]) + INTVAL (operands[2])))) 2067 FAIL; 2068 2069 count = INTVAL (operands[2]); 2070 regno = REGNO (operands[0]); 2071 2072 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count)); 2073 2074 base = force_reg (SImode, XEXP (operands[1], 0)); 2075 src = replace_equiv_address (operands[1], base); 2076 2077 for (i = 0; i < count; i++) 2078 XVECEXP (operands[3], 0, i) 2079 = gen_rtx_SET (gen_rtx_REG (SImode, regno + i), 2080 adjust_address_nv (src, SImode, i * 4)); 2081 }" 2082) 2083 2084(define_expand "store_multiple" 2085 [(match_par_dup 3 [(set (match_operand:SI 0 "") 2086 (match_operand:SI 1 "")) 2087 (use (match_operand:SI 2 ""))])] 2088 "TARGET_MULTIPLE_STLD" 2089 "{ 2090 int regno, count, i; 2091 rtx base, dest; 2092 2093 /* Support only storing a constant number of registers to memory and 2094 only if at least two registers. */ 2095 if (GET_CODE (operands[2]) != CONST_INT 2096 || INTVAL (operands[2]) < 2 2097 || INTVAL (operands[2]) > CSKY_MAX_MULTIPLE_STLD 2098 || GET_CODE (operands[0]) != MEM 2099 || !REG_P (XEXP (operands[0], 0)) 2100 || XEXP (operands[0], 0) != stack_pointer_rtx 2101 || GET_CODE (operands[1]) != REG 2102 || (REGNO (XEXP (operands[0], 0)) >= REGNO (operands[1]) 2103 && (REGNO (XEXP (operands[0], 0)) 2104 < REGNO (operands[1]) + INTVAL (operands[2])))) 2105 FAIL; 2106 2107 count = INTVAL (operands[2]); 2108 regno = REGNO (operands[1]); 2109 2110 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count)); 2111 2112 base = force_reg (SImode, XEXP (operands[0], 0)); 2113 dest = replace_equiv_address (operands[0], base); 2114 2115 for (i = 0; i < count; i++) 2116 XVECEXP (operands[3], 0, i) 2117 = gen_rtx_SET (adjust_address_nv (dest, SImode, i * 4), 2118 gen_rtx_REG (SImode, regno + i)); 2119 }" 2120) 2121 2122 2123(define_insn "*csky_ldmsi12" 2124 [(match_parallel 0 "csky_load_multiple_operation" 2125 [(set (match_operand:SI 1 "register_operand" "=r") 2126 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2127 (set (match_operand:SI 3 "register_operand" "=r") 2128 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2129 (set (match_operand:SI 4 "register_operand" "=r") 2130 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2131 (set (match_operand:SI 5 "register_operand" "=r") 2132 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2133 (set (match_operand:SI 6 "register_operand" "=r") 2134 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2135 (set (match_operand:SI 7 "register_operand" "=r") 2136 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2137 (set (match_operand:SI 8 "register_operand" "=r") 2138 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2139 (set (match_operand:SI 9 "register_operand" "=r") 2140 (mem:SI (plus:SI (match_dup 2) (const_int 28)))) 2141 (set (match_operand:SI 10 "register_operand" "=r") 2142 (mem:SI (plus:SI (match_dup 2) (const_int 32)))) 2143 (set (match_operand:SI 11 "register_operand" "=r") 2144 (mem:SI (plus:SI (match_dup 2) (const_int 36)))) 2145 (set (match_operand:SI 12 "register_operand" "=r") 2146 (mem:SI (plus:SI (match_dup 2) (const_int 40)))) 2147 (set (match_operand:SI 13 "register_operand" "=r") 2148 (mem:SI (plus:SI (match_dup 2) (const_int 44)))) 2149 ])] 2150 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 12" 2151 { 2152 static char load_op[256] = {0}; 2153 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2154 const char *reg_rz = reg_names[count]; 2155 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2156 return load_op; 2157 } 2158) 2159 2160(define_insn "*csky_ldmsi11" 2161 [(match_parallel 0 "csky_load_multiple_operation" 2162 [(set (match_operand:SI 1 "register_operand" "=r") 2163 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2164 (set (match_operand:SI 3 "register_operand" "=r") 2165 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2166 (set (match_operand:SI 4 "register_operand" "=r") 2167 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2168 (set (match_operand:SI 5 "register_operand" "=r") 2169 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2170 (set (match_operand:SI 6 "register_operand" "=r") 2171 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2172 (set (match_operand:SI 7 "register_operand" "=r") 2173 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2174 (set (match_operand:SI 8 "register_operand" "=r") 2175 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2176 (set (match_operand:SI 9 "register_operand" "=r") 2177 (mem:SI (plus:SI (match_dup 2) (const_int 28)))) 2178 (set (match_operand:SI 10 "register_operand" "=r") 2179 (mem:SI (plus:SI (match_dup 2) (const_int 32)))) 2180 (set (match_operand:SI 11 "register_operand" "=r") 2181 (mem:SI (plus:SI (match_dup 2) (const_int 36)))) 2182 (set (match_operand:SI 12 "register_operand" "=r") 2183 (mem:SI (plus:SI (match_dup 2) (const_int 40)))) 2184 ])] 2185 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 11" 2186 { 2187 static char load_op[256] = {0}; 2188 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2189 const char *reg_rz = reg_names[count]; 2190 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2191 return load_op; 2192 } 2193) 2194 2195(define_insn "*csky_ldmsi10" 2196 [(match_parallel 0 "csky_load_multiple_operation" 2197 [(set (match_operand:SI 1 "register_operand" "=r") 2198 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2199 (set (match_operand:SI 3 "register_operand" "=r") 2200 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2201 (set (match_operand:SI 4 "register_operand" "=r") 2202 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2203 (set (match_operand:SI 5 "register_operand" "=r") 2204 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2205 (set (match_operand:SI 6 "register_operand" "=r") 2206 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2207 (set (match_operand:SI 7 "register_operand" "=r") 2208 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2209 (set (match_operand:SI 8 "register_operand" "=r") 2210 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2211 (set (match_operand:SI 9 "register_operand" "=r") 2212 (mem:SI (plus:SI (match_dup 2) (const_int 28)))) 2213 (set (match_operand:SI 10 "register_operand" "=r") 2214 (mem:SI (plus:SI (match_dup 2) (const_int 32)))) 2215 (set (match_operand:SI 11 "register_operand" "=r") 2216 (mem:SI (plus:SI (match_dup 2) (const_int 36)))) 2217 ])] 2218 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 10" 2219 { 2220 static char load_op[256] = {0}; 2221 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2222 const char *reg_rz = reg_names[count]; 2223 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2224 return load_op; 2225 } 2226) 2227 2228(define_insn "*csky_ldmsi9" 2229 [(match_parallel 0 "csky_load_multiple_operation" 2230 [(set (match_operand:SI 1 "register_operand" "=r") 2231 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2232 (set (match_operand:SI 3 "register_operand" "=r") 2233 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2234 (set (match_operand:SI 4 "register_operand" "=r") 2235 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2236 (set (match_operand:SI 5 "register_operand" "=r") 2237 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2238 (set (match_operand:SI 6 "register_operand" "=r") 2239 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2240 (set (match_operand:SI 7 "register_operand" "=r") 2241 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2242 (set (match_operand:SI 8 "register_operand" "=r") 2243 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2244 (set (match_operand:SI 9 "register_operand" "=r") 2245 (mem:SI (plus:SI (match_dup 2) (const_int 28)))) 2246 (set (match_operand:SI 10 "register_operand" "=r") 2247 (mem:SI (plus:SI (match_dup 2) (const_int 32)))) 2248 ])] 2249 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 9" 2250 { 2251 static char load_op[256] = {0}; 2252 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2253 const char *reg_rz = reg_names[count]; 2254 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2255 return load_op; 2256 } 2257) 2258 2259(define_insn "*csky_ldmsi8" 2260 [(match_parallel 0 "csky_load_multiple_operation" 2261 [(set (match_operand:SI 1 "register_operand" "=r") 2262 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2263 (set (match_operand:SI 3 "register_operand" "=r") 2264 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2265 (set (match_operand:SI 4 "register_operand" "=r") 2266 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2267 (set (match_operand:SI 5 "register_operand" "=r") 2268 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2269 (set (match_operand:SI 6 "register_operand" "=r") 2270 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2271 (set (match_operand:SI 7 "register_operand" "=r") 2272 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2273 (set (match_operand:SI 8 "register_operand" "=r") 2274 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2275 (set (match_operand:SI 9 "register_operand" "=r") 2276 (mem:SI (plus:SI (match_dup 2) (const_int 28)))) 2277 ])] 2278 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 8" 2279 { 2280 static char load_op[256] = {0}; 2281 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2282 const char *reg_rz = reg_names[count]; 2283 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2284 return load_op; 2285 } 2286) 2287 2288(define_insn "*csky_ldmsi7" 2289 [(match_parallel 0 "csky_load_multiple_operation" 2290 [(set (match_operand:SI 1 "register_operand" "=r") 2291 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2292 (set (match_operand:SI 3 "register_operand" "=r") 2293 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2294 (set (match_operand:SI 4 "register_operand" "=r") 2295 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2296 (set (match_operand:SI 5 "register_operand" "=r") 2297 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2298 (set (match_operand:SI 6 "register_operand" "=r") 2299 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2300 (set (match_operand:SI 7 "register_operand" "=r") 2301 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2302 (set (match_operand:SI 8 "register_operand" "=r") 2303 (mem:SI (plus:SI (match_dup 2) (const_int 24)))) 2304 ])] 2305 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 7" 2306 { 2307 static char load_op[256] = {0}; 2308 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2309 const char *reg_rz = reg_names[count]; 2310 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2311 return load_op; 2312 } 2313) 2314 2315(define_insn "*csky_ldmsi6" 2316 [(match_parallel 0 "csky_load_multiple_operation" 2317 [(set (match_operand:SI 1 "register_operand" "=r") 2318 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2319 (set (match_operand:SI 3 "register_operand" "=r") 2320 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2321 (set (match_operand:SI 4 "register_operand" "=r") 2322 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2323 (set (match_operand:SI 5 "register_operand" "=r") 2324 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2325 (set (match_operand:SI 6 "register_operand" "=r") 2326 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2327 (set (match_operand:SI 7 "register_operand" "=r") 2328 (mem:SI (plus:SI (match_dup 2) (const_int 20)))) 2329 ])] 2330 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 6" 2331 { 2332 static char load_op[256] = {0}; 2333 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2334 const char *reg_rz = reg_names[count]; 2335 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2336 return load_op; 2337 } 2338) 2339 2340 2341(define_insn "*csky_ldmsi5" 2342 [(match_parallel 0 "csky_load_multiple_operation" 2343 [(set (match_operand:SI 1 "register_operand" "=r") 2344 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2345 (set (match_operand:SI 3 "register_operand" "=r") 2346 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2347 (set (match_operand:SI 4 "register_operand" "=r") 2348 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2349 (set (match_operand:SI 5 "register_operand" "=r") 2350 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2351 (set (match_operand:SI 6 "register_operand" "=r") 2352 (mem:SI (plus:SI (match_dup 2) (const_int 16)))) 2353 ])] 2354 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 5" 2355 { 2356 static char load_op[256] = {0}; 2357 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2358 const char *reg_rz = reg_names[count]; 2359 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2360 return load_op; 2361 } 2362) 2363 2364 2365(define_insn "*csky_ldmsi4" 2366 [(match_parallel 0 "csky_load_multiple_operation" 2367 [(set (match_operand:SI 1 "register_operand" "=r") 2368 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2369 (set (match_operand:SI 3 "register_operand" "=r") 2370 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2371 (set (match_operand:SI 4 "register_operand" "=r") 2372 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2373 (set (match_operand:SI 5 "register_operand" "=r") 2374 (mem:SI (plus:SI (match_dup 2) (const_int 12)))) 2375 ])] 2376 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 4" 2377 { 2378 static char load_op[256] = {0}; 2379 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2380 const char *reg_rz = reg_names[count]; 2381 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2382 return load_op; 2383 } 2384) 2385 2386 2387(define_insn "*csky_ldmsi3" 2388 [(match_parallel 0 "csky_load_multiple_operation" 2389 [(set (match_operand:SI 1 "register_operand" "=r") 2390 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2391 (set (match_operand:SI 3 "register_operand" "=r") 2392 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2393 (set (match_operand:SI 4 "register_operand" "=r") 2394 (mem:SI (plus:SI (match_dup 2) (const_int 8)))) 2395 ])] 2396 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 3" 2397 { 2398 static char load_op[256] = {0}; 2399 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2400 const char *reg_rz = reg_names[count]; 2401 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2402 return load_op; 2403 } 2404) 2405 2406 2407(define_insn "*csky_ldmsi2" 2408 [(match_parallel 0 "csky_load_multiple_operation" 2409 [(set (match_operand:SI 1 "register_operand" "=r") 2410 (mem:SI (match_operand:SI 2 "register_operand" "r"))) 2411 (set (match_operand:SI 3 "register_operand" "=r") 2412 (mem:SI (plus:SI (match_dup 2) (const_int 4)))) 2413 ])] 2414 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 2" 2415 { 2416 static char load_op[256] = {0}; 2417 int count = REGNO (operands[1]) + XVECLEN (operands[0], 0) - 1; 2418 const char *reg_rz = reg_names[count]; 2419 sprintf (load_op, \"ldm\t%%1 - %s, (%%2)\", reg_rz); 2420 return load_op; 2421 } 2422) 2423 2424(define_insn "*csky_stmsi12" 2425 [(match_parallel 0 "csky_store_multiple_operation" 2426 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2427 (match_operand:SI 2 "register_operand" "r")) 2428 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2429 (match_operand:SI 3 "register_operand" "r")) 2430 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2431 (match_operand:SI 4 "register_operand" "r")) 2432 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2433 (match_operand:SI 5 "register_operand" "r")) 2434 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2435 (match_operand:SI 6 "register_operand" "r")) 2436 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2437 (match_operand:SI 7 "register_operand" "r")) 2438 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2439 (match_operand:SI 8 "register_operand" "r")) 2440 (set (mem:SI (plus:SI (match_dup 1) (const_int 28))) 2441 (match_operand:SI 9 "register_operand" "r")) 2442 (set (mem:SI (plus:SI (match_dup 1) (const_int 32))) 2443 (match_operand:SI 10 "register_operand" "r")) 2444 (set (mem:SI (plus:SI (match_dup 1) (const_int 36))) 2445 (match_operand:SI 11 "register_operand" "r")) 2446 (set (mem:SI (plus:SI (match_dup 1) (const_int 40))) 2447 (match_operand:SI 12 "register_operand" "r")) 2448 (set (mem:SI (plus:SI (match_dup 1) (const_int 44))) 2449 (match_operand:SI 13 "register_operand" "r")) 2450 ])] 2451 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 12" 2452 { 2453 static char load_op[256] = {0}; 2454 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2455 const char *reg_rz = reg_names[end]; 2456 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2457 return load_op; 2458 } 2459) 2460 2461 2462(define_insn "*csky_stmsi11" 2463 [(match_parallel 0 "csky_store_multiple_operation" 2464 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2465 (match_operand:SI 2 "register_operand" "r")) 2466 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2467 (match_operand:SI 3 "register_operand" "r")) 2468 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2469 (match_operand:SI 4 "register_operand" "r")) 2470 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2471 (match_operand:SI 5 "register_operand" "r")) 2472 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2473 (match_operand:SI 6 "register_operand" "r")) 2474 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2475 (match_operand:SI 7 "register_operand" "r")) 2476 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2477 (match_operand:SI 8 "register_operand" "r")) 2478 (set (mem:SI (plus:SI (match_dup 1) (const_int 28))) 2479 (match_operand:SI 9 "register_operand" "r")) 2480 (set (mem:SI (plus:SI (match_dup 1) (const_int 32))) 2481 (match_operand:SI 10 "register_operand" "r")) 2482 (set (mem:SI (plus:SI (match_dup 1) (const_int 36))) 2483 (match_operand:SI 11 "register_operand" "r")) 2484 (set (mem:SI (plus:SI (match_dup 1) (const_int 40))) 2485 (match_operand:SI 12 "register_operand" "r")) 2486 ])] 2487 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 11" 2488 { 2489 static char load_op[256] = {0}; 2490 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2491 const char *reg_rz = reg_names[end]; 2492 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2493 return load_op; 2494 } 2495) 2496 2497 2498(define_insn "*csky_stmsi10" 2499 [(match_parallel 0 "csky_store_multiple_operation" 2500 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2501 (match_operand:SI 2 "register_operand" "r")) 2502 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2503 (match_operand:SI 3 "register_operand" "r")) 2504 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2505 (match_operand:SI 4 "register_operand" "r")) 2506 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2507 (match_operand:SI 5 "register_operand" "r")) 2508 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2509 (match_operand:SI 6 "register_operand" "r")) 2510 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2511 (match_operand:SI 7 "register_operand" "r")) 2512 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2513 (match_operand:SI 8 "register_operand" "r")) 2514 (set (mem:SI (plus:SI (match_dup 1) (const_int 28))) 2515 (match_operand:SI 9 "register_operand" "r")) 2516 (set (mem:SI (plus:SI (match_dup 1) (const_int 32))) 2517 (match_operand:SI 10 "register_operand" "r")) 2518 (set (mem:SI (plus:SI (match_dup 1) (const_int 36))) 2519 (match_operand:SI 11 "register_operand" "r")) 2520 ])] 2521 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 10" 2522 { 2523 static char load_op[256] = {0}; 2524 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2525 const char *reg_rz = reg_names[end]; 2526 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2527 return load_op; 2528 } 2529) 2530 2531 2532(define_insn "*csky_stmsi9" 2533 [(match_parallel 0 "csky_store_multiple_operation" 2534 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2535 (match_operand:SI 2 "register_operand" "r")) 2536 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2537 (match_operand:SI 3 "register_operand" "r")) 2538 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2539 (match_operand:SI 4 "register_operand" "r")) 2540 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2541 (match_operand:SI 5 "register_operand" "r")) 2542 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2543 (match_operand:SI 6 "register_operand" "r")) 2544 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2545 (match_operand:SI 7 "register_operand" "r")) 2546 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2547 (match_operand:SI 8 "register_operand" "r")) 2548 (set (mem:SI (plus:SI (match_dup 1) (const_int 28))) 2549 (match_operand:SI 9 "register_operand" "r")) 2550 (set (mem:SI (plus:SI (match_dup 1) (const_int 32))) 2551 (match_operand:SI 10 "register_operand" "r")) 2552 ])] 2553 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 9" 2554 { 2555 static char load_op[256] = {0}; 2556 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2557 const char *reg_rz = reg_names[end]; 2558 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2559 return load_op; 2560 } 2561) 2562 2563 2564(define_insn "*csky_stmsi8" 2565 [(match_parallel 0 "csky_store_multiple_operation" 2566 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2567 (match_operand:SI 2 "register_operand" "r")) 2568 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2569 (match_operand:SI 3 "register_operand" "r")) 2570 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2571 (match_operand:SI 4 "register_operand" "r")) 2572 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2573 (match_operand:SI 5 "register_operand" "r")) 2574 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2575 (match_operand:SI 6 "register_operand" "r")) 2576 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2577 (match_operand:SI 7 "register_operand" "r")) 2578 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2579 (match_operand:SI 8 "register_operand" "r")) 2580 (set (mem:SI (plus:SI (match_dup 1) (const_int 28))) 2581 (match_operand:SI 9 "register_operand" "r")) 2582 ])] 2583 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 8" 2584 { 2585 static char load_op[256] = {0}; 2586 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2587 const char *reg_rz = reg_names[end]; 2588 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2589 return load_op; 2590 } 2591) 2592 2593 2594(define_insn "*csky_stmsi7" 2595 [(match_parallel 0 "csky_store_multiple_operation" 2596 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2597 (match_operand:SI 2 "register_operand" "r")) 2598 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2599 (match_operand:SI 3 "register_operand" "r")) 2600 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2601 (match_operand:SI 4 "register_operand" "r")) 2602 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2603 (match_operand:SI 5 "register_operand" "r")) 2604 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2605 (match_operand:SI 6 "register_operand" "r")) 2606 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2607 (match_operand:SI 7 "register_operand" "r")) 2608 (set (mem:SI (plus:SI (match_dup 1) (const_int 24))) 2609 (match_operand:SI 8 "register_operand" "r")) 2610 ])] 2611 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 7" 2612 { 2613 static char load_op[256] = {0}; 2614 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2615 const char *reg_rz = reg_names[end]; 2616 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2617 return load_op; 2618 } 2619) 2620 2621 2622(define_insn "*csky_stmsi6" 2623 [(match_parallel 0 "csky_store_multiple_operation" 2624 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2625 (match_operand:SI 2 "register_operand" "r")) 2626 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2627 (match_operand:SI 3 "register_operand" "r")) 2628 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2629 (match_operand:SI 4 "register_operand" "r")) 2630 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2631 (match_operand:SI 5 "register_operand" "r")) 2632 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2633 (match_operand:SI 6 "register_operand" "r")) 2634 (set (mem:SI (plus:SI (match_dup 1) (const_int 20))) 2635 (match_operand:SI 7 "register_operand" "r")) 2636 ])] 2637 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 6" 2638 { 2639 static char load_op[256] = {0}; 2640 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2641 const char *reg_rz = reg_names[end]; 2642 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2643 return load_op; 2644 } 2645) 2646 2647(define_insn "*csky_stmsi5" 2648 [(match_parallel 0 "csky_store_multiple_operation" 2649 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2650 (match_operand:SI 2 "register_operand" "r")) 2651 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2652 (match_operand:SI 3 "register_operand" "r")) 2653 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2654 (match_operand:SI 4 "register_operand" "r")) 2655 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2656 (match_operand:SI 5 "register_operand" "r")) 2657 (set (mem:SI (plus:SI (match_dup 1) (const_int 16))) 2658 (match_operand:SI 6 "register_operand" "r")) 2659 ])] 2660 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 5" 2661 { 2662 static char load_op[256] = {0}; 2663 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2664 const char *reg_rz = reg_names[end]; 2665 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2666 return load_op; 2667 } 2668) 2669 2670 2671(define_insn "*csky_stmsi4" 2672 [(match_parallel 0 "csky_store_multiple_operation" 2673 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2674 (match_operand:SI 2 "register_operand" "r")) 2675 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2676 (match_operand:SI 3 "register_operand" "r")) 2677 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2678 (match_operand:SI 4 "register_operand" "r")) 2679 (set (mem:SI (plus:SI (match_dup 1) (const_int 12))) 2680 (match_operand:SI 5 "register_operand" "r")) 2681 ])] 2682 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 4" 2683 { 2684 static char load_op[256] = {0}; 2685 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2686 const char *reg_rz = reg_names[end]; 2687 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2688 return load_op; 2689 } 2690) 2691 2692 2693(define_insn "*csky_stmsi3" 2694 [(match_parallel 0 "csky_store_multiple_operation" 2695 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2696 (match_operand:SI 2 "register_operand" "r")) 2697 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2698 (match_operand:SI 3 "register_operand" "r")) 2699 (set (mem:SI (plus:SI (match_dup 1) (const_int 8))) 2700 (match_operand:SI 4 "register_operand" "r")) 2701 ])] 2702 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 3" 2703 { 2704 static char load_op[256] = {0}; 2705 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2706 const char *reg_rz = reg_names[end]; 2707 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2708 return load_op; 2709 } 2710) 2711 2712 2713(define_insn "*csky_stmsi2" 2714 [(match_parallel 0 "csky_store_multiple_operation" 2715 [(set (mem:SI (match_operand:SI 1 "register_operand" "r")) 2716 (match_operand:SI 2 "register_operand" "r")) 2717 (set (mem:SI (plus:SI (match_dup 1) (const_int 4))) 2718 (match_operand:SI 3 "register_operand" "r")) 2719 ])] 2720 "TARGET_MULTIPLE_STLD && XVECLEN (operands[0], 0) == 2" 2721 { 2722 static char load_op[256] = {0}; 2723 int end = REGNO (operands[2]) + XVECLEN (operands[0], 0) - 1; 2724 const char *reg_rz = reg_names[end]; 2725 sprintf (load_op, \"stm\t%%2 - %s, (%%1)\", reg_rz); 2726 return load_op; 2727 } 2728) 2729 2730 2731;; ------------------------------------------------------------------------ 2732;; Jump and linkage insns 2733;; ------------------------------------------------------------------------ 2734 2735(define_expand "tablejump" 2736 [(parallel [(set (pc) (match_operand:SI 0 "register_operand" "r")) 2737 (use (label_ref (match_operand 1 "" "")))])] 2738 "" 2739 " 2740 if (flag_pic) 2741 operands[0] = expand_simple_binop (Pmode, PLUS, operands[0], 2742 pic_offset_table_rtx, NULL_RTX, 2743 1, OPTAB_DIRECT); 2744 " 2745) 2746 2747(define_insn "*tablejump" 2748 [(set (pc) (match_operand:SI 0 "register_operand" "r")) 2749 (use (label_ref (match_operand 1 "" "")))] 2750 "" 2751 "jmp %0" 2752 [(set_attr "type" "branch_jmp")] 2753) 2754 2755(define_expand "jump" 2756 [(set (pc) (label_ref (match_operand 0 "" "")))] 2757 "" 2758 "" 2759) 2760 2761(define_insn "*csky_jump" 2762 [(set (pc) (label_ref (match_operand 0 "" "")))] 2763 "CSKY_ISA_FEATURE (E2)" 2764 "jbr %l0" 2765 [(set_attr "type" "branch")] 2766) 2767 2768;; The length of bsr is not really 5; it's used to distinguish from br32. 2769;; Since the length attribute is treated specially it doesn't seem possible 2770;; to compute the far_jump attribute directly and use that. 2771 2772(define_insn "*ck801_ck802_jump" 2773 [(set (pc) (label_ref (match_operand 0 "" "")))] 2774 "CSKY_ISA_FEATURE (E1) || CSKY_ISA_FEATURE (E2)" 2775 "*{ 2776 if (get_attr_length (insn) != 5) 2777 return \"jbr\\t%l0\"; 2778 else 2779 return \"bsr\\t%l0\\t//far jump\"; 2780 }" 2781 [(set_attr "type" "branch") 2782 (set (attr "far_jump") 2783 (if_then_else 2784 (eq_attr "length" "5") 2785 (const_string "yes") 2786 (const_string "no"))) 2787 (set (attr "length") 2788 (if_then_else 2789 (and (ge (minus (match_dup 0) (pc)) (const_int -1024)) 2790 (le (minus (match_dup 0) (pc)) (const_int 1022))) 2791 (const_int 2) 2792 (if_then_else 2793 (and (ge (minus (match_dup 0) (pc)) (const_int -65536)) 2794 (le (minus (match_dup 0) (pc)) (const_int 65534))) 2795 (const_int 4) 2796 (const_int 5))))] 2797) 2798 2799(define_insn "indirect_jump" 2800 [(set (pc) (match_operand:SI 0 "register_operand" "b,r"))] 2801 "" 2802 "@ 2803 jmp\t%0 2804 jmp\t%0" 2805 [(set_attr "length" "2,4") 2806 (set_attr "type" "branch_jmp")] 2807) 2808 2809 2810;; ------------------------------------------------------------------------ 2811;; Conditional jump insns 2812;; ------------------------------------------------------------------------ 2813 2814(define_expand "cbranchsi4" 2815 [(set (pc) 2816 (if_then_else (match_operator 0 "ordered_comparison_operator" 2817 [(match_operand:SI 1 "csky_compare_operand") 2818 (match_operand:SI 2 "nonmemory_operand")]) 2819 (label_ref (match_operand 3 "")) 2820 (pc)))] 2821 "" 2822 "{ 2823 enum rtx_code code = GET_CODE (operands[0]); 2824 2825 if (CSKY_ISA_FEATURE (2E3) 2826 && (code == LE || code == LT || code == GT 2827 || code == GE || code == EQ || code == NE) 2828 && operands[2] == const0_rtx) 2829 { 2830 /* These cases match the jbez, jbnez, etc insns below. 2831 TODO: Handling this in the expander is suboptimal since it 2832 fails to detect cases where the constant 0 would fall out 2833 from subsequent forward propagation or loop optimizers; maybe 2834 it would be better to have a splitter here, but when to split? */ 2835 } 2836 else 2837 { 2838 bool invert = csky_emit_compare (code, operands[1], operands[2]); 2839 2840 if (invert) 2841 emit_jump_insn (gen_csky_jbf (operands[3])); 2842 else 2843 emit_jump_insn (gen_csky_jbt (operands[3])); 2844 DONE; 2845 } 2846 }" 2847) 2848 2849(define_insn "csky_jbt" 2850 [(set (pc) 2851 (if_then_else (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2852 (label_ref (match_operand 0 "" "")) 2853 (pc)))] 2854 "CSKY_ISA_FEATURE (2E3)" 2855 "jbt\t%l0" 2856 [(set_attr "type" "cbranch")] 2857) 2858 2859(define_insn "csky_jbf" 2860 [(set (pc) 2861 (if_then_else (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2862 (label_ref (match_operand 0 "" "")) 2863 (pc)))] 2864 "CSKY_ISA_FEATURE (2E3)" 2865 "jbf\t%l0" 2866 [(set_attr "type" "cbranch")] 2867) 2868 2869 2870;;; CK802 has 32-bit jbt/jbf instructions, but no insn other 2871;;; than bsr for far jumps. 2872 2873(define_insn "ck802_jbt" 2874 [(set (pc) (if_then_else (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2875 (label_ref (match_operand 0 "" "")) 2876 (pc)))] 2877 "CSKY_ISA_FEATURE (E2)" 2878 { 2879 if (get_attr_length (insn) == 6) 2880 return \"jbf\\t.LCB%=\;bsr\\t%l0\\t//far jump\\n.LCB%=:\"; 2881 else 2882 return \"jbt\\t%l0\"; 2883 } 2884 [(set_attr "type" "cbranch") 2885 (set (attr "far_jump") 2886 (if_then_else 2887 (eq_attr "length" "6") 2888 (const_string "yes") 2889 (const_string "no"))) 2890 (set (attr "length") 2891 (if_then_else 2892 (and (ge (minus (match_dup 0) (pc)) (const_int -1024)) 2893 (le (minus (match_dup 0) (pc)) (const_int 1022))) 2894 (const_int 2) 2895 (if_then_else 2896 (and (ge (minus (match_dup 0) (pc)) (const_int -65534)) 2897 (le (minus (match_dup 0) (pc)) (const_int 65534))) 2898 (const_int 4) 2899 (const_int 6))))] 2900) 2901 2902(define_insn "ck802_jbf" 2903 [(set (pc) (if_then_else (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2904 (label_ref (match_operand 0 "" "")) 2905 (pc)))] 2906 "CSKY_ISA_FEATURE (E2)" 2907 { 2908 if (get_attr_length (insn) == 6) 2909 return \"jbt\\t.LCB%=\;bsr\\t%l0\\t//far jump\\n.LCB%=:\"; 2910 else 2911 return \"jbf\\t%l0\"; 2912 } 2913 [(set_attr "type" "cbranch") 2914 (set (attr "far_jump") 2915 (if_then_else 2916 (eq_attr "length" "6") 2917 (const_string "yes") 2918 (const_string "no"))) 2919 (set (attr "length") 2920 (if_then_else 2921 (and (ge (minus (match_dup 0) (pc)) (const_int -1024)) 2922 (le (minus (match_dup 0) (pc)) (const_int 1022))) 2923 (const_int 2) 2924 (if_then_else 2925 (and (ge (minus (match_dup 0) (pc)) (const_int -65534)) 2926 (le (minus (match_dup 0) (pc)) (const_int 65534))) 2927 (const_int 4) 2928 (const_int 6))))] 2929) 2930 2931;; The length of the bsr case is not really 7; it's used to distinguish 2932;; from br32. 2933;; Note that we have to adjust the backward range of the jbr case to 2934;; account for the jbf in front of it. 2935(define_insn "ck801_jbt" 2936 [(set (pc) (if_then_else (ne (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2937 (label_ref (match_operand 0 "" "")) 2938 (pc)))] 2939 "CSKY_ISA_FEATURE (E1)" 2940 { 2941 if (get_attr_length (insn) == 6) 2942 return \"jbf\\t.LCB%=\;jbr\\t%l0\\n.LCB%=:\"; 2943 else if (get_attr_length (insn) == 7) 2944 return \"jbf\\t.LCB%=\;bsr\\t%l0\\t//far jump\\n.LCB%=:\"; 2945 else 2946 return \"jbt\\t%l0\"; 2947 } 2948 [(set_attr "type" "cbranch") 2949 (set (attr "far_jump") 2950 (if_then_else 2951 (eq_attr "length" "7") 2952 (const_string "yes") 2953 (const_string "no"))) 2954 (set (attr "length") 2955 (if_then_else 2956 (and (ge (minus (match_dup 0) (pc)) (const_int -1024)) 2957 (le (minus (match_dup 0) (pc)) (const_int 1022))) 2958 (const_int 2) 2959 (if_then_else 2960 (and (ge (minus (match_dup 0) (pc)) (const_int -65534)) 2961 (le (minus (match_dup 0) (pc)) (const_int 65534))) 2962 (const_int 6) 2963 (const_int 7))))] 2964) 2965 2966(define_insn "ck801_jbf" 2967 [(set (pc) 2968 (if_then_else (eq (reg:CC CSKY_CC_REGNUM) (const_int 0)) 2969 (label_ref (match_operand 0 "" "")) 2970 (pc)))] 2971 "CSKY_ISA_FEATURE (E1)" 2972 { 2973 if (get_attr_length (insn) == 6) 2974 return \"jbt\\t.LCB%=\;jbr\\t%l0\\n.LCB%=:\"; 2975 else if (get_attr_length (insn) == 7) 2976 return \"jbt\\t.LCB%=\;bsr\\t%l0\\t//far jump\\n.LCB%=:\"; 2977 else 2978 return \"jbf\\t%l0\"; 2979 } 2980 [(set_attr "type" "cbranch") 2981 (set (attr "far_jump") 2982 (if_then_else 2983 (eq_attr "length" "7") 2984 (const_string "yes") 2985 (const_string "no"))) 2986 (set (attr "length") 2987 (if_then_else 2988 (and (ge (minus (match_dup 0) (pc)) (const_int -1024)) 2989 (le (minus (match_dup 0) (pc)) (const_int 1022))) 2990 (const_int 2) 2991 (if_then_else 2992 (and (ge (minus (match_dup 0) (pc)) (const_int -65534)) 2993 (le (minus (match_dup 0) (pc)) (const_int 65534))) 2994 (const_int 6) 2995 (const_int 7))))] 2996) 2997 2998(define_code_iterator zero_cond [lt le gt ge eq ne]) 2999 3000(define_code_attr inst [(lt "jblz") (le "jblsz") (gt "jbhz") (ge "jbhsz") (eq "jbez") (ne "jbnez")]) 3001 3002(define_insn "*<inst>" 3003 [(set (pc) 3004 (if_then_else (zero_cond (match_operand:SI 0 "register_operand" "r") 3005 (const_int 0)) 3006 (label_ref (match_operand 1 "" "")) 3007 (pc)))] 3008 "CSKY_ISA_FEATURE (2E3)" 3009 "<inst>\t%0, %l1" 3010 [(set_attr "type" "cbranch")] 3011) 3012 3013;; ------------------------------------------------------------------------ 3014;; return insns 3015;; ------------------------------------------------------------------------ 3016 3017(define_insn "simple_return" 3018 [(simple_return)] 3019 "reload_completed" 3020 "* 3021 return csky_output_return_instruction (); 3022 " 3023) 3024 3025(define_expand "eh_return" 3026 [(use (match_operand 0 "general_operand" ""))] 3027 "" 3028 "{ 3029 emit_insn (gen_csky_eh_return (operands[0])); 3030 DONE; 3031 }" 3032) 3033 3034;; We can't expand this before we know where the link register is stored. 3035(define_insn_and_split "csky_eh_return" 3036 [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] 3037 VUNSPEC_EH_RETURN) 3038 (clobber (match_scratch:SI 1 "=&r"))] 3039 "" 3040 "#" 3041 "reload_completed" 3042 [(const_int 0)] 3043 "{ 3044 csky_set_eh_return_address (operands[0], operands[1]); 3045 DONE; 3046 }" 3047) 3048 3049;; ------------------------------------------------------------------------- 3050;; SImode signed integer comparisons 3051;; ------------------------------------------------------------------------- 3052 3053(define_insn "*cmpnesi_r" 3054 [(set (reg:CC CSKY_CC_REGNUM) 3055 (ne:CC (match_operand:SI 0 "register_operand" "b,r") 3056 (match_operand:SI 1 "register_operand" "b,r")))] 3057 "" 3058 "@ 3059 cmpne\t%0, %1 3060 cmpne\t%0, %1" 3061 [(set_attr "length" "2,4") 3062 (set_attr "type" "cmp")] 3063) 3064 3065;; cmpnei range is 0-31 for Smart mode. 3066(define_insn "smart_cmpnesi_i" 3067 [(set (reg:CC CSKY_CC_REGNUM) 3068 (ne:CC (match_operand:SI 0 "register_operand" "a") 3069 (match_operand:SI 1 "csky_literal_K_operand" "K")))] 3070 "TARGET_MINI_REGISTERS" 3071 "cmpnei\t%0, %1" 3072 [(set_attr "type" "cmp")] 3073) 3074 3075;; cmpnei range is 0 - 65536 for Fast mode. 3076(define_insn "fast_cmpnesi_i" 3077 [(set (reg:CC CSKY_CC_REGNUM) 3078 (ne:CC (match_operand:SI 0 "register_operand" "r") 3079 (match_operand:SI 1 "csky_literal_I_operand" "I")))] 3080 "!TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2)" 3081 "cmpnei\t%0, %1" 3082 [(set_attr "type" "cmp")] 3083) 3084 3085(define_insn "*cmpgtsi" 3086 [(set (reg:CC CSKY_CC_REGNUM) 3087 (gt:CC (match_operand:SI 0 "register_operand" "b,r") 3088 (match_operand:SI 1 "register_operand" "b,r")))] 3089 "" 3090 "cmplt\t%1, %0" 3091 [(set_attr "length" "2,4") 3092 (set_attr "type" "cmp")] 3093) 3094 3095(define_insn "cmpltsi_r" 3096 [(set (reg:CC CSKY_CC_REGNUM) 3097 (lt:CC (match_operand:SI 0 "register_operand" "b,r") 3098 (match_operand:SI 1 "register_operand" "b,r")))] 3099 "" 3100 "cmplt\t%0, %1" 3101 [(set_attr "length" "2,4") 3102 (set_attr "type" "cmp")] 3103) 3104 3105;; cmplti range is 1-32 for Smart mode. 3106(define_insn "*smart_cmpltsi_i" 3107 [(set (reg:CC CSKY_CC_REGNUM) 3108 (lt:CC (match_operand:SI 0 "register_operand" "a") 3109 (match_operand:SI 1 "csky_literal_J_operand" "J")))] 3110 "TARGET_MINI_REGISTERS" 3111 "cmplti\t%0, %1" 3112 [(set_attr "length" "2") 3113 (set_attr "type" "cmp")] 3114) 3115 3116 3117;; cmplti range is 1-65536 for Fast mode. 3118(define_insn "*fast_cmpltsi_i" 3119 [(set (reg:CC CSKY_CC_REGNUM) 3120 (lt:CC (match_operand:SI 0 "register_operand" "a,r") 3121 (match_operand:SI 1 "csky_literal_Uk_operand" "J,Uk")))] 3122 "!TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2)" 3123 "cmplti\t%0, %1" 3124 [(set_attr "length" "2,4") 3125 (set_attr "type" "cmp")] 3126) 3127 3128; Covers cmplti x,0. 3129(define_insn "*cskyv2_cmpltsi_0" 3130 [(set (reg:CC CSKY_CC_REGNUM) 3131 (lt:CC (match_operand:SI 0 "register_operand" "a,r") 3132 (const_int 0)))] 3133 "CSKY_ISA_FEATURE (E2)" 3134 "btsti\t%0, 31" 3135 [(set_attr "length" "2,4") 3136 (set_attr "type" "cmp")] 3137) 3138 3139(define_insn "*ck801_cmpltsi_0" 3140 [(set (reg:CC CSKY_CC_REGNUM) 3141 (lt:CC (match_operand:SI 0 "register_operand" "a") 3142 (const_int 0)))] 3143 "CSKY_ISA_FEATURE (E1)" 3144 "btsti\t%0, 31" 3145 [(set_attr "type" "cmp")] 3146) 3147 3148;; Decrement and test instructions. 3149;; In theory decne could be used in conjunction with jbt to implement 3150;; doloop_end, but that seems to encourage the loop optimizer to introduce 3151;; an additional induction variable and doesn't actually result in tighter 3152;; loop code for that reason. 3153 3154(define_insn "*cskyv2_declt" 3155 [(set (match_operand:SI 0 "register_operand" "=r") 3156 (plus:SI (match_operand:SI 1 "register_operand" "r") 3157 (match_operand:SI 2 "const_int_operand" "Uh"))) 3158 (set (reg:CC CSKY_CC_REGNUM) 3159 (lt:CC (plus:SI (match_dup 1) (match_dup 2)) 3160 (const_int 0)))] 3161 "CSKY_ISA_FEATURE (2E3)" 3162 "declt\t%0, %1, %M2" 3163) 3164 3165(define_insn "*cskyv2_decgt" 3166 [(set (match_operand:SI 0 "register_operand" "=r") 3167 (plus:SI (match_operand:SI 1 "register_operand" "r") 3168 (match_operand:SI 2 "const_int_operand" "Uh"))) 3169 (set (reg:CC CSKY_CC_REGNUM) 3170 (gt:CC (plus:SI (match_dup 1) (match_dup 2)) 3171 (const_int 0)))] 3172 "CSKY_ISA_FEATURE (2E3)" 3173 "decgt\t%0, %1, %M2" 3174) 3175 3176(define_insn "*cskyv2_decne" 3177 [(set (match_operand:SI 0 "register_operand" "=r") 3178 (plus:SI (match_operand:SI 1 "register_operand" "r") 3179 (match_operand:SI 2 "const_int_operand" "Uh"))) 3180 (set (reg:CC CSKY_CC_REGNUM) 3181 (ne:CC (plus:SI (match_dup 1) (match_dup 2)) 3182 (const_int 0)))] 3183 "CSKY_ISA_FEATURE (2E3)" 3184 "decne\t%0, %1, %M2" 3185) 3186 3187;; ------------------------------------------------------------------------- 3188;; SImode unsigned integer comparisons 3189;; ------------------------------------------------------------------------- 3190 3191(define_insn "cmpgeusi_r" 3192 [(set (reg:CC CSKY_CC_REGNUM) 3193 (geu:CC (match_operand:SI 0 "register_operand" "b,r") 3194 (match_operand:SI 1 "register_operand" "b,r")))] 3195 "" 3196 "cmphs\t%0, %1" 3197 [(set_attr "length" "2,4") 3198 (set_attr "type" "cmp")] 3199) 3200 3201(define_insn "*smart_cmpgeusi_i" 3202 [(set (reg:CC CSKY_CC_REGNUM) 3203 (geu:CC (match_operand:SI 0 "register_operand" "a") 3204 (match_operand:SI 1 "csky_literal_J_operand" "J")))] 3205 "TARGET_MINI_REGISTERS" 3206 "cmphsi\t%0, %1" 3207 [(set_attr "length" "2") 3208 (set_attr "type" "cmp")] 3209) 3210 3211(define_insn "*fast_cmpgeusi_i" 3212 [(set (reg:CC CSKY_CC_REGNUM) 3213 (geu:CC (match_operand:SI 0 "register_operand" "a,r") 3214 (match_operand:SI 1 "csky_literal_Uk_operand" "J,Uk")))] 3215 "!TARGET_MINI_REGISTERS && CSKY_ISA_FEATURE (E2)" 3216 "cmphsi\t%0, %1" 3217 [(set_attr "length" "2,4") 3218 (set_attr "type" "cmp")] 3219) 3220 3221(define_insn "*cmpleusi" 3222 [(set (reg:CC CSKY_CC_REGNUM) 3223 (leu:CC (match_operand:SI 0 "register_operand" "b,r") 3224 (match_operand:SI 1 "register_operand" "b,r")))] 3225 "" 3226 "cmphs\t%1, %0" 3227 [(set_attr "length" "2,4") 3228 (set_attr "type" "cmp")] 3229) 3230 3231;; ------------------------------------------------------------------------- 3232;; Function call insns 3233;; ------------------------------------------------------------------------- 3234 3235(define_expand "call" 3236 [(parallel [(call (match_operand:SI 0 "" "") (match_operand 1 "" "")) 3237 (clobber (reg:SI CSKY_LR_REGNUM))])] 3238 "" 3239 " 3240 { 3241 rtx pic_ref; 3242 rtx addr_ref = XEXP (operands[0], 0); 3243 3244 if (flag_pic 3245 && (CONSTANT_P (addr_ref) 3246 || csky_symbol_mentioned_p (addr_ref) 3247 || csky_label_mentioned_p (addr_ref))) 3248 { 3249 pic_ref = csky_legitimize_pic_address (addr_ref, 0, false); 3250 operands[0] = gen_rtx_MEM (GET_MODE (pic_ref), pic_ref); 3251 } 3252 3253 if (GET_CODE (operands[0]) == MEM 3254 && ! register_operand (XEXP (operands[0], 0), SImode) 3255 && ! csky_symbolic_address_p (XEXP (operands[0], 0)) 3256 && ! (flag_pic 3257 && csky_unspec_operand (XEXP (operands[0], 0), SImode))) 3258 operands[0] = gen_rtx_MEM (GET_MODE (operands[0]), 3259 force_reg (Pmode, XEXP (operands[0], 0))); 3260 }" 3261) 3262 3263 3264(define_insn "*call_internal" 3265 [(call (mem:SI (match_operand:SI 0 "csky_call_address_operand" "b,r,S")) 3266 (match_operand 1 "" "")) 3267 (clobber (reg:SI CSKY_LR_REGNUM))] 3268 "" 3269 "@ 3270 jsr\t%0 3271 jsr\t%0 3272 jbsr\t%0" 3273 [(set_attr "length" "2,4,4") 3274 (set_attr "type" "call_jsr,call_jsr,call")] 3275) 3276 3277(define_insn "*call_internal_pic" 3278 [(call (mem:SI (match_operand:SI 0 "csky_unspec_operand" "X")) 3279 (match_operand 1 "" "")) 3280 (clobber (reg:SI CSKY_LR_REGNUM))] 3281 "flag_pic" 3282 "* return csky_output_call (operands, 0);" 3283 [(set_attr "length" "4")] 3284) 3285 3286(define_expand "call_value" 3287 [(parallel [(set (match_operand 0 "register_operand" "") 3288 (call (match_operand:SI 1 "" "") (match_operand 2 "" ""))) 3289 (clobber (reg:SI CSKY_LR_REGNUM))])] 3290 "" 3291 "{ 3292 rtx pic_ref; 3293 rtx addr_ref = XEXP (operands[1], 0); 3294 3295 if (flag_pic 3296 && (CONSTANT_P (addr_ref) 3297 || csky_symbol_mentioned_p (addr_ref) 3298 || csky_label_mentioned_p (addr_ref))) 3299 { 3300 pic_ref = csky_legitimize_pic_address (addr_ref, 0, false); 3301 operands[1] = gen_rtx_MEM (GET_MODE (pic_ref), pic_ref); 3302 } 3303 3304 if (GET_CODE (operands[1]) == MEM 3305 && ! register_operand (XEXP (operands[1], 0), SImode) 3306 && ! csky_symbolic_address_p (XEXP (operands[1], 0)) 3307 && ! (flag_pic 3308 && csky_unspec_operand (XEXP (operands[1], 0), SImode))) 3309 operands[1] = gen_rtx_MEM (GET_MODE (operands[1]), 3310 force_reg (Pmode, XEXP (operands[1], 0))); 3311 }") 3312 3313 3314(define_insn "*call_value_internal" 3315 [(set (match_operand 0 "register_operand" "=r,r,r") 3316 (call (mem:SI (match_operand:SI 1 "csky_call_address_operand" "b, r,S")) 3317 (match_operand 2 "" ""))) 3318 (clobber (reg:SI CSKY_LR_REGNUM))] 3319 "" 3320 "@ 3321 jsr\t%1 3322 jsr\t%1 3323 jbsr\t%1" 3324 [(set_attr "length" "2,4,4") 3325 (set_attr "type" "call_jsr,call_jsr,call")] 3326) 3327 3328(define_insn "*call_value_internal_pic" 3329 [(set (match_operand 0 "register_operand" "=r") 3330 (call (mem:SI (match_operand:SI 1 "csky_unspec_operand" "X")) 3331 (match_operand 2 "" ""))) 3332 (clobber (reg:SI CSKY_LR_REGNUM))] 3333 "flag_pic" 3334 "* return csky_output_call (operands, 1);" 3335) 3336 3337(define_insn "*call_value_struct" 3338 [(set (match_parallel 0 "" 3339 [(expr_list (match_operand 3 "register_operand" "") 3340 (match_operand 4 "immediate_operand" "")) 3341 (expr_list (match_operand 5 "register_operand" "") 3342 (match_operand 6 "immediate_operand" ""))]) 3343 (call (mem:SI (match_operand:SI 1 "csky_call_address_operand" "b,r,S")) 3344 (match_operand 2 "" ""))) 3345 (clobber (reg:SI CSKY_LR_REGNUM))] 3346 "" 3347 "@ 3348 jsr\t%1 3349 jsr\t%1 3350 jbsr\t%1" 3351 [(set_attr "length" "2,4,4") 3352 (set_attr "type" "call_jsr,call_jsr,call")] 3353) 3354 3355(define_insn "*call_value_struct_pic" 3356 [(set (match_parallel 0 "" 3357 [(expr_list (match_operand 3 "register_operand" "") 3358 (match_operand 4 "immediate_operand" "")) 3359 (expr_list (match_operand 5 "register_operand" "") 3360 (match_operand 6 "immediate_operand" ""))]) 3361 (call (mem:SI (match_operand:SI 1 "csky_unspec_operand" "X")) 3362 (match_operand 2 "" ""))) 3363 (clobber (reg:SI CSKY_LR_REGNUM))] 3364 "flag_pic" 3365 "* return csky_output_call (operands, 1);" 3366) 3367 3368 3369;; ------------------------------------------------------------- 3370;; prologue & epilogue 3371;; ------------------------------------------------------------- 3372 3373(define_expand "prologue" 3374 [(clobber (const_int 0))] 3375 "" 3376 " 3377 { 3378 csky_expand_prologue (); 3379 DONE; 3380 }" 3381) 3382 3383(define_expand "epilogue" 3384 [(clobber (const_int 0))] 3385 "" 3386 " 3387 { 3388 csky_expand_epilogue (); 3389 DONE; 3390 }" 3391) 3392 3393/* TODO: pushpop */ 3394;; Push multiple registers to the stack. Registers are in parallel (use ...) 3395;; expressions. For simplicity, the first register is also in the unspec 3396;; part. 3397(define_insn "*push_multi" 3398 [(match_parallel 2 "registers_push" 3399 [(set (match_operand:BLK 0 "push_memory_operand" "") 3400 (unspec:BLK [(match_operand:SI 1 "register_operand" "")] 3401 UNSPEC_PUSHPOP_MULT))])] 3402 "" 3403 { 3404 int num_saves = XVECLEN (operands[2], 0); 3405 int i; 3406 char pattern[100]; 3407 3408 strcpy (pattern, \"push\\t%1\"); 3409 3410 for (i = 1; i < num_saves; i++) 3411 { 3412 strcat (pattern, \", \"); 3413 strcat (pattern, 3414 reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), 0))]); 3415 } 3416 3417 output_asm_insn (pattern, operands); 3418 3419 return \"\"; 3420 } 3421 [(set (attr "length") 3422 (symbol_ref "csky_compute_pushpop_length (operands)"))] 3423) 3424 3425;; Pop (as used in epilogue RTL) 3426;; 3427(define_insn "*pop_multi" 3428 [(match_parallel 2 "registers_pop" 3429 [(return) 3430 (set (match_operand:SI 1 "register_operand" "") 3431 (unspec:SI [(match_operand:SI 0 "pop_memory_operand" "")] 3432 UNSPEC_PUSHPOP_MULT))])] 3433 "" 3434 { 3435 int num_saves = XVECLEN (operands[2], 0); 3436 int i; 3437 char pattern[100]; 3438 3439 strcpy (pattern, \"pop\\t%1\"); 3440 3441 for (i = 2; i < num_saves; i++) 3442 { 3443 strcat (pattern, \", \"); 3444 strcat (pattern, 3445 reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), 0))]); 3446 } 3447 3448 output_asm_insn (pattern, operands); 3449 3450 return \"\"; 3451 } 3452 [(set (attr "length") 3453 (symbol_ref "csky_compute_pushpop_length (operands)"))] 3454) 3455 3456 3457;; ------------------------------------------------------------------------- 3458;; PIC related insns 3459;; ------------------------------------------------------------------------- 3460 3461(define_insn "prologue_get_pc" 3462 [(set (reg:SI 28) 3463 (match_operand:SI 0 "" "X"))] 3464 "(GET_CODE (operands[0]) == UNSPEC) 3465 && (XINT (operands[0], 1) == UNSPEC_PIC_SYMBOL_GOTPC_GRS)" 3466 { 3467 operands[0] = XVECEXP (operands[0], 0, 0); 3468 output_asm_insn (\"grs\tgb, %0\", operands); 3469 default_internal_label (asm_out_file, \"L\", 3470 CODE_LABEL_NUMBER (XEXP (operands[0], 0))); 3471 return \"\"; 3472 } 3473) 3474 3475(define_insn "*pic_got_pc" 3476 [(set (match_operand:SI 0 "register_operand" "=r") 3477 (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYMBOL_GOTPC))] 3478 "flag_pic" 3479 "lrw\t%0, %1@GOTPC" 3480) 3481 3482(define_insn "*pic_symbol_gotoff" 3483 [(set (match_operand:SI 0 "register_operand" "=r") 3484 (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYMBOL_GOTOFF))] 3485 "flag_pic" 3486 "lrw\t%0, %1@GOTOFF" 3487) 3488 3489(define_insn "*pic_symbol_got" 3490 [(set (match_operand:SI 0 "register_operand" "=r") 3491 (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYMBOL_GOT))] 3492 "flag_pic" 3493 "lrw\t%0, %1@GOT" 3494) 3495 3496(define_insn "*pic_symbol_plt" 3497 [(set (match_operand:SI 0 "register_operand" "=r") 3498 (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYMBOL_PLT))] 3499 "flag_pic" 3500 "lrw\t%0, %1@PLT" 3501) 3502 3503(define_insn "*pic_symbol_grs" 3504 [(set (match_operand:SI 0 "register_operand" "=r") 3505 (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYMBOL_GRS))] 3506 "flag_pic" 3507 "grs\t%0, %1" 3508) 3509 3510(define_expand "builtin_setjmp_receiver" 3511 [(label_ref (match_operand 0 "" ""))] 3512 "flag_pic" 3513 "{ 3514 rtx l1 = gen_label_rtx(); 3515 rtx grs_label = gen_rtx_LABEL_REF (SImode, l1); 3516 rtx reg_gb = gen_rtx_REG (SImode, PIC_OFFSET_TABLE_REGNUM); 3517 rtx reg_temp = gen_rtx_REG (SImode, 12); 3518 3519 rtx tmp0_unspec = gen_rtx_UNSPEC (Pmode, 3520 gen_rtvec (1, grs_label), 3521 UNSPEC_PIC_SYMBOL_GOTPC_GRS); 3522 rtx tmp1_unspec = gen_rtx_UNSPEC (Pmode, 3523 gen_rtvec (1, grs_label), 3524 UNSPEC_PIC_SYMBOL_GOTPC); 3525 3526 emit_insn (gen_prologue_get_pc (tmp0_unspec)); 3527 emit_move_insn (reg_temp, tmp1_unspec); 3528 emit_insn (gen_addsi3 (reg_gb, reg_gb, reg_temp)); 3529 emit_use (reg_gb); 3530 3531 DONE; 3532 }" 3533) 3534 3535;; ------------------------------------------------------------------------- 3536;; TLS related insns 3537;; ------------------------------------------------------------------------- 3538 3539 3540;; UNSPEC_TLS can take either 2 or 3 operands. Operand 0 is the symbol_ref, 3541;; operand 1 is a CONST_INT identifying the TLS model, and the optional 3542;; operand 3 is an UNSPEC_TLS_LABEL. 3543;; The 3-operand case is for TLS_GD32, TLS_LDM32, and TLS_IE32. 3544;; The 2-operand case is for TLS_LE32 and TLS_LDO32. 3545 3546;; Move PC-relative TLS label to reg. This is used for the TLS_GD32 3547;; and TLS_GD32 models (when setting up a call to tls_get_addr) and 3548;; also TLS_IE32. 3549 3550(define_insn "*tls_pcrel_label" 3551 [(set (match_operand:SI 0 "register_operand" "=r") 3552 (unspec:SI [(match_operand:SI 1 "const_int_operand" "")] 3553 UNSPEC_TLS_LABEL))] 3554 "TARGET_TLS" 3555 "grs\t%0, .LTLS%1" 3556 [(set_attr "length" "4")] 3557) 3558 3559;; This pattern is used to load the TLS base for the same models as above. 3560;; The embedded UNSPEC_TLS_LABEL only identifies the label to emit and 3561;; doesn't generate a reference to it; that's handled by the *tls_pcrel_label 3562;; pattern above. The label offset needs to be added to the result stored 3563;; in operand 0 by this insn. 3564 3565(define_insn "*tls_get_symbol_1" 3566 [(set (match_operand:SI 0 "register_operand" "=r") 3567 (unspec:SI [(match_operand 1 "" "") 3568 (match_operand 2 "" "") 3569 (unspec:SI [(match_operand 3 "" "")] UNSPEC_TLS_LABEL)] 3570 UNSPEC_TLS))] 3571 "TARGET_TLS" 3572 { 3573 default_internal_label (asm_out_file, \"LTLS\", INTVAL (operands[3])); 3574 switch (INTVAL (operands[2])) 3575 { 3576 case TLS_GD32: 3577 return \"lrw\t%0, %1@TLSGD32\"; 3578 case TLS_LDM32: 3579 return \"lrw\t%0, %1@TLSLDM32\"; 3580 case TLS_IE32: 3581 return \"lrw\t%0, %1@GOTTPOFF\"; 3582 default: 3583 return \"\"; 3584 } 3585 } 3586) 3587 3588;; This pattern matches the two-operand form of UNSPEC_TLS. 3589 3590(define_insn "*tls_get_symbol_2" 3591 [(set (match_operand:SI 0 "register_operand" "=r") 3592 (unspec:SI [(match_operand 1 "" "") 3593 (match_operand 2 "" "")] 3594 UNSPEC_TLS))] 3595 "TARGET_TLS" 3596 { 3597 switch (INTVAL (operands[2])) 3598 { 3599 case TLS_LE32: 3600 return \"lrw\t%0, %1@TPOFF\"; 3601 case TLS_LDO32: 3602 return \"lrw\t%0, %1@TLSLDO32\"; 3603 default: 3604 return \"\"; 3605 } 3606 } 3607) 3608 3609 3610;; ------------------------------------------------------------- 3611;; Misc insns 3612;; ------------------------------------------------------------- 3613 3614(define_insn "nop" 3615 [(const_int 0)] 3616 "" 3617 "nop" 3618 [(set_attr "length" "2")] 3619) 3620 3621(define_insn "trap" 3622 [(trap_if (const_int 1) (const_int 0))] 3623 "" 3624 "bkpt" 3625 [(set (attr "length") (const_int 2)) 3626 (set_attr "type" "alu")] 3627) 3628 3629 3630;; ------------------------------------------------------------- 3631;; Special patterns for dealing with the constant pool 3632;; ------------------------------------------------------------- 3633 3634(define_insn "align_4" 3635 [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN)] 3636 "" 3637 { 3638 assemble_align(32); 3639 return \"\"; 3640 } 3641 [(set_attr "length" "0")] 3642) 3643 3644(define_insn "csky_constpool_label" 3645 [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_LABEL)] 3646 "" 3647 { 3648 char tmp_label[15]; 3649 ASM_GENERATE_INTERNAL_LABEL (tmp_label, \"LCP\", INTVAL (operands[0])); 3650 assemble_label (asm_out_file, tmp_label); 3651 return \"\"; 3652 } 3653 [(set_attr "length" "0")] 3654) 3655 3656(define_insn "consttable_4" 3657 [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_4)] 3658 "" 3659 { 3660 if (CONST_DOUBLE_P (operands[0])) 3661 assemble_real (*CONST_DOUBLE_REAL_VALUE (operands[0]), 3662 SFmode, BITS_PER_WORD); 3663 else 3664 { 3665 assemble_integer (operands[0], 4, BITS_PER_WORD, 1); 3666 mark_symbol_refs_as_used (operands[0]); 3667 } 3668 return \"\"; 3669 } 3670 [(set_attr "length" "4")] 3671) 3672 3673(define_insn "consttable_8" 3674 [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_8)] 3675 "" 3676 { 3677 if (CONST_DOUBLE_P (operands[0])) 3678 assemble_real (*CONST_DOUBLE_REAL_VALUE (operands[0]), 3679 DFmode, BITS_PER_WORD); 3680 else 3681 assemble_integer (operands[0], 8, BITS_PER_WORD, 1); 3682 return \"\"; 3683 } 3684 [(set_attr "length" "8")] 3685) 3686 3687;;FIXME record the deferred symbol_ref information with use insn 3688(define_insn "*cskyv2_use_symbol_ref" 3689 [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_SYMBOL_REF)] 3690 "" 3691 "" 3692 [(set_attr "length" "0")] 3693) 3694 3695 3696;; ------------------------------------------------------------ 3697;; switch case optimize 3698;; ------------------------------------------------------------ 3699 3700(define_expand "casesi" 3701 [(match_operand:SI 0 "register_operand" "") ; index to jump on 3702 (match_operand:SI 1 "const_int_operand" "") ; lower bound 3703 (match_operand:SI 2 "const_int_operand" "") ; total range (max - min) 3704 (match_operand:SI 3 "" "") ; table label 3705 (match_operand:SI 4 "" "")] ; Out of range label (default:) 3706 "TARGET_CASESI" 3707 " 3708 { 3709 enum insn_code code; 3710 if (operands[1] != const0_rtx) 3711 { 3712 rtx reg = gen_reg_rtx (SImode); 3713 emit_insn (gen_subsi3 (reg, 3714 operands[0], 3715 GEN_INT (INTVAL (operands[1])))); 3716 operands[0] = reg; 3717 } 3718 3719 code = CODE_FOR_csky_casesi_internal; 3720 3721 if (!insn_data[(int) code].operand[1].predicate(operands[2], SImode)) 3722 operands[2] = force_reg (SImode,operands[2]); 3723 3724 emit_jump_insn (GEN_FCN ((int) code) (operands[0],operands[2], 3725 operands[3],operands[4])); 3726 DONE; 3727 }" 3728) 3729 3730(define_expand "csky_casesi_internal" 3731 [(match_operand:SI 0 "register_operand" "") 3732 (match_operand:SI 1 "csky_literal_Uk_operand" "") 3733 (match_operand 2 "" "") 3734 (match_operand 3 "" "")] 3735 "" 3736 { 3737 rtx reg0; 3738 rtx test = gen_rtx_GTU (VOIDmode, operands[0], operands[1]); 3739 emit_jump_insn (gen_cbranchsi4 (test, operands[0], operands[1], 3740 operands[3])); 3741 reg0 = gen_rtx_REG (SImode, 0); 3742 emit_move_insn (reg0, operands[0]); 3743 emit_jump_insn (gen_csky_casesi_dispatch (operands[2])); 3744 DONE; 3745 } 3746) 3747 3748(define_insn "csky_casesi_dispatch" 3749 [(parallel [(set (pc) (unspec [(reg:SI 0) 3750 (label_ref (match_operand 0 "" ""))] 3751 UNSPEC_CSKY_CASESI)) 3752 (clobber (reg:SI CSKY_LR_REGNUM))])] 3753 "" 3754 "*return csky_output_casesi (operands);" 3755 [(set_attr "length" "4")] 3756) 3757 3758;; ------------------------------------------------------------------------ 3759;; index insns 3760;; ------------------------------------------------------------------------ 3761 3762(define_insn "*cskyv2_indexsi_t" 3763 [(set (match_operand:SI 0 "register_operand" "=r") 3764 (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") 3765 (const_int 4)) 3766 (match_operand:SI 2 "register_operand" "r")))] 3767 "CSKY_ISA_FEATURE (E2)" 3768 "ixw\t%0, %2, %1" 3769) 3770 3771(define_insn "*cskyv2_indexhi_t" 3772 [(set (match_operand:SI 0 "register_operand" "=r") 3773 (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") 3774 (const_int 2)) 3775 (match_operand:SI 2 "register_operand" "r")))] 3776 "CSKY_ISA_FEATURE (E2)" 3777 "ixh\t%0, %2, %1" 3778) 3779 3780(define_insn "*cskyv2_indexdi_t" 3781 [(set (match_operand:SI 0 "register_operand" "=r") 3782 (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") 3783 (const_int 8)) 3784 (match_operand:SI 2 "register_operand" "r")))] 3785 "CSKY_ISA_FEATURE (2E3)" 3786 "ixd\t%0, %2, %1" 3787) 3788 3789;; ------------------------------------------------------------------------ 3790;; swap insns 3791;; ------------------------------------------------------------------------ 3792 3793(define_insn "bswapsi2" 3794 [(set (match_operand:SI 0 "register_operand" "=r") 3795 (bswap:SI (match_operand:SI 1 "register_operand" "r")))] 3796 "CSKY_ISA_FEATURE (E2)" 3797 "revb\t%0, %1" 3798) 3799