/* * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
staticvoid assertArraysEquals(int[] r, int[] a, FUnOp f) { int i = 0; try { for (; i < a.length; i++) { Assert.assertEquals(r[i], f.apply(a[i]));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a[i]), "at index #" + i + ", input = " + a[i]);
}
}
interface FUnArrayOp { int[] apply(int a);
}
staticvoid assertArraysEquals(int[] r, int[] a, FUnArrayOp f) { int i = 0; try { for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a[i]));
}
} catch (AssertionError e) { int[] ref = f.apply(a[i]); int[] res = Arrays.copyOfRange(r, i, i+SPECIES.length()); Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i);
}
}
staticvoid assertArraysEquals(int[] r, int[] a, boolean[] mask, FUnOp f) { int i = 0; try { for (; i < a.length; i++) { Assert.assertEquals(r[i], mask[i % SPECIES.length()] ? f.apply(a[i]) : a[i]);
}
} catch (AssertionError e) { Assert.assertEquals(r[i], mask[i % SPECIES.length()] ? f.apply(a[i]) : a[i], "at index #" + i + ", input = " + a[i] + ", mask = " + mask[i % SPECIES.length()]);
}
}
interface FReductionOp { int apply(int[] a, int idx);
}
interface FReductionAllOp { int apply(int[] a);
}
staticvoid assertReductionArraysEquals(int[] r, int rc, int[] a,
FReductionOp f, FReductionAllOp fa) { int i = 0; try { Assert.assertEquals(rc, fa.apply(a)); for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) { Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!"); Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FReductionMaskedOp { int apply(int[] a, int idx, boolean[] mask);
}
interface FReductionAllMaskedOp { int apply(int[] a, boolean[] mask);
}
staticvoid assertReductionArraysEqualsMasked(int[] r, int rc, int[] a, boolean[] mask,
FReductionMaskedOp f, FReductionAllMaskedOp fa) { int i = 0; try { Assert.assertEquals(rc, fa.apply(a, mask)); for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i, mask));
}
} catch (AssertionError e) { Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!"); Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
}
}
interface FReductionOpLong { long apply(int[] a, int idx);
}
interface FReductionAllOpLong { long apply(int[] a);
}
staticvoid assertReductionLongArraysEquals(long[] r, long rc, int[] a,
FReductionOpLong f, FReductionAllOpLong fa) { int i = 0; try { Assert.assertEquals(rc, fa.apply(a)); for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) { Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!"); Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FReductionMaskedOpLong { long apply(int[] a, int idx, boolean[] mask);
}
interface FReductionAllMaskedOpLong { long apply(int[] a, boolean[] mask);
}
staticvoid assertReductionLongArraysEqualsMasked(long[] r, long rc, int[] a, boolean[] mask,
FReductionMaskedOpLong f, FReductionAllMaskedOpLong fa) { int i = 0; try { Assert.assertEquals(rc, fa.apply(a, mask)); for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i, mask));
}
} catch (AssertionError e) { Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!"); Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
}
}
interface FBoolReductionOp { boolean apply(boolean[] a, int idx);
}
staticvoid assertReductionBoolArraysEquals(boolean[] r, boolean[] a, FBoolReductionOp f) { int i = 0; try { for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FMaskReductionOp { int apply(boolean[] a, int idx);
}
staticvoid assertMaskReductionArraysEquals(int[] r, boolean[] a, FMaskReductionOp f) { int i = 0; try { for (; i < a.length; i += SPECIES.length()) { Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
staticvoid assertInsertArraysEquals(int[] r, int[] a, int element, int index, int start, int end) { int i = start; try { for (; i < end; i += 1) { if(i%SPECIES.length() == index) { Assert.assertEquals(r[i], element);
} else { Assert.assertEquals(r[i], a[i]);
}
}
} catch (AssertionError e) { if (i%SPECIES.length() == index) { Assert.assertEquals(r[i], element, "at index #" + i);
} else { Assert.assertEquals(r[i], a[i], "at index #" + i);
}
}
}
staticvoid assertRearrangeArraysEquals(int[] r, int[] a, int[] order, int vector_len) { int i = 0, j = 0; try { for (; i < a.length; i += vector_len) { for (j = 0; j < vector_len; j++) { Assert.assertEquals(r[i+j], a[i+order[i+j]]);
}
}
} catch (AssertionError e) { int idx = i + j; Assert.assertEquals(r[i+j], a[i+order[i+j]], "at index #" + idx + ", input = " + a[i+order[i+j]]);
}
}
staticvoid assertcompressArraysEquals(int[] r, int[] a, boolean[] m, int vector_len) { int i = 0, j = 0, k = 0; try { for (; i < a.length; i += vector_len) {
k = 0; for (j = 0; j < vector_len; j++) { if (m[(i + j) % SPECIES.length()]) { Assert.assertEquals(r[i + k], a[i + j]);
k++;
}
} for (; k < vector_len; k++) { Assert.assertEquals(r[i + k], (int)0);
}
}
} catch (AssertionError e) { int idx = i + k; if (m[(i + j) % SPECIES.length()]) { Assert.assertEquals(r[idx], a[i + j], "at index #" + idx);
} else { Assert.assertEquals(r[idx], (int)0, "at index #" + idx);
}
}
}
staticvoid assertexpandArraysEquals(int[] r, int[] a, boolean[] m, int vector_len) { int i = 0, j = 0, k = 0; try { for (; i < a.length; i += vector_len) {
k = 0; for (j = 0; j < vector_len; j++) { if (m[(i + j) % SPECIES.length()]) { Assert.assertEquals(r[i + j], a[i + k]);
k++;
} else { Assert.assertEquals(r[i + j], (int)0);
}
}
}
} catch (AssertionError e) { int idx = i + j; if (m[idx % SPECIES.length()]) { Assert.assertEquals(r[idx], a[i + k], "at index #" + idx);
} else { Assert.assertEquals(r[idx], (int)0, "at index #" + idx);
}
}
}
staticvoid assertSelectFromArraysEquals(int[] r, int[] a, int[] order, int vector_len) { int i = 0, j = 0; try { for (; i < a.length; i += vector_len) { for (j = 0; j < vector_len; j++) { Assert.assertEquals(r[i+j], a[i+(int)order[i+j]]);
}
}
} catch (AssertionError e) { int idx = i + j; Assert.assertEquals(r[i+j], a[i+(int)order[i+j]], "at index #" + idx + ", input = " + a[i+(int)order[i+j]]);
}
}
staticvoid assertRearrangeArraysEquals(int[] r, int[] a, int[] order, boolean[] mask, intvector_len) { int i = 0, j = 0; try { for (; i < a.length; i += vector_len) { for (j = 0; j < vector_len; j++) { if (mask[j % SPECIES.length()]) Assert.assertEquals(r[i+j], a[i+order[i+j]]); else Assert.assertEquals(r[i+j], (int)0);
}
}
} catch (AssertionError e) { int idx = i + j; if (mask[j % SPECIES.length()]) Assert.assertEquals(r[i+j], a[i+order[i+j]], "at index #" + idx + ", input = " + a[i+order[i+j]] + ", mask = " + mask[j % SPECIES.length()]); else Assert.assertEquals(r[i+j], (int)0, "at index #" + idx + ", input = " + a[i+order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
}
}
staticvoid assertSelectFromArraysEquals(int[] r, int[] a, int[] order, boolean[] mask, int vector_len) { int i = 0, j = 0; try { for (; i < a.length; i += vector_len) { for (j = 0; j < vector_len; j++) { if (mask[j % SPECIES.length()]) Assert.assertEquals(r[i+j], a[i+(int)order[i+j]]); else Assert.assertEquals(r[i+j], (int)0);
}
}
} catch (AssertionError e) { int idx = i + j; if (mask[j % SPECIES.length()]) Assert.assertEquals(r[i+j], a[i+(int)order[i+j]], "at index #" + idx + ", input = " + a[i+(int)order[i+j]] + ", mask = " + mask[j % SPECIES.length()]); else Assert.assertEquals(r[i+j], (int)0, "at index #" + idx + ", input = " + a[i+(int)order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
}
}
staticvoid assertBroadcastArraysEquals(int[] r, int[] a) { int i = 0; for (; i < a.length; i += SPECIES.length()) { int idx = i; for (int j = idx; j < (idx + SPECIES.length()); j++)
a[j]=a[idx];
}
try { for (i = 0; i < a.length; i++) { Assert.assertEquals(r[i], a[i]);
}
} catch (AssertionError e) { Assert.assertEquals(r[i], a[i], "at index #" + i + ", input = " + a[i]);
}
}
interface FBinOp { int apply(int a, int b);
}
interface FBinMaskOp { int apply(int a, int b, boolean m);
static FBinMaskOp lift(FBinOp f) { return (a, b, m) -> m ? f.apply(a, b) : a;
}
}
staticvoid assertArraysEquals(int[] r, int[] a, int[] b, FBinOp f) { int i = 0; try { for (; i < a.length; i++) { Assert.assertEquals(r[i], f.apply(a[i], b[i]));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a[i], b[i]), "(" + a[i] + ", " + b[i] + ") at index #" + i);
}
}
staticvoid assertBroadcastArraysEquals(int[] r, int[] a, int[] b, FBinOp f) { int i = 0; try { for (; i < a.length; i++) { Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()]));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()]), "(" + a[i] + ", " + b[(i / SPECIES.length()) * SPECIES.length()] + ") at index #" + i);
}
}
staticvoid assertBroadcastLongArraysEquals(int[] r, int[] a, int[] b, FBinOp f) { int i = 0; try { for (; i < a.length; i++) { Assert.assertEquals(r[i], f.apply(a[i], (int)((long)b[(i / SPECIES.length()) * SPECIES.length()])));
}
} catch (AssertionError e) { Assert.assertEquals(r[i], f.apply(a[i], (int)((long)b[(i / SPECIES.length()) * SPECIES.length()])), "(" + a[i] + ", " + b[(i / SPECIES.length()) * SPECIES.length()] + ") at index #" + i);
}
}
staticvoid assertArraysEquals(int[] r, int[] a, int[] b, boolean[] mask, FBinOp f) {
assertArraysEquals(r, a, b, mask, FBinMaskOp.lift(f));
}
// Create combinations of pairs // @@@ Might be sensitive to order e.g. div by 0 staticfinal List<List<IntFunction<int[]>>> INT_GENERATOR_PAIRS =
Stream.of(INT_GENERATORS.get(0)).
flatMap(fa -> INT_GENERATORS.stream().skip(1).map(fb -> List.of(fa, fb))).
collect(Collectors.toList());
@DataProvider public Object[][] boolUnaryOpProvider() { return BOOL_ARRAY_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@Test // Test all shuffle related operations. staticvoid shuffleTest() { // To test backend instructions, make sure that C2 is used. for (int loop = 0; loop < INVOC_COUNT * INVOC_COUNT; loop++) {
iotaShuffle();
}
}
@Test // Test div by 0. staticvoid bitwiseDivByZeroSmokeTest() { try {
IntVector a = (IntVector) SPECIES.broadcast(0).addIndex(1);
IntVector b = (IntVector) SPECIES.broadcast(0);
a.div(b); Assert.fail();
} catch (ArithmeticException e) {
}
try {
IntVector a = (IntVector) SPECIES.broadcast(0).addIndex(1);
IntVector b = (IntVector) SPECIES.broadcast(0);
VectorMask<Integer> m = a.lt((int) 1);
a.div(b, m); Assert.fail();
} catch (ArithmeticException e) {
}
}
staticint ADD(int a, int b) { return (int)(a + b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid ADDInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ADD, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::ADD);
}
staticint add(int a, int b) { return (int)(a + b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid addInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.add(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Int256VectorTests::add);
}
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ADD, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::ADD);
}
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.add(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::add);
}
staticint SUB(int a, int b) { return (int)(a - b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid SUBInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUB, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::SUB);
}
staticint sub(int a, int b) { return (int)(a - b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid subInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.sub(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Int256VectorTests::sub);
}
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUB, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::SUB);
}
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.sub(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::sub);
}
staticint MUL(int a, int b) { return (int)(a * b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid MULInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MUL, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::MUL);
}
staticint mul(int a, int b) { return (int)(a * b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid mulInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.mul(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Int256VectorTests::mul);
}
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MUL, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::MUL);
}
for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.mul(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::mul);
}
staticint DIV(int a, int b) { return (int)(a / b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid DIVInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
replaceZero(b, (int) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.DIV, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::DIV);
}
staticint div(int a, int b) { return (int)(a / b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid divInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
replaceZero(b, (int) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.div(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::div);
}
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.DIV, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::DIV);
}
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.div(bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Int256VectorTests::div);
}
staticint FIRST_NONZERO(int a, int b) { return (int)((a)!=0?a:b);
}
@Test(dataProvider = "intBinaryOpProvider") staticvoid FIRST_NONZEROInt256VectorTests(IntFunction<int[]> fa, IntFunction<int[]> fb) { int[] a = fa.apply(SPECIES.length()); int[] b = fb.apply(SPECIES.length()); int[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) { for (int i = 0; i < a.length; i += SPECIES.length()) {
IntVector av = IntVector.fromArray(SPECIES, a, i);
IntVector bv = IntVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.FIRST_NONZERO, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::FIRST_NONZERO);
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.49Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.