Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(860)

Side by Side Diff: src/mips/code-stubs-mips.cc

Issue 19492006: Cleanup StringAddFlags. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add extra ASSERTs. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mips/code-stubs-mips.h ('k') | src/mips/full-codegen-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 // Test if left operand is a string. 2133 // Test if left operand is a string.
2134 __ JumpIfSmi(left, &call_runtime); 2134 __ JumpIfSmi(left, &call_runtime);
2135 __ GetObjectType(left, a2, a2); 2135 __ GetObjectType(left, a2, a2);
2136 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); 2136 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE));
2137 2137
2138 // Test if right operand is a string. 2138 // Test if right operand is a string.
2139 __ JumpIfSmi(right, &call_runtime); 2139 __ JumpIfSmi(right, &call_runtime);
2140 __ GetObjectType(right, a2, a2); 2140 __ GetObjectType(right, a2, a2);
2141 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); 2141 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE));
2142 2142
2143 StringAddStub string_add_stub((StringAddFlags) 2143 StringAddStub string_add_stub(
2144 (ERECT_FRAME | NO_STRING_CHECK_IN_STUB)); 2144 (StringAddFlags)(STRING_ADD_CHECK_NONE | STRING_ADD_ERECT_FRAME));
2145 GenerateRegisterArgsPush(masm); 2145 GenerateRegisterArgsPush(masm);
2146 __ TailCallStub(&string_add_stub); 2146 __ TailCallStub(&string_add_stub);
2147 2147
2148 __ bind(&call_runtime); 2148 __ bind(&call_runtime);
2149 GenerateTypeTransition(masm); 2149 GenerateTypeTransition(masm);
2150 } 2150 }
2151 2151
2152 2152
2153 void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { 2153 void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
2154 ASSERT(Max(left_type_, right_type_) == BinaryOpIC::INT32); 2154 ASSERT(Max(left_type_, right_type_) == BinaryOpIC::INT32);
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
2551 Label left_not_string, call_runtime; 2551 Label left_not_string, call_runtime;
2552 2552
2553 Register left = a1; 2553 Register left = a1;
2554 Register right = a0; 2554 Register right = a0;
2555 2555
2556 // Check if left argument is a string. 2556 // Check if left argument is a string.
2557 __ JumpIfSmi(left, &left_not_string); 2557 __ JumpIfSmi(left, &left_not_string);
2558 __ GetObjectType(left, a2, a2); 2558 __ GetObjectType(left, a2, a2);
2559 __ Branch(&left_not_string, ge, a2, Operand(FIRST_NONSTRING_TYPE)); 2559 __ Branch(&left_not_string, ge, a2, Operand(FIRST_NONSTRING_TYPE));
2560 2560
2561 StringAddStub string_add_left_stub((StringAddFlags) 2561 StringAddStub string_add_left_stub(
2562 (ERECT_FRAME | NO_STRING_CHECK_LEFT_IN_STUB)); 2562 (StringAddFlags)(STRING_ADD_CHECK_RIGHT | STRING_ADD_ERECT_FRAME));
2563 GenerateRegisterArgsPush(masm); 2563 GenerateRegisterArgsPush(masm);
2564 __ TailCallStub(&string_add_left_stub); 2564 __ TailCallStub(&string_add_left_stub);
2565 2565
2566 // Left operand is not a string, test right. 2566 // Left operand is not a string, test right.
2567 __ bind(&left_not_string); 2567 __ bind(&left_not_string);
2568 __ JumpIfSmi(right, &call_runtime); 2568 __ JumpIfSmi(right, &call_runtime);
2569 __ GetObjectType(right, a2, a2); 2569 __ GetObjectType(right, a2, a2);
2570 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); 2570 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE));
2571 2571
2572 StringAddStub string_add_right_stub((StringAddFlags) 2572 StringAddStub string_add_right_stub(
2573 (ERECT_FRAME | NO_STRING_CHECK_RIGHT_IN_STUB)); 2573 (StringAddFlags)(STRING_ADD_CHECK_LEFT | STRING_ADD_ERECT_FRAME));
2574 GenerateRegisterArgsPush(masm); 2574 GenerateRegisterArgsPush(masm);
2575 __ TailCallStub(&string_add_right_stub); 2575 __ TailCallStub(&string_add_right_stub);
2576 2576
2577 // At least one argument is not a string. 2577 // At least one argument is not a string.
2578 __ bind(&call_runtime); 2578 __ bind(&call_runtime);
2579 } 2579 }
2580 2580
2581 2581
2582 void BinaryOpStub_GenerateHeapResultAllocation(MacroAssembler* masm, 2582 void BinaryOpStub_GenerateHeapResultAllocation(MacroAssembler* masm,
2583 Register result, 2583 Register result,
(...skipping 3281 matching lines...) Expand 10 before | Expand all | Expand 10 after
5865 5865
5866 // Stack on entry: 5866 // Stack on entry:
5867 // sp[0]: second argument (right). 5867 // sp[0]: second argument (right).
5868 // sp[4]: first argument (left). 5868 // sp[4]: first argument (left).
5869 5869
5870 // Load the two arguments. 5870 // Load the two arguments.
5871 __ lw(a0, MemOperand(sp, 1 * kPointerSize)); // First argument. 5871 __ lw(a0, MemOperand(sp, 1 * kPointerSize)); // First argument.
5872 __ lw(a1, MemOperand(sp, 0 * kPointerSize)); // Second argument. 5872 __ lw(a1, MemOperand(sp, 0 * kPointerSize)); // Second argument.
5873 5873
5874 // Make sure that both arguments are strings if not known in advance. 5874 // Make sure that both arguments are strings if not known in advance.
5875 if ((flags_ & NO_STRING_ADD_FLAGS) != 0) { 5875 // Otherwise, at least one of the arguments is definitely a string,
5876 // and we convert the one that is not known to be a string.
5877 if ((flags_ & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) {
5878 ASSERT((flags_ & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT);
5879 ASSERT((flags_ & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT);
5876 __ JumpIfEitherSmi(a0, a1, &call_runtime); 5880 __ JumpIfEitherSmi(a0, a1, &call_runtime);
5877 // Load instance types. 5881 // Load instance types.
5878 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); 5882 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset));
5879 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); 5883 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset));
5880 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); 5884 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset));
5881 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); 5885 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset));
5882 STATIC_ASSERT(kStringTag == 0); 5886 STATIC_ASSERT(kStringTag == 0);
5883 // If either is not a string, go to runtime. 5887 // If either is not a string, go to runtime.
5884 __ Or(t4, t0, Operand(t1)); 5888 __ Or(t4, t0, Operand(t1));
5885 __ And(t4, t4, Operand(kIsNotStringMask)); 5889 __ And(t4, t4, Operand(kIsNotStringMask));
5886 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); 5890 __ Branch(&call_runtime, ne, t4, Operand(zero_reg));
5887 } else { 5891 } else if ((flags_ & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT) {
5888 // Here at least one of the arguments is definitely a string. 5892 ASSERT((flags_ & STRING_ADD_CHECK_RIGHT) == 0);
5889 // We convert the one that is not known to be a string. 5893 GenerateConvertArgument(
5890 if ((flags_ & NO_STRING_CHECK_LEFT_IN_STUB) == 0) { 5894 masm, 1 * kPointerSize, a0, a2, a3, t0, t1, &call_builtin);
5891 ASSERT((flags_ & NO_STRING_CHECK_RIGHT_IN_STUB) != 0); 5895 builtin_id = Builtins::STRING_ADD_RIGHT;
5892 GenerateConvertArgument( 5896 } else if ((flags_ & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT) {
5893 masm, 1 * kPointerSize, a0, a2, a3, t0, t1, &call_builtin); 5897 ASSERT((flags_ & STRING_ADD_CHECK_LEFT) == 0);
5894 builtin_id = Builtins::STRING_ADD_RIGHT; 5898 GenerateConvertArgument(
5895 } else if ((flags_ & NO_STRING_CHECK_RIGHT_IN_STUB) == 0) { 5899 masm, 0 * kPointerSize, a1, a2, a3, t0, t1, &call_builtin);
5896 ASSERT((flags_ & NO_STRING_CHECK_LEFT_IN_STUB) != 0); 5900 builtin_id = Builtins::STRING_ADD_LEFT;
5897 GenerateConvertArgument(
5898 masm, 0 * kPointerSize, a1, a2, a3, t0, t1, &call_builtin);
5899 builtin_id = Builtins::STRING_ADD_LEFT;
5900 }
5901 } 5901 }
5902 5902
5903 // Both arguments are strings. 5903 // Both arguments are strings.
5904 // a0: first string 5904 // a0: first string
5905 // a1: second string 5905 // a1: second string
5906 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) 5906 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS)
5907 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) 5907 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS)
5908 { 5908 {
5909 Label strings_not_empty; 5909 Label strings_not_empty;
5910 // Check if either of the strings are empty. In that case return the other. 5910 // Check if either of the strings are empty. In that case return the other.
(...skipping 30 matching lines...) Expand all
5941 // Look at the length of the result of adding the two strings. 5941 // Look at the length of the result of adding the two strings.
5942 Label string_add_flat_result, longer_than_two; 5942 Label string_add_flat_result, longer_than_two;
5943 // Adding two lengths can't overflow. 5943 // Adding two lengths can't overflow.
5944 STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2); 5944 STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2);
5945 __ Addu(t2, a2, Operand(a3)); 5945 __ Addu(t2, a2, Operand(a3));
5946 // Use the string table when adding two one character strings, as it 5946 // Use the string table when adding two one character strings, as it
5947 // helps later optimizations to return a string here. 5947 // helps later optimizations to return a string here.
5948 __ Branch(&longer_than_two, ne, t2, Operand(2)); 5948 __ Branch(&longer_than_two, ne, t2, Operand(2));
5949 5949
5950 // Check that both strings are non-external ASCII strings. 5950 // Check that both strings are non-external ASCII strings.
5951 if (flags_ != NO_STRING_ADD_FLAGS) { 5951 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) {
5952 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); 5952 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset));
5953 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); 5953 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset));
5954 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); 5954 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset));
5955 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); 5955 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset));
5956 } 5956 }
5957 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3, 5957 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3,
5958 &call_runtime); 5958 &call_runtime);
5959 5959
5960 // Get the two characters forming the sub string. 5960 // Get the two characters forming the sub string.
5961 __ lbu(a2, FieldMemOperand(a0, SeqOneByteString::kHeaderSize)); 5961 __ lbu(a2, FieldMemOperand(a0, SeqOneByteString::kHeaderSize));
(...skipping 23 matching lines...) Expand all
5985 // Check if resulting string will be flat. 5985 // Check if resulting string will be flat.
5986 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength)); 5986 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength));
5987 // Handle exceptionally long strings in the runtime system. 5987 // Handle exceptionally long strings in the runtime system.
5988 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); 5988 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0);
5989 ASSERT(IsPowerOf2(String::kMaxLength + 1)); 5989 ASSERT(IsPowerOf2(String::kMaxLength + 1));
5990 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. 5990 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not.
5991 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1)); 5991 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1));
5992 5992
5993 // If result is not supposed to be flat, allocate a cons string object. 5993 // If result is not supposed to be flat, allocate a cons string object.
5994 // If both strings are ASCII the result is an ASCII cons string. 5994 // If both strings are ASCII the result is an ASCII cons string.
5995 if (flags_ != NO_STRING_ADD_FLAGS) { 5995 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) {
5996 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); 5996 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset));
5997 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); 5997 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset));
5998 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); 5998 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset));
5999 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); 5999 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset));
6000 } 6000 }
6001 Label non_ascii, allocated, ascii_data; 6001 Label non_ascii, allocated, ascii_data;
6002 STATIC_ASSERT(kTwoByteStringTag == 0); 6002 STATIC_ASSERT(kTwoByteStringTag == 0);
6003 // Branch to non_ascii if either string-encoding field is zero (non-ASCII). 6003 // Branch to non_ascii if either string-encoding field is zero (non-ASCII).
6004 __ And(t4, t0, Operand(t1)); 6004 __ And(t4, t0, Operand(t1));
6005 __ And(t4, t4, Operand(kStringEncodingMask)); 6005 __ And(t4, t4, Operand(kStringEncodingMask));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
6068 // Locate the first characters' locations. 6068 // Locate the first characters' locations.
6069 // a0: first string 6069 // a0: first string
6070 // a1: second string 6070 // a1: second string
6071 // a2: length of first string 6071 // a2: length of first string
6072 // a3: length of second string 6072 // a3: length of second string
6073 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) 6073 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS)
6074 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) 6074 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS)
6075 // t2: sum of lengths. 6075 // t2: sum of lengths.
6076 Label first_prepared, second_prepared; 6076 Label first_prepared, second_prepared;
6077 __ bind(&string_add_flat_result); 6077 __ bind(&string_add_flat_result);
6078 if (flags_ != NO_STRING_ADD_FLAGS) { 6078 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) {
6079 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); 6079 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset));
6080 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); 6080 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset));
6081 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); 6081 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset));
6082 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); 6082 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset));
6083 } 6083 }
6084 // Check whether both strings have same encoding 6084 // Check whether both strings have same encoding
6085 __ Xor(t3, t0, Operand(t1)); 6085 __ Xor(t3, t0, Operand(t1));
6086 __ And(t3, t3, Operand(kStringEncodingMask)); 6086 __ And(t3, t3, Operand(kStringEncodingMask));
6087 __ Branch(&call_runtime, ne, t3, Operand(zero_reg)); 6087 __ Branch(&call_runtime, ne, t3, Operand(zero_reg));
6088 6088
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
6154 // t2: first character of result. 6154 // t2: first character of result.
6155 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, false); 6155 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, false);
6156 // t2: next character of result. 6156 // t2: next character of result.
6157 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, false); 6157 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, false);
6158 6158
6159 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); 6159 __ IncrementCounter(counters->string_add_native(), 1, a2, a3);
6160 __ DropAndRet(2); 6160 __ DropAndRet(2);
6161 6161
6162 // Just jump to runtime to add the two strings. 6162 // Just jump to runtime to add the two strings.
6163 __ bind(&call_runtime); 6163 __ bind(&call_runtime);
6164 if ((flags_ & ERECT_FRAME) != 0) { 6164 if ((flags_ & STRING_ADD_ERECT_FRAME) != 0) {
6165 GenerateRegisterArgsPop(masm); 6165 GenerateRegisterArgsPop(masm);
6166 // Build a frame. 6166 // Build a frame.
6167 { 6167 {
6168 FrameScope scope(masm, StackFrame::INTERNAL); 6168 FrameScope scope(masm, StackFrame::INTERNAL);
6169 GenerateRegisterArgsPush(masm); 6169 GenerateRegisterArgsPush(masm);
6170 __ CallRuntime(Runtime::kStringAdd, 2); 6170 __ CallRuntime(Runtime::kStringAdd, 2);
6171 } 6171 }
6172 __ Ret(); 6172 __ Ret();
6173 } else { 6173 } else {
6174 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); 6174 __ TailCallRuntime(Runtime::kStringAdd, 2, 1);
6175 } 6175 }
6176 6176
6177 if (call_builtin.is_linked()) { 6177 if (call_builtin.is_linked()) {
6178 __ bind(&call_builtin); 6178 __ bind(&call_builtin);
6179 if ((flags_ & ERECT_FRAME) != 0) { 6179 if ((flags_ & STRING_ADD_ERECT_FRAME) != 0) {
6180 GenerateRegisterArgsPop(masm); 6180 GenerateRegisterArgsPop(masm);
6181 // Build a frame. 6181 // Build a frame.
6182 { 6182 {
6183 FrameScope scope(masm, StackFrame::INTERNAL); 6183 FrameScope scope(masm, StackFrame::INTERNAL);
6184 GenerateRegisterArgsPush(masm); 6184 GenerateRegisterArgsPush(masm);
6185 __ InvokeBuiltin(builtin_id, CALL_FUNCTION); 6185 __ InvokeBuiltin(builtin_id, CALL_FUNCTION);
6186 } 6186 }
6187 __ Ret(); 6187 __ Ret();
6188 } else { 6188 } else {
6189 __ InvokeBuiltin(builtin_id, JUMP_FUNCTION); 6189 __ InvokeBuiltin(builtin_id, JUMP_FUNCTION);
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after
7620 __ bind(&fast_elements_case); 7620 __ bind(&fast_elements_case);
7621 GenerateCase(masm, FAST_ELEMENTS); 7621 GenerateCase(masm, FAST_ELEMENTS);
7622 } 7622 }
7623 7623
7624 7624
7625 #undef __ 7625 #undef __
7626 7626
7627 } } // namespace v8::internal 7627 } } // namespace v8::internal
7628 7628
7629 #endif // V8_TARGET_ARCH_MIPS 7629 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/code-stubs-mips.h ('k') | src/mips/full-codegen-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698