Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/cr16/cr16.md @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 ;; GCC machine description for CR16. | 1 ;; GCC machine description for CR16. |
2 ;; Copyright (C) 2012-2017 Free Software Foundation, Inc. | 2 ;; Copyright (C) 2012-2018 Free Software Foundation, Inc. |
3 ;; Contributed by KPIT Cummins Infosystems Limited. | 3 ;; Contributed by KPIT Cummins Infosystems Limited. |
4 | 4 |
5 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
6 | 6 |
7 ;; GCC is free software; you can redistribute it and/or modify it | 7 ;; GCC is free software; you can redistribute it and/or modify it |
653 "register_operand (operands[0], DImode) | 653 "register_operand (operands[0], DImode) |
654 || register_operand (operands[0], DFmode) | 654 || register_operand (operands[0], DFmode) |
655 || register_operand (operands[1], DImode) | 655 || register_operand (operands[1], DImode) |
656 || register_operand (operands[1], DFmode)" | 656 || register_operand (operands[1], DFmode)" |
657 { | 657 { |
658 if (0 == which_alternative) { | 658 if (which_alternative == 0) { |
659 rtx xoperands[2] ; | 659 rtx xoperands[2]; |
660 int reg0 = REGNO (operands[0]); | 660 int reg0 = REGNO (operands[0]); |
661 int reg1 = REGNO (operands[1]); | 661 int reg1 = REGNO (operands[1]); |
662 | 662 |
663 xoperands[0] = gen_rtx_REG (SImode, reg0 + 2); | 663 xoperands[0] = gen_rtx_REG (SImode, reg0 + 2); |
664 xoperands[1] = gen_rtx_REG (SImode, reg1 + 2); | 664 xoperands[1] = gen_rtx_REG (SImode, reg1 + 2); |
671 { | 671 { |
672 output_asm_insn ("movd\t%1, %0", xoperands); | 672 output_asm_insn ("movd\t%1, %0", xoperands); |
673 output_asm_insn ("movd\t%1, %0", operands); | 673 output_asm_insn ("movd\t%1, %0", operands); |
674 }} | 674 }} |
675 | 675 |
676 else if (1 == which_alternative) { | 676 else if (which_alternative == 1) { |
677 rtx lo_operands[2] ; | 677 rtx lo_operands[2]; |
678 rtx hi_operands[2] ; | 678 rtx hi_operands[2]; |
679 | 679 |
680 lo_operands[0] = gen_rtx_REG (SImode, REGNO (operands[0])); | 680 lo_operands[0] = gen_rtx_REG (SImode, REGNO (operands[0])); |
681 hi_operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2); | 681 hi_operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2); |
682 lo_operands[1] = simplify_gen_subreg (SImode, operands[1], | 682 lo_operands[1] = simplify_gen_subreg (SImode, operands[1], |
683 VOIDmode == GET_MODE (operands[1]) | 683 VOIDmode == GET_MODE (operands[1]) |
686 VOIDmode == GET_MODE (operands[1]) | 686 VOIDmode == GET_MODE (operands[1]) |
687 ? DImode : GET_MODE (operands[1]), 4); | 687 ? DImode : GET_MODE (operands[1]), 4); |
688 output_asm_insn ("movd\t%1, %0", lo_operands); | 688 output_asm_insn ("movd\t%1, %0", lo_operands); |
689 output_asm_insn ("movd\t%1, %0", hi_operands);} | 689 output_asm_insn ("movd\t%1, %0", hi_operands);} |
690 | 690 |
691 else if (2 == which_alternative) { | 691 else if (which_alternative == 2) { |
692 rtx xoperands[2] ; | 692 rtx xoperands[2]; |
693 int reg0 = REGNO (operands[0]), reg1 = -2 ; | 693 int reg0 = REGNO (operands[0]), reg1 = -2; |
694 rtx addr ; | 694 rtx addr; |
695 | 695 |
696 if (MEM_P (operands[1])) | 696 if (MEM_P (operands[1])) |
697 addr = XEXP (operands[1], 0); | 697 addr = XEXP (operands[1], 0); |
698 else | 698 else |
699 addr = NULL_RTX ; | 699 addr = NULL_RTX; |
700 switch (GET_CODE (addr)) | 700 switch (GET_CODE (addr)) |
701 { | 701 { |
702 case REG: | 702 case REG: |
703 case SUBREG: | 703 case SUBREG: |
704 reg1 = REGNO (addr); | 704 reg1 = REGNO (addr); |
705 break ; | 705 break; |
706 case PLUS: | 706 case PLUS: |
707 switch (GET_CODE (XEXP (addr, 0))) { | 707 switch (GET_CODE (XEXP (addr, 0))) { |
708 case REG: | 708 case REG: |
709 case SUBREG: | 709 case SUBREG: |
710 reg1 = REGNO (XEXP (addr, 0)); | 710 reg1 = REGNO (XEXP (addr, 0)); |
711 break ; | 711 break; |
712 case PLUS: | 712 case PLUS: |
713 reg1 = REGNO (XEXP (XEXP (addr, 0), 0)); | 713 reg1 = REGNO (XEXP (XEXP (addr, 0), 0)); |
714 break ; | 714 break; |
715 default: | 715 default: |
716 inform (DECL_SOURCE_LOCATION (cfun->decl), "unexpected expression; addr:"); | 716 inform (DECL_SOURCE_LOCATION (cfun->decl), "unexpected expression; addr:"); |
717 debug_rtx (addr); | 717 debug_rtx (addr); |
718 inform (DECL_SOURCE_LOCATION (cfun->decl), "operands[1]:"); | 718 inform (DECL_SOURCE_LOCATION (cfun->decl), "operands[1]:"); |
719 debug_rtx (operands[1]); | 719 debug_rtx (operands[1]); |
720 inform (DECL_SOURCE_LOCATION (cfun->decl), "generated code might now work\n"); | 720 inform (DECL_SOURCE_LOCATION (cfun->decl), "generated code might now work\n"); |
721 break ;} | 721 break;} |
722 break ; | 722 break; |
723 default: | 723 default: |
724 break ; | 724 break; |
725 } | 725 } |
726 | 726 |
727 xoperands[0] = gen_rtx_REG (SImode, reg0 + 2); | 727 xoperands[0] = gen_rtx_REG (SImode, reg0 + 2); |
728 xoperands[1] = offset_address (operands[1], GEN_INT (4), 2); | 728 xoperands[1] = offset_address (operands[1], GEN_INT (4), 2); |
729 gcc_assert ((reg0 + 1) != reg1); | 729 gcc_assert ((reg0 + 1) != reg1); |
737 output_asm_insn ("loadd\t%1, %0", xoperands); | 737 output_asm_insn ("loadd\t%1, %0", xoperands); |
738 output_asm_insn ("loadd\t%1, %0", operands); | 738 output_asm_insn ("loadd\t%1, %0", operands); |
739 }} | 739 }} |
740 else | 740 else |
741 { | 741 { |
742 rtx xoperands[2] ; | 742 rtx xoperands[2]; |
743 xoperands[0] = offset_address (operands[0], GEN_INT (4), 2); | 743 xoperands[0] = offset_address (operands[0], GEN_INT (4), 2); |
744 xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2); | 744 xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2); |
745 output_asm_insn ("stord\t%1, %0", operands); | 745 output_asm_insn ("stord\t%1, %0", operands); |
746 output_asm_insn ("stord\t%1, %0", xoperands); | 746 output_asm_insn ("stord\t%1, %0", xoperands); |
747 } | 747 } |
748 return "" ; | 748 return ""; |
749 } | 749 } |
750 [(set_attr "length" "4, <lImmArithD>, <lImmArithD>, <lImmArithD>")] | 750 [(set_attr "length" "4, <lImmArithD>, <lImmArithD>, <lImmArithD>")] |
751 ) | 751 ) |
752 | 752 |
753 ; All long (SI, SF) register move, load and store operations | 753 ; All long (SI, SF) register move, load and store operations |