Commit graph

357 commits

Author SHA1 Message Date
Nekotekina 3354f068fc PPU/SPU transactions: ease cache line interference (TSX path)
Touch memory on the same memory page, but different cache lines.
2019-04-10 13:58:12 +03:00
Nekotekina d873802b9c Use LLVM 9
Use new add/sub with saturation intrinsics
2019-03-30 01:36:48 +03:00
Nekotekina 849411693a PPU LLVM: add MemoryManager3
For temporary allocations.
Add flags in jit_compiler constructor.
2019-03-23 02:43:41 +03:00
Nekotekina 7f6a410770 Add dummy __has_builtin macro, use rotate builtins if possible 2019-03-01 00:08:19 +03:00
eladash 0861226271 Make more use of the new atomic_t<>::release 2019-02-10 00:16:57 +03:00
elad fc92ae4085 SPU/PPU atomics performance and LR event fixes (#5435)
* Fix SPU LR event setting in atomic commands according to hw test
* MFC: increment timestamp for PUT cmd in non-tsx path
* MFC: fix reservation lost test on non-tsx path in regard to the lock bit
* Reservation notification moved out of writer_lock scope to reduce its lifetime
* Use passive_lock/unlock in ppu atomic inctrustions to reduce redundancy
* Lock only once for dma transfers (non-TSX)
* Don't use RDTSC in reservation update logic
* Remove MFC cmd args passing to process_mfc_cmd
* Reorder check_state cpu_flag::memory check for faster unlocking
* Specialization for 128-byte data copy in SPU dma transfers
* Implement memory range locks and isolate PPU and SPU passive lock logic
2019-01-15 18:31:21 +03:00
Nekotekina a419e98acb Move PPU and shader cache
New hash-based location (already used for SPU)
Bump PPU cache version, improve naming and decrease size

Remove fs::get_data_dir
Disable boot.elf cache
2019-01-14 01:24:05 +03:00
Nekotekina bd9131ae1c Implement fs::get_cache_dir
Win32: equal to config dir for now
Linux: respect XDG_CACHE_HOME if specified
OSX: possibly incomplete
2019-01-13 14:45:36 +03:00
Megamouse a4f67ccb87 Add log messages for PPU compilation 2018-12-31 23:03:03 +03:00
Nekotekina 96cabeadff Rewrite condition variables
Implement helper functions balanced_wait_until and balanced_awaken
They include new path for Windows 8.1+ (WaitOnAddress)

shared_mutex, cond_variable, cond_one, cond_x16 modified to use it
Added helper function utils::popcnt16
Replace most semaphore<> with shared_mutex
2018-11-29 01:30:05 +03:00
eladash 3a7f5b970f ppu: Fix stack base 2018-11-02 02:16:29 +03:00
Nekotekina 1b37e775be Migration to named_thread<>
Add atomic_t<>::try_dec instead of fetch_dec_sat
Add atomic_t<>::try_inc
GDBDebugServer is broken (needs rewrite)
Removed old_thread class (former named_thread)
Removed storing/rethrowing exceptions from thread
Emu.Stop doesn't inject an exception anymore
task_stack helper class removed
thread_base simplified (no shared_from_this)
thread_ctrl::spawn simplified (creates detached thread)
Implemented overrideable thread detaching logic
Disabled cellAdec, cellDmux, cellFsAio
SPUThread renamed to spu_thread
RawSPUThread removed, spu_thread used instead
Disabled deriving from ppu_thread
Partial support for thread renaming
lv2_timer... simplified, screw it
idm/fxm: butchered support for on_stop/on_init
vm: improved allocation structure (added size)
2018-10-19 22:22:35 +03:00
Nekotekina f2229a5f53 PPU reservations: ensure aligned atomic ops
Store aligned 64 bits to ppu.rdata
Don't save reservation size
2018-09-15 17:09:56 +03:00
eladash cd11ae5d8b ppu: Fix extreme reservation corner case 2018-09-12 23:17:53 +03:00
Nekotekina d750e955c3 Use std::uncaught_exceptions()
Also remove wrong attributes
2018-09-08 00:32:04 +03:00
Nekotekina ca5158a03e Cleanup semaphore<> (sema.h) and mutex.h (shared_mutex)
Remove semaphore_lock and writer_lock classes, replace with std::lock_guard
Change semaphore<> interface to Lockable (+ exotic try_unlock method)
2018-09-03 23:00:36 +03:00
Nekotekina 8abe6489ed Mega-cleanup for atomic_t<> and named bit-sets bs_t<>
Remove "atomic operator" classes
Remove test, test_and_set, test_and_reset, test_and_complement global functions
Simplify atomic_t<> with constexpr if, remove some garbage
Redesign bs_t<> to use class, mark its methods constexpr
Implement atomic_bs_t<> for optimizations
Remove unused __bitwise_ops concept (should be in other header anyway)
Bitsets can now be tested via safe bool conversion
2018-09-03 21:40:36 +03:00
Nekotekina 85fa0942e7 vm: allow 4k-aligned allocations for vm::stack
Fix utils::shm::map logic for MapViewOfFileEx
2018-08-30 14:56:45 +03:00
Ani 6fc869e21b Revert d1fd4d5000 2018-08-20 00:12:30 +04:00
eladash f349695a75 Rsx: rewrite address translation 2018-08-13 16:16:34 +03:00
Nekotekina 801089cf44 PPU LLVM: always link syscall_## functions
Regardless of whether they have name or not
Should fix "Linkage failed" errors introduced after #4886
2018-08-12 15:42:47 +03:00
Nekotekina d1fd4d5000 PPU: don't use transactions (test) 2018-08-12 02:42:32 +03:00
Chris Weermann (TGE) fdcc5adc8d Fix overflow in PPUThread stack frame dump 2018-08-11 20:56:19 +04:00
Nekotekina a0bf103e8b Implement cpu_translator::pshufb<>()
Remove spu_translator::pshufb<>()
Improve PSHUFB emulation (pre-SSSE3)
Emit static shufflevector for the constant mask
PPU: Inline VPERM instruction
2018-07-06 00:33:52 +03:00
isJuhn 83f096c435 Add conditional reservation update to STW 2018-06-23 23:13:34 +04:00
Nekotekina 6229b3ca8d Fixes for booting PS1 games 2018-06-23 17:30:16 +03:00
Nekotekina e4da284176 SPU: analyser v4 and fixes
Build SPU cache after PPU, fix mixing progress
SPU ASMJIT: add support for Giga mode
SPU ASMJIT: use the same spu.log location as SPU LLVM
SPU: improve spu.log disasm
SPU: improve trampolines, unify with SPU ASMJIT
SPU: decode interrupt handler address from BR/BRA at 0x0
SPU LLVM: support Mega/Giga modes
SPU LLVM: implement function chunks
SPU LLVM: use PHI nodes, value visibility across basic blocks
SPU LLVM: implement function chunk table
New simple memory manager for LLVM (bugfix)
2018-06-21 22:29:34 +03:00
Nekotekina b0ee369135 Rewrite LLVM compilation progress dialog
Use a single dialog
2018-05-30 20:35:35 +03:00
Nekotekina 72574b11ff SPU: use reservation spinlocks on writes (non-TSX)
This should decrease contention by avoiding global lock
2018-05-21 21:56:14 +03:00
Nekotekina 6fd402bcf8 Transactions: drop RDTSC usage
Use simple increment (minor optimization)
2018-05-21 00:18:37 +03:00
Nekotekina 33a1c743a4 Transactions: move loops inside
Rewrite loops in assembler (minor optimization)
2018-05-21 00:18:37 +03:00
Nekotekina 67391322f4 Transactions: touch memory only after a failure
Minor optimization
2018-05-17 22:19:26 +03:00
Nekotekina 367f039523 Build transactions at runtime
Drop _xbegin family intrinsics due to bad codegen
Implemented `notifier` class, replacing vm::notify
Minor optimization: detach transactions from global mutex on TSX path
Minor optimization: don't acquire vm::passive_lock on PPU on TSX path
2018-05-16 17:31:58 +03:00
Nekotekina 4c7afb6952 Opt-in set DAZ and FTZ 2018-05-13 00:03:08 +03:00
Nekotekina 737db90058 Set DAZ and FTZ 2018-05-09 23:38:26 +03:00
Nekotekina 5d15d64ec8 Memory mirror support
Implemented utils::memory_release (not used)
Implemented utils::shm class (handler for shared memory)
Improved sys_mmapper syscalls
Rewritten ppu_patch function
Implemented vm::get_super_ptr (ignores memory protection)
Minimal allocation alignment increased to 0x10000
2018-05-09 23:35:34 +03:00
Nekotekina fe4c3c4d84 Implement SPU recompiler cache
Shared between ASMJIT/LLVM recompilers, compiled at startup
2018-05-09 23:35:18 +03:00
Nekotekina f4af3f2987 PPU: improve LWARX/LDARX consistency 2018-05-08 13:05:29 +03:00
Robbie 477522210e Refactor debugger_frame into subclasses. Mostly trying to simplify
breakpoints.
2018-04-21 22:21:51 +04:00
Nekotekina 0797164fac SPU: fix possible livelock
The bug affects TSX path
2018-04-07 20:51:21 +03:00
Nekotekina 2b5cf2455f SPU: improve TSX usage
Reduce transaction failure amount
Remove vm::try_to_lock
2018-04-06 21:47:54 +03:00
Nekotekina d392379c7a Use vm::passive_lock for SPU threads 2018-04-06 15:47:00 +03:00
Nekotekina 402ca480cd Fix vm::check_addr usage 2018-04-01 22:39:48 +03:00
Nekotekina a3db2774f1 [LLVM] Fix thread limiter
Allow to apply max llvm threads setting as usual
2018-03-31 20:35:30 +03:00
Nekotekina 19944eeed0 Implement SPRX precompilation
Automatically precompile firmware modules
Add "Create LLVM Cache" menu (for games)
Reimplement jit_compiler::cpu as static method
2018-03-22 23:24:58 +03:00
Jake 7bbadfd08b ppu/sys_interrupt: add stack_reset command to fix sys_interrupt stack overflowing 2018-03-09 20:30:59 +04:00
Andrey e0f53ace19 Improve GDB debug server (#4027)
* Made GDB debugger working with IDA

* Added async interrupts support

* Report proper thread after pausing

* Support attaching debugger before running app
2018-02-28 19:31:39 +04:00
Nekotekina cce0ad0c35 Clean vm::ps3 namespace use 2018-02-09 17:49:37 +03:00
Megamouse b9c10a186d Qt/Core: implement max llvm compile threads 2018-01-26 01:57:05 +04:00
kd-11 cbc8bf01a1 cell/scheduler: Manage thread placement depending on cpu hardware 2018-01-19 12:03:57 +03:00
TGEnigma d770a42349 Fix debug build 2018-01-06 04:45:55 +04:00
Nekotekina 198e9dce1d Fix #4005 regression
Delay unregister EH frames (Linux)
2018-01-01 10:41:07 +03:00
VelocityRa 383c501a35 [gui] Show total number of llvm compilation dialogs
- Doesn't account for dynamic libraries loaded after the fact,
  but usually good enough since
  1) Those aren't even present in some games
  2) They usually only have about 1 or 2 fragments (dialogs) each.
2017-12-31 22:08:17 +03:00
Nekotekina d40aaf0391 PPU: use shared jit_compiler instance
(Linux) Fix deregisterEHFrames error message
2017-12-31 22:08:17 +03:00
Nekotekina 0a89f1db39 Fix primary stack size 2017-12-25 21:08:15 +03:00
Nekotekina 83da7f9b63 PPU: remove SSSE3 dependency 2017-12-20 01:21:15 +03:00
Nekotekina ac64792d99 Optimize PPU module loading
I'm garbage 🤦
2017-10-11 20:06:33 +03:00
Nekotekina efe140bc0c Fix instruction editor a bit 2017-10-11 20:06:33 +03:00
Nekotekina e5f756205c sys_net full rewrite
Implement sys_net syscalls
Clean libnet functions
Use libnet.sprx
Use libhttp.sprx
Use libssl.sprx
Use librudp.sprx
Implement sys_ss_random_number_generator
2017-10-05 19:51:37 +03:00
Nekotekina b9b71ccbc1 Implemented syscall _sys_process_exit 2017-09-19 15:07:07 +03:00
Robbie 47685bef39 If the loop is never entered, then the jit is null. 2017-09-10 18:51:59 +03:00
Ofek caab400258 Various fixes (Trophy, Gcm corrections, stack alloc) (#2894)
* Fixed sys_get_random_number generating less bytes than needed, and ceiling the buffer size in 0x1000 instead of failing
* Corrected alignment check in libgcm
* Now calling callback of sceNpManagerRegisterCallback
* Fixed trophies
2017-09-02 14:43:44 +03:00
Nekotekina a85caaee1d Set PPU stack bounds 2017-09-01 21:24:43 +03:00
Nekotekina 2bc57fbee3 LLVM: Add error message 2017-07-23 11:03:38 +03:00
Nekotekina 42b06af577 Force recompiling liblv2.sprx 2017-07-23 11:03:38 +03:00
Nekotekina b24eb621ae Use RTM instructions (skylake+) 2017-07-20 17:22:09 +03:00
Nekotekina 2ef2f0f63b PPU LLVM: simplify module loading 2017-07-17 16:49:46 +03:00
Nekotekina 73a2a937c4 PPU LLVM: reuse loaded executables 2017-07-12 14:00:38 +03:00
Nekotekina f0d184f38b PPU LLVM: relocation support 2017-07-04 02:04:22 +03:00
Nekotekina 3c064439b3 PPU LLVM: new mptr/cptr format 2017-06-29 17:48:55 +03:00
Nekotekina aa34fa8baa PPU LLVM: some passes disabled 2017-06-29 17:48:55 +03:00
Nekotekina fc2a45d6d6 Removed unnecessary code 2017-06-29 17:48:55 +03:00
Nekotekina 89f676de75 PPU: preparations (no fixes) 2017-06-26 16:56:13 +03:00
Nekotekina 8034196c25 ppu_syscall_code type added (for fmt) 2017-06-26 16:56:13 +03:00
Nekotekina f49a30bc1a PPU LLVM: disable unnecessary passes 2017-06-26 16:56:13 +03:00
Nekotekina 1196e9decc PPU LLVM: remove unnecessary code 2017-06-26 16:56:13 +03:00
Nekotekina cd4f290d3d PPU LLVM: v2, simplification (no allocas) 2017-06-26 16:56:13 +03:00
Nekotekina 9738ce0cf6 LLVM: fix cancellation 2017-06-26 16:56:13 +03:00
Nekotekina e5ae32e5f3 Fix #ifdef style 2017-06-26 16:56:13 +03:00
Nekotekina 6561ddae41 PPU LLVM: multithread compilation 2017-06-24 19:12:19 +03:00
Nekotekina aea094730b PPU LLVM: paradigm shift
For now, compile only one block at time
Use tail calls to move between blocks
Fully write PPU context (except CIA)

This fixes many compatibility problems
2017-06-23 20:09:33 +03:00
Nekotekina f010b5b235 Configuration simplified 2017-05-20 16:01:48 +03:00
Nekotekina b349100d9d Stack overflow detection
Added a gap between stack allocations
PPU callstack improved
2017-04-30 21:10:27 +03:00
Nekotekina a626bbf635 PPU Debug fix 2017-04-26 02:27:34 +03:00
Nekotekina b1f1a5885b PPU LLVM improved 2017-04-16 17:44:19 +03:00
Nekotekina 7428bb3025 HLE linkage rewritten 2017-04-16 17:44:19 +03:00
Ofek a5fd7abcf7 Trophy update (#2655)
* Added checksum check to TROPHY.TRP loader

* Implemented sceNpTrophyGetGameProgress, sceNpTrophyGetGameIcon & sceNpTrophyGetTrophyIcon

* Updates to up to date APIs and tiny changes

* Code style fixes for checksum verifier, and another fix for trophy functions

* Format fix
2017-04-13 20:29:47 +03:00
Nekotekina dc3d38c255 PPU Analyser: TOC detection
Improved TOC detection logic
Added "PPU Debug" option
2017-04-09 00:16:53 +03:00
Nekotekina ac79654d1b Warn about libfiber.sprx
It's currently incompatible with LLVM
Also fixed breakpoint bug
2017-04-08 00:56:38 +03:00
Nekotekina ed7883ba07 PPU Analyser fix 2017-04-08 00:56:38 +03:00
Andrey 215a9f9e11 Gdb debug server (#2542) 2017-04-02 21:10:06 +03:00
Nekotekina 37a97a71e3 vm::g_exec_addr added
s_ppu_compiled renamed
Exception handling enabled
2017-03-27 01:15:41 +03:00
Nekotekina e12a708036 LLVM: fix for mingw 2017-03-27 01:15:41 +03:00
Nekotekina 3bfe17a14f PPU: HACK instruction removed
Breakpoints fixed
2017-03-22 23:23:47 +03:00
Nekotekina ddd6ebc58d LLVM: Bump obj version 2017-03-22 01:33:50 +03:00
Nekotekina 1b5c0c68dd LLVM: enable New GVN Pass 2017-03-22 01:21:19 +03:00
Nekotekina 3e6f9faf71 Use LLVM 4.0 2017-03-21 23:32:14 +03:00
Nekotekina 07646c2124 LLVM CPU override option 2017-03-14 16:12:03 +03:00
Nekotekina b45cea1434 Opt-in LLVM logs 2017-03-14 16:12:03 +03:00
Nekotekina d09dd29054 utils::memory_protect 2017-03-13 13:16:22 +03:00
Nekotekina 4739eb3601 Reservation fix 2017-03-11 15:48:43 +03:00
Nekotekina 5e3bacbd9b New reservations
Memory system cleanup
sys_memory_get_page_attribute
2017-03-10 15:51:40 +03:00
Nekotekina 0eb6bf6a67 LLVM: splitting and caching 2017-02-26 20:14:18 +03:00
Nekotekina af53ce6f76 Stack overflow constrained 2017-02-25 19:29:31 +03:00
Nekotekina 7c418f7ea5 PPU: block info fix 2017-02-23 00:35:29 +03:00
Nekotekina 9000407a77 cpu_thread::test_state added
lv2_obj::sleep adjustment
synchronization fixes
2017-02-22 13:23:21 +03:00
Nekotekina 598c90f376 PPU thread scheduler 2017-02-13 22:26:11 +03:00
Nekotekina e4962054a4 LLVM: add check state 2017-02-13 20:51:56 +03:00
Nekotekina 3356a76c9b PPU fix 2017-02-11 17:17:07 +03:00
Nekotekina e899de88ff Log empty functions 2017-02-11 02:43:31 +03:00
Nekotekina bb111d325f memory fix 2017-02-10 23:27:58 +03:00
Nekotekina b20d7ff48c PPU breakpoints resurrected
Now with zero overhead
2017-02-10 16:33:22 +03:00
Nekotekina 8262d56574 PPU interpreter improved 2017-02-10 16:33:22 +03:00
Nekotekina 257b9a2015 Debugger fix
Crash fixes
GUI fixes
Debug enhancements
2017-02-10 16:33:22 +03:00
Nekotekina 47b4c649f1 PPU fixes 2017-02-07 16:37:30 +03:00
Nekotekina 11b0b6958f sys_spu diag 2017-02-05 15:48:11 +03:00
Nekotekina a5a2d43d7c Thread.cpp refinement
Hide thread mutex
Safe notify() method
Other refactoring
2017-01-29 19:52:19 +03:00
Nekotekina d4c3905355 Debug build fix 2017-01-28 15:32:45 +03:00
Nekotekina df6607e236 Minor fixes 2017-01-28 03:21:11 +03:00
Nekotekina 591a6c8671 IdManager improved 2017-01-25 23:29:36 +03:00
Nekotekina 78ecb115f3 LLVM: progress dialog 2017-01-22 22:44:26 +03:00
Nekotekina 5e0489dcc0 cpu_init removed 2016-08-14 18:07:34 +03:00
Nekotekina bdeccd889f cpu_type removed, system_type added
cpu_state -> cpu_flag
vm::stack_allocator template improved
ppu_cmd type changed to enum, cmd64 type added
2016-08-09 17:14:41 +03:00
Nekotekina a7e808b35b EXCEPTION macro removed
fmt::throw_exception<> implemented
::narrow improved
Minor fixes
2016-08-08 19:19:32 +03:00
Nekotekina 46735d6b3d New bitsets (experimental) 2016-08-08 16:29:37 +03:00
Nekotekina c9a789bf76 PPU LLVM fix 2016-08-06 13:39:03 +03:00
Nekotekina 5a36c57c57 Formatting system improved
`unveil<>` renamed to `fmt_unveil<>`, now packs args to u64 imitating va_args
`bijective...` removed, `cfg::enum_entry` now uses formatting system
`fmt_class_string<>` added, providing type-specific "%s" handler function
Added `fmt::append`, removed `fmt::narrow` (too obscure)
Utilities/cfmt.h: C-style format template function (WIP)
Minor formatting fixes and cleanup
2016-08-04 21:34:00 +03:00
Nekotekina e6bd91ada0 id_manager: embedded RTTI 2016-08-01 12:51:47 +03:00
Nekotekina f8719c1230 PPUThread refactoring
`CallbackManager` removed, added _gcm_intr_thread for cellGcmSys
`PPUThread` renamed to `ppu_thread`, inheritance allowed
Added lightweight command queue for `ppu_thread`
Implemented call stack dump for PPU
`get_current_thread_mutex` removed
`thread_ctrl::spawn`: minor initialization fix
`thread_ctrl::wait_for` added
`named_thread`: some methods added
`cpu_thread::run` added
Some bugs fixes, including SPU channels
2016-07-30 16:35:02 +03:00
Nekotekina 44bee7d0ba LLVM: Use small code model
Global variables modified:
__mptr: pointer to memory base addr
__cptr: pointer to function map addr

Use 32 bit pointers in function map
2016-07-25 18:26:02 +03:00
Nekotekina 5c9f83c3a8 PPU LLVM: New "stack" strategy
Minor pessimization: all memory accesses are volatile
Special handling of prologues and epilogues
Minor optimizing assumption for SP
2016-07-24 21:47:45 +03:00
Nekotekina 94da0dbd4d PPU LLVM improvements
Removed interpreter dependencies
Reciprocal instructions improved
2016-07-12 17:33:13 +03:00
Nekotekina 06c6c8212d Minor fixes
elf_object
Loader fix
Analyser fix
2016-07-11 16:30:11 +03:00
Ivan 77594dc66c PPU LLVM: New analyser (#1858)
Minor fixes
VEX prefix support
2016-07-07 21:42:39 +03:00
Nekotekina 0ea0c21fed LLVM: Indirect call map 2016-06-27 19:34:14 +03:00
Nekotekina 7a921cbdf9 cpu_thread compressed 2016-06-27 16:43:57 +03:00
Nekotekina 9db7de29fb Syscall analysis implemented 2016-06-27 16:43:56 +03:00
Nekotekina a19b721c26 LLVM: Added JIT.cpp
Refactoring, used -fno-rtti option
2016-06-27 16:43:53 +03:00
Nekotekina 73ea020525 PPU LLVM: Thread context argument 2016-06-27 16:43:50 +03:00
Nekotekina 251fb86ab0 PPU LLVM: Some instructions simplified 2016-06-21 18:08:21 +03:00
Nekotekina a8bebcba55 LLVM AOT 2016-06-19 21:29:48 +03:00
Nekotekina e2d82394f6 Cell 2016-05-23 16:22:23 +03:00
Ivan aafcf44581 Header optimizations (#1684)
Shouldn't break anything. I hope.
2016-04-27 01:27:24 +03:00
Ivan da7472fe81 Optimizations (#1680)
* Optimizations

1) Some headers simplified for better compilation time
2) Some templates simplified for smaller executable size
3) Eliminate std::future to fix compilation for mingw64
4) PKG installation can be cancelled now
5) cellGame fixes
6) XAudio2 fix for mingw64
7) PPUInterpreter bug fixed (Clang)

* any_pod<> implemented

Aliases: any16, any32, any64
rsx::make_command fixed
2016-04-25 13:49:12 +03:00
Nekotekina c4e99dbdb2 Partial commit: Cell 2016-04-15 19:22:34 +03:00
Nekotekina 960668ecf1 For #1355
offsetof() eliminated
OFFSET_32, SIZE_32, ALIGN_32 used
2016-01-14 19:07:27 +03:00
Nekotekina 3ed603074c Changes done by [DH] rewritten
Added rsx_program_decompiler submodule
Added fs::dir iterator
Added fmt::match
2015-12-22 23:11:20 +03:00
Nekotekina ca6783ba9a Threads improved, ID manager improved 2015-12-04 23:37:34 +03:00
O1L c0255208cc Old ini-manager only partially used in VFS. Global configuration used as defualt. 2015-10-27 01:09:31 +04:00
O1L 1673ba217c Do not try to change default config, use state configs. 2015-10-24 22:48:07 +04:00