"Jürgen Urban" <[email protected]> writes:
> Hello Richard,
>
>> >> > How much other changes will be currently accepted here? There is other
>> >> > stuff which I want to prepare and submit here, e.g.:
>
>> >> > 3. fix use of ll/sc in libgomp, either increase mips ISA level or use
>> >> > syscall (which is broken in Linux 2.6.35.4).
>
> The attached patch fixes problem 3. libgomp was not the cause of the
> problem. When linux is detected in gcc/config.gcc, the variable
> "with_llsc" is set to "yes". This happens before the CPU is checked. I
> fixed this by storing the original parameter. I think this is better
> than moving the code up.
I think this shows that the current mips*-linux* targets are setting
with_llsc in the wrong place. They should be doing it further down,
where other with_foo defaults are set.
Also, I only just noticed that VxWorks and R5900 were setting with_arch
in the with_cpu block. --with-cpu isn't supported/meaningful for MIPS.
Is the second patch below OK for your target? (Not yet applied.)
> The patch for gcc/config/mips/mips.h fixes that ".set mips2" wasn't used
> when with_llsc=yes was configured.
>
> The patch for gcc/config/mips/mips.c gets lld and scd working. These
> instructions are normally not emulated by the Linux kernel and the
> syscall only supports 32 bit. So I changed my kernel to support lld and
> scd.
Looks good, thanks. I tweaked the mips.c change to follow coding
conventions and kept !TARGET_MIPS16 last. Applied as follows.
Thanks,
Richard
[Applied patch]
gcc/
2013-06-16 Jürgen Urban <[email protected]>
* config/mips/mips.h (ISA_HAS_LL_SC): Exclude TARGET_MIPS5900.
* config/mips/mips.c (mips_start_ll_sc_sync_block): Output
".set mips3" for 64-bit targets.
Index: gcc/config/mips/mips.h
===================================================================
--- gcc/config/mips/mips.h 2013-06-16 10:04:33.151622456 +0100
+++ gcc/config/mips/mips.h 2013-06-16 10:12:52.265346985 +0100
@@ -1063,7 +1063,7 @@ #define GENERATE_SYNC \
/* ISA includes ll and sc. Note that this implies ISA_HAS_SYNC
because the expanders use both ISA_HAS_SYNC and ISA_HAS_LL_SC
instructions. */
-#define ISA_HAS_LL_SC (mips_isa >= 2 && !TARGET_MIPS16)
+#define ISA_HAS_LL_SC (mips_isa >= 2 && !TARGET_MIPS5900 && !TARGET_MIPS16)
#define GENERATE_LL_SC \
(target_flags_explicit & MASK_LLSC \
? TARGET_LLSC && !TARGET_MIPS16 \
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c 2013-06-16 10:04:33.151622456 +0100
+++ gcc/config/mips/mips.c 2013-06-16 10:12:57.717387243 +0100
@@ -12463,7 +12463,10 @@ mips_start_ll_sc_sync_block (void)
if (!ISA_HAS_LL_SC)
{
output_asm_insn (".set\tpush", 0);
- output_asm_insn (".set\tmips2", 0);
+ if (TARGET_64BIT)
+ output_asm_insn (".set\tmips3", 0);
+ else
+ output_asm_insn (".set\tmips2", 0);
}
}
[Suggested config.gcc patch]
gcc/
* config.gcc (mips*-mti-linux*, mips64*-*-linux*, mipsisa64*-*-linux*)
(mips*-*-linux*): Move default with_llsc setting to where other
defaults are set.
(mips*-*-vxworks*): Move with_arch default from with_cpu block to
with_arch block.
(mips64r5900-*-*, mips64r5900el-*-*, mipsr5900-*-*, mipsr5900el-*-*):
Likewise. Remove default with_tune setting. Move default float
setting to its own block. Handle with_llsc in the same block as above.
Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc 2013-06-16 09:41:57.518019616 +0100
+++ gcc/config.gcc 2013-06-16 09:59:57.660470388 +0100
@@ -1813,7 +1813,6 @@ mips*-mti-linux*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32"
gnu_ld=yes
gas=yes
- test x$with_llsc != x || with_llsc=yes
;;
mips64*-*-linux* | mipsisa64*-*-linux*)
tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h"
@@ -1834,7 +1833,6 @@ mips64*-*-linux* | mipsisa64*-*-linux*)
esac
gnu_ld=yes
gas=yes
- test x$with_llsc != x || with_llsc=yes
;;
mips*-*-linux*) # Linux MIPS, either endian.
tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h"
@@ -1850,7 +1848,6 @@ mips*-*-linux*) # Linux MIPS, either
mipsisa32*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=32"
esac
- test x$with_llsc != x || with_llsc=yes
;;
mips*-mti-elf*)
tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/sde.h mips/mti-elf.h"
@@ -2982,22 +2979,6 @@ if test x$with_cpu = x ; then
;;
esac
;;
- mips64r5900-*-* | mips64r5900el-*-* | mipsr5900-*-* | mipsr5900el-*-*)
- with_arch=r5900
- with_tune=r5900
- if test x$with_llsc = x; then
- # r5900 doesn't support ll, sc, lld and scd instructions:
- with_llsc=no
- fi
- if test x$with_float = x; then
- # r5900 doesn't support 64 bit float:
- # 32 bit float doesn't comply with IEEE 754.
- with_float=soft
- fi
- ;;
- mips*-*-vxworks)
- with_arch=mips2
- ;;
powerpc*-*-*spe*)
if test x$enable_e500_double = xyes; then
with_cpu=8548
@@ -3058,6 +3039,12 @@ if test x$with_arch = x ; then
x86_64-*-*)
with_arch=$arch
;;
+ mips64r5900-*-* | mips64r5900el-*-* | mipsr5900-*-* | mipsr5900el-*-*)
+ with_arch=r5900
+ ;;
+ mips*-*-vxworks)
+ with_arch=mips2
+ ;;
esac
# Avoid overriding --with-arch-32 and --with-arch-64 values.
@@ -3092,6 +3079,17 @@ if test x$with_arch = x ; then
esac
fi
+# Infer a default setting for --with-float.
+if test x$with_float = x; then
+ case ${target} in
+ mips64r5900-*-* | mips64r5900el-*-* | mipsr5900-*-* | mipsr5900el-*-*)
+ # The R5900 doesn't support 64-bit float. 32-bit float doesn't
+ # comply with IEEE 754.
+ with_float=soft
+ ;;
+ esac
+fi
+
# Support --with-fpmath.
if test x$with_fpmath != x; then
case ${target} in
@@ -3126,6 +3124,20 @@ if test x$with_schedule = x; then
esac
fi
+# Infer a default setting for --with-llsc.
+if test x$with_llsc = x; then
+ case ${target} in
+ mips64r5900-*-* | mips64r5900el-*-* | mipsr5900-*-* | mipsr5900el-*-*)
+ # The R5900 doesn't support LL(D) and SC(D).
+ with_llsc=no
+ ;;
+ mips*-*-linux*)
+ # The kernel emulates LL and SC where necessary.
+ with_llsc=yes
+ ;;
+ esac
+fi
+
# Validate and mark as valid any --with options supported
# by this target. In order to use a particular --with option
# you must list it in supported_defaults; validating the value