Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
5910fb59
Commit
5910fb59
authored
Sep 14, 2009
by
Michael Meissner
Committed by
Michael Meissner
Sep 14, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix PR 41210 & 41331 on powerpc
From-SVN: r151691
parent
6c1c1dfa
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
65 additions
and
47 deletions
+65
-47
gcc/ChangeLog
+19
-0
gcc/config/rs6000/rs6000.c
+15
-33
gcc/config/rs6000/rs6000.md
+16
-14
gcc/testsuite/ChangeLog
+6
-0
gcc/testsuite/gcc.target/powerpc/bswap64-4.c
+9
-0
No files found.
gcc/ChangeLog
View file @
5910fb59
2009-09-14 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/41210
* config/rs6000/rs6000.c (rs6000_function_value): V2DF and V2DI
are returned in the same register (vs34 or v2) that Altivec vector
types are returned in.
(rs6000_libcall_value): Ditto.
PR target/41331
* config/rs6000/rs6000.c (rs6000_emit_move): Use gen_add3_insn
instead of explicit addsi3/adddi3 calls.
(rs6000_split_multireg_move): Ditto.
(rs6000_emit_allocate_stack): Ditto.
(rs6000_emit_prologue): Ditto.
(rs6000_output_mi_thunk): Ditto.
* config/rs6000/rs6000.md (bswapdi*): Don't assume the pointer
size is 64 bits if we can use 64-bit registers.
2009-09-14 Bernd Schmidt <bernd.schmidt@analog.com>
2009-09-14 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/bfin.c (bfin_longcall_p): Don't use short calls for weak
* config/bfin/bfin.c (bfin_longcall_p): Don't use short calls for weak
...
...
gcc/config/rs6000/rs6000.c
View file @
5910fb59
...
@@ -6488,10 +6488,7 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
...
@@ -6488,10 +6488,7 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
rtx
other
=
XEXP
(
XEXP
(
operands
[
1
],
0
),
1
);
rtx
other
=
XEXP
(
XEXP
(
operands
[
1
],
0
),
1
);
sym
=
force_reg
(
mode
,
sym
);
sym
=
force_reg
(
mode
,
sym
);
if
(
mode
==
SImode
)
emit_insn
(
gen_add3_insn
(
operands
[
0
],
sym
,
other
));
emit_insn
(
gen_addsi3
(
operands
[
0
],
sym
,
other
));
else
emit_insn
(
gen_adddi3
(
operands
[
0
],
sym
,
other
));
return
;
return
;
}
}
...
@@ -16473,9 +16470,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
...
@@ -16473,9 +16470,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
delta_rtx
=
(
GET_CODE
(
XEXP
(
src
,
0
))
==
PRE_INC
delta_rtx
=
(
GET_CODE
(
XEXP
(
src
,
0
))
==
PRE_INC
?
GEN_INT
(
GET_MODE_SIZE
(
GET_MODE
(
src
)))
?
GEN_INT
(
GET_MODE_SIZE
(
GET_MODE
(
src
)))
:
GEN_INT
(
-
GET_MODE_SIZE
(
GET_MODE
(
src
))));
:
GEN_INT
(
-
GET_MODE_SIZE
(
GET_MODE
(
src
))));
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
breg
,
breg
,
delta_rtx
));
?
gen_addsi3
(
breg
,
breg
,
delta_rtx
)
:
gen_adddi3
(
breg
,
breg
,
delta_rtx
));
src
=
replace_equiv_address
(
src
,
breg
);
src
=
replace_equiv_address
(
src
,
breg
);
}
}
else
if
(
!
rs6000_offsettable_memref_p
(
src
))
else
if
(
!
rs6000_offsettable_memref_p
(
src
))
...
@@ -16525,9 +16520,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
...
@@ -16525,9 +16520,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
used_update
=
true
;
used_update
=
true
;
}
}
else
else
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
breg
,
breg
,
delta_rtx
));
?
gen_addsi3
(
breg
,
breg
,
delta_rtx
)
:
gen_adddi3
(
breg
,
breg
,
delta_rtx
));
dst
=
replace_equiv_address
(
dst
,
breg
);
dst
=
replace_equiv_address
(
dst
,
breg
);
}
}
else
else
...
@@ -17728,14 +17721,7 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12, int copy_r11)
...
@@ -17728,14 +17721,7 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12, int copy_r11)
&&
REGNO
(
stack_limit_rtx
)
>
1
&&
REGNO
(
stack_limit_rtx
)
>
1
&&
REGNO
(
stack_limit_rtx
)
<=
31
)
&&
REGNO
(
stack_limit_rtx
)
<=
31
)
{
{
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
tmp_reg
,
stack_limit_rtx
,
GEN_INT
(
size
)));
?
gen_addsi3
(
tmp_reg
,
stack_limit_rtx
,
GEN_INT
(
size
))
:
gen_adddi3
(
tmp_reg
,
stack_limit_rtx
,
GEN_INT
(
size
)));
emit_insn
(
gen_cond_trap
(
LTU
,
stack_reg
,
tmp_reg
,
emit_insn
(
gen_cond_trap
(
LTU
,
stack_reg
,
tmp_reg
,
const0_rtx
));
const0_rtx
));
}
}
...
@@ -18648,9 +18634,7 @@ rs6000_emit_prologue (void)
...
@@ -18648,9 +18634,7 @@ rs6000_emit_prologue (void)
rtx
ptr_reg
=
(
sp_reg_rtx
==
frame_reg_rtx
rtx
ptr_reg
=
(
sp_reg_rtx
==
frame_reg_rtx
?
sp_reg_rtx
:
r11
);
?
sp_reg_rtx
:
r11
);
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
r11
,
ptr_reg
,
offset
));
?
gen_addsi3
(
r11
,
ptr_reg
,
offset
)
:
gen_adddi3
(
r11
,
ptr_reg
,
offset
));
}
}
par
=
rs6000_make_savres_rtx
(
info
,
frame_reg_rtx
,
par
=
rs6000_make_savres_rtx
(
info
,
frame_reg_rtx
,
...
@@ -20090,12 +20074,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
...
@@ -20090,12 +20074,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
/* Apply the constant offset, if required. */
/* Apply the constant offset, if required. */
if
(
delta
)
if
(
delta
)
{
emit_insn
(
gen_add3_insn
(
this_rtx
,
this_rtx
,
GEN_INT
(
delta
)));
rtx
delta_rtx
=
GEN_INT
(
delta
);
emit_insn
(
TARGET_32BIT
?
gen_addsi3
(
this_rtx
,
this_rtx
,
delta_rtx
)
:
gen_adddi3
(
this_rtx
,
this_rtx
,
delta_rtx
));
}
/* Apply the offset from the vtable, if required. */
/* Apply the offset from the vtable, if required. */
if
(
vcall_offset
)
if
(
vcall_offset
)
...
@@ -20106,9 +20085,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
...
@@ -20106,9 +20085,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
this_rtx
));
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
this_rtx
));
if
(((
unsigned
HOST_WIDE_INT
)
vcall_offset
)
+
0x8000
>=
0x10000
)
if
(((
unsigned
HOST_WIDE_INT
)
vcall_offset
)
+
0x8000
>=
0x10000
)
{
{
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
tmp
,
tmp
,
vcall_offset_rtx
));
?
gen_addsi3
(
tmp
,
tmp
,
vcall_offset_rtx
)
:
gen_adddi3
(
tmp
,
tmp
,
vcall_offset_rtx
));
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
tmp
));
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
tmp
));
}
}
else
else
...
@@ -20117,9 +20094,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
...
@@ -20117,9 +20094,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
loc
));
emit_move_insn
(
tmp
,
gen_rtx_MEM
(
Pmode
,
loc
));
}
}
emit_insn
(
TARGET_32BIT
emit_insn
(
gen_add3_insn
(
this_rtx
,
this_rtx
,
tmp
));
?
gen_addsi3
(
this_rtx
,
this_rtx
,
tmp
)
:
gen_adddi3
(
this_rtx
,
this_rtx
,
tmp
));
}
}
/* Generate a tail call to the target function. */
/* Generate a tail call to the target function. */
...
@@ -25002,6 +24977,10 @@ rs6000_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
...
@@ -25002,6 +24977,10 @@ rs6000_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
&&
TARGET_ALTIVEC
&&
TARGET_ALTIVEC_ABI
&&
TARGET_ALTIVEC
&&
TARGET_ALTIVEC_ABI
&&
ALTIVEC_VECTOR_MODE
(
mode
))
&&
ALTIVEC_VECTOR_MODE
(
mode
))
regno
=
ALTIVEC_ARG_RETURN
;
regno
=
ALTIVEC_ARG_RETURN
;
else
if
(
TREE_CODE
(
valtype
)
==
VECTOR_TYPE
&&
TARGET_VSX
&&
TARGET_ALTIVEC_ABI
&&
VSX_VECTOR_MODE
(
mode
))
regno
=
ALTIVEC_ARG_RETURN
;
else
if
(
TARGET_E500_DOUBLE
&&
TARGET_HARD_FLOAT
else
if
(
TARGET_E500_DOUBLE
&&
TARGET_HARD_FLOAT
&&
(
mode
==
DFmode
||
mode
==
DCmode
&&
(
mode
==
DFmode
||
mode
==
DCmode
||
mode
==
TFmode
||
mode
==
TCmode
))
||
mode
==
TFmode
||
mode
==
TCmode
))
...
@@ -25043,6 +25022,9 @@ rs6000_libcall_value (enum machine_mode mode)
...
@@ -25043,6 +25022,9 @@ rs6000_libcall_value (enum machine_mode mode)
else
if
(
ALTIVEC_VECTOR_MODE
(
mode
)
else
if
(
ALTIVEC_VECTOR_MODE
(
mode
)
&&
TARGET_ALTIVEC
&&
TARGET_ALTIVEC_ABI
)
&&
TARGET_ALTIVEC
&&
TARGET_ALTIVEC_ABI
)
regno
=
ALTIVEC_ARG_RETURN
;
regno
=
ALTIVEC_ARG_RETURN
;
else
if
(
VSX_VECTOR_MODE
(
mode
)
&&
TARGET_VSX
&&
TARGET_ALTIVEC_ABI
)
regno
=
ALTIVEC_ARG_RETURN
;
else
if
(
COMPLEX_MODE_P
(
mode
)
&&
targetm
.
calls
.
split_complex_arg
)
else
if
(
COMPLEX_MODE_P
(
mode
)
&&
targetm
.
calls
.
split_complex_arg
)
return
rs6000_complex_function_value
(
mode
);
return
rs6000_complex_function_value
(
mode
);
else
if
(
TARGET_E500_DOUBLE
&&
TARGET_HARD_FLOAT
else
if
(
TARGET_E500_DOUBLE
&&
TARGET_HARD_FLOAT
...
...
gcc/config/rs6000/rs6000.md
View file @
5910fb59
...
@@ -2392,9 +2392,11 @@
...
@@ -2392,9 +2392,11 @@
if (!REG_P (operands
[
0
]
) && !REG_P (operands
[
1
]
))
if (!REG_P (operands
[
0
]
) && !REG_P (operands
[
1
]
))
operands
[
1
]
= force_reg (DImode, operands
[
1
]
);
operands
[
1
]
= force_reg (DImode, operands
[
1
]
);
if (
TARGET_32BIT
)
if (
!TARGET_POWERPC64
)
{
{
/
* 32-bit needs fewer scratch registers. *
/
/
*
32-bit mode needs fewer scratch registers, but 32-bit addressing mode
that uses 64-bit registers needs the same scratch registers as 64-bit
mode.
*
/
emit_insn (gen_bswapdi2_32bit (operands
[
0
]
, operands
[
1
]
));
emit_insn (gen_bswapdi2_32bit (operands
[
0
]
, operands
[
1
]
));
DONE;
DONE;
}
}
...
@@ -2453,13 +2455,13 @@
...
@@ -2453,13 +2455,13 @@
addr1 = XEXP (src, 0);
addr1 = XEXP (src, 0);
if (GET_CODE (addr1) == PLUS)
if (GET_CODE (addr1) == PLUS)
{
{
emit_insn (gen_add
di3
(op2, XEXP (addr1, 0), GEN_INT (4)));
emit_insn (gen_add
3_insn
(op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (
DI
mode, op2, XEXP (addr1, 1));
addr2 = gen_rtx_PLUS (
P
mode, op2, XEXP (addr1, 1));
}
}
else
else
{
{
emit_move_insn (op2, GEN_INT (4));
emit_move_insn (op2, GEN_INT (4));
addr2 = gen_rtx_PLUS (
DI
mode, op2, addr1);
addr2 = gen_rtx_PLUS (
P
mode, op2, addr1);
}
}
if (BYTES_BIG_ENDIAN)
if (BYTES_BIG_ENDIAN)
...
@@ -2503,13 +2505,13 @@
...
@@ -2503,13 +2505,13 @@
addr1 = XEXP (dest, 0);
addr1 = XEXP (dest, 0);
if (GET_CODE (addr1) == PLUS)
if (GET_CODE (addr1) == PLUS)
{
{
emit_insn (gen_add
di3
(op2, XEXP (addr1, 0), GEN_INT (4)));
emit_insn (gen_add
3_insn
(op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (
DI
mode, op2, XEXP (addr1, 1));
addr2 = gen_rtx_PLUS (
P
mode, op2, XEXP (addr1, 1));
}
}
else
else
{
{
emit_move_insn (op2, GEN_INT (4));
emit_move_insn (op2, GEN_INT (4));
addr2 = gen_rtx_PLUS (
DI
mode, op2, addr1);
addr2 = gen_rtx_PLUS (
P
mode, op2, addr1);
}
}
emit_insn (gen_lshrdi3 (op3, src, GEN_INT (32)));
emit_insn (gen_lshrdi3 (op3, src, GEN_INT (32)));
...
@@ -2559,7 +2561,7 @@
...
@@ -2559,7 +2561,7 @@
[
(set (match_operand:DI 0 "reg_or_mem_operand" "=&r,Z,??&r")
[
(set (match_operand:DI 0 "reg_or_mem_operand" "=&r,Z,??&r")
(bswap:DI (match_operand:DI 1 "reg_or_mem_operand" "Z,r,r")))
(bswap:DI (match_operand:DI 1 "reg_or_mem_operand" "Z,r,r")))
(clobber (match_scratch:SI 2 "=&b,&b,X"))]
(clobber (match_scratch:SI 2 "=&b,&b,X"))]
"
TARGET_32BIT
&& (REG_P (operands
[
0
]
) || REG_P (operands
[
1
]
))"
"
!TARGET_POWERPC64
&& (REG_P (operands
[
0
]
) || REG_P (operands
[
1
]
))"
"#"
"#"
[
(set_attr "length" "16,12,36")
]
)
[
(set_attr "length" "16,12,36")
]
)
...
@@ -2567,7 +2569,7 @@
...
@@ -2567,7 +2569,7 @@
[
(set (match_operand:DI 0 "gpc_reg_operand" "")
[
(set (match_operand:DI 0 "gpc_reg_operand" "")
(bswap:DI (match_operand:DI 1 "indexed_or_indirect_operand" "")))
(bswap:DI (match_operand:DI 1 "indexed_or_indirect_operand" "")))
(clobber (match_operand:SI 2 "gpc_reg_operand" ""))]
(clobber (match_operand:SI 2 "gpc_reg_operand" ""))]
"
TARGET_32BIT
&& reload_completed"
"
!TARGET_POWERPC64
&& reload_completed"
[
(const_int 0)
]
[
(const_int 0)
]
"
"
{
{
...
@@ -2584,7 +2586,7 @@
...
@@ -2584,7 +2586,7 @@
addr1 = XEXP (src, 0);
addr1 = XEXP (src, 0);
if (GET_CODE (addr1) == PLUS)
if (GET_CODE (addr1) == PLUS)
{
{
emit_insn (gen_add
si3
(op2, XEXP (addr1, 0), GEN_INT (4)));
emit_insn (gen_add
3_insn
(op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
}
else
else
...
@@ -2612,7 +2614,7 @@
...
@@ -2612,7 +2614,7 @@
[
(set (match_operand:DI 0 "indexed_or_indirect_operand" "")
[
(set (match_operand:DI 0 "indexed_or_indirect_operand" "")
(bswap:DI (match_operand:DI 1 "gpc_reg_operand" "")))
(bswap:DI (match_operand:DI 1 "gpc_reg_operand" "")))
(clobber (match_operand:SI 2 "gpc_reg_operand" ""))]
(clobber (match_operand:SI 2 "gpc_reg_operand" ""))]
"
TARGET_32BIT
&& reload_completed"
"
!TARGET_POWERPC64
&& reload_completed"
[
(const_int 0)
]
[
(const_int 0)
]
"
"
{
{
...
@@ -2629,7 +2631,7 @@
...
@@ -2629,7 +2631,7 @@
addr1 = XEXP (dest, 0);
addr1 = XEXP (dest, 0);
if (GET_CODE (addr1) == PLUS)
if (GET_CODE (addr1) == PLUS)
{
{
emit_insn (gen_add
si3
(op2, XEXP (addr1, 0), GEN_INT (4)));
emit_insn (gen_add
3_insn
(op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
}
else
else
...
@@ -2657,7 +2659,7 @@
...
@@ -2657,7 +2659,7 @@
[
(set (match_operand:DI 0 "gpc_reg_operand" "")
[
(set (match_operand:DI 0 "gpc_reg_operand" "")
(bswap:DI (match_operand:DI 1 "gpc_reg_operand" "")))
(bswap:DI (match_operand:DI 1 "gpc_reg_operand" "")))
(clobber (match_operand:SI 2 "" ""))]
(clobber (match_operand:SI 2 "" ""))]
"
TARGET_32BIT
&& reload_completed"
"
!TARGET_POWERPC64
&& reload_completed"
[
(const_int 0)
]
[
(const_int 0)
]
"
"
{
{
...
...
gcc/testsuite/ChangeLog
View file @
5910fb59
2009-09-14 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/41331
* gcc.target/powerpc/bswap64-4.c: New file to test bswap64 on a
-m32 -mpowerpc64 system.
2009-09-14 Bernd Schmidt <bernd.schmidt@analog.com>
2009-09-14 Bernd Schmidt <bernd.schmidt@analog.com>
From Jie Zhang <jie.zhang@analog.com>:
From Jie Zhang <jie.zhang@analog.com>:
...
...
gcc/testsuite/gcc.target/powerpc/bswap64-4.c
0 → 100644
View file @
5910fb59
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-options "-O2 -mpowerpc64" } */
/* { dg-require-effective-target ilp32 } */
/* { dg-final { scan-assembler-times "lwbrx" 2 } } */
/* { dg-final { scan-assembler-times "stwbrx" 2 } } */
long
long
swap_load
(
long
long
*
a
)
{
return
__builtin_bswap64
(
*
a
);
}
long
long
swap_reg
(
long
long
a
)
{
return
__builtin_bswap64
(
a
);
}
void
swap_store
(
long
long
*
a
,
long
long
b
)
{
*
a
=
__builtin_bswap64
(
b
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment