aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-09-08 16:54:17 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-09-08 16:54:17 -0700
commit86c33bb08ca211a04b95569e01ffca5a6744bce4 (patch)
tree67bae409dbd5d414912a077fa2f2d8933a337e3b /gcc
parentc6cf7fdb586b9875ca42242b5f45270f3371605f (diff)
downloadriscv-gnu-toolchain-86c33bb08ca211a04b95569e01ffca5a6744bce4.zip
riscv-gnu-toolchain-86c33bb08ca211a04b95569e01ffca5a6744bce4.tar.gz
riscv-gnu-toolchain-86c33bb08ca211a04b95569e01ffca5a6744bce4.tar.bz2
gcc: use LI, not MV, to zero a GPR
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gcc/config/riscv/riscv.c59
1 files changed, 28 insertions, 31 deletions
diff --git a/gcc/gcc/config/riscv/riscv.c b/gcc/gcc/config/riscv/riscv.c
index bf27a18..4bd9803 100644
--- a/gcc/gcc/config/riscv/riscv.c
+++ b/gcc/gcc/config/riscv/riscv.c
@@ -1756,6 +1756,34 @@ riscv_output_move (rtx dest, rtx src)
if (dbl_p && riscv_split_64bit_move_p (dest, src))
return "#";
+ if (dest_code == REG && GP_REG_P (REGNO (dest)))
+ {
+ if (src_code == REG && FP_REG_P (REGNO (src)))
+ return dbl_p ? "fmv.x.d\t%0,%1" : "fmv.x.s\t%0,%1";
+
+ if (src_code == MEM)
+ switch (GET_MODE_SIZE (mode))
+ {
+ case 1: return "lbu\t%0,%1";
+ case 2: return "lhu\t%0,%1";
+ case 4: return "lw\t%0,%1";
+ case 8: return "ld\t%0,%1";
+ }
+
+ if (src_code == CONST_INT)
+ return "li\t%0,%1";
+
+ if (src_code == HIGH)
+ return "lui\t%0,%h1";
+
+ if (symbolic_operand (src, VOIDmode))
+ switch (riscv_classify_symbolic_expression (src))
+ {
+ case SYMBOL_GOT_DISP: return "la\t%0,%1";
+ case SYMBOL_ABSOLUTE: return "lla\t%0,%1";
+ default: gcc_unreachable();
+ }
+ }
if ((src_code == REG && GP_REG_P (REGNO (src)))
|| (src == CONST0_RTX (mode)))
{
@@ -1784,37 +1812,6 @@ riscv_output_move (rtx dest, rtx src)
case 8: return "sd\t%z1,%0";
}
}
- if (dest_code == REG && GP_REG_P (REGNO (dest)))
- {
- if (src_code == REG)
- {
- if (FP_REG_P (REGNO (src)))
- return dbl_p ? "fmv.x.d\t%0,%1" : "fmv.x.s\t%0,%1";
- }
-
- if (src_code == MEM)
- switch (GET_MODE_SIZE (mode))
- {
- case 1: return "lbu\t%0,%1";
- case 2: return "lhu\t%0,%1";
- case 4: return "lw\t%0,%1";
- case 8: return "ld\t%0,%1";
- }
-
- if (src_code == CONST_INT)
- return "li\t%0,%1";
-
- if (src_code == HIGH)
- return "lui\t%0,%h1";
-
- if (symbolic_operand (src, VOIDmode))
- switch (riscv_classify_symbolic_expression (src))
- {
- case SYMBOL_GOT_DISP: return "la\t%0,%1";
- case SYMBOL_ABSOLUTE: return "lla\t%0,%1";
- default: gcc_unreachable();
- }
- }
if (src_code == REG && FP_REG_P (REGNO (src)))
{
if (dest_code == REG && FP_REG_P (REGNO (dest)))