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

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 602603005: MIPS: Minor fixes and additions needed for Turbofan. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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/macro-assembler-mips.h ('k') | no next file » | 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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #if V8_TARGET_ARCH_MIPS 9 #if V8_TARGET_ARCH_MIPS
10 10
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 mflo(res); 783 mflo(res);
784 mfhi(rem); 784 mfhi(rem);
785 } else { 785 } else {
786 div(res, rs, at); 786 div(res, rs, at);
787 mod(rem, rs, at); 787 mod(rem, rs, at);
788 } 788 }
789 } 789 }
790 } 790 }
791 791
792 792
793 void MacroAssembler::Div(Register res, Register rs, const Operand& rt) {
794 if (rt.is_reg()) {
795 if (!IsMipsArchVariant(kMips32r6)) {
796 div(rs, rt.rm());
797 mflo(res);
798 } else {
799 div(res, rs, rt.rm());
800 }
801 } else {
802 // li handles the relocation.
803 DCHECK(!rs.is(at));
804 li(at, rt);
805 if (!IsMipsArchVariant(kMips32r6)) {
806 div(rs, at);
807 mflo(res);
808 } else {
809 div(res, rs, at);
810 }
811 }
812 }
813
814
793 void MacroAssembler::Mod(Register rd, Register rs, const Operand& rt) { 815 void MacroAssembler::Mod(Register rd, Register rs, const Operand& rt) {
794 if (rt.is_reg()) { 816 if (rt.is_reg()) {
795 if (!IsMipsArchVariant(kMips32r6)) { 817 if (!IsMipsArchVariant(kMips32r6)) {
796 div(rs, rt.rm()); 818 div(rs, rt.rm());
797 mfhi(rd); 819 mfhi(rd);
798 } else { 820 } else {
799 mod(rd, rs, rt.rm()); 821 mod(rd, rs, rt.rm());
800 } 822 }
801 } else { 823 } else {
802 // li handles the relocation. 824 // li handles the relocation.
803 DCHECK(!rs.is(at)); 825 DCHECK(!rs.is(at));
804 li(at, rt); 826 li(at, rt);
805 if (!IsMipsArchVariant(kMips32r6)) { 827 if (!IsMipsArchVariant(kMips32r6)) {
806 div(rs, at); 828 div(rs, at);
807 mfhi(rd); 829 mfhi(rd);
808 } else { 830 } else {
809 mod(rd, rs, at); 831 mod(rd, rs, at);
810 } 832 }
811 } 833 }
812 } 834 }
813 835
814 836
837 void MacroAssembler::Modu(Register rd, Register rs, const Operand& rt) {
838 if (rt.is_reg()) {
839 if (!IsMipsArchVariant(kMips32r6)) {
840 divu(rs, rt.rm());
841 mfhi(rd);
842 } else {
843 modu(rd, rs, rt.rm());
844 }
845 } else {
846 // li handles the relocation.
847 DCHECK(!rs.is(at));
848 li(at, rt);
849 if (!IsMipsArchVariant(kMips32r6)) {
850 divu(rs, at);
851 mfhi(rd);
852 } else {
853 modu(rd, rs, at);
854 }
855 }
856 }
857
858
815 void MacroAssembler::Divu(Register rs, const Operand& rt) { 859 void MacroAssembler::Divu(Register rs, const Operand& rt) {
816 if (rt.is_reg()) { 860 if (rt.is_reg()) {
817 divu(rs, rt.rm()); 861 divu(rs, rt.rm());
818 } else { 862 } else {
819 // li handles the relocation. 863 // li handles the relocation.
820 DCHECK(!rs.is(at)); 864 DCHECK(!rs.is(at));
821 li(at, rt); 865 li(at, rt);
822 divu(rs, at); 866 divu(rs, at);
823 } 867 }
824 } 868 }
825 869
826 870
871 void MacroAssembler::Divu(Register res, Register rs, const Operand& rt) {
872 if (rt.is_reg()) {
873 if (!IsMipsArchVariant(kMips32r6)) {
874 divu(rs, rt.rm());
875 mflo(res);
876 } else {
877 divu(res, rs, rt.rm());
878 }
879 } else {
880 // li handles the relocation.
881 DCHECK(!rs.is(at));
882 li(at, rt);
883 if (!IsMipsArchVariant(kMips32r6)) {
884 divu(rs, at);
885 mflo(res);
886 } else {
887 divu(res, rs, at);
888 }
889 }
890 }
891
892
827 void MacroAssembler::And(Register rd, Register rs, const Operand& rt) { 893 void MacroAssembler::And(Register rd, Register rs, const Operand& rt) {
828 if (rt.is_reg()) { 894 if (rt.is_reg()) {
829 and_(rd, rs, rt.rm()); 895 and_(rd, rs, rt.rm());
830 } else { 896 } else {
831 if (is_uint16(rt.imm32_) && !MustUseReg(rt.rmode_)) { 897 if (is_uint16(rt.imm32_) && !MustUseReg(rt.rmode_)) {
832 andi(rd, rs, rt.imm32_); 898 andi(rd, rs, rt.imm32_);
833 } else { 899 } else {
834 // li handles the relocation. 900 // li handles the relocation.
835 DCHECK(!rs.is(at)); 901 DCHECK(!rs.is(at));
836 li(at, rt); 902 li(at, rt);
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
1897 if (r2.is(zero_reg)) { 1963 if (r2.is(zero_reg)) {
1898 blez(rs, offset); 1964 blez(rs, offset);
1899 } else { 1965 } else {
1900 slt(scratch, r2, rs); 1966 slt(scratch, r2, rs);
1901 beq(scratch, zero_reg, offset); 1967 beq(scratch, zero_reg, offset);
1902 } 1968 }
1903 break; 1969 break;
1904 // Unsigned comparison. 1970 // Unsigned comparison.
1905 case Ugreater: 1971 case Ugreater:
1906 if (r2.is(zero_reg)) { 1972 if (r2.is(zero_reg)) {
1907 bgtz(rs, offset); 1973 bne(rs, zero_reg, offset);
1908 } else { 1974 } else {
1909 sltu(scratch, r2, rs); 1975 sltu(scratch, r2, rs);
1910 bne(scratch, zero_reg, offset); 1976 bne(scratch, zero_reg, offset);
1911 } 1977 }
1912 break; 1978 break;
1913 case Ugreater_equal: 1979 case Ugreater_equal:
1914 if (r2.is(zero_reg)) { 1980 if (r2.is(zero_reg)) {
1915 bgez(rs, offset); 1981 b(offset);
1916 } else { 1982 } else {
1917 sltu(scratch, rs, r2); 1983 sltu(scratch, rs, r2);
1918 beq(scratch, zero_reg, offset); 1984 beq(scratch, zero_reg, offset);
1919 } 1985 }
1920 break; 1986 break;
1921 case Uless: 1987 case Uless:
1922 if (r2.is(zero_reg)) { 1988 if (r2.is(zero_reg)) {
1923 // No code needs to be emitted. 1989 // No code needs to be emitted.
1924 return; 1990 return;
1925 } else { 1991 } else {
1926 sltu(scratch, rs, r2); 1992 sltu(scratch, rs, r2);
1927 bne(scratch, zero_reg, offset); 1993 bne(scratch, zero_reg, offset);
1928 } 1994 }
1929 break; 1995 break;
1930 case Uless_equal: 1996 case Uless_equal:
1931 if (r2.is(zero_reg)) { 1997 if (r2.is(zero_reg)) {
1932 b(offset); 1998 beq(rs, zero_reg, offset);
1933 } else { 1999 } else {
1934 sltu(scratch, r2, rs); 2000 sltu(scratch, r2, rs);
1935 beq(scratch, zero_reg, offset); 2001 beq(scratch, zero_reg, offset);
1936 } 2002 }
1937 break; 2003 break;
1938 default: 2004 default:
1939 UNREACHABLE(); 2005 UNREACHABLE();
1940 } 2006 }
1941 } else { 2007 } else {
1942 // Be careful to always use shifted_branch_offset only just before the 2008 // Be careful to always use shifted_branch_offset only just before the
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2004 } else { 2070 } else {
2005 r2 = scratch; 2071 r2 = scratch;
2006 li(r2, rt); 2072 li(r2, rt);
2007 slt(scratch, r2, rs); 2073 slt(scratch, r2, rs);
2008 beq(scratch, zero_reg, offset); 2074 beq(scratch, zero_reg, offset);
2009 } 2075 }
2010 break; 2076 break;
2011 // Unsigned comparison. 2077 // Unsigned comparison.
2012 case Ugreater: 2078 case Ugreater:
2013 if (rt.imm32_ == 0) { 2079 if (rt.imm32_ == 0) {
2014 bgtz(rs, offset); 2080 bne(rs, zero_reg, offset);
2015 } else { 2081 } else {
2016 r2 = scratch; 2082 r2 = scratch;
2017 li(r2, rt); 2083 li(r2, rt);
2018 sltu(scratch, r2, rs); 2084 sltu(scratch, r2, rs);
2019 bne(scratch, zero_reg, offset); 2085 bne(scratch, zero_reg, offset);
2020 } 2086 }
2021 break; 2087 break;
2022 case Ugreater_equal: 2088 case Ugreater_equal:
2023 if (rt.imm32_ == 0) { 2089 if (rt.imm32_ == 0) {
2024 bgez(rs, offset); 2090 b(offset);
2025 } else if (is_int16(rt.imm32_)) { 2091 } else if (is_int16(rt.imm32_)) {
2026 sltiu(scratch, rs, rt.imm32_); 2092 sltiu(scratch, rs, rt.imm32_);
2027 beq(scratch, zero_reg, offset); 2093 beq(scratch, zero_reg, offset);
2028 } else { 2094 } else {
2029 r2 = scratch; 2095 r2 = scratch;
2030 li(r2, rt); 2096 li(r2, rt);
2031 sltu(scratch, rs, r2); 2097 sltu(scratch, rs, r2);
2032 beq(scratch, zero_reg, offset); 2098 beq(scratch, zero_reg, offset);
2033 } 2099 }
2034 break; 2100 break;
2035 case Uless: 2101 case Uless:
2036 if (rt.imm32_ == 0) { 2102 if (rt.imm32_ == 0) {
2037 // No code needs to be emitted. 2103 // No code needs to be emitted.
2038 return; 2104 return;
2039 } else if (is_int16(rt.imm32_)) { 2105 } else if (is_int16(rt.imm32_)) {
2040 sltiu(scratch, rs, rt.imm32_); 2106 sltiu(scratch, rs, rt.imm32_);
2041 bne(scratch, zero_reg, offset); 2107 bne(scratch, zero_reg, offset);
2042 } else { 2108 } else {
2043 r2 = scratch; 2109 r2 = scratch;
2044 li(r2, rt); 2110 li(r2, rt);
2045 sltu(scratch, rs, r2); 2111 sltu(scratch, rs, r2);
2046 bne(scratch, zero_reg, offset); 2112 bne(scratch, zero_reg, offset);
2047 } 2113 }
2048 break; 2114 break;
2049 case Uless_equal: 2115 case Uless_equal:
2050 if (rt.imm32_ == 0) { 2116 if (rt.imm32_ == 0) {
2051 b(offset); 2117 beq(rs, zero_reg, offset);
2052 } else { 2118 } else {
2053 r2 = scratch; 2119 r2 = scratch;
2054 li(r2, rt); 2120 li(r2, rt);
2055 sltu(scratch, r2, rs); 2121 sltu(scratch, r2, rs);
2056 beq(scratch, zero_reg, offset); 2122 beq(scratch, zero_reg, offset);
2057 } 2123 }
2058 break; 2124 break;
2059 default: 2125 default:
2060 UNREACHABLE(); 2126 UNREACHABLE();
2061 } 2127 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2143 } else { 2209 } else {
2144 slt(scratch, r2, rs); 2210 slt(scratch, r2, rs);
2145 offset = shifted_branch_offset(L, false); 2211 offset = shifted_branch_offset(L, false);
2146 beq(scratch, zero_reg, offset); 2212 beq(scratch, zero_reg, offset);
2147 } 2213 }
2148 break; 2214 break;
2149 // Unsigned comparison. 2215 // Unsigned comparison.
2150 case Ugreater: 2216 case Ugreater:
2151 if (r2.is(zero_reg)) { 2217 if (r2.is(zero_reg)) {
2152 offset = shifted_branch_offset(L, false); 2218 offset = shifted_branch_offset(L, false);
2153 bgtz(rs, offset); 2219 bne(rs, zero_reg, offset);
2154 } else { 2220 } else {
2155 sltu(scratch, r2, rs); 2221 sltu(scratch, r2, rs);
2156 offset = shifted_branch_offset(L, false); 2222 offset = shifted_branch_offset(L, false);
2157 bne(scratch, zero_reg, offset); 2223 bne(scratch, zero_reg, offset);
2158 } 2224 }
2159 break; 2225 break;
2160 case Ugreater_equal: 2226 case Ugreater_equal:
2161 if (r2.is(zero_reg)) { 2227 if (r2.is(zero_reg)) {
2162 offset = shifted_branch_offset(L, false); 2228 offset = shifted_branch_offset(L, false);
2163 bgez(rs, offset); 2229 b(offset);
2164 } else { 2230 } else {
2165 sltu(scratch, rs, r2); 2231 sltu(scratch, rs, r2);
2166 offset = shifted_branch_offset(L, false); 2232 offset = shifted_branch_offset(L, false);
2167 beq(scratch, zero_reg, offset); 2233 beq(scratch, zero_reg, offset);
2168 } 2234 }
2169 break; 2235 break;
2170 case Uless: 2236 case Uless:
2171 if (r2.is(zero_reg)) { 2237 if (r2.is(zero_reg)) {
2172 // No code needs to be emitted. 2238 // No code needs to be emitted.
2173 return; 2239 return;
2174 } else { 2240 } else {
2175 sltu(scratch, rs, r2); 2241 sltu(scratch, rs, r2);
2176 offset = shifted_branch_offset(L, false); 2242 offset = shifted_branch_offset(L, false);
2177 bne(scratch, zero_reg, offset); 2243 bne(scratch, zero_reg, offset);
2178 } 2244 }
2179 break; 2245 break;
2180 case Uless_equal: 2246 case Uless_equal:
2181 if (r2.is(zero_reg)) { 2247 if (r2.is(zero_reg)) {
2182 offset = shifted_branch_offset(L, false); 2248 offset = shifted_branch_offset(L, false);
2183 b(offset); 2249 beq(rs, zero_reg, offset);
2184 } else { 2250 } else {
2185 sltu(scratch, r2, rs); 2251 sltu(scratch, r2, rs);
2186 offset = shifted_branch_offset(L, false); 2252 offset = shifted_branch_offset(L, false);
2187 beq(scratch, zero_reg, offset); 2253 beq(scratch, zero_reg, offset);
2188 } 2254 }
2189 break; 2255 break;
2190 default: 2256 default:
2191 UNREACHABLE(); 2257 UNREACHABLE();
2192 } 2258 }
2193 } else { 2259 } else {
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 r2 = scratch; 2351 r2 = scratch;
2286 li(r2, rt); 2352 li(r2, rt);
2287 sltu(scratch, r2, rs); 2353 sltu(scratch, r2, rs);
2288 offset = shifted_branch_offset(L, false); 2354 offset = shifted_branch_offset(L, false);
2289 bne(scratch, zero_reg, offset); 2355 bne(scratch, zero_reg, offset);
2290 } 2356 }
2291 break; 2357 break;
2292 case Ugreater_equal: 2358 case Ugreater_equal:
2293 if (rt.imm32_ == 0) { 2359 if (rt.imm32_ == 0) {
2294 offset = shifted_branch_offset(L, false); 2360 offset = shifted_branch_offset(L, false);
2295 bgez(rs, offset); 2361 b(offset);
2296 } else if (is_int16(rt.imm32_)) { 2362 } else if (is_int16(rt.imm32_)) {
2297 sltiu(scratch, rs, rt.imm32_); 2363 sltiu(scratch, rs, rt.imm32_);
2298 offset = shifted_branch_offset(L, false); 2364 offset = shifted_branch_offset(L, false);
2299 beq(scratch, zero_reg, offset); 2365 beq(scratch, zero_reg, offset);
2300 } else { 2366 } else {
2301 DCHECK(!scratch.is(rs)); 2367 DCHECK(!scratch.is(rs));
2302 r2 = scratch; 2368 r2 = scratch;
2303 li(r2, rt); 2369 li(r2, rt);
2304 sltu(scratch, rs, r2); 2370 sltu(scratch, rs, r2);
2305 offset = shifted_branch_offset(L, false); 2371 offset = shifted_branch_offset(L, false);
(...skipping 2164 matching lines...) Expand 10 before | Expand all | Expand 10 after
4470 4536
4471 void MacroAssembler::SmiToDoubleFPURegister(Register smi, 4537 void MacroAssembler::SmiToDoubleFPURegister(Register smi,
4472 FPURegister value, 4538 FPURegister value,
4473 Register scratch1) { 4539 Register scratch1) {
4474 sra(scratch1, smi, kSmiTagSize); 4540 sra(scratch1, smi, kSmiTagSize);
4475 mtc1(scratch1, value); 4541 mtc1(scratch1, value);
4476 cvt_d_w(value, value); 4542 cvt_d_w(value, value);
4477 } 4543 }
4478 4544
4479 4545
4480 void MacroAssembler::AdduAndCheckForOverflow(Register dst, 4546 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left,
4481 Register left, 4547 const Operand& right,
4548 Register overflow_dst,
4549 Register scratch) {
4550 if (right.is_reg()) {
4551 AdduAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch);
4552 } else {
4553 if (dst.is(left)) {
4554 mov(scratch, left); // Preserve left.
4555 addiu(dst, left, right.immediate()); // Left is overwritten.
4556 xor_(scratch, dst, scratch); // Original left.
4557 // Load right since xori takes uint16 as immediate.
4558 addiu(t9, zero_reg, right.immediate());
4559 xor_(overflow_dst, dst, t9);
4560 and_(overflow_dst, overflow_dst, scratch);
4561 } else {
4562 addiu(dst, left, right.immediate());
4563 xor_(overflow_dst, dst, left);
4564 // Load right since xori takes uint16 as immediate.
4565 addiu(t9, zero_reg, right.immediate());
4566 xor_(scratch, dst, t9);
4567 and_(overflow_dst, scratch, overflow_dst);
4568 }
4569 }
4570 }
4571
4572
4573 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left,
4482 Register right, 4574 Register right,
4483 Register overflow_dst, 4575 Register overflow_dst,
4484 Register scratch) { 4576 Register scratch) {
4485 DCHECK(!dst.is(overflow_dst)); 4577 DCHECK(!dst.is(overflow_dst));
4486 DCHECK(!dst.is(scratch)); 4578 DCHECK(!dst.is(scratch));
4487 DCHECK(!overflow_dst.is(scratch)); 4579 DCHECK(!overflow_dst.is(scratch));
4488 DCHECK(!overflow_dst.is(left)); 4580 DCHECK(!overflow_dst.is(left));
4489 DCHECK(!overflow_dst.is(right)); 4581 DCHECK(!overflow_dst.is(right));
4490 4582
4491 if (left.is(right) && dst.is(left)) { 4583 if (left.is(right) && dst.is(left)) {
(...skipping 20 matching lines...) Expand all
4512 and_(overflow_dst, overflow_dst, scratch); 4604 and_(overflow_dst, overflow_dst, scratch);
4513 } else { 4605 } else {
4514 addu(dst, left, right); 4606 addu(dst, left, right);
4515 xor_(overflow_dst, dst, left); 4607 xor_(overflow_dst, dst, left);
4516 xor_(scratch, dst, right); 4608 xor_(scratch, dst, right);
4517 and_(overflow_dst, scratch, overflow_dst); 4609 and_(overflow_dst, scratch, overflow_dst);
4518 } 4610 }
4519 } 4611 }
4520 4612
4521 4613
4522 void MacroAssembler::SubuAndCheckForOverflow(Register dst, 4614 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left,
4523 Register left, 4615 const Operand& right,
4616 Register overflow_dst,
4617 Register scratch) {
4618 if (right.is_reg()) {
4619 SubuAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch);
4620 } else {
4621 if (dst.is(left)) {
4622 mov(scratch, left); // Preserve left.
4623 addiu(dst, left, -(right.immediate())); // Left is overwritten.
4624 xor_(overflow_dst, dst, scratch); // scratch is original left.
4625 // Load right since xori takes uint16 as immediate.
4626 addiu(t9, zero_reg, right.immediate());
4627 xor_(scratch, scratch, t9); // scratch is original left.
4628 and_(overflow_dst, scratch, overflow_dst);
4629 } else {
4630 addiu(dst, left, -(right.immediate()));
4631 xor_(overflow_dst, dst, left);
4632 // Load right since xori takes uint16 as immediate.
4633 addiu(t9, zero_reg, right.immediate());
4634 xor_(scratch, left, t9);
4635 and_(overflow_dst, scratch, overflow_dst);
4636 }
4637 }
4638 }
4639
4640
4641 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left,
4524 Register right, 4642 Register right,
4525 Register overflow_dst, 4643 Register overflow_dst,
4526 Register scratch) { 4644 Register scratch) {
4527 DCHECK(!dst.is(overflow_dst)); 4645 DCHECK(!dst.is(overflow_dst));
4528 DCHECK(!dst.is(scratch)); 4646 DCHECK(!dst.is(scratch));
4529 DCHECK(!overflow_dst.is(scratch)); 4647 DCHECK(!overflow_dst.is(scratch));
4530 DCHECK(!overflow_dst.is(left)); 4648 DCHECK(!overflow_dst.is(left));
4531 DCHECK(!overflow_dst.is(right)); 4649 DCHECK(!overflow_dst.is(right));
4532 DCHECK(!scratch.is(left)); 4650 DCHECK(!scratch.is(left));
4533 DCHECK(!scratch.is(right)); 4651 DCHECK(!scratch.is(right));
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after
6096 } 6214 }
6097 if (mag.shift > 0) sra(result, result, mag.shift); 6215 if (mag.shift > 0) sra(result, result, mag.shift);
6098 srl(at, dividend, 31); 6216 srl(at, dividend, 31);
6099 Addu(result, result, Operand(at)); 6217 Addu(result, result, Operand(at));
6100 } 6218 }
6101 6219
6102 6220
6103 } } // namespace v8::internal 6221 } } // namespace v8::internal
6104 6222
6105 #endif // V8_TARGET_ARCH_MIPS 6223 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698