public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work042)] Revert patch.
@ 2021-03-19 16:20 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-03-19 16:20 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:b8c0ad2186aba8e2da86766a63c62f7b86802d8e
commit b8c0ad2186aba8e2da86766a63c62f7b86802d8e
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Fri Mar 19 12:20:21 2021 -0400
Revert patch.
gcc/
2021-03-19 Michael Meissner <meissner@linux.ibm.com>
Revert patch.
* config/rs6000/altivec.md (xxspltiw_v4si): Rewrite to use
vec_duplicate.
* config/rs6000/predicates.md (easy_vector_constant): Add support
for constants we can create with XXSPLTIW.
* config/rs6000/rs6000-protos.h (xxspltiw_constant_p): New
declaration.
* config/rs6000/rs6000.c (xxspltiw_constant_p): New function.
(xxspltib_constant_p): If we can generate XXSPLTIW don't return
true for generating XXSPLTIB and extend operations.
(output_vec_const_move): Add support for generating XXSPLTIW for
V4SI moves.
(rs6000_expand_vector_init): Add support for generating XXSPLTIW
for V4SI moves.
Diff:
---
gcc/config/rs6000/altivec.md | 17 +++------
gcc/config/rs6000/predicates.md | 4 --
gcc/config/rs6000/rs6000-protos.h | 1 -
gcc/config/rs6000/rs6000.c | 78 ---------------------------------------
4 files changed, 6 insertions(+), 94 deletions(-)
diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
index ec071bbd0a4..e2e17fe90ea 100644
--- a/gcc/config/rs6000/altivec.md
+++ b/gcc/config/rs6000/altivec.md
@@ -820,20 +820,15 @@
"vs<SLDB_lr>dbi %0,%1,%2,%3"
[(set_attr "type" "vecsimple")])
-;; Generate VSPLTIW, XXSPLITB, or XXSPLTIW to load up V4SI constants.
(define_insn "xxspltiw_v4si"
- [(set (match_operand:V4SI 0 "vsx_register_operand" "=wa,wa,v,wa")
- (vec_duplicate:V4SI
- (match_operand:SI 1 "s32bit_cint_operand" "O,wM,wB,n")))]
+ [(set (match_operand:V4SI 0 "register_operand" "=wa")
+ (unspec:V4SI [(match_operand:SI 1 "s32bit_cint_operand" "n")]
+ UNSPEC_XXSPLTIW))]
"TARGET_POWER10"
- "@
- xxspltib %x0,0
- xxspltib %x0,255
- vspltisw %0,%1
- xxspltiw %x0,%1"
+ "xxspltiw %x0,%1"
[(set_attr "type" "vecperm")
- (set_attr "prefixed" "*,*,*,yes")
- (set_attr "prefixed_prepend_p" "*,*,*,no")])
+ (set_attr "prefixed" "yes")
+ (set_attr "prefixed_prepend_p" "no")])
(define_expand "xxspltiw_v4sf"
[(set (match_operand:V4SF 0 "register_operand" "=wa")
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 0c5d7a096f3..859af75dfbd 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -649,14 +649,10 @@
{
int value = 256;
int num_insns = -1;
- rtx constant;
if (zero_constant (op, mode) || all_ones_constant (op, mode))
return true;
- if (TARGET_POWER10 && xxspltiw_constant_p (op, mode, &constant))
- return true;
-
if (TARGET_P9_VECTOR
&& xxspltib_constant_p (op, mode, &num_insns, &value))
return true;
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 46a7d7f7de9..52436fc1637 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -32,7 +32,6 @@ extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, int, int, int,
extern bool easy_altivec_constant (rtx, machine_mode);
extern bool xxspltib_constant_p (rtx, machine_mode, int *, int *);
-extern bool xxspltiw_constant_p (rtx, machine_mode, rtx *);
extern int vspltis_shifted (rtx);
extern HOST_WIDE_INT const_vector_elt_as_int (rtx, unsigned int);
extern bool macho_lo_sum_memory_operand (rtx, machine_mode);
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 3600af26133..f3ee3a7ea22 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -6320,51 +6320,6 @@ gen_easy_altivec_constant (rtx op)
gcc_unreachable ();
}
-/* Return true if OP is of the given MODE and can be generated with the ISA 3.1
- XXSPLTIW instruction. Return the SImode/SFmode/DFmode constant via the
- pointer CONSTANT_PTR. */
-
-bool
-xxspltiw_constant_p (rtx op, machine_mode mode, rtx *constant_ptr)
-{
- *constant_ptr = NULL_RTX;
-
- if (!TARGET_POWER10)
- return false;
-
- if (mode == VOIDmode)
- mode = GET_MODE (op);
-
- else if (mode != GET_MODE (op))
- return false;
-
- if (mode != V4SImode)
- return false;
-
- rtx element;
-
- /* Handle (vec_duplicate <constant>). */
- if (GET_CODE (op) == VEC_DUPLICATE)
- element = XEXP (op, 0);
-
- /* Handle (const_vector [...]). */
- else if (GET_CODE (op) == CONST_VECTOR)
- {
- size_t nunits = GET_MODE_NUNITS (mode);
- element = CONST_VECTOR_ELT (op, 0);
-
- for (size_t i = 1; i < nunits; i++)
- if (!rtx_equal_p (element, CONST_VECTOR_ELT (op, i)))
- return false;
- }
-
- else
- return false;
-
- *constant_ptr = element;
- return true;
-}
-
/* Return true if OP is of the given MODE and can be synthesized with ISA 3.0
instructions (xxspltib, vupkhsb/vextsb2w/vextb2d).
@@ -6397,12 +6352,6 @@ xxspltib_constant_p (rtx op,
else if (mode != GET_MODE (op) && GET_MODE (op) != VOIDmode)
return false;
- /* If we can handle the constant directly with XXSPLTIW, don't both using
- XXSPLTIB and vector extend. */
- rtx constant;
- if (xxspltiw_constant_p (op, mode, &constant))
- return false;
-
/* Handle (vec_duplicate <constant>). */
if (GET_CODE (op) == VEC_DUPLICATE)
{
@@ -6497,7 +6446,6 @@ output_vec_const_move (rtx *operands)
int shift;
machine_mode mode;
rtx dest, vec;
- rtx element;
dest = operands[0];
vec = operands[1];
@@ -6536,24 +6484,6 @@ output_vec_const_move (rtx *operands)
gcc_unreachable ();
}
- /* See if we can generate a XXSPLTIW directly. */
- if (TARGET_POWER10 && xxspltiw_constant_p (vec, mode, &element))
- {
- int r = reg_or_subregno (dest);
-
- if (CONST_INT_P (element))
- operands[2] = element;
- else
- gcc_unreachable ();
-
- HOST_WIDE_INT value = INTVAL (operands[2]);
- if (IN_RANGE (value, -16, 15) && ALTIVEC_REGNO_P (r))
- return "vspltisw %0,%2";
-
- else
- return "xxspltiw %x0,%2";
- }
-
if (TARGET_P9_VECTOR
&& xxspltib_constant_p (vec, mode, &num_insns, &xxspltib_value))
{
@@ -6635,14 +6565,6 @@ rs6000_expand_vector_init (rtx target, rtx vals)
if (n_var == 0)
{
- /* Generate XXSPLTIW if we can. */
- if (TARGET_POWER10 && all_same && mode == V4SImode)
- {
- rtx dup = gen_rtx_VEC_DUPLICATE (mode, XVECEXP (vals, 0, 0));
- emit_insn (gen_rtx_SET (target, dup));
- return;
- }
-
rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
if ((int_vector_p || TARGET_VSX) && all_const_zero)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [gcc(refs/users/meissner/heads/work042)] Revert patch.
@ 2021-03-24 19:58 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-03-24 19:58 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:79f33bdff8d237f2c82e09091e13129cc180d324
commit 79f33bdff8d237f2c82e09091e13129cc180d324
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Wed Mar 24 15:58:07 2021 -0400
Revert patch.
Do not enable __float128 or __ibm128 support on Fortran, PR 96983
This patch does not create the internal types for __float128 and __ibm128
on Fortran which cannot use them. This in turn allows us to set the type
precision for long double to be 128, which Fortran wants.
gcc/
2021-03-23 Michael Meissner <meissner@linux.ibm.com>
Revert patch.
PR fortran/96983
* config/rs6000/rs6000.c (rs6000_debug_reg_global): Add more
debugging for __float128, __ibm128 support.
(rs6000_option_override_internal): Do not enable __float128 and
__ibm128 support for Fortran. On Fortran, make the default long
double precision to be 128. Add error messages if the user tries
to change the long double type between IBM/IEEE on Fortran.
(rs6000_init_libfuncs): Do not enable __ibm128 support if it is
disabled.
* config/rs6000/rs6000.h (FLOAT128_IBM_P): Do not return true if
__ibm128 was disabled for IFmode/ICmode.
(TARGET_IBM128): Move this to rs6000.opt.
* config/rs6000/rs6000.md (FP iterator): Do not enable IF mode if
__ibm128 is disabled.
(FLOAT128 iterator): Likewise.
* config/rs6000/rs6000.opt (x_TARGET_IBM128): New variables to
record whether __ibm128 is supported or not.
(TARGET_IBM128): Likewise.
Diff:
---
gcc/config/rs6000/rs6000.c | 92 +++++++++++---------------------------------
gcc/config/rs6000/rs6000.h | 9 ++++-
gcc/config/rs6000/rs6000.md | 4 +-
gcc/config/rs6000/rs6000.opt | 7 ----
4 files changed, 31 insertions(+), 81 deletions(-)
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c3d280b0874..db215810aa6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -2551,11 +2551,6 @@ rs6000_debug_reg_global (void)
TARGET_IEEEQUAD ? "IEEE" : "IBM");
fprintf (stderr, DEBUG_FMT_S, "default long double type",
TARGET_IEEEQUAD_DEFAULT ? "IEEE" : "IBM");
- if (TARGET_FLOAT128_TYPE)
- fprintf (stderr, DEBUG_FMT_S, "IEEE 128-bit support",
- TARGET_FLOAT128_KEYWORD ? "keyword" : "type");
- if (TARGET_IBM128)
- fprintf (stderr, DEBUG_FMT_S, "__ibm128 keyword", "true");
}
fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
(int)rs6000_sched_restricted_insns_priority);
@@ -4141,20 +4136,12 @@ rs6000_option_override_internal (bool global_init_p)
rs6000_isa_flags &= ~OPTION_MASK_BLOCK_OPS_VECTOR_PAIR;
}
- /* Use long double size to select the appropriate long double.
-
- On C/C++, We use TYPE_PRECISION to differentiate the 3 different long
- double types. We map 128 into the precision used for TFmode.
-
- Fortran does not have support for the types __float128 and __ibm128, just
- the default long double type. For Fortran, we use the precision 128 for
- the long double type. */
- bool is_fortran = lang_GNU_Fortran ();
+ /* Use long double size to select the appropriate long double. We use
+ TYPE_PRECISION to differentiate the 3 different long double types. We map
+ 128 into the precision used for TFmode. */
int default_long_double_size = (RS6000_DEFAULT_LONG_DOUBLE_SIZE == 64
? 64
- : (is_fortran
- ? 128
- : FLOAT_PRECISION_TFmode));
+ : FLOAT_PRECISION_TFmode);
/* Set long double size before the IEEE 128-bit tests. */
if (!global_options_set.x_rs6000_long_double_type_size)
@@ -4166,7 +4153,7 @@ rs6000_option_override_internal (bool global_init_p)
else
rs6000_long_double_type_size = default_long_double_size;
}
- else if (rs6000_long_double_type_size == 128 && !is_fortran)
+ else if (rs6000_long_double_type_size == 128)
rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
else if (global_options_set.x_rs6000_ieeequad)
{
@@ -4197,25 +4184,17 @@ rs6000_option_override_internal (bool global_init_p)
2.32 or newer. Only issue one warning. */
static bool warned_change_long_double;
- if (!warned_change_long_double)
+ if (!warned_change_long_double
+ && (!glibc_supports_ieee_128bit ()
+ || (!lang_GNU_C () && !lang_GNU_CXX ())))
{
warned_change_long_double = true;
- if (is_fortran)
- error ("Fortran does not support %qs to change the default "
- "long double type",
- (TARGET_IEEEQUAD
- ? "-mabi=ieeelongdouble"
- : "-mabi=ibmlongdouble"));
-
- else if (!glibc_supports_ieee_128bit ())
- {
- if (TARGET_IEEEQUAD)
- warning (OPT_Wpsabi, "Using IEEE extended precision "
- "%<long double%>");
- else
- warning (OPT_Wpsabi, "Using IBM extended precision "
- "%<long double%>");
- }
+ if (TARGET_IEEEQUAD)
+ warning (OPT_Wpsabi, "Using IEEE extended precision "
+ "%<long double%>");
+ else
+ warning (OPT_Wpsabi, "Using IBM extended precision "
+ "%<long double%>");
}
}
}
@@ -4224,13 +4203,8 @@ rs6000_option_override_internal (bool global_init_p)
sytems. In GCC 7, we would enable the IEEE 128-bit floating point
infrastructure (-mfloat128-type) but not enable the actual __float128 type
unless the user used the explicit -mfloat128. In GCC 8, we enable both
- the keyword as well as the type.
-
- Fortran does not support separate 128-bit floating point types other than
- long double, we only enable TARGET_FLOAT128_TYPE if the default long double
- for Fortran is IEEE-128 bit. */
- TARGET_FLOAT128_TYPE = (TARGET_FLOAT128_ENABLE_TYPE && TARGET_VSX
- && (!is_fortran || TARGET_IEEEQUAD));
+ the keyword as well as the type. */
+ TARGET_FLOAT128_TYPE = TARGET_FLOAT128_ENABLE_TYPE && TARGET_VSX;
/* IEEE 128-bit floating point requires VSX support. */
if (TARGET_FLOAT128_KEYWORD)
@@ -4244,13 +4218,6 @@ rs6000_option_override_internal (bool global_init_p)
rs6000_isa_flags &= ~(OPTION_MASK_FLOAT128_KEYWORD
| OPTION_MASK_FLOAT128_HW);
}
- else if (is_fortran)
- {
- if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) != 0)
- error ("Fortran does not support %qs", "-mfloat128");
-
- rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_KEYWORD;
- }
else if (!TARGET_FLOAT128_TYPE)
{
TARGET_FLOAT128_TYPE = 1;
@@ -4258,22 +4225,8 @@ rs6000_option_override_internal (bool global_init_p)
}
}
- /* Whether the '__ibm128' keywork is enabled. We enable __ibm128 either if the
- IEEE 128-bit floating point support is enabled or if the long double support
- uses the 128-bit IBM extended double format.
-
- However, we don't enable __ibm128 if the language is Fortran. Fortran
- doesn't have the notion of separate types for __ibm128 and __float128, and it
- wants the precision for the 16 byte floating point type to be 128. With the
- 3 128-bit types enabled, we use the precision field to identify the separate
- types. */
- TARGET_IBM128 = (!is_fortran
- && (TARGET_FLOAT128_TYPE
- || (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)));
-
-
- /* Enable the __float128 keyword under Linux by default for C/C++. */
- if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_KEYWORD && !is_fortran
+ /* Enable the __float128 keyword under Linux by default. */
+ if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_KEYWORD
&& (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) == 0)
rs6000_isa_flags |= OPTION_MASK_FLOAT128_KEYWORD;
@@ -11108,11 +11061,10 @@ rs6000_init_libfuncs (void)
{
/* __float128 support. */
if (TARGET_FLOAT128_TYPE)
- init_float128_ieee (KFmode);
-
- /* __ibm128 support. */
- if (TARGET_IBM128)
- init_float128_ibm (IFmode);
+ {
+ init_float128_ibm (IFmode);
+ init_float128_ieee (KFmode);
+ }
/* AIX/Darwin/64-bit Linux quad floating point routines. */
if (TARGET_LONG_DOUBLE_128)
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 6c25fedc0ff..520e277f7f3 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -334,8 +334,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
#define FLOAT128_IBM_P(MODE) \
((!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128 \
&& ((MODE) == TFmode || (MODE) == TCmode)) \
- || (TARGET_HARD_FLOAT && TARGET_IBM128 \
- && ((MODE) == IFmode || (MODE) == ICmode)))
+ || (TARGET_HARD_FLOAT && ((MODE) == IFmode || (MODE) == ICmode)))
/* Helper macros to say whether a 128-bit floating point type can go in a
single vector register, or whether it needs paired scalar values. */
@@ -510,6 +509,12 @@ extern int rs6000_vector_align[];
#define TARGET_MINMAX (TARGET_HARD_FLOAT && TARGET_PPC_GFXOPT \
&& (TARGET_P9_MINMAX || !flag_trapping_math))
+/* Whether the '__ibm128' keywork is enabled. We enable __ibm128 either if the
+ IEEE 128-bit floating point support is enabled or if the long double support
+ uses the 128-bit IBM extended double format. */
+#define TARGET_IBM128 (TARGET_FLOAT128_TYPE \
+ || (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128))
+
/* In switching from using target_flags to using rs6000_isa_flags, the options
machinery creates OPTION_MASK_<xxx> instead of MASK_<xxx>. For now map
OPTION_MASK_<xxx> back into MASK_<xxx>. */
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index a99681ac6bb..0cad17fec4b 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -480,7 +480,7 @@
(SF "TARGET_HARD_FLOAT")
(DF "TARGET_HARD_FLOAT")
(TF "TARGET_HARD_FLOAT && TARGET_LONG_DOUBLE_128")
- (IF "TARGET_HARD_FLOAT && TARGET_IBM128")
+ (IF "TARGET_HARD_FLOAT && TARGET_LONG_DOUBLE_128")
(KF "TARGET_FLOAT128_TYPE")
(DD "TARGET_DFP")
(TD "TARGET_DFP")])
@@ -604,7 +604,7 @@
; Iterator for 128-bit floating point
(define_mode_iterator FLOAT128 [(KF "TARGET_FLOAT128_TYPE")
- (IF "TARGET_IBM128")
+ (IF "TARGET_FLOAT128_TYPE")
(TF "TARGET_LONG_DOUBLE_128")])
; Iterator for signbit on 64-bit machines with direct move
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 1fb2c35c1b3..0dbdf753673 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -112,13 +112,6 @@ unsigned char x_TARGET_FLOAT128_TYPE
Variable
unsigned char TARGET_FLOAT128_TYPE
-;; Whether to enable the __ibm128 support
-TargetSave
-unsigned char x_TARGET_IBM128
-
-Variable
-unsigned char TARGET_IBM128
-
;; This option existed in the past, but now is always on.
mpowerpc
Target RejectNegative Undocumented Ignore
^ permalink raw reply [flat|nested] 3+ messages in thread
* [gcc(refs/users/meissner/heads/work042)] Revert patch.
@ 2021-03-23 5:07 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-03-23 5:07 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:5cb214751afa342666282df94baf818ef1aeeeb3
commit 5cb214751afa342666282df94baf818ef1aeeeb3
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Tue Mar 23 01:06:32 2021 -0400
Revert patch.
gcc/
2021-03-22 Michael Meissner <meissner@linux.ibm.com>
Revert patch.
* config/rs6000/rs6000.c (rs6000_option_override_internal): Set
the long double precision to 128 for Fortran with the default IBM
128-bit long double type.
Diff:
---
gcc/config/rs6000/rs6000.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 10445f31431..db215810aa6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4153,17 +4153,7 @@ rs6000_option_override_internal (bool global_init_p)
else
rs6000_long_double_type_size = default_long_double_size;
}
- /* C and C++ have 3 128-bit floating point types (__float128, __ibm128, and
- long double). In rs6000-modes.h and rs6000-modes.def, we define the
- precision for these types so that we don't get unwanted promotion from
- __ibm128 or __float128 to long double if long double is the opposite type.
-
- However, Fortran really wants the precision for the 128-bit floating point
- type to be 128. It does not have methods to access either explicit
- __float128 or __ibm128 types. So make the precision of long double 128 for
- Fortran unless the long double type is IEEE 128-bit. */
- else if (rs6000_long_double_type_size == 128
- && (!lang_GNU_Fortran () || !TARGET_IEEEQUAD_DEFAULT))
+ else if (rs6000_long_double_type_size == 128)
rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
else if (global_options_set.x_rs6000_ieeequad)
{
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-03-24 19:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-19 16:20 [gcc(refs/users/meissner/heads/work042)] Revert patch Michael Meissner
2021-03-23 5:07 Michael Meissner
2021-03-24 19:58 Michael Meissner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).