From 72f1495b1e297b653a573fe3bd9d0765cf4fc05c Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Mon, 27 May 2024 21:51:46 -0700 Subject: [PATCH] Merge ares v134 --- Assets/dll/ares64_interpreter.wbx.zst | Bin 484300 -> 507645 bytes Assets/dll/ares64_recompiler.wbx.zst | Bin 487581 -> 510143 bytes waterbox/ares64/BizInterface.cpp | 4 +- waterbox/ares64/ares/LICENSE | 0 waterbox/ares64/ares/ares/ares/ares.cpp | 10 + waterbox/ares64/ares/ares/ares/ares.hpp | 19 +- .../ares64/ares/ares/ares/debug/debug.cpp | 0 .../ares64/ares/ares/ares/debug/debug.hpp | 0 waterbox/ares64/ares/ares/ares/inline.hpp | 0 .../ares/ares/ares/memory/fixed-allocator.cpp | 29 +- .../ares/ares/ares/memory/fixed-allocator.hpp | 28 +- .../ares64/ares/ares/ares/memory/memory.hpp | 0 .../ares64/ares/ares/ares/memory/readable.hpp | 0 .../ares64/ares/ares/ares/memory/writable.hpp | 0 .../ares64/ares/ares/ares/node/attribute.hpp | 0 .../ares/ares/ares/node/audio/audio.hpp | 0 .../ares/ares/ares/node/audio/stream.cpp | 0 .../ares/ares/ares/node/audio/stream.hpp | 0 waterbox/ares64/ares/ares/ares/node/class.hpp | 0 .../ares/ares/node/component/component.hpp | 0 .../ares/node/component/real-time-clock.hpp | 0 .../ares/ares/ares/node/debugger/debugger.hpp | 0 .../ares/ares/ares/node/debugger/graphics.hpp | 0 .../ares/ares/ares/node/debugger/memory.hpp | 0 .../ares/ares/node/debugger/properties.hpp | 0 .../ares/node/debugger/tracer/instruction.hpp | 6 +- .../node/debugger/tracer/notification.hpp | 7 +- .../ares/ares/node/debugger/tracer/tracer.hpp | 26 +- .../ares64/ares/ares/ares/node/input/axis.hpp | 0 .../ares/ares/ares/node/input/button.hpp | 0 .../ares/ares/ares/node/input/input.hpp | 0 .../ares/ares/ares/node/input/rumble.hpp | 4 +- .../ares/ares/ares/node/input/trigger.hpp | 0 waterbox/ares64/ares/ares/ares/node/node.cpp | 0 waterbox/ares64/ares/ares/ares/node/node.hpp | 2 +- .../ares64/ares/ares/ares/node/object.hpp | 0 .../ares64/ares/ares/ares/node/peripheral.hpp | 0 waterbox/ares64/ares/ares/ares/node/port.hpp | 0 .../ares/ares/ares/node/setting/boolean.hpp | 0 .../ares/ares/ares/node/setting/integer.hpp | 0 .../ares/ares/ares/node/setting/natural.hpp | 0 .../ares/ares/ares/node/setting/real.hpp | 0 .../ares/ares/ares/node/setting/setting.hpp | 0 .../ares/ares/ares/node/setting/string.hpp | 0 .../ares64/ares/ares/ares/node/system.hpp | 0 .../ares/ares/ares/node/video/screen.cpp | 42 +- .../ares/ares/ares/node/video/screen.hpp | 9 + .../ares/ares/ares/node/video/sprite.cpp | 0 .../ares/ares/ares/node/video/sprite.hpp | 0 .../ares/ares/ares/node/video/video.hpp | 0 waterbox/ares64/ares/ares/ares/platform.hpp | 6 +- waterbox/ares64/ares/ares/ares/random.hpp | 0 .../ares/ares/ares/resource/GNUmakefile | 0 .../ares64/ares/ares/ares/resource/icon.png | Bin .../ares/ares/ares/resource/icon@2x.png | Bin .../ares64/ares/ares/ares/resource/logo.png | Bin .../ares/ares/ares/resource/logo@2x.png | Bin .../ares/ares/ares/resource/resource.bml | 0 .../ares/ares/ares/resource/resource.cpp | 0 .../ares/ares/ares/resource/resource.hpp | 0 .../resource/sprite/sfc/crosshair-blue.png | Bin .../resource/sprite/sfc/crosshair-green.png | Bin .../resource/sprite/sfc/crosshair-red.png | Bin .../ares/resource/sprite/ws/auxiliary-0.png | Bin .../ares/resource/sprite/ws/auxiliary-1.png | Bin .../ares/resource/sprite/ws/auxiliary-2.png | Bin .../ares/resource/sprite/ws/headphones.png | Bin .../ares/resource/sprite/ws/initialized.png | Bin .../ares/resource/sprite/ws/low-battery.png | Bin .../ares/resource/sprite/ws/orientation-0.png | Bin .../ares/resource/sprite/ws/orientation-1.png | Bin .../ares/resource/sprite/ws/powered-on.png | Bin .../ares/ares/resource/sprite/ws/sleeping.png | Bin .../ares/resource/sprite/ws/volume-a0.png | Bin .../ares/resource/sprite/ws/volume-a1.png | Bin .../ares/resource/sprite/ws/volume-a2.png | Bin .../ares/resource/sprite/ws/volume-b0.png | Bin .../ares/resource/sprite/ws/volume-b1.png | Bin .../ares/resource/sprite/ws/volume-b2.png | Bin .../ares/resource/sprite/ws/volume-b3.png | Bin .../ares/ares/ares/scheduler/scheduler.cpp | 0 .../ares/ares/ares/scheduler/scheduler.hpp | 2 +- .../ares/ares/ares/scheduler/thread.cpp | 0 .../ares/ares/ares/scheduler/thread.hpp | 2 +- waterbox/ares64/ares/ares/ares/types.hpp | 0 .../component/processor/sm5k/disassembler.cpp | 0 .../component/processor/sm5k/instruction.cpp | 0 .../component/processor/sm5k/instructions.cpp | 0 .../ares/component/processor/sm5k/memory.cpp | 0 .../processor/sm5k/serialization.cpp | 0 .../ares/component/processor/sm5k/sm5k.cpp | 0 .../ares/component/processor/sm5k/sm5k.hpp | 0 .../ares/component/processor/sm5k/timer.cpp | 0 waterbox/ares64/ares/ares/n64/accuracy.hpp | 0 waterbox/ares64/ares/ares/n64/ai/ai.cpp | 7 +- waterbox/ares64/ares/ares/n64/ai/ai.hpp | 1 + waterbox/ares64/ares/ares/n64/ai/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/ai/io.cpp | 5 +- .../ares64/ares/ares/n64/ai/serialization.cpp | 0 .../ares/ares/n64/cartridge/cartridge.cpp | 7 +- .../ares/ares/n64/cartridge/cartridge.hpp | 4 + .../ares/ares/n64/cartridge/debugger.cpp | 0 .../ares64/ares/ares/n64/cartridge/flash.cpp | 3 +- .../ares/ares/n64/cartridge/isviewer.cpp | 7 +- .../ares64/ares/ares/n64/cartridge/joybus.cpp | 0 .../ares64/ares/ares/n64/cartridge/rtc.cpp | 65 +- .../ares/ares/n64/cartridge/serialization.cpp | 0 .../ares64/ares/ares/n64/cartridge/slot.cpp | 0 .../ares64/ares/ares/n64/cartridge/slot.hpp | 0 waterbox/ares64/ares/ares/n64/cic/cic.cpp | 0 waterbox/ares64/ares/ares/n64/cic/cic.hpp | 0 .../ares64/ares/ares/n64/cic/commands.cpp | 0 waterbox/ares64/ares/ares/n64/cic/io.cpp | 0 .../ares/ares/n64/cic/serialization.cpp | 0 .../ares/ares/n64/controller/controller.cpp | 0 .../ares/ares/n64/controller/controller.hpp | 0 .../ares/n64/controller/gamepad/gamepad.cpp | 6 +- .../ares/n64/controller/gamepad/gamepad.hpp | 0 .../ares/n64/controller/gamepad/mbc/mbc.hpp | 0 .../ares/n64/controller/gamepad/mbc/mbc1.hpp | 0 .../ares/n64/controller/gamepad/mbc/mbc3.hpp | 0 .../ares/n64/controller/gamepad/mbc/mbc5.hpp | 0 .../n64/controller/gamepad/transfer-pak.hpp | 0 .../ares/ares/n64/controller/mouse/mouse.cpp | 0 .../ares/ares/n64/controller/mouse/mouse.hpp | 0 .../ares64/ares/ares/n64/controller/port.cpp | 0 .../ares64/ares/ares/n64/controller/port.hpp | 0 .../ares64/ares/ares/n64/cpu/algorithms.cpp | 0 waterbox/ares64/ares/ares/n64/cpu/context.cpp | 0 waterbox/ares64/ares/ares/n64/cpu/cpu.cpp | 25 +- waterbox/ares64/ares/ares/n64/cpu/cpu.hpp | 56 +- waterbox/ares64/ares/ares/n64/cpu/dcache.cpp | 73 +- .../ares64/ares/ares/n64/cpu/debugger.cpp | 6 + .../ares64/ares/ares/n64/cpu/disassembler.cpp | 0 .../ares64/ares/ares/n64/cpu/exceptions.cpp | 5 + .../ares/ares/n64/cpu/interpreter-cop2.cpp | 0 .../ares/ares/n64/cpu/interpreter-fpu.cpp | 130 +- .../ares/ares/n64/cpu/interpreter-ipu.cpp | 0 .../ares/ares/n64/cpu/interpreter-scc.cpp | 0 .../ares64/ares/ares/n64/cpu/interpreter.cpp | 0 waterbox/ares64/ares/ares/n64/cpu/memory.cpp | 47 +- .../ares64/ares/ares/n64/cpu/recompiler.cpp | 25 +- .../ares/ares/n64/cpu/serialization.cpp | 1 + waterbox/ares64/ares/ares/n64/cpu/tlb.cpp | 52 +- .../ares64/ares/ares/n64/dd/controller.cpp | 18 +- waterbox/ares64/ares/ares/n64/dd/dd.cpp | 39 +- waterbox/ares64/ares/ares/n64/dd/dd.hpp | 24 +- waterbox/ares64/ares/ares/n64/dd/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/dd/drive.cpp | 0 waterbox/ares64/ares/ares/n64/dd/io.cpp | 13 +- waterbox/ares64/ares/ares/n64/dd/rtc.cpp | 116 +- .../ares64/ares/ares/n64/dd/serialization.cpp | 2 + waterbox/ares64/ares/ares/n64/memory/bus.hpp | 85 +- waterbox/ares64/ares/ares/n64/memory/io.hpp | 0 .../ares/ares/n64/memory/lsb/readable.hpp | 0 .../ares/ares/n64/memory/lsb/writable.hpp | 0 .../ares64/ares/ares/n64/memory/memory.cpp | 0 .../ares64/ares/ares/n64/memory/memory.hpp | 11 +- .../ares/ares/n64/memory/msb/readable.hpp | 0 .../ares/ares/n64/memory/msb/writable.hpp | 0 waterbox/ares64/ares/ares/n64/mi/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/mi/io.cpp | 4 +- waterbox/ares64/ares/ares/n64/mi/mi.cpp | 0 waterbox/ares64/ares/ares/n64/mi/mi.hpp | 0 .../ares64/ares/ares/n64/mi/serialization.cpp | 0 waterbox/ares64/ares/ares/n64/n64.hpp | 9 +- waterbox/ares64/ares/ares/n64/pi/bus.hpp | 31 +- waterbox/ares64/ares/ares/n64/pi/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/pi/dma.cpp | 53 +- waterbox/ares64/ares/ares/n64/pi/io.cpp | 14 +- waterbox/ares64/ares/ares/n64/pi/pi.cpp | 0 waterbox/ares64/ares/ares/n64/pi/pi.hpp | 1 + .../ares64/ares/ares/n64/pi/serialization.cpp | 0 .../ares64/ares/ares/n64/pif/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/pif/hle.cpp | 0 waterbox/ares64/ares/ares/n64/pif/io.cpp | 8 +- waterbox/ares64/ares/ares/n64/pif/pif.cpp | 0 waterbox/ares64/ares/ares/n64/pif/pif.hpp | 0 .../ares/ares/n64/pif/serialization.cpp | 0 .../ares64/ares/ares/n64/rdp/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/rdp/io.cpp | 4 +- waterbox/ares64/ares/ares/n64/rdp/rdp.cpp | 0 waterbox/ares64/ares/ares/n64/rdp/rdp.hpp | 0 waterbox/ares64/ares/ares/n64/rdp/render.cpp | 2 +- .../ares/ares/n64/rdp/serialization.cpp | 0 .../ares64/ares/ares/n64/rdram/debugger.cpp | 75 +- waterbox/ares64/ares/ares/n64/rdram/io.cpp | 0 waterbox/ares64/ares/ares/n64/rdram/rdram.cpp | 14 +- waterbox/ares64/ares/ares/n64/rdram/rdram.hpp | 59 +- .../ares/ares/n64/rdram/serialization.cpp | 0 waterbox/ares64/ares/ares/n64/ri/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/ri/io.cpp | 4 +- waterbox/ares64/ares/ares/n64/ri/ri.cpp | 4 +- waterbox/ares64/ares/ares/n64/ri/ri.hpp | 0 .../ares64/ares/ares/n64/ri/serialization.cpp | 0 .../ares64/ares/ares/n64/rsp/debugger.cpp | 92 + waterbox/ares64/ares/ares/n64/rsp/decoder.cpp | 0 .../ares64/ares/ares/n64/rsp/disassembler.cpp | 0 waterbox/ares64/ares/ares/n64/rsp/dma.cpp | 7 +- .../ares/ares/n64/rsp/interpreter-ipu.cpp | 0 .../ares/ares/n64/rsp/interpreter-scc.cpp | 4 +- .../ares/ares/n64/rsp/interpreter-vpu.cpp | 2 +- .../ares64/ares/ares/n64/rsp/interpreter.cpp | 0 waterbox/ares64/ares/ares/n64/rsp/io.cpp | 22 +- .../ares64/ares/ares/n64/rsp/recompiler.cpp | 16 +- waterbox/ares64/ares/ares/n64/rsp/rsp.cpp | 21 +- waterbox/ares64/ares/ares/n64/rsp/rsp.hpp | 58 +- .../ares/ares/n64/rsp/serialization.cpp | 0 waterbox/ares64/ares/ares/n64/si/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/si/dma.cpp | 4 + waterbox/ares64/ares/ares/n64/si/io.cpp | 2 +- .../ares64/ares/ares/n64/si/serialization.cpp | 0 waterbox/ares64/ares/ares/n64/si/si.cpp | 0 waterbox/ares64/ares/ares/n64/si/si.hpp | 0 .../ares/ares/n64/system/serialization.cpp | 2 +- .../ares64/ares/ares/n64/system/system.cpp | 4 + .../ares64/ares/ares/n64/system/system.hpp | 4 + waterbox/ares64/ares/ares/n64/vi/debugger.cpp | 0 waterbox/ares64/ares/ares/n64/vi/io.cpp | 4 +- .../ares64/ares/ares/n64/vi/serialization.cpp | 0 waterbox/ares64/ares/ares/n64/vi/vi.cpp | 5 +- waterbox/ares64/ares/ares/n64/vi/vi.hpp | 0 waterbox/ares64/ares/nall/adaptive-array.hpp | 0 waterbox/ares64/ares/nall/algorithm.hpp | 0 waterbox/ares64/ares/nall/any.hpp | 0 waterbox/ares64/ares/nall/arguments.hpp | 0 waterbox/ares64/ares/nall/arithmetic.hpp | 2 + .../ares64/ares/nall/arithmetic/barrett.hpp | 0 .../ares64/ares/nall/arithmetic/natural.hpp | 4 +- .../ares64/ares/nall/arithmetic/unsigned.hpp | 16 +- waterbox/ares64/ares/nall/array-span.hpp | 0 waterbox/ares64/ares/nall/array-view.hpp | 0 waterbox/ares64/ares/nall/array.hpp | 0 waterbox/ares64/ares/nall/atoi.hpp | 0 waterbox/ares64/ares/nall/bcd.hpp | 0 .../ares64/ares/nall/beat/single/apply.hpp | 0 .../ares64/ares/nall/beat/single/create.hpp | 0 waterbox/ares64/ares/nall/bit.hpp | 8 + waterbox/ares64/ares/nall/bump-allocator.hpp | 7 +- waterbox/ares64/ares/nall/case-range.hpp | 0 waterbox/ares64/ares/nall/cd.hpp | 0 waterbox/ares64/ares/nall/cd/crc16.hpp | 0 waterbox/ares64/ares/nall/cd/edc.hpp | 0 waterbox/ares64/ares/nall/cd/efm.hpp | 0 waterbox/ares64/ares/nall/cd/rspc.hpp | 0 waterbox/ares64/ares/nall/cd/scrambler.hpp | 0 waterbox/ares64/ares/nall/cd/session.hpp | 4 +- waterbox/ares64/ares/nall/cd/sync.hpp | 0 waterbox/ares64/ares/nall/chrono.hpp | 6 + waterbox/ares64/ares/nall/cipher/chacha20.hpp | 0 waterbox/ares64/ares/nall/counting-sort.hpp | 0 waterbox/ares64/ares/nall/database/odbc.hpp | 0 .../ares64/ares/nall/database/sqlite3.hpp | 0 waterbox/ares64/ares/nall/decode/base.hpp | 0 waterbox/ares64/ares/nall/decode/base64.hpp | 0 waterbox/ares64/ares/nall/decode/bmp.hpp | 0 waterbox/ares64/ares/nall/decode/bwt.hpp | 0 waterbox/ares64/ares/nall/decode/chd.hpp | 19 +- waterbox/ares64/ares/nall/decode/cue.hpp | 0 waterbox/ares64/ares/nall/decode/gzip.hpp | 0 waterbox/ares64/ares/nall/decode/html.hpp | 0 waterbox/ares64/ares/nall/decode/huffman.hpp | 0 waterbox/ares64/ares/nall/decode/inflate.hpp | 0 waterbox/ares64/ares/nall/decode/lzsa.hpp | 0 waterbox/ares64/ares/nall/decode/mtf.hpp | 0 waterbox/ares64/ares/nall/decode/png.hpp | 0 waterbox/ares64/ares/nall/decode/rle.hpp | 0 waterbox/ares64/ares/nall/decode/url.hpp | 2 + waterbox/ares64/ares/nall/decode/wav.hpp | 0 waterbox/ares64/ares/nall/decode/zip.hpp | 0 waterbox/ares64/ares/nall/directory.cpp | 0 waterbox/ares64/ares/nall/directory.hpp | 0 waterbox/ares64/ares/nall/dl.cpp | 0 waterbox/ares64/ares/nall/dl.hpp | 0 waterbox/ares64/ares/nall/dsp/iir/biquad.hpp | 0 .../ares64/ares/nall/dsp/iir/dc-removal.hpp | 0 .../ares64/ares/nall/dsp/iir/one-pole.hpp | 0 .../ares64/ares/nall/dsp/resampler/cubic.hpp | 0 .../ares/nall/elliptic-curve/curve25519.hpp | 0 .../ares/nall/elliptic-curve/ed25519.hpp | 0 .../elliptic-curve/modulo25519-optimized.hpp | 0 .../elliptic-curve/modulo25519-reference.hpp | 0 waterbox/ares64/ares/nall/emulation/21fx.hpp | 0 waterbox/ares64/ares/nall/encode/base.hpp | 0 waterbox/ares64/ares/nall/encode/base64.hpp | 0 waterbox/ares64/ares/nall/encode/bmp.hpp | 0 waterbox/ares64/ares/nall/encode/bwt.hpp | 0 waterbox/ares64/ares/nall/encode/html.hpp | 0 waterbox/ares64/ares/nall/encode/huffman.hpp | 0 waterbox/ares64/ares/nall/encode/lzsa.hpp | 0 waterbox/ares64/ares/nall/encode/mtf.hpp | 0 waterbox/ares64/ares/nall/encode/png.hpp | 0 waterbox/ares64/ares/nall/encode/rle.hpp | 0 waterbox/ares64/ares/nall/encode/url.hpp | 0 waterbox/ares64/ares/nall/encode/wav.hpp | 0 waterbox/ares64/ares/nall/encode/zip.hpp | 0 waterbox/ares64/ares/nall/endian.hpp | 0 waterbox/ares64/ares/nall/file-buffer.hpp | 4 +- waterbox/ares64/ares/nall/file-map.cpp | 17 +- waterbox/ares64/ares/nall/file-map.hpp | 8 +- waterbox/ares64/ares/nall/file.hpp | 0 waterbox/ares64/ares/nall/float-env.hpp | 0 waterbox/ares64/ares/nall/function.hpp | 0 waterbox/ares64/ares/nall/galois-field.hpp | 0 waterbox/ares64/ares/nall/gdb/Readme.md | 227 + waterbox/ares64/ares/nall/gdb/server.cpp | 552 ++ waterbox/ares64/ares/nall/gdb/server.hpp | 131 + waterbox/ares64/ares/nall/gdb/watchpoint.hpp | 32 + waterbox/ares64/ares/nall/hash/crc16.hpp | 0 waterbox/ares64/ares/nall/hash/crc32.hpp | 0 waterbox/ares64/ares/nall/hash/crc64.hpp | 0 waterbox/ares64/ares/nall/hash/hash.hpp | 0 waterbox/ares64/ares/nall/hash/sha224.hpp | 0 waterbox/ares64/ares/nall/hash/sha256.hpp | 0 waterbox/ares64/ares/nall/hash/sha384.hpp | 0 waterbox/ares64/ares/nall/hash/sha512.hpp | 0 waterbox/ares64/ares/nall/hashset.hpp | 0 waterbox/ares64/ares/nall/hid.hpp | 4 +- waterbox/ares64/ares/nall/http/client.cpp | 0 waterbox/ares64/ares/nall/http/client.hpp | 0 waterbox/ares64/ares/nall/http/message.hpp | 0 waterbox/ares64/ares/nall/http/request.hpp | 0 waterbox/ares64/ares/nall/http/response.hpp | 0 waterbox/ares64/ares/nall/http/role.hpp | 0 waterbox/ares64/ares/nall/http/server.cpp | 0 waterbox/ares64/ares/nall/http/server.hpp | 0 waterbox/ares64/ares/nall/image.hpp | 0 waterbox/ares64/ares/nall/image/blend.hpp | 0 waterbox/ares64/ares/nall/image/core.hpp | 0 waterbox/ares64/ares/nall/image/fill.hpp | 0 .../ares64/ares/nall/image/interpolation.hpp | 0 waterbox/ares64/ares/nall/image/load.hpp | 0 .../ares64/ares/nall/image/multifactor.hpp | 20 +- waterbox/ares64/ares/nall/image/scale.hpp | 0 waterbox/ares64/ares/nall/image/static.hpp | 0 waterbox/ares64/ares/nall/image/utility.hpp | 0 waterbox/ares64/ares/nall/induced-sort.hpp | 0 waterbox/ares64/ares/nall/inline-if.hpp | 0 waterbox/ares64/ares/nall/inode.cpp | 0 waterbox/ares64/ares/nall/inode.hpp | 0 waterbox/ares64/ares/nall/instance.hpp | 0 waterbox/ares64/ares/nall/interpolation.hpp | 0 waterbox/ares64/ares/nall/intrinsics.hpp | 41 +- waterbox/ares64/ares/nall/ips.hpp | 63 + waterbox/ares64/ares/nall/iterator.hpp | 0 waterbox/ares64/ares/nall/literals.hpp | 0 waterbox/ares64/ares/nall/locale.hpp | 0 waterbox/ares64/ares/nall/location.hpp | 0 waterbox/ares64/ares/nall/mac/poly1305.hpp | 0 waterbox/ares64/ares/nall/macos/guard.hpp | 0 waterbox/ares64/ares/nall/main.cpp | 1 + waterbox/ares64/ares/nall/main.hpp | 0 waterbox/ares64/ares/nall/map.hpp | 0 waterbox/ares64/ares/nall/matrix-multiply.hpp | 0 waterbox/ares64/ares/nall/matrix.hpp | 0 waterbox/ares64/ares/nall/maybe.hpp | 0 waterbox/ares64/ares/nall/memory.cpp | 7 +- waterbox/ares64/ares/nall/memory.hpp | 18 +- waterbox/ares64/ares/nall/merge-sort.hpp | 0 waterbox/ares64/ares/nall/nall.cpp | 3 +- waterbox/ares64/ares/nall/nall.hpp | 0 waterbox/ares64/ares/nall/path.cpp | 24 + waterbox/ares64/ares/nall/path.hpp | 4 + waterbox/ares64/ares/nall/platform.cpp | 0 waterbox/ares64/ares/nall/platform.hpp | 1 + waterbox/ares64/ares/nall/pointer.hpp | 0 waterbox/ares64/ares/nall/posix/service.hpp | 0 .../ares64/ares/nall/posix/shared-memory.hpp | 0 waterbox/ares64/ares/nall/primitives.hpp | 0 .../ares64/ares/nall/primitives/bit-field.hpp | 0 .../ares64/ares/nall/primitives/bit-range.hpp | 0 .../ares64/ares/nall/primitives/boolean.hpp | 0 .../ares64/ares/nall/primitives/integer.hpp | 0 .../ares64/ares/nall/primitives/literals.hpp | 0 .../ares64/ares/nall/primitives/natural.hpp | 0 waterbox/ares64/ares/nall/primitives/real.hpp | 0 .../ares64/ares/nall/primitives/types.hpp | 0 waterbox/ares64/ares/nall/priority-queue.hpp | 0 waterbox/ares64/ares/nall/property.hpp | 0 waterbox/ares64/ares/nall/queue.hpp | 0 waterbox/ares64/ares/nall/queue/spsc.hpp | 0 waterbox/ares64/ares/nall/queue/st.hpp | 0 waterbox/ares64/ares/nall/random.cpp | 0 waterbox/ares64/ares/nall/random.hpp | 6 +- waterbox/ares64/ares/nall/range.hpp | 0 .../ares/nall/recompiler/amd64/amd64.hpp | 0 .../ares/nall/recompiler/amd64/constants.hpp | 0 .../ares/nall/recompiler/amd64/emitter.hpp | 0 .../amd64/encoder-calls-systemv.hpp | 0 .../amd64/encoder-calls-windows.hpp | 0 .../recompiler/amd64/encoder-instructions.hpp | 0 .../nall/recompiler/generic/constants.hpp | 0 .../nall/recompiler/generic/encoder-calls.hpp | 12 +- .../generic/encoder-instructions.hpp | 0 .../ares/nall/recompiler/generic/generic.hpp | 3 +- waterbox/ares64/ares/nall/reed-solomon.hpp | 0 waterbox/ares64/ares/nall/run.cpp | 0 waterbox/ares64/ares/nall/run.hpp | 0 waterbox/ares64/ares/nall/serial.hpp | 0 waterbox/ares64/ares/nall/serializer.hpp | 5 +- waterbox/ares64/ares/nall/service.hpp | 0 waterbox/ares64/ares/nall/set.hpp | 0 waterbox/ares64/ares/nall/shared-memory.hpp | 0 waterbox/ares64/ares/nall/shared-pointer.hpp | 0 waterbox/ares64/ares/nall/smtp.cpp | 0 waterbox/ares64/ares/nall/smtp.hpp | 0 waterbox/ares64/ares/nall/stdint.hpp | 0 waterbox/ares64/ares/nall/string.hpp | 0 .../ares/nall/string/allocator/adaptive.hpp | 0 .../nall/string/allocator/copy-on-write.hpp | 0 .../allocator/small-string-optimization.hpp | 0 .../ares/nall/string/allocator/vector.hpp | 0 waterbox/ares64/ares/nall/string/atoi.hpp | 0 waterbox/ares64/ares/nall/string/cast.hpp | 0 waterbox/ares64/ares/nall/string/compare.hpp | 0 waterbox/ares64/ares/nall/string/convert.hpp | 0 waterbox/ares64/ares/nall/string/core.hpp | 0 .../ares/nall/string/eval/evaluator.hpp | 0 .../ares64/ares/nall/string/eval/literal.hpp | 0 .../ares64/ares/nall/string/eval/node.hpp | 0 .../ares64/ares/nall/string/eval/parser.hpp | 0 waterbox/ares64/ares/nall/string/find.hpp | 0 waterbox/ares64/ares/nall/string/format.hpp | 6 + .../ares64/ares/nall/string/markup/bml.hpp | 0 .../ares64/ares/nall/string/markup/find.hpp | 0 .../ares64/ares/nall/string/markup/node.hpp | 2 +- .../ares64/ares/nall/string/markup/xml.hpp | 0 waterbox/ares64/ares/nall/string/match.hpp | 0 waterbox/ares64/ares/nall/string/pascal.hpp | 2 +- waterbox/ares64/ares/nall/string/replace.hpp | 0 waterbox/ares64/ares/nall/string/split.hpp | 0 .../ares64/ares/nall/string/transform/cml.hpp | 0 .../ares64/ares/nall/string/transform/dml.hpp | 0 waterbox/ares64/ares/nall/string/trim.hpp | 0 waterbox/ares64/ares/nall/string/utf8.hpp | 0 waterbox/ares64/ares/nall/string/utility.hpp | 0 waterbox/ares64/ares/nall/string/vector.hpp | 0 waterbox/ares64/ares/nall/string/view.hpp | 0 waterbox/ares64/ares/nall/suffix-array.hpp | 0 .../ares64/ares/nall/tcptext/tcp-socket.cpp | 312 + .../ares64/ares/nall/tcptext/tcp-socket.hpp | 65 + .../ares/nall/tcptext/tcptext-server.cpp | 29 + .../ares/nall/tcptext/tcptext-server.hpp | 26 + waterbox/ares64/ares/nall/terminal.cpp | 0 waterbox/ares64/ares/nall/terminal.hpp | 0 waterbox/ares64/ares/nall/thread.cpp | 0 waterbox/ares64/ares/nall/thread.hpp | 2 + waterbox/ares64/ares/nall/traits.hpp | 25 +- waterbox/ares64/ares/nall/unique-pointer.hpp | 0 waterbox/ares64/ares/nall/utility.hpp | 0 waterbox/ares64/ares/nall/variant.hpp | 0 waterbox/ares64/ares/nall/varint.hpp | 0 waterbox/ares64/ares/nall/vector.hpp | 1 + waterbox/ares64/ares/nall/vector/access.hpp | 0 waterbox/ares64/ares/nall/vector/assign.hpp | 0 waterbox/ares64/ares/nall/vector/compare.hpp | 0 waterbox/ares64/ares/nall/vector/core.hpp | 0 waterbox/ares64/ares/nall/vector/iterator.hpp | 0 waterbox/ares64/ares/nall/vector/memory.hpp | 0 waterbox/ares64/ares/nall/vector/modify.hpp | 0 .../ares/nall/vector/specialization/u8.hpp | 0 waterbox/ares64/ares/nall/vector/utility.hpp | 7 + waterbox/ares64/ares/nall/vfs.hpp | 0 waterbox/ares64/ares/nall/vfs/attribute.hpp | 0 waterbox/ares64/ares/nall/vfs/cdrom.hpp | 103 +- waterbox/ares64/ares/nall/vfs/directory.hpp | 0 waterbox/ares64/ares/nall/vfs/disk.hpp | 0 waterbox/ares64/ares/nall/vfs/file.hpp | 0 waterbox/ares64/ares/nall/vfs/memory.hpp | 0 waterbox/ares64/ares/nall/vfs/node.hpp | 0 waterbox/ares64/ares/nall/vfs/vfs.hpp | 0 waterbox/ares64/ares/nall/view.hpp | 0 waterbox/ares64/ares/nall/windows/detour.cpp | 0 waterbox/ares64/ares/nall/windows/detour.hpp | 0 waterbox/ares64/ares/nall/windows/guid.cpp | 0 waterbox/ares64/ares/nall/windows/guid.hpp | 0 .../ares64/ares/nall/windows/launcher.cpp | 0 .../ares64/ares/nall/windows/launcher.hpp | 0 .../ares64/ares/nall/windows/registry.cpp | 0 .../ares64/ares/nall/windows/registry.hpp | 0 waterbox/ares64/ares/nall/windows/service.hpp | 0 .../ares/nall/windows/shared-memory.hpp | 0 waterbox/ares64/ares/nall/windows/utf8.cpp | 0 waterbox/ares64/ares/nall/windows/utf8.hpp | 0 waterbox/ares64/ares/nall/windows/windows.hpp | 0 waterbox/ares64/ares/nall/xorg/clipboard.hpp | 0 waterbox/ares64/ares/nall/xorg/guard.hpp | 0 waterbox/ares64/ares/nall/xorg/xorg.hpp | 0 waterbox/ares64/ares/thirdparty/sljit.h | 0 .../ares64/ares/thirdparty/sljit/.gitignore | 0 .../ares64/ares/thirdparty/sljit/API_CHANGES | 33 + .../ares/thirdparty/sljit/INTERNAL_CHANGES | 0 waterbox/ares64/ares/thirdparty/sljit/LICENSE | 0 .../ares64/ares/thirdparty/sljit/Makefile | 0 waterbox/ares64/ares/thirdparty/sljit/README | 36 +- .../ares/thirdparty/sljit/doc/overview.txt | 16 +- .../sljit/doc/tutorial/99bottles.bf | 0 .../ares/thirdparty/sljit/doc/tutorial/README | 0 .../sljit/doc/tutorial/array_access.c | 51 +- .../thirdparty/sljit/doc/tutorial/brainfuck.c | 8 +- .../thirdparty/sljit/doc/tutorial/branch.c | 0 .../sljit/doc/tutorial/first_program.c | 0 .../thirdparty/sljit/doc/tutorial/func_call.c | 0 .../thirdparty/sljit/doc/tutorial/hello.bf | 0 .../ares/thirdparty/sljit/doc/tutorial/loop.c | 0 .../sljit/doc/tutorial/sljit_tutorial.html | 8 +- .../sljit/doc/tutorial/struct_access.c | 27 +- .../thirdparty/sljit/doc/tutorial/temp_var.c | 0 .../thirdparty/sljit/regex_src/regexJIT.c | 6 +- .../thirdparty/sljit/regex_src/regexJIT.h | 0 .../thirdparty/sljit/regex_src/regexMain.c | 4 +- .../allocator_src/sljitExecAllocatorApple.c | 39 +- .../allocator_src/sljitExecAllocatorCore.c | 4 +- .../allocator_src/sljitExecAllocatorFreeBSD.c | 0 .../allocator_src/sljitExecAllocatorPosix.c | 0 .../allocator_src/sljitExecAllocatorWindows.c | 0 .../sljitProtExecAllocatorNetBSD.c | 0 .../sljitProtExecAllocatorPosix.c | 0 .../allocator_src/sljitWXExecAllocatorPosix.c | 0 .../sljitWXExecAllocatorWindows.c | 0 .../thirdparty/sljit/sljit_src/sljitConfig.h | 22 - .../sljit/sljit_src/sljitConfigCPU.h | 188 + .../sljit/sljit_src/sljitConfigInternal.h | 322 +- .../thirdparty/sljit/sljit_src/sljitLir.c | 1735 ++-- .../thirdparty/sljit/sljit_src/sljitLir.h | 846 +- .../sljit/sljit_src/sljitNativeARM_32.c | 2193 +++-- .../sljit/sljit_src/sljitNativeARM_64.c | 1555 +++- .../sljit/sljit_src/sljitNativeARM_T2_32.c | 1519 +++- .../sljit/sljit_src/sljitNativeLOONGARCH_64.c | 3158 +++++++ .../sljit/sljit_src/sljitNativeMIPS_32.c | 157 +- .../sljit/sljit_src/sljitNativeMIPS_64.c | 66 +- .../sljit/sljit_src/sljitNativeMIPS_common.c | 1137 ++- .../sljit/sljit_src/sljitNativePPC_32.c | 109 +- .../sljit/sljit_src/sljitNativePPC_64.c | 127 +- .../sljit/sljit_src/sljitNativePPC_common.c | 961 ++- .../sljit/sljit_src/sljitNativeRISCV_32.c | 26 +- .../sljit/sljit_src/sljitNativeRISCV_64.c | 24 +- .../sljit/sljit_src/sljitNativeRISCV_common.c | 803 +- .../sljit/sljit_src/sljitNativeS390X.c | 1372 ++- .../sljit/sljit_src/sljitNativeX86_32.c | 435 +- .../sljit/sljit_src/sljitNativeX86_64.c | 472 +- .../sljit/sljit_src/sljitNativeX86_common.c | 2898 +++++-- .../sljit/sljit_src/sljitSerialize.c | 516 ++ .../thirdparty/sljit/sljit_src/sljitUtils.c | 0 .../sljit/test_src/sljitConfigPost.h | 0 .../sljit/test_src/sljitConfigPre.h | 0 .../thirdparty/sljit/test_src/sljitMain.c | 0 .../thirdparty/sljit/test_src/sljitTest.c | 7319 +++++------------ .../thirdparty/sljit/test_src/sljitTestCall.h | 2031 +++++ .../sljit/test_src/sljitTestFloat.h | 2877 +++++++ .../sljit/test_src/sljitTestSerialize.h | 361 + .../thirdparty/sljit/test_src/sljitTestSimd.h | 2333 ++++++ .../ares64/ares/thirdparty/sljitAllocator.cpp | 2 +- .../ares64/ares/thirdparty/sljitConfigPost.h | 0 .../ares64/ares/thirdparty/sljitConfigPre.h | 0 waterbox/ares64/ares/thirdparty/xxhash.h | 0 556 files changed, 28856 insertions(+), 10329 deletions(-) mode change 100644 => 100755 waterbox/ares64/ares/LICENSE mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/ares.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/ares.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/debug/debug.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/debug/debug.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/inline.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/memory/fixed-allocator.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/memory/fixed-allocator.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/memory/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/memory/readable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/memory/writable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/attribute.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/audio/audio.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/audio/stream.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/audio/stream.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/class.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/component/component.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/component/real-time-clock.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/debugger.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/graphics.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/properties.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/tracer/instruction.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/tracer/notification.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/debugger/tracer/tracer.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/input/axis.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/input/button.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/input/input.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/input/rumble.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/input/trigger.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/node.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/node.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/object.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/peripheral.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/port.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/boolean.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/integer.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/natural.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/real.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/setting.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/setting/string.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/system.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/video/screen.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/video/screen.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/video/sprite.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/video/sprite.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/node/video/video.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/platform.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/random.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/GNUmakefile mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/icon.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/icon@2x.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/logo.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/logo@2x.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/resource.bml mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/resource.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/resource.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-blue.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-green.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-red.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-0.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-1.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-2.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/headphones.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/initialized.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/low-battery.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-0.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-1.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/powered-on.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/sleeping.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a0.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a1.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a2.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b0.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b1.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b2.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b3.png mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/scheduler/scheduler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/scheduler/scheduler.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/scheduler/thread.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/scheduler/thread.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/ares/types.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/disassembler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/instruction.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/instructions.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/memory.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/component/processor/sm5k/timer.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/accuracy.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ai/ai.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ai/ai.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ai/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ai/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ai/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/cartridge.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/cartridge.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/flash.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/isviewer.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/joybus.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/rtc.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/slot.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cartridge/slot.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cic/cic.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cic/cic.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cic/commands.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cic/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cic/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/controller.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/controller.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc1.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc3.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc5.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/gamepad/transfer-pak.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/mouse/mouse.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/mouse/mouse.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/port.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/controller/port.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/algorithms.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/context.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/cpu.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/cpu.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/dcache.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/disassembler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/exceptions.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/interpreter-cop2.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/interpreter-fpu.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/interpreter-ipu.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/interpreter-scc.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/interpreter.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/memory.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/recompiler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/cpu/tlb.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/controller.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/dd.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/dd.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/drive.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/rtc.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/dd/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/bus.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/io.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/lsb/readable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/lsb/writable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/memory.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/msb/readable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/memory/msb/writable.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/mi/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/mi/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/mi/mi.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/mi/mi.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/mi/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/n64.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/bus.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/dma.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/pi.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/pi.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pi/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/hle.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/pif.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/pif.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/pif/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/rdp.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/rdp.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/render.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdp/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdram/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdram/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdram/rdram.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdram/rdram.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rdram/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ri/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ri/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ri/ri.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ri/ri.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/ri/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/decoder.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/disassembler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/dma.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/interpreter-ipu.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/interpreter-scc.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/interpreter-vpu.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/interpreter.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/recompiler.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/rsp.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/rsp.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/rsp/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/dma.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/si.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/si/si.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/system/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/system/system.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/system/system.hpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/vi/debugger.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/vi/io.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/vi/serialization.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/vi/vi.cpp mode change 100644 => 100755 waterbox/ares64/ares/ares/n64/vi/vi.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/adaptive-array.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/algorithm.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/any.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/arguments.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/arithmetic.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/arithmetic/barrett.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/arithmetic/natural.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/arithmetic/unsigned.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/array-span.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/array-view.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/array.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/atoi.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/bcd.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/beat/single/apply.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/beat/single/create.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/bit.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/bump-allocator.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/case-range.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/crc16.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/edc.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/efm.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/rspc.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/scrambler.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/session.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cd/sync.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/chrono.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/cipher/chacha20.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/counting-sort.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/database/odbc.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/database/sqlite3.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/base.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/base64.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/bmp.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/bwt.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/chd.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/cue.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/gzip.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/html.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/huffman.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/inflate.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/lzsa.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/mtf.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/png.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/rle.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/url.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/wav.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/decode/zip.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/directory.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/directory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dl.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dl.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dsp/iir/biquad.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dsp/iir/dc-removal.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dsp/iir/one-pole.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/dsp/resampler/cubic.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/elliptic-curve/curve25519.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/elliptic-curve/ed25519.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/elliptic-curve/modulo25519-optimized.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/elliptic-curve/modulo25519-reference.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/emulation/21fx.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/base.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/base64.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/bmp.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/bwt.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/html.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/huffman.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/lzsa.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/mtf.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/png.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/rle.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/url.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/wav.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/encode/zip.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/endian.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/file-buffer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/file-map.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/file-map.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/file.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/float-env.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/function.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/galois-field.hpp create mode 100755 waterbox/ares64/ares/nall/gdb/Readme.md create mode 100755 waterbox/ares64/ares/nall/gdb/server.cpp create mode 100755 waterbox/ares64/ares/nall/gdb/server.hpp create mode 100755 waterbox/ares64/ares/nall/gdb/watchpoint.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/crc16.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/crc32.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/crc64.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/hash.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/sha224.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/sha256.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/sha384.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hash/sha512.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hashset.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/hid.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/client.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/client.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/message.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/request.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/response.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/role.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/server.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/http/server.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/blend.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/core.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/fill.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/interpolation.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/load.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/multifactor.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/scale.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/static.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/image/utility.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/induced-sort.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/inline-if.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/inode.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/inode.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/instance.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/interpolation.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/intrinsics.hpp create mode 100755 waterbox/ares64/ares/nall/ips.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/iterator.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/literals.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/locale.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/location.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/mac/poly1305.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/macos/guard.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/main.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/main.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/map.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/matrix-multiply.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/matrix.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/maybe.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/memory.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/merge-sort.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/nall.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/nall.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/path.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/path.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/platform.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/platform.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/pointer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/posix/service.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/posix/shared-memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/bit-field.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/bit-range.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/boolean.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/integer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/literals.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/natural.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/real.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/primitives/types.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/priority-queue.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/property.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/queue.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/queue/spsc.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/queue/st.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/random.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/random.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/range.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/amd64.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/constants.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/emitter.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-systemv.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-windows.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/amd64/encoder-instructions.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/generic/constants.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/generic/encoder-calls.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/generic/encoder-instructions.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/recompiler/generic/generic.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/reed-solomon.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/run.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/run.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/serial.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/serializer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/service.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/set.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/shared-memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/shared-pointer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/smtp.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/smtp.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/stdint.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/allocator/adaptive.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/allocator/copy-on-write.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/allocator/small-string-optimization.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/allocator/vector.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/atoi.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/cast.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/compare.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/convert.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/core.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/eval/evaluator.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/eval/literal.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/eval/node.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/eval/parser.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/find.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/format.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/markup/bml.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/markup/find.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/markup/node.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/markup/xml.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/match.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/pascal.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/replace.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/split.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/transform/cml.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/transform/dml.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/trim.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/utf8.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/utility.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/vector.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/string/view.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/suffix-array.hpp create mode 100755 waterbox/ares64/ares/nall/tcptext/tcp-socket.cpp create mode 100755 waterbox/ares64/ares/nall/tcptext/tcp-socket.hpp create mode 100755 waterbox/ares64/ares/nall/tcptext/tcptext-server.cpp create mode 100755 waterbox/ares64/ares/nall/tcptext/tcptext-server.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/terminal.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/terminal.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/thread.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/thread.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/traits.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/unique-pointer.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/utility.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/variant.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/varint.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/access.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/assign.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/compare.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/core.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/iterator.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/modify.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/specialization/u8.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vector/utility.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/attribute.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/cdrom.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/directory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/disk.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/file.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/node.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/vfs/vfs.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/view.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/detour.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/detour.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/guid.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/guid.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/launcher.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/launcher.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/registry.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/registry.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/service.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/shared-memory.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/utf8.cpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/utf8.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/windows/windows.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/xorg/clipboard.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/xorg/guard.hpp mode change 100644 => 100755 waterbox/ares64/ares/nall/xorg/xorg.hpp mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/.gitignore mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/API_CHANGES mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/INTERNAL_CHANGES mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/LICENSE mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/Makefile mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/README mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/overview.txt mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/99bottles.bf mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/README mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/array_access.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/brainfuck.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/branch.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/first_program.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/func_call.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/hello.bf mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/loop.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/sljit_tutorial.html mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/struct_access.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/temp_var.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/regex_src/regexMain.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorFreeBSD.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorPosix.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorWindows.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorNetBSD.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorPosix.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorPosix.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorWindows.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfig.h create mode 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigCPU.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigInternal.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_32.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_T2_32.c create mode 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeLOONGARCH_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_32.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_common.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_32.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_common.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_32.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_common.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeS390X.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_32.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_64.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_common.c create mode 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitSerialize.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitUtils.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPost.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPre.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitMain.c mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTest.c create mode 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestCall.h create mode 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestFloat.h create mode 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSerialize.h create mode 100755 waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSimd.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljitAllocator.cpp mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljitConfigPost.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/sljitConfigPre.h mode change 100644 => 100755 waterbox/ares64/ares/thirdparty/xxhash.h diff --git a/Assets/dll/ares64_interpreter.wbx.zst b/Assets/dll/ares64_interpreter.wbx.zst index 14a13797ff8cade63958cf4188649154fe93c01c..8a13eada308e524e2914ccc3e5df7c2431729e37 100644 GIT binary patch literal 507645 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

8cU*V^Q+H*t2_CEKB0k`l6+RpwJN!X~aR$ z%WC>1JR=}}*@%Diz+GE=T9o13Zvs<3Rpsn*iRGBdlGksxqw z3(SLtpe+W&F~JkY^FvANhrF6Z*yaM7fQKs}5czdy!m^^)OwogI|1MA7bV*b{VJKfj z`N3zkO^GmRg`Z-3Pp+w-`p|#QFHkWz;C;RLqHU*_+ruE; z0)QqdxY#6kYC)q!Bb_6XP(LGQlgVh90O`Ocm!j4fmX!GG6Wp0+$lm)r%zp|Y77E5#4O)-)e!hx;bF{Hz@NxRan{+h&F zsI%NuY>AvYQ8LR68RlfrW_+2&PJ>KP#Ewz1QeV!}pE}-#S$Wd8k9>S{*!f{_2t9Gp zxbTPGT-~EQTk@`4O8i3o4g9_rLep~w+*xdgIiczdGH>%PJEJKJptWKH!q1N|fnNbE zo(L62-L)3mWahp(s(3K-?mQv9Je&id3Bk_isO#>?l1(&X$l#vRK$^T}^s z<*~|K@IFJIf7f1I>?m1{7R3EQKwwej)6A`w&aavJXd?6RFx&6rtH+_Bl1W|n%OgtT zM|3*MpK0pt`ar8;`+zd2_>MOuZS&h(lyhv5-x!>5TGX=h2vnb8?JhCVSI}0o7Y7)J z`WnJA!$rDr!P^hxheC&%{hL9{1ls)U)E*{&CV@e}#`DMrf-^fSBuD`OW zxZHsgXZG-2j(c?p5!LGx*r+#_yohZk%%>3F)AcMNl(s{_5t zzdu@~4$6EmrHb7?ka=AV3;#}?1IQXr$0CjX?2PO*U=&lboH<#3ur92=UsA=<6~|>!EDbKt^REmA?XIB_A_TUdar(@VoVd| z(#op{<4M6CSB-w|qH?y%VOmFRux`_BP}|;5rihl$CXyF>>~T}byv9ecV*Pu-We{It zr0$NZMq67>ml3L5;`CB*7I?v)FXU^mt{|zE8hifj{U(skqA0t>zeo_q$jSE6yo*(? z4SKg5Y5!jOQ<6U$q5GvwHhJuLOmnKjWaCBP(hHX~tOIL1#a zJ9ozDA<&#UJ+K@pvIypQ?8ZqcOQ2U=w@MO1ECL0TQpFPMuAB0DG1HqR7 zwU46_I6c>#D|DR;*K|R0I|SMCS!45$F}*?y~NKhB3#z% zTMYe&d;iDD`v>RLoIqo-oxJc5+Yfs(%p-$dL)(rkb4J`~TG*I}0mBV7V=E7F-Gga! z|Fk;e)to`(f8P`|7!2qdW6$1?-4yj*$2-sC?h z#gK{kcV}zaJ&S`NX?`2GRjLErpE2{M^9ueqMzu43)Ys4nAwlBLqWEJOdP&I?>|s^7 zTt)q`aT?t44(Kp@gYWZ3pC{LiqSFp}`phrwLu-6@z-|sb?h*R#P5C{iFl4XO9IQ8( zBX;$N?Q;Ooy`W-J-gzTB?oogzI%%U-kUTy7pZ;0u9S{MS^mqbKbSn)Mj?e%YrzXyJFt*K!n>YE5Rc%H$97XdpF#K`=4`(N) zEdi_4Vj#7Xm>guoz?hymENO`Q%6hHpu*Q&!?jtW)MSVV9Sh2t&Z7LN{1!Q7}F6dgd zD;vTl0md_+WE|mlOnDegyD=KuW=FJ!MdK@15y&PxLN#Ouj2YHT#g4}_uHOjxjE(Hk zH=OyXG*yHp4BUvHbo(PxqvQZ*NU{Cr$Fv$e`<(p>uvSfOj!%Re1p(T%6)D5Os?Htr zNT_iu%(ZeefaHdR)S{W;o(@Uk!w6~56 zg^9zdRSzj=qjzaibm((*DH`&oa(F}k`hb!W<;UnLTXcAjUnN~G3ag+3{58umnar3 z#MznHYaV7Zz)W5tx;*BU;U`->t|Ym$L}#dw`{0x5shX{RGQ%(5t)%Cm#5+LZC86#s zDJ@M;j5UzuST&LodCGwF0Bg9)UEJCT!3hSF73P75lcGWTYMbpqU<56k^I}QYJ^jNZ zgdjDoT9FWV9FRFSxZ><~i%ut8BrXOdq~>4zSrL^(p3mw)8bQ(rZ)XUTlaPhKUdHaE zlal1j*nhMeRaSH~)#JabZvB zC@&)HA?A~h8Y=CK(9Kar!vy>onQRz;g4cvzF4hU}B8jd6V9kqJxB8DK3uxZ`Y4e=p z9yfPF7vL`d@Oc%L-wV(2HA$Xll041cM@teN&EXG9YQ{9$6>qIU7tl?pw)u>K3}ZUATkx7yFexf!oJ!M{X)606uqOfa&^(DmC)1&bniBm zm%B@=6aHU8h{en2ISg>&rm&YBuJGl_oqCCzV}^UMhwUCUA~n21ru3(#wxn%hBIr}i zxwbNrv7Uz*;;4i_B0=MgESANVj5UL$DFc2(9?rV6MC`v(j^mG1gB};4s83bf62PLz z6PO#m`w=tEZJy=)+3D<0(vccenQ?4p&l>8Oh?EcOAUroJ&BEMFeJt4JfB_=-%l`J4 zPr)I2Y@<1kFY5BSWvV=l*h7xZNh>oNP6p>Op45}tV+ zNMHleyGbH~QF#rC=x@=Y5*-1Yd~UmOJagxUpO=gg>#tY7Tch(1WYnQ{B zUvZgPba~0kEVRCfZp_@q4V$E-9szRYElhM7jcJ=Vw6nq4(B5W5TLYFX@^%y2Rz~<= zLM=2h#%JbpYBp?{*nnW=l!_GAzsTt-U~J=zFYDO+IOz@|aSI%lLO2iUqp04;t1sij zOsbz1G<4uW_I=HKzItH;$*U;wpgIt%X_uplgPiY#kq84ugo)UOQmMh`@X=YQZ<46& z83>tuSK%>k9vmv%@`#U@lK{sT{AjX!TUNn9DDb*^6f4uZmv_geRD`;S9m}36{jCDs zJ9xyt=Fmig!=P;uG6FrMm&1L!Pxc2RU1s0xT?^!mC-aLuF#D~O22-9FRm7O+6gQyF z2e63?Hr-Su53ODTc{^E*J)99fG}ct9gJh9Fjhn@6eEk;P%Z>IIG4>4et{SvsMV8I;J zQi;t8Q)fCfsHYA|-sKR)ARU+~Tq{@6Xswc;Hj%(~D=Bdu)jk-!{*U6&^>As~>vqB1 zisdz1dTXSRrgrcQCf9&8VM)5`MI8rR?|9L|oI*TxJ`l)L#*IINUymul^?CUDX~u@( zQzNdkcJn<2{JBj0l0loz31q&gryU1&aKf3Dz<2&Gaq}FrV8o4J^632>8lg%)33s2d zet1mBa4FXKd-O>Xl?*XuKCG_fnTKY^3gV>-%x=(x_YH@NjO^*A3H#r=J^31}c7Od3 zVaL;C5B z7$e-{My0C)0<{UDK7DGUT4pkEY~{55BdjPTt2?IRv^D^dBYubniWBd{NEQ2AAcrF zOrC}eBT;{kLnj8PWAU>&;5VJGPa%F5(=OOggP8Sn2;Tz!GMn+qJxFTPZ`aSVgas?cO;%Q%-$9M$Va?>Di}@II5QI6@9_vU5}@X(av&CIKsC z6~~+vgXKL_Y?gf)0wM4PcCvvm?Oi$|fYH=sR^D*Yz=mIBh%?)gf1qIN4A1QA4EO&) zHvd8}wS!Re3;bEruA zDGE-e%Lw2q`~c)eCHVi)oJJ0VPjpvEs=DB^r)ui6eg!9~FM>|q52sQQaCK=xH5vch zuLf>%g)0IT#0FCgS_@2L==+6yOtm3dDhU zC|yRaMnpxKSw z=%Vbp(KD1!kWcGfRX__>unrj`9mY~p8{$Z}0P?v35eeMr?{diBa@XhVJwtZg8XXp< z=SO6I66f-hJ7w*cMBK+2=Y@W>=>cD2clDIek48Td5N6l%G6^qbi{q)qBg+8$;njS# zFTw>Qeac2-xlJ9<4$>96%TvE?kP-6fAQURO80K);56Tphzh>Z{zdKjtY{MV2GBF4?!Fn>uxe8l0O4tdO+(_wO@mVB zjb@cuT?EvQ+mr>~Xfs6Xl+La zZ1JOkc1vI-Eh#N21*u~oPGiRXc7o7e_q&+UX8&!AJfTt4FPSX2hvEtSBegX_5iGdp zVO;Mh)ukf~)kBzkJRf;!9x1AX&(-l`FGA-r$VLF?0m6B}*GYF_BWK#k<)j~XWZUS2 zGI&4`oX6@fKo>EF51@4fF`sB-OTRU%%L6*NDNhHsULouBq;jl~<#i^ccCh?-sb#|V zY#;W0@6@9;llJ)ec)**PJ*x41kdEyWtL7JV@tbfKYr+9GHmRFG=9wH z$0~9^yQ+(M_JyOYkxLrsxDSS68o*}`7KYxBI_7|Tz`KZCIm|`~gOH&+YFLb(g`qdW zQ~cWi+~HKh>}HxQi-8=z1!5-(PRA+%P~L9|N%vbM69@QSIW@0t)6~v>yg_y|CVfH~ zM&q$)l)c@*As`t>m>g4z5hgjfe^KI&Y-0x0H-L*_lR+l-ZOu=bnZ+2B)!akL;R<9O z+>MZ>OM{OQ^vv<2Ldg^Q?Z@8tgl3GdL24iMGs`bX>T>T1$hSt_hvi>+l$s0<*pE+P&2V3L2NMpL_X6)|R9 z2MSqknYmbh1nzhdhSWlba}mZ|SXRsLV$|U_#<&Kd50cA_9!BzW|8(21(;K`4-z9yF zuZoVbG^I$za&3`W{KZCg4t6*W)n7&SD7Gc8Ys&ui+m&p~qx<}Tf|M5LelX_k$fX3H zNU1Dp0lKRkTDn+(vOM5GbC(bFsewMf%YWeM0}yD{Ly%&fSfMc?kr-fwviV}4YX$;^ z)0*M>I$5-f1z*8AhIK5>X=NP$Hp4u&M^yNCl*D64?m+>;ZIB2JdmbL-;?WQsWHWG7 z;?i$|cfz@vLnv4<^bKz7@E#Kn6rZRjBw*F8Uk3Z95jk{uLBE*1iuvnTjZ`6E=+*D_ zdz2=;SathnaKwecT2Vm&Lyr=vQ#2T{=%dcrIf6p#J(J_&m^>NN%|4@d($Te(f!wIQ z(*$+W$&qPhb!kUX-{+i(oPO6g0oP||aCJC!i5o%+i53k7Z(Sg`%5D}y|Jo(4=%ECQ zMK+df6j_Zcg_ek*Z zJ(ti2NANeiDsYD*b9QES2)z1zuJbxkXmLxuB&&q1Jq!gz6eZ%|Rv#LWrHU~5;7=(k zT7U}Nu1r1X^(T?6`9Pz_5lN$mj?Rt`y`Z^eqNGV(Qc9xPQ&RJZP2dl$^X$ z(Fcn~)Sr#-3-*e>55^))yO@4mn-aYaBrf&j+m`N3OjG_zU$jPG!x^zpM8|iBD?KuCafvlQdYOI^ZYx{E@FtN zE+VTVtK-;dH23xb+9FfjRhWz{YVK=%m`2XN(+;&&lPA8-mHbO=<74%x{V7xMGvC!| znTMi8{LSXSS$^E3<%a>uMYx?T7sjt}Cwy4HIXBmr!hi7h(sqJM_Y2+(v4XWJX771p z3bzLmas>C4XLcD~$nt2zgdKSa%VuZ$NnDO2WLeZ321{T)lmF@XFq8MeAGTS~-P<;izB4~P3 zPK*+%(EZE-{RX<_NXLSE+~@=}`wGnNH0CFxY(G8&0v4DZG96ed>~!VBP<~P>Ehhq{ zfWl}|t2C+Z!#fBvfL^Q6tfE3;BRCS##n#_RnOS)4I=?hiI%@9Zx2FsEfZo zvT5#WCUv_y#~ak~MD~6>39mc5|Nh)(l7uIoUQZ4CV5lb%9e_Q*r$c`F(IKjBwD1%5 zbQiACunXL2t61FkS2DQp02X!#dkh(ji45lW@ee6S1>d((|N5;`+^~bxN)(n~&3QY{ zqv&^sT}#&%BGY_#xqBjc*ganqUuu5eOf5Hx|%B2jrC0;Um^Kp=pMWkCsg0K#2-cV&fo5M(pWE+1(QLV3(XO@jP}+Hg&b zVms#4*?VqvylHb~U(8Q*=j^y(i_6Nfd9iaF)m+bM7`h7Ny&wI zJrP7S0aZ}Y30z3X2q%%OVxw?dY;0IV2|dbYJOH&N)J2`b!KqUn25>`7b|7m=KoM1B zQX~TWh8lOO(G7}22_yuUPf4TErD~5h=)o+9f&zCpc-srRF@ZNn`SDBK*A*^GU%*@m z%jtE1;sOS#a6+%P)*RS#0?XG3y{U%T+Z{#fg;HtFHWP@suT>3rch0=^1LCRL<)i~C zqpZ|5-c&FooL z{(^g}3FCHVT2PNdwrxD!uiy(9AOQ6)ZY0}9n*eR}06d^NL}BH=+ic3MktQehfO^3; z6{XDCy4+u^Z;Mv>8fvV%-^xLXzyRu5$lq!h={YleCwe_4Vs*v?cn_D=>}y6}L+eP? z>2n?Ep2Zkb(DTFrmV^M^Gw^xh2qS{*dB!1@*j1)otQKG8$CQRuUQ9%hr>9rd5u)=; zt0G?LG@r#7TN-2PV`H!-(7gs*3?E8(=ukYsh-T)7MImJMy8}i1hmSF zh*o(qB9ufJRjBf9jJ+^asnVG;Xg#K0QNnt3q?)i`f1Aj9hy^>c=?&A_^>9{sFkf_f z#6WZ@VU05)|v>ySm@36MZVB1$k^Wc1LtU7tdEKa zKm~CA=7hY++LYU4r04RfEfk(_o?lt$(-jgrv*D_Z0R*6ID^VJ)arF@Owl-C5aW5|q zLn|2z^SDLT?G`JDI~Qv_q1z_XeG`}{USm_rzT8{BH1QJC!g)n0n<7?(Ug3^d&a*SS ztBj0`G}`s0ObQn!Go;vMYs9?9d|PE_V_jRsxJ(g)GS);13av(?PSxtwYQ?IaiHR+( z;bP`%p*%C1t)N4%wIQY>gttXFXyz&+m^qwQwzGVYwIt3Icp9q|Bwa?STKYL_4`eo{-D;GN!a`Nb5}vRzEm0{;SR5E&u{66bh}qG| zLR{(G=$U{bXw5ZgOk-xMF>a$YyVKjjwQfJ?8h2OiqZ!?)@a?}atX3Y1loS_bzQqDT zf~0l9*}XK8Y2>!!vr6tVfqK!7qxr83%#T~TfaG`O^r-T7wM{CIIH=!3BYb^Y(~p$$ zkuYxRcLyM3iqTVZH_V)7gs;=w>-1m~rxCZNycMDqFeV?=^K_N$fS~Xg7FlKTY~(iB zNJn!gHi9)p#*A@S?u8(EH{2qK3{^F|-P#4{Q3Q0WwSId`z#ad+Vg1@*&aKg|kR|a? zmLfOq5Noyz0?(^}^N2ONge+o>PI|$B8v#!c^d{FxRs#V(W&XoI=l=HU?cybwzih zLHz}?<8czfHCI_DD9oKrgMC@CZdrr68flMUZ$k3)*Z+DVW}0P?pkeX=gCC4zr86K{ zQokQoQOFYMFD6wHeGRLuW;G*h=TsI*8<%-%Om^jNG>2`au0{%y9$idH99P`yMryjg zD@2Oz^H^4%_KY9C7I$tCop;^;0BiN-o`wSA2<_6iD6paM}JUIp(~ z^vr?r)1BI>-)WS|OZn~!ch^>#_jcLYSTyHsteTH;(YnRd%*KYu%*MLLsN7v+I!|s> zV_vpwiABejmZ+4JS{$w#sGAlAUg1=M=D8M`t*Ntl$~<=Ee!8R|qg0*QqBl)f;*{qJnK|1nyO~m4uaKfe;#Ow3pDi^irm^tnyyUqKx5N zy2OshC)X-3W`(4Oc%!KZy-Xn)QUbgZ+Zyv4BjbYX8uMyG!I4fS#wAUc7FoY6??ucW z^AZzwZHaZ2nT^?FNl92aG8`ZXV>nG5ayg)ovAfLPf*b1+3zC^&r;hZaud72orIs_S z@_kQ?jpc9sAk`1e%0o&7ZZ<~j#Z+WLG4OuVvw^vp8BMj61O$Q1nkVgaBmjxX?6Tny z=M*(V1r$}9E?ig>S7>8gz}#kA#JJ?l9{A4Csg6J)WYIA%W6?1e$fPd7)g5>{mZ)ss zpx28Z_JMz?chhayMACT%w9^#g;c!CpUU6X9OJFCf6kp6TEu6hlhj`K{gkikl#gam#PZFZg1 z(1P2Vp2=edGH`^t)b^AB@RND_02vYx_awoeCFGpYU0e#31#k!wL2xb~mI}R;=((7D zhbP<^<3ElPw?usbLaE?Gfa=9mqx;)A=|xv?0!Rq60ji48ZGAlzD7jwfu$bFNitt}h z@_b03vTv6cy1U~J?qCf7ss@}HSDLft!^9Hr6gC4Rz07zf%#(cxC|f+|p7Kw06i`5( zo(D|W4=6N7Grgd8C#(11nbB9_t248U?4CwLO*d~hxB!Q)$=Qp_UQ5)|a;rQPCOG$R zEmr|gXY41jlZ5VVj4D`hHpagXfh$3P7EBfN^kl3L^O3y@+#jHR29#~4+Sq63*}#V# zA5l=4nq4Ok0COkiZgFJMaF3{}k!MHg$I44#f~m-!uW+*sz%dVZ%pc$%c5a^BMlu?z z8q$uKT9lYH1L4Rlpz<#Z%6G$ZwGucN<;|5=!*RmVmCt_nNC&>rW;qq>(wYUVV_+q? zMax~l(p6TiHs#c*vl`DFoI2H0WW@0dS_WLoM$s2bEjMUanGIz=)wN|yC?ubfrkQoQ zj`^fiXJ}1lUpXl9e2KH_alIWDQ`?y-#r&RhqVy16A_GF$7?W*O4s0Xn8MFQOW-ZXP zfknDNj|pCoE|A5PbRq<~6J@m?1zF&I8d2Zkhn%bRCOSLR|2(DP?Ty@T=tZ%)(hbNE z6!8@E(eng7gkr{#Rp1WHKrG&z^w;OMx47V`cI=pOD(`VBB_+Epn%y&FJBplWLt}tJ z7vTn4(HWAICHqzmGUAU7?Pn<=I!1j;V}?ai39IC=UA6@DV2PbVyFa)DQWE$thPY=y z4{)j&7{@>ih)|7i?af*sdg8c&WVMw2B(}L#($tk>QKUTc67B%*7NwDIK^ce>%7qwk z(_JV^KIWBswHcV5=Y<{u=IwC~pgRoRpQ$Wn6n_dy3J+&VIr+3z+( zL}7vaVvZKo9>vLxM26PH8T$)kdluKE=YCztp|Z+n#v1U!Ll6-&&Omy) zPITZrcvo55+CMf%WR!*e0_CCCNI8T;bI=n(MLLByqi2{cyXORlEW$XbkD zW+og=i$>XIipnBkIS2ROU1MLaT>^TP$S#XmX!bA0m&sfvX3CxBzbFjyn)99!$FOf0 znlP^)B-@wasxC@nN?Q5I_e;&C=57|EClda|^%CZ~TdwRpi`*11K&`M5CfCaS%wWn9 zElhK+rmFw_B99qe7WvLF+&7*)tkHG#doXX9$Benr^YuBSCp*EjDE7ntlK+bR8kYPV zu2+XMk>r^1-l9{r4aF!Wca7jjjwdBhk8=Y4fW_Xr{3_JWj3^WbefEjFB~z_KKUET0pliDdXDa@*&mbnQR< z_yTj75e{?a?Z_>rng~xM`@!@5MP}@~WlZxz$MV;FHw-cjvo4C$h{ZK%RQOt9pxbbN zbKK`ELhgBfu|I2FK71DwEd8v}(^WIgtE#Xz(Tzv4YcVjfMw207)3)%qdnN#v!3ArT z2V!!)GRZMSx?H|El@K94pdQK!U9`_VC6I#T9&0xoTFg7xa9~d75%&jZ!`47U!#w~f z!za@0IlLsDCz$h)q!0Nd=|b&Ko1F+f(^xeqRER{OKot9oU0uV*$~9l7bd)ZyF=+?U zturw!A4HU2mhUja)>4+YsqmmIX?ZKGdyRmR?nU^rN2Uz5lnG0c-l8ByN-hQ@NZKf2 zGDj@htYImYTnbGXV?>HDq3*7-F0>Ye&#r>?{`#E;Gc#Zc(XrrC$blh5Y~$Hi1zJ=P zT6(oRz?x*j-r4AH6v=U;>lyAPOXMzQhaGqgY!0a?rf;qqL6|_iGslH1XI>_pPYUUi-s=6rdocMwO zlyfq(x46<>L@Fyww-89qkq(TeS^ne6{MP|Jx7n3gq~Vozz#3+E*;vdt)@Ud?G~6*T zJB}+&G;jFerXrKl00+wO8r`J{Sb*L|Jeq-6TK78#vlZtG(nau zRbw)z=V{|h2w#KTh@tiwNDaYagl`T|&!CH`D78{(60bC@wb$mTXZU70sS*{?hsz6A z23-u~vpVyiNl1p!9@3Z(U-?Q@J0J#QH4!tYX8`_{gY(4>+d=K98f&x;M~GiW2j$?E zgX6`Pwn-(RmRod=hm$Vt-^&zn2=_3bkg{`@HjQIuM-atZqrX^p#G38CUZ2I`q*EXT z*8CE-_1WyD1UpYKwil(F+SN%_CPcZo(zy8mUe?L@gD&3Bd9a=IDhIrj$_{nO;tWz! z&2pK`JCV4@pOijXsoy;T19#`V4gEo>>&y^KmbRCE)(uQevLJjw1 z(RG`j7G?7ApA>q&_5!+yC+0L~4E0NZ?0AE0ox>pN44l3zaCQe)bjv1 zm!B50b;g2=Nk_F4TJD}xjGDXmn|^Ck_p~eiIZn6q19>8$%17YV0y811PXx)o7zyub zaexM!spM|0!kPDl{K*Kle4>&I4jM~Wrv#S0do`9>2nd3aE1yE}lTBubLUvKNjX%bM z`@ECm#)5-@klILY_TQVm)@1gd7#sGl777^YWjMN9gYm^c287T?JN6QrqRwSx;r^;x z`qgx|mDp`n14p_q#Fbuv`*V3n;4Y6=xL(!*ejsG^qb5>l_zP1qFI&<<7TlAv3eW*& zOhpyUAs3_J4507^8mzwPwkpqF={8Kw1@n%>*SJ%L%3cUvBtU4)z!W`APC>><3kYxu8>!j0ROmGgMID`p6U#5E-Qn`=Y=*eT7< zlpACA3D^TLyHS!3f)&}{FSOf+RJ$h>e>gCUdFV%*J2<-w_TxADVD_|T3n?Fjv}{_< zXY*I+wTts~_jcMG2RpeRtql~-9?vag&}34`MAWTR37)JidJ@IjEtW{z;Qj#0Hoi`@ zP>pXJvF}p(JjvL#{K?LQy3Lf6oTk#9Danp{BtUBdod8dBz}v7WophH`OUZGed?Xps z=&8#A-K}zWnB{ohu$BDK4#;0Z?&N@3{jCwD$w=G|Ao z1&C@R62CSZ4$42XADf6kDJN+3_RqDkJ(wS_5hkm&_${YsOQ3yoid_kG8@|g?yE<}; zHM)gQ?E)QGvH$hKiZn2hK>wYR<8tMg5uruR4Dt76L!ITzKf=o3dVuTTP)z)?1Sx=) z*>`_p9hOq6UxEK{Ea9ldW+*~9`gM{y?B6XY%)s&yz&O|gIluC#-;8lwjLMlALB%j7 zrytnkGXVim595TA%>V@cl?y8&Ssy|PR#<3!ZGQA@b8WDA^kF65wEaLhCJPv&9_#S7 zjF9yr1y+$PQ`D1XjLBk9gb!4B0S-I+$f^6gv81Z8@PRITSBdB0-7~h0dYTXPpB@de z$2d70vmF)qjvZ8&W09Q8of^O$o)c}yL(lUk1~P6&o}1xPp#1=dZO~=8HnqIjWeuJ) zx`QLc%ipFRkbmuyq%oYwT~v`bx^1CC^cA6P>MAQ1#h_ly zDAB$VME){<{n+0sc=Yn+rPV(}x#vvaWgpJ#yROT+&Hc7rQEo>%Zd{j`Xm*H+E!aqn5Tdc5s~{T?d^SZOP6! z(s|x!wJELR26Cf)m~jdqqTOCpj*=1hmszI`?WMW*QNWWPQI;}e!4K%g(BL1t(HQA@ z&X&S^Fg6Zjf}6m6IQt&Wl>;8Cw*KoOO1nDns+_k)l;7Q_A<%=N_$ox6ajC@}p8hv( z5do2#nZ7=t2A_hQ5`pRdHCc%ykK zu+d^6B;&RaozRE;?oBAXQejR5fv<_mjqxx?n)VR!KE#))c@;7jqYtZsv_e{(thszI zhSa^(NQIX2>DZ**6{Q+j7l)<7Wc>E#KH)M`OR0$7Ftkp z;clH*O?ggc%H4k84O|5kmXfmsIPU&hFz6zhAwJOdZcp42p0Oc@N+RYT4(a8;QrP%c zlRdX0e!6JvoA5pJ-@MY6oGK(|gx>9SA%~mYtF@~wSa-TX&e9%lis;O3+HosrX0@nM zA$fon8hU3&=P{alwf2}JLZOI>#}YClKqOsLJb>{God*zi37R58S&P?6!vzl|ff^K_3pR!KTn1kwMJ z$VS>MK^w`S?4^EMkjmFpV=O>~TZ8-B>}+#~ z^-MOP=b57hwd#M?ZUfAia7c-4NyG9eXQX3z7qZ?Y*3_G}KtW?=0VmTULT}Qd<~6%* zTXa|lU|(litgPuxY{0yhM1hFV-6k-h%d>LZywDq}oFwT_TrXjC=UHWcwtV1nN8C-9 z?=cQuOm0bbWQjJk8|5R1I5Pv7ad(*uU6^<{_g!YaqY3b; z%h-+`!>uV8iHDM@vf$qOE{_-)%bXH)Jx?`7J!{Jd6?+XZ1cVdW4bfc%cfh}LKh555 zrTIizzwbLTRN5mAAry{X3_blyw0>Te_fNt}VYRfisJ}cyZWok0DeZx~G?&Sdj>ZV9 zu}~l7g^mU86pnPa8(6LsrJFI{?I>-bkN&Q!Ah!+HmJhQrB{$4q_NN={yIc7XB;CvC zwFteK;MPv_`4Z*zz3#U2C+BfUWqIU@Sst-`+XKsPANB@t$xj_^DEGe=jga` z?2`cjZR*u!g#hxBn14)UiAlOTew8;*uoHQ@z@4!7{#zr8 z0ygv4kJpc!rs<{y>5gXfA=Mve0Rrt2j{I$!XGK9Zb-;sKzygY5!9f!`_(lYjn4kE{ z$A6#yA-ppL2=4^ZfOj^~CfLECX-nI@$AKs(J4Xp3kTr`mxIZ9?s29mt&2u z^EK|AuZ&$z=Qv*-F=W`Va11u)*=b_nA`l|%LCQWRQzI3-$KCC5;4sx{!HkB{h&=uD z#vPq+r&}1GMbC^nm(j5&3@?Wpp0UmJ^GnAuiR6 zVOu;LoSU27PN&P|*q+=Iavph>lvgmcn0$f&(7nqCW$Q+7=(+oI#!ZGZD}*r51 zoKWL;+!OFT9uCgU&2FdD<#Oy$i1Wx2heXaJk;q9;BVquoM)UfGUdv)sGY(z2GIqw$ zS-x*8&25<-i!t^x|Dw1USH$k1u|+zci#fudepI&vMqsa*O3`^Vg8kPP6MsGZgno>$ zE88~oPR|o&yTC9fau5OwAun#>y=?j+cuq_j${ztQ z^FLk09We=R65yxbtNgJgDO(&qOj3-l&yCu3fhcoD8YVGjq<^0nQ;j?d%RUe_c*Et{ zhh!!TNcd6mUz&(4AbE&;mP`7nCyFyN^&NA>*;r; z!u$-&9>Dp7_o76pUQY=dqRif91C{&3%!THsMg3#fM}!)AB82bfb5yISW1Vu1j|iQ# zB;}2r9f(v+ObzYKYIcTpU1D_SQQGIWKH&f9Pc_H>tQp-_c|4e!x2i>13?QM0Th-$< zjST|bEG&)l=#MBIeX7D5Y3LegSlu^468x#%xH}w`UeJ9=%;(%YDSqi*6`|zgI9@ty zCM{H>)putD?u+Qr;<`9gN^&m!(JCSh(OZd0O3tMsLY7V?D%8JT;>DzZNaY-%zo4&c zUpp;X)qZ<)M)g4zwl0iFl+n@OqXlac`{3#Ofb(Vuiaj}nRF)ja4YHO0#iO-(d)t-P zkrC0Ze+$I}_*4uQCQoI$=Aiwr4<~gX>&)^V`3;T{6xn_5#(u6J3(e7-i|YLi)JOeD zuv#3Gt+;Q!MxM?d3#u@AX;Fj%;BLBn_^YtWzSi9ns^`f;^hfc##2Z|De=adJi)M zMxP&)?)ho{6vy{G-2v=Ob?n=JYxLQ8igYM+>?Zg|?ymeu2O}2YZ?{d%>O6X$1L%1& zu_UlA-v4ptV9n~RlisCU$j)MIDW+!qTR-{;G~ z5!V&EU~HF+EclWUN1*WP{A3pk-`Ma;8A$ZuF2WjeUR_y^+lqNv3&z-Oob)!qBN_2V zIop`Ym^%wlu!4Ob37_~pVb}6A?pzIXe!v%t7>P;qJEr$LkA9KgqXuVO<_J{H>~S}^ZR zqg=th?^z=(=Z9|&J7$+bq(foqo&gP;6cgmie=LHWbrlT~ZRNhj5w^X@$OJ)~RH1+% zE5}6c%JM>G5R4jzSqMlYfM(s_XL;cDO7sSdVuS*F;|i8Bw6x}I4N!|lzG|(gd$x=9 zLmb9waawMVGB=}(2sjHyn|t0s?0$#cPa|3dcSmLjE<;NpPnH?b@BsGpvrnQBPL&EqWW;xsI=P>JzrdyG#1`TVWGQOaz0W|6JRtN zohw>kL?4^p0nIly-0vtY+&znIwzp1+U)~Y_dog;&X&5mIL8Wldu8n`*a*;5|I z&J)eQ$#;I#Z_8A_)HcdOC(6s3-NuzpAt$f&E=c|AYNi`^^}`!9yO5=AL<8e&(S4Rt zJX&cu`emSS+_ex}0G7d`c=|HN9L#vyaAUJpL#lY?#5x{!PO{BabCOY}Wb8AuT^>X{ zoEsKjKB>K%eTQR*jH2VtGe>d9V+RUwQH5FFvOqb*GL{9NV}f;hUyIr>837R`4qLsx za(tK1i+u#|o;jVrIeMK0tvt_%by>#PIkp@RHpXU;ggEI(J%4v}95%UoDWEY$K$^{M?aePaQvK2_we{0Y|+)C?ym7qw*w`a@refrc*eOF+UuYV5i`Eg z9QOHSb)=Z^oxqb5Ph1p2v?#IqfVD8iT37`1Jc~R4`{5RMDm1QK%oyULc|lLN%}Ga= z`MGT^5(-(9#_o*(HTZbN*bv;NVy-D8oNe3KC(PJfej7FhBx^8q@ezaQX>_BF4icGXD4#vHI}2Z)IWl z3L~LUH!6g2IT_pV zn>TyAXPo5emmJv6Y%*&8T5W-f4q*jWo@&&9CDll`8vR>|AUG?3WqsZOYsr3L;zJ`D zf@ruJ(7@0nYs=l1k##xFa4WLSCVOt(WA><;YbCl(J6B0l&Q0r;&@)3XLMEA~RW`=e zWvIwFoH9*Wo}%n-+w2L<0p0DpGDbyMc%tTTl$r_~vqJTbTL+tPd581FeZT>0v^H}@ zCZj|MPyh$}@C*3Yhh><1@=gkF{qWb^He-YtI1doHQNza999BL|!VD3tS7ouhnK6ri zT)=hW+J=+)1zCxW_vrZ4M?ED_tgPb=GiyS2N7U~EWY~+1dpa@@j#fvmag@N{kT5*% z$ld00^-F5FFmx-AuPL(x1%MP9phW={Z*#Oc zUg&2)q9qe#HqgN2W#D8!%w$k3iy!K3w0V0$nc0QlhnmR~FJxF7e)%QzeJg(n89m$g zQqE(C?{P{*-1k`yy-p1wZ{C@#iNtcE`gax7 z@7UXsd5`C-=BL+L@0OXJQ9@2p#gcXA30#r&yGzz9Y_+c|SS!Y0ZlCz-jtK3#Xs=d` zf$?kQx3CdlZ3W-Q_+A>O$%9krh`boHE~jSA$$T${2B;S!XL&0472O9^;IAP{hnul< zSFTgb?W5(inbEv@0|=L!Pi1GfkNcmbOwA`fkWaE>ZG? z+ZwLh-G^b}nwATtg<=AXRgVI}uWmK(xjwWX!Viu8T?Vh*r^_%?SJc@2HmZJO^vr0p z+zTu_-B{+QX5ZOL15>O1x64Ssy7CtV$rKFmteRc<@sYGC|0R%-)G<>Z;C<$5_N$Sq zz5cJ9_vmG6?Vo^rz8tLot?Rgc(XLr$XDW=&uZ>Wcy(LZa@VWs&7GIV`#AN^^LV;g4~Zw(>#NwA&V2%R6tKg&O~EZthWZyp zTyRIVfn(u8oeT=qINoe@`B+apYXd3GEsCAZzOfy(Cj0F$12W>8(2sln!`H#j%xa8V zc~8cz5z%TskSaf{W0(PmmQO?WEy^tCufjoTDb5i|$qX?GhgU@_2X|q)1Jue4LIgKj zhwDS#H6cf)XUyg&H8?)iIgvNxfLWMGt83qxraR`Kp!UA`i2~|3RP}mAXsb~#PulQA zt@b=lMZq1ZD<9GcS(8aW3cTko8xKUGOxEljdB2l2zYryDN+$o(V1m)0IAPu&M*GRJ zAsu(M^2PZXU*8^smLJP`xvK@gwE|Ys!CsUw;x91e7$x!XHww zAbQ&1`aN&ppOpr>0l~9!A`xK-I}N2KNbSTZfR)U8QZh$kuqcGE!Oi$Rl!Bz zVNiA;ij9+oD3qSn;5o(O;E?(-cBA6S7aYiON!39DrBMu7g9SvYY3h3^^y97=f2z1R zQ4dLNyWp%S&9zS&^27UB9xOU(2<iLsASW*U)( zCe-)1DwHZ>)>}tjgQ_g zw^DVp_EJM&a@+Uino1`{u;h?sVvdB9v~s(rE^8rNOjHAnzYf(RyNrDduf) zx=TdJayvwER;E2?szBNxM`&jGJ)9v^aF#1=vWXIVX!P{tknwqE#Lmx%8ocpaqa4+9 zXmx;~GUwDfxQ~RN>-2Qgkl!d3ZU_wh)p8-Yf?X{)nh(4Edd_1}{8@lQ);W0lKlI2! zCoaf7#0`l<;jNCT_Q(hZ4K9NxFmn7xxMLkIN%tJ7ZjaQ{hjDi^F4)4*g@o9us+;wx zcXrww^G=R@2dN%I_90J(x`;gUkT$g6UAM?>c=K(1-zjVsEcIkWR!e7Qhv>5J1E!As zO#Nx_e@C@WkjK-nLH@Q3es0E+v&w?0fI&H|;tvN5eaGjvB0OW98UtvHBfXWH0`bJR z!_n+TcW8%%0)^ah(t1d>6I*5u%cVk3w$yMG)H@^Om|8{==CDW^w^M}1A$we%n}sa1 z$Y;K1^2OQn>Kz;$r{1xexpE)0*<1Gpi)Us>iDaOD?8jo?$3%GsZ;DqROTg8juV$`) zW<0w;*VGjzAHkcSl%ncOG@Utx9Z-^8O=5#QH2QLDw%vj>$7bH` zctYsBElTw?(bISN_7S?)MNG5X?U3rW2PTN}cArKVYaw=s5~;A>%-z|}xu z4VS-or$yEr4H_kWruaP<2s9b5(p9&bkk zI5;_OZk!+Nb_xh0>vS>*AeW=!%&CB#2CX7Ro4c4!+==6)3$IsbX5?yd3q*)rQ;NA- z6v|O%2PYkEPE$PIu--`rlfT*#v)xR7{RBzA95FIn@T9q#A@caH-NXFW!Pt`#?U{&6 zYt%^US+zX!A3Hr?P{;=WCxW*y!#$*`csJMxfeHQ5rfTw&4J`Np*Z;c37Op5~{Ohpj zzQeYCn_eV^K}$-~O7b{aFq0v?2YmpD3tV{03@buO3kf&@41(kD^a1vE-szdGp3na5 zEiApLNr#9|`g;QBjA8xG?LkETn#GLCpDi7+!#ZN8isM0pkzLEJ946|CpRt%4jP_l# zCLD~oqfWWOh&&d^bM5QrwrDF+Z@Zl|HPG08?S;-3J-1kJQoB}wy8-;b41Yw$pGUKN zLhGz7qEGN0_3R2%lH<>Qm}!Zi<%1pjPH);BBE1Ps=-Xbg<)M+#o76;?dehWqJs2~M z=RK?pp}~YO^1S}A~XQ70ol`B|kgWoUc^BlPG%<=;X z=)Qmg+KM+7q|c`oV`Hl@+2+Gw!gx&0Wn(8$VGGU8$$8PtxUkKesv;faHso9cz(wv) z5i(%tV(4P%V(4P%V(4P%V(236E!sfT(?`c#d44jdXDW<`JMj``_lbR(%~~|K-9c-6 z$LHH`-me2|N0Mv8>JI5hj~Zj%?%CsB!1cPe#>UpBOUa92E8jnw~ADeCrrr^dHKYx8h!cDkI-j=n>u$9dFy zy4Ji#I8R)EvJ`UbaorB1)ftjsF*en9gp4_V9xX=8kA9w^lLFJjh zg3U(?^F9D{+{nCJEH&t0g##^yGNe%vQklJ2nC-(|xohK|bhpAiua7)Ir}-`v?jm+k zgL=BI&c_QbCV(h54ODS5a}{~Ww!D5>dVSk!FMHB5GMUxwa?(p!;ai?+%wl3@{U>L^ z6Yhvx;fH3VZw=r`hjFE|qBM)-q;J8kHofJ@8oJE`Ys;{uRmU?7>V|E(03A;Sb|Sr_5%&Z}U`5Q#rsQqEVi9hG!X@-j+Gse;kF%t*uy7W&4gU6G z3(tQ0OsiR1;HWjv%cD5iZu>m=VTqKhD|L7o^Uw)PKg+g!3qQmxf~^6~zTf(O{y& z?iW5mPPNZNg$SD9Nn6UAt2yk(yc=kCCk{^Nk>ZK`WDpwYHEVBNi$rx{NQS(l6?Q?q#k1c~iJ5Lttri=|+35wl4Q4d_{WD8QDXQ*_}#zGIgG z2F+c>1>NZouG!$xG+1Ow!jQ@omW_&_3Cp3F9kq=YYKCE4>?rC(_J`x!AADprWAccU zyG8IY^4L$dJu;Azy@%~G#?zvnw0;;w4f~*K*EYIKDzH$1(|8*CwJi@s3lG7IKuJJ( zyZ?mlQiDSyW)(lBUeE6ZAGi+#IDa6xaZ|UEQW73yfdY8I{Q`HpmDcVIa2i1DJJ*A9 z$8a^nNu%6Vwma;}eIMBo_Yp3=aa|2XXo?UPAqS>HS}+Aeywwwt?q$qJLBlpKQSPuj z_xW5Y>`7Uf&uRG42;n3bAAHJ;22GP0;u!_wOEQm6x(9qX^t&5b_p+{4avja58-{VXJb!z0b8BmB(}s<0 zZS8thQ%g%@!)DEz8fs9ZCQTYNG&E?=oH1jjOc@*}L*~BE&c=)pBPL838fX9m=F1nS zmz#KtY{t0e<>sYAowzt)_QFP~@*<3;M!gjAzY!vZk(i$}^I+qB*76ToSdDKlGBosl9e7QIAyJHAA|p@ct!;!&kJ&zh6yT_A5+7M z$Qj5GX+F&6UM8}9fXqn+a*Z}i7YX*=6)}*I<$F7&uY-`FCoHw>G7BMgbvVwtcltRSXB^h&d0 za1~}Yng?;;7uxqEc8|?~4JUZ4N z>GNVz6->04-OL!L5q;H?CyU0O#bDOrmM}nBmIXHQiZ|Lt82kXU2OfF)0Pf3U60%qE z22M1`Pcn`*VX0zXp~XqpK(4`t!~hcH@&Z=YAr{<0ZR)4ExN^5x&(nkcd`ogXDWtTP z7vd-4CkV~!RfST}uyGA6A58K=I0zfNc{Z%kO1%1mmjI3cD!+yLF>4tJPizk8UfF@D z$>OZoqo)oz%WvpIbc}z;HM;2Qqc1=I#HoW|#GbY4EQ>YE)jaXRvJcCceOgK}QSnH1 z(t?*H={+eZ9J@7pZr=7vpm(m+6+_?L)A7CX4RudP-g$7IeA-K>JzE>i?2(?1T6zNh zLmB`T5|w(?LdqA^z6hfp29ca@(8x)r@smR&Hi$GG!m)f+h&d;2m7Ob8a$aj*74 zel8F4HM{j5gFuA{0;%6LCh`dwqiNOV)iNtZ4O+?>F8z0S4ygJ-#r@DPxaAFk`a$!j4_8cDJjDmI2JCt zjer^N$afeRyD31`)&Jt>WX$c_6< zvjYW_a{uj|Ly$~HJi>kE7JPN{#XShXoD@L?oFq|q=CON7$Z2M;%i1QR!t#1$acnQE z40p}BRdZqsaZ-`l-GIP49`mJw@bPSplEe8YQpYjeQrfmiEpt!-PG~7_h@8TApgV`UVS6&$JTBfQuE+ ze&QGlzS2a)0`un%#?-^2XIk?hsppN6CQvO`OEl;b)CxYQPLlFrWj~yaN-3^$hsc$H zzoeWE4g%pP0a>^f$T=~{tzz~y>}o7>2&WWyQql%&4zr_JDgXyZPHSEn5M$Z0lEq3E zD_N{$p^bDMwaZGDrXYN0*4b%WQ#I2yYt+=zh-g1vO;(ak=%l=1lb%RJLGb1%J({dK zKzSLzer_1e4?Qcwn%%!qgHQ<)KICd*_9(K3S*IsV4f;8x!YbDhYyiM_GxeCmUr|f6 z$-49VY@YV0FSSHe8yl(v@-0*vf(zp+QmRO)BBhEH7*SQEfRLla8%ZzXz}b^&R;eOI ziuV#ksYCq`SH(cPr-$+sjY2~+>RB!n5bC6wW-mGo#n&=yek^5u_>MdGb3)fe(Gag5%-DrOH zd-#-pCiH0#0#~cmY7B98`MNG#t;Y7wjfN#iM%hf8af`Tvp#=Gvo^RufFgb)g9_wNf zlKX3(;`8--t&}QKcDob(D)dr>K3qje_mgoBv(ElFM&D&8Mar&MrOFNo_3~p5lsFwg zq5g0odirE()3Zv?C_PYi^{0x}F@&ni2qkf0{vRMFo6lk_)%tjpSg3!^3ZxO-P0tf=S7Z(s!lfopB}t#zQ?ExR=8?8)>`qYjv~|6#LLn zM;;boc3=>Cg?ys+E@I3=+O{?7^?XX-@MuK6xu6*2>D7o3@lSQ^ae7N- zyhAHR3_#DvIx^F7tjL>WNK^@6xMlZdaAB;1h7NX8re*;A z!wzU+0eOuvX(YzOa0?~SBnR@84)_6*Rp2vrvh%#LBr-AV@$3lNpVdsd%rjzo^%NWm z7KL(l4542n=s`mi(O6s%b_BqRrjn)*DegDc#e=wZtZk8Qu`wDMJ3Dn;Wg|ev;c#$p zVIZvVkj8}z7cN}5aN$CU(n!yZK~od@o(_xWx^p!n-AL!a>^nSA-oF7cZA7A7&rwg$ z(EGAYUaVhGsZ|5grG1gn*9Zr{HUp8(sqQTisMaa4_G*t+~khK_IN>&lZSLQ1_ zPF|5=LMNClhhjOyGxi};zb1S~M^t~pJ5QMKP7@`(vxJX#`jGHW5+l5Ggb42x z;qy+Pin+xwZl8c+6hB5IjBmo&uokYMpfhazqV_>VMNrE8WQ!;}{ejWGJZ*XxV*i_7 zcXoQc-Vl5WbaCHwKz#ZI6d~^miQR6_05A#o1>7NTO=E~`vEfj$)X9~MefE|U6_I4gVX3nETNZmJl(>osf zZSXRBX6~C?#u+t#IHb|{!sNJPD2^;GgLY5o9dWYz^L#dL08l1(tCmy;pdqmqve#%Y zCvb)NftI_&MSuH|Z=>4>8EqiU$S*FtcPTZKptGcULJ^xeqL#CUxQpi0f5S5rD9?Zc zdxF0-;2(}{&54%0FjMb@^a;<$wbjzXKzosG=gP4e4SQ>^zyqJoa6rno2aLUP3iTk6 zk3Ai05b+n-|LF4$!8juj{bVk&OP1f7vK5b$vYF-`1REekpQ`~3E?IK;Fu)86+@6lF zY}GJo*3ulP+1?}~ctkZ>KCFi4oxi8s^I#!RBa0Q+!Vf<9?)=ODtX+!c}5bj!)uGQVZ#~dgRf@7L!X=XI^Hm|TQ)&jA@rQo;V9#& zsbK18%#`43<=-P}FiWE#oqHv4QEtgPX$CIgCT7(Z!4@b<*pi+r(rKc8y03?|Zc-T+ zyHj%;7=MoFo|TA_gW)x8w2cbf@RB4S8OWrip+V#hHZP)m+V2QsS&?V)Ol4OSv1o#B$uJ0gw)TXg%;va-B>=cWi&}NRK2<;3Wx-* zv;lCcfJo19s04p0hP7fx6l6an{^^2mh&ttYMZiIDNoyNIoG^kcKE^M`XPPfU0BEu1 zhfkPg%+C*eIvWeipbfZ8p=hGo&)Mk1=0|6IL0X?(YhiBrW$0jBq3HwwY6#x+G(__L z7#jjdlU0hSz(Mz}>7PL(q4XCqmp3<3cmhiF&lF4oG&Yr|K zCV0IX6G7l-O@w++m{zHCfJG??jl=_{M^DWor%R?!d?Pbk(gzi0=9q9P+T|0Eg{4AP z+2%N!O9^1D*@^EUy4zvdONB3?9fh=sywFh*NG9DW4f1(()=oBHYByYv99 z#{_ONv@9l%8cH##V4N7Ms7fG@278f=a?`C<#e@*|l=m_}vDg@t+9#}7@SmVBukbyy za7yV%Xu|6!jW_5+AuTAHzxq;s{gCCNU+pV;P=Js9+{w`tC6Jtj5K@m|vc;X7UGOZF zbf#TL&ar#u`!v8UQREuTt5jA&|EFb=5?V+G79Wu7ysc@(iFW(jy1$vXJTOib!nIxP z;aOO<%i_B^f*Di*4cv;LE-|1S%ju+LjX-*BGmr$>KVYQx*aR)-s%;YJZ)8AQj=$#Y z3SypKh++~HzrxN00}DLVWBOQ(=iPU@|9XaMfvAF#b`5=ydEf&OpYUhJPg=t7194JbmLKeW9Zzvif zinQnv2e}rk)~5bR8=cSjeV|O>j_yzTN6i$W?ilqdd>Al!wk1kg?zrKlfe;Q4m(gi4 zm#=BUp*bNtm$FXiz}$i$3psQv6RuHT;a|D}oyPHXc>M7(4V6Ec?Q~W)6Ah_-TchUz zl6^&t=KB~QnLQD-zfO&?PxvRWi7f^(dtdYp!1+^^Noc@rXN!ko(+;H&2kuzm{{aoV zHMmFL3J#3Xx?oI*B?3b3ZxuTUo|?H=IKRT&Mv%4B58p)OQRl$Q^M2X*ZTygup|*jR zV%(Q(hgIDAW~VKY%&`Ypv4y(B*9orXFG$z>Pa!@oIwNR?&kdhrP}g+goO{&jKkc`2 zd-_Q$Ew|m;H{hu6et+91AJ@SYpDoNf|7I67AR+(G$l%J>`BjAPIDAB)S*ab@=&2L7 zus$))F;_n0E!NmRAXH&`rd7d*r=ef1Si-NgsXNR;%bFqR!|>TtT3VW;Xhq0oW)OW% zP%PZyfJG?~w%_0L5`@#vjv1E8L5sJK=Y2+(D%y4jMM}dwfo_Nce@OQk77Y*E z%|MAi%(yMx_S1N+6vA`Zx8;Ijuhx_VQk;|p{8XjTGjV;|Wb8^tv#*r8b_keknyZB*Bqg|x;9>?ZD+G2FTOwzcXq>R{pC=IXPBfPGQ@U-Sf5`)T z<eRgT8?)*cnH-mvcnZIj4+EZ#Gy0sheH0M3^N&%;t!L#*BbtXWMRfZ z)^ZD}HPrYJ9nQS(iA>wu&NtRH#F@)uuxGsG>a1O(;JP9NRN)i}Wxv3L9aY#>p|gTq z5gg3}2VoY-!eEgDB*Fo4rT86ywC;c^Yppt`<-lW5uF)ZDw=8MN8!an0(QrYOyF-mF z?*prI5mMO@8s}!=t|9FO%yRT1Iz(t^+lNH+=AH_ct6NkWCjCScg+(-sgwWyqzLf+A z6vNnnLJn66@L%{}_2{?r%47hm!(t!gcZ(U$`w(Afu8Mr+15WU>t#q9ySP?K&X2TSk zqm(eoT&QDGWLez5754{sTB0m>%(bl{ky6t@cW9j@@I32ca^=~hNkg zhT*u#Hy;j*7qF=mhf*#HLx+8(h#W^?PK~%RF$q1Ez7!R#a3YFSs{%{hl7rodFS0sj zPq>4thA&(lv1AQ12i`*QViX0HepabJmws@b``2d9YeDT!7V^O8_8lrRAacQ?>48u@ zk_-OFFJwz}wT?5xCJ7-NT@DS3Gg-a6nG% zc#7Z-Rjk>YEQBm%6XxWtzJ3FeOiAi&2rbB3r)=#QSse3eaZT`W(#UdAHR5Hi@ zVrNOCss%McBl$+1j6Aa`I@kYk!g7l2jHCL%0nADidvSDTAlh*z;D-35<1YRA*0BT2 zVQSY%FyRS{+}BUvGbq=XCt_l~OoJ_c#(9*mFvrf(q^M^5LCNtPkZMyUi`5h9$z>Tw zwMuu0PFpoxCOT-!hJPM9ruF`fmj6*r(?jhyDZJdu?Rh=H+qvKp;we(q{1%3K<+&H% zWVkzzACt8?xf;`WBuXM#SIXkrtp}Ww-rx%Rf@7umS1^tfuS@V;0yhT7!Zl1A{4Uo5 zE_9_*>}+kr;l;>Sjw*T*p1+%STb-40**O zd4Me9y*CjavEr;6-OOP$Jp0D1K7o$JG4c2Q#ChH4|XcPNsaFb;5q#duL8$t!*Y z+aEqh3aRW<+0{)_BDpStbSTu8`F*SE=ZHVbTF1pvA1A_SuUAp}J}%3W9UhevjykY0 zvFfeCtbf}R^htsolXedbBh^xs8y1qCOX(#icbz{0jhpWY^fGH7+l-C1==>a~l>|pt z^d-ty+iIkePZGROyt>w$&G=-^IA}tKF3jkqeHNif)VeZyVc^_BgUND2hT>P)YLe1A zN8OQjj*B9Y0F*Xfg^GL*@)1JMyIWXeSj85qrPK=Gg)oJVxG7-g z{H%7$f~LoN2Mly^d?U%_e3lwqHv4ojb<7QBF{s$fO1_?3@TsfZ@QLv7N$=g=e*c;& z{X?RVzI0X~1MWiB#xV?THwq|2hG@@MU}Kb}^wG8RBYq@1$5LjnxCOdelyDvvPL$l> zwi`KiQ;!I(Ph$|P2sXhnN{|$B>g4i&Cf!J)d|6V^gNf)z~l~-1$ zN|CuHiL~A>ZPcGD83~Y24v`S>yXZrFA`QqcPt;ES^AtgAVo?9Gq1fYSA?iagyxu`@ z@~1sdV9q2nSicGo1Dy1EI$^H{9v}t-0SmjhATbNFtU&lZ;={T#w*|XBj=!dxtCcu) zWt(2|`9AaawBSS(lvdzg9RXLlYd6e=*gki)=%as9N%ZNKqiZ=KEgomG&yKwezNrm} z9KpGns5T5BLI+9T$3c|f>sG4e2-R*N4yX~wv`Gb74XAD*-Q`ie6Gf|T3^IeU@!auB ziKcLF3^W4>9ETHPR`!l>;Ek4ruaOWN+q%xMuHsj(it18=xfO~E!@$VJ^HWsn*@frj zBz)JuQfLA4C`8{FQ$sH+(HKu zA7=U%bw(Wsm|))l4|0tu)aoEKw74FwZ7L)7)9E9Schr1 zGNA0-KK;9(c~De|yA{$vlFSz;S&8$^d)vR=`7{bQ;q$n2>liFQ4oYLL3`UM4c$c!Q0%y z`Xh2(fkE!T(sv)~_Ctch*zkv7wVr204jNXWj(0-%k_Zh)(G9U#@dyzeFEY@CImx@K}k}PNG z0)2Ix0)0hE8<( zk^f`d;;%%ZFm?6y1huc=~El~HNyZShvu-fKgL}p<)JT?eJ!<0;5 zgqfxSw~wJPU~BjqSiY_5WJrp;U5p&rr+H7A0pasv{x(PWwNH{iVV$i6I&k$fLiDuL@rbh=rDF4r%Le>noB;e6K?;3z(u8=d z2Z;D%5wQc$Hjo4R1&|*&uu9zDw2rzcGBmVi)8&tC=F1IIlmy(YH8XMH2bn{>8Kk(r zFmlf+E)tBFl)d8ms`ui-&++&2a9TNC~EsGDdAg zS>wI(^IM!!)LiVn79A8QGswA6yf)70N4c7JM!L=z-uhswmJxO}|sRMppCxi%1v0r-i&e&gilx}aCqb>a(Wq!weJ1we6$(GHEJ zbD%D#^h)%ACyPAQMCF!=GYo^%eSqaP&R7xe$5a+cnheGp_8(K24|^A=B8~YN!y=Ur zO>ML@?4y3AfhQfo{6C^fd`>XIp6gozC>g+qZmG|Nlk9`~O$rT*`0Aj3I)Q|}SRcqC z$^t&545Hrnou_zMz*+XAz9fK}U3|g+e-f9ehSXQ28pclBA3Bo~5lr>%)s;r$t{HFj zT&n&ZKI4bovC}mm1k}~ab>=~7RL8!t?`QMG9{Aq#V|iLvu-85fP0YJ{BtoY?w~tLgkRjRnu*0i zlff2>Bn1^Z5-^LYp>vBYeVgB<(8zM);yK-fkm)}nE##>*$3o7?V8^;I{o z=_=s>@#HKdGXaflt0qg|IvmT~5op3Q&BE+Sw{U#Z_z5x^^Te~9V@!pGN=w7^33DVM z6H2D!tiXB@vKOSu1}nn-H!_2;Oi3{yXQNepbha#zF zfqicVYo#jK>6o2Zfbg2+NRWYHP|B>XpaxP=RyL^2qrbb4n)BKr@Ibw;Mc|wdvK^ zS_WJRK0+f_G!Mg4^3cRtKw?9Gvx`;3$vn-{^+C4#v$IRgdhP!KV&;Eq-59pXY0q%4 z2j-AALBf?K6LkB4z!8X>8yRwFWcF}6{VsfBLm{k<7tbo||11`F)VyWttl8eVrvUUjaU{ zXrFLZ*!`9t#!ow#BiHEPxGp|3Og<_ocwbBLjub}%EYD?&s51&|tGvRy4-QZw68-Ef z2s1^QHA?4~D7)m=juco_!91oNXz|Ftu1v)|{j38}PGT+FxD-wU7cv4TS2^gW>+^l~ zya8(sg^Mo@wq|_q;YCXzUcsTw73l{qVni{m2;0@c^_tX7cnW){thBEX7i?4q#Lq84 z6wKc@qIG!-Fh+O41s_Uw++n%9Sk<%&1KzF&Y2$+M?I7=A6`b(U=aDF~&q|&8W4_<_ zA)?!S)6@&Y;Bme?ENSFSh+3zO^z0vPCVClDa1@45If$}TBe^lnWxF$w-!^1C2Jj<6UnHz9%E7`kcS>jxF&TWQJ7#5(FO#+R0^05r|)v^ScGPiKjmhHMYF2?>%EcBR0TBDUZ3`C<5TuD)P zDs+eQg*C?JDl^?E=t?+t?vF}yvwv)^TLRn4oL|g*W|B(}kb2hlG%-Ba17o7=hjlf+ z6Nv0PuJW;IJ~#3vg#FbS;4q-erGR!cEsd@KPiE&k<)nw?lIR5AtQ#l#y_sT@<&@u# z{Asn~z_qRjX2>+oxUN(BPKI-f+>H4&4he;-*SzWSS_~|#e~;j8az;abdzmz+;cHZZ zNi&+{xIhTHDVYQTZ#rz{Dfm3g=)n}L;9yj%zt*0;(lTM;Vo-@yxHYB zuS7U(JoNFbdVyT+4dC=_MX@Z{v2Umg&%C8Ts;`qyI4`;CiSCuP7EB>I&kOxb3nDl7 zrW#BD_)9a(oN#HYo))q}lzCfP;L1D?$pb#rL18Uln=1j)9%|?MOrlu+s90RP-#)*z z$x5f0dW}z%^xFTu4I>mic*)I)gN-_Gl}I8OJ746_=R)UQrORm3n*N8)tZ+>h*F57|)Hnp!Fw$$sur zDKjnO0-vO}iFv2jroB(;B+wU~e}wXgG{s!p5DiOa#;Km%=H zKL!@yU6v8@0vzk3vvSQwgK|n@sr&qJ6u{Rueh;y`3dSGW0r=5aphN!9!1j3#u80tP z*{Yc#)x%-UHPxQvxurO@-A09&R$u&}zgLaiR6Njk|K$ccKh)eG#bmG1egY850VRL2 zg1hFx^obz(ndj!6!oWB`mYvLx*N{9&%OJCWuHpJ0F?zd%bK<37+pNHII4@I$ua7xE zixqR2L#_K7azK0Aj2JzElC4A1s(lvs=fFIoJglw%;f zTmsl(&}%dk_DC4_8VU^|OtWj_BXJ#F2tj4+$ZD1@66^To;W_Q{V@2D-fsIVz=xHg{ zZ69v2MNJ%rsoK*+awz_+`yIJlp;y9%!rxw12O*%PBWJ!v(Zh08*5-Bog@_StN@(dV z;^`7Y{esJI!m?>!t5EdZ|09kl8^z&e!&2Xx3$rd5K!o0D^To9E^><^vhR=s^&?B_| zxG@6odXdt))QBg3X2_LkEw`1~9>IYk=e@3F!kyPmj5)zS2{9O(4w&XqsUgo?h#V#J zTIPci>m=qTF-qW z64OT_rA*%A!6H*=BY&GI1=*h+ln-6_0U-xWMnS(wY3p%b7}NVKg3b2Eu!_KQXm(P( zW<{LqLN<#MoL|+JgmuDSzhWd>?K(=Mv^9Ab58>P^8d9&By`^(s8@rE5!z`|0A=F=q z<4oW!$*cHOd5S{1m}a$w;YyPML7^pLcXWQ6NbaIIb37kRKqptQ+jKXRD3J)8g8sa6 zosOXP9qy7N07GkzDfzt0Y2C=zisruAxgQ!92fnA>e*1PHdFnfl0%>F~+$Y+>V<@^K!KlI z*iyjVOEXQJf;#H0pcE;{;F2uL3Z?}u=a3-z)JxRj0g-*8d-@zM_+F-b(I0 zV<`MTK+nEwjM?LRYg0N;Q67%+uOnrV!KQ7)U@`3$^D1!}&s;`u_S#igTH{{I2mT7X zx&LmGlJQrjs^h}niI^`DRbjb@956jSc8w6ygIf;>V4_d0`B%#LD>xHQgLXQ!>c+QyC$*2QcV)GOQI_F4)}^NHai*;Ftf6 zq~G+`W03g6FOSs5ug%#nnDB@0>^H0|?_|&ovThA|gu~`6={$|&V)>6}@S6^zlMTzb zU~B}3Hwl|+SNp6%rv$EVdGe@OCj-ZG&^mv}<+22mheVoVva)C#Ez6`<%^sGZhIaVm z_8@6=3dUkRAV=7ugn@%$_5u7L1K7kn4#H zuL0h(wnNCd(ygu%(#^~4q-5WEon7U60T`{bJ;o`wqcbexQHpeqvVrkDWMUB7;(kJt zaiWig=s=K52;w7q5lC+t=t7%QSa#)9HuMGRc3>_b42djePH^eR#L9=BRl}55>su0B zI7qm*VNt|(1vo4|cJQ*!x7qX##?+6m_U`HL2~?clz2A5nvQ5nk{$u+V+PKj>w~g0Vcn_6(2-GV$W&W+W`boD2!jQ1jgyE) z?6eL=J+yS%qdJ>L+Z{^a`BoYXCp>-H>ykcmReeuaqt&zxVC-1c!OPD!S6vee;^F%c z*QI{EjF`yN{rbU=3fJt6Ut@9+-{_Cp9SM1Jd$fCpfMGnHrYMP|DH>(TxDA+t^>|Ue zgghwqB0_aTF*h-!So}oIHeu&Hr12o-a_A_3Q#|RYLU0BJi0{SIO2?!Jd7y!CHEBK7 z^}TfpKS1VxT)5I%wgUfC!@uMG|M3Y%_2RyT3TS2}^LGQ48B%gQj z`b_Jw!INcmxYFm^t_eIVAiZuAj*1a2c3UG13|e%YOw;(Fe3)@NEB@n2WYofrNCNNI zn;?cwfS!`Jz!8YqwVXut{80zW(r}B$@W(hK$C*}!=R}n0=a1K=f~>3g(7SM7V3$Z6 zwPb){%eqgSt-yFc1_?*|qJcsZrIB*_Bhq51!vVPy583P42#I#oIuPQ-XEdyVSvtbE zVKKcIv)19&tRAf!c&0vEp4G478$!_hsIFfIjaC6nn4QvnE59XSY^{>Y_m&_U`=iNm zBi}3H&1V~jf_ARLGw>V7CLhR?_i`QF*EwwZ2&=77-#{Fr=8{80%}lS6zMRcnhr=QM zMQ8gVPbcg;BNF5QV=U=mjv;AdQSKN3Ba(g|~#R@YBfXYh1 zg=C7W<=1wNWsI=c5g7X2VH?K=xPuX`%c%JoCOobjZOk39%vY)s3^RIp)g*kLgUHccZ5S}GJK_Vo0gBhS6vmP6F zXn-BsJQ!Hs(w_hTXZ!0<%ek>>cn-Eyb#saUgaxslyNK(-V2*or#&kRk5ni!TQT(hN z+lcCr!s`UpN{g0wU@McK*jLscRu`xT24bj^{=hsfGRO9-uJ`7Ox!2dS0B`CAqZ-k) z!KW!1Mno`Z90nvSR64!dgE*7V{CbpA#~0Fhb5{_RJT9Ap<}+M~hOFsg{o-Id9%u2g zm0_ZPX@69JLD>2RtJIz_Oh2XIEgVr8scY<&xw(>l#av>Hf;m}hqM^4i3(4EnApp1)3jz?o@S68F8ZXcOD0T$M5t z!x7=cjj0oWJ@LdmcsSy&wTkvx5PZOp%Fd=j2ZslMG0vjVR;k73=bv*0f@5R=TUYZI z(V)aPno`?jVKi)poY7pz-QU!yO!f(@x@H7TMIo}7Ab_FF?Ega#NDhZw&F2uY;=V0L z(Vf%?tFNbda4*8Y7Af$Ryc-xji25iL00*Ex^$>YP2B1mHMMUtAT-g;(NefZp!9fZ@ zVwJ-v(aeE5NQEV?3e3efh{%2y{HOntTHAdE8Q)b-GJmBfJmHQktG&n%|av`0LF z8a1T^AWW2V`?S@uDj4N_Y2bzG7w)|w1wIZiU-6~=fuW?UIiKx_n#zl$b6M^Qx`6vc zG(qn$-3%nj+r@ij(XuipxO?D`+bsY97r)3}s*0%n1`kwu>*>4wXqcV?Zfo(@tA_gn zD+6Ay3oFPDVlf}_8%=6h#i#2qkegbg-Dy^~EcGkg`u78&}0zwIw^5d)jzcIQ^lz z!kra?pGDfqJT4CoE0-qNR6Lw;Tqm3`Vm)yCV1C{Wv!~0QxO;|jP6XPu7=XWF!)n#d z;@mN)7hX(i=0cPhLq~w#ox|bQe|!MIVr2nCd&DpwARc?Heg|>P?6mOvakb4+`u$pN zwDiD=#)1{DXW~ycg8Y%9CTBb+2%e!l(rsYL+NiS%_h~FdfzxTO z%757uLLLr{DtM6Ph@Kk=`9IMda%8vW&)Fp#@A629?-}U>g+y@GkNGcj_Zs(7ag#cBqiVLC7*j{ zul|SMU+#F4L^=D+K3rB~Ml$mtxyTANr44=*!E>aq@K&9eIUe@@)69m5Zf?pxvUy*I zprc;e4C_5>?37b@8WG!fPR;C^ObX~^1wOqBY`nvY<`(&C^>T~i!c`KK^HD`|j`aGD z^Qcl37$m5_>++vliCfX3!p-IB$9-pgNXN*reokE;&Ld~}j?KZaCHL+dye7~Fc`7dK z?LcsQ?D2T)?k*AloH4C@$NoA$*q8gyz7iBHke0^2Pet{X{?Mbate>VtLI13ccmnqM zTEnw$=3^vlH34C0N%)%AAd!q2#zZ7>4py12ES~)`Uf4t>{7^8{UN(mYW0=zIfY~iR z#hE!QcQNNjMQ4K|02Haabxi6&>zm$KceSQGBwO3B&Rgtu1CusE9T7=QG7hC@gIJdy zN1!mt;Tdy#{&*j${Ez40-YzypKv;u#Z5M$i2$k@TX8Kp7(okRsq-mt`^H%&+rwH}h z3WgySKO8<_$K9a2M1tFAKxv9Hi|s-aHg5Es;zS;>!{!SX#+rwK%_{Bjdlqy{OE ze)|FWegw-7sE_pYtgow7Gn!C9-S9dOOTFm;Mt_rGPqyGC`pTI2(6(w^YFEuBJ!-nK zN95ulgCgRjHi6kRH^Zj|dbyEUsF6pmCMl5>+KrBQhXvUGl>VtxRU6|EUStsMu_93z zI&gV#s#uA0F5@C1u#DGBlTl>cN=HW()nit;5mCF&G$_@M2WdqTg^`%0*jp)p zlwP%OozEp?B(U`qNp&MP=>kf;?>3EcgdhDET&3v!_s}i~ej8~}YXCCaj7n-$T2tc$u=?q<>h-OT_Ec%p> zg<-lJp4`HvmNWVlT+Z3VF0`4@G0Mq(lUR+nq-xn9Z=$%ZILV>~MTgrnoSf+#dTecY zcthh|u{s#*-m$VPc6^jI%B=IEs6NbkZ^i3juE|BQrDN<^bpq61CR_6B20|MKtk|{S zkt){y@7~06>7NZOPOu7s`OupaxIEar(NmX3Hm9X%*6MNh$z9=3NI)1nOC>rPP^h!V zsOWl+p3>zCUsN?%z`Zd4QHK_xkB0^L=*CqIQ^ zinrxe`k{}5Z_oKz#WHrUILZi}-A8PTmXw z3yDkG1BCV{pU3~b?fGZ2d-BrV>_1sV!XwsMWE}sEiYD(-HI@~6qT3BXZEPcr(hDn{ zfY4gv#s#KK^E@QeJbUDbjMiG?N}qd-Y^-!;`U42|;a!o?8EZf_Z@i7H_1cP8T@w3B zB#pDuFFMVrT@>Lp*pfw5%Ge(nN3l_KqXE_BdGN24r^Rp0Q+^tsNlv^RCHJTyPgugm zofC8Qy1Fx+A*hX^3!{T)hN_DaQdKp-t%_6;v<#7Trv3UPrPpRH&zS$v zHR<8&GfI*a{EGVCkc%;tK@6C84~on>yPAlq6#O7Lo39&VQ8KWYY~`d%1I2&oi?7Hw z&H^0k1e3?%I7s-OabQiHmy)I?NVSEHVzx*cfSfS8Nulqpcn5~dK@CkPjGpWE!G1hR z44ee4tG&Rwx4V18m5p-gUSv9E>Tb;V)|^KSc)zfHTdJt%a{zC{J$47L^^9fGSj7Ln zqT!Xue-bUmPT>5i9+&5mt5-8MM$6O45rCK15|O{Tygsoi^g}=hKuZAAxF4kG&v9tU zl*U>y3Ji}i^liLpc3vZoRP>uzDSuj4A;4FqnCaCGH0j&5qv<@;pG~#q>zT;F7L@5Y zPhsFCTVdI!tdyZ}woA)d0o$(vnt$;NnAI`k*uH?Ef1EMv@SZ5GiG{}phTwUA6_~;U z*NG68mE#^Fjd=V}IzvS)YXbmz%MSFIgOeHt?#9kb*yolp4zMtwU~Rx}{fhpd+Cyp} z89l$qVxHQv$@IML4;-znh5*FGnl>>Wz@>@Q1WJ_|$T2rxhor>PFowpM&`a&|uql6Z zq6PxlqBM6@!fq_Wd!+VvMu!x6r{iGz6GZQAr* zB?9{k$%wIZvV#Vgn3eGAbNreC(}a7~#2+j$8q{9=)-elzp6^I8iaNx*J z8H0i>F5+b#^__x2M$9%zkaT`-)^(F$iHFYFdDuvaFgg0=*7P$tmc8DNWQc)~2R|FA zkoi`3eLd$Y(YqW0p7C2vnuJvT!3k4x9r!U0eApI8jcp-CnG5e1c+5jB$F${~Dj>2N zW^9p3CDu342xRq?`@X6tc2ne@MKkjJP{)LUf16z&DA8yJfvN(`+{AoFf*UG-s;_B< zXIlwXhwz{eN+4rBq-WHTPR)q!Cu^MADPvrCK?W*VSHzE9pI*y6C|0WTJ)+ndRnAEhjmLmq>+3kJ?n#kO5I!{x?b+MU!l);cj`Q8T~hHs{YU;`1;LfhXBU{gw<-RKDBl>oPUkLCtzvK}5hfRPQ9Spg$f#e{pum))_e z%VtoYNy23X{7hpK+44vw3G?_X$(_%}#1B~;YkSB*K6=u@RE!O(cID&o4uh6x*J&!c z{4;9ToS^uzhmCxXn-Wf>fTy=;E}+m|q1ilk{0?LP0Zxn3!;)?Zs^5}&8vnUUiMqmJ zVpP;e!(-RK_US}6G{~ly_;l3x{Xq$u-(N8s!y4$)5YGR%?aX-wp{Jb#;c%a4ZwY*6 zV=9~ETe%!I|5EN1=gWR`VwSDP@{_~p8g+FWGZ8b8Ly|Z|Zq%n7pKDh2@170yajx}d zl=~WGv187!`Zn{t!&RrHpKXI53)jq)PY-jZh2Y{n8F_XHOEtu2Yg1 z#HR2Oaf0#1HDc!t6`b>P2&$@^We~E}%$VKyfm~On2cefg^$b6bp1_9%;(&1*3z!XZ z>Q(g6R5d|cdit>w0Q1brf&}U+{hCBQUVc=ZKvlsa69u#S6^ALegqi&hkEdKUm^Ip_ zZ_%U+s~f>;?P}PSsRqh?)ZyhRFPVWY;3!|zX$wIXP!QgJ;IAe0nnPrGgX-;=#6fHw zdi0on$Npxf z_kw))gkPy7_<|70qM+8R>!cZA`drWcV~0~@St}zEre&f#hL|vaf*p#LseEPBd@9&7 z{2z(L2|;K&d;DA4xmL+-q$(q+yPt4C^)$59&%kjjqreX3>{6*Dbd;8vC(BK~gM^%u zEl}v7$`#DIlElsWR1#q(FA!b=Wv<-q7b%AI)g=KX5xlQV4Y6?h+#``iDZ2w70v&sT zn?Oe`KMk1R7-uQnynzudTLueIKvV=Z8sHEsK^N4HfD<)YtXGk$5I{}wJDaKE%BvJdO{=&|K9p}1@mWC?5tG%a1ki7XGt(^Z4-yW0j^bM)*@Z5Wf4FNmOWKTj^gE{ zR)DE_nLcM8MwV9YBTPsJ1XIzpqz2&?ROqj?uo$SDz}*~h6z6Gjdtt~^5CPuO;b@PZ zgosahp>$xBZ#fk&OdlMC64hJ9A%q|+zfO1`7(dh2X9l*z_a+`mBX9|EH$$*LF6x90 zS$nd>Zbpk_HI_0{w%r$&2k}HMC)zl$-E)jq>s5Y+Gt!2Mydv`{oUc;djb0<*$=|q+ zD~y&JK%0o98VGZC%ytKr0a8^hv=Cx#~(g*nCTTA|MjEhbqKd0G&zn)>%5)@#Ne1sn<> zckteXGnc6mNf*$JT33vy1FkQ1bBf7+snc{_5++PJ{{$~#6=#z>^PI?Jei^QXkC+t@ zF@>U@d6AY59SEKAL@bW~jwE)8@O_dC9d`vgw+CCJq>G1MAhZv76 z=IA_UU?tl8l3YJ_d@M3f8)Ovzn9wD}CLbcolce{}$y=?>7yTtH^h-+N9K%)Ovj_0& z0OGI~=3$d6liCg9<)z?Etr@5yRpY!!iXOZVxc@9&Gf=L!O;?YetQJ0esJ#Q0aVsHd z1`cmZbS#AxcXzFG7K-C*3R+=R=oME)JLaNd8Qa7My`PZ9adA`HtU0W$O7=P|;ic)$ z5(rjGAmp<6QP%}#q;jQk783w=8sL_a*+64#x>1$4rdl*)PL2gWTV)ZSdozw4r4h@@ z+;2Nf3d3h##u{G)OWF_x=ReA-7#vb$+ep1f>DqQ+82>gXsp7+Xar6Sx{&D%3ucVxl z$rs>-8jF+2*=zs2O(0yo&M>o~MTka+OYWr8nMV0p%%Lnj*4ti zVI>1ZQK=$@*n_@iL89DHaDO-99J19j%!(2KP4|MA)loCxXyOvLSn?Lm2vo4ua~C9R zCg)e|4VP*U{`L`8t!w@6K25n9Q1k;M+89Y;DR9dHlKsc_=Uop`UPS-G>tuu{P?>=$ zW=tenT~&XK5htCyi`#eP6VMH#=p3b+jT1Vn%~B0;~TE!cvA49d`4WtxRRci(^*%>Pd=sDNQu8f(Hf(n57Z zsuPtf1>BrHL0%_=9E_TW(wBCd$m@A0WLZZCLR`sbhpKEp71=^!~>XF4$DFeNb#AM7A*KxL>pfbs!a`~CzJLpMQ|90}XPs=Z#!E3>uzeB2TJLk^(V@biJ zsB&eszSq?l=P8rj(}#U-sj@gFt)~1oc`5|ZZ?Sjka9+U}*<^h~0=dFVpn-~!iV+U^ z*l=1y6Bw4&M580ergG#`^x5@ZWtPR0y*vp=-0~KkATjXHV%LyfJlqi{L2$P1vC;)yf=;hg<#M@$v zM3z4%`?5VsLA8cy(Rm^$7nvj#7AzhFGC&9LHgooL4^)UKJhbDBOCPY-5Ke$WN1n5v zgkV+NrXrjig(?ru51c!UWmAUL6J?OQxv@|c@!mGK4KQ-L(rh)$zq4lobYSKnG2act z&p6m3=|zA^v=>zk)F{G!U0xKGrP<>OWxz5P&^6MzIw_yIncjvST3?XcDSO1>8D%QE zpyBdYl4<3ro%j|wH=1m&=_K{uT8nDaGCT`rb2I# zw_%H~GxTb|{CgmYr+dl$x$%rc7#Zvfw_6eLj~1En0()rlz>9Bw%eLzwGs2T-NMEqs z9xdQ&kb(6*Y2~zw?>#h}H{w#f>(J*3`gjl92Rq@4gw{f>(yZ!juB_4R^{5Zi@ciZx(~l3X29I%paxq3@u_~Mjl_Hrveai1%!G= zBPCp_u#4s0k@l2tF_`z*5q1z+btmNW{1h0%#gM^EsTKv0px>8La?_=TC$)h!Jp$Kq zpq811%C5*?1WJ09!g3vRqR*ohHzZ05TFJ=t2=LeBDUmtoML2HQ{%svuDCDsDd*0}? z8LRI6=)Mb2O&0{P|NB3+Ab@P zXSRd=sRyE-G7^MF2y;q7c#AXz9}%##ib+VtAniDV#Z$y-F#D;yLPSa+pQQi56R1^= zoati1rXFjk@Hd-%E(*V6s_hx>jtSq9fMOolvc1 z=J8ds1o0wKo6;WHp{2*Z#6M!|FMP~-LmsuSsJ+?9PFmCMwZ?gVYZk`>Dtan}OK%Mk zG~0vj!7q`4UiS!1MVH70T)!Y2R{#e-KDr(&M0!2<)lG^-oy;~^H)JPl0s6LEo8dy7 z!8{#f@NjOfN-2V3={-NCg|V-+KjuY&Ym0g(8w%V)z=m!H`3vIK>};D)1r#v37l8Ng z@z1VV=@|Qex#w81OYb~-f|f_hYy~3qmIZ8y-}I9vjE|;|tq%1%Phk$BQElKVYLWwX z4$iERW?`AU=ki{*!Vb(3Av${Q6&jzWeRG@Z?;xu8tNC57>`Jm1y8+3AN|1(BT-e+x z{$U&cK2r%im9$45YuydL8v!B2yJr4GMktVM>Tyh_y#ytngv=P})3*L~fSO?rwfMtQ z!E^>pBE4zN(E#1y6Mxp0%Q&igLWOiv%Oe9|y3yC?Z&VPeo#Jo-otf#Vw$}pj7zD z@kz%L`fpZbCoxCZFv_d451L-t0)oCbU|7xh?$SN4qIm)~{tU|2oW%pS_S+;6n8fJF z)+YiGuK+A!!GMXtg1RM^__PuardruPwZ>h?<1|!cIJV@DB4xI86E74}+T&zb^89gC z^tC@mYo|*4o>m3hPhz{4x%(|T_rbz*t~pkQv|Y$uUg&%h zzeCAmC8}&$n67kVka-hXE3F{^enyh%bpEhVwFJDaaE)UjMN&8@BxL$9GNKyIW@=jZ z6id^LOrejVOOVZ`jU84Uy|x`{UVfy~Y%96{LM&tN_%0q~?an2EFK z+aP!XVYxR4_>gU;>tsgm!~&X16G`DyoCSgu7W$ufwiaWfb~y&GKaq?0-dM{P6w;v= zDdBH(W{{K=gM_YjN;=aeMrmt}bD32RQdVn#|MCN=dJxK$F+yg}n6`e6l zRcaB5a^hP_UQG|HpgqDiVx{SWKzzs0hRN5zmDzSA8v?=WL8mh>9?>MB#@q$OX&p&j z?jo%VY~YOT9#m0Awk=psmRhDp+~f#SdBzFU&CU^=a)Eo z`yLVY=KBid1W?JGF1gN^_aLrhs0+R8H&4$3U6^0kNPuu zeoyLmZDVn-buC>HX~jA@5CcpKAE^{SJ>9{%rcdF`2S!RF7QG=3_6Lkm%T-xMuNZ>s zYZ;c))4v5VDzvEwocgnrI)oY)oqk{Bn8+}PBQ$@s@jY0ZXZ@iDR6te~EJMo*BR`pq z_1c=h*CGJq=z6{9?oK(un}FtSi(Zs+B7&sedl`%m;(2<4h*qYT#WYgFj3EYX%0#_# z@D4+3tZH9A*ma7vDve^WHnyPF3UCB07>&nh8Hn3x;9n)mJO{nK9=G$o>|UBJgu`Ev zLQp<{B?BRD@lFd`O>OnHC}G7pp{0)Az3$kZl!FJVBOHynb!M?NG0?Ae)08yk}ia;G2H(?j(zQRqw?t<`r zi6=7pEr{Z9Ki|K29Wswk9-$uR>cN;tNg)wfh|e(zbE0y{r&R6Wz$eStQCbXR^?Ah} zp~)fViPC>Isq_9{2xx!|^NXC=g+4pRI7HI-vuRQoR)qo=>;NB3j_ZV^q||e{n@~A= z^((-bi2Oc?d1Sxzy38hGQl!Fi+EDhKmCV*4%cOH)`HY-B(_8*+zyK_1 zR6xWF>DODN()N$n+6_8J-n)W$Tqv${;fW~RF|$M?8XU8h7MJuaBqQA9!AWAmZz$P| zX{69B9sM6#<^cNq$%1ty?&e?+T`Adlsi*RHM`> z5BD)E4TehR41f-0U~t$8)fCB{u`N8x#f?3st@Ff4MH{~CX3%3ABzh$trlEB*!TW&; zVNY#To6K(P`O-4e)#u)9{!Qgk zv^_@fcnQrZWs{h^Zd?mBU@F}IA4h;BvYEMaE9JUt9RVTQK6NC5T4Iv=))_z7T^8)bwI+p1ivYLEci0=<~C#3kpl zR0fc{VYXQGo3taB4qd|@>dtvPK=&k$F z^%-@-1`!7YaPXI zI1VbEc&QUWHXue-ivdNNpy2T-f4t>P&MtQ8$z4Mm51pK)o8o8m#)Jz4#MotMy`HJ4 z8j_H&@^T=wb^(wd0LfzyHS+aV#jdXX67Q^;JE~-M7U)$80F1qI5gNOMuxAvz<(3!6 z{X}Tah82`QIJ{fou`zlD13}^N-M$mu6!|RJ{Hpp9(sEz`jE7R!O``KG%BPitAr+7S z=X3>Q6d%vXZ~rJ_NdW1@u2(M@vp1Iz9vzR0O(elA4FyiljR?bLLfDd5(L_NEkWN1@ z9Xy!EV0A3X>}>$ypEk@oksvBumv=79qX3SB7o?rctLS3zM!66h>*qX_g1Xu*W;{?< z!O{U9b#M~E_I1hBAnaTctz+UY7qsvFp*diD=}+v24=c6JsJ4tAER}_)ntkyI%*EwA zhF61_yh?l=D+wcLkyvy+RAYcO8;CKlPRM$&)_bBa2|i=D$LXU%rhAg6}iN=-|B776$ynS%=oV` z00aSS_lvkR|C$+ia_qng_e*s+KAFWi?pW#<9VjR4Oe4E*h-@iDVo4UKWY~Ff%vmHP zZF4$|Bf>D<@9uenMgU~?b%}3lK;b4ot=}}lNQ7~1=6|fCpjNLLHpd#r>|YT5rR)O7 z69i4tW{hHL>cT#F?MMn$R(l{D@=d86J_{tGt7A*|-<%6$$jK05$eqVh$7+%CJ;KP-srS>l6ZHWW*@t)Fu<=w*Q#xK7)?+5aEuu34S=vPvxH383Oxan z(*@+cyh&?@X)+ZD)8hCBOZ&kni!?(RIOgAW3n?>Po#-#<%8qEyYo!Bc02;RDlZ@k* z@PO@l))rgcRU|gkx=e(_2Ai0pU|!5}Cvb=O@rpuyC@v2Ljn2y>bN&K5cm5PwHl@~MLtBweGG0<~DA1XY9 zQlAZYaJ?zXCRjik!G`}U6~>G|f;_>uTxyN<8QE0U@QEaQI0nPn1{Y2Y49`*eD-DKG z^1NLLZN0jMhA=wHli*8DpHa`vT(H^}MZu7p8u1VAzS%L7^9<#gnWS9V zGyxa4Sm@+U180y#C5N=OOOT-edAsH?DFL+!l$o#>WtYXj^LB31n8TsUYsh1fyP{L(`v@hDIuPK2EK!g>R4Cp202`_QmlkG1tE8-E ziWe=I-(YW2V6SNQ$$n}XEa2!f()Y-nZ+WZP6DaEggQIDy2uf3ykOq-44N5|ishAT; zhZ`_Xxj{&56H*(x**5MY@%ZQ*=_ITQ@h$11J9S<_3Jz-)+2)?tstjcIP5u!SbxMPf zun|}2JV0T91VsGwt|=@LgtkqRx#Y@kd-u_`fthcvcW%{ zojXq^os3$!h`|hw%e4HCTLx)i?1nX%yBetNn5A!f8nMqCMR!pP{7nP4#=tk|fRvEq z&E&^E`HW$4>CrVq0o!31&NH%FtxQZ6 z-*A!Vwpiw)nCT~!fSvn4iGXynes{!_?t3;_Lg4Op(RKLfa(dVCNQGXqMGey)rK56q zD6QY4^w7Iz_j$7JVa-ARm-5MVnB0de4+B;8Cs26~n&%%6sOZa2!73a{+b+S95^uL= z+Qyzw8%>?dYp04lmlJE84om>Jy|!vfiXGC@wWC|<8Z!ApE%}^zX9;WWxkhX*nwTmO zJf$+A%y5&I&xi|fo|y~7)BN{yTgPjU+`DBnnUGrnV&^4!OF2hu3usI(xA_$=XFCcY zXn}z70yU1sP(y>Ly7oaOCmzSe88j;tH*)0mBS7?TCYfLbzGWMV$*?#K64QEmjm`Ut z@uRq=X060a?{PBVL3M?E$;nszZ2*_}5bFWr>b@7U;#7u=`mu^;)%k#RP+7u4$Nq)R z8**WVKl1Sefbq9DQv{+KP3GZ3r#jQTeObXw?XUQgyBbXaho$#nd9?Yvmr#hK79bC$ zjT5Plb`V#7TXCYceZW4qjNL4QDP4v{VfSA5DJF|W0=NA34lA87q?I5{O6|4Y&o)5EHI6ocdP39f> zOR9Q#x;H+8xD}Z{%^hfX%$?d1xA=~9`5>ED46I&{)Lt%X2k5x0oC&zW&m-2BhkL=8 zEr>sy1j`zW+~3j?X83rh-9D}2e0jXo8xNUM$@we`);v#Gy2?&tG5A|R_J1i+Uqb~& z`4JUds+jE{Cf0F8m(6dk$Z(+F?}|9$!de~e6mksJ@AZS6XInOiKQsy76eN6~oA@DK zr0?n7Qkms=jV=caj1=!~f)Jp5ICl`yHXs6bm951!SI`}Bg->=Yy>|Z*|90|-5hecV zW^zBbq?VzDS}$_>VAs(n=gJ8+>#*iED}}smvbopnwshOjz6pFT7&*^%L-dyx(aQMKMm=T-kXU z_AHA1p?Hm(OU??3@WE#n-g91n1$)Iq*T@*AN>7G=0=Dlj&9I{xW)?n|o|^X8gakPl znn39*VECJAZ=>cf(V!c>r6gA%!Y-j7F?fly&qzC_hb}{dSdscHCoKPBl}VPgu0=tU z#7vmvYUv!JIfD!>ED3-~67*ted%1KmT5Nu8aF?(=278do%L=Y#E5Q)*z;*)Ge$s25 z!Z#ie$Rb|K{&xh6`en(ona1?tELYBWSgW;!(rTp*V$jYMNf>6R?S-{sX4AS1XTgBP z@aYg-)Y2CE=mzz@fkoObGpcVnUKBKT2SW1+|+v*Xu{Wa z4^u5gQ`*LAq$Y~+?rTM-wYb7G_T`!lMM2{KTL~TZF0(cL+r#Yj8|MXOJ8UUyG#iPF zp!XMVLJH8ebw!_e>xI(v?6q}N=A7wVsC2NU(ywh?SaPIlKy@&DeBHY|P<7fGwqVZE zsx~zVZfcD!XC_2vk5k53BMj2P8R>S@1yCt4$vefsETEyG6oGC zQjtZ!TthUuiD?5CRCWR@0WN|>=_+Vy;;x}e-tSJ`zBdw|%pO~+y>_s=mB7Mex6S63 z=K~>E=TWYaOy)bs$;o}K$!tn-CRZ{h#D-GxM}uPe+(`H<3M2*Hp&Ql`Bu9H z%I@C1;}B|RAV+4df?H}*kd=u;+}RU7K7}whW;lumf<;UjZ~0Fl87kVbgSD|3Rnzba zKiGI)Y$T9;hiO7aL`{Pu3(aD+IZ$OIe4F|SrXK=FDRBW1rkiK>SKP`^4J_*nstHL2 zQ#vEugu>*Ab}YeIyO$qyS|=5@-avH8c-=MM50}>zi{l_Q!6nza%3K84tn?=&f;(Ok zQ5MxqG*#6EuYi*i{5Z`i+>?~zy(r=nxokkc^byGUW?z4q%xT;L7yuvVJk#qVjOx;c zy^=3e#?iGZhX0+I@NKYcT$&-ykhS|5N7!+>VLH0%Gc2iNY%01$c(g)Pe843HvF-Pw zAp&pI_8aZ&2@@%+^*!GMDbqb)L-_8?@{AmU{-qqLEC9@x)Q1^C3!;Nr4s=>KUeE5F z$Vd+lB`D<|njOfd;F)e=KR(M`RTjJc5=R;_tw-D>WvdTf#9dtZlB2S?BkFD z`w^S(rx84FWfcs~Rsul*SL}4tb8c3lkQpPFz((5HMKhI z=P=}CaYgW`eC=Zv`|X8H!r^BQ#9d=xzQjM&+@~m5TJn0P4;})4QOko2Rt~7pyIO~M z{NWnn?$Iaypi1yV?ehL0REOMlkuhDbBC*OD3a$CMI6VdnveF5|IQPAMZ1FlZ2__$3 z)@Qyiaql?#H_e)7v;WxHjALL(I5|-i7k65diUPvU8q)S{_SuAfYnU1oAmD&1m<-fv zS{+%+aN>`)K6^0f;=wZ6e()^RTP${xBK}DhGm|_;{q$*!GN6S!Ds!J6+)EByoNVQL zfd9o6>FlJIxvEJ7jvj70X_Y;5QEQD`JxEn)pD|cyh`?L|72Gl{(4^FnLgH{eV`E0cavp(J-QwUUG&s=@^j zIt&Li7LKhkKNF=yb3}m$TvJxQbmk@_c#J@5#&g-nyWKh*E!*n6hVf&Y(Q5Lo1^FAy zIlHuyCvc{MJp>h*mE}oW7(L*1hh7WC6uQ$sGJBbVi8j9qA{xtmbm6HA7SZv2G9f|} zaE&udeg8lRGM*E|47;tNtT&V1Xr6bNRGx~lYI} z1>v>mfn65yROF-0-5Ow7U)C8BexJ19RI{x+EI$K*gGQ1XP2>=Klo6UX@epXB+?)Ll z-PV90DTzi+laomlFGc}-x_UV|{F$TTi0%$kqO?}&F9Ga1{eDK>S&2-w0kNF0mE%zY z$t`vKrT#+jji^KAs0Yv~6_%!nz84_>!b%zh#fjH@FyE!f55i0=fWUym#9(x9!dp6_ zJK*kE@YS8l)eJ~{gUs?dEuI(N6U>0(Cl&%XRdBZsJGKluvI7xL>HJ9mfz2(Ej_J<> zG&a+jjn6>VYbrgVzGAx6-V`N(@F{qpXb;emhHYxL7acL<1EqHe>!~mcr)EXqq}ATb zcb4v^k)S%3=;Iwpjm+C`YuVEpr%{OQ;yNrH1tX6Xt?$JSo4;!dwH3~ z81H+y>jkDcsFs}c&_9oNl&Qqw=eH?n*J7H?02HZlqVPY1FL3j2?(4!zbwOcNrp#UL zuaAcIJ|woENw)}C%lvwFZ=}-s+4@DU37!jb{=Az9e-`r&g;{|dufyf~fg6)CX(&2i zl|@mSOt;!SxAIq9<@P)(R?N+4izx;b)s?H+R>`G*M};%V>_cX7XwG)lq(zH@AdBGmGzLjbOM z_@3J*rFdpkkh3xs{-3=KD6=HYcHQ=NwkHOc2n9>6Bx?CkGDiJ=Hd~f3^*d$Ie`D=+ zCE?!j=1((?r)1c&5aa$l0uW?bw6lVVz}h1Um{p6`0kPBwLl;HgwMB`)ahJfkDPfE- zG5J5N`>cFYtwVBl*v()fhf18|*qR`pzdGB^li zU(OnsHa&Avd}Gaz?jB7N`4r#(`DDSzVs#qLky_JY$l}-Fn3ZTe)XKrdNT*y6XKQWs z2GUTra`qI&T(`|pQ7+2pF+n7hUVMzl#zOuv5?Cug&gYPiifOw^YkKQ^?r1Q7ZU&By zXwHTpY<44sL%q>3#br+f90Tr~??wG|}tuZi+7Fp2DnfOCr0CAO$YS86^Q zmA%CtcfyARS;RoR)htDrZ4W_2>j^~{KID5Z;(^O*K%-tq+=TR?;fwG?__7YvNqPP7 zixifDDP`U^3)yzLQ7%GxK|6<`){={rBkvBtb`KYMi%t+w6gIGKKIsjt2j0O`KcIf5 zt04v-EHef!xNI()F)a{zrpyUNW`+iw5*Oc0;aQIi zB|&%W6->`2+p=AVIZHSBxB&buB)fHKY_ zMi3uQOPzz{+W~}do!7}oLe|`wyA)x_-0`a)7S^S}G*cpYy%_=jB|sZsGU`C>MWbt; zJzQ3@0v+oR-u!W8?L#bQfNlvYj$3I$*lz`w@R4=feP84gYnp-?v&GUb=`Dj=4w`k~59zaY|FC8e>tea_)p zS{KTG^i2VI7|$sLHckWZ;G}MN6#+)k#13f5-49NvA{#dY0ogCDc0I~}@*3+IVNh|b zNsl~Aiwds+r}35*dcc%6a7EzuRseq_Trw1DjLWebY!ZzhMbS)j7F`WqsMHf}?|(v$ z_}zBksEqM-?8E6vV^g@L|9g6k{aq2-${9lFUsr z{4KChxET1l(OFc3W@+#3ZKZ)s-P05@jg}#X+FD8FA+++!aa{@+k&$EQ-$TS z@WOmSl-!K0Yao_uNyOM;BKRvL41ZbuXraoOmHG~fqZK*)KODX^NtE{yzg-BlyqTJ` zytJ`hUmbZsRbd!A;P60Y9F-pp^7^qRNWJe;> zL@=yT{KED@qk+O;PBi!5Ms&FMK7l(xaST>eLcD=j9)@h1t@Iml8uMbe>#4qP8bHez zuqhWWQ8@>MkQ)#d;^$Y>^?fP0ken-1=v@@E6M=Jv!JVAg?bUi`CxJjm2nAuX1mH~=2P$AU;@JEweWMKjlmB;eKFGN?(bojoLyEJ)Onj`h{Bz2IGQ?qQWkM8zOzz1!L7$x)ZG0#sX5RWfU*!a#L`j ztj7lw=jlw@cHzzdNj&4>%!!=!{Fr)MvRpp54K!@(CSFisPHBr%bMwQw6s^XFEzU_Y{y$nmOBuDLh?$CNt;o{V`Mc#OMijRF z)OAz|y%J$N-5CBq83z3Ndo&21o#E?i&GkTgRy~}Ls5mY=#bKylV{h#y+HKbtP`?aI zSOwgsW~=sgz-?foQDAJ0c39Q)t-qWgT;fDA2DgIDsiqj7<4+xdTj?u_7vuswbNv1j zDc}Yk%$4V%#xB~PlzfyYde^P=Uo{52G+F5uDtjP%emdD)#)#%$%U?XJ9n(X!e zzdfm4GOv{8%kJ{Za&5gpzAnIVWwG=Jxrq(LTp3DHY3w3yjHum4jK~ZQ8T$<2c_PK3 z!ic3D&VL*<6pB}+)-F?%42c4{K=y>4{O<9-!MorNG>07_$k?+7 zCSBKF8Q2AN^vDn9(dV$kGcOGUPh;6qFT|fLH*D=$MtOD|w$o za`W|^7U7k+E-*i4^sbjKNG>AM#VYu%GK&U#A;{94vp;ah4KJQhiH{OKZ{gP9dKtqi z!8mCioqv;n^<+@=Hs;pwgL>z(8?#jUfaK4E-=$F!Z6N(kT{2Uxmnr?(X}(`a)0Eb@n_rCs(Ie8pV68BP75l7Pua^!L!5*T!1Gc1QPnh$(fQb9?o3>j zO4CV?rE;5x1*x^hOxwl0wbtMjIVE zMI$XCFGvcoTmhp8H)d;I#vyj^cFhEn@~m5$aCcd#gxvVyMPSs;eidqaFTVoxNpcCH3DWDt=v}u4p(Kd5IE5!>UmgU45?XH zQ;2WxSZm2EAb5))xvvRFX7oApb~EJuBD!uL5fxGQ%*P;($@Oo6KS*#LSsbP?WKA>L zLk(_^kWY)_;pJ%FemZ_nK$i6(Fwe}%ZbeC?q?RyeR9|yUCo2uZc1(xZoQ}sIHstF0 zvuEy>@>o=^Klf2T4x64@ik71C+@H#SNXLpHaSDk_t^hbd$G?rbIe;!=^-!NL84@Y@X5{JVNWEtXADvhK27pi)%WWF^QU2l=wLeW|>w-a= zpx!nV;I-sms)u?z$x=7W(D!j^-MaHw_*b)zl2dk{2pZ8hWqlwMkFw6h0YEn8z5+>7 zj2lL$B_>a=SLCBN?K_!a1CB0KX-}v|$`J@p)bl+K&v23vNS|Wwn3K5G)|%U_gy+F8 zVNSz+LMTF5iNZvPmq^Ku59^VCgpJEuiIs2YSQM-u<^syIu=-FcqE^yO$S2sn7_X+0 zz-nIMu6WER6F5cimQMuC8BnS#%ZPFfHd~2s>e9+u^g_*c%q~Ul&7jTP%kN+N^c{#3 z!P3&s2=>y#QUv=CJFW5rc@Y|nStij>%*f!U@3B3FhKEp`_sZACY4n((G7x-qT zmK%&II>E4pU7&sAtVXw&>?e<49?^T^lBsDIH~Q3RVf!e;3d#C-VYoof{p#+Gj}}?- zj}|$Pf#eRAyG1KL5!mQ8vmc_+P3XR?F>R=Gw#NPVF$s^8z zYbN1^awv1(=y}HvHJ~#SY}%|CVgUXXp+qH2eeE{ssfJG2%H zD}Dl;Lr2^N34t`|R10b}mbnd@cCWmv&~vo{h9$4~6Idl0lO(HOPWqd4AK(G8)=0QK zMX-ooa_lc9{lfc~v258^nV4l_w!hr>DH5VeqF>mFvh!8`9 zNpT9kv`#1RqdPKjlc|hAx!TOJa+g-s%W}D8V29K$kiS<#4-ZuT&b@GE03s^l5kNDt zzn?em9Ret0mT|FwiGl|Tkpb3gW?j>tZG>AqLxb%vX?QRzXfZ}8ZQquKz%YEB0p;)c z9?cSTNr^1PNu)I`&5IVb*btEK;FIY!WFthK zxK*xP=?I4ebE;s-CKTF{^vsa~UZOKg(|hpQpInk3)cnHI@56hUDx>IjjlF@Ettkzk zZ+OE#q$YZ4)OEND?jz7+^^wZ4v0kB1Guj;SLKJhpz!+a9#gdL8zqQC6?lAN|UMAy| zkDmYXv(W~w-0bHr=cL>brxR0Slg|wC@i>gt(L6d3Y?$(6h;L3FVJx1d;ec``JC@mk zNE*y^t zwWd+y1aMB3>6~OF@Y1K&5{3Mczyu!2CJ6lHII^&hMNx#(EaPGbpwuaeqb&wRihmW6 z-;TAo#Dxck;=Nkn$uSkCt6pPL+xAypSx7n5)1&kc=qTv1~}mx{veK&0U_-`a>(x-gGjiU`yD z`=jV%%xLaxahrq+`^BEIBwBAc#Tn|~Hg>Z0*Ta6NaQf?T%l_cuQ$?@#2(qHRi4;sz z8TzoKuw6Fd4z#*8hc-r7$+r#&CtszKH_VF|+sbOZp?~bT{?0U;M`ot=5)MaBC2VT{ zJTf>d_kVxA0XcjNy`SaK9dscX%d?<7R%jG?HbOxM7VQTxhIY>7SBm@l3-Hn%QfTjB z6nau@WsYcM5YWV$8jO<%AIk+kW44D4t)548!XznUu2Kldi%IpO#$-^zY+t8Q-g{^( z!qAo56;n>mM3f(pR+7%=&afol9dQ7>5 zsu}V~Q~n?3y@tKt^t~`z^KyU-#hR1lJ!B0n z<@ZZl1~{3&WV-1F>q!7p6{*Hs?YL#n4I(MlhL1RxLo$KSE0+JNwjuc}xhC+J%>+48 zDXAYME*W)zrG3mPn&Qr4EK6K3qCX9Z>r2D7<;-_WNNG@D)esS{G~SEn-~BXQI*Ltv zNJKZ!nJHF%L?8KShyT|@_Iju9U>n>{$(!gCMb{ENo#niXQ4CxUh9Z?ag=jhz{zv%l zRiy89;#dz;IdEGEF4>QrpeHfCR>|!(SpHM6ThJ=0alnU@*NMqUm$a8N9x@d#W2N(`R?TPfxhUzWpwL69#^lc45T2ON<>iWQ<1!c@7CPozJ% zM@TZGl>G6p^@-{k{I@CPV0XhlelVrYK>Pw>{)gr%VGJzq z%oa|1=EQ}52nuP-OUU)LV2jIDA-E|r+e!l0ZJ5E42T~|ed5c{>XgLHWo9qdVbzK{o zlZf>A>8jmox%xxR)lB%9FRKB`Fh?-G&tJV?S}d-O?fwuzG(p6NpBNYvm9k}bv=x3h zo!#9ZU=!O(jVgq3<$^g%_COufv8>>ztu@>0@QJ5Ayj*wF-WvaJ2J=5c3j>??>{m@^&_%?G1W5QU+f;VV}}8X;J6;-@7By-*^h zjfDQtFI1(qe&wo8V8(K%lX0A|a4ZT+NVvq??k6lpWd7$T*waP_kZhUso^}=3!U@G4;J_(Kt;jRBi0iEq35n zToiLboT_d-Wbbxj8x(H8&{Ab^y7qeP_B*PiPLVA5v87w7bU*4QyZsIiV(EdPfeNN= zlbkuhvecapnGecroq5}dc#L%bv^hz&k;KCxlXx~BQArHjzjoCuPkZxKdVWdim3~|R zhf7r8Lk}?ezc-4i76l|}t7#y#c7G8L6~xU2;O1G}qPr~gw+xn{B+GeQ^U07KZe?%O z{ra~+6fcXDP?)uHWTZvUFKI*zF4=mGPV0YS23`I$k#{0!LxIX6+>#Hj%!6&|BHJZO zFLME7BvQ-!d1jB5MCJ4RVetnEOhw{)0YdBlw#Hott!UEpECeJo(yo)gS>4}AC^*~}H7#ChLqy{D;tYpZpoIYhj8wAO5 zq+dAnN|BfI9A!W$^g_@xK=Uk!Su#^m@OO^#m62l@eR4 z!$HJf<*ENhe8?GVxO+W#g?q^tk35gcv|JqVXM>DP9lg7#>e7lWbdi!7r`^`UBo&+5 zayrIUO@@%Rhk$9hhVp)Av!q9>Hg0Q`uwffG-1;y$^PLE&p4bsXzSGYvT0w(8ilBWu zIt51dSZJZ9|8ER3Z9rSu;8JMA6Kwg0F<6D|Fqr@-jp|ja65>45+QZiQ^alb`W7PWrQ~c8-N5X&MQz-4j7UMf&B90ln}rg<3b8hSanrVszh92LyFOKtAs}hV8Ku8lz0CgS#r6-+Y21 zlbcLSLXg>(U1XatJ3rE|^<&~dl43w$vz(IAg5 zpD6OQ9{K`UKg7BYNV?T9eK&9*IBM*yCbvcig~bB9u6E&fTO%?Vp8*p7i)zb3TDq9@ zofYo()j~?2{XUFh2(abyG~tzzHYf9o66!F|ec~c>7{AQnWAt_o7!=I2)SMBWMdFpM znCW>kSA2^rf9>>Lq&i`CBPzZ=4Rll8n^Gw(c( z+Fvjs@GEjAD8!+)8LD{BlYhQZK@j9Fb%7((NC-k!>9z;^03gVUc~svrw)|$R2tWVq zL#^$YL{W0Jak*>CvRTX&@@Y9U#G$MOoaM%&KuR$F`&mH4R2Lw*U6FvZbzg*pxW^sU z=K4gT_XTP{Z~(AUG}ArjeU|~k*R*^7;YE(ojrp}JiXcUvuOWZN!8{0gSi?w4BL`Vf z*{l@A=^whauf+#g)gf7}q}{U>nhi>1uj00}C{XoCmp|@D0A--N%d~yzLwXads4{%r zc!5`S);5e`;YQ&meNBA+hexlegd0DwO^%>Mk6A zty4q5A?LC=8qj3r8!{nLSY8!)O08C)np70B1a$Xihvb7mteT|+E$hvuUs}b9Qv{5(Cy6lR83MelK^W!t2yyK$HWB{uarv%!jFiH05j8c0FE1LLi zO5_)7?PF=V+98iJP>`oOg*vxndBr||R{5~ydJdM2n24zzaOhmD{$w{j$!`4^j?~bN zHiMdcymmG$Jv>cK|TnQuE#$bi{~FRj;Mx(hID7T$X2hYe=BzpP-Trv+o2{7 ziaX~ChEP%r%4!47BBS&1BXZ$R|Dynh(c*sVKKw4wyc+^LuD`z`^_>zz5|ty$o{RHX z4pMiM|9;qFUC%p<$LHWF5!FsBRU(>bS)dzF%Epo;eF4~#eJ|ci6uN~`*YqajvDTJe zP;^aNt4gaHj*ybSMI}#RlufaD4*x656azw+9fojJ58y}_Dn_Kei446c(GO{319Lc+ z$&--Cq&kvL6|*ESjKR>d;B8?V@IrqgNJ(S$B3pIUVHV=Vnz12*nQ(;X19ekMW`7U0 z0DTm|ePbmD`@8~aQ!d<~WhP9DSkgsVjPSBDWi+fW#~1JM5SO`u8ew-pr-mVyWd09! z{_iLHFOFH{3HFI{M9X4q3jBs9jo|Ix*}}kL*%`J`~E)J+X0)EsoMpDTCBjk%&$>&|~0jMvR=o zKuq&R#5whU1rDv|!O|Ooq8bJ*Ki)Z zZ)K-gt$;TkWSk_SS}bRsNxvG=N>iH|R&4ot(m_tC1jeXh`wy!jJI=n#D?}=9uQgtD zuHuiQDyJWe!I{$5?j)yG3@;m9gt!R@QF`XZLnDUpVCv~gPgidWub}hGD{YpTDvhFU z*n0Z;j(Qwe)iHpNq&@vmKLXuTpp6mse@S{U?)EPtl@&aeT#6r1eG~{7S#K2h`=wXd zOVd!#c0QsatVyUb?rMhg+)TU-Og>XJQ-Io-PCr9<$NbsDSJWS5oRMGut#L6*=)JlLV9;HV;;~VkZsnEckRdD&Pg1 z^_p-qp=0)0U`v-uimB-3rF#=>-GP@~(eFAj)r0iWq5KH$3!7!57&l$(7Ml` zrb0h-hr?9^6T*!UXmU8e32f@=)WB$bxYtYrM~hV15+w@E{6bhp9IE)`KGXw(j{~ev zN}-n@7;BYDDgRABITo?0L7V8uLZ1X%)9@*#E_NZh8j?TzjChJRj5Grp0iJnO5FkdO zZNHpx{pU)`8G>+Y2%Zpdm3B{UR)anh#}Y-+HO}2Y{mG~w z$|L~?`3Vg0&A_?(bd+S+CjmL};FJB?mbTOafd`NWeFwF$%qdLYK+OnCkM`Bycy?%W zio5abA+m#M%3e(52zoH(KCr6?>8c^Fr!nOpeIG%pL9!DkjtSgx<5|;q%4AGn?yb?) ztD(Qr9b*qFJ*N{IWfe`D00r>_F*T$t#4&_a&x%gxO<;iyXveVtK7|yNSubOFY{Q(0 zcL0Mp&G*W{L%;YiKL7INS#yrAOx!~fL`|_I48)q34YlR$Q+? zca|&E-9@u~H2qHd>1BY0cU=Wu#QW;vkAF;^igRW^w^Oej?=z^0dxvr-W*M{P9Xn3# zN!IE0D?+?+sRUkJdg5*iBYZ~)62+k%4I$gjO{LNxpbcUZeQI>#TQ7&40e0N*)P(RS1A2>YHnlD zak!u`8)QUo7)@JU+7~Jz+0V?N+8)Lc0%8+_tr5#(v-S!tCWvJFG#o|9j9Si4t{@KTi(5qX=7DT-MyK6?%7?i9vN`m%N!^jL?LycX73%?ru z6sUBIrqmkY-3@t|9U~hbaP0n%J#*kqs6Y|_<{M2A@CxubUC)gm^2I6uBSnhjJkMo5 zD3rI6kf4zW*xWcISfl@_S_n}3wA8@p_tlNT^qA*WbOdVp122MCfw{xm=p8fIz~}Sz zW}9BG$JR?>s%Q4k`05jUa3LW6eBr@e_Jt#c`3kuBmm5B|wx6q&RS@V1T4m)G6hJ zMypa&RjpVy+oPw=VyiqNj9d}f9?Tx+i1`=fQd}bGHd|I2=q}qJg z^8+btZ1p);vghWZwKgFn^dvH1LP$1owcALs^YB;?Q7s?Rl9jpS z5@ruw6LUwYe4CgdluW;gNh@;)m@1TTPgB#^0F4&;&9x1QjrN02aV~rNgUj^Y!9@w> zB+FCeFg@29B6o7~n<6J~CUTjg>lBLGILgE7v!9#I!$Spz6Ifi+dF(9j(d#3>@bRKr z76`lw2v`f}=!nN$3bOR9ouD&Y?Ta#!oWd-+@aK3A>nhBkR#31CnJ<0#r8*jFCnqn7 zhs6OWkk(0}Mdy)y8;ceBr3WWil3VXOs|SU!g>AjMO&e!b7Y4uRB0LE7U>_33fKf&6 z$B@n|)r@rVGcwkOylUiPY)8I?(ree5fO|j@4$BBfMJY}V|G8bbI8zSoehz{SI^Rame`)Fe^|a8ZoYiOdW9Ms zbe=*gAAj9$vo53t(k!>E?^>}7E*S0hk0BM(6~`g{@7Pm-!)*3A2vMdyV`P7(r>%qJ z{nF|88{TzDZJP-lb*R_E zUyhPneGd<9vVZ56(+-BVhnrz`<>V^bn7u78psZy$3G;~ODl_b;xKxcXn|yhDXihfB zXS6;CIwe+x^8+Wde8!3eQ7CjsFBRon*1f5^n)7IBy>UF^!_kch>S~|Efr1?auc4h3 zy(+WmPZxgJmO7cQeQ<^HJ~1}bB-b*Eg>iZiPXnR!4ux}_k#*I8dK1z^a?BzbO$q~G_CB|4!@p4Ex34h$N< z_$2;n2)#4<&eW#cyD$LC7|p$ft5XCZ&isP*uL;`=S&(x;<2P`}@oYRMaUM#pi@)E` z*fSoJNu(bA)-(2)Ad>Su&+`vhlg*wNV0Fs`WnaPUxOI+BbH z3{dyz+F0xXi+%6a*{OhX=`C`UUVW_3IoL9A;LYS2J8C_fE{molB+q7mJVEAn>%E@Sh;E<%|)kAVia>av@;^PKopI2 z|Fl3N`iBmYSdxX2c}%fP7R}BgsCH>zyKs^dC8sv8sC<8m~eIrNE_f@ zh4M|k?-9U6U<+d1PdrG21xbxQkZaIY)cQGG9K9UMWw%LV4}b+r7ZJGzS=j8d` zczkD*=hTd-fYb`r=76He12-SvGt~E62ev(qUqgoIQs^Mb6v>*C{frk8H7;KU*js@2HbT&NCM}uL_*gcG3+U+M-W)V5OS( zq3_im2;nUTZh1f>#Gtadz7eK8pIN%W2Wk=mQflLj@Fb%__5B$aPo0*9WE4L^-$y$c&qlhP2N=iC4Z+8g5PTB9Z?G8%j znF{5EQST5OFxNOS>v%Gern&WC?SGj8naIizpw7h-5#A~#<#ouEM3owaiEQ)3lmhi5 zNaTd+{xqdD-kN&!w}3EG-4 z+;{>3ZT|0?oxsv(f*g~{5@;KxQgTr3DNN5Ur@Kd_H*My|qoxdGyW-o=Jqft45I_#( zF^(8w{^2tYYx#SBJ|YFvZyo=^hiD58!872ZM1CU_Wk5TRP(cu72`i?&qm?3kJjqtf zBHOQ{1nM@O zR)@A8uy(iE6VNzJ^alYT5z}9FGTJSjW{S<|_Z6vZqdCjal+lcaTzzn7UV@rn02dVq zpoOp|Y-VM#<2=%W)7GqyJa;tJbgmx9XidnDJfk$=p#5{sOYWKr%MF7OoY;vyhE4jA z$PF1tF0K%^E=Ia^88)jru;WDfI+DYvv@v%adDc0eau}wX4&~}BY}L@@*!r{u*=KZ| zd&m7@7+bJ!<3N{XIfkr3g9Z&6G-%L3qDQv%iM-s8-YAKRKJy0;`e7i&>wvyjL#8X> z|NsC0?|-2`97OnZ|84!akFBh8BA(qtNp+Hzpc|Y;R|O9v3;_a(3j&GAeSz(E)2ZRX zIwf!r4-d?MC%Nqx={9&pyA8Q5I00grnzIfsGwNAk<903`uW*g)ugOeE}Znq%f z869Va&I@8|W2DOnzq{SGHaE95Yu?`A;Ns%?-@jmN(#&|}005cOiCm3F+kf6b`ZM}m zS={f2s36j2Wb^1eg=d=3;Qgjs2ux%%F8j#z8a3kwmY86;>2A2IJmgDo~Q@G43#6N(5tumAk>72tDZuW4)brqwEP-bo^(R>T97afCxlZzgEE89 zw%RGoUw{}s1enNQ0cA+?@Xcr_gek?2D|xFglo#g>@ycRMWV?iJQ)Wva+?x#3=tHY} z&6b5=*wkoPU`egztO*MXa9|tnIOF>7Px1)cS^2Zp-WPBz)QRyJcE$laK*BzlM4#gx zEru)Ptb95S1(h5c?ctDYI2@Mokh;>dvf%1wGMP@N(^;Krr8eH%r(}PQ8Ds;_V7(Q- z{7K6i%oZ|d#*vkT9wxARUKE7>#kC(EiZfwhka1FbUL9>D3pn#3PqxcD}5>x-046m!011v5`2ooWJeVg3XO{T{eE>_ zyZE^y7f|vEpBgv9WD9nb=?z69`o`SQwWg|p8N9~381>$g_IT4Z*R`6rFKO%?I=BI) zGj(XklSjJE2d#C(oy+A)O1N)~fI#cdb%8fCmPrpJ6c8%01D(I195}<;#K*w2ixDJ( zuU$VwJI`Jn;_3HSKkeqOJEpWrQ{6#~uRMWfNEF&d3ZNl8hu(Na=UQ&Uq@W>ZsBQW-^Z>6ZQ`=UPdTN~;;{=uz|}mS|8i zkp>cF3d9{JgKluZvP^clJnA-=YNl#Hb6%Z*JaHpHD@OXE7`&pN5@6i+1Qb5Zl@B-r zQkHA4uB?t#W9q$Ht%7jH>{@lZa~G;>f(E=3>S|=>%9E_KOMpRs<-ki-g!*a$(CJQ} z=0ZO|o^hm>KBqB>A!LxeIE_Z5(HxmxR8$lR$1y-C6e{F&I!P$*456LN< zNu=Zkq)v=)#5a_xLztg*C+NP5yq0o-5;&edc#`irzv1P~^Nk%EeQ<¨7+WD(&gE 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 z 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%0ASS42bS)79DG!y!QI`mpC=Mj;S2gF`wG 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ᵇUD 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

02N+inTgDCvind>w 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�*y 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 EQ@28EP5=M^ diff --git a/Assets/dll/ares64_recompiler.wbx.zst b/Assets/dll/ares64_recompiler.wbx.zst index 4dc8291d075be1e1f8aa575f3eec8811099b2a11..53d50d2c0ddcddfc7f857a493cae52ccb6f23e38 100644 GIT binary patch literal 510143 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�B|x`PdOlEJwst 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

%qOr9bE?blhjmJ0u%?W{CD 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�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

-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

CC1;v0igM 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≶5rE%9TxW|zt7vdg>HJd7uf+|{;lZptaJebrZ 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
  • 8;`R#+-=gD1TLPsid&Y9Oh7)SEd3bvX@BA&_CRSl4lwI_VcC+m&n_5?P-CuH zCuLtDyMUehl#vcNsopH_AZ3~kx^(_BRT-zKeUjh9v}jvN-edV3-#q}qyFL--%lw{d z=BO2dGCTW$Lc}P)zM~9HL7=0A>2o+f+<_|mo^%*l0C&dKX#y-%!Vp5x zAs6}Ym2!j*!SDbi&iPN2=C?~QBtuR%qRhMOZ0DmV`QNa|_5sxiP>;O~stqeIo%Dv$ z*q1COh&y^|vJ*j$O6uUrTHsKnkpQy8AQCz@gcJ5oCY%buK59Y5Ub&7B5tCN3e*RP_ z{do`(g56evj0;G**%wyqnh+TGN?UK%qSYuUcEJpC5^n(P`;(+xo8&WMbjavUax zGz$%bJVnfDLsqf~xm=E0&_4;r<}4kP@8CNkLPD#e$iao8NDViX}ePW3q*Wf=oIns?||^ldA!01?4(*@ldDM5oztLj9%eDzr@)*Z9K&t2MKyGy)s+SzvsZo8vv7?~c2F+}6f9>t9CugS_bnw1#0PPEJGUV?b^;JOGwc>EL+CAL(CATQ#7-n6}^>X+p16JhKWnRJB2 z8y7gZDnkK}O)I|GkB?D+f-5V~j<O|}P18?hr%Ut(90|yfF z)rE|gX9j+nhz*b(_#0&d%_~`04h6B_=U`W{mO;nZ8tKgJd}WXrVJXVW49Rl3Bt*9) zU^4sDs|Gw45WoW1Np$@L)^=eCAZ2S&*!<6R_*1?zNTCuy9^V}a!XhO(V9K#mouj@G5!*s}u2a^U-fo@EK=%?bc4 zF1QE$lMiSNb4CIg&jVOZ5#fU6dnY*7xKT|0pRj|#wP~Z!mwRm-a05UgB;ZYoOOLt94n&itfR$_a$$WhUzQP|wf)MU`U$o2S38_S1to z2I6g9784dg!KjPMkd~UU@zF#yU z0!T~H%i@;ZoGczl$0i2T=fn%GSQ%RMyWD(vtlTj4365!IIp^EQ7h0>j4<)uqWh~hd zlhy~H6z2kTv-qc8n50s~!)W6=>+=JMmJvLLhyUT%B}BZT9ETHF)+4V|i(m-B7k(HC|CshwexeUJ4S35EZ)QFn_VDq zzzRT~p@`<{hbj#ng4?|+pxv}on4b+9tgKPyD-o6pW_&u|?lLnEV|bW>c0AlX_~tRs zRLR4jALPI?{exidu1a;fT8HV~k_Fvm84kc$)Y|NmiW=xnbfpas;EE=_dAG=XXzra* z(FLf>Ynf%WD^nmKXU7KQjwfY&;P7Q@cZhpIJ?0zN$?a`RqNzkFH@UCPgh^NCz;Mj0(z8#E*;U$MN>%dUG9spg>3f=zT-vTqciOR4=$1vpzkE!k22bZf z>Et^(=@xCYuCH&=kW`Veh&CX`pWhgmvIa6ICWXoCDZ>p;_1!YstQm@`TGOeGAHkkrr(+=BIgauLAfin}(ZmidyfhywSQF*q~6vY(LUlz_U3Hv&;#Yy#m zGRCn+Lpak!PB&jw6uq_RxE}QEwO0!oQs*~re_cxOj)rf!fE{6LZ#Fhb$)eTlX3L3i z^RJ>?qNHjQ#_YR_@HU?BxhX923KmE)J)O<{*qrcQsbng$a>At$5V4cO&ut=;h`ey0 zl8WT)$VL-ACJfd)#(dzuC&m#=>C9|TdJpO!Y6s;U*?|{LoQ)J51w|ysC--;Tw#%s> zCK#M?xQgB=aCPYmBn@fCrzFsn5Zygt5VU$l>H?0<;lj$j^guMMfdH9!Ce1_0x?<$C=?3 zXt*&v&TFpTZP0d>>dF9bo^eKchuec9VvO|1+OET@_voKJja)6P*V5#0Me*@W0=SDq zsde=G=bC+3e!g8YKSKcQWxgO)uONXCMuvm`gqdZ>4TUYvUPjN|FxC30|M=vMa*K?m z(k-`;ExN4wU7WsNnrj{GXtG1345m~rvYgyrIo{-yCG(Uj-+gE(V5u~M1hj7TK4Ukb z?vYSVRM9bvrUvan+(d5ybPE};Lj{I@9{4p;?9fQJ^Cn6(mM2|eRG2bo191cO z+Knd(vVZ6n=LTHwBz7UQHf~5e7CO?eSg@+Y7+8uzv5{6=#jfJL`Pj{{cL4X^2HfHV zMydDkH$+ zv%Y}@^MiDnDJLVQA)raK4v?!}?Gv}iO&qG#pFUS)$}-#$ zW3nH8EF=ksShcg}Fgr>f3NaNqLhXu-r1v>1OJ#6F`f9I)yBp9gdhMoRF|df;_tfrb z=tf+tV>sW+qk5u5QlmoFvZs6kr?H_UfvcN61)O@ogg>8v{^9Ws_W3MI)n;T;==Zv) zmcOsW_uw3L#>c|n5T=uyJ9la&27S~#i0$cj9uH^XCsxT32pQriqF>n?RxIVUrwDv6 zv8I=-1Hc+(Q%M=Dg+JpeZ59xb_cHgYK$8rYsC=Y>RVZpSk4TizAEhys1hgK`zxYRt z2sD_BpNC&FZ1#2H?u+Ok{8DJfSoyuH0_6HT<{ozpz&fmF6DIZ|hwXne`Rs zK30P9w5p`qrZS9wZ_jnI?_vGq0?!w@=V?nA0sP<_v?Z?+A52swxhC;`3pT4yXj$!& z(RJ700kh)wlEs);kr8>hn(koKf|+L ziB?BNL6^DyBJ5Jqo*HOOOQIKqOcJQ4q(1jg5QswpwVHhy8nTrhzV61A3a#0fkkIXJyyuO3aLwdYI`kuxg4a7*-P?f?jwW;PJ<}hS#lL$2*{c)_@i% zyhIXu^Cll(AScjBx1h*{gus~oE$Izkus3nxxP#g|)&{R#7RpZhD!}~abwYSl3HfPP z02{$lBenErkD;QdP3aZijqEG&ER8Eagh8b;2ek?3rC^O$cbD)n@Q!QKpL_1c6xDUJ ze$@USgN^3kxUfwm zI$XUpK(Sm=Lg8kDiA$<^I;dEqxBAsAoLj_>%$^@8>{@%C;h4#!`s3pD_3htr*iT6E zh&Udl{lna!6lk|oD)%#BhF?D1*OAf(yo6Ei^3);5%l`}^%;yhGk=txrV_|$`tbY9W zSxcPvycK7+`}k6_xAJ+(Tz>L~ca$k*%x3B9l}@*xmglc(0lB)ur%990b?`)_Xms@A z1WkbL%!#ov zGUCS0RmaC2+MbjqK=&2j~pAGw{79S6FHsg&m)W z>q+7|XcvYF{k|bhCrK9z*GEL|UMjw*b0RpY7^kzv~wzP0fHUa z+Dq(~Eq{K}h^0n4R`oQ@zms6{WmK8?SiAat>)!t`|4_bh%U^SUCWmY@Z+~tbFiW$= z4hfOsXfHY2=_97W54IdjeFM&7w!eA5>?V0=N1Xm4=(K0eCfpY<6Cm4B9#@;=r+n;+ z?E1pbj6P?RL_aTamckS6U_b7%Zq9tPyUc8*ymcPFVe`-%_t>^{GCileV&bItOHP`T z%R>%uFaD~5C5eZpl!u0OS z8gV@~t?y>2!R6Q{G&S2A)uH$h~#^KU-)NyzaqzpIbBm7b{bBuBQEYTwR&mD<>ziL zUzM`LVgqF(-+$3ViI=3!)N7tw~9IktVB*)QtSGFgr3aFXuI>Zpp!R~E=EjG z*uY_)qaRnxD#X{#pn!M`5i{e-+SEU=9EDDd$A&nbVa#o_-Lv-RrAg&tkTaQSY{WopM}1MTdh0ERKuW=7r7|#;EtRw= z)K5|gj|uj~rC}*XnO9G#NLN#jxAy5qs+=W_D&%qnE?XyQZ^RCE&EA*S_v)6*sp18pTbv z_1iYgo2}_S+{Z6%l~z{DD^1OggO8}4`2O*``Z;ns{oRc&HXp~u=f&~zVDLFGINVGe zF1DY?#plK0;$ZMOFgV;y951(@$Hm8m;o@NMIWV|k%=~p9EA*p&)~oI9ZBtoLI4lGl z76KbS(QEU4dPKLKoIVauj=i&y?YER3pYK25$H&pZ@#i*j8DHD{t%rQ|dR_0=+;*cz zkDHzA6ecL;lee3raqQY=X0tU|c%8xkNp$SKJYvV)mPU4)A-mV9=9J`z=hsp7-pyug zWizw+IYGV<@T?!wqe#}UKZ^O8&D|_W<%9~%6humQFnT$KcoykaS+#Obrr}&pc0LD> z4@Y)o4@%ag)LxHg-^<78#^Gw=akDzP7-w@y?e+Ti<2_)o?|b{XY)+tV*M}MK2MdDS zbK&Dt7nhsu9WNuQ=cW3_Tc;L#M)xNq(ocx28jbw`dRtHtJ1|kI1HiywNkKs*OyL79 z14pPF!`j%U)g?r!tu!Os?V~9_8eXZnn=hr6mn*m2O)7sy4jJ_Nq;@9(`2hX^2LZH# z;3iQpv)1DpYbzGTp$STqh4N=U&ZJ2yoqYkPjeiEz?^Q_U(_6P~T^^~(oYZx0gbPP- zN-pfE$b?L3Er3}?vlbFzc_q=~GFHJO2u{wYq1Dd)fu18>2hv(=t#gK`b0ODtczY(^ zBuXB+4>)gclp<6_sfpiV!SMgT{tqYBfA#%h8%s{zBZ6WsI*GURJP7_5J!^3T_J8r9F=q{RK$uH;SqBX^0 z$=Rg}wo~3ZXN26>T|8M=gKmGsz|NnoWL#?GEE+r`OmU2ot z<@6qj>So?6Yc*w^62slN_g=Yq<0B`PbV^#Ml(bIBy%8#_q_vuIvs`LzCDLg{;h*5J^l?oR|D!0*j`J7I3A5sKe$Ca*2S(A^gkjFGh5Oh6qp2~5aN19D@ zBPhC@#+#?AJerQj&SSDR#PXkiR512l9{&h#eBu1iN)UsOLB!fhIn zrd0Y1H6)F;l0&uiRIKP9LD{yqEj4p*sF{+@n`Ew)w0$_6XQk8=tuH&Lf_ z=$x3zq8N$hHil_T{5<{M#@)CZ7-Nj<-h1ylQsY=}Wl1Er;yCVB+qT`R>$<9{wSM3C zeV*rem&@gHu~;k?i`H7}oO8|;3WY+!7-KAoqPX|o8^bURn@lE?iKc0q_SOGaSyokE z^=egFcO!D|jbzaLFLN1oN8DS6O%$45)o{*6FdHLWv8K)g0bq!b(89%w2rLjNIIzKh zj1>~a2^HXj39>YE zxAVqvo^PJJy90$B2yPw2V6GWy)Em-_1LeFkO!8$fTSn)?%^N3~=A=#>UHmrJysYWV zu3-1gSPPVf=Zs|xgu39sz@hqPavnQ(O#8{+J7>(p_eSTOad*a+Nkdb-+|^LfbRtS8J*l?Vg)G)G zi-xGQRc=)@0R-cM02m;X3-jQrV0M?<{ig6lmMWJk*JY3b#PiC~^1Q+~$uz7=NSw+KI z%{VlfC8iEW_ivaZHl>*=QdK7iXQ_j8fPpfOMYOB*E>dZ#wRDB*a*=vId}zA|&}`p}J{B4jRVW^teiVx3?uH-H;3-l0ApnvK&ew=I{l@TZAP~oKXhX3@Lvg+S*eJ5-kfje+((Ft#_4{Em zajizeNa3q2VLp=67SV9NeY|3%IdaO!q8n@edW%+Mbf~CsMaPg(J+Vwd0swLF_6H0E zAm)i?0{%JBR;1q`hUuhy90mMBSkgAkUDqg+5Xee5EoCA>z6~(0q$&mq208;u^SPa5&52)KQs?iU4 zE`QA7^uy^FfPm_vmcEd!9EglkSzW>sjm^>A$o5O9*Zr)thuMhJ>lE>o}ZnD_enSOCK6 z9HR|1Cj%4Wb$}$neehZgjzHXwxL1CI$y!H;q<#I{B6T0Ql*i^s-?qm(N&is;p*OAB z`4MEA^mB}qQsO@}-ZmLoE)w{lK3b1=EypT_MmZKfQWk`p=|I`L3S#u`F}3%HFLzbH z>}CC54qo2RwB+#g2NU0FBD5BB*oEv~v7}8LkZKc$XmI^<*bt%umkWcJB~K&jjI&`L zRCtkUNB(jVsJ@%&ogWWI*{scaE#$X{R%zmBy2nZu^12l`H0M!oE zgJvY_0ZbVi&fv7iY~1JJCR9fGS&w@|2+=oq8CzxxkUo2N%8|KPi;+`Q?v3%NBB0bv zgLL&MqaK!-ji7_`6%Rsv3Tn+0x%#~+JZ58isq5~%Yp2ian|lq!eGSUL276$Gzp?>> z)eJHl+%_9zoeh+?JQ#`gW~r!&huE5H+7q|1TXb|-#~Fg14~ihte;2pJRFYsF@CXcPdzHQU2LzE_pupr@j_+FB@Pdb zBLQU^TB5biOVH?{*KcQYWnZ^eO6WG&Z{VhKaIywCu+9q98;M$JkJoGDOZkO?b|bx+ zF7#*sxe=vV%}ek+(W=uY*iB4by)f^9!;G6Ia^22ud7Vr3k@B!F2DMt7^_ls9U0bVU z9qZ+-T{OM^G11hY(&dTs&vp4sZtTCd9nJ}AQ;Y%&jJhU?=SZ<8-_Y9AW2x9z~&KyDO55C zH#rzR&p!Olk^57rDf=aSc>S{oNi1BLfAJL27MIq{*{#xRMqO>m$?8+Fk4CSlbqIE?yH%-PUEye3^A{&nURC}2m zZ?VU7MWN`hNx`2UvKCE>>Sk_rF?t}1aIgoN77S7^se7kiOdYrGcD)&=S6Ma--|DNA zk`zI(m-g1D`aTIA&asE9cXf_=-m#oOX>NTo`^iqrtxt@TzB4Vx=)oS{`a~h4{zjHE z08#9-U=7hgD&`xXM^VG|!Zh4^%wTTCWe%?#;Rlfs@R?NYwD0=I+{z;HgKZzEq zW(&V=;=r~5+gj1g1B@m5S|n_OSYNwtT^{TJX8ou8JLU!TE^av1CpPvDyALv!`eZ@K|5iGwTD%pq*Kt=!b_pi67&-+LaL`dYm%_{}63EdEbsyz?tlpCZ9f)wdbTZU^d7NrxX>e9Y$t%qv-}g|TmR+)+v*-=!fO@N5-PK0COiu~FqZoF zYDP@t#bDmh2rumPovE)dSl~?*lf*6ivGZy9!n7fXNF@6-D<)d?wIjPm^R2A>^v;$fgsDj`^~pqUA0Hq?5(dAAWDCt0wI+$*19=?` zm+DWr)bVx_Wi>S3&>%gQgAK)=fmQl@s04xz0T`M{)aoPdF7Yj$T-1fs#8m&5>!rVb zS8ETeD>jkYe?| z8T_DS=|m`IE!?(fVzHG*avNf_DbZkx9C4kMvbS`^t89mwSyc^pxv!FQwI3UG2xM}pEn_e1(u11k3V3^{t_92uvqmDeCde~#@Q>1VKt^V)&$Me8>G z{Hq^Ldeb2cR)F4p;Ckf93Gem-uO>z$cws=As5S#0V&eP6tK+pg6d6U&sf_<(@C{wz z`sjtO>$^=_7 zpyqV4NyM_cI^iDZW;JUb&K0)aR z37S}o?6c`B{IS^`bTFKu)bg$0JK_FVL7JO>2-KcbXh*4`po5R|xRlt`NCZ6GlwVy* z+HBRbc*U>^aYtC-^p!O{>D>XrG>C#Eofwfbs=YMbk9ITXm7mu9@Iy0y^RDX)ASTR6 z5E(4hJBRjuOaGqRRj3G@8Jj+Y1|E&rYG_%v^h0DY;}{lJ#t0V(4BSqVxiK|gcb#CX zxiYMtJWEY(M;o&WManb{w23k1tmE`7d=Yu)l^5ZB9wy8hhq6$5;9gTNwHa-3q35#Y zSk&~Hvx`F2pXio&m{Rp0uuH3(?sWiSbjYONK4=95JEFDv@mP zm9+m{Tj2feMa%{Gf+b9QJbXVUAn3v)Y>;M7_SxB1j{4man~nNsm6{ffotbS?LQt`_ z$9xH2Wnsq@RiCOe8*U>|Q6H*4Ra+PM*JDX_GmkOF1(51gEbBqAWZD4*UT&9V6fOGG z;?(=ukUB#9S5ibT{ZvnHlgeHG!){5~?3u?P4Zlrw$?_E}Fe*o&j~kEkhBM{A!UF${ zhUg!3`ejIXcaGKL+lszdD;po~Dvj0+-ACrfl+hDFuef+c33SbG$`Y(!aPY)QeOs*L zAjONbU*&E5%mzsvz-H{K8KfygsEE{}aQYlcsDK71vpknr4AshdlaV|*@Br8!IG747 zH^o`bOt_zj$xG$d_fiK21^hrZF^T{(*@+?#-m%4y(WP2oSkFl&l4j_n43$3n>iNSF zHI=!k1`|C0-eLh@9Ht{x2vdKw`ltaq8GZBym25MZKv#>iruStDup9l9641Qrf2k=V zj<)q3qn{Si*g}!HC;}wfgrUcBW%lYMqGri6MBh2r1x%49SA(Jp;tx{NT6r6t1^M>9 zhrTzl@31}Y=Ieai#Tx%e+6pNx3y{EPrBKX?0lyV4S7PfhED7%}z&)Cp5=CH*d8gw7 zA{-QaO&?HJL2b0NY~W@$QstAUBUHtec{$xq&r3lno_Dc8+NH?kA5Gs58HC;iMVS@v z`aKP@aa_KEf^b{1;M@kO4mEi4LR;}V8i|@Xb2B`<^&pSo+Efz|vO4(Oeq@L&I2jKk zIMn+<29HEahgyFxLDw%=b)uw(jvpCC4T~!Et}l3{OsM#e7~i-8X~C+?Vi&w;Vc5y= zV$6kAZ9>*+_6w@R9w|npIFE-iXk*TTKI}>(+zciiBoW0=lePt29)XK+!NpU3=rRm`g}hE)r* z^M$Fd5IcmNQyXWG$TeQ3V|jAo3q6W_MBHT!a+Y^qD7EdjpXH(#6&F8b&{*Sn9d(gJ0CY%4XIL-INSzC>4~* z$hewsai+N5wF!?eY6p*L;;5WkMN?Z??epUVb@e%m=Z;&1*iS}C9WlmDWP zP4G-$M_@e_94m{)63`og>?uz>pUSU_681ky!=*&dq>1($Wj2Istfq>*EI!9ZKIIn%-o4PQ~ngN*uN}5p_ zbX#7x3%h8GcD*I4#eY^hP&>+pVL2JCLyna$q+~%jAWwhOAFssJ<=q~%luH_%{IT zpi2@8MQSBEk#qo(Zdn$B32A|Oz9Xls)eUCh6lm;&WrKNK^;gl6A})q%Cc9m=_w<>X z>k0Ka#@o>G5Ns{xgr3WPv3Y5^=8D31-oT%aaq?fXhWY5L?4bN<& zZ+9&p{V<+|MN@u_{$5cUF%(HpN2oHj!^ZkWk#B?ylR;2pC=)Dd zd-&kid_Z9Lca94an?(&3q6pQv>iFkqLKo?so5+W)-B}8h1ESLcjNm{-_NEea9O7+#KSv zh|pC@hDAIfSM6<8`Zc)*{KFQO6Sw2M)Hf89%2(SXA8|xUr&$} z7`_gm+REc74NgURLSRc6A{Ae3wU-_83tuDVgu16JzIzGYBO%6~DblB;E%+!b-CoX; z;|J`?P!Ms!6qQ@9!I_nCqC?JIRvSXqWO_xlizXpd2hHp1Cy3K z@m|1{1lx-)^VkH+Gk=)X*;YPB}bH2s~Z*I zc;n!0Wet)95t8wsP`W5<|Cs&_@|KT0JQdZvq{VF(%pnECL=1nP>!sW;ug8euoCY9{ zbI33me}1PG>V|Y<6UT1;IVWrd#-Z6U3#@FA+27h3WVC|s=d0v__LJE!Ld39cS{O7B zq_>>WO57|T!dzA@&*0-f4M-Of43+vT%XUXyaY&jH64(4sIeW11zsF>iq)i7mM&PHD z!?})xT7CkjW>x|$PQKs&v6n0M$l}q05(g%|3&R-!KaUpY4x+r~Xk$4d%1HesUP_MN z8-cVzJne^XHDiv`!PJH6Q1`fl(oDV4H#~dBY;VcP3pKn}^C`Wwm%WO`+o!ZaYbi&} zWHV;*6-Z^?41_I{(p*zV@9wt< zB47+<7S}|Rkn}r=Vn;H`(#_vt*@9Z^>C6OuZueULN@I({qJtczfxp~bS^)V`(ena2 z-@$~@O{FN_vDo*THbS1K_p%TQO8-&sh^5-%f#~4`k^#KI2e>W3eN(8`sRRFPPOO9| zbfa~b%DZk0hAXLqtjF(gn=l!UHrjD_tO#2I64~TFM^*DpPPJAdcXP%Pl$lxXlusKRTr&QP=gFis9ek0S}=2 zz-|mrRI`488u;x(#v?$m$Rcm^5r4T&>vnB98f-Q-fO7paoIn+0hU7U}9BI;i=Cgkn^ilWKA1yJlF&4#Us# ziq2|R#UTOhN@%9;F-_Kbv7a%iFA8jTNdqRFuCMMXsFa4?0pphbKp|KUvjxrAG0((pHx=oCh($ diff --git a/waterbox/ares64/BizInterface.cpp b/waterbox/ares64/BizInterface.cpp index f5103bc0d9..a29315dfad 100644 --- a/waterbox/ares64/BizInterface.cpp +++ b/waterbox/ares64/BizInterface.cpp @@ -746,7 +746,7 @@ static u8 PeekFunc(u64 address) } ares::Nintendo64::Thread unused; - return ares::Nintendo64::bus.read(addr, unused); + return ares::Nintendo64::bus.read(addr, unused, nullptr); } static void SysBusAccess(u8* buffer, u64 address, u64 count, bool write) @@ -755,7 +755,7 @@ static void SysBusAccess(u8* buffer, u64 address, u64 count, bool write) { ares::Nintendo64::Thread unused; while (count--) - ares::Nintendo64::bus.write(address++, *buffer++, unused); + ares::Nintendo64::bus.write(address++, *buffer++, unused, nullptr); } else { diff --git a/waterbox/ares64/ares/LICENSE b/waterbox/ares64/ares/LICENSE old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/ares.cpp b/waterbox/ares64/ares/ares/ares/ares.cpp old mode 100644 new mode 100755 index 46d6c7bbef..4c7515497b --- a/waterbox/ares64/ares/ares/ares/ares.cpp +++ b/waterbox/ares64/ares/ares/ares/ares.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -8,4 +9,13 @@ namespace ares { Platform* platform = nullptr; bool _runAhead = false; +const string Name = "ares"; +const string Version = "138"; +const string Copyright = "ares team, Near"; +const string License = "ISC"; +const string LicenseURI = "https://opensource.org/licenses/ISC"; +const string Website = "ares-emu.net"; +const string WebsiteURI = "https://ares-emu.net/"; +const u32 SerializerSignature = 0x31545342; //"BST1" (little-endian) + } diff --git a/waterbox/ares64/ares/ares/ares/ares.hpp b/waterbox/ares64/ares/ares/ares/ares.hpp old mode 100644 new mode 100755 index ccebe32628..3bd4ccbd84 --- a/waterbox/ares64/ares/ares/ares/ares.hpp +++ b/waterbox/ares64/ares/ares/ares/ares.hpp @@ -2,7 +2,6 @@ #include #include - #include #include @@ -42,16 +41,14 @@ using namespace nall; using namespace nall::primitives; namespace ares { - static const string Name = "ares"; - static const string Version = "133"; - static const string Copyright = "ares team, Near"; - static const string License = "ISC"; - static const string LicenseURI = "https://opensource.org/licenses/ISC"; - static const string Website = "ares-emu.net"; - static const string WebsiteURI = "https://ares-emu.net/"; - - //incremented only when serialization format changes - static const u32 SerializerSignature = 0x31545342; //"BST1" (little-endian) + extern const string Name; + extern const string Version; + extern const string Copyright; + extern const string License; + extern const string LicenseURI; + extern const string Website; + extern const string WebsiteURI; + extern const u32 SerializerSignature; namespace VFS { using Pak = shared_pointer; diff --git a/waterbox/ares64/ares/ares/ares/debug/debug.cpp b/waterbox/ares64/ares/ares/ares/debug/debug.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/debug/debug.hpp b/waterbox/ares64/ares/ares/ares/debug/debug.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/inline.hpp b/waterbox/ares64/ares/ares/ares/inline.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.cpp b/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.cpp old mode 100644 new mode 100755 index 14f914c989..4998459b05 --- a/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.cpp +++ b/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.cpp @@ -1,21 +1,32 @@ #include +#if !defined(PLATFORM_MACOS) +#define STATIC_ALLOCATION +#endif + namespace ares::Memory { constexpr u32 fixedBufferSize = 8_MiB; -#if defined(PLATFORM_MACOS) -//dynamic allocation for unsupported platforms -FixedAllocator::FixedAllocator() { - _allocator.resize(fixedBufferSize, bump_allocator::executable); -} -#else -alignas(4096) u8 fixedBuffer[fixedBufferSize]; +#if defined(STATIC_ALLOCATION) +u8 fixedBuffer[fixedBufferSize + 64_KiB]; +#endif FixedAllocator::FixedAllocator() { - _allocator.resize(sizeof(fixedBuffer), 0, fixedBuffer); + u8* buffer = nullptr; + + #if defined(STATIC_ALLOCATION) + //align to 64 KiB (maximum page size of any supported OS) + auto offset = -(uintptr)fixedBuffer % 64_KiB; + //set protection to executable + if(memory::protect(fixedBuffer + offset, fixedBufferSize, true)) { + //use static allocation + buffer = fixedBuffer + offset; + } + #endif + + _allocator.resize(fixedBufferSize, bump_allocator::executable, buffer); } -#endif auto FixedAllocator::get() -> bump_allocator& { static FixedAllocator allocator; diff --git a/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.hpp b/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.hpp old mode 100644 new mode 100755 index 09d8d85e44..e276322938 --- a/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.hpp +++ b/waterbox/ares64/ares/ares/ares/memory/fixed-allocator.hpp @@ -1,14 +1,14 @@ -#pragma once - -namespace ares::Memory { - -struct FixedAllocator { - static auto get() -> bump_allocator&; - -private: - FixedAllocator(); - - bump_allocator _allocator; -}; - -} +#pragma once + +namespace ares::Memory { + +struct FixedAllocator { + static auto get() -> bump_allocator&; + +private: + FixedAllocator(); + + bump_allocator _allocator; +}; + +} diff --git a/waterbox/ares64/ares/ares/ares/memory/memory.hpp b/waterbox/ares64/ares/ares/ares/memory/memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/memory/readable.hpp b/waterbox/ares64/ares/ares/ares/memory/readable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/memory/writable.hpp b/waterbox/ares64/ares/ares/ares/memory/writable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/attribute.hpp b/waterbox/ares64/ares/ares/ares/node/attribute.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/audio/audio.hpp b/waterbox/ares64/ares/ares/ares/node/audio/audio.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/audio/stream.cpp b/waterbox/ares64/ares/ares/ares/node/audio/stream.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/audio/stream.hpp b/waterbox/ares64/ares/ares/ares/node/audio/stream.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/class.hpp b/waterbox/ares64/ares/ares/ares/node/class.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/component/component.hpp b/waterbox/ares64/ares/ares/ares/node/component/component.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/component/real-time-clock.hpp b/waterbox/ares64/ares/ares/ares/node/component/real-time-clock.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/debugger.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/debugger.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/graphics.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/graphics.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/memory.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/properties.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/properties.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/instruction.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/instruction.hpp old mode 100644 new mode 100755 index 0c354c3b2a..31a778cc51 --- a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/instruction.hpp +++ b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/instruction.hpp @@ -71,9 +71,7 @@ struct Instruction : Tracer { if(!enabled()) return; if(_omitted) { - PlatformLog({ - "[Omitted: ", _omitted, "]\n"} - ); + PlatformLog(shared(), {"[Omitted: ", _omitted, "]"}); _omitted = 0; } @@ -84,7 +82,7 @@ struct Instruction : Tracer { context, " ", extra }; - PlatformLog({output.strip(), "\n"}); + PlatformLog(shared(), {output.strip()}); } auto serialize(string& output, string depth) -> void override { diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/notification.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/notification.hpp old mode 100644 new mode 100755 index a9f7331d38..95a3489807 --- a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/notification.hpp +++ b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/notification.hpp @@ -6,12 +6,7 @@ struct Notification : Tracer { auto notify(const string& message = {}) -> void { if(!enabled()) return; - - if(message) { - PlatformLog({_component, " ", _name, ": ", message, "\n"}); - } else { - PlatformLog({_component, " ", _name, "\n"}); - } + PlatformLog(shared(), message); } protected: diff --git a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/tracer.hpp b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/tracer.hpp old mode 100644 new mode 100755 index 82f38e201a..7ded508506 --- a/waterbox/ares64/ares/ares/ares/node/debugger/tracer/tracer.hpp +++ b/waterbox/ares64/ares/ares/ares/node/debugger/tracer/tracer.hpp @@ -6,24 +6,40 @@ struct Tracer : Debugger { } auto component() const -> string { return _component; } - auto enabled() const -> bool { return _enabled; } + auto enabled() const -> bool { return file() || terminal(); } + auto prefix() const -> bool { return _prefix; } + auto terminal() const -> bool { return _terminal; } + auto file() const -> bool { return _file; } + auto autoLineBreak() const -> bool { return _autoLineBreak; } + auto setToggle(function toggle) -> void { _toggle = toggle; } auto setComponent(string component) -> void { _component = component; } - auto setEnabled(bool enabled) -> void { _enabled = enabled; } + auto setPrefix(bool prefix) -> void { _prefix = prefix; } + auto setTerminal(bool terminal) -> void { _terminal = terminal; if(_toggle) _toggle(); } + auto setFile(bool file) -> void { _file = file; if(_toggle) _toggle(); } + auto setAutoLineBreak(bool autoLineBreak) -> void { _autoLineBreak = autoLineBreak; } auto serialize(string& output, string depth) -> void override { Debugger::serialize(output, depth); output.append(depth, " component: ", _component, "\n"); - output.append(depth, " enabled: ", _enabled, "\n"); + output.append(depth, " prefix: ", _prefix, "\n"); + output.append(depth, " terminal: ", _terminal, "\n"); + output.append(depth, " file: ", _file, "\n"); } auto unserialize(Markup::Node node) -> void override { Debugger::unserialize(node); _component = node["component"].string(); - _enabled = node["enabled"].boolean(); + _prefix = node["prefix"].boolean(); + _terminal = node["terminal"].boolean(); + _file = node["file"].boolean(); } protected: + function _toggle; string _component; - bool _enabled = false; + bool _prefix = false; + bool _terminal = false; + bool _file = false; + bool _autoLineBreak = true; }; diff --git a/waterbox/ares64/ares/ares/ares/node/input/axis.hpp b/waterbox/ares64/ares/ares/ares/node/input/axis.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/input/button.hpp b/waterbox/ares64/ares/ares/ares/node/input/button.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/input/input.hpp b/waterbox/ares64/ares/ares/ares/node/input/input.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/input/rumble.hpp b/waterbox/ares64/ares/ares/ares/node/input/rumble.hpp old mode 100644 new mode 100755 index ea83472d3c..7d0c5371f8 --- a/waterbox/ares64/ares/ares/ares/node/input/rumble.hpp +++ b/waterbox/ares64/ares/ares/ares/node/input/rumble.hpp @@ -5,7 +5,9 @@ struct Rumble : Input { auto weakValue() const -> u16 { return _weak; } auto strongValue() const -> u16 { return _strong; } - auto setValues(u16 weak, u16 strong) -> void { _weak = weak; _strong = strong; } + auto setValues(u16 strong, u16 weak) -> void { _weak = weak; _strong = strong; } + auto setWeak(u16 weak) -> void { _weak = weak; } + auto setStrong(u16 strong) -> void { _strong = strong; } // For systems with binary motors auto enable() const -> bool { return _weak > 0 || _strong > 0; } diff --git a/waterbox/ares64/ares/ares/ares/node/input/trigger.hpp b/waterbox/ares64/ares/ares/ares/node/input/trigger.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/node.cpp b/waterbox/ares64/ares/ares/ares/node/node.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/node.hpp b/waterbox/ares64/ares/ares/ares/node/node.hpp old mode 100644 new mode 100755 index e91ed880d4..d381bee0a7 --- a/waterbox/ares64/ares/ares/ares/node/node.hpp +++ b/waterbox/ares64/ares/ares/ares/node/node.hpp @@ -94,7 +94,7 @@ namespace ares::Core { // forward declarations static auto PlatformAttach(Node::Object) -> void; static auto PlatformDetach(Node::Object) -> void; - static auto PlatformLog(string_view) -> void; + static auto PlatformLog(Node::Debugger::Tracer::Tracer tracer, string_view) -> void; #include #include diff --git a/waterbox/ares64/ares/ares/ares/node/object.hpp b/waterbox/ares64/ares/ares/ares/node/object.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/peripheral.hpp b/waterbox/ares64/ares/ares/ares/node/peripheral.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/port.hpp b/waterbox/ares64/ares/ares/ares/node/port.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/boolean.hpp b/waterbox/ares64/ares/ares/ares/node/setting/boolean.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/integer.hpp b/waterbox/ares64/ares/ares/ares/node/setting/integer.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/natural.hpp b/waterbox/ares64/ares/ares/ares/node/setting/natural.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/real.hpp b/waterbox/ares64/ares/ares/ares/node/setting/real.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/setting.hpp b/waterbox/ares64/ares/ares/ares/node/setting/setting.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/setting/string.hpp b/waterbox/ares64/ares/ares/ares/node/setting/string.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/system.hpp b/waterbox/ares64/ares/ares/ares/node/system.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/video/screen.cpp b/waterbox/ares64/ares/ares/ares/node/video/screen.cpp old mode 100644 new mode 100755 index 19fe96a044..39e613e42f --- a/waterbox/ares64/ares/ares/ares/node/video/screen.cpp +++ b/waterbox/ares64/ares/ares/ares/node/video/screen.cpp @@ -25,11 +25,15 @@ Screen::~Screen() { auto Screen::main(uintptr_t) -> void { while(!_kill) { - usleep(1); - if(_frame) { + unique_lock lock(_frameMutex); + + auto timeout = std::chrono::milliseconds(10); + if(_frameCondition.wait_for(lock, timeout, [&] { return _frame.load(); })) { refresh(); _frame = false; } + + if(_kill) break; } } @@ -68,6 +72,15 @@ auto Screen::setRefresh(function refresh) -> void { _refresh = refresh; } +auto Screen::refreshRateHint(double pixelFrequency, int dotsPerLine, int linesPerFrame) -> void { + refreshRateHint(1.0f / ((double)(dotsPerLine * linesPerFrame) / pixelFrequency)); +} + +auto Screen::refreshRateHint(double refreshRate) -> void { + lock_guard lock(_mutex); + platform->refreshRateHint(refreshRate); +} + auto Screen::setViewport(u32 x, u32 y, u32 width, u32 height) -> void { lock_guard lock(_mutex); _viewportX = x; @@ -76,6 +89,11 @@ auto Screen::setViewport(u32 x, u32 y, u32 width, u32 height) -> void { _viewportHeight = height; } +auto Screen::setOverscan(bool overscan) -> void { + lock_guard lock(_mutex); + _overscan = overscan; +} + auto Screen::setSize(u32 width, u32 height) -> void { lock_guard lock(_mutex); _width = width; @@ -171,10 +189,12 @@ auto Screen::frame() -> void { lock_guard lock(_mutex); _inputA.swap(_inputB); - _frame = true; if constexpr(!ares::Video::Threaded) { refresh(); _frame = false; + } else { + _frame = true; + _frameCondition.notify_one(); } } @@ -228,14 +248,18 @@ auto Screen::refresh() -> void { } } - if(_colorBleed) { + if (_colorBleed) { n32 mask = 1 << 24 | 1 << 16 | 1 << 8 | 1 << 0; - for(u32 y : range(height)) { + for (u32 y : range(height)) { auto target = output + y * width; - for(u32 x : range(width)) { - auto a = target[x]; - auto b = target[x + (x != width - 1)]; - target[x] = (a + b - ((a ^ b) & mask)) >> 1; + for (u32 x : range(0, width, _colorBleedWidth)) { + for (u32 offset = 0; offset < _colorBleedWidth && (x + offset) < width; ++offset) { + u32 next = x + _colorBleedWidth; + if (next + offset >= width) next = x; + auto a = target[x + offset]; + auto b = target[next + offset]; + target[x + offset] = (a + b - ((a ^ b) & mask)) >> 1; + } } } } diff --git a/waterbox/ares64/ares/ares/ares/node/video/screen.hpp b/waterbox/ares64/ares/ares/ares/node/video/screen.hpp old mode 100644 new mode 100755 index bcc13d1dc5..11e8e985ea --- a/waterbox/ares64/ares/ares/ares/node/video/screen.hpp +++ b/waterbox/ares64/ares/ares/ares/node/video/screen.hpp @@ -16,6 +16,7 @@ struct Screen : Video { auto scaleY() const -> f64 { return _scaleY; } auto aspectX() const -> f64 { return _aspectX; } auto aspectY() const -> f64 { return _aspectY; } + auto overscan() const -> bool { return _overscan; } auto colors() const -> u32 { return _colors; } auto pixels(bool frame = 0) -> array_span; @@ -33,10 +34,13 @@ struct Screen : Video { auto setRefresh(function refresh) -> void; auto setViewport(u32 x, u32 y, u32 width, u32 height) -> void; + auto refreshRateHint(double refreshRate) -> void; + auto refreshRateHint(double pixelFrequency, int dotsPerLine, int linesPerFrame) -> void; auto setSize(u32 width, u32 height) -> void; auto setScale(f64 scaleX, f64 scaleY) -> void; auto setAspect(f64 aspectX, f64 aspectY) -> void; + auto setOverscan(bool overscan) -> void; auto setSaturation(f64 saturation) -> void; auto setGamma(f64 gamma) -> void; @@ -44,6 +48,7 @@ struct Screen : Video { auto setFillColor(u32 fillColor) -> void; auto setColorBleed(bool colorBleed) -> void; + auto setColorBleedWidth(u32 width) -> void; auto setInterframeBlending(bool interframeBlending) -> void; auto setRotation(u32 rotation) -> void; @@ -78,7 +83,9 @@ protected: f64 _luminance = 1.0; u32 _fillColor = 0; bool _colorBleed = false; + bool _colorBleedWidth = 1; bool _interframeBlending = false; + bool _overscan = true; u32 _rotation = 0; //counter-clockwise (90 = left, 270 = right) function _color; @@ -92,6 +99,8 @@ protected: //unserialized: nall::thread _thread; recursive_mutex _mutex; + mutex _frameMutex; + condition_variable _frameCondition; atomic _kill = false; atomic _frame = false; function _refresh; diff --git a/waterbox/ares64/ares/ares/ares/node/video/sprite.cpp b/waterbox/ares64/ares/ares/ares/node/video/sprite.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/video/sprite.hpp b/waterbox/ares64/ares/ares/ares/node/video/sprite.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/node/video/video.hpp b/waterbox/ares64/ares/ares/ares/node/video/video.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/platform.hpp b/waterbox/ares64/ares/ares/ares/platform.hpp old mode 100644 new mode 100755 index c2e670f4ac..93d1cb34fd --- a/waterbox/ares64/ares/ares/ares/platform.hpp +++ b/waterbox/ares64/ares/ares/ares/platform.hpp @@ -15,11 +15,13 @@ struct Platform { virtual auto detach(Node::Object) -> void {} virtual auto pak(Node::Object) -> shared_pointer { return {}; } virtual auto event(Event) -> void {} - virtual auto log(string_view message) -> void {} + virtual auto log(Node::Debugger::Tracer::Tracer, string_view message) -> void {} virtual auto status(string_view message) -> void {} virtual auto video(Node::Video::Screen, const u32* data, u32 pitch, u32 width, u32 height) -> void {} + virtual auto refreshRateHint(double refreshRate) -> void {} virtual auto audio(Node::Audio::Stream) -> void {} virtual auto input(Node::Input::Input) -> void {} + virtual auto cheat(u32 addr) -> maybe { return nothing; } virtual auto time() -> n64 { return ::time(0); } }; @@ -31,5 +33,5 @@ namespace ares::Core { // forward declarations auto PlatformAttach(Node::Object node) -> void { if(platform && node->name()) platform->attach(node); } auto PlatformDetach(Node::Object node) -> void { if(platform && node->name()) platform->detach(node); } - auto PlatformLog(string_view text) -> void { if(platform) platform->log(text); } + auto PlatformLog(Node::Debugger::Tracer::Tracer node, string_view text) -> void { if(platform) platform->log(node, text); } } diff --git a/waterbox/ares64/ares/ares/ares/random.hpp b/waterbox/ares64/ares/ares/ares/random.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/GNUmakefile b/waterbox/ares64/ares/ares/ares/resource/GNUmakefile old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/icon.png b/waterbox/ares64/ares/ares/ares/resource/icon.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/icon@2x.png b/waterbox/ares64/ares/ares/ares/resource/icon@2x.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/logo.png b/waterbox/ares64/ares/ares/ares/resource/logo.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/logo@2x.png b/waterbox/ares64/ares/ares/ares/resource/logo@2x.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/resource.bml b/waterbox/ares64/ares/ares/ares/resource/resource.bml old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/resource.cpp b/waterbox/ares64/ares/ares/ares/resource/resource.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/resource.hpp b/waterbox/ares64/ares/ares/ares/resource/resource.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-blue.png b/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-blue.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-green.png b/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-green.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-red.png b/waterbox/ares64/ares/ares/ares/resource/sprite/sfc/crosshair-red.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-0.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-0.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-1.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-1.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-2.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/auxiliary-2.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/headphones.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/headphones.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/initialized.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/initialized.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/low-battery.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/low-battery.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-0.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-0.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-1.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/orientation-1.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/powered-on.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/powered-on.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/sleeping.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/sleeping.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a0.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a0.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a1.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a1.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a2.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-a2.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b0.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b0.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b1.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b1.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b2.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b2.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b3.png b/waterbox/ares64/ares/ares/ares/resource/sprite/ws/volume-b3.png old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/scheduler/scheduler.cpp b/waterbox/ares64/ares/ares/ares/scheduler/scheduler.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/scheduler/scheduler.hpp b/waterbox/ares64/ares/ares/ares/scheduler/scheduler.hpp old mode 100644 new mode 100755 index 51dd625dfc..0f9d67026c --- a/waterbox/ares64/ares/ares/ares/scheduler/scheduler.hpp +++ b/waterbox/ares64/ares/ares/ares/scheduler/scheduler.hpp @@ -41,7 +41,7 @@ private: vector _threads; bool _synchronize = false; - friend class Thread; + friend struct Thread; }; extern Scheduler scheduler; diff --git a/waterbox/ares64/ares/ares/ares/scheduler/thread.cpp b/waterbox/ares64/ares/ares/ares/scheduler/thread.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/ares/scheduler/thread.hpp b/waterbox/ares64/ares/ares/ares/scheduler/thread.hpp old mode 100644 new mode 100755 index f40941f6ec..382d88df4f --- a/waterbox/ares64/ares/ares/ares/scheduler/thread.hpp +++ b/waterbox/ares64/ares/ares/ares/scheduler/thread.hpp @@ -46,5 +46,5 @@ protected: u64 _scalar = 0; u64 _clock = 0; - friend class Scheduler; + friend struct Scheduler; }; diff --git a/waterbox/ares64/ares/ares/ares/types.hpp b/waterbox/ares64/ares/ares/ares/types.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/disassembler.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/disassembler.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/instruction.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/instruction.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/instructions.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/instructions.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/memory.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/memory.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/serialization.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.hpp b/waterbox/ares64/ares/ares/component/processor/sm5k/sm5k.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/component/processor/sm5k/timer.cpp b/waterbox/ares64/ares/ares/component/processor/sm5k/timer.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/accuracy.hpp b/waterbox/ares64/ares/ares/n64/accuracy.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/ai/ai.cpp b/waterbox/ares64/ares/ares/n64/ai/ai.cpp old mode 100644 new mode 100755 index 1b64e26993..89b5f61da3 --- a/waterbox/ares64/ares/ares/n64/ai/ai.cpp +++ b/waterbox/ares64/ares/ares/n64/ai/ai.cpp @@ -38,7 +38,7 @@ auto AI::sample(f64& left, f64& right) -> void { if(io.dmaLength[0] && io.dmaEnable) { io.dmaAddress[0].bit(13,23) += io.dmaAddressCarry; - auto data = rdram.ram.read(io.dmaAddress[0]); + auto data = rdram.ram.read(io.dmaAddress[0], "AI"); auto l = s16(data >> 16); auto r = s16(data >> 0); left = l / 32768.0; @@ -50,8 +50,9 @@ auto AI::sample(f64& left, f64& right) -> void { } if(!io.dmaLength[0]) { if(--io.dmaCount) { - io.dmaAddress[0] = io.dmaAddress[1]; - io.dmaLength [0] = io.dmaLength [1]; + io.dmaAddress[0] = io.dmaAddress[1]; + io.dmaLength [0] = io.dmaLength [1]; + io.dmaOriginPc[0] = io.dmaOriginPc[1]; mi.raise(MI::IRQ::AI); } } diff --git a/waterbox/ares64/ares/ares/n64/ai/ai.hpp b/waterbox/ares64/ares/ares/n64/ai/ai.hpp old mode 100644 new mode 100755 index aee1602da8..e6ff587e52 --- a/waterbox/ares64/ares/ares/n64/ai/ai.hpp +++ b/waterbox/ares64/ares/ares/n64/ai/ai.hpp @@ -38,6 +38,7 @@ struct AI : Thread, Memory::RCP { n1 dmaAddressCarry; n18 dmaLength[2]; n2 dmaCount; + u64 dmaOriginPc[2]; n14 dacRate; n4 bitRate; } io; diff --git a/waterbox/ares64/ares/ares/n64/ai/debugger.cpp b/waterbox/ares64/ares/ares/n64/ai/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/ai/io.cpp b/waterbox/ares64/ares/ares/n64/ai/io.cpp old mode 100644 new mode 100755 index d72a3ef408..ce4694685b --- a/waterbox/ares64/ares/ares/n64/ai/io.cpp +++ b/waterbox/ares64/ares/ares/n64/ai/io.cpp @@ -1,5 +1,5 @@ auto AI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address != 3) { @@ -22,7 +22,7 @@ auto AI::readWord(u32 address, Thread& thread) -> u32 { } auto AI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { @@ -38,6 +38,7 @@ auto AI::writeWord(u32 address, u32 data_, Thread& thread) -> void { if(io.dmaCount < 2) { if(io.dmaCount == 0) mi.raise(MI::IRQ::AI); io.dmaLength[io.dmaCount] = length; + io.dmaOriginPc[io.dmaCount] = cpu.ipu.pc; io.dmaCount++; } } diff --git a/waterbox/ares64/ares/ares/n64/ai/serialization.cpp b/waterbox/ares64/ares/ares/n64/ai/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cartridge/cartridge.cpp b/waterbox/ares64/ares/ares/n64/cartridge/cartridge.cpp old mode 100644 new mode 100755 index 9826499ec4..14a1f78804 --- a/waterbox/ares64/ares/ares/n64/cartridge/cartridge.cpp +++ b/waterbox/ares64/ares/ares/n64/cartridge/cartridge.cpp @@ -47,7 +47,12 @@ auto Cartridge::connect() -> void { rtc.load(); - isviewer.ram.allocate(64_KiB); + if(rom.size <= 0x03fe'ffff) { + isviewer.ram.allocate(64_KiB); + isviewer.tracer = node->append("ISViewer", "Cartridge"); + isviewer.tracer->setAutoLineBreak(false); + isviewer.tracer->setTerminal(true); + } debugger.load(node); diff --git a/waterbox/ares64/ares/ares/n64/cartridge/cartridge.hpp b/waterbox/ares64/ares/ares/n64/cartridge/cartridge.hpp old mode 100644 new mode 100755 index 22825ba5e3..9efbf30a4a --- a/waterbox/ares64/ares/ares/n64/cartridge/cartridge.hpp +++ b/waterbox/ares64/ares/ares/n64/cartridge/cartridge.hpp @@ -40,8 +40,12 @@ struct Cartridge { } flash; struct ISViewer : Memory::PI { Memory::Writable ram; //unserialized + Node::Debugger::Tracer::Notification tracer; + + auto enabled() -> bool { return ram.size; } //isviewer.cpp + auto messageChar(char c) -> void; auto readHalf(u32 address) -> u16; auto writeHalf(u32 address, u16 data) -> void; auto readWord(u32 address) -> u32; diff --git a/waterbox/ares64/ares/ares/n64/cartridge/debugger.cpp b/waterbox/ares64/ares/ares/n64/cartridge/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cartridge/flash.cpp b/waterbox/ares64/ares/ares/n64/cartridge/flash.cpp old mode 100644 new mode 100755 index cfcbe2bf72..32402929d3 --- a/waterbox/ares64/ares/ares/n64/cartridge/flash.cpp +++ b/waterbox/ares64/ares/ares/n64/cartridge/flash.cpp @@ -85,7 +85,8 @@ auto Cartridge::Flash::writeWord(u32 address, u64 data) -> void { } if(mode == Mode::Write) { for(u32 index = 0; index < 128; index += 2) { - u16 half = rdram.ram.read(source + index); + // FIXME: this is obviously wrong, the flash can't access RDRAM + u16 half = rdram.ram.read(source + index, "Flash"); Memory::Writable::write(offset + index, half); } } diff --git a/waterbox/ares64/ares/ares/n64/cartridge/isviewer.cpp b/waterbox/ares64/ares/ares/n64/cartridge/isviewer.cpp old mode 100644 new mode 100755 index f7df89abfa..bb38b3e74d --- a/waterbox/ares64/ares/ares/n64/cartridge/isviewer.cpp +++ b/waterbox/ares64/ares/ares/n64/cartridge/isviewer.cpp @@ -8,6 +8,11 @@ auto Cartridge::ISViewer::readWord(u32 address) -> u32 { return ram.read(address); } +auto Cartridge::ISViewer::messageChar(char c) -> void { + if(!tracer->enabled()) return; + tracer->notify(c); +} + auto Cartridge::ISViewer::writeHalf(u32 address, u16 data) -> void { address = (address & 0xffff); @@ -23,7 +28,7 @@ auto Cartridge::ISViewer::writeHalf(u32 address, u16 data) -> void { // functional. for(auto address : range(data)) { char c = ram.read(0x20 + address); - fputc(c, stdout); + messageChar(c); } return; } diff --git a/waterbox/ares64/ares/ares/n64/cartridge/joybus.cpp b/waterbox/ares64/ares/ares/n64/cartridge/joybus.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cartridge/rtc.cpp b/waterbox/ares64/ares/ares/n64/cartridge/rtc.cpp old mode 100644 new mode 100755 index 66530fa593..3045949181 --- a/waterbox/ares64/ares/ares/n64/cartridge/rtc.cpp +++ b/waterbox/ares64/ares/ares/n64/cartridge/rtc.cpp @@ -1,4 +1,3 @@ - auto Cartridge::RTC::power(bool reset) -> void { if(present) run(!status.bit(7)); } @@ -11,8 +10,16 @@ auto Cartridge::RTC::load() -> void { present = 1; n64 timestamp = ram.read(24); if(!~timestamp) { - ram.fill(0); - ram.write(21, 1); + time_t t = (time_t)0; + struct tm tmm = *gmtime(&t); + ram.write(16, BCD::encode(tmm.tm_sec)); + ram.write(17, BCD::encode(tmm.tm_min)); + ram.write(18, BCD::encode(tmm.tm_hour) | 0x80); + ram.write(19, BCD::encode(tmm.tm_mday)); + ram.write(20, BCD::encode(tmm.tm_wday)); + ram.write(21, BCD::encode(tmm.tm_mon + 1)); + ram.write(22, BCD::encode(tmm.tm_year % 100)); + ram.write(23, BCD::encode(tmm.tm_year / 100)); } timestamp = platform->time() - timestamp; @@ -45,26 +52,42 @@ auto Cartridge::RTC::running() -> bool { } auto Cartridge::RTC::advance(int nsec) -> void { - struct tm tmm = {}; - tmm.tm_sec = BCD::decode(ram.read(16)); - tmm.tm_min = BCD::decode(ram.read(17)); - tmm.tm_hour = BCD::decode(ram.read(18) & 0x7f); - tmm.tm_mday = BCD::decode(ram.read(19)); - tmm.tm_mon = BCD::decode(ram.read(21)) - 1; - tmm.tm_year = BCD::decode(ram.read(22)) + 100 * BCD::decode(ram.read(23)); - time_t t = mktime(&tmm); + auto seconds = BCD::decode(ram.read(16)); + auto minutes = BCD::decode(ram.read(17)); + auto hours = BCD::decode(ram.read(18) & 0x7f); + auto day = BCD::decode(ram.read(19)); + auto wday = BCD::decode(ram.read(20)); + auto month = BCD::decode(ram.read(21)); + auto year = BCD::decode(ram.read(22)) + 100 * BCD::decode(ram.read(23)); - t += nsec; + while(nsec--) { + if(++seconds == 60) { + seconds = 0; + if(++minutes == 60) { + minutes = 0; + if(++hours == 24) { + hours = 0; + if(++wday == 7) wday = 0; + if(++day > chrono::daysInMonth(month, year)) { + day = 1; + if(++month == 13) { + month = 1; + year++; + } + } + } + } + } + } - tmm = *localtime(&t); - ram.write(16, BCD::encode(tmm.tm_sec)); - ram.write(17, BCD::encode(tmm.tm_min)); - ram.write(18, BCD::encode(tmm.tm_hour) | 0x80); - ram.write(19, BCD::encode(tmm.tm_mday)); - ram.write(20, BCD::encode(tmm.tm_wday)); - ram.write(21, BCD::encode(tmm.tm_mon + 1)); - ram.write(22, BCD::encode(tmm.tm_year % 100)); - ram.write(23, BCD::encode(tmm.tm_year / 100)); + ram.write(16, BCD::encode(seconds)); + ram.write(17, BCD::encode(minutes)); + ram.write(18, BCD::encode(hours) | 0x80); + ram.write(19, BCD::encode(day)); + ram.write(20, BCD::encode(wday)); + ram.write(21, BCD::encode(month)); + ram.write(22, BCD::encode(year % 100)); + ram.write(23, BCD::encode(year / 100)); } auto Cartridge::RTC::read(u2 block, n8* data) -> void { diff --git a/waterbox/ares64/ares/ares/n64/cartridge/serialization.cpp b/waterbox/ares64/ares/ares/n64/cartridge/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cartridge/slot.cpp b/waterbox/ares64/ares/ares/n64/cartridge/slot.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cartridge/slot.hpp b/waterbox/ares64/ares/ares/n64/cartridge/slot.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cic/cic.cpp b/waterbox/ares64/ares/ares/n64/cic/cic.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cic/cic.hpp b/waterbox/ares64/ares/ares/n64/cic/cic.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cic/commands.cpp b/waterbox/ares64/ares/ares/n64/cic/commands.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cic/io.cpp b/waterbox/ares64/ares/ares/n64/cic/io.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cic/serialization.cpp b/waterbox/ares64/ares/ares/n64/cic/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/controller.cpp b/waterbox/ares64/ares/ares/n64/controller/controller.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/controller.hpp b/waterbox/ares64/ares/ares/n64/controller/controller.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.cpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.cpp old mode 100644 new mode 100755 index 837cb588d0..f3c96424c8 --- a/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.cpp +++ b/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.cpp @@ -8,7 +8,7 @@ Gamepad::Gamepad(Node::Port parent) { port->setAllocate([&](auto name) { return allocate(name); }); port->setConnect([&] { return connect(); }); port->setDisconnect([&] { return disconnect(); }); - port->setSupported({"Controller Pak", "Rumble Pak"}); + port->setSupported({"Controller Pak", "Rumble Pak", "Transfer Pak"}); x = node->append ("X-Axis"); y = node->append ("Y-Axis"); @@ -166,9 +166,7 @@ auto Gamepad::comm(n8 send, n8 recv, n8 input[], n8 output[]) -> n2 { if(transferPak) { u16 address = (input[1] << 8 | input[2] << 0) & ~31; if(pif.addressCRC(address) == (n5)input[2]) { - for(u32 index : range(recv - 1)) { - output[index] = transferPak.read(address++); - } + for(u32 index : range(recv - 1)) output[index] = transferPak.read(address++); output[recv - 1] = pif.dataCRC({&output[0], recv - 1u}); valid = 1; } diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/gamepad.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc1.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc1.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc3.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc3.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc5.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/mbc/mbc5.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/gamepad/transfer-pak.hpp b/waterbox/ares64/ares/ares/n64/controller/gamepad/transfer-pak.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/mouse/mouse.cpp b/waterbox/ares64/ares/ares/n64/controller/mouse/mouse.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/mouse/mouse.hpp b/waterbox/ares64/ares/ares/n64/controller/mouse/mouse.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/port.cpp b/waterbox/ares64/ares/ares/n64/controller/port.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/controller/port.hpp b/waterbox/ares64/ares/ares/n64/controller/port.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/algorithms.cpp b/waterbox/ares64/ares/ares/n64/cpu/algorithms.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/context.cpp b/waterbox/ares64/ares/ares/n64/cpu/context.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/cpu.cpp b/waterbox/ares64/ares/ares/n64/cpu/cpu.cpp old mode 100644 new mode 100755 index 7bb06317ff..0994f4a1d1 --- a/waterbox/ares64/ares/ares/n64/cpu/cpu.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/cpu.cpp @@ -1,4 +1,5 @@ #include +#include namespace ares::Nintendo64 { @@ -63,7 +64,7 @@ auto CPU::synchronize() -> void { case Queue::SI_DMA_Write: return si.dmaWrite(); case Queue::SI_BUS_Write: return si.writeFinished(); case Queue::RTC_Tick: return cartridge.rtc.tick(); - case Queue::DD_Clock_Tick: return dd.rtcTickClock(); + case Queue::DD_Clock_Tick: return dd.rtc.tickClock(); case Queue::DD_MECHA_Response: return dd.mechaResponse(); case Queue::DD_BM_Request: return dd.bmRequest(); case Queue::DD_Motor_Mode: return dd.motorChange(); @@ -90,6 +91,10 @@ auto CPU::instruction() -> void { step(1 * 2); return exception.nmi(); } + if (scc.sysadFrozen) { + step(1 * 2); + return; + } if constexpr(Accuracy::CPU::Recompiler) { // Fast path: attempt to lookup previously compiled blocks with devirtualizeFast @@ -104,26 +109,30 @@ auto CPU::instruction() -> void { } if (auto address = devirtualize(ipu.pc)) { - auto block = recompiler.block(ipu.pc, *address); + auto block = recompiler.block(ipu.pc, *address, false); block->execute(*this); } } if constexpr(Accuracy::CPU::Interpreter) { - pipeline.address = ipu.pc; auto data = fetch(ipu.pc); if (!data) return; - pipeline.instruction = *data; - debugger.instruction(); + instructionPrologue(*data); decoderEXECUTE(); instructionEpilogue(); } } +auto CPU::instructionPrologue(u32 instruction) -> void { + pipeline.address = ipu.pc; + pipeline.instruction = instruction; + debugger.instruction(); +} + auto CPU::instructionEpilogue() -> s32 { if constexpr(Accuracy::CPU::Recompiler) { //simulates timings without performing actual icache loads - icache.step(ipu.pc, devirtualizeFast(ipu.pc)); + icache.step(ipu.pc, devirtualizeFast(ipu.pc)); } ipu.r[0].u64 = 0; @@ -168,9 +177,7 @@ auto CPU::power(bool reset) -> void { if constexpr(Accuracy::CPU::Recompiler) { auto buffer = ares::Memory::FixedAllocator::get().tryAcquire(4_MiB); - memory::jitprotect(false); - recompiler.allocator.resize(4_MiB, bump_allocator::executable | bump_allocator::zero_fill, buffer); - memory::jitprotect(true); + recompiler.allocator.resize(4_MiB, bump_allocator::executable, buffer); recompiler.reset(); } } diff --git a/waterbox/ares64/ares/ares/n64/cpu/cpu.hpp b/waterbox/ares64/ares/ares/n64/cpu/cpu.hpp old mode 100644 new mode 100755 index 82ba1fdc81..6abad3678c --- a/waterbox/ares64/ares/ares/n64/cpu/cpu.hpp +++ b/waterbox/ares64/ares/ares/n64/cpu/cpu.hpp @@ -36,6 +36,7 @@ struct CPU : Thread { auto synchronize() -> void; auto instruction() -> void; + auto instructionPrologue(u32 instruction) -> void; auto instructionEpilogue() -> s32; auto power(bool reset) -> void; @@ -147,26 +148,12 @@ struct CPU : Thread { cpu.step(48 * 2); valid = 1; tag = address & ~0x0000'0fff; - words[0] = cpu.busRead(tag | index | 0x00); - words[1] = cpu.busRead(tag | index | 0x04); - words[2] = cpu.busRead(tag | index | 0x08); - words[3] = cpu.busRead(tag | index | 0x0c); - words[4] = cpu.busRead(tag | index | 0x10); - words[5] = cpu.busRead(tag | index | 0x14); - words[6] = cpu.busRead(tag | index | 0x18); - words[7] = cpu.busRead(tag | index | 0x1c); + cpu.busReadBurst(tag | index, words); } auto writeBack(CPU& cpu) -> void { cpu.step(48 * 2); - cpu.busWrite(tag | index | 0x00, words[0]); - cpu.busWrite(tag | index | 0x04, words[1]); - cpu.busWrite(tag | index | 0x08, words[2]); - cpu.busWrite(tag | index | 0x0c, words[3]); - cpu.busWrite(tag | index | 0x10, words[4]); - cpu.busWrite(tag | index | 0x14, words[5]); - cpu.busWrite(tag | index | 0x18, words[6]); - cpu.busWrite(tag | index | 0x1c, words[7]); + cpu.busWriteBurst(tag | index, words); } auto read(u32 address) const -> u32 { return words[address >> 2 & 7]; } @@ -186,19 +173,22 @@ struct CPU : Thread { template auto write(u32 vaddr, u32 address, u64 data) -> void; auto power(bool reset) -> void; + auto readDebug(u32 vaddr, u32 address) -> u8; + //8KB struct Line { auto hit(u32 address) const -> bool; - template auto fill(u32 address, u64 data) -> void; auto fill(u32 address) -> void; auto writeBack() -> void; template auto read(u32 address) const -> u64; template auto write(u32 address, u64 data) -> void; bool valid; - bool dirty; + u16 dirty; u32 tag; u16 index; + u64 fillPc; + u64 dirtyPc; union { u8 bytes[16]; u16 halfs[8]; @@ -242,11 +232,12 @@ struct CPU : Thread { } entry[TLB::Entries]; //tlb.cpp - auto load(u64 vaddr) -> Match; - auto load(u64 vaddr, const Entry& entry) -> Match; + auto load(u64 vaddr, bool noExceptions = false) -> Match; + auto load(u64 vaddr, const Entry& entry, bool noExceptions = false) -> maybe; + auto loadFast(u64 vaddr) -> Match; auto store(u64 vaddr) -> Match; - auto store(u64 vaddr, const Entry& entry) -> Match; + auto store(u64 vaddr, const Entry& entry) -> maybe; struct TlbCache { ; static constexpr int entries = 4; @@ -292,15 +283,20 @@ struct CPU : Thread { auto segment(u64 vaddr) -> Context::Segment; auto devirtualize(u64 vaddr) -> maybe; alwaysinline auto devirtualizeFast(u64 vaddr) -> u64; + auto devirtualizeDebug(u64 vaddr) -> u64; auto fetch(u64 vaddr) -> maybe; template auto busWrite(u32 address, u64 data) -> void; template auto busRead(u32 address) -> u64; + template auto busWriteBurst(u32 address, u32 *data) -> void; + template auto busReadBurst(u32 address, u32 *data) -> void; template auto read(u64 vaddr) -> maybe; template auto write(u64 vaddr, u64 data, bool alignedError=true) -> bool; template auto vaddrAlignedError(u64 vaddr, bool write) -> bool; auto addressException(u64 vaddr) -> void; + auto readDebug(u64 vaddr) -> u8; + //serialization.cpp auto serialize(serializer&) -> void; @@ -631,6 +627,7 @@ struct CPU : Thread { //other n64 latch; n1 nmiPending; + n1 sysadFrozen; } scc; //interpreter-scc.cpp @@ -655,7 +652,7 @@ struct CPU : Thread { struct Coprocessor { static constexpr u8 revision = 0x00; - static constexpr u8 implementation = 0x0b; + static constexpr u8 implementation = 0x0a; } coprocessor; struct ControlStatus { @@ -690,7 +687,9 @@ struct CPU : Thread { //interpreter-fpu.cpp float_env fenv; - template auto fgr(u32) -> T&; + template auto fgr_t(u32) -> T&; + template auto fgr_s(u32) -> T&; + template auto fgr_d(u32) -> T&; auto getControlRegisterFPU(n5) -> u32; auto setControlRegisterFPU(n5, n32) -> void; template auto checkFPUExceptions() -> bool; @@ -701,8 +700,10 @@ struct CPU : Thread { auto fpeInvalidOperation() -> bool; auto fpeUnimplemented() -> bool; auto fpuCheckStart() -> bool; - auto fpuCheckInput(f32& f) -> bool; - auto fpuCheckInput(f64& f) -> bool; + template + auto fpuCheckInput(T& f) -> bool; + template + auto fpuCheckInputs(T& f1, T& f2) -> bool; auto fpuCheckOutput(f32& f) -> bool; auto fpuCheckOutput(f64& f) -> bool; auto fpuClearCause() -> void; @@ -894,10 +895,10 @@ struct CPU : Thread { } auto pool(u32 address) -> Pool*; - auto block(u32 vaddr, u32 address) -> Block*; + auto block(u32 vaddr, u32 address, bool singleInstruction = false) -> Block*; auto fastFetchBlock(u32 address) -> Block*; - auto emit(u32 vaddr, u32 address) -> Block*; + auto emit(u32 vaddr, u32 address, bool singleInstruction = false) -> Block*; auto emitEXECUTE(u32 instruction) -> bool; auto emitSPECIAL(u32 instruction) -> bool; auto emitREGIMM(u32 instruction) -> bool; @@ -905,6 +906,7 @@ struct CPU : Thread { auto emitFPU(u32 instruction) -> bool; auto emitCOP2(u32 instruction) -> bool; + bool callInstructionPrologue = false; bump_allocator allocator; Pool* pools[1 << 21]; //2_MiB * sizeof(void*) == 16_MiB } recompiler{*this}; diff --git a/waterbox/ares64/ares/ares/n64/cpu/dcache.cpp b/waterbox/ares64/ares/ares/n64/cpu/dcache.cpp old mode 100644 new mode 100755 index 5fa69aa3d3..96befd01c7 --- a/waterbox/ares64/ares/ares/n64/cpu/dcache.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/dcache.cpp @@ -2,63 +2,19 @@ auto CPU::DataCache::Line::hit(u32 address) const -> bool { return valid && tag == (address & ~0x0000'0fff); } -template auto CPU::DataCache::Line::fill(u32 address, u64 data) -> void { - cpu.step(40 * 2); - valid = 1; - dirty = 1; - tag = address & ~0x0000'0fff; - //read words according to critical doubleword first scheme - switch(address & 8) { - case 0: - if constexpr(Size != Dual) { - words[0] = cpu.busRead(tag | index | 0x0); - words[1] = cpu.busRead(tag | index | 0x4); - } - write(address, data); - words[2] = cpu.busRead(tag | index | 0x8); - words[3] = cpu.busRead(tag | index | 0xc); - break; - case 8: - if constexpr(Size != Dual) { - words[2] = cpu.busRead(tag | index | 0x8); - words[3] = cpu.busRead(tag | index | 0xc); - } - write(address, data); - words[0] = cpu.busRead(tag | index | 0x0); - words[1] = cpu.busRead(tag | index | 0x4); - break; - } -} - auto CPU::DataCache::Line::fill(u32 address) -> void { cpu.step(40 * 2); - valid = 1; - dirty = 0; - tag = address & ~0x0000'0fff; - //read words according to critical doubleword first scheme - switch(address & 8) { - case 0: - words[0] = cpu.busRead(tag | index | 0x0); - words[1] = cpu.busRead(tag | index | 0x4); - words[2] = cpu.busRead(tag | index | 0x8); - words[3] = cpu.busRead(tag | index | 0xc); - break; - case 8: - words[2] = cpu.busRead(tag | index | 0x8); - words[3] = cpu.busRead(tag | index | 0xc); - words[0] = cpu.busRead(tag | index | 0x0); - words[1] = cpu.busRead(tag | index | 0x4); - break; - } + valid = 1; + dirty = 0; + tag = address & ~0x0000'0fff; + fillPc = cpu.ipu.pc; + cpu.busReadBurst(tag | index, words); } auto CPU::DataCache::Line::writeBack() -> void { cpu.step(40 * 2); dirty = 0; - cpu.busWrite(tag | index | 0x0, words[0]); - cpu.busWrite(tag | index | 0x4, words[1]); - cpu.busWrite(tag | index | 0x8, words[2]); - cpu.busWrite(tag | index | 0xc, words[3]); + cpu.busWriteBurst(tag | index, words); } auto CPU::DataCache::line(u32 vaddr) -> Line& { @@ -86,7 +42,8 @@ auto CPU::DataCache::Line::write(u32 address, u64 data) -> void { words[address >> 2 & 2 | 0] = data >> 32; words[address >> 2 & 2 | 1] = data >> 0; } - dirty = 1; + dirty |= ((1 << Size) - 1) << (address & 0xF); + dirtyPc = cpu.ipu.pc; } template @@ -101,12 +58,21 @@ auto CPU::DataCache::read(u32 vaddr, u32 address) -> u64 { return line.read(address); } +auto CPU::DataCache::readDebug(u32 vaddr, u32 address) -> u8 { + auto& line = this->line(vaddr); + if(!line.hit(address)) { + Thread dummyThread{}; + return bus.read(address, dummyThread, "Ares Debugger"); + } + return line.read(address); +} + template auto CPU::DataCache::write(u32 vaddr, u32 address, u64 data) -> void { auto& line = this->line(vaddr); if(!line.hit(address)) { if(line.valid && line.dirty) line.writeBack(); - return line.fill(address, data); + line.fill(address); } else { cpu.step(1 * 2); } @@ -123,3 +89,6 @@ auto CPU::DataCache::power(bool reset) -> void { for(auto& word : line.words) word = 0; } } + +template +auto CPU::DataCache::Line::write(u32 address, u64 data) -> void; diff --git a/waterbox/ares64/ares/ares/n64/cpu/debugger.cpp b/waterbox/ares64/ares/ares/n64/cpu/debugger.cpp old mode 100644 new mode 100755 index dc284e5b15..3a061cc9d9 --- a/waterbox/ares64/ares/ares/n64/cpu/debugger.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/debugger.cpp @@ -2,6 +2,12 @@ auto CPU::Debugger::load(Node::Object parent) -> void { tracer.instruction = parent->append("Instruction", "CPU"); tracer.instruction->setAddressBits(64, 2); tracer.instruction->setDepth(64); + if constexpr(Accuracy::CPU::Recompiler) { + tracer.instruction->setToggle([&] { + cpu.recompiler.reset(); + cpu.recompiler.callInstructionPrologue = tracer.instruction->enabled(); + }); + } tracer.exception = parent->append("Exception", "CPU"); tracer.interrupt = parent->append("Interrupt", "CPU"); diff --git a/waterbox/ares64/ares/ares/n64/cpu/disassembler.cpp b/waterbox/ares64/ares/ares/n64/cpu/disassembler.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/exceptions.cpp b/waterbox/ares64/ares/ares/n64/cpu/exceptions.cpp old mode 100644 new mode 100755 index 310662f496..00189db5c1 --- a/waterbox/ares64/ares/ares/n64/cpu/exceptions.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/exceptions.cpp @@ -1,6 +1,11 @@ auto CPU::Exception::trigger(u32 code, u32 coprocessor, bool tlbMiss) -> void { self.debugger.exception(code); + if(code != 0) { + auto sig = (code == 2 || code == 3) ? GDB::Signal::SEGV : GDB::Signal::TRAP; + GDB::server.reportSignal(sig, self.ipu.pc); + } + u64 vectorBase = !self.scc.status.vectorLocation ? (s32)0x8000'0000 : (s32)0xbfc0'0200; u16 vectorOffset = 0x0180; diff --git a/waterbox/ares64/ares/ares/n64/cpu/interpreter-cop2.cpp b/waterbox/ares64/ares/ares/n64/cpu/interpreter-cop2.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/interpreter-fpu.cpp b/waterbox/ares64/ares/ares/n64/cpu/interpreter-fpu.cpp old mode 100644 new mode 100755 index 796d263606..5da902a278 --- a/waterbox/ares64/ares/ares/n64/cpu/interpreter-fpu.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/interpreter-fpu.cpp @@ -7,7 +7,7 @@ auto CPU::FPU::setFloatingPointMode(bool mode) -> void { } } -template<> auto CPU::fgr(u32 index) -> s32& { +template<> auto CPU::fgr_t(u32 index) -> s32& { if(scc.status.floatingPointMode) { return fpu.r[index].s32; } else if(index & 1) { @@ -17,21 +17,41 @@ template<> auto CPU::fgr(u32 index) -> s32& { } } -template<> auto CPU::fgr(u32 index) -> u32& { - return (u32&)fgr(index); +template<> auto CPU::fgr_s(u32 index) -> s32& { + if(scc.status.floatingPointMode) { + return fpu.r[index].s32; + } else { + return fpu.r[index & ~1].s32; + } } -template<> auto CPU::fgr(u32 index) -> f32& { +template<> auto CPU::fgr_d(u32 index) -> s32& { + fpu.r[index].s32h = 0; + return fpu.r[index].s32; +} + +template<> auto CPU::fgr_t(u32 index) -> u32& { + return (u32&)fgr_t(index); +} + +template<> auto CPU::fgr_t(u32 index) -> f32& { + return fpu.r[index].f32; +} + +template<> auto CPU::fgr_d(u32 index) -> f32& { + fpu.r[index].f32h = 0; + return fpu.r[index].f32; +} + +template<> auto CPU::fgr_s(u32 index) -> f32& { if(scc.status.floatingPointMode) { return fpu.r[index].f32; - } else if(index & 1) { - return fpu.r[index & ~1].f32h; } else { return fpu.r[index & ~1].f32; } } -template<> auto CPU::fgr(u32 index) -> s64& { +template<> auto CPU::fgr_t(u32 index) -> s64& { if(scc.status.floatingPointMode) { return fpu.r[index].s64; } else { @@ -39,11 +59,31 @@ template<> auto CPU::fgr(u32 index) -> s64& { } } -template<> auto CPU::fgr(u32 index) -> u64& { - return (u64&)fgr(index); +template<> auto CPU::fgr_d(u32 index) -> s64& { + return fpu.r[index].s64; } -template<> auto CPU::fgr(u32 index) -> f64& { +template<> auto CPU::fgr_s(u32 index) -> s64& { + return fgr_t(index); +} + +template<> auto CPU::fgr_t(u32 index) -> u64& { + return (u64&)fgr_t(index); +} + +template<> auto CPU::fgr_s(u32 index) -> u64& { + return fgr_t(index); +} + +template<> auto CPU::fgr_t(u32 index) -> f64& { + return fpu.r[index].f64; +} + +template<> auto CPU::fgr_d(u32 index) -> f64& { + return fgr_t(index); +} + +template<> auto CPU::fgr_s(u32 index) -> f64& { if(scc.status.floatingPointMode) { return fpu.r[index].f64; } else { @@ -210,8 +250,9 @@ auto CPU::checkFPUExceptions() -> bool { #define CHECK_FPE_IMPL(type, res, operation, convert) \ fenv.clearExcept(); \ - type res = [&]() noinline -> type { return operation; }(); \ - if (checkFPUExceptions()) return; + volatile type v##res = [&]() noinline -> type { return operation; }(); \ + if (checkFPUExceptions()) return; \ + type res = v##res; #define CHECK_FPE(type, res, operation) CHECK_FPE_IMPL(type, res, operation, false) #define CHECK_FPE_CONV(type, res, operation) CHECK_FPE_IMPL(type, res, operation, true) @@ -240,7 +281,9 @@ auto CPU::fpuCheckStart() -> bool { return true; } -auto CPU::fpuCheckInput(f32& f) -> bool { +template +auto CPU::fpuCheckInput(T& f) -> bool { + static_assert(std::is_same_v || std::is_same_v); switch (fpclassify(f)) { case FP_SUBNORMAL: if(fpeUnimplemented()) return exception.floatingPoint(), false; @@ -253,19 +296,23 @@ auto CPU::fpuCheckInput(f32& f) -> bool { return true; } -auto CPU::fpuCheckInput(f64& f) -> bool { - switch (fpclassify(f)) { - case FP_SUBNORMAL: +template +auto CPU::fpuCheckInputs(T& f1, T& f2) -> bool { + static_assert(std::is_same_v || std::is_same_v); + int cl1 = fpclassify(f1), cl2 = fpclassify(f2); + if((cl1 == FP_NAN && !qnan(f1)) || (cl2 == FP_NAN && !qnan(f2))) { if(fpeUnimplemented()) return exception.floatingPoint(), false; - return true; - case FP_NAN: - if(qnan(f) ? fpeInvalidOperation() : fpeUnimplemented()) - return exception.floatingPoint(), false; - return true; + } + if(cl1 == FP_SUBNORMAL || cl2 == FP_SUBNORMAL) { + if(fpeUnimplemented()) return exception.floatingPoint(), false; + } + if((cl1 == FP_NAN && qnan(f1)) || (cl2 == FP_NAN && qnan(f2))) { + if(fpeInvalidOperation()) return exception.floatingPoint(), false; } return true; } + template auto fpuFlushResult(T f, u32 roundMode) -> T { @@ -364,9 +411,9 @@ auto CPU::fpuCheckInputConv(f64& f) -> bool { } #define CF fpu.csr.compare -#define FD(type) fgr(fd) -#define FS(type) fgr(fs) -#define FT(type) fgr(ft) +#define FD(type) fgr_d(fd) +#define FS(type) fgr_s(fs) +#define FT(type) fgr_t(ft) auto CPU::BC1(bool value, bool likely, s16 imm) -> void { if(!fpuCheckStart()) return; @@ -416,8 +463,7 @@ auto CPU::FABS_D(u8 fd, u8 fs) -> void { auto CPU::FADD_S(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; f32 ffs = FS(f32), fft = FT(f32); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f32, ffd, FS(f32) + FT(f32)); if(!fpuCheckOutput(ffd)) return; FD(f32) = ffd; @@ -427,8 +473,7 @@ auto CPU::FADD_S(u8 fd, u8 fs, u8 ft) -> void { auto CPU::FADD_D(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f64), fft = FT(f64); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f64, ffd, ffs + fft); if(!fpuCheckOutput(ffd)) return; FD(f64) = ffd; @@ -758,8 +803,7 @@ auto CPU::FCVT_W_D(u8 fd, u8 fs) -> void { auto CPU::FDIV_S(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f32), fft = FT(f32); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f32, ffd, ffs / fft); if(!fpuCheckOutput(ffd)) return; FD(f32) = ffd; @@ -769,8 +813,7 @@ auto CPU::FDIV_S(u8 fd, u8 fs, u8 ft) -> void { auto CPU::FDIV_D(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f64), fft = FT(f64); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f64, ffd, ffs / fft); if(!fpuCheckOutput(ffd)) return; FD(f64) = ffd; @@ -814,8 +857,7 @@ auto CPU::FFLOOR_W_D(u8 fd, u8 fs) -> void { } auto CPU::FMOV_S(u8 fd, u8 fs) -> void { - if(!scc.status.enable.coprocessor1) return exception.coprocessor1(); - FD(f32) = FS(f32); + return FMOV_D(fd, fs); } auto CPU::FMOV_D(u8 fd, u8 fs) -> void { @@ -826,8 +868,7 @@ auto CPU::FMOV_D(u8 fd, u8 fs) -> void { auto CPU::FMUL_S(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f32), fft = FT(f32); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f32, ffd, ffs * fft); if(!fpuCheckOutput(ffd)) return; FD(f32) = ffd; @@ -837,8 +878,7 @@ auto CPU::FMUL_S(u8 fd, u8 fs, u8 ft) -> void { auto CPU::FMUL_D(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f64), fft = FT(f64); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f64, ffd, ffs * fft); if(!fpuCheckOutput(ffd)) return; FD(f64) = ffd; @@ -926,8 +966,7 @@ auto CPU::FSQRT_D(u8 fd, u8 fs) -> void { auto CPU::FSUB_S(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f32), fft = FT(f32); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f32, ffd, ffs - fft); if(!fpuCheckOutput(ffd)) return; FD(f32) = ffd; @@ -937,8 +976,7 @@ auto CPU::FSUB_S(u8 fd, u8 fs, u8 ft) -> void { auto CPU::FSUB_D(u8 fd, u8 fs, u8 ft) -> void { if(!fpuCheckStart()) return; auto ffs = FS(f64), fft = FT(f64); - if(!fpuCheckInput(ffs)) return; - if(!fpuCheckInput(fft)) return; + if(!fpuCheckInputs(ffs, fft)) return; CHECK_FPE(f64, ffd, ffs - fft); if(!fpuCheckOutput(ffd)) return; FD(f64) = ffd; @@ -995,14 +1033,14 @@ auto CPU::LWC1(u8 ft, cr64& rs, s16 imm) -> void { if(auto data = read(rs.u64 + imm)) FT(u32) = *data; } -auto CPU::MFC1(r64& rt, u8 fs) -> void { +auto CPU::MFC1(r64& rt, u8 ft) -> void { if(!scc.status.enable.coprocessor1) return exception.coprocessor1(); - rt.u64 = FS(s32); + rt.u64 = FT(s32); } -auto CPU::MTC1(cr64& rt, u8 fs) -> void { +auto CPU::MTC1(cr64& rt, u8 ft) -> void { if(!scc.status.enable.coprocessor1) return exception.coprocessor1(); - FS(s32) = rt.u32; + FT(s32) = rt.u32; } auto CPU::SDC1(u8 ft, cr64& rs, s16 imm) -> void { diff --git a/waterbox/ares64/ares/ares/n64/cpu/interpreter-ipu.cpp b/waterbox/ares64/ares/ares/n64/cpu/interpreter-ipu.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/interpreter-scc.cpp b/waterbox/ares64/ares/ares/n64/cpu/interpreter-scc.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/interpreter.cpp b/waterbox/ares64/ares/ares/n64/cpu/interpreter.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/cpu/memory.cpp b/waterbox/ares64/ares/ares/n64/cpu/memory.cpp old mode 100644 new mode 100755 index dc0d44ec3c..e319d26360 --- a/waterbox/ares64/ares/ares/n64/cpu/memory.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/memory.cpp @@ -140,14 +140,28 @@ auto CPU::devirtualizeFast(u64 vaddr) -> u64 { return devirtualizeCache.pbase = 0; } +auto CPU::devirtualizeDebug(u64 vaddr) -> u64 { + return devirtualizeFast(vaddr); // this wrapper preserves the inlining of 'devirtualizeFast' +} + template inline auto CPU::busWrite(u32 address, u64 data) -> void { - bus.write(address, data, *this); + bus.write(address, data, *this, "CPU"); +} + +template +inline auto CPU::busWriteBurst(u32 address, u32 *data) -> void { + bus.writeBurst(address, data, *this); } template inline auto CPU::busRead(u32 address) -> u64 { - return bus.read(address, *this); + return bus.read(address, *this, "CPU"); +} + +template +inline auto CPU::busReadBurst(u32 address, u32 *data) -> void { + return bus.readBurst(address, data, *this); } auto CPU::fetch(u64 vaddr) -> maybe { @@ -185,6 +199,8 @@ auto CPU::fetch(u64 vaddr) -> maybe { template auto CPU::read(u64 vaddr) -> maybe { if(vaddrAlignedError(vaddr, false)) return nothing; + GDB::server.reportMemRead(vaddr, Size); + switch(segment(vaddr)) { case Context::Segment::Unused: step(1 * 2); @@ -215,10 +231,37 @@ auto CPU::read(u64 vaddr) -> maybe { unreachable; } +auto CPU::readDebug(u64 vaddr) -> u8 { + Thread dummyThread{}; + + switch(segment(vaddr)) { + case Context::Segment::Unused: return 0; + case Context::Segment::Mapped: + if(auto match = tlb.load(vaddr, true)) { + if(match.cache) return dcache.readDebug(vaddr, match.address & context.physMask); + return bus.read(match.address & context.physMask, dummyThread, "Ares Debugger"); + } + return 0; + case Context::Segment::Cached: + return dcache.readDebug(vaddr, vaddr & 0x1fff'ffff); + case Context::Segment::Cached32: + return dcache.readDebug(vaddr, vaddr & 0xffff'ffff); + case Context::Segment::Direct: + return bus.read(vaddr & 0x1fff'ffff, dummyThread, "Ares Debugger"); + case Context::Segment::Direct32: + return bus.read(vaddr & 0xffff'ffff, dummyThread, "Ares Debugger"); + } + + unreachable; +} + template auto CPU::write(u64 vaddr0, u64 data, bool alignedError) -> bool { if(alignedError && vaddrAlignedError(vaddr0, true)) return false; u64 vaddr = vaddr0 & ~((u64)Size - 1); + + GDB::server.reportMemWrite(vaddr0, Size); + switch(segment(vaddr)) { case Context::Segment::Unused: step(1 * 2); diff --git a/waterbox/ares64/ares/ares/n64/cpu/recompiler.cpp b/waterbox/ares64/ares/ares/n64/cpu/recompiler.cpp old mode 100644 new mode 100755 index 030a2f0957..7c870ae0bc --- a/waterbox/ares64/ares/ares/n64/cpu/recompiler.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/recompiler.cpp @@ -1,12 +1,17 @@ auto CPU::Recompiler::pool(u32 address) -> Pool* { auto& pool = pools[address >> 8 & 0x1fffff]; - if(!pool) pool = (Pool*)allocator.acquire(sizeof(Pool)); + if(!pool) { + pool = (Pool*)allocator.acquire(sizeof(Pool)); + memory::jitprotect(false); + *pool = {}; + memory::jitprotect(true); + } return pool; } -auto CPU::Recompiler::block(u32 vaddr, u32 address) -> Block* { +auto CPU::Recompiler::block(u32 vaddr, u32 address, bool singleInstruction) -> Block* { if(auto block = pool(address)->blocks[address >> 2 & 0x3f]) return block; - auto block = emit(vaddr, address); + auto block = emit(vaddr, address, singleInstruction); pool(address)->blocks[address >> 2 & 0x3f] = block; memory::jitprotect(true); return block; @@ -18,12 +23,10 @@ auto CPU::Recompiler::fastFetchBlock(u32 address) -> Block* { return nullptr; } -auto CPU::Recompiler::emit(u32 vaddr, u32 address) -> Block* { +auto CPU::Recompiler::emit(u32 vaddr, u32 address, bool singleInstruction) -> Block* { if(unlikely(allocator.available() < 1_MiB)) { print("CPU allocator flush\n"); - memory::jitprotect(false); - allocator.release(bump_allocator::zero_fill); - memory::jitprotect(true); + allocator.release(); reset(); } @@ -33,7 +36,11 @@ auto CPU::Recompiler::emit(u32 vaddr, u32 address) -> Block* { Thread thread; bool hasBranched = 0; while(true) { - u32 instruction = bus.read(address, thread); + u32 instruction = bus.read(address, thread, "Ares Recompiler"); + if(callInstructionPrologue) { + mov32(reg(1), imm(instruction)); + call(&CPU::instructionPrologue); + } bool branched = emitEXECUTE(instruction); if(unlikely(instruction == 0x1000'ffff //beq 0,0, || instruction == (2 << 26 | vaddr >> 2 & 0x3ff'ffff))) { //j @@ -44,7 +51,7 @@ auto CPU::Recompiler::emit(u32 vaddr, u32 address) -> Block* { call(&CPU::instructionEpilogue); vaddr += 4; address += 4; - if(hasBranched || (address & 0xfc) == 0) break; //block boundary + if(hasBranched || (address & 0xfc) == 0 || singleInstruction) break; //block boundary hasBranched = branched; testJumpEpilog(); } diff --git a/waterbox/ares64/ares/ares/n64/cpu/serialization.cpp b/waterbox/ares64/ares/ares/n64/cpu/serialization.cpp old mode 100644 new mode 100755 index 48f9d03cfd..fc6880f582 --- a/waterbox/ares64/ares/ares/n64/cpu/serialization.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/serialization.cpp @@ -117,6 +117,7 @@ auto CPU::serialize(serializer& s) -> void { s(scc.epcError); s(scc.latch); s(scc.nmiPending); + s(scc.sysadFrozen); for(auto& r : fpu.r) s(r.u64); s(fpu.csr.roundMode); diff --git a/waterbox/ares64/ares/ares/n64/cpu/tlb.cpp b/waterbox/ares64/ares/ares/n64/cpu/tlb.cpp old mode 100644 new mode 100755 index 94fec4cfa9..d596179a09 --- a/waterbox/ares64/ares/ares/n64/cpu/tlb.cpp +++ b/waterbox/ares64/ares/ares/n64/cpu/tlb.cpp @@ -1,39 +1,40 @@ -auto CPU::TLB::load(u64 vaddr, const Entry& entry) -> Match { +auto CPU::TLB::load(u64 vaddr, const Entry& entry, bool noExceptions) -> maybe { + if(!entry.globals && entry.addressSpaceID != self.scc.tlb.addressSpaceID) return nothing; + if((vaddr & entry.addressMaskHi) != entry.virtualAddress) return nothing; + if(vaddr >> 62 != entry.region) return nothing; bool lo = vaddr & entry.addressSelect; if(!entry.valid[lo]) { + if(noExceptions)return Match{false}; + self.addressException(vaddr); self.debugger.tlbLoadInvalid(vaddr); self.exception.tlbLoadInvalid(); - return {false}; + return Match{false}; } physicalAddress = entry.physicalAddress[lo] + (vaddr & entry.addressMaskLo); self.debugger.tlbLoad(vaddr, physicalAddress); - return {true, entry.cacheAlgorithm[lo] != 2, physicalAddress}; + return Match{true, entry.cacheAlgorithm[lo] != 2, physicalAddress}; } -auto CPU::TLB::load(u64 vaddr) -> Match { +auto CPU::TLB::load(u64 vaddr, bool noExceptions) -> Match { for(auto& entry : this->tlbCache.entry) { if(!entry.entry) continue; - if(!entry.entry->globals && entry.entry->addressSpaceID != self.scc.tlb.addressSpaceID) continue; - if((vaddr & entry.entry->addressMaskHi) != entry.entry->virtualAddress) continue; - if(vaddr >> 62 != entry.entry->region) continue; - if(auto match = load(vaddr, *entry.entry)) { + if(auto match = load(vaddr, *entry.entry, noExceptions)) { entry.frequency++; - return match; + return *match; } } for(auto& entry : this->entry) { - if(!entry.globals && entry.addressSpaceID != self.scc.tlb.addressSpaceID) continue; - if((vaddr & entry.addressMaskHi) != entry.virtualAddress) continue; - if(vaddr >> 62 != entry.region) continue; - if(auto match = load(vaddr, entry)) { + if(auto match = load(vaddr, entry, noExceptions)) { this->tlbCache.insert(entry); - return match; + return *match; } } + if(noExceptions)return {false}; + self.addressException(vaddr); self.debugger.tlbLoadMiss(vaddr); self.exception.tlbLoadMiss(); @@ -56,46 +57,41 @@ auto CPU::TLB::loadFast(u64 vaddr) -> Match { return {false, 0, 0}; } -auto CPU::TLB::store(u64 vaddr, const Entry& entry) -> Match { +auto CPU::TLB::store(u64 vaddr, const Entry& entry) -> maybe { + if(!entry.globals && entry.addressSpaceID != self.scc.tlb.addressSpaceID) return nothing; + if((vaddr & entry.addressMaskHi) != entry.virtualAddress) return nothing; + if(vaddr >> 62 != entry.region) return nothing; bool lo = vaddr & entry.addressSelect; if(!entry.valid[lo]) { self.addressException(vaddr); self.debugger.tlbStoreInvalid(vaddr); self.exception.tlbStoreInvalid(); - return {false}; + return Match{false}; } if(!entry.dirty[lo]) { self.addressException(vaddr); self.debugger.tlbModification(vaddr); self.exception.tlbModification(); - return {false}; + return Match{false}; } physicalAddress = entry.physicalAddress[lo] + (vaddr & entry.addressMaskLo); self.debugger.tlbStore(vaddr, physicalAddress); - return {true, entry.cacheAlgorithm[lo] != 2, physicalAddress}; + return Match{true, entry.cacheAlgorithm[lo] != 2, physicalAddress}; } auto CPU::TLB::store(u64 vaddr) -> Match { for(auto& entry : this->tlbCache.entry) { if(!entry.entry) continue; - if(!entry.entry->globals && entry.entry->addressSpaceID != self.scc.tlb.addressSpaceID) continue; - if((vaddr & entry.entry->addressMaskHi) != entry.entry->virtualAddress) continue; - if(vaddr >> 62 != entry.entry->region) continue; - if(auto match = store(vaddr, *entry.entry)) { entry.frequency++; - return match; + return *match; } } for(auto& entry : this->entry) { - if(!entry.globals && entry.addressSpaceID != self.scc.tlb.addressSpaceID) continue; - if((vaddr & entry.addressMaskHi) != entry.virtualAddress) continue; - if(vaddr >> 62 != entry.region) continue; - if(auto match = store(vaddr, entry)) { this->tlbCache.insert(entry); - return match; + return *match; } } diff --git a/waterbox/ares64/ares/ares/n64/dd/controller.cpp b/waterbox/ares64/ares/ares/n64/dd/controller.cpp old mode 100644 new mode 100755 index aaa6384f4d..8c9810cd9c --- a/waterbox/ares64/ares/ares/n64/dd/controller.cpp +++ b/waterbox/ares64/ares/ares/n64/dd/controller.cpp @@ -144,22 +144,22 @@ auto DD::command(n16 command) -> void { } } break; case Command::SetRTCYearMonth: { - rtc.write(0, io.data); + rtc.ram.write(0, io.data); } break; case Command::SetRTCDayHour: { - rtc.write(2, io.data); + rtc.ram.write(2, io.data); } break; case Command::SetRTCMinuteSecond: { - rtc.write(4, io.data); + rtc.ram.write(4, io.data); } break; case Command::GetRTCYearMonth: { - io.data = rtc.read(0); + io.data = rtc.ram.read(0); } break; case Command::GetRTCDayHour: { - io.data = rtc.read(2); + io.data = rtc.ram.read(2); } break; case Command::GetRTCMinuteSecond: { - io.data = rtc.read(4); + io.data = rtc.ram.read(4); } break; case Command::SetLEDBlinkRate: { if (io.data.bit(24,31) != 0) ctl.ledOnTime = io.data.bit(24,31); @@ -187,7 +187,11 @@ auto DD::command(n16 command) -> void { auto DD::mechaResponse() -> void { if(state.seek) { state.seek = 0; - motorActive(); + if (io.status.diskPresent) { + motorActive(); + } else { + motorStop(); + } } io.status.busyState = 0; raise(IRQ::MECHA); diff --git a/waterbox/ares64/ares/ares/n64/dd/dd.cpp b/waterbox/ares64/ares/ares/n64/dd/dd.cpp old mode 100644 new mode 100755 index 316e53903e..76336b8646 --- a/waterbox/ares64/ares/ares/n64/dd/dd.cpp +++ b/waterbox/ares64/ares/ares/n64/dd/dd.cpp @@ -24,13 +24,14 @@ auto DD::load(Node::Object parent) -> void { c2s.allocate(0x400); ds.allocate(0x100); ms.allocate(0x40); - rtc.allocate(0x10); // TODO: Detect correct CIC from ipl rom if(auto fp = system.pak->read("64dd.ipl.rom")) { iplrom.load(fp); } + rtc.load(); + debugger.load(parent->append("Nintendo 64DD")); } @@ -79,9 +80,9 @@ auto DD::connect() -> void { if(auto fp = pak->read("program.disk")) { disk.allocate(fp->size()); disk.load(fp); + io.status.diskChanged = 1; + io.status.diskPresent = 1; } - - rtcLoad(); } auto DD::disconnect() -> void { @@ -89,7 +90,34 @@ auto DD::disconnect() -> void { save(); pak.reset(); + disk.reset(); information = {}; + + if(iplrom) { + string id; + id.append((char)iplrom.read(0x3b)); + id.append((char)iplrom.read(0x3c)); + id.append((char)iplrom.read(0x3d)); + id.append((char)iplrom.read(0x3e)); + if(id.match("NDDJ")) dd.information.cic = "CIC-NUS-8303"; + if(id.match("NDDE")) dd.information.cic = "CIC-NUS-DDUS"; + if(id.match("NDXJ")) dd.information.cic = "CIC-NUS-8401"; + } + + io.status.diskPresent = 0; + + //Deal with cases when the disk is removed while in use + if(io.status.busyState) { + //MECHA + io.status.mechaError = 1; + } + + if(io.bm.start) { + //BM + io.bm.start = 0; + io.bm.error = 1; + } + motorStop(); } auto DD::save() -> void { @@ -100,7 +128,7 @@ auto DD::save() -> void { } #endif - rtcSave(); + rtc.save(); } auto DD::power(bool reset) -> void { @@ -114,6 +142,9 @@ auto DD::power(bool reset) -> void { state = {}; io.status.resetState = 1; + io.status.diskChanged = 1; + if(disk) io.status.diskPresent = 1; + io.id = 3; if(dd.information.cic.match("CIC-NUS-8401")) io.id = 4; diff --git a/waterbox/ares64/ares/ares/n64/dd/dd.hpp b/waterbox/ares64/ares/ares/n64/dd/dd.hpp old mode 100644 new mode 100755 index d6b9f2a7e8..ff94407e74 --- a/waterbox/ares64/ares/ares/n64/dd/dd.hpp +++ b/waterbox/ares64/ares/ares/n64/dd/dd.hpp @@ -11,7 +11,6 @@ struct DD : Memory::PI
    { Memory::Writable c2s; Memory::Writable ds; Memory::Writable ms; - Memory::Writable rtc; Memory::Writable disk; Memory::Writable error; @@ -27,6 +26,21 @@ struct DD : Memory::PI
    { } tracer; } debugger; + struct RTC { + Memory::Writable ram; + + //rtc.cpp + auto load() -> void; + auto reset() -> void; + auto save() -> void; + auto serialize(serializer& s) -> void; + auto tick(u32 offset) -> void; + auto tickClock() -> void; + auto tickSecond() -> void; + auto valid() -> bool; + auto daysInMonth(u8 month, u8 year) -> u8; + } rtc; + auto title() const -> string { return information.title; } auto cic() const -> string { return information.cic; } @@ -59,13 +73,6 @@ struct DD : Memory::PI
    { auto motorStop() -> void; auto motorChange() -> void; - //rtc.cpp - auto rtcLoad() -> void; - auto rtcSave() -> void; - auto rtcTick(u32 offset) -> void; - auto rtcTickClock() -> void; - auto rtcTickSecond() -> void; - //io.cpp auto readHalf(u32 address) -> u16; auto writeHalf(u32 address, u16 data) -> void; @@ -125,6 +132,7 @@ private: n1 writeProtect; n1 mechaError; n1 diskChanged; + n1 diskPresent; } status; n16 currentTrack; diff --git a/waterbox/ares64/ares/ares/n64/dd/debugger.cpp b/waterbox/ares64/ares/ares/n64/dd/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/dd/drive.cpp b/waterbox/ares64/ares/ares/n64/dd/drive.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/dd/io.cpp b/waterbox/ares64/ares/ares/n64/dd/io.cpp old mode 100644 new mode 100755 index a85269edd9..6d8423f181 --- a/waterbox/ares64/ares/ares/n64/dd/io.cpp +++ b/waterbox/ares64/ares/ares/n64/dd/io.cpp @@ -20,7 +20,7 @@ auto DD::readHalf(u32 address) -> u16 { data.bit(4) = io.status.spindleMotorStopped; data.bit(6) = io.status.resetState; data.bit(7) = io.status.busyState; - data.bit(8) = (bool)disk; //disk present + data.bit(8) = io.status.diskPresent; data.bit(9) = irq.mecha.line; data.bit(10) = irq.bm.line; data.bit(11) = io.bm.error; @@ -57,7 +57,7 @@ auto DD::readHalf(u32 address) -> u16 { data.bit(0,7) = io.error.sector; data.bit(8) = io.error.selfStop; data.bit(9) = io.error.clockUnlock; - data.bit(10) = ~(bool)disk; //no disk + data.bit(10) = ~io.status.diskPresent; //no disk data.bit(11) = io.error.offTrack; data.bit(12) = io.error.overrun; data.bit(13) = io.error.spindle; @@ -123,7 +123,6 @@ auto DD::readHalf(u32 address) -> u16 { if(address == 36) { } - debugger.io(Read, address, data); return data; } @@ -195,7 +194,7 @@ auto DD::writeHalf(u32 address, u16 data_) -> void { //ASIC_HARD_RESET if(address == 16) { - if((data >> 16) == 0xAAAA) { + if(data == 0xAAAA) { power(true); } } @@ -242,18 +241,20 @@ auto DD::writeHalf(u32 address, u16 data_) -> void { //ASIC_TEST_PIN_SEL if(address == 36) { } - - debugger.io(Write, address, data); } auto DD::readWord(u32 address) -> u32 { + address = (address & 0x7f); n32 data; data.bit(16,31) = readHalf(address + 0); data.bit( 0,15) = readHalf(address + 2); + debugger.io(Read, address >> 2, data); return (u32)data; } auto DD::writeWord(u32 address, u32 data) -> void { + address = (address & 0x7f); writeHalf(address + 0, data >> 16); writeHalf(address + 2, data & 0xffff); + debugger.io(Write, address >> 2, data); } diff --git a/waterbox/ares64/ares/ares/n64/dd/rtc.cpp b/waterbox/ares64/ares/ares/n64/dd/rtc.cpp old mode 100644 new mode 100755 index 961a5a85ea..4fa2fea0a8 --- a/waterbox/ares64/ares/ares/n64/dd/rtc.cpp +++ b/waterbox/ares64/ares/ares/n64/dd/rtc.cpp @@ -1,75 +1,119 @@ -auto DD::rtcLoad() -> void { +auto DD::RTC::load() -> void { + ram.allocate(0x10); #if false if(auto fp = system.pak->read("time.rtc")) { - rtc.load(fp); + ram.load(fp); } #endif + //byte 0 to 7 = raw rtc time (last updated, only 6 bytes are used) n64 check = 0; - for(auto n : range(8)) check.byte(n) = rtc.read(n); + for(auto n : range(8)) check.byte(n) = ram.read(n); if(!~check) return; //new save file + //check for invalid time info, if invalid, set time info to something invalid and ignore the rest + if (!valid()) { + for(auto n : range(8)) ram.write(n, 0xff); + return; + } + + //byte 8 to 15 = timestamp of when the last save was made n64 timestamp = 0; - for(auto n : range(8)) timestamp.byte(n) = rtc.read(8 + n); + for(auto n : range(8)) timestamp.byte(n) = ram.read(8 + n); if(!~timestamp) return; //new save file + //update based on the amount of time that has passed since the last save timestamp = platform->time() - timestamp; - while(timestamp--) rtcTickSecond(); + while(timestamp--) tickSecond(); } -auto DD::rtcSave() -> void { - n64 timestamp = platform->time(); - for(auto n : range(8)) rtc.write(8 + n, timestamp.byte(n)); +auto DD::RTC::reset() -> void { + ram.reset(); +} +auto DD::RTC::save() -> void { #if false + n64 timestamp = platform->time(); + for(auto n : range(8)) ram.write(8 + n, timestamp.byte(n)); + if(auto fp = system.pak->write("time.rtc")) { - rtc.save(fp); + ram.save(fp); } #endif } -auto DD::rtcTick(u32 offset) -> void { - u8 n = rtc.read(offset); - if((++n & 0xf) > 9) n = (n & 0xf0) + 0x10; - if((n & 0xf0) > 0x90) n = 0; - rtc.write(offset, n); +auto DD::RTC::serialize(serializer& s) -> void { + s(ram); } -auto DD::rtcTickClock() -> void { - rtcTickSecond(); +auto DD::RTC::tick(u32 offset) -> void { + u8 n = ram.read(offset); + if((++n & 0xf) > 9) n = (n & 0xf0) + 0x10; + if((n & 0xf0) > 0x90) n = 0; + ram.write(offset, n); +} + +auto DD::RTC::tickClock() -> void { + tickSecond(); queue.remove(Queue::DD_Clock_Tick); queue.insert(Queue::DD_Clock_Tick, 187'500'000); } -auto DD::rtcTickSecond() -> void { +auto DD::RTC::tickSecond() -> void { + if (!valid()) return; + //second - rtcTick(5); - if(rtc.read(5) < 0x60) return; - rtc.write(5, 0); + tick(5); + if(ram.read(5) < 0x60) return; + ram.write(5, 0); //minute - rtcTick(4); - if(rtc.read(4) < 0x60) return; - rtc.write(4, 0); + tick(4); + if(ram.read(4) < 0x60) return; + ram.write(4, 0); //hour - rtcTick(3); - if(rtc.read(3) < 0x24) return; - rtc.write(3, 0); + tick(3); + if(ram.read(3) < 0x24) return; + ram.write(3, 0); //day - u32 daysInMonth[12] = {0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31}; - if(rtc.read(0) && !(BCD::decode(rtc.read(0)) % 4)) daysInMonth[1]++; - - rtcTick(2); - if(rtc.read(2) <= daysInMonth[BCD::decode(rtc.read(1))-1]) return; - rtc.write(2, 1); + tick(2); + if(ram.read(2) <= BCD::encode(chrono::daysInMonth(BCD::decode(ram.read(1)), BCD::decode(ram.read(0))))) return; + ram.write(2, 1); //month - rtcTick(1); - if(rtc.read(1) < 0x12) return; - rtc.write(1, 1); + tick(1); + if(ram.read(1) <= 0x12) return; + ram.write(1, 1); //year - rtcTick(0); + tick(0); } + +auto DD::RTC::valid() -> bool { + //check validity of ram rtc data (if it's BCD valid or not) + for(auto n : range(6)) { + if((ram.read(n) & 0x0f) >= 0x0a) return false; + } + + //check for valid values of each byte + //year + if(ram.read(0) >= 0xa0) return false; + //second + if(ram.read(5) >= 0x60) return false; + //minute + if(ram.read(4) >= 0x60) return false; + //hour + if(ram.read(3) >= 0x24) return false; + //month + if(ram.read(1) > 0x12) return false; + if(ram.read(1) < 1) return false; + //day + if(ram.read(2) < 1) return false; + if(ram.read(2) > BCD::encode(chrono::daysInMonth(BCD::decode(ram.read(1)), BCD::decode(ram.read(0))))) return false; + + //everything is valid + return true; +} + diff --git a/waterbox/ares64/ares/ares/n64/dd/serialization.cpp b/waterbox/ares64/ares/ares/n64/dd/serialization.cpp old mode 100644 new mode 100755 index f9047a15f6..0d5c8d41ed --- a/waterbox/ares64/ares/ares/n64/dd/serialization.cpp +++ b/waterbox/ares64/ares/ares/n64/dd/serialization.cpp @@ -1,4 +1,6 @@ auto DD::serialize(serializer& s) -> void { + s(rtc); + s(irq.bm.line); s(irq.bm.mask); s(irq.mecha.line); diff --git a/waterbox/ares64/ares/ares/n64/memory/bus.hpp b/waterbox/ares64/ares/ares/n64/memory/bus.hpp old mode 100644 new mode 100755 index bff5a4e093..61dd10a29f --- a/waterbox/ares64/ares/ares/n64/memory/bus.hpp +++ b/waterbox/ares64/ares/ares/n64/memory/bus.hpp @@ -1,13 +1,13 @@ template -inline auto Bus::read(u32 address, Thread& thread) -> u64 { - static constexpr u64 unmapped = 0; - address &= 0x1fff'ffff - (Size - 1); +inline auto Bus::read(u32 address, Thread& thread, const char *peripheral) -> u64 { + static_assert(Size == Byte || Size == Half || Size == Word || Size == Dual); - if(address <= 0x007f'ffff) return rdram.ram.read(address); - if(address <= 0x03ef'ffff) return unmapped; + if(address <= 0x03ef'ffff) return rdram.ram.read(address, peripheral); if(address <= 0x03ff'ffff) return rdram.read(address, thread); + if(Size == Dual) return freezeDualRead(address), 0; if(address <= 0x0407'ffff) return rsp.read(address, thread); - if(address <= 0x040f'ffff) return rsp.status.read(address, thread); + if(address <= 0x040b'ffff) return rsp.status.read(address, thread); + if(address <= 0x040f'ffff) return freezeUnmapped(address), 0; if(address <= 0x041f'ffff) return rdp.read(address, thread); if(address <= 0x042f'ffff) return rdp.io.read(address, thread); if(address <= 0x043f'ffff) return mi.read(address, thread); @@ -16,26 +16,49 @@ inline auto Bus::read(u32 address, Thread& thread) -> u64 { if(address <= 0x046f'ffff) return pi.read(address, thread); if(address <= 0x047f'ffff) return ri.read(address, thread); if(address <= 0x048f'ffff) return si.read(address, thread); - if(address <= 0x04ff'ffff) return unmapped; + if(address <= 0x04ff'ffff) return freezeUnmapped(address), 0; if(address <= 0x1fbf'ffff) return pi.read(address, thread); if(address <= 0x1fcf'ffff) return si.read(address, thread); if(address <= 0x7fff'ffff) return pi.read(address, thread); - return unmapped; + return freezeUnmapped(address), 0; } template -inline auto Bus::write(u32 address, u64 data, Thread& thread) -> void { - address &= 0x1fff'ffff - (Size - 1); +inline auto Bus::readBurst(u32 address, u32 *data, Thread& thread) -> void { + static_assert(Size == DCache || Size == ICache); + + if(address <= 0x03ef'ffff) return rdram.ram.readBurst(address, data, "CPU"); + if(address <= 0x03ff'ffff) { + // FIXME: not hardware validated, no idea of the behavior + data[0] = rdram.readWord(address | 0x0, thread); + data[1] = 0; + data[2] = 0; + data[3] = 0; + if constexpr(Size == ICache) { + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + } + return; + } + + return freezeUncached(address); +} + +template +inline auto Bus::write(u32 address, u64 data, Thread& thread, const char *peripheral) -> void { + static_assert(Size == Byte || Size == Half || Size == Word || Size == Dual); if constexpr(Accuracy::CPU::Recompiler) { cpu.recompiler.invalidate(address + 0); if constexpr(Size == Dual) cpu.recompiler.invalidate(address + 4); } - if(address <= 0x007f'ffff) return rdram.ram.write(address, data); - if(address <= 0x03ef'ffff) return; + if(address <= 0x03ef'ffff) return rdram.ram.write(address, data, peripheral); if(address <= 0x03ff'ffff) return rdram.write(address, data, thread); if(address <= 0x0407'ffff) return rsp.write(address, data, thread); - if(address <= 0x040f'ffff) return rsp.status.write(address, data, thread); + if(address <= 0x040b'ffff) return rsp.status.write(address, data, thread); + if(address <= 0x040f'ffff) return freezeUnmapped(address); if(address <= 0x041f'ffff) return rdp.write(address, data, thread); if(address <= 0x042f'ffff) return rdp.io.write(address, data, thread); if(address <= 0x043f'ffff) return mi.write(address, data, thread); @@ -44,9 +67,41 @@ inline auto Bus::write(u32 address, u64 data, Thread& thread) -> void { if(address <= 0x046f'ffff) return pi.write(address, data, thread); if(address <= 0x047f'ffff) return ri.write(address, data, thread); if(address <= 0x048f'ffff) return si.write(address, data, thread); - if(address <= 0x04ff'ffff) return; + if(address <= 0x04ff'ffff) return freezeUnmapped(address); if(address <= 0x1fbf'ffff) return pi.write(address, data, thread); if(address <= 0x1fcf'ffff) return si.write(address, data, thread); if(address <= 0x7fff'ffff) return pi.write(address, data, thread); - return; + return freezeUnmapped(address); +} + +template +inline auto Bus::writeBurst(u32 address, u32 *data, Thread& thread) -> void { + static_assert(Size == DCache || Size == ICache); + if constexpr(Accuracy::CPU::Recompiler) { + cpu.recompiler.invalidateRange(address, Size == DCache ? 16 : 32); + } + + if(address <= 0x03ef'ffff) return rdram.ram.writeBurst(address, data, "CPU"); + if(address <= 0x03ff'ffff) { + // FIXME: not hardware validated, but a good guess + rdram.writeWord(address | 0x0, data[0], thread); + return; + } + + return freezeUncached(address); +} + +inline auto Bus::freezeUnmapped(u32 address) -> void { + debug(unusual, "[Bus::freezeUnmapped] CPU frozen because of access to RCP unmapped area: 0x", hex(address, 8L)); + cpu.scc.sysadFrozen = true; +} + +inline auto Bus::freezeUncached(u32 address) -> void { + debug(unusual, "[Bus::freezeUncached] CPU frozen because of cached access to non-RDRAM area: 0x", hex(address, 8L)); + cpu.scc.sysadFrozen = true; +} + +inline auto Bus::freezeDualRead(u32 address) -> void { + debug(unusual, "[Bus::freezeDualRead] CPU frozen because of 64-bit read from non-RDRAM area: 0x ", hex(address, 8L)); + cpu.scc.sysadFrozen = true; } diff --git a/waterbox/ares64/ares/ares/n64/memory/io.hpp b/waterbox/ares64/ares/ares/n64/memory/io.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/memory/lsb/readable.hpp b/waterbox/ares64/ares/ares/n64/memory/lsb/readable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/memory/lsb/writable.hpp b/waterbox/ares64/ares/ares/n64/memory/lsb/writable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/memory/memory.cpp b/waterbox/ares64/ares/ares/n64/memory/memory.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/memory/memory.hpp b/waterbox/ares64/ares/ares/n64/memory/memory.hpp old mode 100644 new mode 100755 index f1ce23dcba..7206e3d067 --- a/waterbox/ares64/ares/ares/n64/memory/memory.hpp +++ b/waterbox/ares64/ares/ares/n64/memory/memory.hpp @@ -31,8 +31,15 @@ namespace Memory { struct Bus { //bus.hpp - template auto read(u32 address, Thread& thread) -> u64; - template auto write(u32 address, u64 data, Thread& thread) -> void; + template auto read(u32 address, Thread& thread, const char *peripheral) -> u64; + template auto write(u32 address, u64 data, Thread& thread, const char *peripheral) -> void; + + template auto readBurst(u32 address, u32* data, Thread& thread) -> void; + template auto writeBurst(u32 address, u32* data, Thread& thread) -> void; + + auto freezeUnmapped(u32 address) -> void; + auto freezeUncached(u32 address) -> void; + auto freezeDualRead(u32 address) -> void; }; extern Bus bus; diff --git a/waterbox/ares64/ares/ares/n64/memory/msb/readable.hpp b/waterbox/ares64/ares/ares/n64/memory/msb/readable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/memory/msb/writable.hpp b/waterbox/ares64/ares/ares/n64/memory/msb/writable.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/mi/debugger.cpp b/waterbox/ares64/ares/ares/n64/mi/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/mi/io.cpp b/waterbox/ares64/ares/ares/n64/mi/io.cpp old mode 100644 new mode 100755 index 9806d558d2..5555b0e2ea --- a/waterbox/ares64/ares/ares/n64/mi/io.cpp +++ b/waterbox/ares64/ares/ares/n64/mi/io.cpp @@ -1,5 +1,5 @@ auto MI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0xf) >> 2; n32 data; if(address == 0) { @@ -43,7 +43,7 @@ auto MI::readWord(u32 address, Thread& thread) -> u32 { } auto MI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0xf) >> 2; n32 data = data_; if(address == 0) { diff --git a/waterbox/ares64/ares/ares/n64/mi/mi.cpp b/waterbox/ares64/ares/ares/n64/mi/mi.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/mi/mi.hpp b/waterbox/ares64/ares/ares/n64/mi/mi.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/mi/serialization.cpp b/waterbox/ares64/ares/ares/n64/mi/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/n64.hpp b/waterbox/ares64/ares/ares/n64/n64.hpp old mode 100644 new mode 100755 index 7d579c69ef..d7d151a697 --- a/waterbox/ares64/ares/ares/n64/n64.hpp +++ b/waterbox/ares64/ares/ares/n64/n64.hpp @@ -23,13 +23,18 @@ using v128 = __m128i; #include #endif +// Include the GB core, we can use its cartridge emulation for Transfer Pak +#if defined(CORE_GB) +#include +#endif + namespace ares::Nintendo64 { auto enumerate() -> vector; auto load(Node::System& node, string name) -> bool; auto option(string name, string value) -> bool; enum : u32 { Read, Write }; - enum : u32 { Byte = 1, Half = 2, Word = 4, Dual = 8 }; + enum : u32 { Byte = 1, Half = 2, Word = 4, Dual = 8, DCache = 16, ICache = 32 }; struct Region { static inline auto NTSC() -> bool; @@ -91,8 +96,8 @@ namespace ares::Nintendo64 { #include #include #include - #include #include + #include #include #include #include diff --git a/waterbox/ares64/ares/ares/n64/pi/bus.hpp b/waterbox/ares64/ares/ares/n64/pi/bus.hpp old mode 100644 new mode 100755 index 4614edaedc..5473b833fb --- a/waterbox/ares64/ares/ares/n64/pi/bus.hpp +++ b/waterbox/ares64/ares/ares/n64/pi/bus.hpp @@ -2,11 +2,13 @@ inline auto PI::readWord(u32 address, Thread& thread) -> u32 { if(address <= 0x046f'ffff) return ioRead(address); if (unlikely(io.ioBusy)) { + debug(unusual, "[PI::readWord] PI read to 0x", hex(address, 8L), " will not behave as expected because PI writing is in progress"); thread.step(writeForceFinish() * 2); return io.busLatch; } thread.step(250 * 2); - return busRead(address); + io.busLatch = busRead(address); + return io.busLatch; } template @@ -42,13 +44,13 @@ inline auto PI::busRead(u32 address) -> u32 { if(cartridge.flash) return cartridge.flash.read(address); return unmapped; } - if(address <= 0x13fe'ffff) { - if(cartridge.rom ) return cartridge.rom.read(address); - return unmapped; + if(cartridge.isviewer.enabled() && address >= 0x13f0'0000 && address <= 0x13ff'ffff) { + return cartridge.isviewer.read(address); } - if(address <= 0x13ff'ffff) return cartridge.isviewer.read(address); - if(address <= 0x7fff'ffff) return unmapped; - return unmapped; //accesses here actually lock out the RCP + if(address <= 0x1000'0000 + cartridge.rom.size - 1) { + return cartridge.rom.read(address); + } + return unmapped; } inline auto PI::writeWord(u32 address, u32 data, Thread& thread) -> void { @@ -92,13 +94,16 @@ inline auto PI::busWrite(u32 address, u32 data) -> void { if(cartridge.flash) return cartridge.flash.write(address, data); return; } - if(address <= 0x13fe'ffff) { - if(cartridge.rom ) return cartridge.rom.write(address, data); - return; + if(address >= 0x13f0'0000 && address <= 0x13ff'ffff) { + if(cartridge.isviewer.enabled()) { + writeForceFinish(); //Debugging channel for homebrew, be gentle + return cartridge.isviewer.write(address, data); + } else { + debug(unhandled, "[PI::busWrite] attempt to write to ISViewer: ROM is too big so ISViewer is disabled"); + } } - if(address <= 0x13ff'ffff) { - writeForceFinish(); //Debugging channel for homebrew, be gentle - return cartridge.isviewer.write(address, data); + if(address <= 0x1000'0000 + cartridge.rom.size - 1) { + return cartridge.rom.write(address, data); } if(address <= 0x7fff'ffff) return; } diff --git a/waterbox/ares64/ares/ares/n64/pi/debugger.cpp b/waterbox/ares64/ares/ares/n64/pi/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pi/dma.cpp b/waterbox/ares64/ares/ares/n64/pi/dma.cpp old mode 100644 new mode 100755 index 4f3a5c9024..5640ac8347 --- a/waterbox/ares64/ares/ares/n64/pi/dma.cpp +++ b/waterbox/ares64/ares/ares/n64/pi/dma.cpp @@ -1,49 +1,52 @@ auto PI::dmaRead() -> void { io.readLength = (io.readLength | 1) + 1; + + u32 lastCacheline = 0xffff'ffff; for(u32 address = 0; address < io.readLength; address += 2) { - u16 data = rdram.ram.read(io.dramAddress + address); + u16 data = rdram.ram.read(io.dramAddress + address, "PI DMA"); busWrite(io.pbusAddress + address, data); } } auto PI::dmaWrite() -> void { u8 mem[128]; - bool first_block = true; i32 length = io.writeLength+1; + i32 maxBlockSize = 128; + bool firstBlock = true; - io.writeLength = 0x7F; - if (length <= 8) io.writeLength -= io.dramAddress&7; + if constexpr(Accuracy::CPU::Recompiler) { + cpu.recompiler.invalidateRange(io.dramAddress, (length + 1) & ~1); + } while (length > 0) { - u32 dest = io.dramAddress & 0x7FFFFE; - i32 misalign = dest & 7; - i32 block_len = 128 - misalign; - i32 cur_len = min(length, block_len); + i32 misalign = io.dramAddress & 7; + i32 distEndOfRow = 0x800-(io.dramAddress&0x7ff); + i32 blockLen = min(maxBlockSize-misalign, distEndOfRow); + i32 curLen = min(length, blockLen); - length -= cur_len; - if (length.bit(0)) length += 1; - - i32 rom_len = (cur_len + 1) & ~1; - for (u32 i = 0; i < rom_len; i += 2) { + for (int i=0; i(io.pbusAddress); - mem[i + 0] = data >> 8; - mem[i + 1] = data & 0xFF; + mem[i+0] = data >> 8; + mem[i+1] = data >> 0; io.pbusAddress += 2; + length -= 2; } - if (first_block) { - if (cur_len == block_len-1) cur_len++; - cur_len = max(cur_len-misalign, 0); + if (firstBlock && curLen < 127-misalign) { + for (i32 i = 0; i < curLen-misalign; i++) { + rdram.ram.write(io.dramAddress++, mem[i], "PI DMA"); + } + } else { + for (i32 i = 0; i < curLen-misalign; i+=2) { + rdram.ram.write(io.dramAddress++, mem[i+0], "PI DMA"); + rdram.ram.write(io.dramAddress++, mem[i+1], "PI DMA"); + } } - if constexpr(Accuracy::CPU::Recompiler) { - cpu.recompiler.invalidateRange(io.dramAddress, cur_len); - } - for (u32 i = 0; i < cur_len; i++) - rdram.ram.write(io.dramAddress++, mem[i]); io.dramAddress = (io.dramAddress + 7) & ~7; - - first_block = false; + io.writeLength = curLen <= 8 ? 127-misalign : 127; + firstBlock = false; + maxBlockSize = distEndOfRow < 8 ? 128-misalign : 128; } } diff --git a/waterbox/ares64/ares/ares/n64/pi/io.cpp b/waterbox/ares64/ares/ares/n64/pi/io.cpp old mode 100644 new mode 100755 index c131bf3a69..0884439b67 --- a/waterbox/ares64/ares/ares/n64/pi/io.cpp +++ b/waterbox/ares64/ares/ares/n64/pi/io.cpp @@ -1,5 +1,5 @@ auto PI::ioRead(u32 address) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data; if(address == 0) { @@ -70,12 +70,20 @@ auto PI::ioRead(u32 address) -> u32 { data.bit(0,7) = bsd2.releaseDuration; } + if(address == 13) { + data.bit(0,31) = io.busLatch; + } + + if(address == 14) { + data.bit(0,31) = io.busLatch; + } + debugger.io(Read, address, data); return data; } auto PI::ioWrite(u32 address, u32 data_) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data = data_; //only PI_STATUS can be written while PI is busy @@ -98,6 +106,7 @@ auto PI::ioWrite(u32 address, u32 data_) -> void { //PI_READ_LENGTH io.readLength = n24(data); io.dmaBusy = 1; + io.originPc = cpu.ipu.pc; queue.insert(Queue::PI_DMA_Read, dmaDuration(true)); dmaRead(); } @@ -106,6 +115,7 @@ auto PI::ioWrite(u32 address, u32 data_) -> void { //PI_WRITE_LENGTH io.writeLength = n24(data); io.dmaBusy = 1; + io.originPc = cpu.ipu.pc; queue.insert(Queue::PI_DMA_Write, dmaDuration(false)); dmaWrite(); } diff --git a/waterbox/ares64/ares/ares/n64/pi/pi.cpp b/waterbox/ares64/ares/ares/n64/pi/pi.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pi/pi.hpp b/waterbox/ares64/ares/ares/n64/pi/pi.hpp old mode 100644 new mode 100755 index 240f177dd6..e824d5d739 --- a/waterbox/ares64/ares/ares/n64/pi/pi.hpp +++ b/waterbox/ares64/ares/ares/n64/pi/pi.hpp @@ -51,6 +51,7 @@ struct PI : Memory::RCP { n32 readLength; n32 writeLength; n32 busLatch; + u64 originPc; } io; struct BSD { diff --git a/waterbox/ares64/ares/ares/n64/pi/serialization.cpp b/waterbox/ares64/ares/ares/n64/pi/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pif/debugger.cpp b/waterbox/ares64/ares/ares/n64/pif/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pif/hle.cpp b/waterbox/ares64/ares/ares/n64/pif/hle.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pif/io.cpp b/waterbox/ares64/ares/ares/n64/pif/io.cpp old mode 100644 new mode 100755 index 4d1ac5478f..0b472a199d --- a/waterbox/ares64/ares/ares/n64/pif/io.cpp +++ b/waterbox/ares64/ares/ares/n64/pif/io.cpp @@ -23,21 +23,23 @@ auto PIF::readWord(u32 address) -> u32 { auto PIF::writeWord(u32 address, u32 data) -> void { writeInt(address, data); - return intA(Write, Size4); + intA(Write, Size4); + mainHLE(); } auto PIF::dmaRead(u32 address, u32 ramAddress) -> void { intA(Read, Size64); for(u32 offset = 0; offset < 64; offset += 4) { u32 data = readInt(address + offset); - rdram.ram.write(ramAddress + offset, data); + rdram.ram.write(ramAddress + offset, data, "SI DMA"); } } auto PIF::dmaWrite(u32 address, u32 ramAddress) -> void { for(u32 offset = 0; offset < 64; offset += 4) { - u32 data = rdram.ram.read(ramAddress + offset); + u32 data = rdram.ram.read(ramAddress + offset, "SI DMA"); writeInt(address + offset, data); } intA(Write, Size64); + mainHLE(); } diff --git a/waterbox/ares64/ares/ares/n64/pif/pif.cpp b/waterbox/ares64/ares/ares/n64/pif/pif.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pif/pif.hpp b/waterbox/ares64/ares/ares/n64/pif/pif.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/pif/serialization.cpp b/waterbox/ares64/ares/ares/n64/pif/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdp/debugger.cpp b/waterbox/ares64/ares/ares/n64/rdp/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdp/io.cpp b/waterbox/ares64/ares/ares/n64/rdp/io.cpp old mode 100644 new mode 100755 index 992554bbc0..ead06fcde6 --- a/waterbox/ares64/ares/ares/n64/rdp/io.cpp +++ b/waterbox/ares64/ares/ares/n64/rdp/io.cpp @@ -1,5 +1,5 @@ auto RDP::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -57,7 +57,7 @@ auto RDP::readWord(u32 address, Thread& thread) -> u32 { } auto RDP::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/waterbox/ares64/ares/ares/n64/rdp/rdp.cpp b/waterbox/ares64/ares/ares/n64/rdp/rdp.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdp/rdp.hpp b/waterbox/ares64/ares/ares/n64/rdp/rdp.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdp/render.cpp b/waterbox/ares64/ares/ares/n64/rdp/render.cpp old mode 100644 new mode 100755 index 0495eb23f0..9ad19ea42f --- a/waterbox/ares64/ares/ares/n64/rdp/render.cpp +++ b/waterbox/ares64/ares/ares/n64/rdp/render.cpp @@ -57,7 +57,7 @@ auto RDP::render() -> void { command.current = command.end; return; - auto& memory = !command.source ? rdram.ram : rsp.dmem; + auto& memory = !command.source ? (Memory::Writable&)rdram.ram : (Memory::Writable&)rsp.dmem; auto fetch = [&]() -> u64 { u64 op = memory.readUnaligned(command.current); diff --git a/waterbox/ares64/ares/ares/n64/rdp/serialization.cpp b/waterbox/ares64/ares/ares/n64/rdp/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdram/debugger.cpp b/waterbox/ares64/ares/ares/n64/rdram/debugger.cpp old mode 100644 new mode 100755 index 3829628d02..0aab188d87 --- a/waterbox/ares64/ares/ares/n64/rdram/debugger.cpp +++ b/waterbox/ares64/ares/ares/n64/rdram/debugger.cpp @@ -1,11 +1,32 @@ auto RDRAM::Debugger::load(Node::Object parent) -> void { memory.ram = parent->append("RDRAM"); - memory.ram->setSize(4_MiB + 4_MiB); + if(!system.expansionPak) { + memory.ram->setSize(4_MiB); + } else { + memory.ram->setSize(4_MiB + 4_MiB); + } + memory.ram->setRead([&](u32 address) -> u8 { - return rdram.ram.read(address); + return rdram.ram.read(address, "Ares Debugger"); }); memory.ram->setWrite([&](u32 address, u8 data) -> void { - return rdram.ram.write(address, data); + return rdram.ram.write(address, data, "Ares Debugger"); + }); + + memory.dcache = parent->append("DCache"); + memory.dcache->setSize(4_MiB + 4_MiB); + memory.dcache->setRead([&](u32 address) -> u8 { + u32 vaddr = address | 0x8000'0000; + return cpu.dcache.readDebug(vaddr, address); + }); + memory.dcache->setWrite([&](u32 address, u8 data) -> void { + u32 vaddr = address | 0x8000'0000; + auto& line = cpu.dcache.line(vaddr); + if(line.hit(address)) { + line.write(address, data); + } else { + rdram.ram.write(address, data, "Ares Debugger"); + } }); tracer.io = parent->append("I/O", "RDRAM"); @@ -38,3 +59,51 @@ auto RDRAM::Debugger::io(bool mode, u32 chipID, u32 address, u32 data) -> void { tracer.io->notify(message); } } + +auto RDRAM::Debugger::cacheErrorContext(string peripheral) -> string { + if(peripheral == "CPU") { + return { "\tCurrent CPU PC: 0x", hex(cpu.ipu.pc, 16L), "\n" }; + } + if(peripheral == "RSP DMA") { + if(rsp.dma.current.originCpu) { + return { "\tRSP DMA started at CPU PC: 0x", hex(rsp.dma.current.originPc, 16L), "\n" }; + } else { + return { "\tRSP DMA started at RSP PC: 0x", hex(rsp.dma.current.originPc, 3L), "\n" }; + } + } + if(peripheral == "PI DMA") { + return { "\tPI DMA started at CPU PC: 0x", hex(pi.io.originPc, 16L), "\n" }; + } + if(peripheral == "AI DMA") { + return { "\tAI DMA started at CPU PC: 0x", hex(ai.io.dmaOriginPc[0], 16L), "\n" }; + } + return ""; +} + +auto RDRAM::Debugger::readWord(u32 address, int size, const char *peripheral) -> void { + if (system.homebrewMode && (address & ~15) != lastReadCacheline) { + lastReadCacheline = address & ~15; + auto& line = cpu.dcache.line(address); + u16 dirtyMask = ((1 << size) - 1) << (address & 0xF); + if (line.hit(address) && (line.dirty & dirtyMask)) { + string msg = { peripheral, " reading from RDRAM address 0x", hex(address), " which is modified in the cache (missing cache writeback?)\n"}; + msg.append(string{ "\tCacheline was loaded at CPU PC: 0x", hex(line.fillPc, 16L), "\n" }); + msg.append(string{ "\tCacheline was last written at CPU PC: 0x", hex(line.dirtyPc, 16L), "\n" }); + msg.append(cacheErrorContext(peripheral)); + debug(unusual, msg); + } + } +} + +auto RDRAM::Debugger::writeWord(u32 address, int size, u64 value, const char *peripheral) -> void { + if (system.homebrewMode && (address & ~15) != lastWrittenCacheline) { + lastWrittenCacheline = address & ~15; + auto& line = cpu.dcache.line(address); + if (line.hit(address)) { + string msg = { peripheral, " writing to RDRAM address 0x", hex(address), " which is cached (missing cache invalidation?)\n"}; + msg.append(string{ "\tCacheline was loaded at CPU PC: 0x", hex(line.fillPc, 16L), "\n" }); + msg.append(cacheErrorContext(peripheral)); + debug(unusual, msg); + } + } +} diff --git a/waterbox/ares64/ares/ares/n64/rdram/io.cpp b/waterbox/ares64/ares/ares/n64/rdram/io.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rdram/rdram.cpp b/waterbox/ares64/ares/ares/n64/rdram/rdram.cpp old mode 100644 new mode 100755 index f17acd4843..bcbd53130e --- a/waterbox/ares64/ares/ares/n64/rdram/rdram.cpp +++ b/waterbox/ares64/ares/ares/n64/rdram/rdram.cpp @@ -10,11 +10,15 @@ RDRAM rdram; auto RDRAM::load(Node::Object parent) -> void { node = parent->append("RDRAM"); - //4_MiB internal - //4_MiB expansion pak - ram.allocate(4_MiB + 4_MiB); - - debugger.load(node); + if(!system.expansionPak) { + //4MB internal + ram.allocate(4_MiB); + } else { + //4MB internal + 4MB expansion pak + ram.allocate(4_MiB + 4_MiB); + } + + debugger.load(node); } auto RDRAM::unload() -> void { diff --git a/waterbox/ares64/ares/ares/n64/rdram/rdram.hpp b/waterbox/ares64/ares/ares/n64/rdram/rdram.hpp old mode 100644 new mode 100755 index 6b4d772ee0..0183159820 --- a/waterbox/ares64/ares/ares/n64/rdram/rdram.hpp +++ b/waterbox/ares64/ares/ares/n64/rdram/rdram.hpp @@ -4,26 +4,79 @@ struct RDRAM : Memory::RCP { Node::Object node; struct Writable : public Memory::Writable { + RDRAM& self; + + Writable(RDRAM& self) : self(self) {} + template - auto read(u32 address) -> u64 { + auto read(u32 address, const char *peripheral) -> u64 { if (address >= size) return 0; + if (peripheral && system.homebrewMode) { + self.debugger.readWord(address, Size, peripheral); + } return Memory::Writable::read(address); } template - auto write(u32 address, u64 value) -> void { + auto write(u32 address, u64 value, const char *peripheral) -> void { if (address >= size) return; + if (peripheral && system.homebrewMode) { + self.debugger.writeWord(address, Size, value, peripheral); + } Memory::Writable::write(address, value); } - } ram; + + template + auto writeBurst(u32 address, u32 *value, const char *peripheral) -> void { + if (address >= size) return; + Memory::Writable::write(address | 0x00, value[0]); + Memory::Writable::write(address | 0x04, value[1]); + Memory::Writable::write(address | 0x08, value[2]); + Memory::Writable::write(address | 0x0c, value[3]); + if (Size == ICache) { + Memory::Writable::write(address | 0x10, value[4]); + Memory::Writable::write(address | 0x14, value[5]); + Memory::Writable::write(address | 0x18, value[6]); + Memory::Writable::write(address | 0x1c, value[7]); + } + } + + template + auto readBurst(u32 address, u32 *value, const char *peripheral) -> void { + if (address >= size) { + value[0] = value[1] = value[2] = value[3] = 0; + if (Size == ICache) + value[4] = value[5] = value[6] = value[7] = 0; + return; + } + value[0] = Memory::Writable::read(address | 0x00); + value[1] = Memory::Writable::read(address | 0x04); + value[2] = Memory::Writable::read(address | 0x08); + value[3] = Memory::Writable::read(address | 0x0c); + if (Size == ICache) { + value[4] = Memory::Writable::read(address | 0x10); + value[5] = Memory::Writable::read(address | 0x14); + value[6] = Memory::Writable::read(address | 0x18); + value[7] = Memory::Writable::read(address | 0x1c); + } + } + + } ram{*this}; struct Debugger { + u32 lastReadCacheline = 0xffff'ffff; + u32 lastWrittenCacheline = 0xffff'ffff; + //debugger.cpp auto load(Node::Object) -> void; auto io(bool mode, u32 chipID, u32 address, u32 data) -> void; + auto readWord(u32 address, int size, const char *peripheral) -> void; + auto writeWord(u32 address, int size, u64 value, const char *peripheral) -> void; + auto cacheErrorContext(string peripheral) -> string; struct Memory { Node::Debugger::Memory ram; + Node::Debugger::Memory dcache; } memory; struct Tracer { diff --git a/waterbox/ares64/ares/ares/n64/rdram/serialization.cpp b/waterbox/ares64/ares/ares/n64/rdram/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/ri/debugger.cpp b/waterbox/ares64/ares/ares/n64/ri/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/ri/io.cpp b/waterbox/ares64/ares/ares/n64/ri/io.cpp old mode 100644 new mode 100755 index 6c88fbaac0..f6c37c8f1c --- a/waterbox/ares64/ares/ares/n64/ri/io.cpp +++ b/waterbox/ares64/ares/ares/n64/ri/io.cpp @@ -1,5 +1,5 @@ auto RI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = 0; if(address == 0) { @@ -59,7 +59,7 @@ auto RI::readWord(u32 address, Thread& thread) -> u32 { } auto RI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/waterbox/ares64/ares/ares/n64/ri/ri.cpp b/waterbox/ares64/ares/ares/n64/ri/ri.cpp old mode 100644 new mode 100755 index 1ebca7025c..5267965c4b --- a/waterbox/ares64/ares/ares/n64/ri/ri.cpp +++ b/waterbox/ares64/ares/ares/n64/ri/ri.cpp @@ -27,8 +27,8 @@ auto RI::power(bool reset) -> void { io.refresh = 0x0006'3634; //store RDRAM size result into memory - rdram.ram.write(0x318, rdram.ram.size); //CIC-NUS-6102 - rdram.ram.write(0x3f0, rdram.ram.size); //CIC-NUS-6105 + rdram.ram.write(0x318, rdram.ram.size, "IPL3"); //CIC-NUS-6102 + rdram.ram.write(0x3f0, rdram.ram.size, "IPL3"); //CIC-NUS-6105 } } diff --git a/waterbox/ares64/ares/ares/n64/ri/ri.hpp b/waterbox/ares64/ares/ares/n64/ri/ri.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/ri/serialization.cpp b/waterbox/ares64/ares/ares/n64/ri/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rsp/debugger.cpp b/waterbox/ares64/ares/ares/n64/rsp/debugger.cpp old mode 100644 new mode 100755 index 2214418493..6bb0afd11a --- a/waterbox/ares64/ares/ares/n64/rsp/debugger.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/debugger.cpp @@ -22,8 +22,23 @@ auto RSP::Debugger::load(Node::Object parent) -> void { tracer.instruction = parent->append("Instruction", "RSP"); tracer.instruction->setAddressBits(12, 2); tracer.instruction->setDepth(64); + if constexpr(Accuracy::RSP::Recompiler) { + tracer.instruction->setToggle([&] { + rsp.recompiler.reset(); + rsp.recompiler.callInstructionPrologue = tracer.instruction->enabled(); + }); + } tracer.io = parent->append("I/O", "RSP"); + + if (system.homebrewMode) { + for (auto& taintWord : taintMask.dmem) { + taintWord = {}; + } + for (auto& taintWord : taintMask.imem) { + taintWord = {}; + } + } } auto RSP::Debugger::unload() -> void { @@ -89,4 +104,81 @@ auto RSP::Debugger::ioStatus(bool mode, u32 address, u32 data) -> void { } } +auto RSP::Debugger::dmaReadWord(u32 rdramAddress, u32 pbusRegion, u32 pbusAddress) -> void { + if (system.homebrewMode) { + auto& line = cpu.dcache.line(rdramAddress); + u16 dmaMask = 0xff << (rdramAddress & 0xF); + auto& tm = !pbusRegion ? taintMask.dmem : taintMask.imem; + auto& taintWord = tm[pbusAddress >> 3]; + if (line.hit(rdramAddress) && (line.dirty & dmaMask)) { + taintWord.dirty = (line.dirty & dmaMask) >> (rdramAddress & 0x8); + taintWord.ctxDmaRdramAddress = rdramAddress & ~0x7; + taintWord.ctxDmaOriginPc = rsp.dma.current.originPc; + taintWord.ctxDmaOriginCpu = rsp.dma.current.originCpu; + taintWord.ctxCacheFillPc = line.fillPc; + taintWord.ctxCacheDirtyPc = line.dirtyPc; + } else { + taintWord.dirty = 0; + } + } +} + +auto RSP::Debugger::dmemReadWord(u12 address, int size, const char *peripheral) -> void { + if (system.homebrewMode) { + u8 readMask = ((1 << size) - 1) << (address & 0x7); + auto& taintWord = taintMask.dmem[address >> 3]; + if (taintWord.dirty & readMask) { + u32 rdramAddress = taintWord.ctxDmaRdramAddress + (address & 0x7); + string msg = { peripheral, " reading from DMEM address 0x", hex(address), " which contains a value which is not cache coherent\n"}; + msg.append(string{ "\tCurrent RSP PC: 0x", hex(rsp.ipu.pc, 3L), "\n" }); + msg.append(string{ "\tThe value read was previously written by RSP DMA from RDRAM address 0x", hex(rdramAddress, 8L), "\n" }); + if(taintWord.ctxDmaOriginCpu) { + msg.append(string{ "\tRSP DMA started at CPU PC: 0x", hex(taintWord.ctxDmaOriginPc, 16L), "\n" }); + } else { + msg.append(string{ "\tRSP DMA started at RSP PC: 0x", hex(taintWord.ctxDmaOriginPc, 3L), "\n" }); + } + msg.append(string{ "\tThe relative CPU cacheline was dirty (missing cache writeback?)\n" }); + msg.append(string{ "\tCacheline was last written at CPU PC: 0x", hex(taintWord.ctxCacheDirtyPc, 16L), "\n" }); + msg.append(string{ "\tCacheline was loaded at CPU PC: 0x", hex(taintWord.ctxCacheFillPc, 16L), "\n" }); + debug(unusual, msg); + taintWord.dirty = 0; + } + } +} + +auto RSP::Debugger::dmemReadUnalignedWord(u12 address, int size, const char *peripheral) -> void { + if (system.homebrewMode) { + u32 addressAlignedStart = address & ~7; + u32 addressAlignedEnd = address + size - 1 & ~7; + if(addressAlignedStart == addressAlignedEnd) { + dmemReadWord(address, size, "RSP"); + } else { + int sizeStart = addressAlignedEnd - address; + dmemReadWord(address, sizeStart, "RSP"); + dmemReadWord(address + sizeStart, size - sizeStart, "RSP"); + } + } +} + +auto RSP::Debugger::dmemWriteWord(u12 address, int size, u64 value) -> void { + if (system.homebrewMode) { + auto& taintWord = taintMask.dmem[address >> 3]; + taintWord.dirty &= ~(((1 << size) - 1) << (address & 0x7)); + } +} + +auto RSP::Debugger::dmemWriteUnalignedWord(u12 address, int size, u64 value) -> void { + if (system.homebrewMode) { + u32 addressAlignedStart = address & ~7; + u32 addressAlignedEnd = address + size - 1 & ~7; + if(addressAlignedStart == addressAlignedEnd) { + dmemWriteWord(address, size, value); + } else { + int sizeStart = addressAlignedEnd - address; + dmemWriteWord(address, sizeStart, value); + dmemWriteWord(address + sizeStart, size - sizeStart, value); + } + } +} + #undef rsp diff --git a/waterbox/ares64/ares/ares/n64/rsp/decoder.cpp b/waterbox/ares64/ares/ares/n64/rsp/decoder.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rsp/disassembler.cpp b/waterbox/ares64/ares/ares/n64/rsp/disassembler.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rsp/dma.cpp b/waterbox/ares64/ares/ares/n64/rsp/dma.cpp old mode 100644 new mode 100755 index fbc00b7962..72b14eec4a --- a/waterbox/ares64/ares/ares/n64/rsp/dma.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/dma.cpp @@ -18,8 +18,11 @@ auto RSP::dmaTransferStep() -> void { } } for(u32 i = 0; i <= dma.current.length; i += 8) { - u64 data = rdram.ram.read(dma.current.dramAddress); + u64 data = rdram.ram.read(dma.current.dramAddress, nullptr); region.write(dma.current.pbusAddress, data); + if (system.homebrewMode) { + rsp.debugger.dmaReadWord(dma.current.dramAddress, dma.current.pbusRegion, dma.current.pbusAddress); + } dma.current.dramAddress += 8; dma.current.pbusAddress += 8; } @@ -27,7 +30,7 @@ auto RSP::dmaTransferStep() -> void { if(dma.busy.write) { for(u32 i = 0; i <= dma.current.length; i += 8) { u64 data = region.read(dma.current.pbusAddress); - rdram.ram.write(dma.current.dramAddress, data); + rdram.ram.write(dma.current.dramAddress, data, "RSP DMA"); dma.current.dramAddress += 8; dma.current.pbusAddress += 8; } diff --git a/waterbox/ares64/ares/ares/n64/rsp/interpreter-ipu.cpp b/waterbox/ares64/ares/ares/n64/rsp/interpreter-ipu.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rsp/interpreter-scc.cpp b/waterbox/ares64/ares/ares/n64/rsp/interpreter-scc.cpp old mode 100644 new mode 100755 index 672716aec7..528f87231b --- a/waterbox/ares64/ares/ares/n64/rsp/interpreter-scc.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/interpreter-scc.cpp @@ -1,9 +1,9 @@ auto RSP::MFC0(r32& rt, u8 rd) -> void { - if((rd & 8) == 0) rt.u32 = Nintendo64::rsp.ioRead ((rd & 7) << 2); + if((rd & 8) == 0) rt.u32 = Nintendo64::rsp.ioRead ((rd & 7) << 2, *this); if((rd & 8) != 0) rt.u32 = Nintendo64::rdp.readWord((rd & 7) << 2, *this); } auto RSP::MTC0(cr32& rt, u8 rd) -> void { - if((rd & 8) == 0) Nintendo64::rsp.ioWrite ((rd & 7) << 2, rt.u32); + if((rd & 8) == 0) Nintendo64::rsp.ioWrite ((rd & 7) << 2, rt.u32, *this); if((rd & 8) != 0) Nintendo64::rdp.writeWord((rd & 7) << 2, rt.u32, *this); } diff --git a/waterbox/ares64/ares/ares/n64/rsp/interpreter-vpu.cpp b/waterbox/ares64/ares/ares/n64/rsp/interpreter-vpu.cpp old mode 100644 new mode 100755 index 24cdf0b2ca..f9ed14db58 --- a/waterbox/ares64/ares/ares/n64/rsp/interpreter-vpu.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/interpreter-vpu.cpp @@ -150,7 +150,7 @@ auto RSP::CTC2(cr32& rt, u8 rd) -> void { if constexpr(Accuracy::RSP::SIMD) { #if ARCHITECTURE_SUPPORTS_SSE4_1 - static const v128 mask = _mm_set_epi16(0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080); + static const v128 mask = _mm_set_epi16(0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080u); lo->v128 = _mm_cmpeq_epi8(_mm_and_si128(_mm_set1_epi8(~rt.u32 >> 0), mask), zero); hi->v128 = _mm_cmpeq_epi8(_mm_and_si128(_mm_set1_epi8(~rt.u32 >> 8), mask), zero); #endif diff --git a/waterbox/ares64/ares/ares/n64/rsp/interpreter.cpp b/waterbox/ares64/ares/ares/n64/rsp/interpreter.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/rsp/io.cpp b/waterbox/ares64/ares/ares/n64/rsp/io.cpp old mode 100644 new mode 100755 index 1daa5fccc0..b776f9d485 --- a/waterbox/ares64/ares/ares/n64/rsp/io.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/io.cpp @@ -3,11 +3,11 @@ auto RSP::readWord(u32 address, Thread& thread) -> u32 { if(address & 0x1000) return imem.read(address); else return dmem.read(address); } - return ioRead(address); + return ioRead(address, thread); } -auto RSP::ioRead(u32 address) -> u32 { - address = (address & 0x3ffff) >> 2; +auto RSP::ioRead(u32 address, Thread &thread) -> u32 { + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -72,12 +72,11 @@ auto RSP::writeWord(u32 address, u32 data, Thread& thread) -> void { if(address & 0x1000) return recompiler.invalidate(address & 0xfff), imem.write(address, data); else return dmem.write(address, data); } - return ioWrite(address, data); + return ioWrite(address, data, thread); } -auto RSP::ioWrite(u32 address, u32 data_) -> void { - - address = (address & 0x3ffff) >> 2; +auto RSP::ioWrite(u32 address, u32 data_, Thread& thread) -> void { + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { @@ -96,8 +95,11 @@ auto RSP::ioWrite(u32 address, u32 data_) -> void { dma.pending.length.bit(3,11) = data.bit( 3,11); dma.pending.count = data.bit(12,19); dma.pending.skip.bit(3,11) = data.bit(23,31); + dma.pending.originCpu = &thread != this; + dma.pending.originPc = dma.pending.originCpu ? cpu.ipu.pc : (u64)rsp.ipu.r[31].u32; dma.full.read = 1; dma.full.write = 0; + // printf("RSP DMA Read: %08x => %08x %08x\n", dma.pending.dramAddress, dma.pending.pbusAddress, dma.pending.length); dmaTransferStart(); } @@ -106,6 +108,8 @@ auto RSP::ioWrite(u32 address, u32 data_) -> void { dma.pending.length.bit(3,11) = data.bit( 3,11); dma.pending.count = data.bit(12,19); dma.pending.skip.bit(3,11) = data.bit(23,31); + dma.pending.originCpu = &thread != this; + dma.pending.originPc = dma.pending.originCpu ? cpu.ipu.pc : (u64)rsp.ipu.r[31].u32; dma.full.write = 1; dma.full.read = 0; dmaTransferStart(); @@ -157,7 +161,7 @@ auto RSP::ioWrite(u32 address, u32 data_) -> void { } auto RSP::Status::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0x7ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -178,7 +182,7 @@ auto RSP::Status::readWord(u32 address, Thread& thread) -> u32 { } auto RSP::Status::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0x7ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/waterbox/ares64/ares/ares/n64/rsp/recompiler.cpp b/waterbox/ares64/ares/ares/n64/rsp/recompiler.cpp old mode 100644 new mode 100755 index f9f190fa99..85468c2b0e --- a/waterbox/ares64/ares/ares/n64/rsp/recompiler.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/recompiler.cpp @@ -61,9 +61,7 @@ auto RSP::Recompiler::block(u12 address) -> Block* { auto RSP::Recompiler::emit(u12 address) -> Block* { if(unlikely(allocator.available() < 1_MiB)) { print("RSP allocator flush\n"); - memory::jitprotect(false); - allocator.release(bump_allocator::zero_fill); - memory::jitprotect(true); + allocator.release(); reset(); } @@ -75,19 +73,27 @@ auto RSP::Recompiler::emit(u12 address) -> Block* { u12 start = address; bool hasBranched = 0; while(true) { - pipeline.begin(); u32 instruction = self.imem.read(address); + if(callInstructionPrologue) { + mov32(reg(1), imm(instruction)); + call(&RSP::instructionPrologue); + } + pipeline.begin(); OpInfo op0 = self.decoderEXECUTE(instruction); pipeline.issue(op0); bool branched = emitEXECUTE(instruction); if(!pipeline.singleIssue && !branched && u12(address + 4) != start) { - u32 instruction = self.imem.read(address + 4); + u32 instruction = self.imem.read(address + 4); OpInfo op1 = self.decoderEXECUTE(instruction); if(RSP::canDualIssue(op0, op1)) { mov32(reg(1), imm(0)); call(&RSP::instructionEpilogue); + if(callInstructionPrologue) { + mov32(reg(1), imm(instruction)); + call(&RSP::instructionPrologue); + } address += 4; pipeline.issue(op1); branched = emitEXECUTE(instruction); diff --git a/waterbox/ares64/ares/ares/n64/rsp/rsp.cpp b/waterbox/ares64/ares/ares/n64/rsp/rsp.cpp old mode 100644 new mode 100755 index 821cd9437c..5edcc63d1f --- a/waterbox/ares64/ares/ares/n64/rsp/rsp.cpp +++ b/waterbox/ares64/ares/ares/n64/rsp/rsp.cpp @@ -43,12 +43,11 @@ auto RSP::instruction() -> void { } if constexpr(Accuracy::RSP::Interpreter) { + u32 instruction = imem.read(ipu.pc); + instructionPrologue(instruction); pipeline.begin(); - pipeline.address = ipu.pc; - pipeline.instruction = imem.read(pipeline.address); - OpInfo op0 = decoderEXECUTE(pipeline.instruction); + OpInfo op0 = decoderEXECUTE(instruction); pipeline.issue(op0); - debugger.instruction(); interpreterEXECUTE(); if(!pipeline.singleIssue && !op0.branch()) { @@ -57,10 +56,8 @@ auto RSP::instruction() -> void { if(canDualIssue(op0, op1)) { instructionEpilogue(0); - pipeline.address = ipu.pc; - pipeline.instruction = instruction; + instructionPrologue(instruction); pipeline.issue(op1); - debugger.instruction(); interpreterEXECUTE(); } } @@ -74,6 +71,12 @@ auto RSP::instruction() -> void { step(pipeline.clocks); } +auto RSP::instructionPrologue(u32 instruction) -> void { + pipeline.address = ipu.pc; + pipeline.instruction = instruction; + debugger.instruction(); +} + auto RSP::instructionEpilogue(u32 clocks) -> s32 { if constexpr(Accuracy::RSP::Recompiler) { step(clocks); @@ -142,9 +145,7 @@ auto RSP::power(bool reset) -> void { if constexpr(Accuracy::RSP::Recompiler) { auto buffer = ares::Memory::FixedAllocator::get().tryAcquire(4_MiB); - memory::jitprotect(false); - recompiler.allocator.resize(4_MiB, bump_allocator::executable | bump_allocator::zero_fill, buffer); - memory::jitprotect(true); + recompiler.allocator.resize(64_MiB, bump_allocator::executable, buffer); recompiler.reset(); } diff --git a/waterbox/ares64/ares/ares/n64/rsp/rsp.hpp b/waterbox/ares64/ares/ares/n64/rsp/rsp.hpp old mode 100644 new mode 100755 index 3a6bd95fe2..cb4f2ea45c --- a/waterbox/ares64/ares/ares/n64/rsp/rsp.hpp +++ b/waterbox/ares64/ares/ares/n64/rsp/rsp.hpp @@ -2,7 +2,36 @@ struct RSP : Thread, Memory::RCP { Node::Object node; - Memory::Writable dmem; + struct Writable : public Memory::Writable { + RSP& self; + + Writable(RSP& self) : self(self) {} + + template + auto read(u32 address) -> u64 { + if (system.homebrewMode) self.debugger.dmemReadWord(address, Size, "RSP"); + return Memory::Writable::read(address); + } + + template + auto readUnaligned(u32 address) -> u64 { + if (system.homebrewMode) self.debugger.dmemReadUnalignedWord(address, Size, "RSP"); + return Memory::Writable::readUnaligned(address); + } + + template + auto write(u32 address, u64 value) -> void { + if (system.homebrewMode) self.debugger.dmemWriteWord(address, Size, value); + Memory::Writable::write(address, value); + } + + template + auto writeUnaligned(u32 address, u64 value) -> void { + if (system.homebrewMode) self.debugger.dmemWriteUnalignedWord(address, Size, value); + Memory::Writable::writeUnaligned(address, value); + } + + } dmem{*this}; Memory::Writable imem; struct Debugger { @@ -14,6 +43,23 @@ struct RSP : Thread, Memory::RCP { auto ioSCC(bool mode, u32 address, u32 data) -> void; auto ioStatus(bool mode, u32 address, u32 data) -> void; + auto dmaReadWord(u32 rdramAddress, u32 pbusRegion, u32 pbusAddress) -> void; + auto dmemReadWord(u12 address, int size, const char *peripheral) -> void; + auto dmemWriteWord(u12 address, int size, u64 value) -> void; + auto dmemReadUnalignedWord(u12 address, int size, const char *peripheral) -> void; + auto dmemWriteUnalignedWord(u12 address, int size, u64 value) -> void; + + struct TaintMask { + struct TaintWord { + u8 dirty; + u32 ctxDmaRdramAddress; + u64 ctxDmaOriginPc; + u1 ctxDmaOriginCpu; + u64 ctxCacheFillPc; + u64 ctxCacheDirtyPc; + } dmem[512], imem[512]; + } taintMask; + struct Memory { Node::Debugger::Memory dmem; Node::Debugger::Memory imem; @@ -32,6 +78,7 @@ struct RSP : Thread, Memory::RCP { auto main() -> void; auto instruction() -> void; + auto instructionPrologue(u32 instruction) -> void; auto instructionEpilogue(u32 clocks) -> s32; auto power(bool reset) -> void; @@ -165,8 +212,8 @@ struct RSP : Thread, Memory::RCP { //io.cpp auto readWord(u32 address, Thread& thread) -> u32; auto writeWord(u32 address, u32 data, Thread& thread) -> void; - auto ioRead(u32 address) -> u32; - auto ioWrite(u32 address, u32 data) -> void; + auto ioRead(u32 address, Thread& thread) -> u32; + auto ioWrite(u32 address, u32 data, Thread& thread) -> void; //serialization.cpp auto serialize(serializer&) -> void; @@ -179,7 +226,9 @@ struct RSP : Thread, Memory::RCP { n12 length; n12 skip; n8 count; - + n64 originPc; + n1 originCpu; + auto serialize(serializer&) -> void; } pending, current; @@ -512,6 +561,7 @@ struct RSP : Thread, Memory::RCP { return s <= e ? smask & emask : smask | emask; } + bool callInstructionPrologue = false; Pipeline pipeline; bump_allocator allocator; array context; diff --git a/waterbox/ares64/ares/ares/n64/rsp/serialization.cpp b/waterbox/ares64/ares/ares/n64/rsp/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/si/debugger.cpp b/waterbox/ares64/ares/ares/n64/si/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/si/dma.cpp b/waterbox/ares64/ares/ares/n64/si/dma.cpp old mode 100644 new mode 100755 index 35f13aeb2a..c2690ab2b0 --- a/waterbox/ares64/ares/ares/n64/si/dma.cpp +++ b/waterbox/ares64/ares/ares/n64/si/dma.cpp @@ -1,6 +1,8 @@ auto SI::dmaRead() -> void { pif.dmaRead(io.readAddress, io.dramAddress); io.dmaBusy = 0; + io.pchState = 0; + io.dmaState = 0; io.interrupt = 1; mi.raise(MI::IRQ::SI); } @@ -8,6 +10,8 @@ auto SI::dmaRead() -> void { auto SI::dmaWrite() -> void { pif.dmaWrite(io.writeAddress, io.dramAddress); io.dmaBusy = 0; + io.pchState = 0; + io.dmaState = 0; io.interrupt = 1; mi.raise(MI::IRQ::SI); } diff --git a/waterbox/ares64/ares/ares/n64/si/io.cpp b/waterbox/ares64/ares/ares/n64/si/io.cpp old mode 100644 new mode 100755 index eccc777b93..b415c05848 --- a/waterbox/ares64/ares/ares/n64/si/io.cpp +++ b/waterbox/ares64/ares/ares/n64/si/io.cpp @@ -9,7 +9,7 @@ auto SI::readWord(u32 address, Thread& thread) -> u32 { } auto SI::ioRead(u32 address) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { diff --git a/waterbox/ares64/ares/ares/n64/si/serialization.cpp b/waterbox/ares64/ares/ares/n64/si/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/si/si.cpp b/waterbox/ares64/ares/ares/n64/si/si.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/si/si.hpp b/waterbox/ares64/ares/ares/n64/si/si.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/system/serialization.cpp b/waterbox/ares64/ares/ares/n64/system/serialization.cpp old mode 100644 new mode 100755 index e7ba25d222..f12ef7fd31 --- a/waterbox/ares64/ares/ares/n64/system/serialization.cpp +++ b/waterbox/ares64/ares/ares/n64/system/serialization.cpp @@ -1,4 +1,4 @@ -static const string SerializerVersion = "v133.1"; +static const string SerializerVersion = "v134"; auto System::serialize(bool synchronize) -> serializer { serializer s; diff --git a/waterbox/ares64/ares/ares/n64/system/system.cpp b/waterbox/ares64/ares/ares/n64/system/system.cpp old mode 100644 new mode 100755 index cd1a9840b7..6b9e93577e --- a/waterbox/ares64/ares/ares/n64/system/system.cpp +++ b/waterbox/ares64/ares/ares/n64/system/system.cpp @@ -1,5 +1,7 @@ #include +#include + namespace ares::Nintendo64 { auto enumerate() -> vector { @@ -29,6 +31,8 @@ auto option(string name, string value) -> bool { if(vulkan.internalUpscale == 1) vulkan.supersampleScanout = false; vulkan.outputUpscale = vulkan.supersampleScanout ? 1 : vulkan.internalUpscale; #endif + if(name == "Homebrew Mode") system.homebrewMode = value.boolean(); + if(name == "Expansion Pak") system.expansionPak = value.boolean(); return true; } diff --git a/waterbox/ares64/ares/ares/n64/system/system.hpp b/waterbox/ares64/ares/ares/n64/system/system.hpp old mode 100644 new mode 100755 index cae1e955fd..e3f7547dc4 --- a/waterbox/ares64/ares/ares/n64/system/system.hpp +++ b/waterbox/ares64/ares/ares/n64/system/system.hpp @@ -1,6 +1,8 @@ struct System { Node::System node; VFS::Pak pak; + bool homebrewMode = false; + bool expansionPak = true; enum class Region : u32 { NTSC, PAL }; @@ -31,6 +33,8 @@ private: bool dd = false; } information; + auto initDebugHooks() -> void; + //serialization.cpp auto serialize(serializer&, bool synchronize) -> void; }; diff --git a/waterbox/ares64/ares/ares/n64/vi/debugger.cpp b/waterbox/ares64/ares/ares/n64/vi/debugger.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/vi/io.cpp b/waterbox/ares64/ares/ares/n64/vi/io.cpp old mode 100644 new mode 100755 index 773378c272..4b3482a933 --- a/waterbox/ares64/ares/ares/n64/vi/io.cpp +++ b/waterbox/ares64/ares/ares/n64/vi/io.cpp @@ -1,5 +1,5 @@ auto VI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data; if(address == 0) { @@ -97,7 +97,7 @@ auto VI::readWord(u32 address, Thread& thread) -> u32 { } auto VI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data = data_; #if defined(VULKAN) diff --git a/waterbox/ares64/ares/ares/n64/vi/serialization.cpp b/waterbox/ares64/ares/ares/n64/vi/serialization.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/ares/n64/vi/vi.cpp b/waterbox/ares64/ares/ares/n64/vi/vi.cpp old mode 100644 new mode 100755 index cd22eb7084..7f5aa6e6f0 --- a/waterbox/ares64/ares/ares/n64/vi/vi.cpp +++ b/waterbox/ares64/ares/ares/n64/vi/vi.cpp @@ -26,6 +26,7 @@ auto VI::load(Node::Object parent) -> void { #endif screen = node->append("Screen", width, height); screen->setRefresh({&VI::refresh, this}); + screen->refreshRateHint(Region::PAL() ? 50 : 60); // TODO: More accurate refresh rate hint screen->colors((1 << 24) + (1 << 15), [&](n32 color) -> n64 { if(color < (1 << 24)) { u64 a = 65535; @@ -159,7 +160,7 @@ auto VI::refresh() -> void { auto line = screen->pixels(1).data() + (dy - vscan_start) * hscan_len; u32 x0 = vi.io.xsubpixel + vi.io.xscale * (dx0 - vi.io.hstart); for(i32 dx = dx0; dx < dx1; dx++) { - u16 data = rdram.ram.read(address + (x0 >> 10) * 2); + u16 data = rdram.ram.read(address + (x0 >> 10) * 2, "VI"); line[dx - hscan_start] = 1 << 24 | data >> 1; x0 += vi.io.xscale; } @@ -177,7 +178,7 @@ auto VI::refresh() -> void { auto line = screen->pixels(1).data() + (dy - vscan_start) * hscan_len; u32 x0 = vi.io.xsubpixel + vi.io.xscale * (dx0 - vi.io.hstart); for(i32 dx = dx0; dx < dx1; dx++) { - u32 data = rdram.ram.read(address + (x0 >> 10) * 4); + u32 data = rdram.ram.read(address + (x0 >> 10) * 4, "VI"); line[dx - hscan_start] = data >> 8; x0 += vi.io.xscale; } diff --git a/waterbox/ares64/ares/ares/n64/vi/vi.hpp b/waterbox/ares64/ares/ares/n64/vi/vi.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/adaptive-array.hpp b/waterbox/ares64/ares/nall/adaptive-array.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/algorithm.hpp b/waterbox/ares64/ares/nall/algorithm.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/any.hpp b/waterbox/ares64/ares/nall/any.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/arguments.hpp b/waterbox/ares64/ares/nall/arguments.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/arithmetic.hpp b/waterbox/ares64/ares/nall/arithmetic.hpp old mode 100644 new mode 100755 index baf00a9fb2..4d0ebbf382 --- a/waterbox/ares64/ares/nall/arithmetic.hpp +++ b/waterbox/ares64/ares/nall/arithmetic.hpp @@ -3,6 +3,8 @@ //multi-precision arithmetic //warning: each size is quadratically more expensive than the size before it! +#include + #include #include #include diff --git a/waterbox/ares64/ares/nall/arithmetic/barrett.hpp b/waterbox/ares64/ares/nall/arithmetic/barrett.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/arithmetic/natural.hpp b/waterbox/ares64/ares/nall/arithmetic/natural.hpp old mode 100644 new mode 100755 index e90f2b3bf1..0cedfaee5a --- a/waterbox/ares64/ares/nall/arithmetic/natural.hpp +++ b/waterbox/ares64/ares/nall/arithmetic/natural.hpp @@ -1,3 +1,5 @@ +#include + #define ConcatenateType(Size) u##Size #define DeclareType(Size) ConcatenateType(Size) @@ -278,7 +280,7 @@ template alwaysinline auto ror(const Pair& lhs, const T& rhs) -> Pai return lhs >> rhs | lhs << (PairBits - rhs); } -#define EI /*typename =*/ enable_if_t::value> +#define EI enable_if_t::value> template auto& operator*= (T& lhs, const Pair& rhs) { return lhs = lhs * T(rhs); } template auto& operator/= (T& lhs, const Pair& rhs) { return lhs = lhs / T(rhs); } diff --git a/waterbox/ares64/ares/nall/arithmetic/unsigned.hpp b/waterbox/ares64/ares/nall/arithmetic/unsigned.hpp old mode 100644 new mode 100755 index bc82a4c09d..35e8a34b9e --- a/waterbox/ares64/ares/nall/arithmetic/unsigned.hpp +++ b/waterbox/ares64/ares/nall/arithmetic/unsigned.hpp @@ -2,34 +2,34 @@ namespace nall { -template::value>> +template::value>> inline auto upper(T value) -> T { return value >> sizeof(T) * 4; } -template::value>> +template::value>> inline auto lower(T value) -> T { static const T Mask = ~T(0) >> sizeof(T) * 4; return value & Mask; } -template::value>, typename = enable_if_t::value>> +template::value>, enable_if_t::value>> inline auto mul(T lhs, U rhs) -> uintmax { return lhs * rhs; } -template::value>> +template::value>> inline auto square(T value) -> uintmax { return value * value; } -template::value>> -inline auto rol(T lhs, U rhs) -> T { +template +inline auto rol(T lhs, U rhs, enable_if_t::value>* = 0) -> T { return lhs << rhs | lhs >> sizeof(T) * 8 - rhs; } -template::value>> -inline auto ror(T lhs, U rhs) -> T { +template +inline auto ror(T lhs, U rhs, enable_if_t::value>* = 0) -> T { return lhs >> rhs | lhs << sizeof(T) * 8 - rhs; } diff --git a/waterbox/ares64/ares/nall/array-span.hpp b/waterbox/ares64/ares/nall/array-span.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/array-view.hpp b/waterbox/ares64/ares/nall/array-view.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/array.hpp b/waterbox/ares64/ares/nall/array.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/atoi.hpp b/waterbox/ares64/ares/nall/atoi.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/bcd.hpp b/waterbox/ares64/ares/nall/bcd.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/beat/single/apply.hpp b/waterbox/ares64/ares/nall/beat/single/apply.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/beat/single/create.hpp b/waterbox/ares64/ares/nall/beat/single/create.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/bit.hpp b/waterbox/ares64/ares/nall/bit.hpp old mode 100644 new mode 100755 index b259c12201..3a50c130bb --- a/waterbox/ares64/ares/nall/bit.hpp +++ b/waterbox/ares64/ares/nall/bit.hpp @@ -78,6 +78,14 @@ namespace bit { return first; } + //return index of the last bit set (or zero of no bits are set) + //last(0b11000) == 4 + constexpr inline auto last(u64 x) -> u32 { + u32 i = 0; + while(x) { x >>= 1; i++; } + return i > 0 ? --i : i; + } + //round up to next highest single bit: //round(15) == 16, round(16) == 16, round(17) == 32 constexpr inline auto round(u64 x) -> u64 { diff --git a/waterbox/ares64/ares/nall/bump-allocator.hpp b/waterbox/ares64/ares/nall/bump-allocator.hpp old mode 100644 new mode 100755 index dbf1e52adc..7a4aac5789 --- a/waterbox/ares64/ares/nall/bump-allocator.hpp +++ b/waterbox/ares64/ares/nall/bump-allocator.hpp @@ -28,9 +28,6 @@ struct bump_allocator { reset(); if(buffer) { - if(flags & executable) { - memory::protect(buffer, capacity, true); - } if(flags & zero_fill) { memset(buffer, 0x00, capacity); } @@ -88,9 +85,9 @@ struct bump_allocator { _offset = nextOffset(size); //alignment } - auto tryAcquire(u32 size) -> u8* { + auto tryAcquire(u32 size, bool reserve = true) -> u8* { if((nextOffset(size)) > _capacity) return nullptr; - return acquire(size); + return reserve ? acquire(size) : acquire(); } private: diff --git a/waterbox/ares64/ares/nall/case-range.hpp b/waterbox/ares64/ares/nall/case-range.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd.hpp b/waterbox/ares64/ares/nall/cd.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/crc16.hpp b/waterbox/ares64/ares/nall/cd/crc16.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/edc.hpp b/waterbox/ares64/ares/nall/cd/edc.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/efm.hpp b/waterbox/ares64/ares/nall/cd/efm.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/rspc.hpp b/waterbox/ares64/ares/nall/cd/rspc.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/scrambler.hpp b/waterbox/ares64/ares/nall/cd/scrambler.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/cd/session.hpp b/waterbox/ares64/ares/nall/cd/session.hpp old mode 100644 new mode 100755 index f8b826c5e1..7bff004d3d --- a/waterbox/ares64/ares/nall/cd/session.hpp +++ b/waterbox/ares64/ares/nall/cd/session.hpp @@ -268,7 +268,9 @@ struct Session { q[0] = track.control << 4 | 1; q[1] = BCD::encode(trackID); q[2] = BCD::encode(indexID); - auto msf = MSF(lba - track.indices[1].lba); + auto msf = indexID == 0 + ? MSF(track.indices[0].end - lba) + : MSF(lba - track.indices[1].lba); q[3] = BCD::encode(msf.minute); q[4] = BCD::encode(msf.second); q[5] = BCD::encode(msf.frame); diff --git a/waterbox/ares64/ares/nall/cd/sync.hpp b/waterbox/ares64/ares/nall/cd/sync.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/chrono.hpp b/waterbox/ares64/ares/nall/chrono.hpp old mode 100644 new mode 100755 index dec25cbd8d..49e83a6ef1 --- a/waterbox/ares64/ares/nall/chrono.hpp +++ b/waterbox/ares64/ares/nall/chrono.hpp @@ -25,6 +25,12 @@ inline auto benchmark(const function& f, u64 times = 1) -> void { print("[chrono::benchmark] ", (double)(end - start) / 1'000'000'000.0, "s\n"); } +inline auto daysInMonth(u32 month, u32 year) -> u8 { + u32 days = 30 + ((month + (month >> 3)) & 1); + if (month == 2) days -= (year % 4 == 0) ? 1 : 2; + return days; +} + //exact date/time functions (from system epoch) struct timeinfo { diff --git a/waterbox/ares64/ares/nall/cipher/chacha20.hpp b/waterbox/ares64/ares/nall/cipher/chacha20.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/counting-sort.hpp b/waterbox/ares64/ares/nall/counting-sort.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/database/odbc.hpp b/waterbox/ares64/ares/nall/database/odbc.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/database/sqlite3.hpp b/waterbox/ares64/ares/nall/database/sqlite3.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/base.hpp b/waterbox/ares64/ares/nall/decode/base.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/base64.hpp b/waterbox/ares64/ares/nall/decode/base64.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/bmp.hpp b/waterbox/ares64/ares/nall/decode/bmp.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/bwt.hpp b/waterbox/ares64/ares/nall/decode/bwt.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/chd.hpp b/waterbox/ares64/ares/nall/decode/chd.hpp old mode 100644 new mode 100755 index b150787f68..bd09f64085 --- a/waterbox/ares64/ares/nall/decode/chd.hpp +++ b/waterbox/ares64/ares/nall/decode/chd.hpp @@ -31,7 +31,7 @@ struct CHD { }; auto load(const string& location) -> bool; - auto read(u32 sector) -> vector; + auto read(u32 sector) const -> vector; auto sectorCount() const -> u32; vector tracks; @@ -40,10 +40,10 @@ private: #if false chd_file* chd = nullptr; #endif - const int chd_sector_size = 2352 + 96; + static constexpr int chd_sector_size = 2352 + 96; size_t chd_hunk_size; - vector chd_hunk_buffer; - int chd_current_hunk = -1; + mutable vector chd_hunk_buffer; + mutable int chd_current_hunk = -1; }; inline CHD::~CHD() { @@ -123,11 +123,10 @@ inline auto CHD::load(const string& location) -> bool { return false; } - // Ensure two second pregap is present const bool pregap_in_file = (pregap_frames > 0 && pgtype[0] == 'V'); - if (pregap_frames <= 0 && typeStr != "AUDIO") { - pregap_frames = 2 * 75; - } + + // First track should have 2 second pregap as standard + if(track_no == 1 && !pregap_in_file) pregap_frames = 2 * 75; // Add the new track Track track; @@ -136,7 +135,7 @@ inline auto CHD::load(const string& location) -> bool { track.pregap = pregap_frames; track.postgap = postgap_frames; - // Pregap + // index0 = Pregap if (pregap_frames > 0) { Index index; index.number = 0; @@ -190,7 +189,7 @@ inline auto CHD::load(const string& location) -> bool { #endif } -inline auto CHD::read(u32 sector) -> vector { +inline auto CHD::read(u32 sector) const -> vector { // Convert LBA in CD-ROM to LBA in CHD #if false for(auto& track : tracks) { diff --git a/waterbox/ares64/ares/nall/decode/cue.hpp b/waterbox/ares64/ares/nall/decode/cue.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/gzip.hpp b/waterbox/ares64/ares/nall/decode/gzip.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/html.hpp b/waterbox/ares64/ares/nall/decode/html.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/huffman.hpp b/waterbox/ares64/ares/nall/decode/huffman.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/inflate.hpp b/waterbox/ares64/ares/nall/decode/inflate.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/lzsa.hpp b/waterbox/ares64/ares/nall/decode/lzsa.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/mtf.hpp b/waterbox/ares64/ares/nall/decode/mtf.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/png.hpp b/waterbox/ares64/ares/nall/decode/png.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/rle.hpp b/waterbox/ares64/ares/nall/decode/rle.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/url.hpp b/waterbox/ares64/ares/nall/decode/url.hpp old mode 100644 new mode 100755 index 18382d1c96..62a99e2488 --- a/waterbox/ares64/ares/nall/decode/url.hpp +++ b/waterbox/ares64/ares/nall/decode/url.hpp @@ -1,5 +1,7 @@ #pragma once +#include + namespace nall::Decode { //returns empty string on malformed content diff --git a/waterbox/ares64/ares/nall/decode/wav.hpp b/waterbox/ares64/ares/nall/decode/wav.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/decode/zip.hpp b/waterbox/ares64/ares/nall/decode/zip.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/directory.cpp b/waterbox/ares64/ares/nall/directory.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/directory.hpp b/waterbox/ares64/ares/nall/directory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dl.cpp b/waterbox/ares64/ares/nall/dl.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dl.hpp b/waterbox/ares64/ares/nall/dl.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dsp/iir/biquad.hpp b/waterbox/ares64/ares/nall/dsp/iir/biquad.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dsp/iir/dc-removal.hpp b/waterbox/ares64/ares/nall/dsp/iir/dc-removal.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dsp/iir/one-pole.hpp b/waterbox/ares64/ares/nall/dsp/iir/one-pole.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/dsp/resampler/cubic.hpp b/waterbox/ares64/ares/nall/dsp/resampler/cubic.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/elliptic-curve/curve25519.hpp b/waterbox/ares64/ares/nall/elliptic-curve/curve25519.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/elliptic-curve/ed25519.hpp b/waterbox/ares64/ares/nall/elliptic-curve/ed25519.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/elliptic-curve/modulo25519-optimized.hpp b/waterbox/ares64/ares/nall/elliptic-curve/modulo25519-optimized.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/elliptic-curve/modulo25519-reference.hpp b/waterbox/ares64/ares/nall/elliptic-curve/modulo25519-reference.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/emulation/21fx.hpp b/waterbox/ares64/ares/nall/emulation/21fx.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/base.hpp b/waterbox/ares64/ares/nall/encode/base.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/base64.hpp b/waterbox/ares64/ares/nall/encode/base64.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/bmp.hpp b/waterbox/ares64/ares/nall/encode/bmp.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/bwt.hpp b/waterbox/ares64/ares/nall/encode/bwt.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/html.hpp b/waterbox/ares64/ares/nall/encode/html.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/huffman.hpp b/waterbox/ares64/ares/nall/encode/huffman.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/lzsa.hpp b/waterbox/ares64/ares/nall/encode/lzsa.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/mtf.hpp b/waterbox/ares64/ares/nall/encode/mtf.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/png.hpp b/waterbox/ares64/ares/nall/encode/png.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/rle.hpp b/waterbox/ares64/ares/nall/encode/rle.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/url.hpp b/waterbox/ares64/ares/nall/encode/url.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/wav.hpp b/waterbox/ares64/ares/nall/encode/wav.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/encode/zip.hpp b/waterbox/ares64/ares/nall/encode/zip.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/endian.hpp b/waterbox/ares64/ares/nall/endian.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/file-buffer.hpp b/waterbox/ares64/ares/nall/file-buffer.hpp old mode 100644 new mode 100755 index 41bd2e298d..eac9570701 --- a/waterbox/ares64/ares/nall/file-buffer.hpp +++ b/waterbox/ares64/ares/nall/file-buffer.hpp @@ -229,10 +229,10 @@ private: auto bufferSynchronize() -> void { if(!fileHandle) return; - if(bufferOffset == (fileOffset & ~(buffer.size() - 1))) return; + if(bufferOffset == (fileOffset & ~u64(buffer.size() - 1))) return; bufferFlush(); - bufferOffset = fileOffset & ~(buffer.size() - 1); + bufferOffset = fileOffset & ~u64(buffer.size() - 1); fseek(fileHandle, bufferOffset, SEEK_SET); u64 length = bufferOffset + buffer.size() <= fileSize ? buffer.size() : fileSize & buffer.size() - 1; if(length) (void)fread(buffer.data(), 1, length, fileHandle); diff --git a/waterbox/ares64/ares/nall/file-map.cpp b/waterbox/ares64/ares/nall/file-map.cpp old mode 100644 new mode 100755 index c579f0c607..3172378ab0 --- a/waterbox/ares64/ares/nall/file-map.cpp +++ b/waterbox/ares64/ares/nall/file-map.cpp @@ -41,14 +41,17 @@ NALL_HEADER_INLINE auto file_map::open(const string& filename, u32 mode_) -> boo _file = CreateFileW(utf16_t(filename), desiredAccess, FILE_SHARE_READ, nullptr, creationDisposition, FILE_ATTRIBUTE_NORMAL, nullptr); - if(_file == INVALID_HANDLE_VALUE) return false; + if(_file == INVALID_HANDLE_VALUE) { + _file = nullptr; + return false; + } _size = GetFileSize(_file, nullptr); _map = CreateFileMapping(_file, nullptr, protection, 0, _size, nullptr); - if(_map == INVALID_HANDLE_VALUE) { + if(_map == nullptr) { CloseHandle(_file); - _file = INVALID_HANDLE_VALUE; + _file = nullptr; return false; } @@ -62,14 +65,14 @@ NALL_HEADER_INLINE auto file_map::close() -> void { _data = nullptr; } - if(_map != INVALID_HANDLE_VALUE) { + if(_map != nullptr) { CloseHandle(_map); - _map = INVALID_HANDLE_VALUE; + _map = nullptr; } - if(_file != INVALID_HANDLE_VALUE) { + if(_file != nullptr) { CloseHandle(_file); - _file = INVALID_HANDLE_VALUE; + _file = nullptr; } _open = false; diff --git a/waterbox/ares64/ares/nall/file-map.hpp b/waterbox/ares64/ares/nall/file-map.hpp old mode 100644 new mode 100755 index 0a7ec70094..66e2cc2e1c --- a/waterbox/ares64/ares/nall/file-map.hpp +++ b/waterbox/ares64/ares/nall/file-map.hpp @@ -50,8 +50,8 @@ private: #if defined(API_WINDOWS) - HANDLE _file = INVALID_HANDLE_VALUE; - HANDLE _map = INVALID_HANDLE_VALUE; + HANDLE _file = nullptr; + HANDLE _map = nullptr; public: auto operator=(file_map&& source) -> file_map& { @@ -67,8 +67,8 @@ public: source._open = false; source._data = nullptr; source._size = 0; - source._file = INVALID_HANDLE_VALUE; - source._map = INVALID_HANDLE_VALUE; + source._file = nullptr; + source._map = nullptr; return *this; } diff --git a/waterbox/ares64/ares/nall/file.hpp b/waterbox/ares64/ares/nall/file.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/float-env.hpp b/waterbox/ares64/ares/nall/float-env.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/function.hpp b/waterbox/ares64/ares/nall/function.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/galois-field.hpp b/waterbox/ares64/ares/nall/galois-field.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/gdb/Readme.md b/waterbox/ares64/ares/nall/gdb/Readme.md new file mode 100755 index 0000000000..dd81ff811c --- /dev/null +++ b/waterbox/ares64/ares/nall/gdb/Readme.md @@ -0,0 +1,227 @@ +# Debug Server + +The file `server.cpp` adds a gdb-server compatible with several GDB versions and IDEs like VScode and CLion.
    +It is implemented as a standalone server independent of any specific system, and even ares itself.
    +This allows for easy integration with systems without having to worry about the details of GDB itself.
    + +Managing the server itself, including the underlying TCP connection, is done by ares.
    +System specific logic is handled via (optional) call-backs that a can be registered,
    +as well as methods to report events to GDB. + +The overall design of this server is to be as neutral as possible.
    +Meaning that things like stopping, stepping and reading memory should not affect the game.
    +This is done to make sure that games behave the same as if they were running without a debugger, down to the cycle.
    + +## Integration Guide +This section describes how to implement the debugger for a system in ares.
    +It should not be necessary to modify the server itself, or to know much about the GDB protocol.
    +Simply registering callbacks and reporting events are enough to get the full set of features working.
    + +For a minimal working debugging session, register/memory reads and a way to report the PC are required.
    +Although implementing as much as possible is recommended to make GDB more stable. + +Interactions with the server can be split in three categories: +- **Hooks:** lets GDB call functions in your ares system (e.g.: memory read) +- **Report-functions:** notify GDB about events (e.g.: exceptions) +- **Status-functions:** helper to check the GDB status (e.g.: are breakpoints set or not) + +Hooks can be set via setting the callbacks in `GDB::server.hooks.XXX`.
    +Report functions are prefixed `GDB::server.reportXXX()`, and status functions a documented here separately.
    +All hooks/report/status functions can be safely set or called even if the server is not running.
    + +As an example of a fictional system, this is what a memory read could look like: +```cpp +GDB::server.hooks.regRead = [](u32 regIdx) { + return hex(cpu.readRegister(regIdx), 16, '0'); +}; +``` +Or the main execution loop: +```cpp +while(!endOfFrame && GDB::server.reportPC(cpu.getPC())) { + cpu.step(); +} +``` + +For a real reference implementation, you can take a look at the N64 system.
    + +## Hooks + +### Memory Read - `read = (u64 address, u32 byteCount) -> string` +Reads `byteCount` bytes from `address` and returns them as a hex-string.
    +Both the hex-encoding / single-byte reads are dictated by the GDB protocol.
    + +It is important to implement this in a neutral way: no exceptions and status changes.
    +The GDB-client may issue reads from any address at any point while halted.
    +If not handled properly, this can cause game crashes or different emulation behavior.
    + +If your system emulates cache, make sure to also handle this here.
    +A read must be able to see the cache, but never cause a flush.
    + +Example response (reading 3 bytes): `A1B200` + +### Memory Write - `write = (u64 address, u32 unitSize, u64 value) -> void` +Writes `value` of byte-size `unitSize` to `address`.
    +For example, writing a 32-bit value would issue a call like this: `write(0x80001230, 4, 0x0000000012345678)`.
    +Contrary to read, this is not required to be neutral, and is allowed to cause exceptions.
    + +If your system emulates cache, make sure to also handle this here.
    +The write should behave the same as if it was done via a CPU instruction, incl. flushing the cache if needed.
    + +### Normalize Address - `normalizeAddress = (u64 address) -> u64` +Normalizes an address into something that makes it comparable.
    +This is only used for memory-watchpoints, which needs to compare what GDB send to what ares has internally.
    +If your system has virtual addresses or masks, this should de-virtualize it.
    + +It's OK to not set this function, or to simply return the input untouched.
    +In case that memory-watchpoint are not working, this is probably the place to fix it.
    + +Example implementation: +```cpp +GDB::server.hooks.normalizeAddress = [](u64 address) { + return address & 0x0FFF'FFFF; +}; +``` + +### Register Read - `regRead = (u32 regIdx) -> string` +Reads a single register at `regIdx` and returns it as a hex-string.
    +The size of the hex-string is dictated by the specific architecture.
    + +Same as for memory-read, this must be implemented in a neutral way.
    +Any invalid register can be returned as zero.
    + +Example response: `00000000000123AB` + +### Register Write - `regWrite = (u32 regIdx, u64 regValue) -> bool` + +Writes the value `regValue` to the register at `regIdx`.
    +This write is allowed to have side effects.
    + +If the specific register is not writable or doesn't exist, `false` must be returned.
    +On success, `true` must be returned.
    + +### Register Read (General) - `regReadGeneral = () -> string` +Most common way for GDB to read registers, this fetches all registers at once.
    +The amount and order of registers is dictated by the specific architecture and GDB.
    +When implementing this, GDB will usually complain if the order/size is incorrect.
    + +Same as for single reads, this must be implemented in a neutral way.
    + +Due to some issues regarding exception handling, you are given the option to return a different PC.
    +This PC-override can be accessed via `GDB::server.getPcOverride() -> maybe`.
    +The reasons for that are explained later in `reportSignal()`. + +Other than that, this can be implemented by looping over `hooks.regRead` and returning a concatenated string.
    +Example response: `0000000000000000ffffffff8001000000000000000000420000000000000000000000000000000100000`... + +### Register Write (General) - `regWriteGeneral = (const string ®Data) -> void` +Writes all registers at once, this happens very rarely.
    +The format of `regData` is the same as the response of `hooks.regReadGeneral`.
    +Any register that is not writable or doesn't exist can be ignored.
    + +### Emulator Cache - `emuCacheInvalidate = (u64 address) -> void` +Should invalidate the emulator's cache at `address`.
    +This is only necessary if you have a re-compiler or some form of instruction cache.
    + +### Target XML - `targetXML = () -> string` +Provides an XML description of the target system.
    +The XML must not contain any newlines, and should be as short as possible.
    +If the client has access to an `.elf` file, this will be mostly ignored. + +Example implementation: +```cpp +GDB::server.hooks.targetXML = []() -> string { + return "" + "mips:4000" + ""; +}; +``` +Documentation: https://sourceware.org/gdb/onlinedocs/gdb/Target-Description-Format.html#Target-Description-Format +
    + +## Report-Functions + +### Signal `reportSignal(Signal sig, u64 originPC) -> bool` +Reports a signal/exception `sig` that occurred at `originPC`.
    +The architecture specific exception must be mapped to the enum in `Signal`.
    +As a default, `Signal::TRAP` can be used.
    + +It will return `false` if the exception occurred while the game was already paused.
    +This can be safely ignored.
    + +Since you may not be able to stop the execution before an exception occurs,
    +The `originPC` value will be saved until the next time the game is resumed.
    +An `hooks.regReadGeneral` implementation may use this to temp. return a different PC.
    +This is done to allow GDB to halt on the causing instruction instead of the exception handler.
    +If you can halt before an exception occurs, you can ignore this.
    + +### PC `reportPC(u64 pc) -> bool` +Sets a new PC, this will internally check for break- and watch-points.
    +For convenience, it will return `false` if you should halt execution.
    +If no debugger is running, it will always return `true`.
    + +You must only call this once per step, before the instruction at the given address gets executed.
    +This also means a return value of `false` should make it halt before the instruction too.
    +Once halted, it's safe to call this with the same PC each iteration.
    + +If a re-compiler is used, you may not want to call this for every single instruction.
    +In that case take a look at `hasBreakpoints()` on how to optimize this.
    + +In case you need the information if a halt is required multiple times, use `GDB::server.isHalted()` instead.
    + +### Memory Read `reportMemRead(u64 address, u32 size) -> void` +Reports that a memory read occurred at `address` with `size` bytes.
    +The passed address must be the raw un-normalized address.
    + +This is exclusively used for memory-watchpoints.
    +No PC override mechanism is provided here, since it's breaks GDB.
    + +### Memory Write `reportMemWrite(u64 address, u32 size) -> void` +Exactly the same as `reportMemRead`, but for writes instead.
    +The new value of that location will be automatically fetched by the client via a memory read,
    +and is therefore not needed here. + +## Status-Functions + +### Halted `isHalted() -> bool` +Returns if the game should be currently halted or not.
    +For convenience, the same value gets directly returned from `reportPC`.
    + +### Breakpoints `hasBreakpoints() -> bool` +Return `true` if at least one break- or watch-point is set.
    + +If you use a block-based re-compiler, stopping at every instruction may not be possible.
    +You may use this information to force single-instruction execution in that case.
    +If it returns false, you can safely resume using the block-based execution again.
    + +### PC Override `getPcOverride() -> maybe` +Returns a value if a PC override is active.
    +As mentioned in `reportSignal()`, this can be used to return a different PC letting GDB halt at the causing instruction.
    +You can safely call this function multiple times.
    +Once a single step is taken, or the game is resumed, the override is cleared.
    + +## API Usage + +This API can also be used without GDB, which allows for more use cases.
    +For example, you can write automated tooling or custom debugging UIs.
    +To make access easier, no strict checks are performed.
    +This means that the handshake protocol is optional, and checksums are not verified. + +### TCP +TCP connections behave the same way as a GDB session.
    +The connection is kept open the entire time, and commands are sent sequentially, each waiting for an response before sending the next command. + +However, it is possible to send commands even if the game is still running, +this allows for real-time data access. + +Keep in minds that the server uses the RDP-commands, which are different from what you would type into a GDB client.
    +For a list of all commands, see: https://sourceware.org/gdb/onlinedocs/gdb/Packets.html#Packets + +As an example, reading from memory would look like this: +``` +$m8020a504,100#00 +``` +This reads 100 bytes from address `0x8020a504`, the `$` and `#` define the message start/end, and the `00` is the checksum (which is not checked). + +One detail, and security check, is that new connections must send `+` as the first byte in the first payload.
    +It's also a good idea to send a proper disconnect-command before closing the socket.
    +Otherwise, the debugger will not accept new connections until a reset or restart occurs. \ No newline at end of file diff --git a/waterbox/ares64/ares/nall/gdb/server.cpp b/waterbox/ares64/ares/nall/gdb/server.cpp new file mode 100755 index 0000000000..eeb9ffb575 --- /dev/null +++ b/waterbox/ares64/ares/nall/gdb/server.cpp @@ -0,0 +1,552 @@ +#include + +#include + +using string = ::nall::string; +using string_view = ::nall::string_view; + +namespace { + constexpr bool GDB_LOG_MESSAGES = false; + + constexpr u32 MAX_REQUESTS_PER_UPDATE = 10; + constexpr u32 MAX_PACKET_SIZE = 0x4096; + constexpr u32 DEF_BREAKPOINT_SIZE = 64; + constexpr bool NON_STOP_MODE = false; // broken for now, mainly useful for multi-thread debugging, which we can't really support + + auto gdbCalcChecksum(const string &payload) -> u8 { + u8 checksum = 0; + for(char c : payload)checksum += c; + return checksum; + } + + template + inline auto addOrRemoveEntry(vector &data, T value, bool shouldAdd) { + if(shouldAdd) { + data.append(value); + } else { + data.removeByValue(value); + } + } +} + +namespace nall::GDB { + Server server{}; + + auto Server::reportSignal(Signal sig, u64 originPC) -> bool { + if(!hasActiveClient || !handshakeDone)return true; // no client -> no error + if(forceHalt)return false; // Signals can only happen while the game is running, ignore others + + pcOverride = originPC; + + forceHalt = true; + haltSignalSent = true; + sendSignal(sig); + + return true; + } + + auto Server::reportWatchpoint(const Watchpoint &wp, u64 address) -> void { + auto orgAddress = wp.addressStartOrg + (address - wp.addressStart); + forceHalt = true; + haltSignalSent = true; + sendSignal(Signal::TRAP, {wp.getTypePrefix(), hex(orgAddress), ";"}); + } + + auto Server::reportMemRead(u64 address, u32 size) -> void { + if(!watchpointRead)return; + + if(hooks.normalizeAddress) { + address = hooks.normalizeAddress(address); + } + + u64 addressEnd = address + size - 1; + for(const auto& wp : watchpointRead) { + if(wp.hasOverlap(address, addressEnd)) { + return reportWatchpoint(wp, address); + } + } + } + + auto Server::reportMemWrite(u64 address, u32 size) -> void { + if(!watchpointWrite)return; + + if(hooks.normalizeAddress) { + address = hooks.normalizeAddress(address); + } + + u64 addressEnd = address + size - 1; + for(const auto& wp : watchpointWrite) { + if(wp.hasOverlap(address, addressEnd)) { + return reportWatchpoint(wp, address); + } + } + } + + auto Server::reportPC(u64 pc) -> bool { + if(!hasActiveClient)return true; + + currentPC = pc; + bool needHalts = forceHalt || breakpoints.contains(pc); + + if(needHalts) { + forceHalt = true; // breakpoints may get deleted after a signal, but we have to stay stopped + + if(!haltSignalSent) { + haltSignalSent = true; + sendSignal(Signal::TRAP); + } + } + + if(singleStepActive) { + singleStepActive = false; + forceHalt = true; + } + + return !needHalts; + } + + /** + * NOTE: please read the comment in the header server.hpp file before making any changes here! + */ + auto Server::processCommand(const string& cmd, bool &shouldReply) -> string + { + auto cmdParts = cmd.split(":"); + auto cmdName = cmdParts[0]; + char cmdPrefix = cmdName.size() > 0 ? cmdName(0) : ' '; + + if constexpr(GDB_LOG_MESSAGES) { + print("GDB <: %s\n", cmdBuffer.data()); + } + + switch(cmdPrefix) + { + case '!': return "OK"; // informs us that "extended remote-debugging" is used + + case '?': // handshake: why did we halt? + haltProgram(); + haltSignalSent = true; + return "T05"; // needs to be faked, otherwise the GDB-client hangs up and eats 100% CPU + + case 'c': // continue + case 'C': // continue (with signal, signal itself can be ignored) + // normal stop-mode is only allowed to respond once a signal was raised, non-stop must return OK immediately + handshakeDone = true; // good indicator that GDB is done, also enables exception sending + shouldReply = NON_STOP_MODE; + resumeProgram(); + return "OK"; + + case 'D': // client wants to detach (Note: VScode doesn't seem to use this, uses vKill instead) + requestDisconnect = true; + return "OK"; + break; + + case 'g': // dump all general registers + if(hooks.regReadGeneral) { + return hooks.regReadGeneral(); + } else { + return "0000000000000000000000000000000000000000"; + } + break; + + case 'G': // set all general registers + if(hooks.regWriteGeneral) { + hooks.regWriteGeneral(cmd.slice(1)); + return "OK"; + } + break; + + case 'H': // set which thread a 'c' command that may follow belongs to (can be ignored in stop-mode) + if(cmdName == "Hc0")currentThreadC = 0; + if(cmdName == "Hc-1")currentThreadC = -1; + return "OK"; + + case 'k': // old version of vKill + if(handshakeDone) { // sometimes this gets send during handshake (to reset the program?) -> ignore + requestDisconnect = true; + } + return "OK"; + break; + + case 'm': // read memory (e.g.: "m80005A00,4") + { + if(!hooks.read) { + return ""; + } + + auto sepIdxMaybe = cmdName.find(","); + u32 sepIdx = sepIdxMaybe ? sepIdxMaybe.get() : 1; + + u64 address = cmdName.slice(1, sepIdx-1).hex(); + u64 count = cmdName.slice(sepIdx+1, cmdName.size()-sepIdx).hex(); + return hooks.read(address, count); + } + break; + + case 'M': // write memory (e.g.: "M801ef90a,4:01000000") + { + if(!hooks.write) { + return ""; + } + + auto sepIdxMaybe = cmdName.find(","); + u32 sepIdx = sepIdxMaybe ? sepIdxMaybe.get() : 1; + + u64 address = cmdName.slice(1, sepIdx-1).hex(); + u64 unitSize = cmdName.slice(sepIdx+1, 1).hex(); + u64 value = cmdParts.size() > 1 ? cmdParts[1].hex() : 0; + + hooks.write(address, unitSize, value); + return "OK"; + } + + break; + + case 'p': // read specific register (e.g.: "p15") + if(hooks.regRead) { + u32 regIdx = cmdName.slice(1).integer(); + return hooks.regRead(regIdx); + } else { + return "00000000"; + } + break; + + case 'P': // write specific register (e.g.: "P15=FFFFFFFF80001234") + if(hooks.regWrite) { + auto sepIdxMaybe = cmdName.find("="); + u32 sepIdx = sepIdxMaybe ? sepIdxMaybe.get() : 1; + + u32 regIdx = static_cast(cmdName.slice(1, sepIdx-1).hex()); + u64 regValue = cmdName.slice(sepIdx+1).hex(); + + return hooks.regWrite(regIdx, regValue) ? "OK" : "E00"; + } + break; + + case 'q': + // This tells the client what we can and can't do + if(cmdName == "qSupported"){ return { + "PacketSize=", hex(MAX_PACKET_SIZE), + ";fork-events-;swbreak+;hwbreak-", + ";vContSupported-", // prevent vCont commands (reduces potential GDB variations: some prefer using it, others don't) + NON_STOP_MODE ? ";QNonStop+" : "", + "QStartNoAckMode+", + hooks.targetXML ? ";xmlRegisters+;qXfer:features:read+" : "" // (see: https://marc.info/?l=gdb&m=149901965961257&w=2) + };} + + // handshake-command, most return dummy values to convince gdb to connect + if(cmdName == "qTStatus")return forceHalt ? "T1" : ""; + if(cmdName == "qAttached")return "1"; // we are always attached, since a game is running + if(cmdName == "qOffsets")return "Text=0;Data=0;Bss=0"; + + if(cmdName == "qSymbol")return "OK"; // client offers us symbol-names -> we don't care + + // client asks us about existing breakpoints (may happen after a re-connect) -> ignore since we clear them on connect + if(cmdName == "qTfP")return ""; + if(cmdName == "qTsP")return ""; + + // extended target features (gdb extension), most return XML data + if(cmdName == "qXfer" && cmdParts.size() > 4) + { + if(cmdParts[1] == "features" && cmdParts[2] == "read") { + // informs the client about arch/registers (https://sourceware.org/gdb/onlinedocs/gdb/Target-Description-Format.html#Target-Description-Format) + if(cmdParts[3] == "target.xml") { + return hooks.targetXML ? string{"l", hooks.targetXML()} : string{""}; + } + } + } + + // Thread-related queries + if(cmdName == "qfThreadInfo")return {"m1"}; + if(cmdName == "qsThreadInfo")return {"l"}; + if(cmdName == "qThreadExtraInfo,1")return ""; // ignoring this command fixes support for CLion (and VSCode?), otherwise gdb hangs + if(cmdName == "qC")return {"QC1"}; + // there will also be a "qP0000001f0000000000000001" command depending on the IDE, this is ignored to prevent GDB from hanging up + break; + + case 'Q': + if(cmdName == "QNonStop") { // 0=stop, 1=non-stop-mode (this allows for async GDB-communication) + if(cmdParts.size() <= 1)return "E00"; + nonStopMode = cmdParts[1] == "1"; + + if(nonStopMode) { + haltProgram(); + } else { + resumeProgram(); + } + return "OK"; + } + + if(cmdName == "QStartNoAckMode") { + if (noAckMode) { + return "OK"; + } + // The final OK has to be sent in ack mode. + sendPayload("OK"); + shouldReply = false; + noAckMode = true; + return ""; + } + break; + + case 's': { + if(cmdName.size() > 1) { + u64 address = cmdName.slice(1).integer(); + printf("stepping at address unsupported, ignore (%016" PRIX64 ")\n", address); + } + + shouldReply = false; + singleStepActive = true; + resumeProgram(); + return ""; + } break; + + case 'v': { + // normalize (e.g. "vAttach;1" -> "vAttach") + auto sepIdxMaybe = cmdName.find(";"); + auto vName = sepIdxMaybe ? cmdName.slice(0, sepIdxMaybe.get()) : cmdName; + + if(vName == "vMustReplyEmpty")return ""; // handshake-command / keep-alive (must return the same as an unknown command would) + if(vName == "vAttach")return NON_STOP_MODE ? "OK" : "S05"; // attaches to the process, we must return a fake trap-exception to make gdb happy + if(vName == "vCont?")return ""; // even though "vContSupported-" is set, gdb may still ask for it -> ignore to force e.g. `s` instead of `vCont;s:1;c` + if(vName == "vStopped")return ""; + if(vName == "vCtrlC") { + haltProgram(); + return "OK"; + } + + if(vName == "vKill") { + if(handshakeDone) { // sometimes this gets send during handshake (to reset the program?) -> ignore + requestDisconnect = true; + } + return "OK"; + } + + if(vName == "vCont") return "E00"; // if GDB completely ignores both "vCont is unsupported" responses, throw an error here + + } break; + + case 'Z': // insert breakpoint (e.g. "Z0,801a0ef4,4") + case 'z': // remove breakpoint (e.g. "z0,801a0ef4,4") + { + bool isInsert = cmdPrefix == 'Z'; + bool isHardware = cmdName(1) == '1'; // 0=software, 1=hardware + auto sepIdxMaybe = cmdName.findFrom(3, ","); + u32 sepIdx = sepIdxMaybe ? (sepIdxMaybe.get()+3) : 0; + + u64 address = cmdName.slice(3, sepIdx-1).hex(); + u64 addressStart = address; + u64 addressEnd = address + cmdName.slice(sepIdx+1).hex() - 1; + + if(hooks.normalizeAddress) { + addressStart = hooks.normalizeAddress(addressStart); + addressEnd = hooks.normalizeAddress(addressEnd); + } + Watchpoint wp{addressStart, addressEnd, address}; + + switch(cmdName(1)) { + case '0': // (hardware/software breakpoints are the same for us) + case '1': addOrRemoveEntry(breakpoints, address, isInsert); break; + + case '2': + wp.type = WatchpointType::WRITE; + addOrRemoveEntry(watchpointWrite, wp, isInsert); + break; + + case '3': + wp.type = WatchpointType::READ; + addOrRemoveEntry(watchpointRead, wp, isInsert); + break; + + case '4': + wp.type = WatchpointType::ACCESS; + addOrRemoveEntry(watchpointRead, wp, isInsert); + addOrRemoveEntry(watchpointWrite, wp, isInsert); + break; + default: return "E00"; + } + + if(hooks.emuCacheInvalidate) { // for re-compiler, otherwise breaks might be skipped + hooks.emuCacheInvalidate(address); + } + return "OK"; + } + } + + printf("Unknown-Command: %s (data: %s)\n", cmdName.data(), cmdBuffer.data()); + return ""; + } + + auto Server::onText(string_view text) -> void { + + if(cmdBuffer.size() == 0) { + cmdBuffer.reserve(text.size()); + } + + for(char c : text) + { + switch(c) + { + case '$': + insideCommand = true; + break; + + case '#': { // end of message + 2-char checksum after that + insideCommand = false; + + ++messageCount; + bool shouldReply = true; + auto cmdRes = processCommand(cmdBuffer, shouldReply); + if(shouldReply) { + sendPayload(cmdRes); + } else if(!noAckMode) { + sendText("+"); + } + + cmdBuffer = ""; + } break; + + case '+': break; // "OK" response -> ignore + + case '\x03': // CTRL+C (same as "vCtrlC" packet) -> force halt + if constexpr(GDB_LOG_MESSAGES) { + printf("GDB <: CTRL+C [0x03]\n"); + } + haltProgram(); + break; + + default: + if(insideCommand) { + cmdBuffer.append(c); + } + } + } + } + + auto Server::updateLoop() -> void { + if(!isStarted())return; + + if(requestDisconnect) { + requestDisconnect = false; + if(!noAckMode) { + sendText("+"); + } + disconnectClient(); + resumeProgram(); + return; + } + + // The following code manages the message processing which gets exchanged from the server thread. + // It was carefully build to balance latency, throughput and CPU usage to let the game still run at full speed + // while allowing for fast processing once the debugger is halted. + + u32 loopFrames = isHalted() ? 20 : 1; // "frames" to check (loops with sleep in-between) + u32 loopCount = isHalted() ? 500 : 100; // loops inside a frame, the more the less latency, but CPU usage goes up + u32 maxLoopResets = 10000; // how many times can a new message reset the counter (prevents infinite loops with misbehaving clients) + bool wasHalted = isHalted(); + + for(u32 frame=0; frame 0 && maxLoopResets > 0) { + i = loopCount; // reset loop here to keep a fast chain of messages going (reduces latency) + --maxLoopResets; + } + } + + if(wasHalted)usleep(1); + } + } + + auto Server::getStatusText(u32 port, bool useIPv4) -> string { + auto url = getURL(port, useIPv4); + string prefix = isHalted() ? "⬛" : "▶"; + + if(hasClient())return {prefix, " GDB connected ", url}; + if(isStarted())return {"GDB listening ", url}; + return {"GDB pending (", url, ")"}; + } + + auto Server::sendSignal(Signal code) -> void { + sendPayload({"S", hex(static_cast(code), 2)}); + } + + auto Server::sendSignal(Signal code, const string& reason) -> void { + sendPayload({"T", hex(static_cast(code), 2), reason}); + } + + auto Server::sendPayload(const string& payload) -> void { + string msg{noAckMode ? "$" : "+$", payload, '#', hex(gdbCalcChecksum(payload), 2, '0')}; + if constexpr(GDB_LOG_MESSAGES) { + printf("GDB >: %.*s\n", msg.size() > 100 ? 100 : msg.size(), msg.data()); + } + sendText(msg); + } + + auto Server::haltProgram() -> void { + forceHalt = true; + haltSignalSent = false; + } + + auto Server::resumeProgram() -> void { + pcOverride.reset(); + forceHalt = false; + haltSignalSent = false; + } + + auto Server::onConnect() -> void { + printf("GDB client connected\n"); + resetClientData(); + hasActiveClient = true; + } + + auto Server::onDisconnect() -> void { + printf("GDB client disconnected\n"); + hadHandshake = false; + resetClientData(); + } + + auto Server::reset() -> void { + hooks.read.reset(); + hooks.write.reset(); + hooks.normalizeAddress.reset(); + hooks.regReadGeneral.reset(); + hooks.regWriteGeneral.reset(); + hooks.regRead.reset(); + hooks.regWrite.reset(); + hooks.emuCacheInvalidate.reset(); + hooks.targetXML.reset(); + + resetClientData(); + } + + auto Server::resetClientData() -> void { + breakpoints.reset(); + breakpoints.reserve(DEF_BREAKPOINT_SIZE); + + watchpointRead.reset(); + watchpointRead.reserve(DEF_BREAKPOINT_SIZE); + + watchpointWrite.reset(); + watchpointWrite.reserve(DEF_BREAKPOINT_SIZE); + + pcOverride.reset(); + insideCommand = false; + cmdBuffer = ""; + haltSignalSent = false; + forceHalt = false; + singleStepActive = false; + nonStopMode = false; + noAckMode = false; + + currentThreadC = -1; + hasActiveClient = false; + handshakeDone = false; + requestDisconnect = false; + } + +}; diff --git a/waterbox/ares64/ares/nall/gdb/server.hpp b/waterbox/ares64/ares/nall/gdb/server.hpp new file mode 100755 index 0000000000..a767429356 --- /dev/null +++ b/waterbox/ares64/ares/nall/gdb/server.hpp @@ -0,0 +1,131 @@ +#pragma once + +#include +#include + +namespace nall::GDB { + +enum class Signal : u8 { + HANGUP = 1, + INT = 2, + QUIT = 3, + ILLEGAL = 4, + TRAP = 5, + ABORT = 6, + SEGV = 11, +}; + +/** + * This implements a GDB server to handle remote debugging via a GDB client. + * It is both independent of ares itself and any specific system. + * Functionality is added by providing system-specific callbacks, as well as using the API inside a system. + * (See the Readme.md file for more information.) + * + * NOTE: + * Command handling and the overall logic was carefully designed to support as many IDEs and GDB versions as possible. + * Things can break very easily (and the official documentation may lie), so be very sure of any changes made here. + * If changes are necessary, please verify that the following gdb-versions / IDEs still work properly: + * + * GDB: + * - gdb-multiarch (the plain vanilla version exists in most package managers, supports a lot of arches) + * - mips64-ultra-elf-gdb (special MIPS build of gdb-multiarch, i do NOT recommend it, behaves strangely) + * - mingw-w64-x86_64-gdb (vanilla build for Windows/MSYS) + * + * IDEs/Tools: + * - GDB's CLI + * - VSCode + * - CLion (with bundled gdb-multiarch) + * + * For testing, please also check both linux and windows (WSL2). + * With WSL2, windows-ares is started from within WSL, while the debugger runs in linux. + * This can be easily tested with VSCode and it's debugger. + */ +class Server : public nall::TCPText::Server { + public: + + auto reset() -> void; + + struct { + // Memory + function read{}; + function write{}; + function normalizeAddress{}; + + // Registers + function regReadGeneral{}; + function regWriteGeneral{}; + function regRead{}; + function regWrite{}; + + // Emulator + function emuCacheInvalidate{}; + function targetXML{}; + + + } hooks{}; + + // Exception + auto reportSignal(Signal sig, u64 originPC) -> bool; + + // PC / Memory State Updates + auto reportPC(u64 pc) -> bool; + auto reportMemRead(u64 address, u32 size) -> void; + auto reportMemWrite(u64 address, u32 size) -> void; + + // Breakpoints / Watchpoints + auto isHalted() const { return forceHalt && haltSignalSent; } + auto hasBreakpoints() const { + return breakpoints || singleStepActive || watchpointRead || watchpointWrite; + } + + auto getPcOverride() const { return pcOverride; }; + + auto updateLoop() -> void; + auto getStatusText(u32 port, bool useIPv4) -> string; + + protected: + auto onText(string_view text) -> void override; + auto onConnect() -> void override; + auto onDisconnect() -> void override; + + private: + bool insideCommand{false}; + string cmdBuffer{""}; + + bool haltSignalSent{false}; // marks if a signal as been sent for new halts (force-halt and breakpoints) + bool forceHalt{false}; // forces a halt despite no breakpoints being hit + bool singleStepActive{false}; + + bool noAckMode{false}; // gets set if lldb prefers no acknowledgements + bool nonStopMode{false}; // (NOTE: Not working for now), gets set if gdb wants to switch over to async-messaging + bool handshakeDone{false}; // set to true after a few handshake commands, used to prevent exception-reporting until client is ready + bool requestDisconnect{false}; // set to true if the client decides it wants to disconnect + + bool hasActiveClient{false}; + u32 messageCount{0}; // message count per update loop + s32 currentThreadC{-1}; // selected thread for the next 'c' command + + u64 currentPC{0}; + maybe pcOverride{0}; // temporary override to handle edge-cases for exceptions/watchpoints + + // client-state: + vector breakpoints{}; + vector watchpointRead{}; + vector watchpointWrite{}; + + auto processCommand(const string& cmd, bool &shouldReply) -> string; + auto resetClientData() -> void; + + auto reportWatchpoint(const Watchpoint &wp, u64 address) -> void; + + auto sendPayload(const string& payload) -> void; + auto sendSignal(Signal code) -> void; + auto sendSignal(Signal code, const string& reason) -> void; + + auto haltProgram() -> void; + auto resumeProgram() -> void; +}; + +extern Server server; + +} diff --git a/waterbox/ares64/ares/nall/gdb/watchpoint.hpp b/waterbox/ares64/ares/nall/gdb/watchpoint.hpp new file mode 100755 index 0000000000..b60d32657d --- /dev/null +++ b/waterbox/ares64/ares/nall/gdb/watchpoint.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +namespace nall::GDB { + + enum class WatchpointType : u32 { + WRITE, READ, ACCESS + }; + + struct Watchpoint { + u64 addressStart{0}; + u64 addressEnd{0}; + u64 addressStartOrg{0}; // un-normalized address, GDB needs this + WatchpointType type{}; + + auto operator==(const Watchpoint& w) const { + return addressStart == w.addressStart && addressEnd == w.addressEnd + && addressStartOrg == w.addressStartOrg && type == w.type; + } + + auto hasOverlap(u64 start, u64 end) const { + return (end >= addressStart) && (start <= addressEnd); + } + + auto getTypePrefix() const -> string { + if(type == WatchpointType::WRITE)return "watch:"; + if(type == WatchpointType::READ)return "rwatch:"; + return "awatch:"; + } + }; +} \ No newline at end of file diff --git a/waterbox/ares64/ares/nall/hash/crc16.hpp b/waterbox/ares64/ares/nall/hash/crc16.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/crc32.hpp b/waterbox/ares64/ares/nall/hash/crc32.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/crc64.hpp b/waterbox/ares64/ares/nall/hash/crc64.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/hash.hpp b/waterbox/ares64/ares/nall/hash/hash.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/sha224.hpp b/waterbox/ares64/ares/nall/hash/sha224.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/sha256.hpp b/waterbox/ares64/ares/nall/hash/sha256.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/sha384.hpp b/waterbox/ares64/ares/nall/hash/sha384.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hash/sha512.hpp b/waterbox/ares64/ares/nall/hash/sha512.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hashset.hpp b/waterbox/ares64/ares/nall/hashset.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/hid.hpp b/waterbox/ares64/ares/nall/hid.hpp old mode 100644 new mode 100755 index cc8e7f120d..c2ce520ecd --- a/waterbox/ares64/ares/nall/hid.hpp +++ b/waterbox/ares64/ares/nall/hid.hpp @@ -17,7 +17,7 @@ struct Input { private: string _name; s16 _value = 0; - friend class Group; + friend struct Group; }; struct Group : vector { @@ -36,7 +36,7 @@ struct Group : vector { private: string _name; - friend class Device; + friend struct Device; }; struct Device : vector { diff --git a/waterbox/ares64/ares/nall/http/client.cpp b/waterbox/ares64/ares/nall/http/client.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/client.hpp b/waterbox/ares64/ares/nall/http/client.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/message.hpp b/waterbox/ares64/ares/nall/http/message.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/request.hpp b/waterbox/ares64/ares/nall/http/request.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/response.hpp b/waterbox/ares64/ares/nall/http/response.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/role.hpp b/waterbox/ares64/ares/nall/http/role.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/server.cpp b/waterbox/ares64/ares/nall/http/server.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/http/server.hpp b/waterbox/ares64/ares/nall/http/server.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image.hpp b/waterbox/ares64/ares/nall/image.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/blend.hpp b/waterbox/ares64/ares/nall/image/blend.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/core.hpp b/waterbox/ares64/ares/nall/image/core.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/fill.hpp b/waterbox/ares64/ares/nall/image/fill.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/interpolation.hpp b/waterbox/ares64/ares/nall/image/interpolation.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/load.hpp b/waterbox/ares64/ares/nall/image/load.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/multifactor.hpp b/waterbox/ares64/ares/nall/image/multifactor.hpp old mode 100644 new mode 100755 index be7722aa5e..4c1b1d4e74 --- a/waterbox/ares64/ares/nall/image/multifactor.hpp +++ b/waterbox/ares64/ares/nall/image/multifactor.hpp @@ -3,24 +3,24 @@ namespace nall { inline multiFactorImage::multiFactorImage(const multiFactorImage& source) { - (*this) = source; + operator=(source); } inline multiFactorImage::multiFactorImage(multiFactorImage&& source) { - operator=(std::forward(source)); + operator=(std::move(source)); } inline multiFactorImage::multiFactorImage(const image& lowDPI, const image& highDPI) { - (*(image*)this) = lowDPI; + image::operator=(lowDPI); _highDPI = highDPI; } inline multiFactorImage::multiFactorImage(const image& source) { - (*(image*)this) = source; + image::operator=(source); } inline multiFactorImage::multiFactorImage(image&& source) { - operator=(std::forward(source)); + image::operator=(std::move(source)); } inline multiFactorImage::multiFactorImage() { @@ -32,7 +32,7 @@ inline multiFactorImage::~multiFactorImage() { inline auto multiFactorImage::operator=(const multiFactorImage& source) -> multiFactorImage& { if(this == &source) return *this; - (*(image*)this) = source; + image::operator=(source); _highDPI = source._highDPI; return *this; @@ -41,15 +41,15 @@ inline auto multiFactorImage::operator=(const multiFactorImage& source) -> multi inline auto multiFactorImage::operator=(multiFactorImage&& source) -> multiFactorImage& { if(this == &source) return *this; - (*(image*)this) = source; - _highDPI = source._highDPI; + image::operator=(std::move(source)); + _highDPI = std::move(source._highDPI); return *this; } inline auto multiFactorImage::operator==(const multiFactorImage& source) const -> bool { - if((const image&)*this != (const image&)source) return false; - return _highDPI != source._highDPI; + if(image::operator!=(source)) return false; + return _highDPI == source._highDPI; } inline auto multiFactorImage::operator!=(const multiFactorImage& source) const -> bool { diff --git a/waterbox/ares64/ares/nall/image/scale.hpp b/waterbox/ares64/ares/nall/image/scale.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/static.hpp b/waterbox/ares64/ares/nall/image/static.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/image/utility.hpp b/waterbox/ares64/ares/nall/image/utility.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/induced-sort.hpp b/waterbox/ares64/ares/nall/induced-sort.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/inline-if.hpp b/waterbox/ares64/ares/nall/inline-if.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/inode.cpp b/waterbox/ares64/ares/nall/inode.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/inode.hpp b/waterbox/ares64/ares/nall/inode.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/instance.hpp b/waterbox/ares64/ares/nall/instance.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/interpolation.hpp b/waterbox/ares64/ares/nall/interpolation.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/intrinsics.hpp b/waterbox/ares64/ares/nall/intrinsics.hpp old mode 100644 new mode 100755 index c3aa3d4871..d00b54bc01 --- a/waterbox/ares64/ares/nall/intrinsics.hpp +++ b/waterbox/ares64/ares/nall/intrinsics.hpp @@ -25,7 +25,6 @@ namespace nall { static constexpr bool GCC = 0; static constexpr bool Microsoft = 0; }; - #pragma clang diagnostic error "-Wc++20-extensions" #pragma clang diagnostic error "-Wgnu-case-range" #pragma clang diagnostic error "-Wgnu-statement-expression" #pragma clang diagnostic error "-Wvla" @@ -64,6 +63,10 @@ namespace nall { static constexpr bool GCC = 0; static constexpr bool Microsoft = 1; }; + #pragma warning(disable:4146) //unary minus operator applied to unsigned type, result still unsigned + #pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data + #pragma warning(disable:4804) //unsafe use of type 'bool' in operation + #pragma warning(disable:4805) //unsafe mix of type 'bool' and type 'type' in operation #pragma warning(disable:4996) //libc "deprecation" warnings #else #error "unable to detect compiler" @@ -188,6 +191,8 @@ namespace nall { static constexpr bool arm32 = 0; static constexpr bool ppc64 = 0; static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; }; #elif defined(__amd64__) || defined(_M_AMD64) #define ARCHITECTURE_AMD64 @@ -201,6 +206,8 @@ namespace nall { static constexpr bool arm32 = 0; static constexpr bool ppc64 = 0; static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; }; #elif defined(__aarch64__) || defined(_M_ARM64) #define ARCHITECTURE_ARM64 @@ -214,6 +221,8 @@ namespace nall { static constexpr bool arm32 = 0; static constexpr bool ppc64 = 0; static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; }; #elif defined(__arm__) #define ARCHITECTURE_ARM32 @@ -224,6 +233,8 @@ namespace nall { static constexpr bool arm32 = 1; static constexpr bool ppc64 = 0; static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; }; #elif defined(__ppc64__) || defined(_ARCH_PPC64) #define ARCHITECTURE_PPC64 @@ -234,6 +245,8 @@ namespace nall { static constexpr bool arm32 = 0; static constexpr bool ppc64 = 1; static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; }; #elif defined(__ppc__) || defined(_ARCH_PPC) || defined(_M_PPC) #define ARCHITECTURE_PPC32 @@ -244,6 +257,32 @@ namespace nall { static constexpr bool arm32 = 0; static constexpr bool ppc64 = 0; static constexpr bool ppc32 = 1; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 0; + }; +#elif defined(__riscv) && __riscv_xlen == 64 + #define ARCHITECTURE_RV64 + struct Architecture { + static constexpr bool x86 = 0; + static constexpr bool amd64 = 0; + static constexpr bool arm64 = 0; + static constexpr bool arm32 = 0; + static constexpr bool ppc64 = 0; + static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 1; + static constexpr bool rv32 = 0; + }; +#elif defined(__riscv) && __riscv_xlen == 32 + #define ARCHITECTURE_RV32 + struct Architecture { + static constexpr bool x86 = 0; + static constexpr bool amd64 = 0; + static constexpr bool arm64 = 0; + static constexpr bool arm32 = 0; + static constexpr bool ppc64 = 0; + static constexpr bool ppc32 = 0; + static constexpr bool rv64 = 0; + static constexpr bool rv32 = 1; }; #else #error "unable to detect architecture" diff --git a/waterbox/ares64/ares/nall/ips.hpp b/waterbox/ares64/ares/nall/ips.hpp new file mode 100755 index 0000000000..3bc480025f --- /dev/null +++ b/waterbox/ares64/ares/nall/ips.hpp @@ -0,0 +1,63 @@ +#pragma once + +namespace nall::IPS { + +inline auto apply(array_view source, array_view patch, maybe result = {}) -> maybe> { + #define error(text) { if(result) *result = {"error: ", text}; return {}; } + #define success() { if(result) *result = ""; return target; } + + vector target; + for (u32 i : range(source.size())) { + target.append(source[i]); + } + + u32 patchOffset = 0; + auto read = [&]() -> u8 { + return patch[patchOffset++]; + }; + auto readOffset = [&]() -> u32 { + u32 result = read() << 16; + result |= read() << 8; + result |= read(); + return result; + }; + auto readLength = [&]() -> u32 { + u32 result = read() << 8; + result |= read(); + return result; + }; + auto write = [&](u32 index, u8 data) { + target[index] = data; + }; + + if(read() != 'P') error("IPS header invalid"); + if(read() != 'A') error("IPS header invalid"); + if(read() != 'T') error("IPS header invalid"); + if(read() != 'C') error("IPS header invalid"); + if(read() != 'H') error("IPS header invalid"); + + u32 patchSize = patch.size(); + while (patchOffset < patchSize - 3) { + u32 offset = readOffset(); + u32 length = readLength(); + + if(target.size() < offset + length) error("Invalid IPS patch file"); + + if (length == 0) { + length = readLength(); + u8 data = read(); + for(u32 i : range(length)) write(offset + i, data); + } else { + for (u32 i : range(length)) write(offset + i, read()); + } + } + + if(read() != 'E') error("IPS footer invalid"); + if(read() != 'O') error("IPS footer invalid"); + if(read() != 'F') error("IPS footer invalid"); + + success(); + #undef error + #undef success +} +} diff --git a/waterbox/ares64/ares/nall/iterator.hpp b/waterbox/ares64/ares/nall/iterator.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/literals.hpp b/waterbox/ares64/ares/nall/literals.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/locale.hpp b/waterbox/ares64/ares/nall/locale.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/location.hpp b/waterbox/ares64/ares/nall/location.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/mac/poly1305.hpp b/waterbox/ares64/ares/nall/mac/poly1305.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/macos/guard.hpp b/waterbox/ares64/ares/nall/macos/guard.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/main.cpp b/waterbox/ares64/ares/nall/main.cpp old mode 100644 new mode 100755 index 37b7a5ee30..c11cf2ad08 --- a/waterbox/ares64/ares/nall/main.cpp +++ b/waterbox/ares64/ares/nall/main.cpp @@ -1,6 +1,7 @@ #include #if defined(PLATFORM_WINDOWS) + #include #include #include #include diff --git a/waterbox/ares64/ares/nall/main.hpp b/waterbox/ares64/ares/nall/main.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/map.hpp b/waterbox/ares64/ares/nall/map.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/matrix-multiply.hpp b/waterbox/ares64/ares/nall/matrix-multiply.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/matrix.hpp b/waterbox/ares64/ares/nall/matrix.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/maybe.hpp b/waterbox/ares64/ares/nall/maybe.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/memory.cpp b/waterbox/ares64/ares/nall/memory.cpp old mode 100644 new mode 100755 index 8479cff96b..831eb25568 --- a/waterbox/ares64/ares/nall/memory.cpp +++ b/waterbox/ares64/ares/nall/memory.cpp @@ -29,18 +29,17 @@ NALL_HEADER_INLINE auto unmap(void* target, u32 size) -> void { #endif } -NALL_HEADER_INLINE auto protect(void* target, u32 size, bool executable) -> void { +NALL_HEADER_INLINE auto protect(void* target, u32 size, bool executable) -> bool { #if defined(API_WINDOWS) DWORD protect = executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; DWORD oldProtect; - VirtualProtect(target, size, protect, &oldProtect); + return VirtualProtect(target, size, protect, &oldProtect); #elif defined(API_POSIX) int prot = PROT_READ | PROT_WRITE; if(executable) { prot |= PROT_EXEC; } - int ret = mprotect(target, size, prot); - assert(ret == 0); + return !mprotect(target, size, prot); #endif } diff --git a/waterbox/ares64/ares/nall/memory.hpp b/waterbox/ares64/ares/nall/memory.hpp old mode 100644 new mode 100755 index c932702bae..23c08b1c43 --- a/waterbox/ares64/ares/nall/memory.hpp +++ b/waterbox/ares64/ares/nall/memory.hpp @@ -34,7 +34,7 @@ namespace nall::memory { auto map(u32 size, bool executable) -> void*; auto unmap(void* target, u32 size) -> void; - auto protect(void* target, u32 size, bool executable) -> void; + auto protect(void* target, u32 size, bool executable) -> bool; auto jitprotect(bool executable) -> void; } @@ -195,16 +195,18 @@ template auto writem(void* target, T data) -> void { for(s32 n = size - 1; n >= 0; n--) *p++ = data >> n * 8; } -auto map(u32 size, bool executable) -> void*; - -auto unmap(void* target, u32 size) -> void; - -auto protect(void* target, u32 size, bool executable) -> void; - inline auto jitprotect(bool executable) -> void { #if defined(PLATFORM_MACOS) if(__builtin_available(macOS 11.0, *)) { - pthread_jit_write_protect_np(executable); + static thread_local s32 depth = 0; + if(!executable && depth++ == 0 + || executable && --depth == 0) { + pthread_jit_write_protect_np(executable); + } + #if defined(DEBUG) + struct unmatched_jitprotect {}; + if(depth < 0 || depth > 10) throw unmatched_jitprotect{}; + #endif } #endif } diff --git a/waterbox/ares64/ares/nall/merge-sort.hpp b/waterbox/ares64/ares/nall/merge-sort.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/nall.cpp b/waterbox/ares64/ares/nall/nall.cpp old mode 100644 new mode 100755 index 223dde853c..890c9882e6 --- a/waterbox/ares64/ares/nall/nall.cpp +++ b/waterbox/ares64/ares/nall/nall.cpp @@ -10,7 +10,6 @@ #include #include #include -//#include #include #include #include @@ -18,6 +17,8 @@ #include #include #include +#include +#include //currently unused by ares //#include //#include diff --git a/waterbox/ares64/ares/nall/nall.hpp b/waterbox/ares64/ares/nall/nall.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/path.cpp b/waterbox/ares64/ares/nall/path.cpp old mode 100644 new mode 100755 index 02a12b9f30..265cf9fe3a --- a/waterbox/ares64/ares/nall/path.cpp +++ b/waterbox/ares64/ares/nall/path.cpp @@ -2,6 +2,8 @@ #if defined(PLATFORM_WINDOWS) #include +#elif defined(PLATFORM_MACOS) + #include #endif namespace nall::Path { @@ -14,12 +16,34 @@ NALL_HEADER_INLINE auto program() -> string { result.transform("\\", "/"); return Path::real(result); #else + #if defined(PLATFORM_MACOS) + if (CFBundleRef bundle = CFBundleGetMainBundle()) { + char path[PATH_MAX] = ""; + CFURLRef url = CFBundleCopyBundleURL(bundle); + CFURLGetFileSystemRepresentation(url, true, reinterpret_cast(path), sizeof(path)); + CFRelease(url); + return Path::real(path); + } + #endif Dl_info info; dladdr((void*)&program, &info); return Path::real(info.dli_fname); #endif } +NALL_HEADER_INLINE auto resources() -> string { + #if defined(PLATFORM_MACOS) + if (CFBundleRef bundle = CFBundleGetMainBundle()) { + char path[PATH_MAX] = ""; + CFURLRef url = CFBundleCopyBundleURL(bundle); + CFURLGetFileSystemRepresentation(url, true, reinterpret_cast(path), sizeof(path)); + CFRelease(url); + return string(path).append("/Contents/Resources/"); + } + #endif + return program(); +} + NALL_HEADER_INLINE auto root() -> string { #if defined(PLATFORM_WINDOWS) wchar_t path[PATH_MAX] = L""; diff --git a/waterbox/ares64/ares/nall/path.hpp b/waterbox/ares64/ares/nall/path.hpp old mode 100644 new mode 100755 index b9b602a68d..6218110050 --- a/waterbox/ares64/ares/nall/path.hpp +++ b/waterbox/ares64/ares/nall/path.hpp @@ -26,6 +26,10 @@ inline auto real(string_view name) -> string { auto program() -> string; +// program() +// ./ares.app/Contents/Resources/ +auto resources() -> string; + // / // c:/ auto root() -> string; diff --git a/waterbox/ares64/ares/nall/platform.cpp b/waterbox/ares64/ares/nall/platform.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/platform.hpp b/waterbox/ares64/ares/nall/platform.hpp old mode 100644 new mode 100755 index 5fabcb2aed..a87eab5ced --- a/waterbox/ares64/ares/nall/platform.hpp +++ b/waterbox/ares64/ares/nall/platform.hpp @@ -22,6 +22,7 @@ namespace Math { #include #include #include +#include #include #include diff --git a/waterbox/ares64/ares/nall/pointer.hpp b/waterbox/ares64/ares/nall/pointer.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/posix/service.hpp b/waterbox/ares64/ares/nall/posix/service.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/posix/shared-memory.hpp b/waterbox/ares64/ares/nall/posix/shared-memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives.hpp b/waterbox/ares64/ares/nall/primitives.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/bit-field.hpp b/waterbox/ares64/ares/nall/primitives/bit-field.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/bit-range.hpp b/waterbox/ares64/ares/nall/primitives/bit-range.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/boolean.hpp b/waterbox/ares64/ares/nall/primitives/boolean.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/integer.hpp b/waterbox/ares64/ares/nall/primitives/integer.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/literals.hpp b/waterbox/ares64/ares/nall/primitives/literals.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/natural.hpp b/waterbox/ares64/ares/nall/primitives/natural.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/real.hpp b/waterbox/ares64/ares/nall/primitives/real.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/primitives/types.hpp b/waterbox/ares64/ares/nall/primitives/types.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/priority-queue.hpp b/waterbox/ares64/ares/nall/priority-queue.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/property.hpp b/waterbox/ares64/ares/nall/property.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/queue.hpp b/waterbox/ares64/ares/nall/queue.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/queue/spsc.hpp b/waterbox/ares64/ares/nall/queue/spsc.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/queue/st.hpp b/waterbox/ares64/ares/nall/queue/st.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/random.cpp b/waterbox/ares64/ares/nall/random.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/random.hpp b/waterbox/ares64/ares/nall/random.hpp old mode 100644 new mode 100755 index c8114ba285..182707e91e --- a/waterbox/ares64/ares/nall/random.hpp +++ b/waterbox/ares64/ares/nall/random.hpp @@ -57,7 +57,7 @@ private: static const u64 crc64 = 0xc96c'5795'd787'0f42; u64 lfsr = crc64; - friend class RNG; + friend struct RNG; }; struct PCG : RNG { @@ -91,7 +91,7 @@ private: u64 state = 0; u64 increment = 0; - friend class RNG; + friend struct RNG; }; } @@ -121,7 +121,7 @@ private: Cipher::XChaCha20 context{0, 0}; u32 counter = 0; - friend class RNG; + friend struct RNG; }; } diff --git a/waterbox/ares64/ares/nall/range.hpp b/waterbox/ares64/ares/nall/range.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/amd64.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/amd64.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/constants.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/constants.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/emitter.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/emitter.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-systemv.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-systemv.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-windows.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/encoder-calls-windows.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/amd64/encoder-instructions.hpp b/waterbox/ares64/ares/nall/recompiler/amd64/encoder-instructions.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/generic/constants.hpp b/waterbox/ares64/ares/nall/recompiler/generic/constants.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/generic/encoder-calls.hpp b/waterbox/ares64/ares/nall/recompiler/generic/encoder-calls.hpp old mode 100644 new mode 100755 index cb7e935d08..b4a1b0174b --- a/waterbox/ares64/ares/nall/recompiler/generic/encoder-calls.hpp +++ b/waterbox/ares64/ares/nall/recompiler/generic/encoder-calls.hpp @@ -44,7 +44,7 @@ template alwaysinline auto call(auto (C::*function)(P...) -> R, C* object, P0 p0) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, imm64{object}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64{p0}.data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64(p0).data); sljit_s32 type = SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 1) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 2); if constexpr(!std::is_void_v) type |= SLJIT_ARG_RETURN(SLJIT_ARG_TYPE_W); @@ -54,8 +54,8 @@ template alwaysinline auto call(auto (C::*function)(P...) -> R, C* object, P0 p0, P1 p1) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, imm64{object}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64{p0}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, imm64{p1}.data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64(p0).data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, imm64(p1).data); sljit_s32 type = SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 1) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 2) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 3); @@ -66,9 +66,9 @@ template alwaysinline auto call(auto (C::*function)(P...) -> R, C* object, P0 p0, P1 p1, P2 p2) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, imm64{object}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64{p0}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, imm64{p1}.data); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, imm64{p2}.data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, imm64(p0).data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, imm64(p1).data); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, imm64(p2).data); sljit_s32 type = SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 1) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 2) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W, 3) diff --git a/waterbox/ares64/ares/nall/recompiler/generic/encoder-instructions.hpp b/waterbox/ares64/ares/nall/recompiler/generic/encoder-instructions.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/recompiler/generic/generic.hpp b/waterbox/ares64/ares/nall/recompiler/generic/generic.hpp old mode 100644 new mode 100755 index 8872c460d2..dd102be37e --- a/waterbox/ares64/ares/nall/recompiler/generic/generic.hpp +++ b/waterbox/ares64/ares/nall/recompiler/generic/generic.hpp @@ -3,7 +3,7 @@ #if defined(SLJIT) namespace nall::recompiler { struct generic { - static constexpr bool supported = Architecture::amd64 | Architecture::arm64 | Architecture::ppc64; + static constexpr bool supported = Architecture::amd64 | Architecture::arm64 | Architecture::ppc64 | Architecture::rv64; bump_allocator& allocator; sljit_compiler* compiler = nullptr; @@ -31,6 +31,7 @@ namespace nall::recompiler { auto endFunction() -> u8* { u8* code = (u8*)sljit_generate_code(compiler); + allocator.reserve(sljit_get_generated_code_size(compiler)); resetCompiler(); return code; } diff --git a/waterbox/ares64/ares/nall/reed-solomon.hpp b/waterbox/ares64/ares/nall/reed-solomon.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/run.cpp b/waterbox/ares64/ares/nall/run.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/run.hpp b/waterbox/ares64/ares/nall/run.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/serial.hpp b/waterbox/ares64/ares/nall/serial.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/serializer.hpp b/waterbox/ares64/ares/nall/serializer.hpp old mode 100644 new mode 100755 index 741753db1c..229edf23d6 --- a/waterbox/ares64/ares/nall/serializer.hpp +++ b/waterbox/ares64/ares/nall/serializer.hpp @@ -76,11 +76,10 @@ struct serializer { } template auto operator()(T& value) -> serializer& { - constexpr bool integral = is_integral_v || is_same_v; - static_assert(has_serialize_v || integral || is_floating_point_v); + static_assert(has_serialize_v || is_integral_v || is_floating_point_v); if constexpr(has_serialize_v) { value.serialize(*this); - } else if constexpr(integral) { + } else if constexpr(is_integral_v) { integer(value); } else if constexpr(is_floating_point_v) { real(value); diff --git a/waterbox/ares64/ares/nall/service.hpp b/waterbox/ares64/ares/nall/service.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/set.hpp b/waterbox/ares64/ares/nall/set.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/shared-memory.hpp b/waterbox/ares64/ares/nall/shared-memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/shared-pointer.hpp b/waterbox/ares64/ares/nall/shared-pointer.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/smtp.cpp b/waterbox/ares64/ares/nall/smtp.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/smtp.hpp b/waterbox/ares64/ares/nall/smtp.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/stdint.hpp b/waterbox/ares64/ares/nall/stdint.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string.hpp b/waterbox/ares64/ares/nall/string.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/allocator/adaptive.hpp b/waterbox/ares64/ares/nall/string/allocator/adaptive.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/allocator/copy-on-write.hpp b/waterbox/ares64/ares/nall/string/allocator/copy-on-write.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/allocator/small-string-optimization.hpp b/waterbox/ares64/ares/nall/string/allocator/small-string-optimization.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/allocator/vector.hpp b/waterbox/ares64/ares/nall/string/allocator/vector.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/atoi.hpp b/waterbox/ares64/ares/nall/string/atoi.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/cast.hpp b/waterbox/ares64/ares/nall/string/cast.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/compare.hpp b/waterbox/ares64/ares/nall/string/compare.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/convert.hpp b/waterbox/ares64/ares/nall/string/convert.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/core.hpp b/waterbox/ares64/ares/nall/string/core.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/eval/evaluator.hpp b/waterbox/ares64/ares/nall/string/eval/evaluator.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/eval/literal.hpp b/waterbox/ares64/ares/nall/string/eval/literal.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/eval/node.hpp b/waterbox/ares64/ares/nall/string/eval/node.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/eval/parser.hpp b/waterbox/ares64/ares/nall/string/eval/parser.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/find.hpp b/waterbox/ares64/ares/nall/string/find.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/format.hpp b/waterbox/ares64/ares/nall/string/format.hpp old mode 100644 new mode 100755 index 8400811951..5aeca7e1ee --- a/waterbox/ares64/ares/nall/string/format.hpp +++ b/waterbox/ares64/ares/nall/string/format.hpp @@ -108,6 +108,12 @@ template inline auto hex(T value, long precision, char padchar) -> s return buffer; } +// ~3x faster than method above with larger payloads of single individual bytes +inline auto hexByte(char* out, u8 value) -> void { + out[0] = "0123456789ABCDEF"[value >> 4]; + out[1] = "0123456789ABCDEF"[value & 0xF]; +} + template inline auto octal(T value, long precision, char padchar) -> string { string buffer; buffer.resize(sizeof(T) * 3); diff --git a/waterbox/ares64/ares/nall/string/markup/bml.hpp b/waterbox/ares64/ares/nall/string/markup/bml.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/markup/find.hpp b/waterbox/ares64/ares/nall/string/markup/find.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/markup/node.hpp b/waterbox/ares64/ares/nall/string/markup/node.hpp old mode 100644 new mode 100755 index 2f1ad7bfed..243b2a53b0 --- a/waterbox/ares64/ares/nall/string/markup/node.hpp +++ b/waterbox/ares64/ares/nall/string/markup/node.hpp @@ -40,7 +40,7 @@ protected: auto _lookup(const string& path) const -> Node; auto _create(const string& path) -> Node; - friend class Node; + friend struct Node; }; struct Node { diff --git a/waterbox/ares64/ares/nall/string/markup/xml.hpp b/waterbox/ares64/ares/nall/string/markup/xml.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/match.hpp b/waterbox/ares64/ares/nall/string/match.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/pascal.hpp b/waterbox/ares64/ares/nall/string/pascal.hpp old mode 100644 new mode 100755 index e2aca838ee..59bdb0b082 --- a/waterbox/ares64/ares/nall/string/pascal.hpp +++ b/waterbox/ares64/ares/nall/string/pascal.hpp @@ -33,7 +33,7 @@ struct string_pascal { explicit operator bool() const { return _data; } operator const char*() const { return _data ? _data + sizeof(u32) : nullptr; } - operator string() const { return _data ? string{_data + sizeof(u32)} : ""; } + operator string() const { return _data ? string{_data + sizeof(u32)} : ""_s; } auto operator=(const string_pascal& source) -> type& { if(this == &source) return *this; diff --git a/waterbox/ares64/ares/nall/string/replace.hpp b/waterbox/ares64/ares/nall/string/replace.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/split.hpp b/waterbox/ares64/ares/nall/string/split.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/transform/cml.hpp b/waterbox/ares64/ares/nall/string/transform/cml.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/transform/dml.hpp b/waterbox/ares64/ares/nall/string/transform/dml.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/trim.hpp b/waterbox/ares64/ares/nall/string/trim.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/utf8.hpp b/waterbox/ares64/ares/nall/string/utf8.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/utility.hpp b/waterbox/ares64/ares/nall/string/utility.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/vector.hpp b/waterbox/ares64/ares/nall/string/vector.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/string/view.hpp b/waterbox/ares64/ares/nall/string/view.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/suffix-array.hpp b/waterbox/ares64/ares/nall/suffix-array.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/tcptext/tcp-socket.cpp b/waterbox/ares64/ares/nall/tcptext/tcp-socket.cpp new file mode 100755 index 0000000000..c13fe0f106 --- /dev/null +++ b/waterbox/ares64/ares/nall/tcptext/tcp-socket.cpp @@ -0,0 +1,312 @@ +#include + +#include +#include +#include + +#if defined(PLATFORM_WINDOWS) + #include +#else + #include +#endif + +struct sockaddr_in; +struct sockaddr_in6; + +namespace { + constexpr bool TCP_LOG_MESSAGES = false; + + constexpr u32 TCP_BUFFER_SIZE = 1024 * 16; + constexpr u32 CLIENT_SLEEP_MS = 10; // ms to sleep while checking for new clients + constexpr u32 CYCLES_BEFORE_SLEEP = 100; // how often to do a send/receive check before a sleep + constexpr u32 RECEIVE_TIMEOUT_SEC = 1; // only important for latency of disconnecting clients, reads are blocming anyways + + // A few platform specific socket functions: + // (In general, windows+linux share the same names, yet they behave differenly) + auto socketSetBlockingMode(s32 socket, bool isBlocking) -> bool + { + if(socket < 0)return false; + #if defined(O_NONBLOCK) // Linux + auto oldFlags = fcntl(socket, F_GETFL, 0); + auto newFlags = isBlocking ? (oldFlags ^ O_NONBLOCK) : (oldFlags | O_NONBLOCK); + return fcntl(socket, F_SETFL, newFlags) == 0; + #elif defined(FIONBIO) // Windows + u_long state = isBlocking ? 0 : 1; + return ioctlsocket(socket, FIONBIO, &state) == NO_ERROR; + #endif + } + + auto socketShutdown(s32 socket) { + if(socket < 0)return; + #if defined(SD_BOTH) // Windows + ::shutdown(socket, SD_BOTH); + #elif defined(SHUT_RDWR) // Linux, Mac + ::shutdown(socket, SHUT_RDWR); + #endif + } + + auto socketClose(s32 socket) { + if(socket < 0)return; + #if defined(PLATFORM_WINDOWS) + ::closesocket(socket); + #else + ::close(socket); + #endif + } +} + +namespace nall::TCP { + +NALL_HEADER_INLINE auto Socket::getURL(u32 port, bool useIPv4) const -> string { + return {useIPv4 ? "127.0.0.1:" : "[::1]:", port}; +} + +NALL_HEADER_INLINE auto Socket::open(u32 port, bool useIPv4) -> bool { + stopServer = false; + + auto url = getURL(port, useIPv4); + printf("Opening TCP-server on %s\n", url.data()); + + auto threadServer = std::thread([this, port, useIPv4]() { + serverRunning = true; + + while (!stopServer) { + fdServer = socket(useIPv4 ? AF_INET : AF_INET6, SOCK_STREAM, 0); + if(fdServer < 0) + break; + + { + s32 valueOn = 1; + #if defined(SO_NOSIGPIPE) //BSD, OSX + setsockopt(fdServer, SOL_SOCKET, SO_NOSIGPIPE, &valueOn, sizeof(s32)); + #endif + + #if defined(SO_REUSEADDR) //BSD, Linux, OSX + setsockopt(fdServer, SOL_SOCKET, SO_REUSEADDR, &valueOn, sizeof(s32)); + #endif + + #if defined(SO_REUSEPORT) //BSD, OSX + setsockopt(fdServer, SOL_SOCKET, SO_REUSEPORT, &valueOn, sizeof(s32)); + #endif + + #if defined(TCP_NODELAY) + setsockopt(fdServer, IPPROTO_TCP, TCP_NODELAY, &valueOn, sizeof(s32)); + #endif + + if(!socketSetBlockingMode(fdServer, true)) { + print("TCP: failed to set to blocking mode!\n"); + } + + #if defined(SO_RCVTIMEO) + #if defined(PLATFORM_WINDOWS) + DWORD rcvTimeMs = 1000 * RECEIVE_TIMEOUT_SEC; + setsockopt(fdServer, SOL_SOCKET, SO_RCVTIMEO, &rcvTimeMs, sizeof(rcvTimeMs)); + #else + struct timeval rcvtimeo; + rcvtimeo.tv_sec = RECEIVE_TIMEOUT_SEC; + rcvtimeo.tv_usec = 0; + setsockopt(fdServer, SOL_SOCKET, SO_RCVTIMEO, &rcvtimeo, sizeof(rcvtimeo)); + #endif + #endif + } + + s32 bindRes; + if(useIPv4) { + sockaddr_in serverAddrV4{}; + serverAddrV4.sin_family = AF_INET; + serverAddrV4.sin_addr.s_addr = htonl(INADDR_ANY); + serverAddrV4.sin_port = htons(port); + + bindRes = ::bind(fdServer, (sockaddr*)&serverAddrV4, sizeof(serverAddrV4)) < 0; + } else { + sockaddr_in6 serverAddrV6{}; + serverAddrV6.sin6_family = AF_INET6; + serverAddrV6.sin6_addr = in6addr_loopback; + serverAddrV6.sin6_port = htons(port); + + bindRes = ::bind(fdServer, (sockaddr*)&serverAddrV6, sizeof(serverAddrV6)) < 0; + } + + if(bindRes < 0 || listen(fdServer, 1) < 0) { + printf("error binding socket on port %d! (%s)\n", port, strerror(errno)); + break; + } + + // scan for new connections + while(fdClient < 0) { + fdClient = ::accept(fdServer, nullptr, nullptr); + if(fdClient < 0) { + if(errno != EAGAIN) { + if(!stopServer) + printf("error accepting connection! (%s)\n", strerror(errno)); + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(CLIENT_SLEEP_MS)); + } + } + if (fdClient < 0) { + break; + } + + // close the server socket, we only want one client + socketClose(fdServer); + fdServer = -1; + + while (!stopServer && fdClient >= 0) { + // Kick client if we need to + if(wantKickClient) { + socketClose(fdClient); + fdClient = -1; + wantKickClient = false; + onDisconnect(); + break; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(CLIENT_SLEEP_MS)); + } + } + + printf("Stopping TCP-server...\n"); + + socketClose(fdClient); + fdClient = -1; + + wantKickClient = false; + + printf("TCP-server stopped\n"); + serverRunning = false; + }); + + auto threadSend = std::thread([this]() + { + vector localSendBuffer{}; + u32 cycles = 0; + + while(!stopServer) + { + if(fdClient < 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(CLIENT_SLEEP_MS)); + continue; + } + + { // copy send-data to minimize lock time + std::lock_guard guard{sendBufferMutex}; + if(sendBuffer.size() > 0) { + localSendBuffer = sendBuffer; + sendBuffer.resize(0); + } + } + + // send data + if(localSendBuffer.size() > 0) { + auto bytesWritten = send(fdClient, localSendBuffer.data(), localSendBuffer.size(), 0); + if(bytesWritten < localSendBuffer.size()) { + printf("Error sending data! (%s)\n", strerror(errno)); + } + + if constexpr(TCP_LOG_MESSAGES) { + printf("%.4f | TCP >: [%" PRIu64 "]: %.*s\n", (f64)chrono::millisecond() / 1000.0, localSendBuffer.size(), localSendBuffer.size() > 100 ? 100 : (int)localSendBuffer.size(), (char*)localSendBuffer.data()); + } + + localSendBuffer.resize(0); + cycles = 0; // sending once has a good chance of sending more -> reset sleep timer + } + + if(cycles++ >= CYCLES_BEFORE_SLEEP) { + std::this_thread::sleep_for(std::chrono::microseconds(1)); + cycles = 0; + } + } + }); + + auto threadReceive = std::thread([this]() + { + u8 packet[TCP_BUFFER_SIZE]{0}; + + while(!stopServer) + { + if(fdClient < 0 || wantKickClient) { + std::this_thread::sleep_for(std::chrono::milliseconds(CLIENT_SLEEP_MS)); + continue; + } + + // receive data from connected clients + s32 length = recv(fdClient, packet, TCP_BUFFER_SIZE, MSG_NOSIGNAL); + if(length > 0) { + std::lock_guard guard{receiveBufferMutex}; + auto oldSize = receiveBuffer.size(); + receiveBuffer.resize(oldSize + length); + memcpy(receiveBuffer.data() + oldSize, packet, length); + + if constexpr(TCP_LOG_MESSAGES) { + printf("%.4f | TCP <: [%d]: %.*s ([%d]: %.*s)\n", (f64)chrono::millisecond() / 1000.0, length, length, (char*)receiveBuffer.data(), length, length, (char*)packet); + } + } else if(length == 0) { + disconnectClient(); + } else { + #if defined(PLATFORM_WINDOWS) + if (WSAGetLastError() != WSAETIMEDOUT) { + #else + if (errno != EAGAIN) { + #endif + printf("TCP server: error receiving data from client: %s\n", strerror(errno)); + disconnectClient(); + } + } + } + }); + + threadServer.detach(); + threadSend.detach(); + threadReceive.detach(); + + return true; +} + +NALL_HEADER_INLINE auto Socket::close(bool notifyHandler) -> void { + stopServer = true; + + // we have to forcefully shut it down here, since otherwise accept() would hang causing a UI crash + socketShutdown(fdServer); + socketClose(fdClient); + socketClose(fdServer); + fdServer = -1; + fdClient = -1; + + while(serverRunning) { + std::this_thread::sleep_for(std::chrono::milliseconds(250)); // wait for other threads to stop + } + + if(notifyHandler) { + onDisconnect(); // don't call this in destructor, it's virtual + } +} + +NALL_HEADER_INLINE auto Socket::update() -> void { + vector data{}; + + { // local copy, minimize lock time + std::lock_guard guard{receiveBufferMutex}; + if(receiveBuffer.size() > 0) { + data = receiveBuffer; + receiveBuffer.resize(0); + } + } + + if(data.size() > 0) { + onData(data); + } +} + +NALL_HEADER_INLINE auto Socket::disconnectClient() -> void { + wantKickClient = true; +} + +NALL_HEADER_INLINE auto Socket::sendData(const u8* data, u32 size) -> void { + std::lock_guard guard{sendBufferMutex}; + u32 oldSize = sendBuffer.size(); + sendBuffer.resize(oldSize + size); + memcpy(sendBuffer.data() + oldSize, data, size); +} + +} diff --git a/waterbox/ares64/ares/nall/tcptext/tcp-socket.hpp b/waterbox/ares64/ares/nall/tcptext/tcp-socket.hpp new file mode 100755 index 0000000000..7cabb2317b --- /dev/null +++ b/waterbox/ares64/ares/nall/tcptext/tcp-socket.hpp @@ -0,0 +1,65 @@ +#pragma once + +/** + * Opens a TCP server with callbacks to send and receive data. + * + * This spawns 3 new threads: + * threadServer: listens for new connections, kicks connections + * threadSend: sends data to the client + * threadReceive: receives data from the client + * + * Each contains it's own loop including sleeps to not use too much CPU. + * The exception is threadReceive which relies on the blocking recv() call (kernel wakes it up again). + * + * Incoming and outgoing data is synchronized using mutexes, + * and put into buffers that are shared with the main thread. + * Meaning, the thread that calls 'update()' with also be the one that gets 'onData()' calls. + * No additional synchronization is needed. + * + * NOTE: if you work on the loop/sleeps, make sure to test CPU usage and package-latency. + */ +namespace nall::TCP { + +class Socket { + public: + auto open(u32 port, bool useIPv4) -> bool; + auto close(bool notifyHandler = true) -> void; + + auto disconnectClient() -> void; + + auto isStarted() const -> bool { return serverRunning; } + auto hasClient() const -> bool { return fdClient >= 0; } + + auto getURL(u32 port, bool useIPv4) const -> string; + + ~Socket() { close(false); } + + protected: + auto update() -> void; + + auto sendData(const u8* data, u32 size) -> void; + virtual auto onData(const vector &data) -> void = 0; + + virtual auto onConnect() -> void = 0; + virtual auto onDisconnect() -> void = 0; + + private: + std::atomic stopServer{false}; // set to true to let the server-thread know to stop. + std::atomic serverRunning{false}; // signals the current state of the server-thread + std::atomic wantKickClient{false}; // set to true to let server know to disconnect the current client (if conn.) + + std::atomic fdServer{-1}; + std::atomic fdClient{-1}; + + vector receiveBuffer{}; + std::mutex receiveBufferMutex{}; + + vector sendBuffer{}; + std::mutex sendBufferMutex{}; +}; + +} + +#if defined(NALL_HEADER_ONLY) + #include +#endif diff --git a/waterbox/ares64/ares/nall/tcptext/tcptext-server.cpp b/waterbox/ares64/ares/nall/tcptext/tcptext-server.cpp new file mode 100755 index 0000000000..4d0581f9d6 --- /dev/null +++ b/waterbox/ares64/ares/nall/tcptext/tcptext-server.cpp @@ -0,0 +1,29 @@ +#include + +namespace nall::TCPText { + NALL_HEADER_INLINE auto Server::sendText(const string &text) -> void { + sendData((const u8*)text.data(), text.size()); + } + + NALL_HEADER_INLINE auto Server::onData(const vector &data) -> void { + string_view dataStr((const char*)data.data(), (u32)data.size()); + + if(!hadHandshake) { + hadHandshake = true; + + // This is a security check for browsers. + // Any website can request localhost via JS or HTML, while it can't see the result, + // GDB will receive the data and commands could be injected (true for all GDB-servers). + // Since all HTTP requests start with headers, we can simply block anything that doesn't start like a GDB client. + if(dataStr[0] != '+') { + printf("Non-GDB client detected (message: %s), disconnect client\n", dataStr.data()); + disconnectClient(); + return; + } + + onConnect(); + } + + onText(dataStr); + } +} diff --git a/waterbox/ares64/ares/nall/tcptext/tcptext-server.hpp b/waterbox/ares64/ares/nall/tcptext/tcptext-server.hpp new file mode 100755 index 0000000000..8299bcdea6 --- /dev/null +++ b/waterbox/ares64/ares/nall/tcptext/tcptext-server.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +/** + * Provides text-based TCP server on top of the Socket. + * This handles incoming messages and can send data back to the client. + */ +namespace nall::TCPText { + +class Server : public TCP::Socket { + public: + bool hadHandshake{false}; + + protected: + auto onData(const vector &data) -> void override; + + auto sendText(const string &text) -> void; + virtual auto onText(string_view text) -> void = 0; +}; + +} + +#if defined(NALL_HEADER_ONLY) + #include +#endif diff --git a/waterbox/ares64/ares/nall/terminal.cpp b/waterbox/ares64/ares/nall/terminal.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/terminal.hpp b/waterbox/ares64/ares/nall/terminal.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/thread.cpp b/waterbox/ares64/ares/nall/thread.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/thread.hpp b/waterbox/ares64/ares/nall/thread.hpp old mode 100644 new mode 100755 index a76896f9ac..17714a1a66 --- a/waterbox/ares64/ares/nall/thread.hpp +++ b/waterbox/ares64/ares/nall/thread.hpp @@ -13,8 +13,10 @@ namespace nall { using mutex = std::mutex; using recursive_mutex = std::recursive_mutex; + using condition_variable = std::condition_variable; template using lock_guard = std::lock_guard; template using atomic = std::atomic; + template using unique_lock = std::unique_lock; } #if defined(API_POSIX) diff --git a/waterbox/ares64/ares/nall/traits.hpp b/waterbox/ares64/ares/nall/traits.hpp old mode 100644 new mode 100755 index 5862b36bb7..523ee5d22b --- a/waterbox/ares64/ares/nall/traits.hpp +++ b/waterbox/ares64/ares/nall/traits.hpp @@ -24,16 +24,10 @@ namespace nall { using std::is_base_of; using std::is_base_of_v; using std::is_function; - using std::is_integral; - using std::is_integral_v; using std::is_pointer; using std::is_pointer_v; using std::is_same; using std::is_same_v; - using std::is_signed; - using std::is_signed_v; - using std::is_unsigned; - using std::is_unsigned_v; using std::nullptr_t; using std::remove_extent; using std::remove_extent_t; @@ -41,13 +35,22 @@ namespace nall { using std::remove_reference_t; using std::swap; using std::true_type; -} -namespace std { + //directly specializing std traits would result in undefined behavior + template struct is_integral : std::is_integral {}; + template struct is_signed : std::is_signed {}; + template struct is_unsigned : std::is_unsigned {}; + + template inline constexpr bool is_integral_v = is_integral::value; + template inline constexpr bool is_signed_v = is_signed ::value; + template inline constexpr bool is_unsigned_v = is_unsigned::value; + + //defined in arithmetic.hpp when unavailable as a builtin + template<> struct is_integral : true_type {}; + template<> struct is_unsigned : true_type {}; + #if defined(__SIZEOF_INT128__) template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_unsigned : true_type {}; + template<> struct is_signed : true_type {}; #endif } diff --git a/waterbox/ares64/ares/nall/unique-pointer.hpp b/waterbox/ares64/ares/nall/unique-pointer.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/utility.hpp b/waterbox/ares64/ares/nall/utility.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/variant.hpp b/waterbox/ares64/ares/nall/variant.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/varint.hpp b/waterbox/ares64/ares/nall/varint.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector.hpp b/waterbox/ares64/ares/nall/vector.hpp old mode 100644 new mode 100755 index ed52da7a5d..a8c129554e --- a/waterbox/ares64/ares/nall/vector.hpp +++ b/waterbox/ares64/ares/nall/vector.hpp @@ -124,6 +124,7 @@ struct vector_base { auto find(const function& comparator) -> maybe; auto find(const T& value) const -> maybe; auto findSorted(const T& value) const -> maybe; + auto contains(const T& value) const -> bool; auto foreach(const function& callback) -> void; auto foreach(const function& callback) -> void; diff --git a/waterbox/ares64/ares/nall/vector/access.hpp b/waterbox/ares64/ares/nall/vector/access.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/assign.hpp b/waterbox/ares64/ares/nall/vector/assign.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/compare.hpp b/waterbox/ares64/ares/nall/vector/compare.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/core.hpp b/waterbox/ares64/ares/nall/vector/core.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/iterator.hpp b/waterbox/ares64/ares/nall/vector/iterator.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/memory.hpp b/waterbox/ares64/ares/nall/vector/memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/modify.hpp b/waterbox/ares64/ares/nall/vector/modify.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/specialization/u8.hpp b/waterbox/ares64/ares/nall/vector/specialization/u8.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vector/utility.hpp b/waterbox/ares64/ares/nall/vector/utility.hpp old mode 100644 new mode 100755 index 14f70f9599..670ff97392 --- a/waterbox/ares64/ares/nall/vector/utility.hpp +++ b/waterbox/ares64/ares/nall/vector/utility.hpp @@ -36,6 +36,13 @@ template auto vector::findSorted(const T& value) const -> maybe auto vector::contains(const T& value) const -> bool { + for(const auto &v : *this) { + if(v == value) return true; + } + return false; +} + template auto vector::foreach(const function& callback) -> void { for(u64 n : range(size())) callback(_pool[n]); } diff --git a/waterbox/ares64/ares/nall/vfs.hpp b/waterbox/ares64/ares/nall/vfs.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/attribute.hpp b/waterbox/ares64/ares/nall/vfs/attribute.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/cdrom.hpp b/waterbox/ares64/ares/nall/vfs/cdrom.hpp old mode 100644 new mode 100755 index f410a0b66b..d572891eb4 --- a/waterbox/ares64/ares/nall/vfs/cdrom.hpp +++ b/waterbox/ares64/ares/nall/vfs/cdrom.hpp @@ -11,6 +11,10 @@ namespace nall::vfs { struct cdrom : file { + ~cdrom() { + _thread.join(); + } + static auto open(const string& location) -> shared_pointer { auto instance = shared_pointer{new cdrom}; if(location.iendsWith(".cue") && instance->loadCue(location)) return instance; @@ -19,8 +23,8 @@ struct cdrom : file { } auto writable() const -> bool override { return false; } - auto data() const -> const u8* override { return _image.data(); } - auto data() -> u8* override { return _image.data(); } + auto data() const -> const u8* override { wait(size()); return _image.data(); } + auto data() -> u8* override { wait(size()); return _image.data(); } auto size() const -> u64 override { return _image.size(); } auto offset() const -> u64 override { return _offset; } @@ -36,19 +40,33 @@ struct cdrom : file { auto read() -> u8 override { if(_offset >= _image.size()) return 0x00; + wait(_offset); return _image[_offset++]; } auto write(u8 data) -> void override { //CD-ROMs are read-only; but allow writing anyway if needed, since the image is in memory if(_offset >= _image.size()) return; + wait(_offset); _image[_offset++] = data; } + auto wait(u64 offset) const -> void { + bool force = false; + if(offset >= _image.size()) { + offset = _image.size() - 1; + force = true; + } + //subchannel data is always loaded + if(offset % 2448 < 2352 || force) { + while(offset + 1 > _loadOffset) usleep(1); + } + } + private: auto loadCue(const string& cueLocation) -> bool { - Decode::CUE cuesheet; - if(!cuesheet.load(cueLocation)) return false; + auto cuesheet = shared_pointer::create(); + if(!cuesheet->load(cueLocation)) return false; CD::Session session; session.leadIn.lba = -LeadInSectors; @@ -56,19 +74,19 @@ private: s32 lbaFileBase = 0; // add 2 sec pregap to 1st track - if(!cuesheet.files[0].tracks[0].pregap) - cuesheet.files[0].tracks[0].pregap = Track1Pregap; + if(!cuesheet->files[0].tracks[0].pregap) + cuesheet->files[0].tracks[0].pregap = Track1Pregap; else - cuesheet.files[0].tracks[0].pregap = Track1Pregap + cuesheet.files[0].tracks[0].pregap(); + cuesheet->files[0].tracks[0].pregap = Track1Pregap + cuesheet->files[0].tracks[0].pregap(); - if(cuesheet.files[0].tracks[0].indices[0].number == 1) { + if(cuesheet->files[0].tracks[0].indices[0].number == 1) { session.tracks[1].indices[0].lba = 0; session.tracks[1].indices[0].end = - cuesheet.files[0].tracks[0].pregap() + cuesheet.files[0].tracks[0].indices[0].lba - 1; + cuesheet->files[0].tracks[0].pregap() + cuesheet->files[0].tracks[0].indices[0].lba - 1; } s32 lbaIndex = 0; - for(auto& file : cuesheet.files) { + for(auto& file : cuesheet->files) { for(auto& track : file.tracks) { session.tracks[track.number].control = track.type == "audio" ? 0b0000 : 0b0100; if(track.pregap) lbaFileBase += track.pregap(); @@ -117,8 +135,15 @@ private: _image.resize(2448 * (LeadInSectors + lbaFileBase + LeadOutSectors)); - lbaFileBase = 0; - for(auto& file : cuesheet.files) { + //preload subchannel data + loadSub({Location::notsuffix(cueLocation), ".sub"}, session); + + //load user data on separate thread + _thread = thread::create( + [this, cueLocation, cuesheet = std::move(cuesheet)](uintptr) -> void { + + s32 lbaFileBase = 0; + for(auto& file : cuesheet->files) { auto location = string{Location::path(cueLocation), file.name}; auto filedata = nall::file::open(location, nall::file::mode::read); if(file.type == "wave") filedata.seek(44); //skip RIFF header @@ -127,7 +152,8 @@ private: for(auto& index : track.indices) { if(index.lba < 0) continue; // ignore gaps (not in file) for(s32 sector : range(index.sectorCount())) { - auto target = _image.data() + 2448ull * (LeadInSectors + lbaFileBase + index.lba + sector); + auto offset = 2448ull * (LeadInSectors + lbaFileBase + index.lba + sector); + auto target = _image.data() + offset; auto length = track.sectorSize(); if(length == 2048) { //ISO: generate header + parity data @@ -145,39 +171,30 @@ private: //BIN + WAV: direct copy filedata.read({target, length}); } + _loadOffset = offset + 2448; } } if(track.postgap) lbaFileBase += track.postgap(); } lbaFileBase += file.tracks.last().indices.last().end + 1; } + _loadOffset = _image.size(); - auto subchannel = session.encode(LeadInSectors + session.leadOut.end + 1); - if(auto overlay = nall::file::read({Location::notsuffix(cueLocation), ".sub"})) { - auto target = subchannel.data() + 96 * (LeadInSectors + Track1Pregap); - auto length = (s64)subchannel.size() - 96 * (LeadInSectors + Track1Pregap); - memory::copy(target, length, overlay.data(), overlay.size()); - } - - for(u64 sector : range(size() / 2448)) { - auto source = subchannel.data() + sector * 96; - auto target = _image.data() + sector * 2448 + 2352; - memory::copy(target, source, 96); - } + }); return true; } auto loadChd(const string& location) -> bool { - Decode::CHD chd; - if(!chd.load(location)) return false; + auto chd = shared_pointer::create(); + if(!chd->load(location)) return false; CD::Session session; session.leadIn.lba = -LeadInSectors; session.leadIn.end = -1; s32 lbaIndex = 0; - for(auto& track : chd.tracks) { + for(auto& track : chd->tracks) { session.tracks[track.number].control = track.type == "AUDIO" ? 0b0000 : 0b0100; for(auto& index : track.indices) { session.tracks[track.number].indices[index.number].lba = index.lba; @@ -209,12 +226,20 @@ private: _image.resize(2448 * (LeadInSectors + lbaIndex + LeadOutSectors)); + //preload subchannel data + loadSub({Location::notsuffix(location), ".sub"}, session); + + //load user data on separate thread + _thread = thread::create( + [this, chd = std::move(chd)](uintptr) -> void { + s32 lba = 0; - for(auto& track : chd.tracks) { + for(auto& track : chd->tracks) { for(auto& index : track.indices) { for(s32 sector : range(index.sectorCount())) { - auto target = _image.data() + 2448ull * (LeadInSectors + index.lba + sector); - auto sectorData = chd.read(lba); + auto offset = 2448ull * (LeadInSectors + index.lba + sector); + auto target = _image.data() + offset; + auto sectorData = chd->read(lba); if(sectorData.size() == 2048) { //ISO: generate header + parity data memory::assign(target + 0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff); //sync @@ -230,12 +255,22 @@ private: memory::copy(target, 2352, sectorData.data(), sectorData.size()); } lba++; + _loadOffset = offset + 2448; } } } + _loadOffset = _image.size(); + }); + + return true; + } + +private: + void loadSub(const string& location, const CD::Session& session) { auto subchannel = session.encode(LeadInSectors + session.leadOut.end + 1); - if(auto overlay = nall::file::read({Location::notsuffix(location), ".sub"})) { + + if(auto overlay = nall::file::read(location)) { auto target = subchannel.data() + 96 * (LeadInSectors + Track1Pregap); auto length = (s64)subchannel.size() - 96 * (LeadInSectors + Track1Pregap); memory::copy(target, length, overlay.data(), overlay.size()); @@ -246,12 +281,12 @@ private: auto target = _image.data() + sector * 2448 + 2352; memory::copy(target, source, 96); } - - return true; } vector _image; u64 _offset = 0; + atomic _loadOffset = 0; + thread _thread; static constexpr s32 LeadInSectors = 7500; static constexpr s32 Track1Pregap = 150; diff --git a/waterbox/ares64/ares/nall/vfs/directory.hpp b/waterbox/ares64/ares/nall/vfs/directory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/disk.hpp b/waterbox/ares64/ares/nall/vfs/disk.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/file.hpp b/waterbox/ares64/ares/nall/vfs/file.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/memory.hpp b/waterbox/ares64/ares/nall/vfs/memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/node.hpp b/waterbox/ares64/ares/nall/vfs/node.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/vfs/vfs.hpp b/waterbox/ares64/ares/nall/vfs/vfs.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/view.hpp b/waterbox/ares64/ares/nall/view.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/detour.cpp b/waterbox/ares64/ares/nall/windows/detour.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/detour.hpp b/waterbox/ares64/ares/nall/windows/detour.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/guid.cpp b/waterbox/ares64/ares/nall/windows/guid.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/guid.hpp b/waterbox/ares64/ares/nall/windows/guid.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/launcher.cpp b/waterbox/ares64/ares/nall/windows/launcher.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/launcher.hpp b/waterbox/ares64/ares/nall/windows/launcher.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/registry.cpp b/waterbox/ares64/ares/nall/windows/registry.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/registry.hpp b/waterbox/ares64/ares/nall/windows/registry.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/service.hpp b/waterbox/ares64/ares/nall/windows/service.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/shared-memory.hpp b/waterbox/ares64/ares/nall/windows/shared-memory.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/utf8.cpp b/waterbox/ares64/ares/nall/windows/utf8.cpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/utf8.hpp b/waterbox/ares64/ares/nall/windows/utf8.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/windows/windows.hpp b/waterbox/ares64/ares/nall/windows/windows.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/xorg/clipboard.hpp b/waterbox/ares64/ares/nall/xorg/clipboard.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/xorg/guard.hpp b/waterbox/ares64/ares/nall/xorg/guard.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/nall/xorg/xorg.hpp b/waterbox/ares64/ares/nall/xorg/xorg.hpp old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit.h b/waterbox/ares64/ares/thirdparty/sljit.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/.gitignore b/waterbox/ares64/ares/thirdparty/sljit/.gitignore old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/API_CHANGES b/waterbox/ares64/ares/thirdparty/sljit/API_CHANGES old mode 100644 new mode 100755 index 8ec367e302..6afa9750a6 --- a/waterbox/ares64/ares/thirdparty/sljit/API_CHANGES +++ b/waterbox/ares64/ares/thirdparty/sljit/API_CHANGES @@ -1,5 +1,38 @@ This file is the short summary of the API changes: +21.02.2024 - Non-backward compatible + The sljit_set_put_label() function is renamed + to sljit_emit_mov_addr() and sljit_put_label + is merged into sljit_jump and removed. + +01.11.2023 - Non-backward compatible + The SLJIT_ARG_TYPE_VOID definition is changed + to SLJIT_ARG_TYPE_RET_VOID to improve Windows + compatibility. + +05.09.2023 - Non-backward compatible + Turn SLJIT_IMM from a flag to a single value. + +10.08.2023 - Non-backward compatible + Rename SLJIT_INT_REGISTER to SLJIT_GP_REGISTER. + +01.08.2023 - Non-backward compatible + A type argument is added to sljit_get_register_index + and sljit_get_float_register_index is removed. + +19.07.2023 - Non-backward compatible + SLJIT_MEM_UNALIGNED_16/32 options are renamed + to SLJIT_MEM_ALIGNED_16/32 and a type argument + is added to sljit_get_float_register_index. + +16.02.2022 - Non-backward compatible + The sljit_emit_cmov operation is replaced + by sljit_emit_select. + +11.02.2022 - Non-backward compatible + All floating point comparisons are supported, + sljit_cmp_info return value is changed. + 02.02.2022 - Backward compatible All SLJIT_SET_* constants are even numbers. diff --git a/waterbox/ares64/ares/thirdparty/sljit/INTERNAL_CHANGES b/waterbox/ares64/ares/thirdparty/sljit/INTERNAL_CHANGES old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/LICENSE b/waterbox/ares64/ares/thirdparty/sljit/LICENSE old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/Makefile b/waterbox/ares64/ares/thirdparty/sljit/Makefile old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/README b/waterbox/ares64/ares/thirdparty/sljit/README old mode 100644 new mode 100755 index 1fc2337e41..e45495cdc0 --- a/waterbox/ares64/ares/thirdparty/sljit/README +++ b/waterbox/ares64/ares/thirdparty/sljit/README @@ -2,18 +2,45 @@ SLJIT - Stack Less JIT Compiler Purpose: - A simple, machine independent JIT compiler, which suitable for - translating interpreted byte code to machine code. The sljitLir.h + A low-level, machine independent JIT compiler, which is suitable for + translating interpreted byte code into machine code. The sljitLir.h describes the LIR (low-level intermediate representation) of SLJIT. +Key features: + - Supports several target architectures: + x86 32/64, ARM 32/64, RiscV 32/64, s390x 64, + PowerPC 32/64, LoongArch 64, MIPS 32/64 + - Supports a large number of operations + - Supports self-modifying code + - Supports tail calls + - Support fast calls (non-ABI compatible) + - Supports byte order reverse (endianness switching) + - Supports unaligned memory accesses + - Supports SIMD / atomic operations on certain CPUs + - Direct register access, both integer and floating point + - Stack space allocated for function local variables can be + accessed as a linear memory area + - All-in-one compilation is supported + - When sljitLir.c is directly included by a C source file, + the jit compiler API can be completely hidden from + external use (see SLJIT_CONFIG_STATIC macro) + - Code can be generated for multiple target cpus + by including sljitLir.c in different C files, where + each compiler instance is configured to target a + different architecture + - The compiler can be serialized into a byte buffer + - Useful for ahead-of-time compiling + - Code generation can be resumed after deserialization + (partial ahead-of-time compiling) + Compatible: - Any C (C++) compiler. At least I hope so. + C99 (C++) compilers. Using sljit: Copy the content of sljit_src directory into your project source directory. Add sljitLir.c source file to your build environment. All other files are included by sljitLir.c (if required). Define the machine by SLJIT_CONFIG_* - selector. See sljitConfig.h for all possible values. For C++ compilers, + selector. See sljitConfigCPU.h for all possible values. For C++ compilers, rename sljitLir.c to sljitLir.cpp. More info: @@ -35,6 +62,7 @@ Special thanks: Marc Mutz Martin Storsjö Michael McConville + Mingtao Zhou (LoongArch support) Walter Lee Wen Xichang YunQiang Su diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/overview.txt b/waterbox/ares64/ares/thirdparty/sljit/doc/overview.txt old mode 100644 new mode 100755 index af74947954..8c21f84351 --- a/waterbox/ares64/ares/thirdparty/sljit/doc/overview.txt +++ b/waterbox/ares64/ares/thirdparty/sljit/doc/overview.txt @@ -9,7 +9,7 @@ with SLJIT. Further details can be found in sljitLir.h. SLJIT is a platform independent assembler which - provides access to common CPU features - can be easily ported to wide-spread CPU - architectures (e.g. x86, ARM, POWER, MIPS, SPARC, s390x) + architectures (e.g. x86, ARM, POWER, MIPS, s390x, LoongArch) The key challenge of this project is finding a common subset of CPU features which @@ -49,9 +49,9 @@ is a valid instruction sequence: sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R1), 0); // An int32_t value is loaded into SLJIT_R0 - sljit_emit_op1(compiler, SLJIT_NOT32, + sljit_emit_op1(compiler, SLJIT_REV32, SLJIT_R0, 0, SLJIT_R0, 0); - // the int32_t value in SLJIT_R0 is bit inverted + // the int32_t value in SLJIT_R0 is byte swapped // and the type of the result is still int32_t The next code snippet is not allowed: @@ -59,14 +59,14 @@ The next code snippet is not allowed: sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R1), 0); // An intptr_t value is loaded into SLJIT_R0 - sljit_emit_op1(compiler, SLJIT_NOT32, + sljit_emit_op1(compiler, SLJIT_REV32, SLJIT_R0, 0, SLJIT_R0, 0); - // The result of SLJIT_NOT instruction - // is undefined. Even crash is possible + // The result of the instruction is undefined. + // Even crash is possible for some instructions // (e.g. on MIPS-64). However, it is always allowed to overwrite a -register regardless its previous value: +register regardless of its previous value: sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R1), 0); @@ -127,7 +127,7 @@ following rules were introduced: - Status flags cannot be controlled directly (there are no set/clear/invert operations) -The last two rules allows efficent mapping of status flags. +The last two rules allows efficient mapping of status flags. For example the arithmetic and multiply overflow flag is mapped to the same overflow flag bit on x86. This is allowed, since no instruction can set both of these flags. When diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/99bottles.bf b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/99bottles.bf old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/README b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/README old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/array_access.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/array_access.c old mode 100644 new mode 100755 index 1404cf936c..cee485670d --- a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/array_access.c +++ b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/array_access.c @@ -5,10 +5,9 @@ typedef long (SLJIT_FUNC *func_arr_t)(long *arr, long narr); -static long SLJIT_FUNC print_num(long a) +static void SLJIT_FUNC print_num(long a) { printf("num = %ld\n", a); - return a + 1; } /* @@ -27,26 +26,46 @@ long func(long *array, long narray) static int array_access(long *arr, long narr) { void *code; - unsigned long len; + size_t len; func_arr_t func; + struct sljit_label *loopstart; + struct sljit_jump *out; /* Create a SLJIT compiler */ struct sljit_compiler *C = sljit_create_compiler(NULL, NULL); - sljit_emit_enter(C, 0, SLJIT_ARGS2(W, P, W), 1, 3, 0, 0, 0); - /* opt arg R S FR FS local_size */ - sljit_emit_op2(C, SLJIT_XOR, SLJIT_S2, 0, SLJIT_S2, 0, SLJIT_S2, 0); // S2 = 0 - sljit_emit_op1(C, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, narr); // S1 = narr - struct sljit_label *loopstart = sljit_emit_label(C); // loopstart: - struct sljit_jump *out = sljit_emit_cmp(C, SLJIT_GREATER_EQUAL, SLJIT_S2, 0, SLJIT_S1, 0); // S2 >= a --> jump out + sljit_emit_enter(C, 0, SLJIT_ARGS2(W, P, W), 1, 3, 0, 0, 0); + /* opt arg R S FR FS local_size */ - sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_S2), SLJIT_WORD_SHIFT);// R0 = (long *)S0[S2]; - sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); // print_num(R0); + /* S2 = 0 */ + sljit_emit_op2(C, SLJIT_XOR, SLJIT_S2, 0, SLJIT_S2, 0, SLJIT_S2, 0); - sljit_emit_op2(C, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S2, 0, SLJIT_IMM, 1); // S2 += 1 - sljit_set_label(sljit_emit_jump(C, SLJIT_JUMP), loopstart); // jump loopstart - sljit_set_label(out, sljit_emit_label(C)); // out: - sljit_emit_return(C, SLJIT_MOV, SLJIT_S1, 0); // return RET + /* S1 = narr */ + sljit_emit_op1(C, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, narr); + + /* loopstart: */ + loopstart = sljit_emit_label(C); + + /* S2 >= narr --> jumo out */ + out = sljit_emit_cmp(C, SLJIT_GREATER_EQUAL, SLJIT_S2, 0, SLJIT_S1, 0); + + /* R0 = (long *)S0[S2]; */ + sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_S2), SLJIT_WORD_SHIFT); + + /* print_num(R0) */ + sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1V(W), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); + + /* S2 += 1 */ + sljit_emit_op2(C, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S2, 0, SLJIT_IMM, 1); + + /* jump loopstart */ + sljit_set_label(sljit_emit_jump(C, SLJIT_JUMP), loopstart); + + /* out: */ + sljit_set_label(out, sljit_emit_label(C)); + + /* return S1 */ + sljit_emit_return(C, SLJIT_MOV, SLJIT_S1, 0); /* Generate machine code */ code = sljit_generate_code(C); @@ -64,7 +83,7 @@ static int array_access(long *arr, long narr) return 0; } -int main() +int main(void) { long arr[8] = { 3, -10, 4, 6, 8, 12, 2000, 0 }; return array_access(arr, 8); diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/brainfuck.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/brainfuck.c old mode 100644 new mode 100755 index 53a491dd0e..508646834d --- a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/brainfuck.c +++ b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/brainfuck.c @@ -111,7 +111,7 @@ static int loop_pop(struct sljit_label **loop_start, struct sljit_jump **loop_en return 0; } -static void *SLJIT_FUNC my_alloc(long size, long n) +static void *SLJIT_FUNC my_alloc(size_t size, size_t n) { return calloc(size, n); } @@ -148,9 +148,11 @@ static void *compile(FILE *src, unsigned long *lcode) int SP = SLJIT_S0; /* bf SP */ int CELLS = SLJIT_S1; /* bf array */ - sljit_emit_enter(C, 0, SLJIT_ARGS2(VOID, W, W), 2, 2, 0, 0, 0); /* opt arg R S FR FS local_size */ + sljit_emit_enter(C, 0, SLJIT_ARGS2V(W, W), 2, 2, 0, 0, 0); + /* opt arg R S FR FS local_size */ - sljit_emit_op2(C, SLJIT_XOR, SP, 0, SP, 0, SP, 0); /* SP = 0 */ + /* SP = 0 */ + sljit_emit_op2(C, SLJIT_XOR, SP, 0, SP, 0, SP, 0); sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, BF_CELL_SIZE); sljit_emit_op1(C, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/branch.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/branch.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/first_program.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/first_program.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/func_call.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/func_call.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/hello.bf b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/hello.bf old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/loop.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/loop.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/sljit_tutorial.html b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/sljit_tutorial.html old mode 100644 new mode 100755 index fba7738bfb..d83ab6d60a --- a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/sljit_tutorial.html +++ b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/sljit_tutorial.html @@ -90,7 +90,7 @@ static int add3(sljit_sw a, sljit_sw b, sljit_sw c)
    func3_t func;

    /* Create a SLJIT compiler */
    - struct sljit_compiler *C = sljit_create_compiler();
    + struct sljit_compiler *C = sljit_create_compiler(NULL, NULL);

    /* Start a context(function entry), has 3 arguments, discuss later */
    sljit_emit_enter(C, 0, SLJIT_ARGS3(W, W, W, W), 1, 3, 0, 0, 0);
    @@ -121,7 +121,7 @@ static int add3(sljit_sw a, sljit_sw b, sljit_sw c)

    /* Clean up */
    sljit_free_compiler(C);
    - sljit_free_code(code);
    + sljit_free_code(code, NULL);
    return 0;
    }
    @@ -212,7 +212,7 @@ static int branch(sljit_sw a, sljit_sw b, sljit_sw c)
    struct sljit_jump *out;

    /* Create a SLJIT compiler */
    - struct sljit_compiler *C = sljit_create_compiler();
    + struct sljit_compiler *C = sljit_create_compiler(NULL, NULL);

    /* 3 arg, 1 temp reg, 3 save reg */
    sljit_emit_enter(C, 0, SLJIT_ARGS3(W, W, W, W), 1, 3, 0, 0, 0);
    @@ -253,7 +253,7 @@ static int branch(sljit_sw a, sljit_sw b, sljit_sw c)

    /* Clean up */
    sljit_free_compiler(C);
    - sljit_free_code(code);
    + sljit_free_code(code, NULL);
    return 0;
    }
    diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/struct_access.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/struct_access.c old mode 100644 new mode 100755 index 577a627d71..561b2eef6d --- a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/struct_access.c +++ b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/struct_access.c @@ -10,7 +10,7 @@ struct point_st { char d; }; -typedef long (SLJIT_FUNC *point_func_t)(struct point_st *point);; +typedef long (SLJIT_FUNC *point_func_t)(struct point_st *point); static long SLJIT_FUNC print_num(long a) { @@ -45,21 +45,26 @@ static int struct_access() struct sljit_compiler *C = sljit_create_compiler(NULL, NULL); sljit_emit_enter(C, 0, SLJIT_ARGS1(W, W), 1, 1, 0, 0, 0); - /* opt arg R S FR FS local_size */ + /* opt arg R S FR FS local_size */ - sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, x)); // S0->x --> R0 - sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); // print_num(R0); + /* S0->x --> R0; print_num(R0) */ + sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, x)); + sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); - sljit_emit_op1(C, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, y)); // S0->y --> R0 - sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); // print_num(R0); + /* S0->y --> R0; print_num(R0) */ + sljit_emit_op1(C, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, y)); + sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); - sljit_emit_op1(C, SLJIT_MOV_S16, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, z)); // S0->z --> R0 - sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); // print_num(R0); + /* S0->z --> R0; print_num(R0) */ + sljit_emit_op1(C, SLJIT_MOV_S16, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, z)); + sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); - sljit_emit_op1(C, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, d)); // S0->d --> R0 - sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); // print_num(R0); + /* S0->d --> R0; print_num(R0) */ + sljit_emit_op1(C, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, d)); + sljit_emit_icall(C, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(print_num)); - sljit_emit_return(C, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, x)); // return S0->x + /* return S0->x */ + sljit_emit_return(C, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct point_st, x)); /* Generate machine code */ code = sljit_generate_code(C); diff --git a/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/temp_var.c b/waterbox/ares64/ares/thirdparty/sljit/doc/tutorial/temp_var.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.c b/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.c old mode 100644 new mode 100755 index 2eaecd96e1..babdd8ffee --- a/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.c +++ b/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.c @@ -980,7 +980,7 @@ static int generate_transitions(struct compiler_common *compiler_common) struct stack_item *item; stack_init(depth); - compiler_common->dfa_transitions = SLJIT_MALLOC(sizeof(struct stack_item) * compiler_common->dfa_size, NULL); + compiler_common->dfa_transitions = (struct stack_item *)SLJIT_MALLOC(sizeof(struct stack_item) * compiler_common->dfa_size, NULL); if (!compiler_common->dfa_transitions) return REGEX_MEMORY_ERROR; @@ -1174,7 +1174,7 @@ static int generate_search_states(struct compiler_common *compiler_common) compiler_common->terms_size = !(compiler_common->flags & REGEX_FAKE_MATCH_END) ? 1 : 2; compiler_common->longest_range_size = 0; - compiler_common->search_states = SLJIT_MALLOC(sizeof(struct stack_item) * compiler_common->dfa_size, NULL); + compiler_common->search_states = (struct stack_item *)SLJIT_MALLOC(sizeof(struct stack_item) * compiler_common->dfa_size, NULL); if (!compiler_common->search_states) return REGEX_MEMORY_ERROR; @@ -1966,7 +1966,7 @@ struct regex_machine* regex_compile(const regex_char_t *regex_string, int length } /* Step 4.1: Generate entry. */ - CHECK(sljit_emit_enter(compiler_common.compiler, 0, SLJIT_ARGS3(VOID, P, P, 32), 5, 5, 0, 0, 0)); + CHECK(sljit_emit_enter(compiler_common.compiler, 0, SLJIT_ARGS3V(P, P, 32), 5, 5, 0, 0, 0)); /* Copy arguments to their place. */ EMIT_OP1(SLJIT_MOV, R_REGEX_MATCH, 0, SLJIT_S0, 0); diff --git a/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.h b/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexJIT.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexMain.c b/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexMain.c old mode 100644 new mode 100755 index 8951a0a7b5..edc13ff0cc --- a/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexMain.c +++ b/waterbox/ares64/ares/thirdparty/sljit/regex_src/regexMain.c @@ -211,9 +211,9 @@ static void run_tests(struct test_case* test, int verbose, int silent) printf("REGEX tests: "); if (fail == 0) - printf("all tests are " COLOR_GREEN "PASSED" COLOR_DEFAULT " "); + printf("all tests " COLOR_GREEN "PASSED" COLOR_DEFAULT " "); else - printf(COLOR_RED "%d" COLOR_DEFAULT " (" COLOR_RED "%d%%" COLOR_DEFAULT ") tests are failed ", fail, fail * 100 / (success + fail)); + printf(COLOR_RED "%d" COLOR_DEFAULT " (" COLOR_RED "%d%%" COLOR_DEFAULT ") tests failed ", fail, fail * 100 / (success + fail)); printf("on " COLOR_ARCH "%s" COLOR_DEFAULT "\n", regex_get_platform_name()); } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c old mode 100644 new mode 100755 index 6352377c4d..95b9842fa9 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorApple.c @@ -33,15 +33,18 @@ On non-macOS systems, returns MAP_JIT if it is defined. */ #include -#if TARGET_OS_OSX -#if defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86 + +#if (defined(TARGET_OS_OSX) && TARGET_OS_OSX) || (TARGET_OS_MAC && !TARGET_OS_IPHONE) + +#if defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86 + #include #include #define SLJIT_MAP_JIT (get_map_jit_flag()) #define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) -static SLJIT_INLINE int get_map_jit_flag() +static SLJIT_INLINE int get_map_jit_flag(void) { size_t page_size; void *ptr; @@ -67,10 +70,8 @@ static SLJIT_INLINE int get_map_jit_flag() } return map_jit_flag; } -#else /* !SLJIT_CONFIG_X86 */ -#if !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) -#error "Unsupported architecture" -#endif /* SLJIT_CONFIG_ARM */ + +#elif defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM #include #include @@ -81,15 +82,29 @@ static SLJIT_INLINE int get_map_jit_flag() static SLJIT_INLINE void apple_update_wx_flags(sljit_s32 enable_exec) { -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 110000 - pthread_jit_write_protect_np(enable_exec); -#else -#error "Must target Big Sur or newer" +#if MAC_OS_X_VERSION_MIN_REQUIRED < 110000 + if (__builtin_available(macos 11, *)) #endif /* BigSur */ + pthread_jit_write_protect_np(enable_exec); } -#endif /* SLJIT_CONFIG_X86 */ + +#elif defined(SLJIT_CONFIG_PPC) && SLJIT_CONFIG_PPC + +#define SLJIT_MAP_JIT (0) +#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) + +#else +#error "Unsupported architecture" +#endif /* SLJIT_CONFIG */ + #else /* !TARGET_OS_OSX */ + +#ifdef MAP_JIT #define SLJIT_MAP_JIT (MAP_JIT) +#else +#define SLJIT_MAP_JIT (0) +#endif + #endif /* TARGET_OS_OSX */ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c old mode 100644 new mode 100755 index 6cd391104c..85f3a9d1ea --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorCore.c @@ -308,7 +308,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void) free_block = free_blocks; while (free_block) { next_free_block = free_block->next; - if (!free_block->header.prev_size && + if (!free_block->header.prev_size && AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) { total_size -= free_block->size; sljit_remove_free_block(free_block); @@ -317,7 +317,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void) free_block = next_free_block; } - SLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks)); + SLJIT_ASSERT(total_size || (!total_size && !free_blocks)); SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 1); SLJIT_ALLOCATOR_UNLOCK(); } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorFreeBSD.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorFreeBSD.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorPosix.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorPosix.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorWindows.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitExecAllocatorWindows.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorNetBSD.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorNetBSD.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorPosix.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitProtExecAllocatorPosix.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorPosix.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorPosix.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorWindows.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/allocator_src/sljitWXExecAllocatorWindows.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfig.h b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfig.h old mode 100644 new mode 100755 index e11d4a2e1a..364c8bb788 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfig.h +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfig.h @@ -38,28 +38,6 @@ extern "C" { non-zero value. */ -/* --------------------------------------------------------------------- */ -/* Architecture */ -/* --------------------------------------------------------------------- */ - -/* Architecture selection. */ -/* #define SLJIT_CONFIG_X86_32 1 */ -/* #define SLJIT_CONFIG_X86_64 1 */ -/* #define SLJIT_CONFIG_ARM_V5 1 */ -/* #define SLJIT_CONFIG_ARM_V7 1 */ -/* #define SLJIT_CONFIG_ARM_THUMB2 1 */ -/* #define SLJIT_CONFIG_ARM_64 1 */ -/* #define SLJIT_CONFIG_PPC_32 1 */ -/* #define SLJIT_CONFIG_PPC_64 1 */ -/* #define SLJIT_CONFIG_MIPS_32 1 */ -/* #define SLJIT_CONFIG_MIPS_64 1 */ -/* #define SLJIT_CONFIG_RISCV_32 1 */ -/* #define SLJIT_CONFIG_RISCV_64 1 */ -/* #define SLJIT_CONFIG_S390X 1 */ - -/* #define SLJIT_CONFIG_AUTO 1 */ -/* #define SLJIT_CONFIG_UNSUPPORTED 1 */ - /* --------------------------------------------------------------------- */ /* Utilities */ /* --------------------------------------------------------------------- */ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigCPU.h b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigCPU.h new file mode 100755 index 0000000000..2720bdab0b --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigCPU.h @@ -0,0 +1,188 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SLJIT_CONFIG_CPU_H_ +#define SLJIT_CONFIG_CPU_H_ + +/* --------------------------------------------------------------------- */ +/* Architecture */ +/* --------------------------------------------------------------------- */ + +/* Architecture selection. */ +/* #define SLJIT_CONFIG_X86_32 1 */ +/* #define SLJIT_CONFIG_X86_64 1 */ +/* #define SLJIT_CONFIG_ARM_V6 1 */ +/* #define SLJIT_CONFIG_ARM_V7 1 */ +/* #define SLJIT_CONFIG_ARM_THUMB2 1 */ +/* #define SLJIT_CONFIG_ARM_64 1 */ +/* #define SLJIT_CONFIG_PPC_32 1 */ +/* #define SLJIT_CONFIG_PPC_64 1 */ +/* #define SLJIT_CONFIG_MIPS_32 1 */ +/* #define SLJIT_CONFIG_MIPS_64 1 */ +/* #define SLJIT_CONFIG_RISCV_32 1 */ +/* #define SLJIT_CONFIG_RISCV_64 1 */ +/* #define SLJIT_CONFIG_S390X 1 */ +/* #define SLJIT_CONFIG_LOONGARCH_64 */ + +/* #define SLJIT_CONFIG_AUTO 1 */ +/* #define SLJIT_CONFIG_UNSUPPORTED 1 */ + +/*****************/ +/* Sanity check. */ +/*****************/ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + + (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \ + + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ + + (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ + + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + + (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ + + (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ + + (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ + + (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + + (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \ + + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ + + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2 +#error "Multiple architectures are selected" +#endif + +#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + && !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + && !(defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \ + && !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + && !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ + && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + && !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ + && !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ + && !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ + && !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ + && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + && !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \ + && !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \ + && !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) +#if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO +#error "An architecture must be selected" +#else /* SLJIT_CONFIG_AUTO */ +#define SLJIT_CONFIG_AUTO 1 +#endif /* !SLJIT_CONFIG_AUTO */ +#endif /* !SLJIT_CONFIG */ + +/********************************************************/ +/* Automatic CPU detection (requires compiler support). */ +/********************************************************/ + +#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) +#ifndef _WIN32 + +#if defined(__i386__) || defined(__i386) +#define SLJIT_CONFIG_X86_32 1 +#elif defined(__x86_64__) +#define SLJIT_CONFIG_X86_64 1 +#elif defined(__aarch64__) +#define SLJIT_CONFIG_ARM_64 1 +#elif defined(__thumb2__) +#define SLJIT_CONFIG_ARM_THUMB2 1 +#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ((defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7S__)) \ + || (defined(__ARM_ARCH_8A__) || defined(__ARM_ARCH_8R__)) \ + || (defined(__ARM_ARCH_9A__))) +#define SLJIT_CONFIG_ARM_V7 1 +#elif defined(__arm__) || defined (__ARM__) +#define SLJIT_CONFIG_ARM_V6 1 +#elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__)) +#define SLJIT_CONFIG_PPC_64 1 +#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER) +#define SLJIT_CONFIG_PPC_32 1 +#elif defined(__mips__) && !defined(_LP64) +#define SLJIT_CONFIG_MIPS_32 1 +#elif defined(__mips64) +#define SLJIT_CONFIG_MIPS_64 1 +#elif defined (__riscv_xlen) && (__riscv_xlen == 32) +#define SLJIT_CONFIG_RISCV_32 1 +#elif defined (__riscv_xlen) && (__riscv_xlen == 64) +#define SLJIT_CONFIG_RISCV_64 1 +#elif defined (__loongarch_lp64) +#define SLJIT_CONFIG_LOONGARCH_64 1 +#elif defined(__s390x__) +#define SLJIT_CONFIG_S390X 1 +#else +/* Unsupported architecture */ +#define SLJIT_CONFIG_UNSUPPORTED 1 +#endif + +#else /* _WIN32 */ + +#if defined(_M_X64) || defined(__x86_64__) +#define SLJIT_CONFIG_X86_64 1 +#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__) +#define SLJIT_CONFIG_ARM_THUMB2 1 +#elif (defined(_M_ARM) && _M_ARM >= 7) +#define SLJIT_CONFIG_ARM_V7 1 +#elif defined(_ARM_) +#define SLJIT_CONFIG_ARM_V6 1 +#elif defined(_M_ARM64) || defined(__aarch64__) +#define SLJIT_CONFIG_ARM_64 1 +#else +#define SLJIT_CONFIG_X86_32 1 +#endif + +#endif /* !_WIN32 */ +#endif /* SLJIT_CONFIG_AUTO */ + +#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) +#undef SLJIT_EXECUTABLE_ALLOCATOR +#endif /* SLJIT_CONFIG_UNSUPPORTED */ + +/******************************/ +/* CPU family type detection. */ +/******************************/ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +#define SLJIT_CONFIG_ARM_32 1 +#endif + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) +#define SLJIT_CONFIG_X86 1 +#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) +#define SLJIT_CONFIG_ARM 1 +#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define SLJIT_CONFIG_PPC 1 +#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) +#define SLJIT_CONFIG_MIPS 1 +#elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) +#define SLJIT_CONFIG_RISCV 1 +#elif (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) +#define SLJIT_CONFIG_LOONGARCH 1 +#endif + +#endif /* SLJIT_CONFIG_CPU_H_ */ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigInternal.h b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigInternal.h old mode 100644 new mode 100755 index e9bd4d9322..f12505e9c8 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigInternal.h +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitConfigInternal.h @@ -72,6 +72,8 @@ extern "C" { SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS : number of available temporary registers + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS : number of available temporary floating point registers SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index SLJIT_F32_SHIFT : the shift required to apply when accessing a single precision floating point array by index @@ -81,141 +83,27 @@ extern "C" { the scratch register index of ecx is stored in this variable SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET) SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address + SLJIT_CONV_MAX_FLOAT : result when a floating point value is converted to integer + and the floating point value is higher than the maximum integer value + (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT) + SLJIT_CONV_MIN_FLOAT : result when a floating point value is converted to integer + and the floating point value is lower than the minimum integer value + (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT) + SLJIT_CONV_NAN_FLOAT : result when a NaN floating point value is converted to integer + (possible values: SLJIT_CONV_RESULT_MAX_INT, SLJIT_CONV_RESULT_MIN_INT, + or SLJIT_CONV_RESULT_ZERO) Other macros: + SLJIT_TMP_R0 .. R9 : accessing temporary registers + SLJIT_TMP_R(i) : accessing temporary registers + SLJIT_TMP_FR0 .. FR9 : accessing temporary floating point registers + SLJIT_TMP_FR(i) : accessing temporary floating point registers SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper) + SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit + floating point register when SLJIT_HAS_F64_AS_F32_PAIR returns non-zero */ -/*****************/ -/* Sanity check. */ -/*****************/ - -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ - + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ - + (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ - + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ - + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ - + (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ - + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ - + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ - + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ - + (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ - + (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ - + (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ - + (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ - + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ - + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2 -#error "Multiple architectures are selected" -#endif - -#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ - && !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ - && !(defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ - && !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ - && !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ - && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ - && !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ - && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ - && !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ - && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ - && !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ - && !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ - && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ - && !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \ - && !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) -#if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO -#error "An architecture must be selected" -#else /* SLJIT_CONFIG_AUTO */ -#define SLJIT_CONFIG_AUTO 1 -#endif /* !SLJIT_CONFIG_AUTO */ -#endif /* !SLJIT_CONFIG */ - -/********************************************************/ -/* Automatic CPU detection (requires compiler support). */ -/********************************************************/ - -#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) -#ifndef _WIN32 - -#if defined(__i386__) || defined(__i386) -#define SLJIT_CONFIG_X86_32 1 -#elif defined(__x86_64__) -#define SLJIT_CONFIG_X86_64 1 -#elif defined(__aarch64__) -#define SLJIT_CONFIG_ARM_64 1 -#elif defined(__thumb2__) -#define SLJIT_CONFIG_ARM_THUMB2 1 -#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ - ((defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7S__)) \ - || (defined(__ARM_ARCH_8A__) || defined(__ARM_ARCH_8R__)) \ - || (defined(__ARM_ARCH_9A__))) -#define SLJIT_CONFIG_ARM_V7 1 -#elif defined(__arm__) || defined (__ARM__) -#define SLJIT_CONFIG_ARM_V5 1 -#elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__)) -#define SLJIT_CONFIG_PPC_64 1 -#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER) -#define SLJIT_CONFIG_PPC_32 1 -#elif defined(__mips__) && !defined(_LP64) -#define SLJIT_CONFIG_MIPS_32 1 -#elif defined(__mips64) -#define SLJIT_CONFIG_MIPS_64 1 -#elif defined (__riscv_xlen) && (__riscv_xlen == 32) -#define SLJIT_CONFIG_RISCV_32 1 -#elif defined (__riscv_xlen) && (__riscv_xlen == 64) -#define SLJIT_CONFIG_RISCV_64 1 -#elif defined(__s390x__) -#define SLJIT_CONFIG_S390X 1 -#else -/* Unsupported architecture */ -#define SLJIT_CONFIG_UNSUPPORTED 1 -#endif - -#else /* _WIN32 */ - -#if defined(_M_X64) || defined(__x86_64__) -#define SLJIT_CONFIG_X86_64 1 -#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__) -#define SLJIT_CONFIG_ARM_THUMB2 1 -#elif (defined(_M_ARM) && _M_ARM >= 7) -#define SLJIT_CONFIG_ARM_V7 1 -#elif defined(_ARM_) -#define SLJIT_CONFIG_ARM_V5 1 -#elif defined(_M_ARM64) || defined(__aarch64__) -#define SLJIT_CONFIG_ARM_64 1 -#else -#define SLJIT_CONFIG_X86_32 1 -#endif - -#endif /* !_WIN32 */ -#endif /* SLJIT_CONFIG_AUTO */ - -#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) -#undef SLJIT_EXECUTABLE_ALLOCATOR -#endif - -/******************************/ -/* CPU family type detection. */ -/******************************/ - -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ - || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) -#define SLJIT_CONFIG_ARM_32 1 -#endif - -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) -#define SLJIT_CONFIG_X86 1 -#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) -#define SLJIT_CONFIG_ARM 1 -#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) -#define SLJIT_CONFIG_PPC 1 -#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) -#define SLJIT_CONFIG_MIPS 1 -#elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) -#define SLJIT_CONFIG_RISCV 1 -#endif - /***********************************************************/ /* Intel Control-flow Enforcement Technology (CET) spport. */ /***********************************************************/ @@ -244,23 +132,23 @@ extern "C" { */ #ifndef SLJIT_MALLOC -#define SLJIT_MALLOC(size, allocator_data) malloc(size) +#define SLJIT_MALLOC(size, allocator_data) (malloc(size)) #endif #ifndef SLJIT_FREE -#define SLJIT_FREE(ptr, allocator_data) free(ptr) +#define SLJIT_FREE(ptr, allocator_data) (free(ptr)) #endif #ifndef SLJIT_MEMCPY -#define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len) +#define SLJIT_MEMCPY(dest, src, len) (memcpy(dest, src, len)) #endif #ifndef SLJIT_MEMMOVE -#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len) +#define SLJIT_MEMMOVE(dest, src, len) (memmove(dest, src, len)) #endif #ifndef SLJIT_ZEROMEM -#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len) +#define SLJIT_ZEROMEM(dest, len) (memset(dest, 0, len)) #endif /***************************/ @@ -310,7 +198,7 @@ extern "C" { /* Type of public API functions. */ /*********************************/ -#ifndef SLJIT_API_FUNC_ATTRIBUTE +#ifndef SLJIT_API_FUNC_ATTRIBUTE #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) /* Static ABI functions. For all-in-one programs. */ @@ -330,6 +218,10 @@ extern "C" { /* Instruction cache flush. */ /****************************/ +#ifdef __APPLE__ +#include +#endif + /* * TODO: * @@ -370,7 +262,7 @@ extern "C" { /* Not required to implement on archs with unified caches. */ #define SLJIT_CACHE_FLUSH(from, to) -#elif defined __APPLE__ +#elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 /* Supported by all macs since Mac OS 10.5. However, it does not work on non-jailbroken iOS devices, @@ -435,14 +327,15 @@ typedef signed int sljit_s32; #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) /* Just to have something. */ #define SLJIT_WORD_SHIFT 0 -typedef unsigned long int sljit_uw; -typedef long int sljit_sw; +typedef unsigned int sljit_uw; +typedef int sljit_sw; #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ && !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ - && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + && !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) #define SLJIT_32BIT_ARCHITECTURE 1 #define SLJIT_WORD_SHIFT 2 typedef unsigned int sljit_uw; @@ -478,12 +371,46 @@ typedef double sljit_f64; #define SLJIT_F32_SHIFT 2 #define SLJIT_F64_SHIFT 3 +#define SLJIT_CONV_RESULT_MAX_INT 0 +#define SLJIT_CONV_RESULT_MIN_INT 1 +#define SLJIT_CONV_RESULT_ZERO 2 + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#elif (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO +#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT +#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) +#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT +#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT +#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO +#else +#error "Result for float to integer conversion is not defined" +#endif + #ifndef SLJIT_W /* Defining long constants. */ -#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) -#define SLJIT_W(w) (w##l) -#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) #ifdef _WIN64 #define SLJIT_W(w) (w##ll) #else /* !windows */ @@ -523,9 +450,10 @@ typedef double sljit_f64; /* Auto detecting mips revision. */ #if (defined __mips_isa_rev) && (__mips_isa_rev >= 6) #define SLJIT_MIPS_REV 6 -#elif (defined __mips_isa_rev && __mips_isa_rev >= 1) \ - || (defined __clang__ && defined _MIPS_ARCH_OCTEON) \ - || (defined __clang__ && defined _MIPS_ARCH_P5600) +#elif defined(__mips_isa_rev) && __mips_isa_rev >= 1 +#define SLJIT_MIPS_REV __mips_isa_rev +#elif defined(__clang__) \ + && (defined(_MIPS_ARCH_OCTEON) || defined(_MIPS_ARCH_P5600)) /* clang either forgets to define (clang-7) __mips_isa_rev at all * or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+) * and -march=p5600 (MIPS32 R5). @@ -564,7 +492,8 @@ typedef double sljit_f64; || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ - || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) #define SLJIT_UNALIGNED 1 #endif @@ -576,7 +505,8 @@ typedef double sljit_f64; || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ - || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) #define SLJIT_FPU_UNALIGNED 1 #endif @@ -649,8 +579,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_REGISTERS 12 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 7 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 1 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 7 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 #define SLJIT_LOCALS_OFFSET_BASE (8 * SSIZE_OF(sw)) #define SLJIT_PREF_SHIFT_REG SLJIT_R2 #define SLJIT_MASKED_SHIFT 1 @@ -659,7 +591,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) #define SLJIT_NUMBER_OF_REGISTERS 13 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 #ifndef _WIN64 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 @@ -673,28 +607,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_MASKED_SHIFT 1 #define SLJIT_MASKED_SHIFT32 1 -#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) - -#define SLJIT_NUMBER_OF_REGISTERS 12 -#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 -#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14 -#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 -#define SLJIT_LOCALS_OFFSET_BASE 0 - -#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) #define SLJIT_NUMBER_OF_REGISTERS 12 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 #define SLJIT_LOCALS_OFFSET_BASE 0 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) #define SLJIT_NUMBER_OF_REGISTERS 26 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 #define SLJIT_LOCALS_OFFSET_BASE (2 * (sljit_s32)sizeof(sljit_sw)) #define SLJIT_MASKED_SHIFT 1 #define SLJIT_MASKED_SHIFT32 1 @@ -703,8 +633,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_REGISTERS 23 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 18 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX) #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * (sljit_s32)sizeof(sljit_sw)) #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) @@ -727,6 +659,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 29 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 #endif +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 3 #define SLJIT_MASKED_SHIFT 1 #define SLJIT_MASKED_SHIFT32 1 @@ -734,9 +668,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_REGISTERS 23 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 12 -#define SLJIT_LOCALS_OFFSET_BASE 0 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 +#define SLJIT_LOCALS_OFFSET_BASE 0 #define SLJIT_MASKED_SHIFT 1 #define SLJIT_MASKED_SHIFT32 1 @@ -765,17 +701,34 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_REGISTERS 12 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 #define SLJIT_LOCALS_OFFSET_BASE SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE #define SLJIT_MASKED_SHIFT 1 +#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) + +#define SLJIT_NUMBER_OF_REGISTERS 23 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 +#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 +#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 +#define SLJIT_LOCALS_OFFSET_BASE 0 +#define SLJIT_MASKED_SHIFT 1 +#define SLJIT_MASKED_SHIFT32 1 + #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) +/* Just to have something. */ #define SLJIT_NUMBER_OF_REGISTERS 0 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0 +#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 0 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 0 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 +#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 0 #define SLJIT_LOCALS_OFFSET_BASE 0 #endif @@ -788,6 +741,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) +/**********************************/ +/* Temporary register management. */ +/**********************************/ + +#define SLJIT_TMP_REGISTER_BASE (SLJIT_NUMBER_OF_REGISTERS + 2) +#define SLJIT_TMP_FREGISTER_BASE (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) + +/* WARNING: Accessing temporary registers is not recommended, because they + are also used by the JIT compiler for various computations. Using them + might have any side effects including incorrect operations and crashes, + so use them at your own risk. The machine registers themselves might have + limitations, e.g. the r0 register on s390x / ppc cannot be used as + base address for memory operations. */ + +/* Temporary registers */ +#define SLJIT_TMP_R0 (SLJIT_TMP_REGISTER_BASE + 0) +#define SLJIT_TMP_R1 (SLJIT_TMP_REGISTER_BASE + 1) +#define SLJIT_TMP_R2 (SLJIT_TMP_REGISTER_BASE + 2) +#define SLJIT_TMP_R3 (SLJIT_TMP_REGISTER_BASE + 3) +#define SLJIT_TMP_R4 (SLJIT_TMP_REGISTER_BASE + 4) +#define SLJIT_TMP_R5 (SLJIT_TMP_REGISTER_BASE + 5) +#define SLJIT_TMP_R6 (SLJIT_TMP_REGISTER_BASE + 6) +#define SLJIT_TMP_R7 (SLJIT_TMP_REGISTER_BASE + 7) +#define SLJIT_TMP_R8 (SLJIT_TMP_REGISTER_BASE + 8) +#define SLJIT_TMP_R9 (SLJIT_TMP_REGISTER_BASE + 9) +#define SLJIT_TMP_R(i) (SLJIT_TMP_REGISTER_BASE + (i)) + +#define SLJIT_TMP_FR0 (SLJIT_TMP_FREGISTER_BASE + 0) +#define SLJIT_TMP_FR1 (SLJIT_TMP_FREGISTER_BASE + 1) +#define SLJIT_TMP_FR2 (SLJIT_TMP_FREGISTER_BASE + 2) +#define SLJIT_TMP_FR3 (SLJIT_TMP_FREGISTER_BASE + 3) +#define SLJIT_TMP_FR4 (SLJIT_TMP_FREGISTER_BASE + 4) +#define SLJIT_TMP_FR5 (SLJIT_TMP_FREGISTER_BASE + 5) +#define SLJIT_TMP_FR6 (SLJIT_TMP_FREGISTER_BASE + 6) +#define SLJIT_TMP_FR7 (SLJIT_TMP_FREGISTER_BASE + 7) +#define SLJIT_TMP_FR8 (SLJIT_TMP_FREGISTER_BASE + 8) +#define SLJIT_TMP_FR9 (SLJIT_TMP_FREGISTER_BASE + 9) +#define SLJIT_TMP_FR(i) (SLJIT_TMP_FREGISTER_BASE + (i)) + /********************************/ /* CPU status flags management. */ /********************************/ @@ -796,10 +788,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ || (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \ || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ - || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) #define SLJIT_HAS_STATUS_FLAGS_STATE 1 #endif +/***************************************/ +/* Floating point register management. */ +/***************************************/ + +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define SLJIT_F64_SECOND(reg) \ + ((reg) + SLJIT_FS0 + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS) +#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */ +#define SLJIT_F64_SECOND(reg) \ + (reg) +#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */ + /*************************************/ /* Debug and verbose related macros. */ /*************************************/ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.c old mode 100644 new mode 100755 index 4a73e8e495..bfaee050ea --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.c @@ -123,47 +123,71 @@ #endif /* Parameter parsing. */ -#define REG_MASK 0x3f +#define REG_MASK 0x7f #define OFFS_REG(reg) (((reg) >> 8) & REG_MASK) #define OFFS_REG_MASK (REG_MASK << 8) #define TO_OFFS_REG(reg) ((reg) << 8) -/* When reg cannot be unused. */ -#define FAST_IS_REG(reg) ((reg) <= REG_MASK) +#define FAST_IS_REG(reg) ((reg) < REG_MASK) /* Mask for argument types. */ #define SLJIT_ARG_MASK 0x7 #define SLJIT_ARG_FULL_MASK (SLJIT_ARG_MASK | SLJIT_ARG_TYPE_SCRATCH_REG) -/* Mask for sljit_emit_mem. */ -#define REG_PAIR_MASK 0xff00 -#define REG_PAIR_FIRST(reg) ((reg) & 0xff) +/* Mask for register pairs. */ +#define REG_PAIR_MASK 0x7f00 +#define REG_PAIR_FIRST(reg) ((reg) & 0x7f) #define REG_PAIR_SECOND(reg) ((reg) >> 8) /* Mask for sljit_emit_enter. */ #define SLJIT_KEPT_SAVEDS_COUNT(options) ((options) & 0x3) +/* Getters for simd operations, which returns with log2(size). */ +#define SLJIT_SIMD_GET_OPCODE(type) ((type) & 0xff) +#define SLJIT_SIMD_GET_REG_SIZE(type) (((type) >> 12) & 0x3f) +#define SLJIT_SIMD_GET_ELEM_SIZE(type) (((type) >> 18) & 0x3f) +#define SLJIT_SIMD_GET_ELEM2_SIZE(type) (((type) >> 24) & 0x3f) + +#define SLJIT_SIMD_CHECK_REG(type) (((type) & 0x3f000) >= SLJIT_SIMD_REG_64 && ((type) & 0x3f000) <= SLJIT_SIMD_REG_512) +#define SLJIT_SIMD_TYPE_MASK(m) ((sljit_s32)0xff000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m))) +#define SLJIT_SIMD_TYPE_MASK2(m) ((sljit_s32)0xc0000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m))) + /* Jump flags. */ -#define JUMP_LABEL 0x1 -#define JUMP_ADDR 0x2 +#define JUMP_ADDR 0x1 +#define JUMP_MOV_ADDR 0x2 /* SLJIT_REWRITABLE_JUMP is 0x1000. */ #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) -# define PATCH_MB 0x4 -# define PATCH_MW 0x8 +# define PATCH_MB 0x04 +# define PATCH_MW 0x08 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) # define PATCH_MD 0x10 -#endif +# define MOV_ADDR_HI 0x20 +# define JUMP_MAX_SIZE ((sljit_uw)(10 + 3)) +# define CJUMP_MAX_SIZE ((sljit_uw)(2 + 10 + 3)) +#else /* !SLJIT_CONFIG_X86_64 */ +# define JUMP_MAX_SIZE ((sljit_uw)5) +# define CJUMP_MAX_SIZE ((sljit_uw)6) +#endif /* SLJIT_CONFIG_X86_64 */ # define TYPE_SHIFT 13 +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) +/* Bits 7..12 is for debug jump size, SLJIT_REWRITABLE_JUMP is 0x1000 */ +# define JUMP_SIZE_SHIFT 7 +#endif /* SLJIT_DEBUG */ #endif /* SLJIT_CONFIG_X86 */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) -# define IS_BL 0x4 -# define PATCH_B 0x8 -#endif /* SLJIT_CONFIG_ARM_V5 || SLJIT_CONFIG_ARM_V7 */ +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +# define IS_BL 0x04 +# define PATCH_B 0x08 +#endif /* SLJIT_CONFIG_ARM_V6 || SLJIT_CONFIG_ARM_V7 */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) # define CPOOL_SIZE 512 -#endif /* SLJIT_CONFIG_ARM_V5 */ +#endif /* SLJIT_CONFIG_ARM_V6 */ + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +# define JUMP_SIZE_SHIFT 26 +# define JUMP_MAX_SIZE ((sljit_uw)3) +#endif /* SLJIT_CONFIG_ARM_V7 */ #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) # define IS_COND 0x04 @@ -172,25 +196,30 @@ # define PATCH_TYPE1 0x10 /* conditional + imm20 */ # define PATCH_TYPE2 0x20 - /* IT + imm24 */ -# define PATCH_TYPE3 0x30 /* imm11 */ -# define PATCH_TYPE4 0x40 +# define PATCH_TYPE3 0x30 /* imm24 */ -# define PATCH_TYPE5 0x50 +# define PATCH_TYPE4 0x40 /* BL + imm24 */ -# define PATCH_BL 0x60 +# define PATCH_TYPE5 0x50 + /* addwi/subwi */ +# define PATCH_TYPE6 0x60 /* 0xf00 cc code for branches */ +# define JUMP_SIZE_SHIFT 26 +# define JUMP_MAX_SIZE ((sljit_uw)5) #endif /* SLJIT_CONFIG_ARM_THUMB2 */ #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) # define IS_COND 0x004 # define IS_CBZ 0x008 # define IS_BL 0x010 -# define PATCH_B 0x020 -# define PATCH_COND 0x040 -# define PATCH_ABS48 0x080 -# define PATCH_ABS64 0x100 +# define PATCH_COND 0x020 +# define PATCH_B 0x040 +# define PATCH_B32 0x080 +# define PATCH_ABS48 0x100 +# define PATCH_ABS64 0x200 +# define JUMP_SIZE_SHIFT 58 +# define JUMP_MAX_SIZE ((sljit_uw)5) #endif /* SLJIT_CONFIG_ARM_64 */ #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) @@ -201,8 +230,12 @@ #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) # define PATCH_ABS32 0x040 # define PATCH_ABS48 0x080 +# define JUMP_SIZE_SHIFT 58 +# define JUMP_MAX_SIZE ((sljit_uw)7) +#else /* !SLJIT_CONFIG_PPC_64 */ +# define JUMP_SIZE_SHIFT 26 +# define JUMP_MAX_SIZE ((sljit_uw)4) #endif /* SLJIT_CONFIG_PPC_64 */ -# define REMOVE_COND 0x100 #endif /* SLJIT_CONFIG_PPC */ #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) @@ -244,11 +277,26 @@ # define PATCH_ABS32 0x080 # define PATCH_ABS44 0x100 # define PATCH_ABS52 0x200 +# define JUMP_SIZE_SHIFT 58 +# define JUMP_MAX_SIZE ((sljit_uw)6) #else /* !SLJIT_CONFIG_RISCV_64 */ -# define PATCH_REL32 0x0 +# define JUMP_SIZE_SHIFT 26 +# define JUMP_MAX_SIZE ((sljit_uw)2) #endif /* SLJIT_CONFIG_RISCV_64 */ #endif /* SLJIT_CONFIG_RISCV */ +#if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) +# define IS_COND 0x004 +# define IS_CALL 0x008 + +# define PATCH_B 0x010 +# define PATCH_J 0x020 + +# define PATCH_REL32 0x040 +# define PATCH_ABS32 0x080 +# define PATCH_ABS52 0x100 + +#endif /* SLJIT_CONFIG_LOONGARCH */ /* Stack management. */ #define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \ @@ -447,9 +495,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allo #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) compiler->args_size = -1; -#endif +#endif /* SLJIT_CONFIG_X86_32 */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw) + CPOOL_SIZE * sizeof(sljit_u8), allocator_data); if (!compiler->cpool) { @@ -460,18 +508,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allo } compiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE); compiler->cpool_diff = 0xffffffff; -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) compiler->delay_slot = UNMOVABLE_INS; -#endif +#endif /* SLJIT_CONFIG_MIPS */ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ || (defined SLJIT_DEBUG && SLJIT_DEBUG) compiler->last_flags = 0; compiler->last_return = -1; compiler->logical_local_size = 0; -#endif +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT) if (!compiler_initialized) { @@ -504,7 +552,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compile SLJIT_FREE(curr, allocator_data); } -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) SLJIT_FREE(compiler->cpool, allocator_data); #endif SLJIT_FREE(compiler, allocator_data); @@ -546,7 +594,6 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sl { if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) { jump->flags &= (sljit_uw)~JUMP_ADDR; - jump->flags |= JUMP_LABEL; jump->u.label = label; } } @@ -554,18 +601,11 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sl SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target) { if (SLJIT_LIKELY(!!jump)) { - jump->flags &= (sljit_uw)~JUMP_LABEL; jump->flags |= JUMP_ADDR; jump->u.target = target; } } -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label) -{ - if (SLJIT_LIKELY(!!put_label)) - put_label->label = label; -} - #define SLJIT_CURRENT_FLAGS_ALL \ (SLJIT_CURRENT_FLAGS_32 | SLJIT_CURRENT_FLAGS_ADD | SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE) @@ -660,31 +700,44 @@ static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler) compiler->buf = prev; } -/* Only used in RISC architectures where the instruction size is constant */ -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ - && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) +#define SLJIT_MAX_ADDRESS ~(sljit_uw)0 -static SLJIT_INLINE sljit_uw compute_next_addr(struct sljit_label *label, struct sljit_jump *jump, - struct sljit_const *const_, struct sljit_put_label *put_label) +#define SLJIT_GET_NEXT_SIZE(ptr) (ptr != NULL) ? ((ptr)->size) : SLJIT_MAX_ADDRESS +#define SLJIT_GET_NEXT_ADDRESS(ptr) (ptr != NULL) ? ((ptr)->addr) : SLJIT_MAX_ADDRESS + +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + +#define SLJIT_NEXT_DEFINE_TYPES \ + sljit_uw next_label_size; \ + sljit_uw next_jump_addr; \ + sljit_uw next_const_addr; \ + sljit_uw next_min_addr + +#define SLJIT_NEXT_INIT_TYPES() \ + next_label_size = SLJIT_GET_NEXT_SIZE(label); \ + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); \ + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + +#define SLJIT_GET_NEXT_MIN() \ + next_min_addr = sljit_get_next_min(next_label_size, next_jump_addr, next_const_addr); + +static SLJIT_INLINE sljit_uw sljit_get_next_min(sljit_uw next_label_size, + sljit_uw next_jump_addr, sljit_uw next_const_addr) { - sljit_uw result = ~(sljit_uw)0; + sljit_uw result = next_jump_addr; - if (label) - result = label->size; + SLJIT_ASSERT(result == SLJIT_MAX_ADDRESS || result != next_const_addr); - if (jump && jump->addr < result) - result = jump->addr; + if (next_const_addr < result) + result = next_const_addr; - if (const_ && const_->addr < result) - result = const_->addr; - - if (put_label && put_label->addr < result) - result = put_label->addr; + if (next_label_size < result) + result = next_label_size; return result; } -#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_S390X */ +#endif /* !SLJIT_CONFIG_X86 */ static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, @@ -725,8 +778,9 @@ static SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler, static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler) { label->next = NULL; + label->u.index = compiler->label_count++; label->size = compiler->size; - if (compiler->last_label) + if (compiler->last_label != NULL) compiler->last_label->next = label; else compiler->labels = label; @@ -737,7 +791,21 @@ static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler { jump->next = NULL; jump->flags = flags; - if (compiler->last_jump) + jump->u.label = NULL; + if (compiler->last_jump != NULL) + compiler->last_jump->next = jump; + else + compiler->jumps = jump; + compiler->last_jump = jump; +} + +static SLJIT_INLINE void set_mov_addr(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_uw offset) +{ + jump->next = NULL; + jump->addr = compiler->size - offset; + jump->flags = JUMP_MOV_ADDR; + jump->u.label = NULL; + if (compiler->last_jump != NULL) compiler->last_jump->next = jump; else compiler->jumps = jump; @@ -748,26 +816,13 @@ static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_comp { const_->next = NULL; const_->addr = compiler->size; - if (compiler->last_const) + if (compiler->last_const != NULL) compiler->last_const->next = const_; else compiler->consts = const_; compiler->last_const = const_; } -static SLJIT_INLINE void set_put_label(struct sljit_put_label *put_label, struct sljit_compiler *compiler, sljit_uw offset) -{ - put_label->next = NULL; - put_label->label = NULL; - put_label->addr = compiler->size - offset; - put_label->flags = 0; - if (compiler->last_put_label) - compiler->last_put_label->next = put_label; - else - compiler->put_labels = put_label; - compiler->last_put_label = put_label; -} - #define ADDRESSING_DEPENDS_ON(exp, reg) \ (((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg)) @@ -827,11 +882,8 @@ static sljit_s32 function_check_arguments(sljit_s32 arg_types, sljit_s32 scratch #define FUNCTION_CHECK_IS_REG(r) \ (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \ - || ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0)) - -#define FUNCTION_CHECK_IS_FREG(fr) \ - (((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \ - || ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0)) + || ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0) \ + || ((r) >= SLJIT_TMP_REGISTER_BASE && (r) < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS))) #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) #define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8) @@ -841,7 +893,7 @@ static sljit_s32 function_check_arguments(sljit_s32 arg_types, sljit_s32 scratch static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) { - if (compiler->scratches == -1 || compiler->saveds == -1) + if (compiler->scratches == -1) return 0; if (!(p & SLJIT_MEM)) @@ -878,7 +930,7 @@ static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) { - if (compiler->scratches == -1 || compiler->saveds == -1) + if (compiler->scratches == -1) return 0; if (FUNCTION_CHECK_IS_REG(p)) @@ -895,7 +947,7 @@ static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) { - if (compiler->scratches == -1 || compiler->saveds == -1) + if (compiler->scratches == -1) return 0; if (FUNCTION_CHECK_IS_REG(p)) @@ -907,19 +959,59 @@ static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p #define FUNCTION_CHECK_DST(p, i) \ CHECK_ARGUMENT(function_check_dst(compiler, p, i)); -static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + +#define FUNCTION_CHECK_IS_FREG(fr, is_32) \ + function_check_is_freg(compiler, (fr), (is_32)) + +static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32); + +#define FUNCTION_FCHECK(p, i, is_32) \ + CHECK_ARGUMENT(function_fcheck(compiler, (p), (i), (is_32))); + +static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 is_32) { - if (compiler->scratches == -1 || compiler->saveds == -1) + if (compiler->scratches == -1) return 0; - if (FUNCTION_CHECK_IS_FREG(p)) + if (FUNCTION_CHECK_IS_FREG(p, is_32)) return (i == 0); return function_check_src_mem(compiler, p, i); } -#define FUNCTION_FCHECK(p, i) \ - CHECK_ARGUMENT(function_fcheck(compiler, p, i)); +#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */ +#define FUNCTION_CHECK_IS_FREG(fr, is_32) \ + function_check_is_freg(compiler, (fr)) + +static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr) +{ + if (compiler->scratches == -1) + return 0; + + return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches)) + || (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0) + || (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)); +} + +#define FUNCTION_FCHECK(p, i, is_32) \ + CHECK_ARGUMENT(function_fcheck(compiler, (p), (i))); + +static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if (compiler->scratches == -1) + return 0; + + if ((p >= SLJIT_FR0 && p < (SLJIT_FR0 + compiler->fscratches)) + || (p > (SLJIT_FS0 - compiler->fsaveds) && p <= SLJIT_FS0) + || (p >= SLJIT_TMP_FREGISTER_BASE && p < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS))) + return (i == 0); + + return function_check_src_mem(compiler, p, i); +} + +#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */ #endif /* SLJIT_ARGUMENT_CHECKS */ @@ -948,23 +1040,35 @@ static void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r) { if (r < (SLJIT_R0 + compiler->scratches)) fprintf(compiler->verbose, "r%d", r - SLJIT_R0); - else if (r != SLJIT_SP) + else if (r < SLJIT_SP) fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - r); - else + else if (r == SLJIT_SP) fprintf(compiler->verbose, "sp"); + else + fprintf(compiler->verbose, "t%d", r - SLJIT_TMP_REGISTER_BASE); } static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r) { +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + if (r >= SLJIT_F64_SECOND(SLJIT_FR0)) { + fprintf(compiler->verbose, "^"); + r -= SLJIT_F64_SECOND(0); + } +#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */ + if (r < (SLJIT_FR0 + compiler->fscratches)) fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0); - else + else if (r < SLJIT_TMP_FREGISTER_BASE) fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r); + else + fprintf(compiler->verbose, "ft%d", r - SLJIT_TMP_FREGISTER_BASE); } static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) { - if ((p) & SLJIT_IMM) + if ((p) == SLJIT_IMM) fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i)); else if ((p) & SLJIT_MEM) { if ((p) & REG_MASK) { @@ -1016,9 +1120,17 @@ static const char* op0_names[] = { }; static const char* op1_names[] = { + "mov", "mov", "mov", "mov", + "mov", "mov", "mov", "mov", + "mov", "clz", "ctz", "rev", + "rev", "rev", "rev", "rev" +}; + +static const char* op1_types[] = { "", ".u8", ".s8", ".u16", ".s16", ".u32", ".s32", "32", - ".p", "clz", "ctz", "rev" + ".p", "", "", "", + ".u16", ".s16", ".u32", ".s32" }; static const char* op2_names[] = { @@ -1037,14 +1149,27 @@ static const char* op_src_dst_names[] = { static const char* fop1_names[] = { "mov", "conv", "conv", "conv", - "conv", "conv", "cmp", "neg", - "abs", + "conv", "conv", "conv", "conv", + "cmp", "neg", "abs", +}; + +static const char* fop1_conv_types[] = { + "sw", "s32", "sw", "s32", + "uw", "u32" }; static const char* fop2_names[] = { "add", "sub", "mul", "div" }; +static const char* fop2r_names[] = { + "copysign" +}; + +static const char* simd_op2_names[] = { + "and", "or", "xor" +}; + static const char* jump_names[] = { "equal", "not_equal", "less", "greater_equal", @@ -1052,7 +1177,8 @@ static const char* jump_names[] = { "sig_less", "sig_greater_equal", "sig_greater", "sig_less_equal", "overflow", "not_overflow", - "carry", "", + "carry", "not_carry", + "atomic_stored", "atomic_not_stored", "f_equal", "f_not_equal", "f_less", "f_greater_equal", "f_greater", "f_less_equal", @@ -1095,7 +1221,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_com jump = compiler->jumps; while (jump) { /* All jumps have target. */ - CHECK_ARGUMENT(jump->flags & (JUMP_LABEL | JUMP_ADDR)); + CHECK_ARGUMENT((jump->flags & JUMP_ADDR) || jump->u.label != NULL); jump = jump->next; } #endif @@ -1224,7 +1350,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return_void(struct sljit_ } #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - CHECK_ARGUMENT(compiler->last_return == SLJIT_ARG_TYPE_VOID); + CHECK_ARGUMENT(compiler->last_return == SLJIT_ARG_TYPE_RET_VOID); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -1267,7 +1393,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compi if (GET_OPCODE(op) < SLJIT_MOV_F64) { FUNCTION_CHECK_SRC(src, srcw); } else { - FUNCTION_FCHECK(src, srcw); + FUNCTION_FCHECK(src, srcw, op & SLJIT_32); } compiler->last_flags = 0; #endif @@ -1275,7 +1401,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compi if (SLJIT_UNLIKELY(!!compiler->verbose)) { if (GET_OPCODE(op) < SLJIT_MOV_F64) { fprintf(compiler->verbose, " return%s%s ", !(op & SLJIT_32) ? "" : "32", - op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE]); + op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]); sljit_verbose_param(compiler, src, srcw); } else { fprintf(compiler->verbose, " return%s ", !(op & SLJIT_32) ? ".f64" : ".f32"); @@ -1336,7 +1462,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler } #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_REV); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_REV_S32); switch (GET_OPCODE(op)) { case SLJIT_MOV: @@ -1344,6 +1470,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler case SLJIT_MOV_S32: case SLJIT_MOV32: case SLJIT_MOV_P: + case SLJIT_REV_U32: + case SLJIT_REV_S32: /* Nothing allowed */ CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))); break; @@ -1358,17 +1486,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { - if (GET_OPCODE(op) <= SLJIT_MOV_P) - { - fprintf(compiler->verbose, " mov%s%s ", !(op & SLJIT_32) ? "" : "32", - op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE]); - } - else - { - fprintf(compiler->verbose, " %s%s%s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & SLJIT_32) ? "" : "32", - !(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".", - !(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]); - } + fprintf(compiler->verbose, " %s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], + !(op & SLJIT_32) ? "" : "32", op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]); sljit_verbose_param(compiler, dst, dstw); fprintf(compiler->verbose, ", "); @@ -1379,6 +1498,94 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler CHECK_RETURN_OK; } +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P); + CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32); + + /* All arguments must be valid registers. */ + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg)); + + if (op == SLJIT_MOV32_U8 || op == SLJIT_MOV32_U16) { + /* Only SLJIT_32 is allowed. */ + CHECK_ARGUMENT(!(op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z))); + } else { + /* Nothing allowed. */ + CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + } + + compiler->last_flags = 0; +#endif /* SLJIT_ARGUMENT_CHECKS */ +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " atomic_load%s%s ", !(op & SLJIT_32) ? "" : "32", + op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]); + sljit_verbose_reg(compiler, dst_reg); + fprintf(compiler->verbose, ", ["); + sljit_verbose_reg(compiler, mem_reg); + fprintf(compiler->verbose, "]\n"); + } +#endif /* SLJIT_VERBOSE */ + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P); + CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32); + + /* All arguments must be valid registers. */ + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src_reg)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(temp_reg) && src_reg != temp_reg); + + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) || GET_FLAG_TYPE(op) == SLJIT_ATOMIC_STORED); + + if (GET_OPCODE(op) == SLJIT_MOV_U8 || GET_OPCODE(op) == SLJIT_MOV_U16) { + /* Only SLJIT_32, SLJIT_ATOMIC_STORED are allowed. */ + CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); + } else { + /* Only SLJIT_ATOMIC_STORED is allowed. */ + CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z))); + } + + compiler->last_flags = GET_FLAG_TYPE(op) | (op & SLJIT_32); +#endif /* SLJIT_ARGUMENT_CHECKS */ +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " atomic_store%s%s%s ", !(op & SLJIT_32) ? "" : "32", + op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & VARIABLE_FLAG_MASK) ? "" : ".stored"); + sljit_verbose_reg(compiler, src_reg); + fprintf(compiler->verbose, ", ["); + sljit_verbose_reg(compiler, mem_reg); + fprintf(compiler->verbose, "], "); + sljit_verbose_reg(compiler, temp_reg); + fprintf(compiler->verbose, "\n"); + } +#endif /* SLJIT_VERBOSE */ + CHECK_RETURN_OK; +} + static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 unset, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, @@ -1541,20 +1748,19 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_dst(struct sljit_compi CHECK_RETURN_OK; } -static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg) +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { + SLJIT_UNUSED_ARG(type); SLJIT_UNUSED_ARG(reg); #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS); -#endif - CHECK_RETURN_OK; -} - -static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_s32 reg) -{ - SLJIT_UNUSED_ARG(reg); -#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + if (type == SLJIT_GP_REGISTER) { + CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS) + || (reg >= SLJIT_TMP_REGISTER_BASE && reg < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS))); + } else { + CHECK_ARGUMENT(type == SLJIT_FLOAT_REGISTER || ((type >> 12) == 0 || ((type >> 12) >= 3 && (type >> 12) <= 6))); + CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS) + || (reg >= SLJIT_TMP_FREGISTER_BASE && reg < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS))); + } #endif CHECK_RETURN_OK; } @@ -1608,8 +1814,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compile CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64); CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); - FUNCTION_FCHECK(src, srcw); - FUNCTION_FCHECK(dst, dstw); + FUNCTION_FCHECK(src, srcw, op & SLJIT_32); + FUNCTION_FCHECK(dst, dstw, op & SLJIT_32); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { @@ -1648,8 +1854,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_com CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK) || (GET_FLAG_TYPE(op) >= SLJIT_F_EQUAL && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_LESS_EQUAL)); - FUNCTION_FCHECK(src1, src1w); - FUNCTION_FCHECK(src2, src2w); + FUNCTION_FCHECK(src1, src1w, op & SLJIT_32); + FUNCTION_FCHECK(src2, src2w, op & SLJIT_32); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { @@ -1678,15 +1884,14 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(str #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); - CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CONV_S32_FROM_F64); CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); - FUNCTION_FCHECK(src, srcw); + FUNCTION_FCHECK(src, srcw, op & SLJIT_32); FUNCTION_CHECK_DST(dst, dstw); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], - (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? ".s32" : ".sw", + fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64], (op & SLJIT_32) ? ".f32" : ".f64"); sljit_verbose_param(compiler, dst, dstw); fprintf(compiler->verbose, ", "); @@ -1697,7 +1902,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(str CHECK_RETURN_OK; } -static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { @@ -1708,16 +1913,15 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(str #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); - CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_SW && GET_OPCODE(op) <= SLJIT_CONV_F64_FROM_S32); CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); FUNCTION_CHECK_SRC(src, srcw); - FUNCTION_FCHECK(dst, dstw); + FUNCTION_FCHECK(dst, dstw, op & SLJIT_32); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { - fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], + fprintf(compiler->verbose, " %s%s.from.%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], (op & SLJIT_32) ? ".f32" : ".f64", - (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? ".s32" : ".sw"); + fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64]); sljit_verbose_fparam(compiler, dst, dstw); fprintf(compiler->verbose, ", "); sljit_verbose_param(compiler, src, srcw); @@ -1732,13 +1936,18 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compile sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) { + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64); CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); - FUNCTION_FCHECK(src1, src1w); - FUNCTION_FCHECK(src2, src2w); - FUNCTION_FCHECK(dst, dstw); + FUNCTION_FCHECK(src1, src1w, op & SLJIT_32); + FUNCTION_FCHECK(src2, src2w, op & SLJIT_32); + FUNCTION_FCHECK(dst, dstw, op & SLJIT_32); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { @@ -1754,6 +1963,80 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compile CHECK_RETURN_OK; } +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_COPYSIGN_F64); + FUNCTION_FCHECK(src1, src1w, op & SLJIT_32); + FUNCTION_FCHECK(src2, src2w, op & SLJIT_32); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, op & SLJIT_32)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s ", fop2r_names[GET_OPCODE(op) - SLJIT_FOP2R_BASE], (op & SLJIT_32) ? ".f32" : ".f64"); + sljit_verbose_freg(compiler, dst_freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + SLJIT_UNUSED_ARG(value); + + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 1)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fset32 "); + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", %f\n", value); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + SLJIT_UNUSED_ARG(value); + + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fset64 "); + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", %f\n", value); + } +#endif + CHECK_RETURN_OK; +} + static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -1761,7 +2044,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcopy(struct sljit_compil CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_COPY_TO_F64 && GET_OPCODE(op) <= SLJIT_COPY_FROM_F64); CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); - CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, op & SLJIT_32)); #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg)); @@ -1836,7 +2119,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compil #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ || (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) #define CHECK_UNORDERED(type, last_flags) \ - ((((type) & 0xff) == SLJIT_UNORDERED || ((type) & 0xff) == SLJIT_ORDERED) && \ + ((((type) & 0xfe) == SLJIT_ORDERED) && \ ((last_flags) & 0xff) >= SLJIT_UNORDERED && ((last_flags) & 0xff) <= SLJIT_ORDERED_LESS_EQUAL) #else #define CHECK_UNORDERED(type, last_flags) 0 @@ -1945,10 +2228,9 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compile #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_32))); - CHECK_ARGUMENT((type & 0xff) >= SLJIT_F_EQUAL && (type & 0xff) <= SLJIT_ORDERED_LESS_EQUAL - && ((type & 0xff) <= SLJIT_ORDERED || sljit_cmp_info(type & 0xff))); - FUNCTION_FCHECK(src1, src1w); - FUNCTION_FCHECK(src2, src2w); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_F_EQUAL && (type & 0xff) <= SLJIT_ORDERED_LESS_EQUAL); + FUNCTION_FCHECK(src1, src1w, type & SLJIT_32); + FUNCTION_FCHECK(src2, src2w, type & SLJIT_32); compiler->last_flags = 0; #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -2055,7 +2337,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_com if (SLJIT_UNLIKELY(!!compiler->verbose)) { fprintf(compiler->verbose, " flags.%s%s%s ", GET_OPCODE(op) < SLJIT_OP2_BASE ? "mov" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], - GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_32) ? "32" : ""), + GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_32) ? "32" : ""), !(op & SLJIT_SET_Z) ? "" : ".z"); sljit_verbose_param(compiler, dst, dstw); fprintf(compiler->verbose, ", %s\n", jump_names[type]); @@ -2064,9 +2346,10 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_com CHECK_RETURN_OK; } -static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) sljit_s32 cond = type & ~SLJIT_32; @@ -2075,25 +2358,68 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compile CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg)); - if (src != SLJIT_IMM) { - CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src)); - CHECK_ARGUMENT(srcw == 0); - } + FUNCTION_CHECK_SRC(src1, src1w); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg)); if (cond <= SLJIT_NOT_ZERO) CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); - else + else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) { + CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY); + compiler->last_flags = 0; + } else CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff) || CHECK_UNORDERED(cond, compiler->last_flags)); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { - fprintf(compiler->verbose, " cmov%s %s, ", + fprintf(compiler->verbose, " select%s %s, ", !(type & SLJIT_32) ? "" : "32", jump_names[type & ~SLJIT_32]); sljit_verbose_reg(compiler, dst_reg); fprintf(compiler->verbose, ", "); - sljit_verbose_param(compiler, src, srcw); + sljit_verbose_param(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_reg(compiler, src2_reg); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 cond = type & ~SLJIT_32; + + CHECK_ARGUMENT(cond >= SLJIT_EQUAL && cond <= SLJIT_ORDERED_LESS_EQUAL); + + CHECK_ARGUMENT(compiler->fscratches != -1 && compiler->fsaveds != -1); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, type & SLJIT_32)); + FUNCTION_FCHECK(src1, src1w, type & SLJIT_32); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, type & SLJIT_32)); + + if (cond <= SLJIT_NOT_ZERO) + CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); + else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) { + CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY); + compiler->last_flags = 0; + } else + CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff) + || CHECK_UNORDERED(cond, compiler->last_flags)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fselect%s %s, ", + !(type & SLJIT_32) ? "" : "32", + jump_names[type & ~SLJIT_32]); + sljit_verbose_freg(compiler, dst_freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_freg(compiler, src2_freg); fprintf(compiler->verbose, "\n"); } #endif @@ -2104,33 +2430,35 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler sljit_s32 reg, sljit_s32 mem, sljit_sw memw) { +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 allowed_flags; +#endif /* SLJIT_ARGUMENT_CHECKS */ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { compiler->skip_checks = 0; CHECK_RETURN_OK; } #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) - sljit_s32 allowed_flags; - if (type & SLJIT_MEM_UNALIGNED) { - CHECK_ARGUMENT(!(type & (SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32))); - } else if (type & SLJIT_MEM_UNALIGNED_16) { - CHECK_ARGUMENT(!(type & SLJIT_MEM_UNALIGNED_32)); + CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32))); + } else if (type & SLJIT_MEM_ALIGNED_16) { + CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32)); } else { - CHECK_ARGUMENT((reg & REG_PAIR_MASK) || (type & SLJIT_MEM_UNALIGNED_32)); + CHECK_ARGUMENT((reg & REG_PAIR_MASK) || (type & SLJIT_MEM_ALIGNED_32)); } allowed_flags = SLJIT_MEM_UNALIGNED; switch (type & 0xff) { + case SLJIT_MOV_P: + case SLJIT_MOV: + allowed_flags |= SLJIT_MEM_ALIGNED_32; + /* fallthrough */ case SLJIT_MOV_U32: case SLJIT_MOV_S32: case SLJIT_MOV32: - allowed_flags = SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16; - break; - case SLJIT_MOV: - case SLJIT_MOV_P: - allowed_flags = SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32; + allowed_flags |= SLJIT_MEM_ALIGNED_16; break; } @@ -2157,15 +2485,14 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler else fprintf(compiler->verbose, " %s%s%s", (type & SLJIT_MEM_STORE) ? "store" : "load", - !(type & SLJIT_32) ? "" : "32", - op1_names[(type & 0xff) - SLJIT_OP1_BASE]); + !(type & SLJIT_32) ? "" : "32", op1_types[(type & 0xff) - SLJIT_OP1_BASE]); if (type & SLJIT_MEM_UNALIGNED) - printf(".un"); - else if (type & SLJIT_MEM_UNALIGNED_16) - printf(".un16"); - else if (type & SLJIT_MEM_UNALIGNED_32) - printf(".un32"); + printf(".unal"); + else if (type & SLJIT_MEM_ALIGNED_16) + printf(".al16"); + else if (type & SLJIT_MEM_ALIGNED_32) + printf(".al32"); if (reg & REG_PAIR_MASK) { fprintf(compiler->verbose, " {"); @@ -2218,7 +2545,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem_update(struct sljit_c fprintf(compiler->verbose, " %s%s%s.%s ", (type & SLJIT_MEM_STORE) ? "store" : "load", !(type & SLJIT_32) ? "" : "32", - op1_names[(type & 0xff) - SLJIT_OP1_BASE], + op1_types[(type & 0xff) - SLJIT_OP1_BASE], (type & SLJIT_MEM_POST) ? "post" : "pre"); sljit_verbose_reg(compiler, reg); @@ -2235,19 +2562,20 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compile sljit_s32 mem, sljit_sw memw) { #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64); if (type & SLJIT_MEM_UNALIGNED) { - CHECK_ARGUMENT(!(type & (SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32))); - } else if (type & SLJIT_MEM_UNALIGNED_16) { - CHECK_ARGUMENT(!(type & SLJIT_MEM_UNALIGNED_32)); + CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32))); + } else if (type & SLJIT_MEM_ALIGNED_16) { + CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32)); } else { - CHECK_ARGUMENT(type & SLJIT_MEM_UNALIGNED_32); + CHECK_ARGUMENT(type & SLJIT_MEM_ALIGNED_32); CHECK_ARGUMENT(!(type & SLJIT_32)); } - CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32))); - CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg)); + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32))); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32)); FUNCTION_CHECK_SRC_MEM(mem, memw); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) @@ -2257,11 +2585,11 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compile !(type & SLJIT_32) ? "f64" : "f32"); if (type & SLJIT_MEM_UNALIGNED) - printf(".un"); - else if (type & SLJIT_MEM_UNALIGNED_16) - printf(".un16"); - else if (type & SLJIT_MEM_UNALIGNED_32) - printf(".un32"); + printf(".unal"); + else if (type & SLJIT_MEM_ALIGNED_16) + printf(".al16"); + else if (type & SLJIT_MEM_ALIGNED_32) + printf(".al32"); fprintf(compiler->verbose, " "); sljit_verbose_freg(compiler, freg); @@ -2278,10 +2606,11 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem_update(struct sljit_ sljit_s32 mem, sljit_sw memw) { #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64); CHECK_ARGUMENT((type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_POST)) == 0); FUNCTION_CHECK_SRC_MEM(mem, memw); - CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32)); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { @@ -2306,6 +2635,297 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem_update(struct sljit_ CHECK_RETURN_OK; } +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_STORE)) == 0); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) <= (srcdst & SLJIT_MEM) ? SLJIT_SIMD_GET_REG_SIZE(type) : 0); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + FUNCTION_FCHECK(srcdst, srcdstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_mov(compiler, type | SLJIT_SIMD_TEST, freg, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_mem: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_%s.%d.%s%d", + (type & SLJIT_SIMD_STORE) ? "store" : "load", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + if ((type & 0x3f000000) == SLJIT_SIMD_MEM_UNALIGNED) + fprintf(compiler->verbose, ".unal "); + else + fprintf(compiler->verbose, ".al%d ", (8 << SLJIT_SIMD_GET_ELEM2_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, srcdst, srcdstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + + if (type & SLJIT_SIMD_FLOAT) { + if (src == SLJIT_IMM) { + CHECK_ARGUMENT(srcw == 0); + } else { + FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2); + } + } else if (src != SLJIT_IMM) { + FUNCTION_CHECK_DST(src, srcw); + } +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_dup: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_replicate.%d.%s%d ", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + if (type & SLJIT_SIMD_FLOAT) + sljit_verbose_fparam(compiler, src, srcw); + else + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO | SLJIT_SIMD_LANE_SIGNED | SLJIT_32)) == 0); + CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO)) != (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO)); + CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_SIGNED)) != SLJIT_SIMD_LANE_SIGNED); + CHECK_ARGUMENT(!(type & SLJIT_SIMD_FLOAT) || !(type & (SLJIT_SIMD_LANE_SIGNED | SLJIT_32))); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(!(type & SLJIT_32) || SLJIT_SIMD_GET_ELEM_SIZE(type) <= 2); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + CHECK_ARGUMENT(lane_index >= 0 && lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type)))); + + if (type & SLJIT_SIMD_FLOAT) { + FUNCTION_FCHECK(srcdst, srcdstw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2); + } else if ((type & SLJIT_SIMD_STORE) || srcdst != SLJIT_IMM) { + FUNCTION_CHECK_DST(srcdst, srcdstw); + } +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_TEST, freg, lane_index, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_move_lane: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_%s_lane%s%s%s.%d.%s%d ", + (type & SLJIT_SIMD_STORE) ? "store" : "load", + (type & SLJIT_32) ? "32" : "", + (type & SLJIT_SIMD_LANE_ZERO) ? "_z" : "", + (type & SLJIT_SIMD_LANE_SIGNED) ? "_s" : "", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, "[%d], ", lane_index); + if (type & SLJIT_SIMD_FLOAT) + sljit_verbose_fparam(compiler, srcdst, srcdstw); + else + sljit_verbose_param(compiler, srcdst, srcdstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src, 0)); + CHECK_ARGUMENT(src_lane_index >= 0 && src_lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type)))); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_lane_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, src_lane_index) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_lane_replicate: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_lane_replicate.%d.%s%d ", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_freg(compiler, src); + fprintf(compiler->verbose, "[%d]\n", src_lane_index); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_EXTEND_SIGNED)) == 0); + CHECK_ARGUMENT((type & (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT)) != (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT)); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_ELEM2_SIZE(type)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_extend: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_load_extend%s.%d.%s%d.%s%d ", + (type & SLJIT_SIMD_EXTEND_SIGNED) ? "_s" : "", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM2_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_32)) == SLJIT_SIMD_STORE); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0)); + FUNCTION_CHECK_DST(dst, dstw); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_sign(compiler, type | SLJIT_SIMD_TEST, freg, dst, dstw) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_sign: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_store_sign%s.%d.%s%d ", + (type & SLJIT_32) ? "32" : "", + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD)); + CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) >= SLJIT_SIMD_OP2_AND && (type & SLJIT_SIMD_TYPE_MASK(0)) <= SLJIT_SIMD_OP2_XOR); + CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type)); + CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, 0)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src1_freg, 0)); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, 0)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (type & SLJIT_SIMD_TEST) + CHECK_RETURN_OK; + if (sljit_emit_simd_op2(compiler, type | SLJIT_SIMD_TEST, dst_freg, src1_freg, src2_freg) == SLJIT_ERR_UNSUPPORTED) { + fprintf(compiler->verbose, " # simd_op2: unsupported form, no instructions are emitted\n"); + CHECK_RETURN_OK; + } + + fprintf(compiler->verbose, " simd_%s.%d.%s%d ", + simd_op2_names[SLJIT_SIMD_GET_OPCODE(type) - 1], + (8 << SLJIT_SIMD_GET_REG_SIZE(type)), + (type & SLJIT_SIMD_FLOAT) ? "f" : "", + (8 << SLJIT_SIMD_GET_ELEM_SIZE(type))); + + sljit_verbose_freg(compiler, dst_freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_freg(compiler, src1_freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_freg(compiler, src2_freg); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) { /* Any offset is allowed. */ @@ -2341,14 +2961,14 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compil CHECK_RETURN_OK; } -static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) FUNCTION_CHECK_DST(dst, dstw); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) { - fprintf(compiler->verbose, " put_label "); + fprintf(compiler->verbose, " mov_addr "); sljit_verbose_param(compiler, dst, dstw); fprintf(compiler->verbose, "\n"); } @@ -2363,7 +2983,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_co #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */ #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \ - SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1), \ + SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1) && !(SLJIT_CONV_F64_FROM_UW & 0x1), \ invalid_float_opcodes); \ if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \ if (GET_OPCODE(op) == SLJIT_CMP_F64) { \ @@ -2378,48 +2998,22 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_co ADJUST_LOCAL_OFFSET(src, srcw); \ return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \ } \ - CHECK(check_sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw)); \ + if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_F64_FROM_S32) { \ + CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \ + ADJUST_LOCAL_OFFSET(dst, dstw); \ + ADJUST_LOCAL_OFFSET(src, srcw); \ + return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \ + } \ + CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \ ADJUST_LOCAL_OFFSET(dst, dstw); \ ADJUST_LOCAL_OFFSET(src, srcw); \ - return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \ + return sljit_emit_fop1_conv_f64_from_uw(compiler, op, dst, dstw, src, srcw); \ } \ CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \ ADJUST_LOCAL_OFFSET(dst, dstw); \ ADJUST_LOCAL_OFFSET(src, srcw); -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ - || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ - || ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)) \ - || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ - || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) - -static SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) -{ - struct sljit_label *label; - struct sljit_jump *jump; - sljit_s32 op = (type & SLJIT_32) ? SLJIT_MOV32 : SLJIT_MOV; - - SLJIT_SKIP_CHECKS(compiler); - jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1); - FAIL_IF(!jump); - - SLJIT_SKIP_CHECKS(compiler); - FAIL_IF(sljit_emit_op1(compiler, op, dst_reg, 0, src, srcw)); - - SLJIT_SKIP_CHECKS(compiler); - label = sljit_emit_label(compiler); - FAIL_IF(!label); - - sljit_set_label(jump, label); - return SLJIT_SUCCESS; -} - -#endif - -#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \ - && !(defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, @@ -2432,7 +3026,7 @@ static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit return sljit_emit_op1(compiler, type & (0xff | SLJIT_32), reg, 0, mem, memw); } -#endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) && !SLJIT_CONFIG_ARM_V5 */ +#endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) */ #if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \ && !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) @@ -2478,7 +3072,7 @@ static sljit_s32 sljit_emit_fmem_unaligned(struct sljit_compiler *compiler, slji #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) # include "sljitNativeX86_common.c" -#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) # include "sljitNativeARM_32.c" #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) # include "sljitNativeARM_32.c" @@ -2494,8 +3088,12 @@ static sljit_s32 sljit_emit_fmem_unaligned(struct sljit_compiler *compiler, slji # include "sljitNativeRISCV_common.c" #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) # include "sljitNativeS390X.c" +#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) +# include "sljitNativeLOONGARCH_64.c" #endif +#include "sljitSerialize.c" + static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) { #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) @@ -2540,8 +3138,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp return sljit_emit_return_void(compiler); } +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ + && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ + && !(defined(SLJIT_CONFIG_LOONGARCH_64) && SLJIT_CONFIG_LOONGARCH_64) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_fop2(compiler, op, dst_freg, 0, src1, src1w, src2, src2w); +} + +#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH_64 */ + #if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \ - && !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) + && !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ + && !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src1, sljit_sw src1w, @@ -2557,18 +3176,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler condition = type & 0xff; #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) { - if ((src1 & SLJIT_IMM) && !src1w) { + if (src1 == SLJIT_IMM && !src1w) { src1 = src2; src1w = src2w; src2 = SLJIT_IMM; src2w = 0; } - if ((src2 & SLJIT_IMM) && !src2w) + if (src2 == SLJIT_IMM && !src2w) return emit_cmp_to0(compiler, type, src1, src1w); } #endif - if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) { + if (SLJIT_UNLIKELY(src1 == SLJIT_IMM && src2 != SLJIT_IMM)) { /* Immediate is preferred as second argument by most architectures. */ switch (condition) { case SLJIT_LESS: @@ -2621,20 +3240,17 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler #endif /* !SLJIT_CONFIG_MIPS */ -#if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) +#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - if (type < SLJIT_UNORDERED || type > SLJIT_ORDERED_LESS_EQUAL) - return 0; - switch (type) { case SLJIT_UNORDERED_OR_EQUAL: case SLJIT_ORDERED_NOT_EQUAL: - return 0; + return 1; } - return 1; + return 0; } #endif /* SLJIT_CONFIG_ARM */ @@ -2706,6 +3322,158 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler #endif /* !SLJIT_CONFIG_ARM_64 && !SLJIT_CONFIG_PPC */ +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ + && !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \ + && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(srcdst); + SLJIT_UNUSED_ARG(srcdstw); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(lane_index); + SLJIT_UNUSED_ARG(srcdst); + SLJIT_UNUSED_ARG(srcdstw); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(src_lane_index); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(dst_freg); + SLJIT_UNUSED_ARG(src1_freg); + SLJIT_UNUSED_ARG(src2_freg); + + return SLJIT_ERR_UNSUPPORTED; +} + +#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM */ + +#if !(defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86) \ + && !(defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM) \ + && !(defined(SLJIT_CONFIG_S390X) && SLJIT_CONFIG_S390X) \ + && !(defined(SLJIT_CONFIG_LOONGARCH) && SLJIT_CONFIG_LOONGARCH) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, + sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst_reg); + SLJIT_UNUSED_ARG(mem_reg); + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, + sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(src_reg); + SLJIT_UNUSED_ARG(mem_reg); + SLJIT_UNUSED_ARG(temp_reg); + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + + return SLJIT_ERR_UNSUPPORTED; +} + +#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH */ + #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) @@ -2723,503 +3491,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *c return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0); } -#endif - -#else /* SLJIT_CONFIG_UNSUPPORTED */ - -/* Empty function bodies for those machines, which are not (yet) supported. */ - -SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) -{ - return "unsupported"; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data, void *exec_allocator_data) -{ - SLJIT_UNUSED_ARG(allocator_data); - SLJIT_UNUSED_ARG(exec_allocator_data); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(size); - SLJIT_UNREACHABLE(); - return NULL; -} - -#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) -SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(verbose); - SLJIT_UNREACHABLE(); -} -#endif - -SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) -{ - SLJIT_UNUSED_ARG(feature_type); - SLJIT_UNREACHABLE(); - return 0; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) -{ - SLJIT_UNUSED_ARG(type); - SLJIT_UNREACHABLE(); - return 0; -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data) -{ - SLJIT_UNUSED_ARG(code); - SLJIT_UNUSED_ARG(exec_allocator_data); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, - sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, - sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(options); - SLJIT_UNUSED_ARG(arg_types); - SLJIT_UNUSED_ARG(scratches); - SLJIT_UNUSED_ARG(saveds); - SLJIT_UNUSED_ARG(fscratches); - SLJIT_UNUSED_ARG(fsaveds); - SLJIT_UNUSED_ARG(local_size); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, - sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, - sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(options); - SLJIT_UNUSED_ARG(arg_types); - SLJIT_UNUSED_ARG(scratches); - SLJIT_UNUSED_ARG(saveds); - SLJIT_UNUSED_ARG(fscratches); - SLJIT_UNUSED_ARG(fsaveds); - SLJIT_UNUSED_ARG(local_size); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 src1, sljit_sw src1w, - sljit_s32 src2, sljit_sw src2w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(src1); - SLJIT_UNUSED_ARG(src1w); - SLJIT_UNUSED_ARG(src2); - SLJIT_UNUSED_ARG(src2w); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 src1, sljit_sw src1w, - sljit_s32 src2, sljit_sw src2w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(src1); - SLJIT_UNUSED_ARG(src1w); - SLJIT_UNUSED_ARG(src2); - SLJIT_UNUSED_ARG(src2w); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst_reg, - sljit_s32 src1_reg, - sljit_s32 src2_reg, - sljit_s32 src3, sljit_sw src3w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst_reg); - SLJIT_UNUSED_ARG(src1_reg); - SLJIT_UNUSED_ARG(src2_reg); - SLJIT_UNUSED_ARG(src3); - SLJIT_UNUSED_ARG(src3w); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) -{ - SLJIT_UNREACHABLE(); - return reg; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, - void *instruction, sljit_u32 size) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(instruction); - SLJIT_UNUSED_ARG(size); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(current_flags); -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 src1, sljit_sw src1w, - sljit_s32 src2, sljit_sw src2w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(src1); - SLJIT_UNUSED_ARG(src1w); - SLJIT_UNUSED_ARG(src2); - SLJIT_UNUSED_ARG(src2w); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 freg, sljit_s32 reg) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(freg); - SLJIT_UNUSED_ARG(reg); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 arg_types) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(arg_types); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 src1, sljit_sw src1w, - sljit_s32 src2, sljit_sw src2w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(src1); - SLJIT_UNUSED_ARG(src1w); - SLJIT_UNUSED_ARG(src2); - SLJIT_UNUSED_ARG(src2w); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 src1, sljit_sw src1w, - sljit_s32 src2, sljit_sw src2w) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(src1); - SLJIT_UNUSED_ARG(src1w); - SLJIT_UNUSED_ARG(src2); - SLJIT_UNUSED_ARG(src2w); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label) -{ - SLJIT_UNUSED_ARG(jump); - SLJIT_UNUSED_ARG(label); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target) -{ - SLJIT_UNUSED_ARG(jump); - SLJIT_UNUSED_ARG(target); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label) -{ - SLJIT_UNUSED_ARG(put_label); - SLJIT_UNUSED_ARG(label); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 arg_types, - sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(arg_types); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 type) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(op); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(type); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(dst_reg); - SLJIT_UNUSED_ARG(src); - SLJIT_UNUSED_ARG(srcw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(reg); - SLJIT_UNUSED_ARG(mem); - SLJIT_UNUSED_ARG(memw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(reg); - SLJIT_UNUSED_ARG(mem); - SLJIT_UNUSED_ARG(memw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(freg); - SLJIT_UNUSED_ARG(mem); - SLJIT_UNUSED_ARG(memw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(type); - SLJIT_UNUSED_ARG(freg); - SLJIT_UNUSED_ARG(mem); - SLJIT_UNUSED_ARG(memw); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(offset); - SLJIT_UNREACHABLE(); - return SLJIT_ERR_UNSUPPORTED; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw initval) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - SLJIT_UNUSED_ARG(initval); - SLJIT_UNREACHABLE(); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) -{ - SLJIT_UNUSED_ARG(compiler); - SLJIT_UNUSED_ARG(dst); - SLJIT_UNUSED_ARG(dstw); - return NULL; -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) -{ - SLJIT_UNUSED_ARG(addr); - SLJIT_UNUSED_ARG(new_target); - SLJIT_UNUSED_ARG(executable_offset); - SLJIT_UNREACHABLE(); -} - -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) -{ - SLJIT_UNUSED_ARG(addr); - SLJIT_UNUSED_ARG(new_constant); - SLJIT_UNUSED_ARG(executable_offset); - SLJIT_UNREACHABLE(); -} +#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM_64 */ #endif /* !SLJIT_CONFIG_UNSUPPORTED */ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.h b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.h old mode 100644 new mode 100755 index 87805dd7fd..0974056d6c --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.h +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitLir.h @@ -72,6 +72,7 @@ #include "sljitConfigPre.h" #endif /* SLJIT_HAVE_CONFIG_PRE */ +#include "sljitConfigCPU.h" #include "sljitConfig.h" /* The following header file defines useful macros for fine tuning @@ -107,9 +108,9 @@ extern "C" { /* Cannot allocate executable memory. Only sljit_generate_code() returns with this error code. */ #define SLJIT_ERR_EX_ALLOC_FAILED 3 -/* Return value for SLJIT_CONFIG_UNSUPPORTED placeholder architecture. */ +/* Unsupported instruction form. */ #define SLJIT_ERR_UNSUPPORTED 4 -/* An ivalid argument is passed to any SLJIT function. */ +/* An invalid argument is passed to any SLJIT function. */ #define SLJIT_ERR_BAD_ARGUMENT 5 /* --------------------------------------------------------------------- */ @@ -127,40 +128,40 @@ extern "C" { is the first saved register, the one before the last is the second saved register, and so on. - If an architecture provides two scratch and three saved registers, - its scratch and saved register sets are the following: + For example, in an architecture with only five registers (A-E), if two + are scratch and three saved registers, they will be defined as follows: - R0 | | R0 is always a scratch register - R1 | | R1 is always a scratch register - [R2] | S2 | R2 and S2 represent the same physical register - [R3] | S1 | R3 and S1 represent the same physical register - [R4] | S0 | R4 and S0 represent the same physical register + A | R0 | | R0 always represent scratch register A + B | R1 | | R1 always represent scratch register B + C | [R2] | S2 | R2 and S2 represent the same physical register C + D | [R3] | S1 | R3 and S1 represent the same physical register D + E | [R4] | S0 | R4 and S0 represent the same physical register E - Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS would be 2 and - SLJIT_NUMBER_OF_SAVED_REGISTERS would be 3 for this architecture. + Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS will be 2 and + SLJIT_NUMBER_OF_SAVED_REGISTERS will be 3. - Note: On all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12 + Note: For all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12 and SLJIT_NUMBER_OF_SAVED_REGISTERS >= 6. However, 6 registers are virtual on x86-32. See below. The purpose of this definition is convenience: saved registers can - be used as extra scratch registers. For example four registers can - be specified as scratch registers and the fifth one as saved register - on the CPU above and any user code which requires four scratch - registers can run unmodified. The SLJIT compiler automatically saves - the content of the two extra scratch register on the stack. Scratch - registers can also be preserved by saving their value on the stack - but this needs to be done manually. + be used as extra scratch registers. For example, building in the + previous example, four registers can be specified as scratch registers + and the fifth one as saved register, allowing any user code which requires + four scratch registers to run unmodified. The SLJIT compiler automatically + saves the content of the two extra scratch register on the stack. Scratch + registers can also be preserved by saving their value on the stack but + that needs to be done manually. Note: To emphasize that registers assigned to R2-R4 are saved registers, they are enclosed by square brackets. - Note: sljit_emit_enter and sljit_set_context defines whether a register - is S or R register. E.g: when 3 scratches and 1 saved is mapped - by sljit_emit_enter, the allowed register set will be: R0-R2 and - S0. Although S2 is mapped to the same position as R2, it does not - available in the current configuration. Furthermore the S1 register - is not available at all. + Note: sljit_emit_enter and sljit_set_context define whether a register + is S or R register. E.g: if in the previous example 3 scratches and + 1 saved are mapped by sljit_emit_enter, the allowed register set + will be: R0-R2 and S0. Although S2 is mapped to the same register + than R2, it is not available in that configuration. Furthermore + the S1 register cannot be used at all. */ /* Scratch registers. */ @@ -209,7 +210,7 @@ extern "C" { /* The SLJIT_SP provides direct access to the linear stack space allocated by sljit_emit_enter. It can only be used in the following form: SLJIT_MEM1(SLJIT_SP). The immediate offset is extended by the relative stack offset automatically. - The sljit_get_local_base can be used to obtain the real address of a value. */ + sljit_get_local_base can be used to obtain the real address of a value. */ #define SLJIT_SP (SLJIT_NUMBER_OF_REGISTERS + 1) /* Return with machine word. */ @@ -221,7 +222,7 @@ extern "C" { /* --------------------------------------------------------------------- */ /* Each floating point register can store a 32 or a 64 bit precision - value. The FR and FS register sets are overlap in the same way as R + value. The FR and FS register sets overlap in the same way as R and S register sets. See above. */ /* Floating point scratch registers. */ @@ -231,6 +232,10 @@ extern "C" { #define SLJIT_FR3 4 #define SLJIT_FR4 5 #define SLJIT_FR5 6 +#define SLJIT_FR6 7 +#define SLJIT_FR7 8 +#define SLJIT_FR8 9 +#define SLJIT_FR9 10 /* All FR registers provided by the architecture can be accessed by SLJIT_FR(i) The i parameter must be >= 0 and < SLJIT_NUMBER_OF_FLOAT_REGISTERS. */ #define SLJIT_FR(i) (1 + (i)) @@ -242,6 +247,10 @@ extern "C" { #define SLJIT_FS3 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 3) #define SLJIT_FS4 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 4) #define SLJIT_FS5 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 5) +#define SLJIT_FS6 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 6) +#define SLJIT_FS7 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 7) +#define SLJIT_FS8 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 8) +#define SLJIT_FS9 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 9) /* All S registers provided by the architecture can be accessed by SLJIT_FS(i) The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS. */ #define SLJIT_FS(i) (SLJIT_NUMBER_OF_FLOAT_REGISTERS - (i)) @@ -260,23 +269,39 @@ extern "C" { /* The following argument type definitions are used by sljit_emit_enter, sljit_set_context, sljit_emit_call, and sljit_emit_icall functions. - As for sljit_emit_call and sljit_emit_icall, the first integer argument + For sljit_emit_call and sljit_emit_icall, the first integer argument must be placed into SLJIT_R0, the second one into SLJIT_R1, and so on. Similarly the first floating point argument must be placed into SLJIT_FR0, the second one into SLJIT_FR1, and so on. - As for sljit_emit_enter, the integer arguments can be stored in scratch - or saved registers. The first integer argument without _R postfix is - stored in SLJIT_S0, the next one in SLJIT_S1, and so on. The integer - arguments with _R postfix are placed into scratch registers. The index - of the scratch register is the count of the previous integer arguments - starting from SLJIT_R0. The floating point arguments are always placed - into SLJIT_FR0, SLJIT_FR1, and so on. + For sljit_emit_enter, the integer arguments can be stored in scratch + or saved registers. Scratch registers are identified by a _R suffix. - Note: if a function is called by sljit_emit_call/sljit_emit_icall and - an argument is stored in a scratch register by sljit_emit_enter, - that argument uses the same scratch register index for both - integer and floating point arguments. + If only saved registers are used, then the allocation mirrors what is + done for the "call" functions but using saved registers, meaning that + the first integer argument goes to SLJIT_S0, the second one goes into + SLJIT_S1, and so on. + + If scratch registers are used, then the way the integer registers are + allocated changes so that SLJIT_S0, SLJIT_S1, etc; will be assigned + only for the arguments not using scratch registers, while SLJIT_R + will be used for the ones using scratch registers. + + Furthermore, the index (shown as "n" above) that will be used for the + scratch register depends on how many previous integer registers + (scratch or saved) were used already, starting with SLJIT_R0. + Eventhough some indexes will be likely skipped, they still need to be + accounted for in the scratches parameter of sljit_emit_enter. See below + for some examples. + + The floating point arguments always use scratch registers (but not the + _R suffix like the integer arguments) and must use SLJIT_FR0, SLJIT_FR1, + just like in the "call" functions. + + Note: the mapping for scratch registers is part of the compiler context + and therefore a new context after sljit_emit_call/sljit_emit_icall + could remove access to some scratch registers that were used as + arguments. Example function definition: sljit_f32 SLJIT_FUNC example_c_callback(void *arg_a, @@ -292,25 +317,29 @@ extern "C" { Argument passing: arg_a must be placed in SLJIT_R0 - arg_c must be placed in SLJIT_R1 arg_b must be placed in SLJIT_FR0 + arg_c must be placed in SLJIT_R1 arg_d must be placed in SLJIT_FR1 Examples for argument processing by sljit_emit_enter: - SLJIT_ARGS4(VOID, P, 32_R, F32, W) + SLJIT_ARGS4V(P, 32_R, F32, W) Arguments are placed into: SLJIT_S0, SLJIT_R1, SLJIT_FR0, SLJIT_S1 + The type of the result is void. - SLJIT_ARGS4(VOID, W, W_R, W, W_R) + SLJIT_ARGS4(F32, W, W_R, W, W_R) Arguments are placed into: SLJIT_S0, SLJIT_R1, SLJIT_S1, SLJIT_R3 + The type of the result is sljit_f32. - SLJIT_ARGS4(VOID, F64, W, F32, W_R) + SLJIT_ARGS4(P, W, F32, P_R) Arguments are placed into: SLJIT_FR0, SLJIT_S0, SLJIT_FR1, SLJIT_R1 + The type of the result is pointer. Note: it is recommended to pass the scratch arguments first followed by the saved arguments: - SLJIT_ARGS4(VOID, W_R, W_R, W, W) + SLJIT_ARGS4(W, W_R, W_R, W, W) Arguments are placed into: SLJIT_R0, SLJIT_R1, SLJIT_S0, SLJIT_S1 + The type of the result is sljit_sw / sljit_uw. */ /* The following flag is only allowed for the integer arguments of @@ -318,21 +347,21 @@ extern "C" { stored in a scratch register instead of a saved register. */ #define SLJIT_ARG_TYPE_SCRATCH_REG 0x8 -/* Void result, can only be used by SLJIT_ARG_RETURN. */ -#define SLJIT_ARG_TYPE_VOID 0 +/* No return value, only supported by SLJIT_ARG_RETURN. */ +#define SLJIT_ARG_TYPE_RET_VOID 0 /* Machine word sized integer argument or result. */ -#define SLJIT_ARG_TYPE_W 1 +#define SLJIT_ARG_TYPE_W 1 #define SLJIT_ARG_TYPE_W_R (SLJIT_ARG_TYPE_W | SLJIT_ARG_TYPE_SCRATCH_REG) /* 32 bit integer argument or result. */ -#define SLJIT_ARG_TYPE_32 2 +#define SLJIT_ARG_TYPE_32 2 #define SLJIT_ARG_TYPE_32_R (SLJIT_ARG_TYPE_32 | SLJIT_ARG_TYPE_SCRATCH_REG) /* Pointer sized integer argument or result. */ -#define SLJIT_ARG_TYPE_P 3 +#define SLJIT_ARG_TYPE_P 3 #define SLJIT_ARG_TYPE_P_R (SLJIT_ARG_TYPE_P | SLJIT_ARG_TYPE_SCRATCH_REG) /* 64 bit floating point argument or result. */ -#define SLJIT_ARG_TYPE_F64 4 +#define SLJIT_ARG_TYPE_F64 4 /* 32 bit floating point argument or result. */ -#define SLJIT_ARG_TYPE_F32 5 +#define SLJIT_ARG_TYPE_F32 5 #define SLJIT_ARG_SHIFT 4 #define SLJIT_ARG_RETURN(type) (type) @@ -345,24 +374,40 @@ extern "C" { can be shortened to: SLJIT_ARGS1(W, F32) + + Another example where no value is returned: + SLJIT_ARG_RETURN(SLJIT_ARG_TYPE_RET_VOID) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W_R, 1) + + can be shortened to: + SLJIT_ARGS1V(W_R) */ #define SLJIT_ARG_TO_TYPE(type) SLJIT_ARG_TYPE_ ## type #define SLJIT_ARGS0(ret) \ SLJIT_ARG_RETURN(SLJIT_ARG_TO_TYPE(ret)) +#define SLJIT_ARGS0V() \ + SLJIT_ARG_RETURN(SLJIT_ARG_TYPE_RET_VOID) #define SLJIT_ARGS1(ret, arg1) \ (SLJIT_ARGS0(ret) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg1), 1)) +#define SLJIT_ARGS1V(arg1) \ + (SLJIT_ARGS0V() | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg1), 1)) #define SLJIT_ARGS2(ret, arg1, arg2) \ (SLJIT_ARGS1(ret, arg1) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg2), 2)) +#define SLJIT_ARGS2V(arg1, arg2) \ + (SLJIT_ARGS1V(arg1) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg2), 2)) #define SLJIT_ARGS3(ret, arg1, arg2, arg3) \ (SLJIT_ARGS2(ret, arg1, arg2) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg3), 3)) +#define SLJIT_ARGS3V(arg1, arg2, arg3) \ + (SLJIT_ARGS2V(arg1, arg2) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg3), 3)) #define SLJIT_ARGS4(ret, arg1, arg2, arg3, arg4) \ (SLJIT_ARGS3(ret, arg1, arg2, arg3) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg4), 4)) +#define SLJIT_ARGS4V(arg1, arg2, arg3, arg4) \ + (SLJIT_ARGS3V(arg1, arg2, arg3) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg4), 4)) /* --------------------------------------------------------------------- */ /* Main structures and functions */ @@ -382,7 +427,10 @@ struct sljit_memory_fragment { struct sljit_label { struct sljit_label *next; - sljit_uw addr; + union { + sljit_uw index; + sljit_uw addr; + } u; /* The maximum size difference. */ sljit_uw size; }; @@ -398,13 +446,6 @@ struct sljit_jump { } u; }; -struct sljit_put_label { - struct sljit_put_label *next; - struct sljit_label *label; - sljit_uw addr; - sljit_uw flags; -}; - struct sljit_const { struct sljit_const *next; sljit_uw addr; @@ -416,18 +457,18 @@ struct sljit_compiler { struct sljit_label *labels; struct sljit_jump *jumps; - struct sljit_put_label *put_labels; struct sljit_const *consts; struct sljit_label *last_label; struct sljit_jump *last_jump; struct sljit_const *last_const; - struct sljit_put_label *last_put_label; void *allocator_data; void *exec_allocator_data; struct sljit_memory_fragment *buf; struct sljit_memory_fragment *abuf; + /* Number of labels created by the compiler. */ + sljit_uw label_count; /* Available scratch registers. */ sljit_s32 scratches; /* Available saved registers. */ @@ -447,17 +488,18 @@ struct sljit_compiler { #if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) sljit_s32 status_flags_state; -#endif +#endif /* SLJIT_HAS_STATUS_FLAGS_STATE */ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) sljit_s32 args_size; -#endif +#endif /* SLJIT_CONFIG_X86_32 */ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + /* Temporary fields. */ sljit_s32 mode32; -#endif +#endif /* SLJIT_CONFIG_X86_64 */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) /* Constant pool handling. */ sljit_uw *cpool; sljit_u8 *cpool_unique; @@ -466,44 +508,54 @@ struct sljit_compiler { /* Other members. */ /* Contains pointer, "ldr pc, [...]" pairs. */ sljit_uw patches; -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) /* Temporary fields. */ sljit_uw shift_imm; -#endif /* SLJIT_CONFIG_ARM_V5 || SLJIT_CONFIG_ARM_V7 */ +#endif /* SLJIT_CONFIG_ARM_V6 || SLJIT_CONFIG_ARM_V6 */ #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && (defined __SOFTFP__) sljit_uw args_size; -#endif +#endif /* SLJIT_CONFIG_ARM_32 && __SOFTFP__ */ #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + /* Temporary fields. */ sljit_u32 imm; -#endif +#endif /* SLJIT_CONFIG_PPC */ #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) sljit_s32 delay_slot; + /* Temporary fields. */ sljit_s32 cache_arg; sljit_sw cache_argw; -#endif +#endif /* SLJIT_CONFIG_MIPS */ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) sljit_uw args_size; -#endif +#endif /* SLJIT_CONFIG_MIPS_32 */ #if (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) + /* Temporary fields. */ sljit_s32 cache_arg; sljit_sw cache_argw; -#endif +#endif /* SLJIT_CONFIG_RISCV */ #if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) /* Need to allocate register save area to make calls. */ + /* Temporary fields. */ sljit_s32 mode; -#endif +#endif /* SLJIT_CONFIG_S390X */ + +#if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) + /* Temporary fields. */ + sljit_s32 cache_arg; + sljit_sw cache_argw; +#endif /* SLJIT_CONFIG_LOONGARCH */ #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) FILE* verbose; -#endif +#endif /* SLJIT_VERBOSE */ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ || (defined SLJIT_DEBUG && SLJIT_DEBUG) @@ -514,7 +566,7 @@ struct sljit_compiler { sljit_s32 last_return; /* Local size passed to entry functions. */ sljit_s32 logical_local_size; -#endif +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ || (defined SLJIT_DEBUG && SLJIT_DEBUG) \ @@ -522,7 +574,7 @@ struct sljit_compiler { /* Trust arguments when an API function is called. Used internally for calling API functions. */ sljit_s32 skip_checks; -#endif +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG || SLJIT_VERBOSE */ }; /* --------------------------------------------------------------------- */ @@ -637,24 +689,37 @@ static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler #define SLJIT_HAS_COPY_F32 9 /* [Emulated] Copy from/to f64 operation is available (see sljit_emit_fcopy). */ #define SLJIT_HAS_COPY_F64 10 +/* [Not emulated] The 64 bit floating point registers can be used as + two separate 32 bit floating point registers (e.g. ARM32). The + second 32 bit part can be accessed by SLJIT_F64_SECOND. */ +#define SLJIT_HAS_F64_AS_F32_PAIR 11 +/* [Not emulated] Some SIMD operations are supported by the compiler. */ +#define SLJIT_HAS_SIMD 12 +/* [Not emulated] SIMD registers are mapped to a pair of double precision + floating point registers. E.g. passing either SLJIT_FR0 or SLJIT_FR1 to + a simd operation represents the same 128 bit register, and both SLJIT_FR0 + and SLJIT_FR1 are overwritten. */ +#define SLJIT_SIMD_REGS_ARE_PAIRS 13 +/* [Not emulated] Atomic support is available (fine-grained). */ +#define SLJIT_HAS_ATOMIC 14 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) -/* [Not emulated] SSE2 support is available on x86. */ -#define SLJIT_HAS_SSE2 100 +/* [Not emulated] AVX support is available on x86. */ +#define SLJIT_HAS_AVX 100 +/* [Not emulated] AVX2 support is available on x86. */ +#define SLJIT_HAS_AVX2 101 #endif SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type); /* If type is between SLJIT_ORDERED_EQUAL and SLJIT_ORDERED_LESS_EQUAL, - sljit_cmp_info returns one, if the cpu supports the passed floating - point comparison type. + sljit_cmp_info returns with: + zero - if the cpu supports the floating point comparison type + one - if the comparison requires two machine instructions + two - if the comparison requires more than two machine instructions - If type is SLJIT_UNORDERED or SLJIT_ORDERED, sljit_cmp_info returns - one, if the cpu supports checking the unordered comparison result - regardless of the comparison type passed to the comparison instruction. - The returned value is always one, if there is at least one type between - SLJIT_ORDERED_EQUAL and SLJIT_ORDERED_LESS_EQUAL where sljit_cmp_info - returns with a zero value. + When the result is non-zero, it is recommended to avoid + using the specified comparison type if it is easy to do so. Otherwise it returns zero. */ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type); @@ -665,7 +730,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type); /* The executable code is a function from the viewpoint of the C - language. The function calls must obey to the ABI (Application + language. The function calls must conform to the ABI (Application Binary Interface) of the platform, which specify the purpose of machine registers and stack handling among other things. The sljit_emit_enter function emits the necessary instructions for @@ -724,7 +789,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type); #define SLJIT_ENTER_REG_ARG 0x00000004 /* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */ -#define SLJIT_MAX_LOCAL_SIZE 65536 +#define SLJIT_MAX_LOCAL_SIZE 1048576 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, @@ -735,9 +800,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi by sljit_emit_enter. Several functions (such as sljit_emit_return) requires this context to be able to generate the appropriate code. However, some code fragments (compiled separately) may have no - normal entry point so their context is unknown for the compiler. + normal entry point so their context is unknown to the compiler. - The sljit_set_context and sljit_emit_enter have the same arguments, + sljit_set_context and sljit_emit_enter have the same arguments, but sljit_set_context does not generate any machine code. Note: every call of sljit_emit_enter and sljit_set_context overwrites @@ -797,7 +862,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *c Note: Different architectures have different addressing limitations. A single instruction is enough for the following addressing - modes. Other adrressing modes are emulated by instruction + modes. Other addressing modes are emulated by instruction sequences. This information could help to improve those code generators which focuses only a few architectures. @@ -828,6 +893,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *c s390x: [reg+imm], -2^19 <= imm < 2^19 [reg+reg] is supported Write-back is not supported + loongarch: [reg+imm], -2048 <= imm <= 2047 + [reg+reg] is supported + Write-back is not supported */ /* Macros for specifying operand types. */ @@ -835,9 +903,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *c #define SLJIT_MEM0() (SLJIT_MEM) #define SLJIT_MEM1(r1) (SLJIT_MEM | (r1)) #define SLJIT_MEM2(r1, r2) (SLJIT_MEM | (r1) | ((r2) << 8)) -#define SLJIT_IMM 0x40 +#define SLJIT_IMM 0x7f #define SLJIT_REG_PAIR(r1, r2) ((r1) | ((r2) << 8)) +/* Macros for checking operand types (only for valid arguments). */ +#define SLJIT_IS_REG(arg) ((arg) > 0 && (arg) < SLJIT_IMM) +#define SLJIT_IS_MEM(arg) ((arg) & SLJIT_MEM) +#define SLJIT_IS_MEM0(arg) ((arg) == SLJIT_MEM) +#define SLJIT_IS_MEM1(arg) ((arg) > SLJIT_MEM && (arg) < (SLJIT_MEM << 1)) +#define SLJIT_IS_MEM2(arg) (((arg) & SLJIT_MEM) && (arg) >= (SLJIT_MEM << 1)) +#define SLJIT_IS_IMM(arg) ((arg) == SLJIT_IMM) +#define SLJIT_IS_REG_PAIR(arg) (!((arg) & SLJIT_MEM) && (arg) >= (SLJIT_MEM << 1)) + +/* Macros for extracting registers from operands. */ +/* Support operands which contains a single register or + constructed using SLJIT_MEM1, SLJIT_MEM2, or SLJIT_REG_PAIR. */ +#define SLJIT_EXTRACT_REG(arg) ((arg) & 0x7f) +/* Support operands which constructed using SLJIT_MEM2, or SLJIT_REG_PAIR. */ +#define SLJIT_EXTRACT_SECOND_REG(arg) ((arg) >> 8) + /* Sets 32 bit operation mode on 64 bit CPUs. This option is ignored on 32 bit CPUs. When this option is set for an arithmetic operation, only the lower 32 bits of the input registers are used, and the CPU status @@ -1054,6 +1138,28 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile Note: immediate source argument is not supported */ #define SLJIT_REV (SLJIT_OP1_BASE + 11) #define SLJIT_REV32 (SLJIT_REV | SLJIT_32) +/* Reverse the order of bytes in the lower 16 bit and extend as unsigned + Flags: - (may destroy flags) + Note: converts between little and big endian formats + Note: immediate source argument is not supported */ +#define SLJIT_REV_U16 (SLJIT_OP1_BASE + 12) +#define SLJIT_REV32_U16 (SLJIT_REV_U16 | SLJIT_32) +/* Reverse the order of bytes in the lower 16 bit and extend as signed + Flags: - (may destroy flags) + Note: converts between little and big endian formats + Note: immediate source argument is not supported */ +#define SLJIT_REV_S16 (SLJIT_OP1_BASE + 13) +#define SLJIT_REV32_S16 (SLJIT_REV_S16 | SLJIT_32) +/* Reverse the order of bytes in the lower 32 bit and extend as unsigned + Flags: - (may destroy flags) + Note: converts between little and big endian formats + Note: immediate source argument is not supported */ +#define SLJIT_REV_U32 (SLJIT_OP1_BASE + 14) +/* Reverse the order of bytes in the lower 32 bit and extend as signed + Flags: - (may destroy flags) + Note: converts between little and big endian formats + Note: immediate source argument is not supported */ +#define SLJIT_REV_S32 (SLJIT_OP1_BASE + 15) /* The following unary operations are supported by using sljit_emit_op2: - binary not: SLJIT_XOR with immedate -1 as src1 or src2 @@ -1276,15 +1382,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp /* Flags: - (may destroy flags) */ #define SLJIT_CONV_F64_FROM_S32 (SLJIT_FOP1_BASE + 5) #define SLJIT_CONV_F32_FROM_S32 (SLJIT_CONV_F64_FROM_S32 | SLJIT_32) +/* Flags: - (may destroy flags) */ +#define SLJIT_CONV_F64_FROM_UW (SLJIT_FOP1_BASE + 6) +#define SLJIT_CONV_F32_FROM_UW (SLJIT_CONV_F64_FROM_UW | SLJIT_32) +/* Flags: - (may destroy flags) */ +#define SLJIT_CONV_F64_FROM_U32 (SLJIT_FOP1_BASE + 7) +#define SLJIT_CONV_F32_FROM_U32 (SLJIT_CONV_F64_FROM_U32 | SLJIT_32) /* Note: dst is the left and src is the right operand for SLJIT_CMP_F32/64. Flags: EQUAL_F | LESS_F | GREATER_EQUAL_F | GREATER_F | LESS_EQUAL_F */ -#define SLJIT_CMP_F64 (SLJIT_FOP1_BASE + 6) +#define SLJIT_CMP_F64 (SLJIT_FOP1_BASE + 8) #define SLJIT_CMP_F32 (SLJIT_CMP_F64 | SLJIT_32) /* Flags: - (may destroy flags) */ -#define SLJIT_NEG_F64 (SLJIT_FOP1_BASE + 7) +#define SLJIT_NEG_F64 (SLJIT_FOP1_BASE + 9) #define SLJIT_NEG_F32 (SLJIT_NEG_F64 | SLJIT_32) /* Flags: - (may destroy flags) */ -#define SLJIT_ABS_F64 (SLJIT_FOP1_BASE + 8) +#define SLJIT_ABS_F64 (SLJIT_FOP1_BASE + 10) #define SLJIT_ABS_F32 (SLJIT_ABS_F64 | SLJIT_32) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -1312,6 +1424,26 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w); +/* Starting index of opcodes for sljit_emit_fop2r. */ +#define SLJIT_FOP2R_BASE 168 + +/* Flags: - (may destroy flags) */ +#define SLJIT_COPYSIGN_F64 (SLJIT_FOP2R_BASE + 0) +#define SLJIT_COPYSIGN_F32 (SLJIT_COPYSIGN_F64 | SLJIT_32) + +/* Similar to sljit_emit_fop2, except the destination is always a register. */ +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w); + +/* Sets a floating point register to an immediate value. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value); +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value); + /* The following opcodes are used by sljit_emit_fcopy(). */ /* 64 bit: copy a 64 bit value from an integer register into a @@ -1410,28 +1542,32 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi #define SLJIT_SET_CARRY SLJIT_SET(SLJIT_CARRY) #define SLJIT_NOT_CARRY 13 +#define SLJIT_ATOMIC_STORED 14 +#define SLJIT_SET_ATOMIC_STORED SLJIT_SET(SLJIT_ATOMIC_STORED) +#define SLJIT_ATOMIC_NOT_STORED 15 + /* Basic floating point comparison types. Note: when the comparison result is unordered, their behaviour is unspecified. */ -#define SLJIT_F_EQUAL 14 +#define SLJIT_F_EQUAL 16 #define SLJIT_SET_F_EQUAL SLJIT_SET(SLJIT_F_EQUAL) -#define SLJIT_F_NOT_EQUAL 15 +#define SLJIT_F_NOT_EQUAL 17 #define SLJIT_SET_F_NOT_EQUAL SLJIT_SET(SLJIT_F_EQUAL) -#define SLJIT_F_LESS 16 +#define SLJIT_F_LESS 18 #define SLJIT_SET_F_LESS SLJIT_SET(SLJIT_F_LESS) -#define SLJIT_F_GREATER_EQUAL 17 +#define SLJIT_F_GREATER_EQUAL 19 #define SLJIT_SET_F_GREATER_EQUAL SLJIT_SET(SLJIT_F_LESS) -#define SLJIT_F_GREATER 18 +#define SLJIT_F_GREATER 20 #define SLJIT_SET_F_GREATER SLJIT_SET(SLJIT_F_GREATER) -#define SLJIT_F_LESS_EQUAL 19 +#define SLJIT_F_LESS_EQUAL 21 #define SLJIT_SET_F_LESS_EQUAL SLJIT_SET(SLJIT_F_GREATER) /* Jumps when either argument contains a NaN value. */ -#define SLJIT_UNORDERED 20 +#define SLJIT_UNORDERED 22 #define SLJIT_SET_UNORDERED SLJIT_SET(SLJIT_UNORDERED) /* Jumps when neither argument contains a NaN value. */ -#define SLJIT_ORDERED 21 +#define SLJIT_ORDERED 23 #define SLJIT_SET_ORDERED SLJIT_SET(SLJIT_UNORDERED) /* Ordered / unordered floating point comparison types. @@ -1439,41 +1575,41 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi Note: each comparison type has an ordered and unordered form. Some architectures supports only either of them (see: sljit_cmp_info). */ -#define SLJIT_ORDERED_EQUAL 22 +#define SLJIT_ORDERED_EQUAL 24 #define SLJIT_SET_ORDERED_EQUAL SLJIT_SET(SLJIT_ORDERED_EQUAL) -#define SLJIT_UNORDERED_OR_NOT_EQUAL 23 +#define SLJIT_UNORDERED_OR_NOT_EQUAL 25 #define SLJIT_SET_UNORDERED_OR_NOT_EQUAL SLJIT_SET(SLJIT_ORDERED_EQUAL) -#define SLJIT_ORDERED_LESS 24 +#define SLJIT_ORDERED_LESS 26 #define SLJIT_SET_ORDERED_LESS SLJIT_SET(SLJIT_ORDERED_LESS) -#define SLJIT_UNORDERED_OR_GREATER_EQUAL 25 +#define SLJIT_UNORDERED_OR_GREATER_EQUAL 27 #define SLJIT_SET_UNORDERED_OR_GREATER_EQUAL SLJIT_SET(SLJIT_ORDERED_LESS) -#define SLJIT_ORDERED_GREATER 26 +#define SLJIT_ORDERED_GREATER 28 #define SLJIT_SET_ORDERED_GREATER SLJIT_SET(SLJIT_ORDERED_GREATER) -#define SLJIT_UNORDERED_OR_LESS_EQUAL 27 +#define SLJIT_UNORDERED_OR_LESS_EQUAL 29 #define SLJIT_SET_UNORDERED_OR_LESS_EQUAL SLJIT_SET(SLJIT_ORDERED_GREATER) -#define SLJIT_UNORDERED_OR_EQUAL 28 +#define SLJIT_UNORDERED_OR_EQUAL 30 #define SLJIT_SET_UNORDERED_OR_EQUAL SLJIT_SET(SLJIT_UNORDERED_OR_EQUAL) -#define SLJIT_ORDERED_NOT_EQUAL 29 +#define SLJIT_ORDERED_NOT_EQUAL 31 #define SLJIT_SET_ORDERED_NOT_EQUAL SLJIT_SET(SLJIT_UNORDERED_OR_EQUAL) -#define SLJIT_UNORDERED_OR_LESS 30 +#define SLJIT_UNORDERED_OR_LESS 32 #define SLJIT_SET_UNORDERED_OR_LESS SLJIT_SET(SLJIT_UNORDERED_OR_LESS) -#define SLJIT_ORDERED_GREATER_EQUAL 31 +#define SLJIT_ORDERED_GREATER_EQUAL 33 #define SLJIT_SET_ORDERED_GREATER_EQUAL SLJIT_SET(SLJIT_UNORDERED_OR_LESS) -#define SLJIT_UNORDERED_OR_GREATER 32 +#define SLJIT_UNORDERED_OR_GREATER 34 #define SLJIT_SET_UNORDERED_OR_GREATER SLJIT_SET(SLJIT_UNORDERED_OR_GREATER) -#define SLJIT_ORDERED_LESS_EQUAL 33 +#define SLJIT_ORDERED_LESS_EQUAL 35 #define SLJIT_SET_ORDERED_LESS_EQUAL SLJIT_SET(SLJIT_UNORDERED_OR_GREATER) /* Unconditional jump types. */ -#define SLJIT_JUMP 34 +#define SLJIT_JUMP 36 /* Fast calling method. See the description above. */ -#define SLJIT_FAST_CALL 35 +#define SLJIT_FAST_CALL 37 /* Default C calling convention. */ -#define SLJIT_CALL 36 +#define SLJIT_CALL 38 /* Called function must be compiled by SLJIT. See SLJIT_ENTER_REG_ARG option. */ -#define SLJIT_CALL_REG_ARG 37 +#define SLJIT_CALL_REG_ARG 39 /* The target can be changed during runtime (see: sljit_set_jump_addr). */ #define SLJIT_REWRITABLE_JUMP 0x1000 @@ -1563,19 +1699,42 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co sljit_s32 dst, sljit_sw dstw, sljit_s32 type); -/* Emit a conditional mov instruction which moves source to destination, - if the condition is satisfied. Unlike other arithmetic operations this - instruction does not support memory access. +/* Emit a conditional select instruction which moves src1 to dst_reg, + if the condition is satisfied, or src2_reg to dst_reg otherwise. type must be between SLJIT_EQUAL and SLJIT_ORDERED_LESS_EQUAL - type can be combined (or'ed) with SLJIT_32 - dst_reg must be a valid register - src must be a valid register or immediate (SLJIT_IMM) + type can be combined (or'ed) with SLJIT_32 to move 32 bit + register values instead of word sized ones + dst_reg and src2_reg must be valid registers + src1 must be valid operand + + Note: if src1 is a memory operand, its value + might be loaded even if the condition is false. Flags: - (does not modify flags) */ -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw); + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg); + +/* Emit a conditional floating point select instruction which moves + src1 to dst_reg, if the condition is satisfied, or src2_reg to + dst_reg otherwise. + + type must be between SLJIT_EQUAL and SLJIT_ORDERED_LESS_EQUAL + type can be combined (or'ed) with SLJIT_32 to move 32 bit + floating point values instead of 64 bit ones + dst_freg and src2_freg must be valid floating point registers + src1 must be valid operand + + Note: if src1 is a memory operand, its value + might be loaded even if the condition is false. + + Flags: - (does not modify flags) */ +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg); /* The following flags are used by sljit_emit_mem(), sljit_emit_mem_update(), sljit_emit_fmem(), and sljit_emit_fmem_update(). */ @@ -1590,9 +1749,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil /* Load or stora data from an unaligned (byte aligned) address. */ #define SLJIT_MEM_UNALIGNED 0x000400 /* Load or stora data from a 16 bit aligned address. */ -#define SLJIT_MEM_UNALIGNED_16 0x000800 +#define SLJIT_MEM_ALIGNED_16 0x000800 /* Load or stora data from a 32 bit aligned address. */ -#define SLJIT_MEM_UNALIGNED_32 0x001000 +#define SLJIT_MEM_ALIGNED_32 0x001000 /* The following flags are used by sljit_emit_mem_update(), and sljit_emit_fmem_update(). */ @@ -1610,8 +1769,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil /* The sljit_emit_mem emits instructions for various memory operations: - When SLJIT_MEM_UNALIGNED / SLJIT_MEM_UNALIGNED_16 / - SLJIT_MEM_UNALIGNED_32 is set in type argument: + When SLJIT_MEM_UNALIGNED / SLJIT_MEM_ALIGNED_16 / + SLJIT_MEM_ALIGNED_32 is set in type argument: Emit instructions for unaligned memory loads or stores. When SLJIT_UNALIGNED is not defined, the only way to access unaligned memory data is using sljit_emit_mem. Otherwise all operations (e.g. @@ -1626,8 +1785,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil location specified by the mem/memw arguments, and the end address of this operation is the starting address of the data transfer between the second register and memory. The type argument must - be SLJIT_MOV. The SLJIT_MEM_UNALIGNED* options are allowed for - this operation. + be SLJIT_MOV. The SLJIT_MEM_UNALIGNED / SLJIT_MEM_ALIGNED_* + options are allowed for this operation. type must be between SLJIT_MOV and SLJIT_MOV_P and can be combined (or'ed) with SLJIT_MEM_* flags @@ -1691,6 +1850,286 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler sljit_s32 freg, sljit_s32 mem, sljit_sw memw); +/* The following options are used by several simd operations. */ + +/* Load data into a simd register, this is the default */ +#define SLJIT_SIMD_LOAD 0x000000 +/* Store data from a simd register */ +#define SLJIT_SIMD_STORE 0x000001 +/* The simd register contains floating point values */ +#define SLJIT_SIMD_FLOAT 0x000400 +/* Tests whether the operation is available */ +#define SLJIT_SIMD_TEST 0x000800 +/* Move data to/from a 64 bit (8 byte) long SIMD register */ +#define SLJIT_SIMD_REG_64 (3 << 12) +/* Move data to/from a 128 bit (16 byte) long SIMD register */ +#define SLJIT_SIMD_REG_128 (4 << 12) +/* Move data to/from a 256 bit (32 byte) long SIMD register */ +#define SLJIT_SIMD_REG_256 (5 << 12) +/* Move data to/from a 512 bit (64 byte) long SIMD register */ +#define SLJIT_SIMD_REG_512 (6 << 12) +/* Element size is 8 bit long (this is the default), usually cannot be combined with SLJIT_SIMD_FLOAT */ +#define SLJIT_SIMD_ELEM_8 (0 << 18) +/* Element size is 16 bit long, usually cannot be combined with SLJIT_SIMD_FLOAT */ +#define SLJIT_SIMD_ELEM_16 (1 << 18) +/* Element size is 32 bit long */ +#define SLJIT_SIMD_ELEM_32 (2 << 18) +/* Element size is 64 bit long */ +#define SLJIT_SIMD_ELEM_64 (3 << 18) +/* Element size is 128 bit long */ +#define SLJIT_SIMD_ELEM_128 (4 << 18) +/* Element size is 256 bit long */ +#define SLJIT_SIMD_ELEM_256 (5 << 18) + +/* The following options are used by sljit_emit_simd_mov(). */ + +/* Memory address is unaligned (this is the default) */ +#define SLJIT_SIMD_MEM_UNALIGNED (0 << 24) +/* Memory address is 16 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_16 (1 << 24) +/* Memory address is 32 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_32 (2 << 24) +/* Memory address is 64 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_64 (3 << 24) +/* Memory address is 128 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_128 (4 << 24) +/* Memory address is 256 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_256 (5 << 24) +/* Memory address is 512 bit aligned */ +#define SLJIT_SIMD_MEM_ALIGNED_512 (6 << 24) + +/* Moves data between a simd register and memory. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* and + SLJIT_SIMD_MEM_* options + freg is the source or destination simd register + of the operation + srcdst must be a memory operand or a simd register + + Note: + The alignment and element size must be + less or equal than simd register size. + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw); + +/* Replicates a scalar value to all lanes of a simd + register. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* options + except SLJIT_SIMD_STORE. + freg is the destination simd register of the operation + src is the value which is replicated + + Note: + The src == SLJIT_IMM and srcw == 0 can be used to + clear a register even when SLJIT_SIMD_FLOAT is set. + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw); + +/* The following options are used by sljit_emit_simd_lane_mov(). */ + +/* Clear all bits of the simd register before loading the lane. */ +#define SLJIT_SIMD_LANE_ZERO 0x000002 +/* Sign extend the integer value stored from the lane. */ +#define SLJIT_SIMD_LANE_SIGNED 0x000004 + +/* Moves data between a simd register lane and a register or + memory. If the srcdst argument is a register, it must be + a floating point register when SLJIT_SIMD_FLOAT is specified, + or a general purpose register otherwise. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* options + Further options: + SLJIT_32 - when SLJIT_SIMD_FLOAT is not set + SLJIT_SIMD_LANE_SIGNED - when SLJIT_SIMD_STORE + is set and SLJIT_SIMD_FLOAT is not set + SLJIT_SIMD_LANE_ZERO - when SLJIT_SIMD_LOAD + is specified + freg is the source or destination simd register + of the operation + lane_index is the index of the lane + srcdst is the destination operand for loads, and + source operand for stores + + Note: + The elem size must be lower than register size. + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw); + +/* Replicates a scalar value from a lane to all lanes + of a simd register. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* options + except SLJIT_SIMD_STORE. + freg is the destination simd register of the operation + src is the simd register which lane is replicated + src_lane_index is the lane index of the src register + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index); + +/* The following options are used by sljit_emit_simd_load_extend(). */ + +/* Sign extend the integer elements */ +#define SLJIT_SIMD_EXTEND_SIGNED 0x000002 +/* Extend data to 16 bit */ +#define SLJIT_SIMD_EXTEND_16 (1 << 24) +/* Extend data to 32 bit */ +#define SLJIT_SIMD_EXTEND_32 (2 << 24) +/* Extend data to 64 bit */ +#define SLJIT_SIMD_EXTEND_64 (3 << 24) + +/* Extend elements and stores them in a simd register. + The extension operation increases the size of the + elements (e.g. from 16 bit to 64 bit). For integer + values, the extension can be signed or unsigned. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_*, and + SLJIT_SIMD_EXTEND_* options except SLJIT_SIMD_STORE + freg is the destination simd register of the operation + src must be a memory operand or a simd register. + In the latter case, the source elements are stored + in the lower half of the register. + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw); + +/* Extract the highest bit (usually the sign bit) from + each elements of a vector. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* and SLJIT_32 + options except SLJIT_SIMD_LOAD + freg is the source simd register of the operation + dst is the destination operand + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw); + +/* The following options are used by sljit_emit_simd_op2(). */ + +/* Binary 'and' operation */ +#define SLJIT_SIMD_OP2_AND 0x000001 +/* Binary 'or' operation */ +#define SLJIT_SIMD_OP2_OR 0x000002 +/* Binary 'xor' operation */ +#define SLJIT_SIMD_OP2_XOR 0x000003 + +/* Perform simd operations using simd registers. + + If the operation is not supported, it returns with + SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed, + it does not emit any instructions. + + type must be a combination of SLJIT_SIMD_* and SLJIT_SIMD_OP2_ + options except SLJIT_SIMD_LOAD and SLJIT_SIMD_STORE + dst_freg is the destination register of the operation + src1_freg is the first source register of the operation + src1_freg is the second source register of the operation + + Flags: - (does not modify flags) */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg); + +/* The sljit_emit_atomic_load and sljit_emit_atomic_store operation pair + can perform an atomic read-modify-write operation. First, an unsigned + value must be loaded from memory using sljit_emit_atomic_load. Then, + the updated value must be written back to the same memory location by + sljit_emit_atomic_store. A thread can only perform a single atomic + operation at a time. + + Note: atomic operations are experimental, and not implemented + for all cpus. + + The following conditions must be satisfied, or the operation + is undefined: + - the address provided in mem_reg must be divisible by the size of + the value (only naturally aligned updates are supported) + - no memory writes are allowed between the load and store operations + regardless of its target address (currently read operations are + allowed, but this might change in the future) + - the memory operation (op) and the base address (stored in mem_reg) + passed to the load/store operations must be the same (the mem_reg + can be a different register, only its value must be the same) + - an store must always follow a load for the same transaction. + + op must be between SLJIT_MOV and SLJIT_MOV_P, excluding all + signed loads such as SLJIT_MOV32_S16 + dst_reg is the register where the data will be loaded into + mem_reg is the base address of the memory load (it cannot be + SLJIT_SP or a virtual register on x86-32) + + Flags: - (does not modify flags) */ +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg); + +/* The sljit_emit_atomic_load and sljit_emit_atomic_store operations + allows performing an atomic read-modify-write operation. See the + description of sljit_emit_atomic_load. + + op must be between SLJIT_MOV and SLJIT_MOV_P, excluding all signed + loads such as SLJIT_MOV32_S16 + src_reg is the register which value is stored into the memory + mem_reg is the base address of the memory store (it cannot be + SLJIT_SP or a virtual register on x86-32) + temp_reg is a not preserved scratch register, which must be + initialized with the value loaded into the dst_reg during the + corresponding sljit_emit_atomic_load operation, or the operation + is undefined + + Flags: ATOMIC_STORED is set if the operation is successful, + otherwise the memory remains unchanged. */ +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg); + /* Copies the base address of SLJIT_SP + offset to dst. The offset can represent the starting address of a value in the local data (stack). The offset is not limited by the local data limits, it can be any value. @@ -1708,17 +2147,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *c Flags: - (does not modify flags) */ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value); -/* Store the value of a label (see: sljit_set_put_label) +/* Store the value of a label (see: sljit_set_label / sljit_set_target) Flags: - (does not modify flags) */ -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw); +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw); -/* Set the value stored by put_label to this label. */ -SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label); - -/* After the code generation the address for label, jump and const instructions - are computed. Since these structures are freed by sljit_free_compiler, the - addresses must be preserved by the user program elsewere. */ -static SLJIT_INLINE sljit_uw sljit_get_label_addr(struct sljit_label *label) { return label->addr; } +/* Provides the address of label, jump and const instructions after sljit_generate_code + is called. The returned value is unspecified before the sljit_generate_code call. + Since these structures are freed by sljit_free_compiler, the addresses must be + preserved by the user program elsewere. */ +static SLJIT_INLINE sljit_uw sljit_get_label_addr(struct sljit_label *label) { return label->u.addr; } static SLJIT_INLINE sljit_uw sljit_get_jump_addr(struct sljit_jump *jump) { return jump->addr; } static SLJIT_INLINE sljit_uw sljit_get_const_addr(struct sljit_const *const_) { return const_->addr; } @@ -1731,30 +2168,39 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta /* CPU specific functions */ /* --------------------------------------------------------------------- */ -/* The following function is a helper function for sljit_emit_op_custom. - It returns with the real machine register index ( >=0 ) of any SLJIT_R, - SLJIT_S and SLJIT_SP registers. +/* Types for sljit_get_register_index */ - Note: it returns with -1 for virtual registers (only on x86-32). */ - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg); +/* General purpose (integer) registers. */ +#define SLJIT_GP_REGISTER 0 +/* Floating point registers. */ +#define SLJIT_FLOAT_REGISTER 1 /* The following function is a helper function for sljit_emit_op_custom. - It returns with the real machine register ( >= 0 ) index of any SLJIT_FR, - and SLJIT_FS register. + It returns with the real machine register index ( >=0 ) of any registers. - Note: the index is always an even number on ARM-32, MIPS. */ + When type is SLJIT_GP_REGISTER: + reg must be an SLJIT_R(i), SLJIT_S(i), or SLJIT_SP register -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg); + When type is SLJIT_FLOAT_REGISTER: + reg must be an SLJIT_FR(i) or SLJIT_FS(i) register + + When type is SLJIT_SIMD_REG_64 / 128 / 256 / 512 : + reg must be an SLJIT_FR(i) or SLJIT_FS(i) register + + Note: it returns with -1 for unknown registers, such as virtual + registers on x86-32 or unsupported simd registers. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg); /* Any instruction can be inserted into the instruction stream by sljit_emit_op_custom. It has a similar purpose as inline assembly. The size parameter must match to the instruction size of the target architecture: - x86: 0 < size <= 15. The instruction argument can be byte aligned. + x86: 0 < size <= 15, the instruction argument can be byte aligned. Thumb2: if size == 2, the instruction argument must be 2 byte aligned. if size == 4, the instruction argument must be 4 byte aligned. + s390x: size can be 2, 4, or 6, the instruction argument can be byte aligned. Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, @@ -1782,6 +2228,98 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags); +/* --------------------------------------------------------------------- */ +/* Serialization functions */ +/* --------------------------------------------------------------------- */ + +/* Label/jump/const enumeration functions. The items in each group + are enumerated in creation order. Serialization / deserialization + preserves this order for each group. For example the fifth label + after deserialization refers to the same machine code location as + the fifth label before the serialization. */ +static SLJIT_INLINE struct sljit_label *sljit_get_first_label(struct sljit_compiler *compiler) { return compiler->labels; } +static SLJIT_INLINE struct sljit_jump *sljit_get_first_jump(struct sljit_compiler *compiler) { return compiler->jumps; } +static SLJIT_INLINE struct sljit_const *sljit_get_first_const(struct sljit_compiler *compiler) { return compiler->consts; } + +static SLJIT_INLINE struct sljit_label *sljit_get_next_label(struct sljit_label *label) { return label->next; } +static SLJIT_INLINE struct sljit_jump *sljit_get_next_jump(struct sljit_jump *jump) { return jump->next; } +static SLJIT_INLINE struct sljit_const *sljit_get_next_const(struct sljit_const *const_) { return const_->next; } + +/* A number starting from 0 is assigned to each label, which +represents its creation index. The first label created by the +compiler has index 0, the second has index 1, the third has +index 2, and so on. The returned value is unspecified after +sljit_generate_code() is called. */ +static SLJIT_INLINE sljit_uw sljit_get_label_index(struct sljit_label *label) { return label->u.index; } + +/* The sljit_jump_has_label() and sljit_jump_has_target() functions +returns non-zero value if a label or target is set for the jump +respectively. Both may return with a zero value. The other two +functions return the value assigned to the jump. */ +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_has_label(struct sljit_jump *jump); +static SLJIT_INLINE struct sljit_label *sljit_jump_get_label(struct sljit_jump *jump) { return jump->u.label; } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_has_target(struct sljit_jump *jump); +static SLJIT_INLINE sljit_uw sljit_jump_get_target(struct sljit_jump *jump) { return jump->u.target; } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_is_mov_addr(struct sljit_jump *jump); + +/* Option bits for sljit_serialize_compiler. */ + +/* When debugging is enabled, the serialized buffer contains +debugging information unless this option is specified. */ +#define SLJIT_SERIALIZE_IGNORE_DEBUG 0x1 + +/* Serialize the internal structure of the compiler into a buffer. +If the serialization is successful, the returned value is a newly +allocated buffer which is allocated by the memory allocator assigned +to the compiler. Otherwise the returned value is NULL. Unlike +sljit_generate_code(), serialization does not modify the internal +state of the compiler, so the code generation can be continued. + + options must be the combination of SLJIT_SERIALIZE_* option bits + size is an output argument, which is set to the byte size of + the result buffer if the operation is successful + +Notes: + - This function is useful for ahead-of-time compilation (AOT). + - The returned buffer must be freed later by the caller. + The SLJIT_FREE() macro is suitable for this purpose: + SLJIT_FREE(returned_buffer, sljit_get_allocator_data(compiler)) + - Memory allocated by sljit_alloc_memory() is not serialized. + - The type of the returned buffer is sljit_uw* to emphasize that + the buffer is word aligned. However, the 'size' output argument + contains the byte size, so this value is always divisible by + sizeof(sljit_uw). +*/ +SLJIT_API_FUNC_ATTRIBUTE sljit_uw* sljit_serialize_compiler(struct sljit_compiler *compiler, + sljit_s32 options, sljit_uw *size); + +/* Construct a new compiler instance from a buffer produced by +sljit_serialize_compiler(). If the operation is successful, the new +compiler instance is returned. Otherwise the returned value is NULL. + + buffer points to a word aligned memory data which was + created by sljit_serialize_compiler() + size is the byte size of the buffer + options must be 0 + allocator_data and exec_allocator_data specify an allocator + specific data similar to sljit_create_compiler() + +Notes: + - Labels assigned to jumps are restored with their + corresponding label in the label set created by + the deserializer. Target addresses assigned to + jumps are also restored. Uninitialized jumps + remain uninitialized. + - After the deserialization, sljit_generate_code() does + not need to be the next operation on the returned + compiler, the code generation can be continued. + Even sljit_serialize_compiler() can be called again. + - When debugging is enabled, a buffers without debug + information cannot be deserialized. +*/ +SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler *sljit_deserialize_compiler(sljit_uw* buffer, sljit_uw size, + sljit_s32 options, void *allocator_data, void *exec_allocator_data); + /* --------------------------------------------------------------------- */ /* Miscellaneous utility functions */ /* --------------------------------------------------------------------- */ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_32.c old mode 100644 new mode 100755 index 8175293d2b..0d2fa55968 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_32.c @@ -34,13 +34,16 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) { #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) return "ARMv7" SLJIT_CPUINFO ARM_ABI_INFO; -#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - return "ARMv5" SLJIT_CPUINFO ARM_ABI_INFO; +#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + return "ARMv6" SLJIT_CPUINFO ARM_ABI_INFO; #else #error "Internal error: Unknown ARM architecture" #endif } +/* Length of an instruction word. */ +typedef sljit_u32 sljit_ins; + /* Last register + 1. */ #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) @@ -55,27 +58,39 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) #define CONST_POOL_EMPTY 0xffffffff #define ALIGN_INSTRUCTION(ptr) \ - (sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1)) + (sljit_ins*)(((sljit_ins)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_ins)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_ins)) - 1)) #define MAX_DIFFERENCE(max_diff) \ - (((max_diff) / (sljit_s32)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1)) + (((max_diff) / (sljit_s32)sizeof(sljit_ins)) - (CONST_POOL_ALIGNMENT - 1)) /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */ static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { 0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15 }; -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { - 0, 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, 6, 7 +static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = { + 0, + 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6, + 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6 }; -#define RM(rm) ((sljit_uw)reg_map[rm]) -#define RM8(rm) ((sljit_uw)reg_map[rm] << 8) -#define RD(rd) ((sljit_uw)reg_map[rd] << 12) -#define RN(rn) ((sljit_uw)reg_map[rn] << 16) +static const sljit_u8 freg_ebit_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = { + 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1 +}; -#define VM(rm) ((sljit_uw)freg_map[rm]) -#define VD(rd) ((sljit_uw)freg_map[rd] << 12) -#define VN(rn) ((sljit_uw)freg_map[rn] << 16) +#define RM(rm) ((sljit_ins)reg_map[rm]) +#define RM8(rm) ((sljit_ins)reg_map[rm] << 8) +#define RD(rd) ((sljit_ins)reg_map[rd] << 12) +#define RN(rn) ((sljit_ins)reg_map[rn] << 16) + +#define VM(vm) (((sljit_ins)freg_map[vm]) | ((sljit_ins)freg_ebit_map[vm] << 5)) +#define VD(vd) (((sljit_ins)freg_map[vd] << 12) | ((sljit_ins)freg_ebit_map[vd] << 22)) +#define VN(vn) (((sljit_ins)freg_map[vn] << 16) | ((sljit_ins)freg_ebit_map[vn] << 7)) /* --------------------------------------------------------------------- */ /* Instrucion forms */ @@ -92,16 +107,19 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define AND 0xe0000000 #define B 0xea000000 #define BIC 0xe1c00000 +#define BKPT 0xe1200070 #define BL 0xeb000000 #define BLX 0xe12fff30 #define BX 0xe12fff10 #define CLZ 0xe16f0f10 #define CMN 0xe1600000 #define CMP 0xe1400000 -#define BKPT 0xe1200070 #define EOR 0xe0200000 #define LDR 0xe5100000 #define LDR_POST 0xe4100000 +#define LDREX 0xe1900f9f +#define LDREXB 0xe1d00f9f +#define LDREXH 0xe1f00f9f #define MOV 0xe1a00000 #define MUL 0xe0000090 #define MVN 0xe1e00000 @@ -109,51 +127,89 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define ORR 0xe1800000 #define PUSH 0xe92d0000 #define POP 0xe8bd0000 -#define RBIT 0xe6ff0f30 #define REV 0xe6bf0f30 +#define REV16 0xe6bf0fb0 #define RSB 0xe0600000 #define RSC 0xe0e00000 #define SBC 0xe0c00000 #define SMULL 0xe0c00090 #define STR 0xe5000000 +#define STREX 0xe1800f90 +#define STREXB 0xe1c00f90 +#define STREXH 0xe1e00f90 #define SUB 0xe0400000 +#define SXTB 0xe6af0070 +#define SXTH 0xe6bf0070 #define TST 0xe1000000 #define UMULL 0xe0800090 +#define UXTB 0xe6ef0070 +#define UXTH 0xe6ff0070 #define VABS_F32 0xeeb00ac0 #define VADD_F32 0xee300a00 +#define VAND 0xf2000110 #define VCMP_F32 0xeeb40a40 #define VCVT_F32_S32 0xeeb80ac0 +#define VCVT_F32_U32 0xeeb80a40 #define VCVT_F64_F32 0xeeb70ac0 #define VCVT_S32_F32 0xeebd0ac0 #define VDIV_F32 0xee800a00 +#define VDUP 0xee800b10 +#define VDUP_s 0xf3b00c00 +#define VEOR 0xf3000110 +#define VLD1 0xf4200000 +#define VLD1_r 0xf4a00c00 +#define VLD1_s 0xf4a00000 #define VLDR_F32 0xed100a00 #define VMOV_F32 0xeeb00a40 #define VMOV 0xee000a10 #define VMOV2 0xec400a10 +#define VMOV_i 0xf2800010 +#define VMOV_s 0xee000b10 +#define VMOVN 0xf3b20200 #define VMRS 0xeef1fa10 #define VMUL_F32 0xee200a00 #define VNEG_F32 0xeeb10a40 +#define VORR 0xf2200110 #define VPOP 0xecbd0b00 #define VPUSH 0xed2d0b00 +#define VSHLL 0xf2800a10 +#define VSHR 0xf2800010 +#define VSRA 0xf2800110 +#define VST1 0xf4000000 +#define VST1_s 0xf4800000 #define VSTR_F32 0xed000a00 #define VSUB_F32 0xee300a40 #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) /* Arm v7 specific instructions. */ -#define MOVW 0xe3000000 #define MOVT 0xe3400000 -#define SXTB 0xe6af0070 -#define SXTH 0xe6bf0070 -#define UXTB 0xe6ef0070 -#define UXTH 0xe6ff0070 +#define MOVW 0xe3000000 +#define RBIT 0xe6ff0f30 #endif -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + +static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32) +{ + if (compiler->scratches == -1) + return 0; + + if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0)) + fr -= SLJIT_F64_SECOND(0); + + return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches)) + || (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0) + || (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)); +} + +#endif /* SLJIT_ARGUMENT_CHECKS */ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) static sljit_s32 push_cpool(struct sljit_compiler *compiler) { /* Pushing the constant pool into the instruction stream. */ - sljit_uw* inst; + sljit_ins* inst; sljit_uw* cpool_ptr; sljit_uw* cpool_end; sljit_s32 i; @@ -163,13 +219,13 @@ static sljit_s32 push_cpool(struct sljit_compiler *compiler) compiler->last_label->size += compiler->cpool_fill + (CONST_POOL_ALIGNMENT - 1) + 1; SLJIT_ASSERT(compiler->cpool_fill > 0 && compiler->cpool_fill <= CPOOL_SIZE); - inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!inst); compiler->size++; *inst = 0xff000000 | compiler->cpool_fill; for (i = 0; i < CONST_POOL_ALIGNMENT - 1; i++) { - inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!inst); compiler->size++; *inst = 0; @@ -178,7 +234,7 @@ static sljit_s32 push_cpool(struct sljit_compiler *compiler) cpool_ptr = compiler->cpool; cpool_end = cpool_ptr + compiler->cpool_fill; while (cpool_ptr < cpool_end) { - inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!inst); compiler->size++; *inst = *cpool_ptr++; @@ -188,23 +244,23 @@ static sljit_s32 push_cpool(struct sljit_compiler *compiler) return SLJIT_SUCCESS; } -static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst) +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins inst) { - sljit_uw* ptr; + sljit_ins* ptr; if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092))) FAIL_IF(push_cpool(compiler)); - ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!ptr); compiler->size++; *ptr = inst; return SLJIT_SUCCESS; } -static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) +static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_ins inst, sljit_uw literal) { - sljit_uw* ptr; + sljit_ins* ptr; sljit_uw cpool_index = CPOOL_SIZE; sljit_uw* cpool_ptr; sljit_uw* cpool_end; @@ -240,7 +296,7 @@ static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_u } SLJIT_ASSERT((inst & 0xfff) == 0); - ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!ptr); compiler->size++; *ptr = inst | cpool_index; @@ -252,14 +308,15 @@ static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_u return SLJIT_SUCCESS; } -static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) +static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_ins inst, sljit_uw literal) { - sljit_uw* ptr; + sljit_ins* ptr; + if (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE)) FAIL_IF(push_cpool(compiler)); SLJIT_ASSERT(compiler->cpool_fill < CPOOL_SIZE && (inst & 0xfff) == 0); - ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!ptr); compiler->size++; *ptr = inst | compiler->cpool_fill; @@ -306,7 +363,7 @@ static sljit_uw patch_pc_relative_loads(sljit_uw *last_pc_patch, sljit_uw *code_ while (last_pc_patch < code_ptr) { /* Data transfer instruction with Rn == r15. */ - if ((*last_pc_patch & 0x0c0f0000) == 0x040f0000) { + if ((*last_pc_patch & 0x0e0f0000) == 0x040f0000) { diff = (sljit_uw)(const_pool - last_pc_patch); ind = (*last_pc_patch) & 0xfff; @@ -396,11 +453,11 @@ static sljit_s32 resolve_const_pool_index(struct sljit_compiler *compiler, struc #else -static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst) +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins inst) { - sljit_uw* ptr; + sljit_ins* ptr; - ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!ptr); compiler->size++; *ptr = inst; @@ -422,14 +479,15 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw if (jump->flags & SLJIT_REWRITABLE_JUMP) return 0; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (jump->flags & IS_BL) code_ptr--; +#endif /* SLJIT_CONFIG_ARM_V6 */ if (jump->flags & JUMP_ADDR) diff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset); else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(jump->u.label != NULL); diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)); } @@ -437,6 +495,7 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw if (diff & 0x3) return 0; +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (jump->flags & IS_BL) { if (diff <= 0x01ffffff && diff >= -0x02000000) { *code_ptr = (BL - CONDITIONAL) | (*(code_ptr + 1) & COND_MASK); @@ -450,34 +509,22 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw jump->flags |= PATCH_B; } } -#else - if (jump->flags & JUMP_ADDR) - diff = ((sljit_sw)jump->u.target - (sljit_sw)code_ptr - executable_offset); - else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); - diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)code_ptr); - } - - /* Branch to Thumb code has not been optimized yet. */ - if (diff & 0x3) - return 0; - +#else /* !SLJIT_CONFIG_ARM_V6 */ if (diff <= 0x01ffffff && diff >= -0x02000000) { - code_ptr -= 2; - *code_ptr = ((jump->flags & IS_BL) ? (BL - CONDITIONAL) : (B - CONDITIONAL)) | (code_ptr[2] & COND_MASK); + *code_ptr = ((jump->flags & IS_BL) ? (BL - CONDITIONAL) : (B - CONDITIONAL)) | (*code_ptr & COND_MASK); jump->flags |= PATCH_B; return 1; } -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ return 0; } -static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw executable_offset, sljit_uw new_addr, sljit_s32 flush_cache) +static void set_jump_addr(sljit_uw jump_ptr, sljit_sw executable_offset, sljit_uw new_addr, sljit_s32 flush_cache) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - sljit_uw *ptr = (sljit_uw *)jump_ptr; - sljit_uw *inst = (sljit_uw *)ptr[0]; - sljit_uw mov_pc = ptr[1]; +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + sljit_ins *ptr = (sljit_ins*)jump_ptr; + sljit_ins *inst = (sljit_ins*)ptr[0]; + sljit_ins mov_pc = ptr[1]; sljit_s32 bl = (mov_pc & 0x0000f000) != RD(TMP_PC); sljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2) - executable_offset) >> 2); @@ -492,7 +539,7 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw execut inst[0] = (mov_pc & COND_MASK) | (B - CONDITIONAL) | (diff & 0xffffff); if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 1); } } else { @@ -503,7 +550,7 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw execut inst[1] = NOP; if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 2); } } @@ -522,14 +569,14 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw execut if (!bl) { if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 1); } } else { inst[1] = BLX | RM(TMP_REG1); if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 2); } } @@ -545,8 +592,8 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw execut SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1); } } -#else - sljit_uw *inst = (sljit_uw*)jump_ptr; +#else /* !SLJIT_CONFIG_ARM_V6 */ + sljit_ins *inst = (sljit_ins*)jump_ptr; SLJIT_UNUSED_ARG(executable_offset); @@ -561,21 +608,21 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw execut if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 2); } -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ } static sljit_uw get_imm(sljit_uw imm); static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm); static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg); -static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_offset, sljit_uw new_constant, sljit_s32 flush_cache) +static void set_const_value(sljit_uw addr, sljit_sw executable_offset, sljit_uw new_constant, sljit_s32 flush_cache) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - sljit_uw *ptr = (sljit_uw*)addr; - sljit_uw *inst = (sljit_uw*)ptr[0]; +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + sljit_ins *ptr = (sljit_ins*)addr; + sljit_ins *inst = (sljit_ins*)ptr[0]; sljit_uw ldr_literal = ptr[1]; sljit_uw src2; @@ -591,7 +638,7 @@ static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_off if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 1); } return; @@ -607,7 +654,7 @@ static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_off if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 1); } return; @@ -627,7 +674,7 @@ static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_off if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 1); } } @@ -641,8 +688,8 @@ static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_off if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1); } -#else - sljit_uw *inst = (sljit_uw*)addr; +#else /* !SLJIT_CONFIG_ARM_V6 */ + sljit_ins *inst = (sljit_ins*)addr; SLJIT_UNUSED_ARG(executable_offset); @@ -657,90 +704,185 @@ static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_off if (flush_cache) { SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1); - inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); SLJIT_CACHE_FLUSH(inst, inst + 2); } -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ } +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_uw addr; + sljit_sw diff; + SLJIT_UNUSED_ARG(executable_offset); + + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + /* The pc+8 offset is represented by the 2 * SSIZE_OF(ins) below. */ + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + if ((diff & 0x3) == 0 && diff <= (0x3fc + 2 * SSIZE_OF(ins)) && diff >= (-0x3fc + 2 * SSIZE_OF(ins))) { + jump->flags |= PATCH_B; + return 0; + } + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + return 0; +#else /* !SLJIT_CONFIG_ARM_V6 */ + return 1; +#endif /* SLJIT_CONFIG_ARM_V6 */ +} + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + SLJIT_NEXT_DEFINE_TYPES; + sljit_uw total_size; + sljit_uw size_reduce = 0; + sljit_sw diff; + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + + while (1) { + SLJIT_GET_NEXT_MIN(); + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr == next_const_addr) { + const_->addr -= size_reduce; + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + continue; + } + + if (next_min_addr != next_jump_addr) + continue; + + jump->addr -= size_reduce; + if (!(jump->flags & JUMP_MOV_ADDR)) { + total_size = JUMP_MAX_SIZE - 1; + + if (!(jump->flags & (SLJIT_REWRITABLE_JUMP | JUMP_ADDR))) { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr - 2; + + if (diff <= (0x01ffffff / SSIZE_OF(ins)) && diff >= (-0x02000000 / SSIZE_OF(ins))) + total_size = 1 - 1; + } + + size_reduce += JUMP_MAX_SIZE - 1 - total_size; + } else { + /* Real size minus 1. Unit size: instruction. */ + total_size = 1; + + if (!(jump->flags & JUMP_ADDR)) { + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + if (diff <= 0xff + 2 && diff >= -0xff + 2) + total_size = 0; + } + + size_reduce += 1 - total_size; + } + + jump->flags |= total_size << JUMP_SIZE_SHIFT; + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; +} + +#endif /* SLJIT_CONFIG_ARM_V7 */ + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_memory_fragment *buf; - sljit_uw *code; - sljit_uw *code_ptr; - sljit_uw *buf_ptr; - sljit_uw *buf_end; - sljit_uw size; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; sljit_uw word_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; sljit_sw executable_offset; sljit_uw addr; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + sljit_sw diff; +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) sljit_uw cpool_size; sljit_uw cpool_skip_alignment; sljit_uw cpool_current_index; - sljit_uw *cpool_start_address; - sljit_uw *last_pc_patch; + sljit_ins *cpool_start_address; + sljit_ins *last_pc_patch; struct future_patch *first_patch; #endif struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); /* Second code generation pass. */ -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - size = compiler->size + (compiler->patches << 1); +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + compiler->size += (compiler->patches << 1); if (compiler->cpool_fill > 0) - size += compiler->cpool_fill + CONST_POOL_ALIGNMENT - 1; -#else - size = compiler->size; -#endif - code = (sljit_uw*)SLJIT_MALLOC_EXEC(size * sizeof(sljit_uw), compiler->exec_allocator_data); + compiler->size += compiler->cpool_fill + CONST_POOL_ALIGNMENT - 1; +#else /* !SLJIT_CONFIG_ARM_V6 */ + reduce_code_size(compiler); +#endif /* SLJIT_CONFIG_ARM_V6 */ + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) cpool_size = 0; cpool_skip_alignment = 0; cpool_current_index = 0; cpool_start_address = NULL; first_patch = NULL; last_pc_patch = code; -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ code_ptr = code; word_count = 0; - next_addr = 1; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; - - if (label && label->size == 0) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); - label = label->next; - } + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { - buf_ptr = (sljit_uw*)buf->memory; + buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { - word_count++; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (cpool_size > 0) { if (cpool_skip_alignment > 0) { buf_ptr++; cpool_skip_alignment--; - } - else { + } else { if (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) { SLJIT_FREE_EXEC(code, compiler->exec_allocator_data); compiler->error = SLJIT_ERR_ALLOC_FAILED; @@ -750,64 +892,63 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil if (++cpool_current_index >= cpool_size) { SLJIT_ASSERT(!first_patch); cpool_size = 0; - if (label && label->size == word_count) { - /* Points after the current instruction. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - label->size = (sljit_uw)(code_ptr - code); - label = label->next; - - next_addr = compute_next_addr(label, jump, const_, put_label); - } } } - } - else if ((*buf_ptr & 0xff000000) != PUSH_POOL) { -#endif + } else if ((*buf_ptr & 0xff000000) != PUSH_POOL) { +#endif /* SLJIT_CONFIG_ARM_V6 */ *code_ptr = *buf_ptr++; - if (next_addr == word_count) { + if (next_min_addr == word_count) { SLJIT_ASSERT(!label || label->size >= word_count); SLJIT_ASSERT(!jump || jump->addr >= word_count); SLJIT_ASSERT(!const_ || const_->addr >= word_count); - SLJIT_ASSERT(!put_label || put_label->addr >= word_count); - /* These structures are ordered by their address. */ - if (jump && jump->addr == word_count) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - if (detect_jump_type(jump, code_ptr, code, executable_offset)) - code_ptr--; - jump->addr = (sljit_uw)code_ptr; -#else - jump->addr = (sljit_uw)(code_ptr - 2); - if (detect_jump_type(jump, code_ptr, code, executable_offset)) - code_ptr -= 2; -#endif - jump = jump->next; - } - if (label && label->size == word_count) { - /* code_ptr can be affected above. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset); - label->size = (sljit_uw)((code_ptr + 1) - code); + if (next_min_addr == next_label_size) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (const_ && const_->addr == word_count) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + + /* These structures are ordered by their address. */ + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + if (detect_jump_type(jump, code_ptr, code, executable_offset)) + code_ptr--; + jump->addr = (sljit_uw)code_ptr; +#else /* !SLJIT_CONFIG_ARM_V6 */ + word_count += jump->flags >> JUMP_SIZE_SHIFT; + jump->addr = (sljit_uw)code_ptr; + if (!detect_jump_type(jump, code_ptr, code, executable_offset)) { + code_ptr[2] = code_ptr[0]; + addr = ((code_ptr[0] & 0xf) << 12); + code_ptr[0] = MOVW | addr; + code_ptr[1] = MOVT | addr; + code_ptr += 2; + } + SLJIT_ASSERT((sljit_uw)code_ptr - jump->addr <= (jump->flags >> JUMP_SIZE_SHIFT) * sizeof(sljit_ins)); +#endif /* SLJIT_CONFIG_ARM_V6 */ + } else { +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + word_count += jump->flags >> JUMP_SIZE_SHIFT; +#endif /* SLJIT_CONFIG_ARM_V7 */ + addr = (sljit_uw)code_ptr; + code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset); + jump->addr = addr; + } + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; -#else - const_->addr = (sljit_uw)(code_ptr - 1); -#endif const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == word_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - } - else { +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + } else { /* Fortunately, no need to shift. */ cpool_size = *buf_ptr++ & ~PUSH_POOL; SLJIT_ASSERT(cpool_size > 0); @@ -815,30 +956,36 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, cpool_size); if (cpool_current_index > 0) { /* Unconditional branch. */ - *code_ptr = B | (((sljit_uw)(cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL); - code_ptr = (sljit_uw*)(cpool_start_address + cpool_current_index); + *code_ptr = B | (((sljit_ins)(cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL); + code_ptr = (sljit_ins*)(cpool_start_address + cpool_current_index); } cpool_skip_alignment = CONST_POOL_ALIGNMENT - 1; cpool_current_index = 0; last_pc_patch = code_ptr; } -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ + word_count++; } while (buf_ptr < buf_end); buf = buf->next; } while (buf); + if (label && label->size == word_count) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + label->size = (sljit_uw)(code_ptr - code); + label = label->next; + } + SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) SLJIT_ASSERT(cpool_size == 0); if (compiler->cpool_fill > 0) { cpool_start_address = ALIGN_INSTRUCTION(code_ptr); cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, compiler->cpool_fill); if (cpool_current_index > 0) - code_ptr = (sljit_uw*)(cpool_start_address + cpool_current_index); + code_ptr = (sljit_ins*)(cpool_start_address + cpool_current_index); buf_ptr = compiler->cpool; buf_end = buf_ptr + compiler->cpool_fill; @@ -858,91 +1005,95 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = compiler->jumps; while (jump) { - buf_ptr = (sljit_uw *)jump->addr; + addr = (jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; + buf_ptr = (sljit_ins*)jump->addr; - if (jump->flags & PATCH_B) { - addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset); - if (!(jump->flags & JUMP_ADDR)) { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); - SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - addr) <= 0x01ffffff && (sljit_sw)(jump->u.label->addr - addr) >= -0x02000000); - *buf_ptr |= ((jump->u.label->addr - addr) >> 2) & 0x00ffffff; + if (jump->flags & JUMP_MOV_ADDR) { +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + SLJIT_ASSERT((buf_ptr[0] & (sljit_ins)0xffff0000) == 0xe59f0000); +#else /* !SLJIT_CONFIG_ARM_V6 */ + SLJIT_ASSERT((buf_ptr[0] & ~(sljit_ins)0xf000) == 0); +#endif /* SLJIT_CONFIG_ARM_V6 */ + + if (jump->flags & PATCH_B) { + SLJIT_ASSERT((((sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset)) & 0x3) == 0); + diff = ((sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset)) >> 2; + + SLJIT_ASSERT(diff <= 0xff && diff >= -0xff); + + addr = ADD; + if (diff < 0) { + diff = -diff; + addr = SUB; + } + + buf_ptr[0] = addr | (buf_ptr[0] & 0xf000) | RN(TMP_PC) | (1 << 25) | (0xf << 8) | (sljit_ins)(diff & 0xff); + } else { +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr; +#else /* !SLJIT_CONFIG_ARM_V6 */ + buf_ptr[1] = MOVT | buf_ptr[0] | ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff); + buf_ptr[0] = MOVW | buf_ptr[0] | ((addr << 4) & 0xf0000) | (addr & 0xfff); +#endif /* SLJIT_CONFIG_ARM_V6 */ } - else { - SLJIT_ASSERT((sljit_sw)(jump->u.target - addr) <= 0x01ffffff && (sljit_sw)(jump->u.target - addr) >= -0x02000000); - *buf_ptr |= ((jump->u.target - addr) >> 2) & 0x00ffffff; - } - } - else if (jump->flags & SLJIT_REWRITABLE_JUMP) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - jump->addr = (sljit_uw)code_ptr; - code_ptr[0] = (sljit_uw)buf_ptr; - code_ptr[1] = *buf_ptr; - inline_set_jump_addr((sljit_uw)code_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); - code_ptr += 2; -#else - inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); -#endif - } - else { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + } else if (jump->flags & PATCH_B) { + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset); + SLJIT_ASSERT(diff <= 0x01ffffff && diff >= -0x02000000); + *buf_ptr |= (diff >> 2) & 0x00ffffff; + } else { +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (jump->flags & IS_BL) buf_ptr--; - if (*buf_ptr & (1 << 23)) - buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2; - else - buf_ptr += 1; - *buf_ptr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; -#else - inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); -#endif + + if (jump->flags & SLJIT_REWRITABLE_JUMP) { + jump->addr = (sljit_uw)code_ptr; + code_ptr[0] = (sljit_ins)buf_ptr; + code_ptr[1] = *buf_ptr; + set_jump_addr((sljit_uw)code_ptr, executable_offset, addr, 0); + code_ptr += 2; + } else { + if (*buf_ptr & (1 << 23)) + buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2; + else + buf_ptr += 1; + *buf_ptr = addr; + } +#else /* !SLJIT_CONFIG_ARM_V6 */ + set_jump_addr((sljit_uw)buf_ptr, executable_offset, addr, 0); +#endif /* SLJIT_CONFIG_ARM_V6 */ } + jump = jump->next; } -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) const_ = compiler->consts; while (const_) { - buf_ptr = (sljit_uw*)const_->addr; + buf_ptr = (sljit_ins*)const_->addr; const_->addr = (sljit_uw)code_ptr; - code_ptr[0] = (sljit_uw)buf_ptr; + code_ptr[0] = (sljit_ins)buf_ptr; code_ptr[1] = *buf_ptr; if (*buf_ptr & (1 << 23)) buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2; else buf_ptr += 1; /* Set the value again (can be a simple constant). */ - inline_set_const((sljit_uw)code_ptr, executable_offset, *buf_ptr, 0); + set_const_value((sljit_uw)code_ptr, executable_offset, *buf_ptr, 0); code_ptr += 2; const_ = const_->next; } -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ - put_label = compiler->put_labels; - while (put_label) { - addr = put_label->label->addr; - buf_ptr = (sljit_uw*)put_label->addr; - -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - SLJIT_ASSERT((buf_ptr[0] & 0xffff0000) == 0xe59f0000); - buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr; -#else - SLJIT_ASSERT((buf_ptr[-1] & 0xfff00000) == MOVW && (buf_ptr[0] & 0xfff00000) == MOVT); - buf_ptr[-1] |= ((addr << 4) & 0xf0000) | (addr & 0xfff); - buf_ptr[0] |= ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff); -#endif - put_label = put_label->next; - } - - SLJIT_ASSERT(code_ptr - code <= (sljit_s32)size); + SLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size); compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_uw); - code = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); - code_ptr = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + code = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); SLJIT_CACHE_FLUSH(code, code_ptr); SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1); @@ -953,29 +1104,42 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) { switch (feature_type) { case SLJIT_HAS_FPU: + case SLJIT_HAS_F64_AS_F32_PAIR: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #else /* Available by default. */ return 1; -#endif +#endif /* SLJIT_IS_FPU_AVAILABLE */ + case SLJIT_HAS_SIMD: +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + return 0; +#else +#ifdef SLJIT_IS_FPU_AVAILABLE + return (SLJIT_IS_FPU_AVAILABLE) != 0; +#else + /* Available by default. */ + return 1; +#endif /* SLJIT_IS_FPU_AVAILABLE */ +#endif /* SLJIT_CONFIG_ARM_V6 */ + case SLJIT_SIMD_REGS_ARE_PAIRS: case SLJIT_HAS_CLZ: case SLJIT_HAS_ROT: case SLJIT_HAS_CMOV: -#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) - case SLJIT_HAS_CTZ: case SLJIT_HAS_REV: case SLJIT_HAS_PREFETCH: -#endif case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: + case SLJIT_HAS_ATOMIC: return 1; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) case SLJIT_HAS_CTZ: +#if defined(SLJIT_CONFIG_ARM_V6) && SLJIT_CONFIG_ARM_V6 return 2; -#endif +#else + return 1; +#endif /* SLJIT_CONFIG_ARM_V6 */ default: return 0; @@ -995,17 +1159,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) #define LOAD_DATA 0x08 /* Flag bits for emit_op. */ -#define ALLOW_IMM 0x10 -#define ALLOW_INV_IMM 0x20 -#define ALLOW_ANY_IMM (ALLOW_IMM | ALLOW_INV_IMM) -#define ALLOW_NEG_IMM 0x40 +#define ALLOW_IMM 0x10 +#define ALLOW_INV_IMM 0x20 +#define ALLOW_ANY_IMM (ALLOW_IMM | ALLOW_INV_IMM) +#define ALLOW_NEG_IMM 0x40 +#define ALLOW_DOUBLE_IMM 0x80 /* s/l - store/load (1 bit) u/s - signed/unsigned (1 bit) w/b/h/N - word/byte/half/NOT allowed (2 bit) Storing signed and unsigned values are the same operations. */ -static const sljit_uw data_transfer_insts[16] = { +static const sljit_ins data_transfer_insts[16] = { /* s u w */ 0xe5000000 /* str */, /* s u b */ 0xe5400000 /* strb */, /* s u h */ 0xe10000b0 /* strh */, @@ -1026,7 +1191,7 @@ static const sljit_uw data_transfer_insts[16] = { }; #define EMIT_DATA_TRANSFER(type, add, target_reg, base_reg, arg) \ - (data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (sljit_uw)(arg)) + (data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (sljit_ins)(arg)) /* Normal ldr/str instruction. Type2: ldrsb, ldrh, ldrsh */ @@ -1036,7 +1201,7 @@ static const sljit_uw data_transfer_insts[16] = { (((imm) & 0xf) | (((imm) & 0xf0) << 4) | (1 << 22)) #define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \ - ((sljit_uw)(opcode) | (sljit_uw)(mode) | VD(dst) | VM(src1) | VN(src2)) + ((sljit_ins)(opcode) | (sljit_ins)(mode) | VD(dst) | VM(src1) | VN(src2)) /* Flags for emit_op: */ /* Arguments are swapped. */ @@ -1108,12 +1273,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi } if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) { - FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); + FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_ins)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); } else { if (fsaveds > 0) - FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); + FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_ins)fsaveds << 1))); if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) - FAIL_IF(push_inst(compiler, VPUSH | VD(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); + FAIL_IF(push_inst(compiler, VPUSH | VD(fscratches) | ((sljit_ins)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); } } @@ -1142,7 +1307,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi FAIL_IF(push_inst(compiler, VMOV2 | (offset << 10) | ((offset + sizeof(sljit_sw)) << 14) | float_arg_count)); else FAIL_IF(push_inst(compiler, VLDR_F32 | 0x800100 | RN(SLJIT_SP) - | (float_arg_count << 12) | ((offset + (sljit_uw)size - 4 * sizeof(sljit_sw)) >> 2))); + | (float_arg_count << 12) | ((offset + (sljit_ins)size - 4 * sizeof(sljit_sw)) >> 2))); float_arg_count++; offset += sizeof(sljit_f64) - sizeof(sljit_sw); break; @@ -1151,7 +1316,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi FAIL_IF(push_inst(compiler, VMOV | (float_arg_count << 16) | (offset << 10))); else FAIL_IF(push_inst(compiler, VLDR_F32 | 0x800000 | RN(SLJIT_SP) - | (float_arg_count << 12) | ((offset + (sljit_uw)size - 4 * sizeof(sljit_sw)) >> 2))); + | (float_arg_count << 12) | ((offset + (sljit_ins)size - 4 * sizeof(sljit_sw)) >> 2))); float_arg_count++; break; default: @@ -1168,7 +1333,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi if (offset < 4 * sizeof(sljit_sw)) FAIL_IF(push_inst(compiler, MOV | RD(tmp) | (offset >> 2))); else - FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(tmp) | (offset + (sljit_uw)size - 4 * sizeof(sljit_sw)))); + FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(tmp) | (offset + (sljit_ins)size - 4 * sizeof(sljit_sw)))); break; } @@ -1221,7 +1386,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi #endif if (local_size > 0) - FAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size)); + FAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM | ALLOW_DOUBLE_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size)); return SLJIT_SUCCESS; } @@ -1250,13 +1415,8 @@ static sljit_s32 emit_add_sp(struct sljit_compiler *compiler, sljit_uw imm) { sljit_uw imm2 = get_imm(imm); - if (imm2 == 0) { - imm2 = (imm & ~(sljit_uw)0x3ff) >> 10; - imm = (imm & 0x3ff) >> 2; - - FAIL_IF(push_inst(compiler, ADD | SRC2_IMM | RD(SLJIT_SP) | RN(SLJIT_SP) | 0xb00 | imm2)); - return push_inst(compiler, ADD | SRC2_IMM | RD(SLJIT_SP) | RN(SLJIT_SP) | 0xf00 | (imm & 0xff)); - } + if (imm2 == 0) + return emit_op(compiler, SLJIT_ADD, ALLOW_IMM | ALLOW_DOUBLE_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, (sljit_sw)imm); return push_inst(compiler, ADD | RD(SLJIT_SP) | RN(SLJIT_SP) | imm2); } @@ -1279,12 +1439,12 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit FAIL_IF(emit_add_sp(compiler, (sljit_uw)local_size)); if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) { - FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); + FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_ins)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); } else { if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) - FAIL_IF(push_inst(compiler, VPOP | VD(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); + FAIL_IF(push_inst(compiler, VPOP | VD(fscratches) | ((sljit_ins)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); if (fsaveds > 0) - FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); + FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_ins)fsaveds << 1))); } local_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1) & 0x7; @@ -1335,10 +1495,10 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit if (frame_size == 0) return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | 0x800008); if (frame_size > 2 * SSIZE_OF(sw)) - return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)(frame_size - (2 * SSIZE_OF(sw)))); + return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)(frame_size - (2 * SSIZE_OF(sw)))); } - FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)local_size)); + FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)local_size)); tmp = 1; } else if (frame_size == 0) { frame_size = (restored_reg == TMP_REG2) ? SSIZE_OF(sw) : 2 * SSIZE_OF(sw); @@ -1354,7 +1514,7 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit local_size += SSIZE_OF(sw); if (frame_size > local_size) - FAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | (sljit_uw)(frame_size - local_size))); + FAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | (sljit_ins)(frame_size - local_size))); else if (frame_size < local_size) FAIL_IF(emit_add_sp(compiler, (sljit_uw)(local_size - frame_size))); @@ -1366,11 +1526,11 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit if (restored_reg != TMP_REG2) frame_size -= SSIZE_OF(sw); - return push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)frame_size); + return push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)frame_size); } tmp = (restored_reg == TMP_REG2) ? 0x800004 : 0x800008; - return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)tmp); + return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)tmp); } if (local_size > 0) @@ -1389,7 +1549,7 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit FAIL_IF(push_inst(compiler, POP | reg_list)); if (frame_size > 0) - return push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | ((sljit_uw)frame_size - sizeof(sljit_sw))); + return push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | ((sljit_ins)frame_size - sizeof(sljit_sw))); if (lr_dst != 0) return SLJIT_SUCCESS; @@ -1437,7 +1597,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl sljit_s32 is_masked; sljit_uw shift_type; - switch (GET_OPCODE(op)) { + switch (op) { case SLJIT_MOV: SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); if (dst != src2) { @@ -1451,17 +1611,10 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MOV_U8: case SLJIT_MOV_S8: SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); - if (flags & MOVE_REG_CONV) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - if (op == SLJIT_MOV_U8) - return push_inst(compiler, AND | RD(dst) | RN(src2) | SRC2_IMM | 0xff); - FAIL_IF(push_inst(compiler, MOV | RD(dst) | (24 << 7) | RM(src2))); - return push_inst(compiler, MOV | RD(dst) | (24 << 7) | (op == SLJIT_MOV_U8 ? 0x20 : 0x40) | RM(dst)); -#else + if (flags & MOVE_REG_CONV) return push_inst(compiler, (op == SLJIT_MOV_U8 ? UXTB : SXTB) | RD(dst) | RM(src2)); -#endif - } - else if (dst != src2) { + + if (dst != src2) { SLJIT_ASSERT(src2 & SRC2_IMM); return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2); } @@ -1470,15 +1623,10 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_MOV_U16: case SLJIT_MOV_S16: SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); - if (flags & MOVE_REG_CONV) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - FAIL_IF(push_inst(compiler, MOV | RD(dst) | (16 << 7) | RM(src2))); - return push_inst(compiler, MOV | RD(dst) | (16 << 7) | (op == SLJIT_MOV_U16 ? 0x20 : 0x40) | RM(dst)); -#else + if (flags & MOVE_REG_CONV) return push_inst(compiler, (op == SLJIT_MOV_U16 ? UXTH : SXTH) | RD(dst) | RM(src2)); -#endif - } - else if (dst != src2) { + + if (dst != src2) { SLJIT_ASSERT(src2 & SRC2_IMM); return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2); } @@ -1492,30 +1640,30 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_CTZ: SLJIT_ASSERT(!(flags & INV_IMM) && !(src2 & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) FAIL_IF(push_inst(compiler, RSB | SRC2_IMM | RD(TMP_REG1) | RN(src2) | 0)); FAIL_IF(push_inst(compiler, AND | RD(TMP_REG2) | RN(src2) | RM(TMP_REG1))); FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(TMP_REG2))); FAIL_IF(push_inst(compiler, CMP | SET_FLAGS | SRC2_IMM | RN(dst) | 32)); return push_inst(compiler, (EOR ^ 0xf0000000) | SRC2_IMM | RD(dst) | RN(dst) | 0x1f); -#else /* !SLJIT_CONFIG_ARM_V5 */ +#else /* !SLJIT_CONFIG_ARM_V6 */ FAIL_IF(push_inst(compiler, RBIT | RD(dst) | RM(src2))); return push_inst(compiler, CLZ | RD(dst) | RM(dst)); -#endif /* SLJIT_CONFIG_ARM_V5 */ +#endif /* SLJIT_CONFIG_ARM_V6 */ case SLJIT_REV: -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (8 << 7) | (0 << 5) | RM(src2))); - FAIL_IF(push_inst(compiler, MOV | RD(dst) | (24 << 7) | (1 << 5) | RM(src2))); - FAIL_IF(push_inst(compiler, ORR | RD(dst) | RN(dst) | (16 << 7) | (0 << 5) | RM(TMP_REG1))); - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (16 << 7) | (1 << 5) | RM(TMP_REG1))); - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (8 << 7) | (3 << 5) | RM(TMP_REG1))); - FAIL_IF(push_inst(compiler, ORR | RD(dst) | RN(dst) | (8 << 7) | (0 << 5) | RM(TMP_REG1))); - return push_inst(compiler, ORR | RD(dst) | RN(dst) | (8 << 7) | (1 << 5) | RM(TMP_REG1)); -#else /* !SLJIT_CONFIG_ARM_V5 */ + case SLJIT_REV_U32: + case SLJIT_REV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); return push_inst(compiler, REV | RD(dst) | RM(src2)); -#endif /* SLJIT_CONFIG_ARM_V5 */ + case SLJIT_REV_U16: + case SLJIT_REV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED) && src2 != TMP_REG1 && dst != TMP_REG1); + FAIL_IF(push_inst(compiler, REV16 | RD(dst) | RM(src2))); + if (dst == TMP_REG2 || (src2 == TMP_REG2 && op == SLJIT_REV_U16)) + return SLJIT_SUCCESS; + return push_inst(compiler, (op == SLJIT_REV_U16 ? UXTH : SXTH) | RD(dst) | RM(dst)); case SLJIT_ADD: SLJIT_ASSERT(!(flags & INV_IMM)); @@ -1546,7 +1694,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(!(src2 & SRC2_IMM)); compiler->status_flags_state = 0; - if (!HAS_FLAGS(op)) + if (!(flags & SET_FLAGS)) return push_inst(compiler, MUL | RN(dst) | RM8(src2) | RM(src1)); FAIL_IF(push_inst(compiler, SMULL | RN(TMP_REG1) | RD(dst) | RM8(src2) | RM(src1))); @@ -1574,19 +1722,19 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl case SLJIT_SHL: case SLJIT_MSHL: shift_type = 0; - is_masked = GET_OPCODE(op) == SLJIT_MSHL; + is_masked = op == SLJIT_MSHL; break; case SLJIT_LSHR: case SLJIT_MLSHR: shift_type = 1; - is_masked = GET_OPCODE(op) == SLJIT_MLSHR; + is_masked = op == SLJIT_MLSHR; break; case SLJIT_ASHR: case SLJIT_MASHR: shift_type = 2; - is_masked = GET_OPCODE(op) == SLJIT_MASHR; + is_masked = op == SLJIT_MASHR; break; case SLJIT_ROTL: @@ -1626,7 +1774,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl } return push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst) - | RM8(src2) | (sljit_uw)(shift_type << 5) | 0x10 | RM(src1)); + | RM8(src2) | (sljit_ins)(shift_type << 5) | 0x10 | RM(src1)); } #undef EMIT_SHIFT_INS_AND_RETURN @@ -1643,8 +1791,7 @@ static sljit_uw get_imm(sljit_uw imm) if (!(imm & 0xff000000)) { imm <<= 8; rol = 8; - } - else { + } else { imm = (imm << 24) | (imm >> 8); rol = 0; } @@ -1666,22 +1813,19 @@ static sljit_uw get_imm(sljit_uw imm) if (!(imm & 0x00ffffff)) return SRC2_IMM | (imm >> 24) | (rol << 8); - else - return 0; + return 0; } -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) -static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm, sljit_s32 positive) +static sljit_uw compute_imm(sljit_uw imm, sljit_uw* imm2) { sljit_uw mask; sljit_uw imm1; - sljit_uw imm2; sljit_uw rol; /* Step1: Search a zero byte (8 continous zero bit). */ mask = 0xff000000; rol = 8; - while(1) { + while (1) { if (!(imm & mask)) { /* Rol imm by rol. */ imm = (imm << rol) | (imm >> (32 - rol)); @@ -1689,6 +1833,7 @@ static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sl rol = 4 + (rol >> 1); break; } + rol += 2; mask >>= 2; if (mask & 0x3) { @@ -1718,9 +1863,8 @@ static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sl if (!(imm & 0xff000000)) { imm1 = SRC2_IMM | ((imm >> 16) & 0xff) | (((rol + 4) & 0xf) << 8); - imm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8); - } - else if (imm & 0xc0000000) { + *imm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8); + } else if (imm & 0xc0000000) { imm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8); imm <<= 8; rol += 4; @@ -1741,11 +1885,10 @@ static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sl } if (!(imm & 0x00ffffff)) - imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + *imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); else return 0; - } - else { + } else { if (!(imm & 0xf0000000)) { imm <<= 4; rol += 2; @@ -1771,25 +1914,23 @@ static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sl } if (!(imm & 0x00ffffff)) - imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + *imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); else return 0; } - FAIL_IF(push_inst(compiler, (positive ? MOV : MVN) | RD(reg) | imm1)); - FAIL_IF(push_inst(compiler, (positive ? ORR : BIC) | RD(reg) | RN(reg) | imm2)); - return 1; + return imm1; } -#endif static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm) { sljit_uw tmp; - -#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + sljit_uw imm1, imm2; +#else /* !SLJIT_CONFIG_ARM_V6 */ if (!(imm & ~(sljit_uw)0xffff)) return push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)); -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ /* Create imm by 1 inst. */ tmp = get_imm(imm); @@ -1800,19 +1941,28 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, if (tmp) return push_inst(compiler, MVN | RD(reg) | tmp); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) /* Create imm by 2 inst. */ - FAIL_IF(generate_int(compiler, reg, imm, 1)); - FAIL_IF(generate_int(compiler, reg, ~imm, 0)); + imm1 = compute_imm(imm, &imm2); + if (imm1 != 0) { + FAIL_IF(push_inst(compiler, MOV | RD(reg) | imm1)); + return push_inst(compiler, ORR | RD(reg) | RN(reg) | imm2); + } + + imm1 = compute_imm(~imm, &imm2); + if (imm1 != 0) { + FAIL_IF(push_inst(compiler, MVN | RD(reg) | imm1)); + return push_inst(compiler, BIC | RD(reg) | RN(reg) | imm2); + } /* Load integer. */ return push_inst_with_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), imm); -#else +#else /* !SLJIT_CONFIG_ARM_V6 */ FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff))); if (imm <= 0xffff) return SLJIT_SUCCESS; return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff)); -#endif +#endif /* SLJIT_CONFIG_ARM_V6 */ } static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, @@ -1849,13 +1999,13 @@ static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, s argw &= 0x3; if (argw != 0 && (mask == 0xff)) { - FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | ((sljit_uw)argw << 7))); + FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | ((sljit_ins)argw << 7))); return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg, TYPE2_TRANSFER_IMM(0))); } /* Bit 25: RM is offset. */ return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, - RM(offset_reg) | (mask == 0xff ? 0 : (1 << 25)) | ((sljit_uw)argw << 7))); + RM(offset_reg) | (mask == 0xff ? 0 : (1 << 25)) | ((sljit_ins)argw << 7))); } arg &= REG_MASK; @@ -1917,10 +2067,16 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 /* We prefers register and simple consts. */ sljit_s32 dst_reg; - sljit_s32 src1_reg; + sljit_s32 src1_reg = 0; sljit_s32 src2_reg = 0; sljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0; sljit_s32 neg_op = 0; + sljit_u32 imm2; + + op = GET_OPCODE(op); + + if (flags & SET_FLAGS) + inp_flags &= ~ALLOW_DOUBLE_IMM; if (dst == TMP_REG2) flags |= UNUSED_RETURN; @@ -1928,7 +2084,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 SLJIT_ASSERT(!(inp_flags & ALLOW_INV_IMM) || (inp_flags & ALLOW_IMM)); if (inp_flags & ALLOW_NEG_IMM) { - switch (GET_OPCODE(op)) { + switch (op) { case SLJIT_ADD: compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD; neg_op = SLJIT_SUB; @@ -1952,10 +2108,11 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 if (!(inp_flags & ALLOW_IMM)) break; - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { src2_reg = (sljit_s32)get_imm((sljit_uw)src2w); if (src2_reg) break; + if (inp_flags & ALLOW_INV_IMM) { src2_reg = (sljit_s32)get_imm(~(sljit_uw)src2w); if (src2_reg) { @@ -1963,8 +2120,9 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 break; } } + if (neg_op != 0) { - src2_reg = (sljit_s32)get_imm((sljit_uw)-src2w); + src2_reg = (sljit_s32)get_imm((neg_op == SLJIT_ADD || neg_op == SLJIT_SUB) ? (sljit_uw)-src2w : ~(sljit_uw)src2w); if (src2_reg) { op = neg_op | GET_ALL_FLAGS(op); break; @@ -1972,7 +2130,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 } } - if (src1 & SLJIT_IMM) { + if (src1 == SLJIT_IMM) { src2_reg = (sljit_s32)get_imm((sljit_uw)src1w); if (src2_reg) { flags |= ARGS_SWAPPED; @@ -1980,6 +2138,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 src1w = src2w; break; } + if (inp_flags & ALLOW_INV_IMM) { src2_reg = (sljit_s32)get_imm(~(sljit_uw)src1w); if (src2_reg) { @@ -1989,8 +2148,11 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 break; } } + if (neg_op >= SLJIT_SUB) { /* Note: additive operation (commutative). */ + SLJIT_ASSERT(op == SLJIT_ADD || op == SLJIT_ADDC); + src2_reg = (sljit_s32)get_imm((sljit_uw)-src1w); if (src2_reg) { src1 = src2; @@ -2008,8 +2170,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 else if (src1 & SLJIT_MEM) { FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1)); src1_reg = TMP_REG1; - } - else { + } else if (!(inp_flags & ALLOW_DOUBLE_IMM) || src2_reg != 0 || op == SLJIT_SUB || op == SLJIT_SUBC) { FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w)); src1_reg = TMP_REG1; } @@ -2038,8 +2199,62 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 src2_reg = src2; else if (src2 & SLJIT_MEM) FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, src2_reg, src2, src2w, TMP_REG2)); - else + else if (!(inp_flags & ALLOW_DOUBLE_IMM)) FAIL_IF(load_immediate(compiler, src2_reg, (sljit_uw)src2w)); + else { + SLJIT_ASSERT(!(flags & SET_FLAGS)); + + if (src1_reg == 0) { + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w)); + src1_reg = TMP_REG1; + } + + src2_reg = (sljit_s32)compute_imm((sljit_uw)src2w, &imm2); + + if (src2_reg == 0 && neg_op != 0) { + src2_reg = (sljit_s32)compute_imm((sljit_uw)-src2w, &imm2); + if (src2_reg != 0) + op = neg_op; + } + + if (src2_reg == 0) { + FAIL_IF(load_immediate(compiler, TMP_REG2, (sljit_uw)src2w)); + src2_reg = TMP_REG2; + } else { + FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src1_reg, (sljit_uw)src2_reg)); + src1_reg = dst_reg; + src2_reg = (sljit_s32)imm2; + + if (op == SLJIT_ADDC) + op = SLJIT_ADD; + else if (op == SLJIT_SUBC) + op = SLJIT_SUB; + } + } + } + + if (src1_reg == 0) { + SLJIT_ASSERT((inp_flags & ALLOW_DOUBLE_IMM) && !(flags & SET_FLAGS)); + + src1_reg = (sljit_s32)compute_imm((sljit_uw)src1w, &imm2); + + if (src1_reg == 0 && neg_op != 0) { + src1_reg = (sljit_s32)compute_imm((sljit_uw)-src1w, &imm2); + if (src1_reg != 0) + op = neg_op; + } + + if (src1_reg == 0) { + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w)); + src1_reg = TMP_REG1; + } else { + FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src2_reg, (sljit_uw)src1_reg)); + src1_reg = dst_reg; + src2_reg = (sljit_s32)imm2; + + if (op == SLJIT_ADDC) + op = SLJIT_ADD; + } } FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src1_reg, (sljit_uw)src2_reg)); @@ -2129,7 +2344,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile SLJIT_ASSERT(saved_reg_list[1] < 8); FAIL_IF(push_inst(compiler, LDR | 0x8d0004 | (saved_reg_list[1] << 12) /* ldr rX, [sp, #4] */)); } - return push_inst(compiler, (LDR ^ (1 << 24)) | 0x8d0000 | (sljit_uw)(saved_reg_count >= 3 ? 16 : 8) + return push_inst(compiler, (LDR ^ (1 << 24)) | 0x8d0000 | (sljit_ins)(saved_reg_count >= 3 ? 16 : 8) | (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */); } return SLJIT_SUCCESS; @@ -2159,21 +2374,27 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw); case SLJIT_MOV_U8: - return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw); case SLJIT_MOV_S8: - return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw); case SLJIT_MOV_U16: - return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw); case SLJIT_MOV_S16: - return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw); case SLJIT_CLZ: case SLJIT_CTZ: case SLJIT_REV: + case SLJIT_REV_U32: + case SLJIT_REV_S32: return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U16: + case SLJIT_REV_S16: + return emit_op(compiler, op, HALF_SIZE, dst, dstw, TMP_REG1, 0, src, srcw); } return SLJIT_SUCCESS; @@ -2197,14 +2418,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile case SLJIT_ADDC: case SLJIT_SUB: case SLJIT_SUBC: - return emit_op(compiler, op, ALLOW_IMM | ALLOW_NEG_IMM, dst, dstw, src1, src1w, src2, src2w); + return emit_op(compiler, op, ALLOW_IMM | ALLOW_NEG_IMM | ALLOW_DOUBLE_IMM, dst, dstw, src1, src1w, src2, src2w); case SLJIT_OR: - return emit_op(compiler, op, ALLOW_IMM, dst, dstw, src1, src1w, src2, src2w); + return emit_op(compiler, op, ALLOW_IMM | ALLOW_DOUBLE_IMM, dst, dstw, src1, src1w, src2, src2w); case SLJIT_XOR: - inp_flags = ALLOW_IMM; - if (((src1 & SLJIT_IMM) && src1w == -1) || ((src2 & SLJIT_IMM) && src2w == -1)) { + inp_flags = ALLOW_IMM | ALLOW_DOUBLE_IMM; + if ((src1 == SLJIT_IMM && src1w == -1) || (src2 == SLJIT_IMM && src2w == -1)) { inp_flags |= ALLOW_INV_IMM; } return emit_op(compiler, op, inp_flags, dst, dstw, src1, src1w, src2, src2w); @@ -2223,7 +2444,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile case SLJIT_MASHR: case SLJIT_ROTL: case SLJIT_ROTR: - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { compiler->shift_imm = src2w & 0x1f; return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src1, src1w); } else { @@ -2268,15 +2489,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); /* Shift type of ROR is 3. */ - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= 0x1f; if (src3w == 0) return SLJIT_SUCCESS; - FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM(src1_reg) | ((sljit_uw)(is_left ? 0 : 1) << 5) | ((sljit_uw)src3w << 7))); + FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM(src1_reg) | ((sljit_ins)(is_left ? 0 : 1) << 5) | ((sljit_ins)src3w << 7))); src3w = (src3w ^ 0x1f) + 1; - return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM(src2_reg) | ((sljit_uw)(is_left ? 1 : 0) << 5) | ((sljit_uw)src3w << 7)); + return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM(src2_reg) | ((sljit_ins)(is_left ? 1 : 0) << 5) | ((sljit_ins)src3w << 7)); } if (src3 & SLJIT_MEM) { @@ -2289,10 +2510,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * src3 = TMP_REG2; } - FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM8(src3) | ((sljit_uw)(is_left ? 0 : 1) << 5) | 0x10 | RM(src1_reg))); - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src2_reg) | ((sljit_uw)(is_left ? 1 : 0) << 5) | (1 << 7))); + FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM8(src3) | ((sljit_ins)(is_left ? 0 : 1) << 5) | 0x10 | RM(src1_reg))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src2_reg) | ((sljit_ins)(is_left ? 1 : 0) << 5) | (1 << 7))); FAIL_IF(push_inst(compiler, EOR | SRC2_IMM | RD(TMP_REG2) | RN(src3) | 0x1f)); - return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM8(TMP_REG2) | ((sljit_uw)(is_left ? 1 : 0) << 5) | 0x10 | RM(TMP_REG1)); + return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM8(TMP_REG2) | ((sljit_ins)(is_left ? 1 : 0) << 5) | 0x10 | RM(TMP_REG1)); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, @@ -2318,12 +2539,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp case SLJIT_PREFETCH_L2: case SLJIT_PREFETCH_L3: case SLJIT_PREFETCH_ONCE: -#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) SLJIT_ASSERT(src & SLJIT_MEM); return emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1); -#else /* !SLJIT_CONFIG_ARM_V7 */ - return SLJIT_SUCCESS; -#endif /* SLJIT_CONFIG_ARM_V7 */ } return SLJIT_SUCCESS; @@ -2369,16 +2586,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); - return (freg_map[reg] << 1); + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type == SLJIT_FLOAT_REGISTER || type == SLJIT_SIMD_REG_64) + return freg_map[reg]; + + if (type != SLJIT_SIMD_REG_128) + return freg_map[reg] & ~0x1; + + return -1; } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, @@ -2388,7 +2609,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c CHECK_ERROR(); CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); - return push_inst(compiler, *(sljit_uw*)instruction); + return push_inst(compiler, *(sljit_ins*)instruction); } /* --------------------------------------------------------------------- */ @@ -2397,18 +2618,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c #define FPU_LOAD (1 << 20) #define EMIT_FPU_DATA_TRANSFER(inst, add, base, freg, offs) \ - ((inst) | (sljit_uw)((add) << 23) | RN(base) | VD(freg) | (sljit_uw)(offs)) + ((inst) | (sljit_ins)((add) << 23) | RN(base) | VD(freg) | (sljit_ins)(offs)) static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) { sljit_uw imm; - sljit_uw inst = VSTR_F32 | (flags & (SLJIT_32 | FPU_LOAD)); + sljit_ins inst = VSTR_F32 | (flags & (SLJIT_32 | FPU_LOAD)); SLJIT_ASSERT(arg & SLJIT_MEM); arg &= ~SLJIT_MEM; if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { - FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (((sljit_uw)argw & 0x3) << 7))); + FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (((sljit_ins)argw & 0x3) << 7))); arg = TMP_REG2; argw = 0; } @@ -2463,14 +2684,12 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - op ^= SLJIT_32; - if (FAST_IS_REG(src)) FAIL_IF(push_inst(compiler, VMOV | RD(src) | VN(TMP_FREG1))); else if (src & SLJIT_MEM) { @@ -2482,13 +2701,27 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp FAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | VN(TMP_FREG1))); } - FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_32, dst_r, TMP_FREG1, 0))); + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(ins, ins & SLJIT_32, dst_r, TMP_FREG1, 0))); if (dst & SLJIT_MEM) - return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw); + return emit_fop_mem(compiler, (ins & SLJIT_32), TMP_FREG1, dst, dstw); return SLJIT_SUCCESS; } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_S32 | (~op & SLJIT_32), dst, dstw, src, srcw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_U32 | (~op & SLJIT_32), dst, dstw, src, srcw); +} + static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) @@ -2506,7 +2739,12 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile } FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_32, src1, src2, 0))); - return push_inst(compiler, VMRS); + FAIL_IF(push_inst(compiler, VMRS)); + + if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL) + return SLJIT_SUCCESS; + + return push_inst(compiler, (CMP - CONDITIONAL) | (0x60000000 /* VS */) | SET_FLAGS | RN(TMP_REG1) | RM(TMP_REG1)); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -2587,18 +2825,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil case SLJIT_ADD_F64: FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_32, dst_r, src2, src1))); break; - case SLJIT_SUB_F64: FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_32, dst_r, src2, src1))); break; - case SLJIT_MUL_F64: FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_32, dst_r, src2, src1))); break; - case SLJIT_DIV_F64: FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_32, dst_r, src2, src1))); break; + case SLJIT_COPYSIGN_F64: + FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(src2) | RD(TMP_REG1) | ((op & SLJIT_32) ? (1 << 7) : 0))); + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_32, dst_r, src1, 0))); + FAIL_IF(push_inst(compiler, CMP | SET_FLAGS | RN(TMP_REG1) | SRC2_IMM | 0)); + return push_inst(compiler, EMIT_FPU_OPERATION((VNEG_F32 & ~COND_MASK) | 0xb0000000, op & SLJIT_32, dst_r, dst_r, 0)); } if (dst_r == TMP_FREG1) @@ -2609,11 +2849,79 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil #undef EMIT_FPU_DATA_TRANSFER +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ +#if defined(__ARM_NEON) && __ARM_NEON + sljit_u32 exp; + sljit_ins ins; +#endif /* NEON */ + union { + sljit_u32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + +#if defined(__ARM_NEON) && __ARM_NEON + if ((u.imm << (32 - 19)) == 0) { + exp = (u.imm >> (23 + 2)) & 0x3f; + + if (exp == 0x20 || exp == 0x1f) { + ins = ((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f); + return push_inst(compiler, (VMOV_F32 ^ (1 << 6)) | ((ins & 0xf0) << 12) | VD(freg) | (ins & 0xf)); + } + } +#endif /* NEON */ + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + return push_inst(compiler, VMOV | VN(freg) | RD(TMP_REG1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ +#if defined(__ARM_NEON) && __ARM_NEON + sljit_u32 exp; + sljit_ins ins; +#endif /* NEON */ + union { + sljit_u32 imm[2]; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + +#if defined(__ARM_NEON) && __ARM_NEON + if (u.imm[0] == 0 && (u.imm[1] << (64 - 48)) == 0) { + exp = (u.imm[1] >> ((52 - 32) + 2)) & 0x1ff; + + if (exp == 0x100 || exp == 0xff) { + ins = ((u.imm[1] >> (56 - 32)) & 0x80) | ((u.imm[1] >> (48 - 32)) & 0x7f); + return push_inst(compiler, (VMOV_F32 ^ (1 << 6)) | (1 << 8) | ((ins & 0xf0) << 12) | VD(freg) | (ins & 0xf)); + } + } +#endif /* NEON */ + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0])); + if (u.imm[0] == u.imm[1]) + return push_inst(compiler, VMOV2 | RN(TMP_REG1) | RD(TMP_REG1) | VM(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1])); + return push_inst(compiler, VMOV2 | RN(TMP_REG2) | RD(TMP_REG1) | VM(freg)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { sljit_s32 reg2; - sljit_uw inst; + sljit_ins inst; CHECK_ERROR(); CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg)); @@ -2640,19 +2948,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) +static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: + case SLJIT_ATOMIC_STORED: case SLJIT_F_EQUAL: case SLJIT_ORDERED_EQUAL: - case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */ + case SLJIT_UNORDERED_OR_EQUAL: return 0x00000000; case SLJIT_NOT_EQUAL: + case SLJIT_ATOMIC_NOT_STORED: case SLJIT_F_NOT_EQUAL: case SLJIT_UNORDERED_OR_NOT_EQUAL: - case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */ + case SLJIT_ORDERED_NOT_EQUAL: return 0x10000000; case SLJIT_CARRY: @@ -2757,31 +3067,29 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile SLJIT_ASSERT(reg_map[TMP_REG1] != 14); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (type >= SLJIT_FAST_CALL) PTR_FAIL_IF(prepare_blx(compiler)); + + jump->addr = compiler->size; PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(compiler, type), 0)); - if (jump->flags & SLJIT_REWRITABLE_JUMP) { - jump->addr = compiler->size; + if (jump->flags & SLJIT_REWRITABLE_JUMP) compiler->patches++; - } if (type >= SLJIT_FAST_CALL) { jump->flags |= IS_BL; + jump->addr = compiler->size; PTR_FAIL_IF(emit_blx(compiler)); } - - if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) - jump->addr = compiler->size; -#else +#else /* !SLJIT_CONFIG_ARM_V6 */ + jump->addr = compiler->size; if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; - PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(compiler, type))); - jump->addr = compiler->size; -#endif + compiler->size += JUMP_MAX_SIZE - 1; +#endif /* SLJIT_CONFIG_ARM_V6 */ return jump; } @@ -2799,7 +3107,7 @@ static sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit sljit_u8 *offset_ptr = offsets; if (src && FAST_IS_REG(*src)) - src_offset = (sljit_uw)reg_map[*src] * sizeof(sljit_sw); + src_offset = (sljit_u32)reg_map[*src] * sizeof(sljit_sw); arg_types >>= SLJIT_ARG_SHIFT; @@ -2834,7 +3142,7 @@ static sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit if (is_tail_call) offset += sizeof(sljit_sw); - offset = ((offset - 4 * sizeof(sljit_sw)) + 0x7) & ~(sljit_uw)0x7; + offset = ((offset - 4 * sizeof(sljit_sw)) + 0x7) & ~(sljit_u32)0x7; *extra_space = offset; @@ -2964,8 +3272,6 @@ static sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit #endif /* __SOFTFP__ */ -#undef EMIT_FPU_OPERATION - SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types) { @@ -3032,7 +3338,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi SLJIT_ASSERT(reg_map[TMP_REG1] != 14); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { if (FAST_IS_REG(src)) { SLJIT_ASSERT(reg_map[src] != 14); return push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(src)); @@ -3049,17 +3355,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); jump->u.target = (sljit_uw)srcw; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) if (type >= SLJIT_FAST_CALL) FAIL_IF(prepare_blx(compiler)); - FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0), 0)); - if (type >= SLJIT_FAST_CALL) - FAIL_IF(emit_blx(compiler)); -#else - FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); - FAIL_IF(push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1))); -#endif jump->addr = compiler->size; + FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0), 0)); + if (type >= SLJIT_FAST_CALL) { + jump->addr = compiler->size; + FAIL_IF(emit_blx(compiler)); + } +#else /* !SLJIT_CONFIG_ARM_V6 */ + jump->addr = compiler->size; + FAIL_IF(push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1))); + compiler->size += JUMP_MAX_SIZE - 1; +#endif /* SLJIT_CONFIG_ARM_V6 */ return SLJIT_SUCCESS; } @@ -3157,7 +3466,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co sljit_s32 type) { sljit_s32 dst_reg, flags = GET_ALL_FLAGS(op); - sljit_uw cc, ins; + sljit_ins cc, ins; CHECK_ERROR(); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); @@ -3193,61 +3502,114 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { - sljit_uw cc, tmp; + sljit_ins cc, tmp; CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (src2_reg != dst_reg && src1 == dst_reg) { + src1 = src2_reg; + src1w = 0; + src2_reg = dst_reg; + type ^= 0x1; + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, (src2_reg != dst_reg) ? dst_reg : TMP_REG1, src1, src1w, TMP_REG2)); + + if (src2_reg != dst_reg) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + src1 = TMP_REG1; + src1w = 0; + } + } else if (dst_reg != src2_reg) + FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM(src2_reg))); cc = get_cc(compiler, type & ~SLJIT_32); - if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { - tmp = get_imm((sljit_uw)srcw); + if (SLJIT_UNLIKELY(src1 == SLJIT_IMM)) { + tmp = get_imm((sljit_uw)src1w); if (tmp) return push_inst(compiler, ((MOV | RD(dst_reg) | tmp) & ~COND_MASK) | cc); - tmp = get_imm(~(sljit_uw)srcw); + tmp = get_imm(~(sljit_uw)src1w); if (tmp) return push_inst(compiler, ((MVN | RD(dst_reg) | tmp) & ~COND_MASK) | cc); #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) - tmp = (sljit_uw)srcw; + tmp = (sljit_ins)src1w; FAIL_IF(push_inst(compiler, (MOVW & ~COND_MASK) | cc | RD(dst_reg) | ((tmp << 4) & 0xf0000) | (tmp & 0xfff))); if (tmp <= 0xffff) return SLJIT_SUCCESS; return push_inst(compiler, (MOVT & ~COND_MASK) | cc | RD(dst_reg) | ((tmp >> 12) & 0xf0000) | ((tmp >> 16) & 0xfff)); -#else - FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw)); - src = TMP_REG1; -#endif +#else /* !SLJIT_CONFIG_ARM_V7 */ + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w)); + src1 = TMP_REG1; +#endif /* SLJIT_CONFIG_ARM_V7 */ } - return push_inst(compiler, ((MOV | RD(dst_reg) | RM(src)) & ~COND_MASK) | cc); + return push_inst(compiler, ((MOV | RD(dst_reg) | RM(src1)) & ~COND_MASK) | cc); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_ins cc; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + type ^= SLJIT_32; + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, (type & SLJIT_32), dst_freg, src2_freg, 0))); + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w)); + src1 = TMP_FREG1; + } + + cc = get_cc(compiler, type & ~SLJIT_32); + return push_inst(compiler, EMIT_FPU_OPERATION((VMOV_F32 & ~COND_MASK) | cc, (type & SLJIT_32), dst_freg, src1, 0)); +} + +#undef EMIT_FPU_OPERATION + static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem, sljit_sw *memw, sljit_s32 max_offset) { sljit_s32 arg = *mem; sljit_sw argw = *memw; sljit_uw imm, tmp; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - sljit_sw mask = max_offset >= 0xf00 ? 0xfff : 0xff; - sljit_sw sign = max_offset >= 0xf00 ? 0x1000 : 0x100; -#else /* !SLJIT_CONFIG_ARM_V5 */ sljit_sw mask = 0xfff; sljit_sw sign = 0x1000; SLJIT_ASSERT(max_offset >= 0xf00); -#endif /* SLJIT_CONFIG_ARM_V5 */ *mem = TMP_REG1; if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { *memw = 0; - return push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((sljit_uw)(argw & 0x3) << 7)); + return push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((sljit_ins)(argw & 0x3) << 7)); } arg &= REG_MASK; @@ -3295,158 +3657,6 @@ static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(arg)); } -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - -static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 reg, - sljit_s32 mem, sljit_sw memw) -{ - sljit_s32 flags, steps, tmp_reg; - sljit_uw add, shift; - - switch (type & 0xff) { - case SLJIT_MOV_U8: - case SLJIT_MOV_S8: - flags = BYTE_SIZE; - if (!(type & SLJIT_MEM_STORE)) - flags |= LOAD_DATA; - if ((type & 0xff) == SLJIT_MOV_S8) - flags |= SIGNED; - - return emit_op_mem(compiler, flags, reg, mem, memw, TMP_REG1); - - case SLJIT_MOV_U16: - FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 1)); - flags = BYTE_SIZE; - steps = 1; - break; - - case SLJIT_MOV_S16: - FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xff - 1)); - flags = BYTE_SIZE | SIGNED; - steps = 1; - break; - - default: - if (type & SLJIT_MEM_UNALIGNED_32) { - flags = WORD_SIZE; - if (!(type & SLJIT_MEM_STORE)) - flags |= LOAD_DATA; - - return emit_op_mem(compiler, flags, reg, mem, memw, TMP_REG1); - } - - if (!(type & SLJIT_MEM_UNALIGNED_16)) { - FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 3)); - flags = BYTE_SIZE; - steps = 3; - break; - } - - FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xff - 2)); - - add = 1; - if (memw < 0) { - add = 0; - memw = -memw; - } - - tmp_reg = reg; - - if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE, add, reg, mem, TYPE2_TRANSFER_IMM(memw)))); - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(reg) | (16 << 7) | (2 << 4))); - } else { - if (reg == mem) { - SLJIT_ASSERT(reg != TMP_REG1); - tmp_reg = TMP_REG1; - } - - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE | LOAD_DATA, add, tmp_reg, mem, TYPE2_TRANSFER_IMM(memw)))); - } - - if (!add) { - memw -= 2; - if (memw <= 0) { - memw = -memw; - add = 1; - } - } else - memw += 2; - - if (type & SLJIT_MEM_STORE) - return push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw))); - - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE | LOAD_DATA, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw)))); - return push_inst(compiler, ORR | RD(reg) | RN(tmp_reg) | RM(TMP_REG2) | (16 << 7)); - } - - SLJIT_ASSERT(steps > 0); - - add = 1; - if (memw < 0) { - add = 0; - memw = -memw; - } - - if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE, add, reg, mem, memw))); - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(reg) | (8 << 7) | (2 << 4))); - - while (1) { - if (!add) { - memw -= 1; - if (memw == 0) - add = 1; - } else - memw += 1; - - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE, add, TMP_REG2, mem, memw))); - - if (--steps == 0) - return SLJIT_SUCCESS; - - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(TMP_REG2) | (8 << 7) | (2 << 4))); - } - } - - tmp_reg = reg; - - if (reg == mem) { - SLJIT_ASSERT(reg != TMP_REG1); - tmp_reg = TMP_REG1; - } - - shift = 8; - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE | LOAD_DATA, add, tmp_reg, mem, memw))); - - do { - if (!add) { - memw -= 1; - if (memw == 0) - add = 1; - } else - memw += 1; - - if (steps > 1) { - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE | LOAD_DATA, add, TMP_REG2, mem, memw))); - FAIL_IF(push_inst(compiler, ORR | RD(tmp_reg) | RN(tmp_reg) | RM(TMP_REG2) | (shift << 7))); - shift += 8; - } - } while (--steps != 0); - - flags |= LOAD_DATA; - - if (flags & SIGNED) - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(flags, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw)))); - else - FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(flags, add, TMP_REG2, mem, memw))); - - return push_inst(compiler, ORR | RD(reg) | RN(tmp_reg) | RM(TMP_REG2) | (shift << 7)); -} - -#endif /* SLJIT_CONFIG_ARM_V5 */ - SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) @@ -3456,30 +3666,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile CHECK_ERROR(); CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); - if (!(reg & REG_PAIR_MASK)) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - ADJUST_LOCAL_OFFSET(mem, memw); -#endif /* SLJIT_CONFIG_ARM_V5 */ - + if (!(reg & REG_PAIR_MASK)) return sljit_emit_mem_unaligned(compiler, type, reg, mem, memw); - } ADJUST_LOCAL_OFFSET(mem, memw); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16)) { - FAIL_IF(update_mem_addr(compiler, &mem, &memw, (type & SLJIT_MEM_UNALIGNED_16) ? 0xfff - 6 : 0xfff - 7)); - - if (!(type & SLJIT_MEM_STORE) && REG_PAIR_FIRST(reg) == (mem & REG_MASK)) { - FAIL_IF(sljit_emit_mem_unaligned(compiler, type, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), memw + SSIZE_OF(sw))); - return sljit_emit_mem_unaligned(compiler, type, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw); - } - - FAIL_IF(sljit_emit_mem_unaligned(compiler, type, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw)); - return sljit_emit_mem_unaligned(compiler, type, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), memw + SSIZE_OF(sw)); - } -#endif /* SLJIT_CONFIG_ARM_V5 */ - FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4)); flags = WORD_SIZE; @@ -3502,7 +3693,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler * sljit_s32 mem, sljit_sw memw) { sljit_s32 flags; - sljit_uw is_type1_transfer, inst; + sljit_ins is_type1_transfer, inst; CHECK_ERROR(); CHECK(check_sljit_emit_mem_update(compiler, type, reg, mem, memw)); @@ -3561,7 +3752,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler * if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { memw &= 0x3; - inst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | ((sljit_uw)memw << 7)); + inst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | ((sljit_ins)memw << 7)); if (is_type1_transfer) inst |= (1 << 25); @@ -3587,7 +3778,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler * else memw = -memw; - return push_inst(compiler, inst | (sljit_uw)memw); + return push_inst(compiler, inst | (sljit_ins)memw); } if (memw >= 0) @@ -3595,76 +3786,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler * else memw = -memw; - return push_inst(compiler, inst | TYPE2_TRANSFER_IMM((sljit_uw)memw)); + return push_inst(compiler, inst | TYPE2_TRANSFER_IMM((sljit_ins)memw)); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw) { -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - sljit_s32 max_offset; - sljit_s32 dst; -#endif /* SLJIT_CONFIG_ARM_V5 */ - CHECK_ERROR(); CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw)); - if (type & SLJIT_MEM_UNALIGNED_32) + if (type & SLJIT_MEM_ALIGNED_32) return emit_fop_mem(compiler, ((type ^ SLJIT_32) & SLJIT_32) | ((type & SLJIT_MEM_STORE) ? 0 : FPU_LOAD), freg, mem, memw); -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | RD(TMP_REG2))); - - if (type & SLJIT_32) - return sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw); - - max_offset = 0xfff - 7; - if (type & SLJIT_MEM_UNALIGNED_16) - max_offset++; - - FAIL_IF(update_mem_addr(compiler, &mem, &memw, max_offset)); - mem |= SLJIT_MEM; - - FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw)); - - FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | 0x80 | RD(TMP_REG2))); - return sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw + 4); - } - - max_offset = (type & SLJIT_32) ? 0xfff - 3 : 0xfff - 7; - if (type & SLJIT_MEM_UNALIGNED_16) - max_offset++; - - FAIL_IF(update_mem_addr(compiler, &mem, &memw, max_offset)); - - dst = TMP_REG1; - - /* Stack offset adjustment is not needed because dst - is not stored on the stack when mem is SLJIT_SP. */ - - if (mem == TMP_REG1) { - dst = SLJIT_R3; - - if (compiler->scratches >= 4) - FAIL_IF(push_inst(compiler, STR | (1 << 21) | RN(SLJIT_SP) | RD(SLJIT_R3) | 8)); - } - - mem |= SLJIT_MEM; - - FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | (type & SLJIT_MEM_UNALIGNED_16), dst, mem, memw)); - FAIL_IF(push_inst(compiler, VMOV | VN(freg) | RD(dst))); - - if (!(type & SLJIT_32)) { - FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | (type & SLJIT_MEM_UNALIGNED_16), dst, mem, memw + 4)); - FAIL_IF(push_inst(compiler, VMOV | VN(freg) | 0x80 | RD(dst))); - } - - if (dst == SLJIT_R3 && compiler->scratches >= 4) - FAIL_IF(push_inst(compiler, (LDR ^ (0x1 << 24)) | (0x1 << 23) | RN(SLJIT_SP) | RD(SLJIT_R3) | 8)); - return SLJIT_SUCCESS; -#else /* !SLJIT_CONFIG_ARM_V5 */ if (type & SLJIT_MEM_STORE) { FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | RD(TMP_REG2))); @@ -3690,11 +3824,714 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, mem, memw, TMP_REG1)); FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, mem, memw + 4, TMP_REG1)); return push_inst(compiler, VMOV2 | VM(freg) | RD(TMP_REG2) | RN(TMP_REG1)); -#endif /* SLJIT_CONFIG_ARM_V5 */ +} + +static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw) +{ + sljit_s32 mem = *mem_ptr; + sljit_uw imm; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + *mem_ptr = TMP_REG1; + return push_inst(compiler, ADD | RD(TMP_REG1) | RN(mem & REG_MASK) | RM(OFFS_REG(mem)) | ((sljit_ins)(memw & 0x3) << 7)); + } + + if (SLJIT_UNLIKELY(!(mem & REG_MASK))) { + *mem_ptr = TMP_REG1; + return load_immediate(compiler, TMP_REG1, (sljit_uw)memw); + } + + mem &= REG_MASK; + + if (memw == 0) { + *mem_ptr = mem; + return SLJIT_SUCCESS; + } + + *mem_ptr = TMP_REG1; + imm = get_imm((sljit_uw)(memw < 0 ? -memw : memw)); + + if (imm != 0) + return push_inst(compiler, ((memw < 0) ? SUB : ADD) | RD(TMP_REG1) | RN(mem) | imm); + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)memw)); + return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(mem)); +} + +static SLJIT_INLINE sljit_s32 simd_get_quad_reg_index(sljit_s32 freg) +{ + freg += freg & 0x1; + + SLJIT_ASSERT((freg_map[freg] & 0x1) == (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)); + + if (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS) + freg--; + + return freg; +} + +#define SLJIT_QUAD_OTHER_HALF(freg) ((((freg) & 0x1) << 1) - 1) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (!(srcdst & SLJIT_MEM)) { + if (reg_size == 4) + srcdst = simd_get_quad_reg_index(srcdst); + + if (type & SLJIT_SIMD_STORE) + ins = VD(srcdst) | VN(freg) | VM(freg); + else + ins = VD(freg) | VN(srcdst) | VM(srcdst); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst(compiler, VORR | ins); + } + + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + if (elem_size > 3) + elem_size = 3; + + ins = ((type & SLJIT_SIMD_STORE) ? VST1 : VLD1) | VD(freg) + | (sljit_ins)((reg_size == 3) ? (0x7 << 8) : (0xa << 8)); + + SLJIT_ASSERT(reg_size >= alignment); + + if (alignment == 3) + ins |= 0x10; + else if (alignment >= 3) + ins |= 0x20; + + return push_inst(compiler, ins | RN(srcdst) | ((sljit_ins)elem_size) << 6 | 0xf); +} + +static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value) +{ + sljit_ins result; + + if (elem_size > 1 && (sljit_u16)value == (value >> 16)) { + elem_size = 1; + value = (sljit_u16)value; + } + + if (elem_size == 1 && (sljit_u8)value == (value >> 8)) { + elem_size = 0; + value = (sljit_u8)value; + } + + switch (elem_size) { + case 0: + SLJIT_ASSERT(value <= 0xff); + result = 0xe00; + break; + case 1: + SLJIT_ASSERT(value <= 0xffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x800; + break; + } + + if ((value & 0xff) == 0) { + value >>= 8; + result |= 0xa00; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value ^= (sljit_uw)0xffff; + result = (1 << 5); + } + break; + default: + SLJIT_ASSERT(value <= 0xffffffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x000; + break; + } + + if ((value & ~(sljit_uw)0xff00) == 0) { + value >>= 8; + result |= 0x200; + break; + } + + if ((value & ~(sljit_uw)0xff0000) == 0) { + value >>= 16; + result |= 0x400; + break; + } + + if ((value & ~(sljit_uw)0xff000000) == 0) { + value >>= 24; + result |= 0x600; + break; + } + + if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) { + value >>= 8; + result |= 0xc00; + break; + } + + if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) { + value >>= 16; + result |= 0xd00; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value = ~value; + result = (1 << 5); + } + break; + } + + return ((sljit_ins)value & 0xf) | (((sljit_ins)value & 0x70) << 12) | (((sljit_ins)value & 0x80) << 17) | result; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imm; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (src == SLJIT_IMM && srcw == 0) + return push_inst(compiler, VMOV_i | ((reg_size == 4) ? (1 << 6) : 0) | VD(freg)); + + if (SLJIT_UNLIKELY(elem_size == 3)) { + SLJIT_ASSERT(type & SLJIT_SIMD_FLOAT); + + if (src & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, FPU_LOAD | SLJIT_32, freg, src, srcw)); + src = freg; + } else if (freg != src) + FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (freg != src) + return push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src)); + return SLJIT_SUCCESS; + } + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + + ins = (sljit_ins)(elem_size << 6); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 5; + + return push_inst(compiler, VLD1_r | ins | VD(freg) | RN(src) | 0xf); + } + + if (type & SLJIT_SIMD_FLOAT) { + SLJIT_ASSERT(elem_size == 2); + ins = ((sljit_ins)freg_ebit_map[src] << (16 + 2 + 1)) | ((sljit_ins)1 << (16 + 2)); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst(compiler, VDUP_s | ins | VD(freg) | (sljit_ins)freg_map[src]); + } + + if (src == SLJIT_IMM) { + if (elem_size < 2) + srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + imm = simd_get_imm(elem_size, (sljit_uw)srcw); + + if (imm != ~(sljit_ins)0) { + if (reg_size == 4) + imm |= (sljit_ins)1 << 6; + + return push_inst(compiler, VMOV_i | imm | VD(freg)); + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw)); + src = TMP_REG1; + } + + switch (elem_size) { + case 0: + ins = 1 << 22; + break; + case 1: + ins = 1 << 5; + break; + default: + ins = 0; + break; + } + + if (reg_size == 4) + ins |= (sljit_ins)1 << 21; + + return push_inst(compiler, VDUP | ins | VN(freg) | RD(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (type & SLJIT_SIMD_LANE_ZERO) { + ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 6); + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 3 && !(srcdst & SLJIT_MEM)) { + if (lane_index == 1) + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (srcdst != freg) + FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(srcdst) | VM(srcdst))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst(compiler, VMOV_i | VD(freg)); + } + + if (srcdst == freg || (elem_size == 3 && srcdst == (freg + SLJIT_QUAD_OTHER_HALF(freg)))) { + FAIL_IF(push_inst(compiler, VORR | ins | VD(TMP_FREG2) | VN(freg) | VM(freg))); + srcdst = TMP_FREG2; + srcdstw = 0; + } + } + + FAIL_IF(push_inst(compiler, VMOV_i | ins | VD(freg))); + } + + if (reg_size == 4 && lane_index >= (0x8 >> elem_size)) { + lane_index -= (0x8 >> elem_size); + freg += SLJIT_QUAD_OTHER_HALF(freg); + } + + if (srcdst & SLJIT_MEM) { + if (elem_size == 3) + return emit_fop_mem(compiler, ((type & SLJIT_SIMD_STORE) ? 0 : FPU_LOAD) | SLJIT_32, freg, srcdst, srcdstw); + + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + lane_index = lane_index << elem_size; + ins = (sljit_ins)((elem_size << 10) | (lane_index << 5)); + return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? VST1_s : VLD1_s) | ins | VD(freg) | RN(srcdst) | 0xf); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 3) { + if (type & SLJIT_SIMD_STORE) + return push_inst(compiler, VORR | VD(srcdst) | VN(freg) | VM(freg)); + return push_inst(compiler, VMOV_F32 | SLJIT_32 | VD(freg) | VM(srcdst)); + } + + if (type & SLJIT_SIMD_STORE) { + if (freg_ebit_map[freg] == 0) { + if (lane_index == 1) + freg = SLJIT_F64_SECOND(freg); + + return push_inst(compiler, VMOV_F32 | VD(srcdst) | VM(freg)); + } + + FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | ((sljit_ins)lane_index << 21) | VN(freg) | RD(TMP_REG1))); + return push_inst(compiler, VMOV | VN(srcdst) | RD(TMP_REG1)); + } + + FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(srcdst) | RD(TMP_REG1))); + return push_inst(compiler, VMOV_s | ((sljit_ins)lane_index << 21) | VN(freg) | RD(TMP_REG1)); + } + + if (srcdst == SLJIT_IMM) { + if (elem_size < 2) + srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcdstw)); + srcdst = TMP_REG1; + } + + if (elem_size == 0) + ins = 0x400000; + else if (elem_size == 1) + ins = 0x20; + else + ins = 0; + + lane_index = lane_index << elem_size; + ins |= (sljit_ins)(((lane_index & 0x4) << 19) | ((lane_index & 0x3) << 5)); + + if (type & SLJIT_SIMD_STORE) { + ins |= (1 << 20); + + if (elem_size < 2 && !(type & SLJIT_SIMD_LANE_SIGNED)) + ins |= (1 << 23); + } + + return push_inst(compiler, VMOV_s | ins | VN(freg) | RD(srcdst)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) { + freg = simd_get_quad_reg_index(freg); + src = simd_get_quad_reg_index(src); + + if (src_lane_index >= (0x8 >> elem_size)) { + src_lane_index -= (0x8 >> elem_size); + src += SLJIT_QUAD_OTHER_HALF(src); + } + } + + if (elem_size == 3) { + if (freg != src) + FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (freg != src) + return push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src)); + return SLJIT_SUCCESS; + } + + ins = ((((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size)); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst(compiler, VDUP_s | ins | VD(freg) | VM(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_s32 dst_reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + if (reg_size == 4 && elem2_size - elem_size == 1) + FAIL_IF(push_inst(compiler, VLD1 | (0x7 << 8) | VD(freg) | RN(src) | 0xf)); + else + FAIL_IF(push_inst(compiler, VLD1_s | (sljit_ins)((reg_size - elem2_size + elem_size) << 10) | VD(freg) | RN(src) | 0xf)); + src = freg; + } else if (reg_size == 4) + src = simd_get_quad_reg_index(src); + + if (!(type & SLJIT_SIMD_FLOAT)) { + dst_reg = (reg_size == 4) ? freg : TMP_FREG2; + + do { + FAIL_IF(push_inst(compiler, VSHLL | ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0 : (1 << 24)) + | ((sljit_ins)1 << (19 + elem_size)) | VD(dst_reg) | VM(src))); + src = dst_reg; + } while (++elem_size < elem2_size); + + if (dst_reg == TMP_FREG2) + return push_inst(compiler, VORR | VD(freg) | VN(TMP_FREG2) | VM(TMP_FREG2)); + return SLJIT_SUCCESS; + } + + /* No SIMD variant, must use VFP instead. */ + SLJIT_ASSERT(reg_size == 4); + + if (freg == src) { + freg += SLJIT_QUAD_OTHER_HALF(freg); + FAIL_IF(push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src) | 0x20)); + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src)); + } + + FAIL_IF(push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src))); + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src) | 0x20); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imms; + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + switch (elem_size) { + case 0: + imms = 0x243219; + ins = VSHR | (1 << 24) | (0x9 << 16); + break; + case 1: + imms = (reg_size == 4) ? 0x243219 : 0x2231; + ins = VSHR | (1 << 24) | (0x11 << 16); + break; + case 2: + imms = (reg_size == 4) ? 0x2231 : 0x21; + ins = VSHR | (1 << 24) | (0x21 << 16); + break; + default: + imms = 0x21; + ins = VSHR | (1 << 24) | (0x1 << 16) | (1 << 7); + break; + } + + if (reg_size == 4) { + freg = simd_get_quad_reg_index(freg); + ins |= (sljit_ins)1 << 6; + } + + SLJIT_ASSERT((freg_map[TMP_FREG2] & 0x1) == 0); + FAIL_IF(push_inst(compiler, ins | VD(TMP_FREG2) | VM(freg))); + + if (reg_size == 4 && elem_size > 0) + FAIL_IF(push_inst(compiler, VMOVN | ((sljit_ins)(elem_size - 1) << 18) | VD(TMP_FREG2) | VM(TMP_FREG2))); + + ins = (reg_size == 4 && elem_size == 0) ? (1 << 6) : 0; + + while (imms >= 0x100) { + FAIL_IF(push_inst(compiler, VSRA | (1 << 24) | ins | ((imms & 0xff) << 16) | VD(TMP_FREG2) | VM(TMP_FREG2))); + imms >>= 8; + } + + FAIL_IF(push_inst(compiler, VSRA | (1 << 24) | ins | (1 << 7) | (imms << 16) | VD(TMP_FREG2) | VM(TMP_FREG2))); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RD(dst_r) | VN(TMP_FREG2))); + + if (reg_size == 4 && elem_size == 0) { + SLJIT_ASSERT(freg_map[TMP_FREG2] + 1 == freg_map[TMP_FREG1]); + FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RD(TMP_REG2) | VN(TMP_FREG1))); + FAIL_IF(push_inst(compiler, ORR | RD(dst_r) | RN(dst_r) | RM(TMP_REG2) | (0x8 << 7))); + } + + if (dst_r == TMP_REG1) + return emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + switch (SLJIT_SIMD_GET_OPCODE(type)) { + case SLJIT_SIMD_OP2_AND: + ins = VAND; + break; + case SLJIT_SIMD_OP2_OR: + ins = VORR; + break; + case SLJIT_SIMD_OP2_XOR: + ins = VEOR; + break; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) { + dst_freg = simd_get_quad_reg_index(dst_freg); + src1_freg = simd_get_quad_reg_index(src1_freg); + src2_freg = simd_get_quad_reg_index(src2_freg); + ins |= (sljit_ins)1 << 6; + } + + return push_inst(compiler, ins | VD(dst_freg) | VN(src1_freg) | VM(src2_freg)); } #undef FPU_LOAD +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + sljit_u32 ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = LDREXB; + break; + case SLJIT_MOV_U16: + ins = LDREXH; + break; + default: + ins = LDREX; + break; + } + + return push_inst(compiler, ins | RN(mem_reg) | RD(dst_reg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_u32 ins; + + /* temp_reg == mem_reg is undefined so use another temp register */ + SLJIT_UNUSED_ARG(temp_reg); + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = STREXB; + break; + case SLJIT_MOV_U16: + ins = STREXH; + break; + default: + ins = STREX; + break; + } + + FAIL_IF(push_inst(compiler, ins | RN(mem_reg) | RD(TMP_REG1) | RM(src_reg))); + if (op & SLJIT_SET_ATOMIC_STORED) + return push_inst(compiler, CMP | SET_FLAGS | SRC2_IMM | RN(TMP_REG1)); + + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { struct sljit_const *const_; @@ -3704,58 +4541,62 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); ADJUST_LOCAL_OFFSET(dst, dstw); - dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; - -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - PTR_FAIL_IF(push_inst_with_unique_literal(compiler, - EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), (sljit_uw)init_value)); - compiler->patches++; -#else - PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value)); -#endif - const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); PTR_FAIL_IF(!const_); set_const(const_, compiler); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, + EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), (sljit_ins)init_value)); + compiler->patches++; +#else /* !SLJIT_CONFIG_ARM_V6 */ + PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value)); +#endif /* SLJIT_CONFIG_ARM_V6 */ + if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; -#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), 0)); compiler->patches++; -#else - PTR_FAIL_IF(emit_imm(compiler, dst_r, 0)); -#endif +#else /* !SLJIT_CONFIG_ARM_V6 */ + PTR_FAIL_IF(push_inst(compiler, RD(dst_r))); +#endif /* SLJIT_CONFIG_ARM_V6 */ - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 1); + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + compiler->size += 1; +#endif /* SLJIT_CONFIG_ARM_V7 */ if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); - return put_label; + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) { - inline_set_jump_addr(addr, executable_offset, new_target, 1); + set_jump_addr(addr, executable_offset, new_target, 1); } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) { - inline_set_const(addr, executable_offset, (sljit_uw)new_constant, 1); + set_const_value(addr, executable_offset, (sljit_uw)new_constant, 1); } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_64.c old mode 100644 new mode 100755 index c3215742f4..50e4c14dd3 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_64.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_64.c @@ -67,81 +67,125 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { /* Instrucion forms */ /* --------------------------------------------------------------------- */ -#define ADC 0x9a000000 -#define ADD 0x8b000000 -#define ADDE 0x8b200000 -#define ADDI 0x91000000 -#define AND 0x8a000000 -#define ANDI 0x92000000 -#define ASRV 0x9ac02800 -#define B 0x14000000 -#define B_CC 0x54000000 -#define BL 0x94000000 -#define BLR 0xd63f0000 -#define BR 0xd61f0000 -#define BRK 0xd4200000 -#define CBZ 0xb4000000 -#define CLZ 0xdac01000 -#define CSEL 0x9a800000 -#define CSINC 0x9a800400 -#define EOR 0xca000000 -#define EORI 0xd2000000 -#define EXTR 0x93c00000 -#define FABS 0x1e60c000 -#define FADD 0x1e602800 -#define FCMP 0x1e602000 -#define FCVT 0x1e224000 -#define FCVTZS 0x9e780000 -#define FDIV 0x1e601800 -#define FMOV 0x1e604000 -#define FMOV_R 0x9e660000 -#define FMUL 0x1e600800 -#define FNEG 0x1e614000 -#define FSUB 0x1e603800 -#define LDRI 0xf9400000 -#define LDRI_F64 0xfd400000 -#define LDRI_POST 0xf8400400 -#define LDP 0xa9400000 -#define LDP_F64 0x6d400000 -#define LDP_POST 0xa8c00000 -#define LDR_PRE 0xf8400c00 -#define LSLV 0x9ac02000 -#define LSRV 0x9ac02400 -#define MADD 0x9b000000 -#define MOVK 0xf2800000 -#define MOVN 0x92800000 -#define MOVZ 0xd2800000 -#define NOP 0xd503201f -#define ORN 0xaa200000 -#define ORR 0xaa000000 -#define ORRI 0xb2000000 -#define RBIT 0xdac00000 -#define RET 0xd65f0000 -#define REV 0xdac00c00 -#define RORV 0x9ac02c00 -#define SBC 0xda000000 -#define SBFM 0x93000000 -#define SCVTF 0x9e620000 -#define SDIV 0x9ac00c00 -#define SMADDL 0x9b200000 -#define SMULH 0x9b403c00 -#define STP 0xa9000000 -#define STP_F64 0x6d000000 -#define STP_PRE 0xa9800000 -#define STRB 0x38206800 -#define STRBI 0x39000000 -#define STRI 0xf9000000 -#define STRI_F64 0xfd000000 -#define STR_FI 0x3d000000 -#define STR_FR 0x3c206800 -#define STUR_FI 0x3c000000 -#define STURBI 0x38000000 -#define SUB 0xcb000000 -#define SUBI 0xd1000000 -#define SUBS 0xeb000000 -#define UBFM 0xd3000000 -#define UDIV 0x9ac00800 -#define UMULH 0x9bc03c00 +#define ADC 0x9a000000 +#define ADD 0x8b000000 +#define ADDE 0x8b200000 +#define ADDI 0x91000000 +#define ADR 0x10000000 +#define ADRP 0x90000000 +#define AND 0x8a000000 +#define ANDI 0x92000000 +#define AND_v 0x0e201c00 +#define ASRV 0x9ac02800 +#define B 0x14000000 +#define B_CC 0x54000000 +#define BL 0x94000000 +#define BLR 0xd63f0000 +#define BR 0xd61f0000 +#define BRK 0xd4200000 +#define CAS 0xc8a07c00 +#define CASB 0x08a07c00 +#define CASH 0x48a07c00 +#define CBZ 0xb4000000 +#define CCMPI 0xfa400800 +#define CLZ 0xdac01000 +#define CSEL 0x9a800000 +#define CSINC 0x9a800400 +#define DUP_e 0x0e000400 +#define DUP_g 0x0e000c00 +#define EOR 0xca000000 +#define EOR_v 0x2e201c00 +#define EORI 0xd2000000 +#define EXTR 0x93c00000 +#define FABS 0x1e60c000 +#define FADD 0x1e602800 +#define FCMP 0x1e602000 +#define FCSEL 0x1e600c00 +#define FCVT 0x1e224000 +#define FCVTL 0x0e217800 +#define FCVTZS 0x9e780000 +#define FDIV 0x1e601800 +#define FMOV 0x1e604000 +#define FMOV_R 0x9e660000 +#define FMOV_I 0x1e601000 +#define FMUL 0x1e600800 +#define FNEG 0x1e614000 +#define FSUB 0x1e603800 +#define INS 0x4e001c00 +#define INS_e 0x6e000400 +#define LD1 0x0c407000 +#define LD1_s 0x0d400000 +#define LD1R 0x0d40c000 +#define LDRI 0xf9400000 +#define LDRI_F64 0xfd400000 +#define LDRI_POST 0xf8400400 +#define LDP 0xa9400000 +#define LDP_F64 0x6d400000 +#define LDP_POST 0xa8c00000 +#define LDR_PRE 0xf8400c00 +#define LDXR 0xc85f7c00 +#define LDXRB 0x085f7c00 +#define LDXRH 0x485f7c00 +#define LSLV 0x9ac02000 +#define LSRV 0x9ac02400 +#define MADD 0x9b000000 +#define MOVI 0x0f000400 +#define MOVK 0xf2800000 +#define MOVN 0x92800000 +#define MOVZ 0xd2800000 +#define NOP 0xd503201f +#define ORN 0xaa200000 +#define ORR 0xaa000000 +#define ORR_v 0x0ea01c00 +#define ORRI 0xb2000000 +#define RBIT 0xdac00000 +#define RET 0xd65f0000 +#define REV 0xdac00c00 +#define REV16 0xdac00400 +#define RORV 0x9ac02c00 +#define SBC 0xda000000 +#define SBFM 0x93400000 +#define SCVTF 0x9e620000 +#define SDIV 0x9ac00c00 +#define SMADDL 0x9b200000 +#define SMOV 0x0e002c00 +#define SMULH 0x9b403c00 +#define SSHLL 0x0f00a400 +#define ST1 0x0c007000 +#define ST1_s 0x0d000000 +#define STP 0xa9000000 +#define STP_F64 0x6d000000 +#define STP_PRE 0xa9800000 +#define STRB 0x38206800 +#define STRBI 0x39000000 +#define STRI 0xf9000000 +#define STRI_F64 0xfd000000 +#define STR_FI 0x3d000000 +#define STR_FR 0x3c206800 +#define STUR_FI 0x3c000000 +#define STURBI 0x38000000 +#define STXR 0xc8007c00 +#define STXRB 0x8007c00 +#define STXRH 0x48007c00 +#define SUB 0xcb000000 +#define SUBI 0xd1000000 +#define SUBS 0xeb000000 +#define TBZ 0x36000000 +#define UBFM 0xd3400000 +#define UCVTF 0x9e630000 +#define UDIV 0x9ac00800 +#define UMOV 0x0e003c00 +#define UMULH 0x9bc03c00 +#define USHLL 0x2f00a400 +#define USHR 0x2f000400 +#define USRA 0x2f001400 +#define XTN 0x0e212800 + +#define CSET (CSINC | RM(TMP_ZERO) | RN(TMP_ZERO)) +#define LDR (STRI | (1 << 22)) +#define LDRB (STRBI | (1 << 22)) +#define LDRH (LDRB | (1 << 30)) +#define MOV (ORR | RN(TMP_ZERO)) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) { @@ -160,74 +204,260 @@ static SLJIT_INLINE sljit_s32 emit_imm64_const(struct sljit_compiler *compiler, return push_inst(compiler, MOVK | RD(dst) | ((sljit_ins)(imm >> 48) << 5) | (3 << 21)); } -static SLJIT_INLINE sljit_sw detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) { sljit_sw diff; sljit_uw target_addr; - if (jump->flags & SLJIT_REWRITABLE_JUMP) { - jump->flags |= PATCH_ABS64; - return 0; - } + if (jump->flags & SLJIT_REWRITABLE_JUMP) + goto exit; if (jump->flags & JUMP_ADDR) target_addr = jump->u.target; else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(jump->u.label != NULL); target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; } - diff = (sljit_sw)target_addr - (sljit_sw)(code_ptr + 4) - executable_offset; + diff = (sljit_sw)target_addr - (sljit_sw)code_ptr - executable_offset; if (jump->flags & IS_COND) { diff += SSIZE_OF(ins); if (diff <= 0xfffff && diff >= -0x100000) { - code_ptr[-5] ^= (jump->flags & IS_CBZ) ? (0x1 << 24) : 0x1; - jump->addr -= sizeof(sljit_ins); + *(--code_ptr) ^= (jump->flags & IS_CBZ) ? (0x1 << 24) : 0x1; jump->flags |= PATCH_COND; - return 5; + jump->addr -= sizeof(sljit_ins); + return code_ptr; } diff -= SSIZE_OF(ins); } if (diff <= 0x7ffffff && diff >= -0x8000000) { + if (jump->flags & IS_COND) + code_ptr[-1] -= (4 << 5); jump->flags |= PATCH_B; - return 4; + return code_ptr; } if (target_addr < 0x100000000l) { if (jump->flags & IS_COND) - code_ptr[-5] -= (2 << 5); - code_ptr[-2] = code_ptr[0]; - return 2; + code_ptr[-1] -= (2 << 5); + code_ptr[2] = code_ptr[0]; + return code_ptr + 2; + } + + if (diff <= 0xfffff000l && diff >= -0x100000000l) { + if (jump->flags & IS_COND) + code_ptr[-1] -= (2 << 5); + jump->flags |= PATCH_B32; + code_ptr[2] = code_ptr[0]; + return code_ptr + 2; } if (target_addr < 0x1000000000000l) { if (jump->flags & IS_COND) - code_ptr[-5] -= (1 << 5); + code_ptr[-1] -= (1 << 5); jump->flags |= PATCH_ABS48; - code_ptr[-1] = code_ptr[0]; + code_ptr[3] = code_ptr[0]; + return code_ptr + 3; + } + +exit: + jump->flags |= PATCH_ABS64; + code_ptr[4] = code_ptr[0]; + return code_ptr + 4; +} + +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_uw addr; + sljit_sw diff; + SLJIT_UNUSED_ARG(executable_offset); + + SLJIT_ASSERT(jump->flags < ((sljit_uw)4 << JUMP_SIZE_SHIFT)); + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + if (diff <= 0xfffff && diff >= -0x100000) { + jump->flags |= PATCH_B; + return 0; + } + + if (diff <= 0xfffff000l && diff >= -0x100000000l) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)1 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_B32; return 1; } - jump->flags |= PATCH_ABS64; - return 0; -} + if (addr < 0x100000000l) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)1 << JUMP_SIZE_SHIFT)); + return 1; + } -static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) -{ - if (max_label < 0x100000000l) { - put_label->flags = 0; + if (addr < 0x1000000000000l) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)2 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS48; return 2; } - if (max_label < 0x1000000000000l) { - put_label->flags = 1; - return 1; + SLJIT_ASSERT(jump->flags >= ((sljit_uw)3 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS64; + return 3; +} + +static SLJIT_INLINE void generate_jump_or_mov_addr(struct sljit_jump *jump, sljit_sw executable_offset) +{ + sljit_sw addr = (sljit_sw)((jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr); + sljit_ins* buf_ptr = (sljit_ins*)jump->addr; + sljit_u32 dst; + SLJIT_UNUSED_ARG(executable_offset); + + if (!(jump->flags & JUMP_MOV_ADDR)) { + if (jump->flags & PATCH_COND) { + addr = (addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT(addr <= 0x3ffff && addr >= -0x40000); + buf_ptr[0] = (buf_ptr[0] & ~(sljit_ins)0xffffe0) | (sljit_ins)((addr & 0x7ffff) << 5); + return; + } + + if (jump->flags & PATCH_B) { + addr = (addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT(addr <= 0x1ffffff && addr >= -0x2000000); + buf_ptr[0] = ((jump->flags & IS_BL) ? BL : B) | (sljit_ins)(addr & 0x3ffffff); + return; + } + + dst = (buf_ptr[0] >> 5) & 0x1f; + + if (jump->flags & PATCH_B32) { + addr -= (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset) & ~(sljit_sw)0xfff; + SLJIT_ASSERT(addr <= 0xfffff000l && addr >= -0x100000000l); + buf_ptr[0] = ADRP | (((sljit_ins)(addr >> 12) & 0x3) << 29) | (((sljit_ins)(addr >> 14) & 0x7ffff) << 5) | dst; + buf_ptr[1] = ADDI | dst | (dst << 5) | ((sljit_ins)(addr & 0xfff) << 10); + return; + } + } else { + dst = *buf_ptr; + + if (jump->flags & PATCH_B) { + addr -= (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); + SLJIT_ASSERT(addr <= 0xfffff && addr >= -0x100000); + buf_ptr[0] = ADR | (((sljit_ins)addr & 0x3) << 29) | (((sljit_ins)(addr >> 2) & 0x7ffff) << 5) | dst; + return; + } + + if (jump->flags & PATCH_B32) { + addr -= ((sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) & ~(sljit_sw)0xfff; + SLJIT_ASSERT(addr <= 0xffffffffl && addr >= -0x100000000l); + buf_ptr[0] = ADRP | (((sljit_ins)(addr >> 12) & 0x3) << 29) | (((sljit_ins)(addr >> 14) & 0x7ffff) << 5) | dst; + buf_ptr[1] = ADDI | dst | (dst << 5) | ((sljit_ins)(addr & 0xfff) << 10); + return; + } } - put_label->flags = 2; - return 0; + SLJIT_ASSERT((jump->flags & (PATCH_ABS48 | PATCH_ABS64)) || (sljit_uw)addr <= (sljit_uw)0xffffffff); + SLJIT_ASSERT((jump->flags & PATCH_ABS64) || (sljit_uw)addr <= (sljit_uw)0xffffffffffff); + + buf_ptr[0] = MOVZ | (((sljit_ins)addr & 0xffff) << 5) | dst; + buf_ptr[1] = MOVK | (((sljit_ins)(addr >> 16) & 0xffff) << 5) | (1 << 21) | dst; + if (jump->flags & (PATCH_ABS48 | PATCH_ABS64)) + buf_ptr[2] = MOVK | (((sljit_ins)(addr >> 32) & 0xffff) << 5) | (2 << 21) | dst; + + if (jump->flags & PATCH_ABS64) + buf_ptr[3] = MOVK | ((sljit_ins)((sljit_uw)addr >> 48) << 5) | (3 << 21) | dst; +} + +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + SLJIT_NEXT_DEFINE_TYPES; + sljit_uw total_size; + sljit_uw size_reduce = 0; + sljit_sw diff; + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + + while (1) { + SLJIT_GET_NEXT_MIN(); + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr == next_const_addr) { + const_->addr -= size_reduce; + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + continue; + } + + if (next_min_addr != next_jump_addr) + continue; + + jump->addr -= size_reduce; + if (!(jump->flags & JUMP_MOV_ADDR)) { + total_size = JUMP_MAX_SIZE; + + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) { + if (jump->flags & JUMP_ADDR) { + if (jump->u.target < 0x100000000l) + total_size = 3; + else if (jump->u.target < 0x1000000000000l) + total_size = 4; + } else { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if ((jump->flags & IS_COND) && (diff + 1) <= (0xfffff / SSIZE_OF(ins)) && (diff + 1) >= (-0x100000 / SSIZE_OF(ins))) + total_size = 0; + else if (diff <= (0x7ffffff / SSIZE_OF(ins)) && diff >= (-0x8000000 / SSIZE_OF(ins))) + total_size = 1; + else if (diff <= (0xfffff000l / SSIZE_OF(ins)) && diff >= (-0x100000000l / SSIZE_OF(ins))) + total_size = 3; + } + } + + size_reduce += JUMP_MAX_SIZE - total_size; + } else { + /* Real size minus 1. Unit size: instruction. */ + total_size = 3; + + if (!(jump->flags & JUMP_ADDR)) { + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if (diff <= (0xfffff / SSIZE_OF(ins)) && diff >= (-0x100000 / SSIZE_OF(ins))) + total_size = 0; + else if (diff <= (0xfffff000l / SSIZE_OF(ins)) && diff >= (-0x100000000l / SSIZE_OF(ins))) + total_size = 1; + } else if (jump->u.target < 0x100000000l) + total_size = 1; + else if (jump->u.target < 0x1000000000000l) + total_size = 2; + + size_reduce += 3 - total_size; + } + + jump->flags |= total_size << JUMP_SIZE_SHIFT; + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; } SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) @@ -238,67 +468,75 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; sljit_sw executable_offset; sljit_sw addr; - sljit_u32 dst; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); + + reduce_code_size(compiler); code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; code_ptr = code; word_count = 0; - next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - if (next_addr == word_count) { + if (next_min_addr == word_count) { SLJIT_ASSERT(!label || label->size >= word_count); SLJIT_ASSERT(!jump || jump->addr >= word_count); SLJIT_ASSERT(!const_ || const_->addr >= word_count); - SLJIT_ASSERT(!put_label || put_label->addr >= word_count); /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + if (next_min_addr == next_label_size) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (jump && jump->addr == word_count) { - jump->addr = (sljit_uw)(code_ptr - 4); - code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == word_count) { + + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { + word_count = word_count - 1 + (jump->flags >> JUMP_SIZE_SHIFT); + jump->addr = (sljit_uw)code_ptr; + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + SLJIT_ASSERT((jump->flags & PATCH_COND) || ((sljit_uw)code_ptr - jump->addr < (jump->flags >> JUMP_SIZE_SHIFT) * sizeof(sljit_ins))); + } else { + word_count += jump->flags >> JUMP_SIZE_SHIFT; + addr = (sljit_sw)code_ptr; + code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset); + jump->addr = (sljit_uw)addr; + } + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == word_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)(code_ptr - 3); - code_ptr -= put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; word_count++; @@ -308,7 +546,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } while (buf); if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; } @@ -316,61 +554,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; while (jump) { - do { - addr = (sljit_sw)((jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target); - buf_ptr = (sljit_ins *)jump->addr; - - if (jump->flags & PATCH_B) { - addr = (addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; - SLJIT_ASSERT(addr <= 0x1ffffff && addr >= -0x2000000); - buf_ptr[0] = ((jump->flags & IS_BL) ? BL : B) | (sljit_ins)(addr & 0x3ffffff); - if (jump->flags & IS_COND) - buf_ptr[-1] -= (4 << 5); - break; - } - if (jump->flags & PATCH_COND) { - addr = (addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; - SLJIT_ASSERT(addr <= 0x3ffff && addr >= -0x40000); - buf_ptr[0] = (buf_ptr[0] & ~(sljit_ins)0xffffe0) | (sljit_ins)((addr & 0x7ffff) << 5); - break; - } - - SLJIT_ASSERT((jump->flags & (PATCH_ABS48 | PATCH_ABS64)) || (sljit_uw)addr <= (sljit_uw)0xffffffff); - SLJIT_ASSERT((jump->flags & PATCH_ABS64) || (sljit_uw)addr <= (sljit_uw)0xffffffffffff); - - dst = buf_ptr[0] & 0x1f; - buf_ptr[0] = MOVZ | dst | (((sljit_ins)addr & 0xffff) << 5); - buf_ptr[1] = MOVK | dst | (((sljit_ins)(addr >> 16) & 0xffff) << 5) | (1 << 21); - if (jump->flags & (PATCH_ABS48 | PATCH_ABS64)) - buf_ptr[2] = MOVK | dst | (((sljit_ins)(addr >> 32) & 0xffff) << 5) | (2 << 21); - if (jump->flags & PATCH_ABS64) - buf_ptr[3] = MOVK | dst | ((sljit_ins)(addr >> 48) << 5) | (3 << 21); - } while (0); + generate_jump_or_mov_addr(jump, executable_offset); jump = jump->next; } - put_label = compiler->put_labels; - while (put_label) { - addr = (sljit_sw)put_label->label->addr; - buf_ptr = (sljit_ins*)put_label->addr; - - buf_ptr[0] |= ((sljit_ins)addr & 0xffff) << 5; - buf_ptr[1] |= ((sljit_ins)(addr >> 16) & 0xffff) << 5; - - if (put_label->flags >= 1) - buf_ptr[2] |= ((sljit_ins)(addr >> 32) & 0xffff) << 5; - - if (put_label->flags >= 2) - buf_ptr[3] |= (sljit_ins)(addr >> 48) << 5; - - put_label = put_label->next; - } - compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins); @@ -387,8 +578,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) { switch (feature_type) { case SLJIT_HAS_FPU: + case SLJIT_HAS_SIMD: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #else /* Available by default. */ return 1; @@ -402,6 +594,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) case SLJIT_HAS_PREFETCH: case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: + case SLJIT_HAS_ATOMIC: return 1; default: @@ -409,6 +602,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) } } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) +{ + switch (type) { + case SLJIT_UNORDERED_OR_EQUAL: + case SLJIT_ORDERED_NOT_EQUAL: + return 2; + } + + return 0; +} + /* --------------------------------------------------------------------- */ /* Core code generator functions. */ /* --------------------------------------------------------------------- */ @@ -642,6 +846,10 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s case SLJIT_CLZ: case SLJIT_CTZ: case SLJIT_REV: + case SLJIT_REV_U16: + case SLJIT_REV_S16: + case SLJIT_REV_U32: + case SLJIT_REV_S32: case SLJIT_ADDC: case SLJIT_SUBC: /* No form with immediate operand (except imm 0, which @@ -725,6 +933,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s inst_bits = ((sljit_ins)1 << 22) | (((sljit_ins)-imm & 0x3f) << 16) | ((63 - (sljit_ins)imm) << 10); } + inv_bits |= inv_bits >> 9; FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | inst_bits)); goto set_flags; case SLJIT_LSHR: @@ -734,6 +943,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s if (flags & ARG1_IMM) break; + inv_bits |= inv_bits >> 9; if (op >= SLJIT_ASHR) inv_bits |= 1 << 30; @@ -787,22 +997,22 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); if (dst == arg2) return SLJIT_SUCCESS; - return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + return push_inst(compiler, MOV | RD(dst) | RM(arg2)); case SLJIT_MOV_U8: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (7 << 10)); + inv_bits |= inv_bits >> 9; + return push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10)); case SLJIT_MOV_S8: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - if (!(flags & INT_OP)) - inv_bits |= 1 << 22; + inv_bits |= inv_bits >> 9; return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10)); case SLJIT_MOV_U16: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (15 << 10)); + inv_bits |= inv_bits >> 9; + return push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10)); case SLJIT_MOV_S16: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - if (!(flags & INT_OP)) - inv_bits |= 1 << 22; + inv_bits |= inv_bits >> 9; return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10)); case SLJIT_MOV32: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); @@ -811,7 +1021,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s /* fallthrough */ case SLJIT_MOV_U32: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - return push_inst(compiler, (ORR ^ W_OP) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + return push_inst(compiler, (MOV ^ W_OP) | RD(dst) | RM(arg2)); case SLJIT_MOV_S32: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); return push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(arg2) | (31 << 10)); @@ -826,6 +1036,21 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s SLJIT_ASSERT(arg1 == TMP_REG1); inv_bits |= inv_bits >> 21; return push_inst(compiler, (REV ^ inv_bits) | RD(dst) | RN(arg2)); + case SLJIT_REV_U16: + case SLJIT_REV_S16: + SLJIT_ASSERT(arg1 == TMP_REG1 && dst != TMP_REG2); + FAIL_IF(push_inst(compiler, (REV16 ^ (sljit_ins)0x80000000) | RD(dst) | RN(arg2))); + if (dst == TMP_REG1 || (arg2 == TMP_REG2 && op == SLJIT_REV_U16)) + return SLJIT_SUCCESS; + inv_bits |= inv_bits >> 9; + return push_inst(compiler, ((op == SLJIT_REV_U16 ? UBFM : SBFM) ^ inv_bits) | RD(dst) | RN(dst) | (15 << 10)); + case SLJIT_REV_U32: + case SLJIT_REV_S32: + SLJIT_ASSERT(arg1 == TMP_REG1 && dst != TMP_REG2); + FAIL_IF(push_inst(compiler, (REV ^ (sljit_ins)0x80000400) | RD(dst) | RN(arg2))); + if (op == SLJIT_REV_U32 || dst == TMP_REG1) + return SLJIT_SUCCESS; + return push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(dst) | (31 << 10)); case SLJIT_ADD: compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD; CHECK_FLAGS(1 << 29); @@ -955,14 +1180,20 @@ static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, s if (argw <= 0xff && argw >= -0x100) return push_inst(compiler, STURBI | type | RT(reg) | RN(arg) | (((sljit_ins)argw & 0x1ff) << 12)); - if (argw >= 0) { - if (argw <= 0xfff0ff && ((argw + 0x100) & 0xfff) <= 0x1ff) { + if (((argw + 0x100) & 0xfff) <= 0x1ff && argw <= 0xfff0ff && argw >= -0xfff100) { + if (argw >= 0) { + if (argw & 0x100) + argw += 0x1000; + FAIL_IF(push_inst(compiler, ADDI | (1 << 22) | RD(tmp_reg) | RN(arg) | (((sljit_ins)argw >> 12) << 10))); return push_inst(compiler, STURBI | type | RT(reg) | RN(tmp_reg) | (((sljit_ins)argw & 0x1ff) << 12)); + } else { + if (!(argw & 0x100)) + argw -= 0x1000; + + FAIL_IF(push_inst(compiler, SUBI | (1 << 22) | RD(tmp_reg) | RN(arg) | (((sljit_ins)-argw >> 12) << 10))); + return push_inst(compiler, STURBI | type | RT(reg) | RN(tmp_reg) | (((sljit_ins)argw & 0x1ff) << 12)); } - } else if (argw >= -0xfff100 && ((-argw + 0xff) & 0xfff) <= 0x1ff) { - FAIL_IF(push_inst(compiler, SUBI | (1 << 22) | RD(tmp_reg) | RN(arg) | (((sljit_ins)-argw >> 12) << 10))); - return push_inst(compiler, STURBI | type | RT(reg) | RN(tmp_reg) | (((sljit_ins)argw & 0x1ff) << 12)); } FAIL_IF(load_immediate(compiler, tmp_reg, argw)); @@ -1072,7 +1303,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi while (arg_types) { if ((arg_types & SLJIT_ARG_MASK) < SLJIT_ARG_TYPE_F64) { if (!(arg_types & SLJIT_ARG_TYPE_SCRATCH_REG)) { - FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0 - saved_arg_count) | RN(TMP_ZERO) | RM(tmp))); + FAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S0 - saved_arg_count) | RM(tmp))); saved_arg_count++; } tmp++; @@ -1279,7 +1510,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *c src = TMP_REG1; srcw = 0; } else if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) { - FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(src))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src))); src = TMP_REG1; srcw = 0; } @@ -1309,12 +1540,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile return push_inst(compiler, NOP); case SLJIT_LMUL_UW: case SLJIT_LMUL_SW: - FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(SLJIT_R0))); FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); case SLJIT_DIVMOD_UW: case SLJIT_DIVMOD_SW: - FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); + FAIL_IF(push_inst(compiler, (MOV ^ inv_bits) | RD(TMP_REG1) | RM(SLJIT_R0))); FAIL_IF(push_inst(compiler, ((op == SLJIT_DIVMOD_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1))); FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); @@ -1356,33 +1587,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile break; case SLJIT_MOV_U8: mem_flags = BYTE_SIZE; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_u8)srcw; break; case SLJIT_MOV_S8: mem_flags = BYTE_SIZE | SIGNED; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_s8)srcw; break; case SLJIT_MOV_U16: mem_flags = HALF_SIZE; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_u16)srcw; break; case SLJIT_MOV_S16: mem_flags = HALF_SIZE | SIGNED; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_s16)srcw; break; case SLJIT_MOV_U32: mem_flags = INT_SIZE; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_u32)srcw; break; case SLJIT_MOV_S32: case SLJIT_MOV32: mem_flags = INT_SIZE | SIGNED; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_s32)srcw; break; default: @@ -1391,7 +1622,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile break; } - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG1, srcw)); else if (!(src & SLJIT_MEM)) dst_r = src; @@ -1404,11 +1635,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile } flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0; - mem_flags = WORD_SIZE; - if (op_flags & SLJIT_32) { - flags |= INT_OP; + switch (op) { + case SLJIT_REV_U16: + case SLJIT_REV_S16: + mem_flags = HALF_SIZE; + break; + case SLJIT_REV_U32: + case SLJIT_REV_S32: mem_flags = INT_SIZE; + break; + default: + mem_flags = WORD_SIZE; + + if (op_flags & SLJIT_32) { + flags |= INT_OP; + mem_flags = INT_SIZE; + } + break; } if (src & SLJIT_MEM) { @@ -1458,12 +1702,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile src2 = TMP_REG2; } - if (src1 & SLJIT_IMM) + if (src1 == SLJIT_IMM) flags |= ARG1_IMM; else src1w = src1; - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) flags |= ARG2_IMM; else src2w = src2; @@ -1510,7 +1754,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * inv_bits = (op & SLJIT_32) ? W_OP : 0; - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { mask = inv_bits ? 0x1f : 0x3f; src3w &= mask; @@ -1528,7 +1772,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG2, src3, src3w, TMP_REG2)); src3 = TMP_REG2; } else if (dst_reg == src3) { - FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG2) | RN(TMP_ZERO) | RM(src3))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src3))); src3 = TMP_REG2; } @@ -1541,7 +1785,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * else imm = (sljit_ins)(inv_bits ? ((31 << 16) | (30 << 10)) : ((63 << 16) | (62 << 10) | (1 << 22))); - FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(TMP_REG1) | RN(src2_reg) | imm)); + FAIL_IF(push_inst(compiler, (UBFM ^ (inv_bits | (inv_bits >> 9))) | RD(TMP_REG1) | RN(src2_reg) | imm)); /* Set imm to mask. */ imm = (sljit_ins)(inv_bits ? (4 << 10) : ((5 << 10) | (1 << 22))); @@ -1565,7 +1809,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_RETURN: if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_LR) | RM(src))); else FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1)); @@ -1607,7 +1851,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_ENTER: if (FAST_IS_REG(dst)) - return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(TMP_LR)); + return push_inst(compiler, MOV | RD(dst) | RM(TMP_LR)); break; case SLJIT_GET_RETURN_ADDRESS: dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; @@ -1621,15 +1865,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type != SLJIT_FLOAT_REGISTER && type != SLJIT_SIMD_REG_64 && type != SLJIT_SIMD_REG_128) + return -1; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); return freg_map[reg]; } @@ -1707,7 +1952,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp inv_bits |= W_OP; if (src & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw)); src = TMP_FREG1; } @@ -1718,34 +1963,59 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp return SLJIT_SUCCESS; } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0; - - if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - inv_bits |= W_OP; if (src & SLJIT_MEM) { - emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw, TMP_REG1); + emit_op_mem(compiler, (ins & W_OP) ? WORD_SIZE : INT_SIZE, TMP_REG1, src, srcw, TMP_REG1); src = TMP_REG1; - } else if (src & SLJIT_IMM) { - if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - srcw = (sljit_s32)srcw; - + } else if (src == SLJIT_IMM) { FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); src = TMP_REG1; } - FAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src))); + FAIL_IF(push_inst(compiler, ins | VD(dst_r) | RN(src))); if (dst & SLJIT_MEM) - return emit_fop_mem(compiler, ((op & SLJIT_32) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw); + return emit_fop_mem(compiler, ((ins & (1 << 22)) ? WORD_SIZE : INT_SIZE) | STORE, TMP_FREG1, dst, dstw); return SLJIT_SUCCESS; } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) { + inv_bits |= W_OP; + + if (src == SLJIT_IMM) + srcw = (sljit_s32)srcw; + } + + return sljit_emit_fop1_conv_f64_from_w(compiler, SCVTF ^ inv_bits, dst, dstw, src, srcw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) { + inv_bits |= W_OP; + + if (src == SLJIT_IMM) + srcw = (sljit_u32)srcw; + } + + return sljit_emit_fop1_conv_f64_from_w(compiler, UCVTF ^ inv_bits, dst, dstw, src, srcw); +} + static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) @@ -1754,16 +2024,22 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0; if (src1 & SLJIT_MEM) { - emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w); + FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w)); src1 = TMP_FREG1; } if (src2 & SLJIT_MEM) { - emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w); + FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w)); src2 = TMP_FREG2; } - return push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2)); + FAIL_IF(push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2))); + + if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst(compiler, CSINC | (0x0 << 12) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(TMP_ZERO))); + return push_inst(compiler, CCMPI | (0x0 << 16) | (0x7 << 12) | RN(TMP_REG1) | 0x4); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -1782,7 +2058,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; if (src & SLJIT_MEM) { - emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw); + FAIL_IF(emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw)); src = dst_r; } @@ -1827,11 +2103,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; if (src1 & SLJIT_MEM) { - emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w); + FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w)); src1 = TMP_FREG1; } if (src2 & SLJIT_MEM) { - emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w); + FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w)); src2 = TMP_FREG2; } @@ -1848,6 +2124,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil case SLJIT_DIV_F64: FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); break; + case SLJIT_COPYSIGN_F64: + FAIL_IF(push_inst(compiler, (FMOV_R ^ ((op & SLJIT_32) ? (W_OP | (1 << 22)) : 0)) | VN(src2) | RD(TMP_REG1))); + FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src1))); + FAIL_IF(push_inst(compiler, TBZ | ((op & SLJIT_32) ? 0 : ((sljit_ins)1 << 31)) | (0x1f << 19) | (2 << 5) | RT(TMP_REG1))); + return push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(dst_r)); } if (!(dst & SLJIT_MEM)) @@ -1855,6 +2136,62 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return emit_fop_mem(compiler, mem_flags | STORE, TMP_FREG1, dst, dstw); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + sljit_u32 exp; + union { + sljit_u32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, (FMOV_R ^ (W_OP | (1 << 22))) | RN(TMP_ZERO) | VD(freg) | (1 << 16)); + + if ((u.imm << (32 - 19)) == 0) { + exp = (u.imm >> (23 + 2)) & 0x3f; + + if (exp == 0x20 || exp == 0x1f) + return push_inst(compiler, (FMOV_I ^ (1 << 22)) | (sljit_ins)((((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f)) << 13) | VD(freg)); + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_s32)u.imm)); + return push_inst(compiler, (FMOV_R ^ (W_OP | (1 << 22))) | RN(TMP_REG1) | VD(freg) | (1 << 16)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + sljit_uw exp; + union { + sljit_uw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, FMOV_R | RN(TMP_ZERO) | VD(freg) | (sljit_ins)1 << 16); + + if ((u.imm << (64 - 48)) == 0) { + exp = (u.imm >> (52 + 2)) & 0x1ff; + + if (exp == 0x100 || exp == 0xff) + return push_inst(compiler, FMOV_I | (sljit_ins)((((u.imm >> 56) & 0x80) | ((u.imm >> 48) & 0x7f)) << 13) | VD(freg)); + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_sw)u.imm)); + return push_inst(compiler, FMOV_R | RN(TMP_REG1) | VD(freg) | (1 << 16)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -1864,12 +2201,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg)); if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) - inst = FMOV_R | RN(reg) | VD(freg) | (sljit_ins)1 << 16; + inst = FMOV_R | RN(reg) | VD(freg) | (1 << 16); else inst = FMOV_R | VN(freg) | RD(reg); if (op & SLJIT_32) - inst ^= ((sljit_ins)1 << 31) | ((sljit_ins)1 << 22); + inst ^= W_OP | (1 << 22); return push_inst(compiler, inst); } @@ -1882,15 +2219,17 @@ static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: + case SLJIT_ATOMIC_STORED: case SLJIT_F_EQUAL: case SLJIT_ORDERED_EQUAL: - case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */ + case SLJIT_UNORDERED_OR_EQUAL: return 0x1; case SLJIT_NOT_EQUAL: + case SLJIT_ATOMIC_NOT_STORED: case SLJIT_F_NOT_EQUAL: case SLJIT_UNORDERED_OR_NOT_EQUAL: - case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */ + case SLJIT_ORDERED_NOT_EQUAL: return 0x0; case SLJIT_CARRY: @@ -1996,14 +2335,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile if (type < SLJIT_JUMP) { jump->flags |= IS_COND; PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(compiler, type))); - } - else if (type >= SLJIT_FAST_CALL) + } else if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; - PTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); jump->addr = compiler->size; PTR_FAIL_IF(push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1))); + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return jump; } @@ -2041,7 +2380,7 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi PTR_FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); src = TMP_REG1; } - else if (src & SLJIT_IMM) { + else if (src == SLJIT_IMM) { PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); src = TMP_REG1; } @@ -2052,9 +2391,11 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi inv_bits |= 1 << 24; PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src))); - PTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); jump->addr = compiler->size; PTR_FAIL_IF(push_inst(compiler, BR | RN(TMP_REG1))); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return jump; } @@ -2065,7 +2406,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi CHECK_ERROR(); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { if (src & SLJIT_MEM) { ADJUST_LOCAL_OFFSET(src, srcw); FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); @@ -2080,8 +2421,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); jump->u.target = (sljit_uw)srcw; - FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); jump->addr = compiler->size; + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1)); } @@ -2101,7 +2443,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi if (type & SLJIT_CALL_RETURN) { if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) { - FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(src))); + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src))); src = TMP_REG1; } @@ -2161,27 +2503,53 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { sljit_ins inv_bits = (type & SLJIT_32) ? W_OP : 0; sljit_ins cc; CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); - if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (src1 == SLJIT_IMM) { if (type & SLJIT_32) - srcw = (sljit_s32)srcw; - FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); - src = TMP_REG1; - srcw = 0; + src1w = (sljit_s32)src1w; + FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1 = TMP_REG1; + } else if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG2)); + src1 = TMP_REG1; } cc = get_cc(compiler, type & ~SLJIT_32); + return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(src2_reg) | RM(src1)); +} - return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src)); +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_ins inv_bits = (type & SLJIT_32) ? (1 << 22) : 0; + sljit_ins cc; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src1, src1w)); + src1 = TMP_FREG1; + } + + cc = get_cc(compiler, type & ~SLJIT_32); + return push_inst(compiler, (FCSEL ^ inv_bits) | (cc << 12) | VD(dst_freg) | VN(src2_freg) | VM(src1)); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, @@ -2338,6 +2706,661 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler return push_inst(compiler, inst | VT(freg) | RN(mem & REG_MASK) | (sljit_ins)((memw & 0x1ff) << 12)); } +static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw) +{ + sljit_ins ins; + sljit_s32 mem = *mem_ptr; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + *mem_ptr = TMP_REG1; + return push_inst(compiler, ADD | RD(TMP_REG1) | RN(mem & REG_MASK) | RM(OFFS_REG(mem)) | ((sljit_ins)(memw & 0x3) << 10)); + } + + if (!(mem & REG_MASK)) { + *mem_ptr = TMP_REG1; + return load_immediate(compiler, TMP_REG1, memw); + } + + mem &= REG_MASK; + + if (memw == 0) { + *mem_ptr = mem; + return SLJIT_SUCCESS; + } + + *mem_ptr = TMP_REG1; + + if (memw < -0xffffff || memw > 0xffffff) { + FAIL_IF(load_immediate(compiler, TMP_REG1, memw)); + return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(mem)); + } + + ins = ADDI; + + if (memw < 0) { + memw = -memw; + ins = SUBI; + } + + if (memw > 0xfff) { + FAIL_IF(push_inst(compiler, ins | (1 << 22) | RD(TMP_REG1) | RN(mem) | ((sljit_ins)(memw >> 12) << 10))); + + memw &= 0xfff; + if (memw == 0) + return SLJIT_SUCCESS; + + mem = TMP_REG1; + } + + return push_inst(compiler, ins | RD(TMP_REG1) | RN(mem) | ((sljit_ins)memw << 10)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (!(srcdst & SLJIT_MEM)) { + if (type & SLJIT_SIMD_STORE) + ins = VD(srcdst) | VN(freg) | VM(freg); + else + ins = VD(freg) | VN(srcdst) | VM(srcdst); + + if (reg_size == 4) + ins |= (1 << 30); + + return push_inst(compiler, ORR_v | ins); + } + + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + if (elem_size > 3) + elem_size = 3; + + ins = (type & SLJIT_SIMD_STORE) ? ST1 : LD1; + + if (reg_size == 4) + ins |= (1 << 30); + + return push_inst(compiler, ins | ((sljit_ins)elem_size << 10) | RN(srcdst) | VT(freg)); +} + +static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value) +{ + sljit_ins result; + + if (elem_size > 2 && (sljit_u32)value == (value >> 32)) { + elem_size = 2; + value = (sljit_u32)value; + } + + if (elem_size == 2 && (sljit_u16)value == (value >> 16)) { + elem_size = 1; + value = (sljit_u16)value; + } + + if (elem_size == 1 && (sljit_u8)value == (value >> 8)) { + elem_size = 0; + value = (sljit_u8)value; + } + + switch (elem_size) { + case 0: + SLJIT_ASSERT(value <= 0xff); + result = 0xe000; + break; + case 1: + SLJIT_ASSERT(value <= 0xffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x8000; + break; + } + + if ((value & 0xff) == 0) { + value >>= 8; + result |= 0xa000; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value ^= (sljit_uw)0xffff; + result = (1 << 29); + } + break; + case 2: + SLJIT_ASSERT(value <= 0xffffffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x0000; + break; + } + + if ((value & ~(sljit_uw)0xff00) == 0) { + value >>= 8; + result |= 0x2000; + break; + } + + if ((value & ~(sljit_uw)0xff0000) == 0) { + value >>= 16; + result |= 0x4000; + break; + } + + if ((value & ~(sljit_uw)0xff000000) == 0) { + value >>= 24; + result |= 0x6000; + break; + } + + if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) { + value >>= 8; + result |= 0xc000; + break; + } + + if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) { + value >>= 16; + result |= 0xd000; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value ^= (sljit_uw)0xffffffff; + result = (1 << 29); + } + break; + default: + return ~(sljit_ins)0; + } + + return (((sljit_ins)value & 0x1f) << 5) | (((sljit_ins)value & 0xe0) << 11) | result; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imm; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + + ins = (sljit_ins)elem_size << 10; + + if (reg_size == 4) + ins |= (sljit_ins)1 << 30; + + return push_inst(compiler, LD1R | ins | RN(src) | VT(freg)); + } + + ins = (sljit_ins)1 << (16 + elem_size); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 30; + + if (type & SLJIT_SIMD_FLOAT) { + if (src == SLJIT_IMM) + return push_inst(compiler, MOVI | (ins & ((sljit_ins)1 << 30)) | VD(freg)); + + return push_inst(compiler, DUP_e | ins | VD(freg) | VN(src)); + } + + if (src == SLJIT_IMM) { + if (elem_size < 3) + srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + imm = simd_get_imm(elem_size, (sljit_uw)srcw); + + if (imm != ~(sljit_ins)0) { + imm |= ins & ((sljit_ins)1 << 30); + + return push_inst(compiler, MOVI | imm | VD(freg)); + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + + return push_inst(compiler, DUP_g | ins | VD(freg) | RN(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (type & SLJIT_SIMD_LANE_ZERO) { + ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 30); + + if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) { + FAIL_IF(push_inst(compiler, ORR_v | ins | VD(TMP_FREG1) | VN(freg) | VM(freg))); + srcdst = TMP_FREG1; + srcdstw = 0; + } + + FAIL_IF(push_inst(compiler, MOVI | ins | VD(freg))); + } + + if (srcdst & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + if (elem_size == 3) + ins = 0x8400; + else if (elem_size == 0) + ins = 0; + else + ins = (sljit_ins)0x2000 << elem_size; + + lane_index = lane_index << elem_size; + ins |= (sljit_ins)(((lane_index & 0x8) << 27) | ((lane_index & 0x7) << 10)); + + return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? ST1_s : LD1_s) | ins | RN(srcdst) | VT(freg)); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (type & SLJIT_SIMD_STORE) + ins = INS_e | ((sljit_ins)1 << (16 + elem_size)) | ((sljit_ins)lane_index << (11 + elem_size)) | VD(srcdst) | VN(freg); + else + ins = INS_e | ((((sljit_ins)lane_index << 1) | 1) << (16 + elem_size)) | VD(freg) | VN(srcdst); + + return push_inst(compiler, ins); + } + + if (srcdst == SLJIT_IMM) { + if (elem_size < 3) + srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcdstw)); + srcdst = TMP_REG1; + } + + if (type & SLJIT_SIMD_STORE) { + ins = RD(srcdst) | VN(freg); + + if ((type & SLJIT_SIMD_LANE_SIGNED) && (elem_size < 2 || (elem_size == 2 && !(type & SLJIT_32)))) { + ins |= SMOV; + + if (!(type & SLJIT_32)) + ins |= (sljit_ins)1 << 30; + } else + ins |= UMOV; + } else + ins = INS | VD(freg) | RN(srcdst); + + if (elem_size == 3) + ins |= (sljit_ins)1 << 30; + + return push_inst(compiler, ins | ((((sljit_ins)lane_index << 1) | 1) << (16 + elem_size))); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + ins = (((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 30; + + return push_inst(compiler, DUP_e | ins | VD(freg) | VN(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type); + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + + if (reg_size == 4 && elem2_size - elem_size == 1) + FAIL_IF(push_inst(compiler, LD1 | ((sljit_ins)elem_size << 10) | RN(src) | VT(freg))); + else + FAIL_IF(push_inst(compiler, LD1_s | ((sljit_ins)0x2000 << (reg_size - elem2_size + elem_size)) | RN(src) | VT(freg))); + src = freg; + } + + if (type & SLJIT_SIMD_FLOAT) { + SLJIT_ASSERT(reg_size == 4); + return push_inst(compiler, FCVTL | (1 << 22) | VD(freg) | VN(src)); + } + + do { + FAIL_IF(push_inst(compiler, ((type & SLJIT_SIMD_EXTEND_SIGNED) ? SSHLL : USHLL) + | ((sljit_ins)1 << (19 + elem_size)) | VD(freg) | VN(src))); + src = freg; + } while (++elem_size < elem2_size); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imms; + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + switch (elem_size) { + case 0: + imms = 0x643219; + ins = USHR | (0x9 << 16); + break; + case 1: + imms = (reg_size == 4) ? 0x643219 : 0x6231; + ins = USHR | (0x11 << 16); + break; + case 2: + imms = (reg_size == 4) ? 0x6231 : 0x61; + ins = USHR | (0x21 << 16); + break; + default: + imms = 0x61; + ins = USHR | (0x41 << 16); + break; + } + + if (reg_size == 4) + ins |= (1 << 30); + + FAIL_IF(push_inst(compiler, ins | VD(TMP_FREG1) | VN(freg))); + + if (reg_size == 4 && elem_size > 0) + FAIL_IF(push_inst(compiler, XTN | ((sljit_ins)(elem_size - 1) << 22) | VD(TMP_FREG1) | VN(TMP_FREG1))); + + if (imms >= 0x100) { + ins = (reg_size == 4 && elem_size == 0) ? (1 << 30) : 0; + + do { + FAIL_IF(push_inst(compiler, USRA | ins | ((imms & 0xff) << 16) | VD(TMP_FREG1) | VN(TMP_FREG1))); + imms >>= 8; + } while (imms >= 0x100); + } + + FAIL_IF(push_inst(compiler, USRA | (1 << 30) | (imms << 16) | VD(TMP_FREG1) | VN(TMP_FREG1))); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + ins = (0x1 << 16); + + if (reg_size == 4 && elem_size == 0) { + FAIL_IF(push_inst(compiler, INS_e | (0x3 << 16) | (0x8 << 11) | VD(TMP_FREG1) | VN(TMP_FREG1))); + ins = (0x2 << 16); + } + + FAIL_IF(push_inst(compiler, UMOV | ins | RD(dst_r) | VN(TMP_FREG1))); + + if (dst_r == TMP_REG1) + return emit_op_mem(compiler, STORE | ((type & SLJIT_32) ? INT_SIZE : WORD_SIZE), TMP_REG1, dst, dstw, TMP_REG2); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + switch (SLJIT_SIMD_GET_OPCODE(type)) { + case SLJIT_SIMD_OP2_AND: + ins = AND_v; + break; + case SLJIT_SIMD_OP2_OR: + ins = ORR_v; + break; + case SLJIT_SIMD_OP2_XOR: + ins = EOR_v; + break; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + ins |= (sljit_ins)1 << 30; + + return push_inst(compiler, ins | VD(dst_freg) | VN(src1_freg) | VM(src2_freg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + +#ifdef __ARM_FEATURE_ATOMICS + switch (GET_OPCODE(op)) { + case SLJIT_MOV32: + case SLJIT_MOV_U32: + ins = LDR ^ (1 << 30); + break; + case SLJIT_MOV_U16: + ins = LDRH; + break; + case SLJIT_MOV_U8: + ins = LDRB; + break; + default: + ins = LDR; + break; + } +#else /* !__ARM_FEATURE_ATOMICS */ + switch (GET_OPCODE(op)) { + case SLJIT_MOV32: + case SLJIT_MOV_U32: + ins = LDXR ^ (1 << 30); + break; + case SLJIT_MOV_U8: + ins = LDXRB; + break; + case SLJIT_MOV_U16: + ins = LDXRH; + break; + default: + ins = LDXR; + break; + } +#endif /* ARM_FEATURE_ATOMICS */ + return push_inst(compiler, ins | RN(mem_reg) | RT(dst_reg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_ins ins; + sljit_s32 tmp = temp_reg; + sljit_ins cmp = 0; + sljit_ins inv_bits = W_OP; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + +#ifdef __ARM_FEATURE_ATOMICS + if (op & SLJIT_SET_ATOMIC_STORED) + cmp = (SUBS ^ W_OP) | RD(TMP_ZERO); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV32: + case SLJIT_MOV_U32: + ins = CAS ^ (1 << 30); + break; + case SLJIT_MOV_U16: + ins = CASH; + break; + case SLJIT_MOV_U8: + ins = CASB; + break; + default: + ins = CAS; + inv_bits = 0; + if (cmp) + cmp ^= W_OP; + break; + } + + if (cmp) { + FAIL_IF(push_inst(compiler, (MOV ^ inv_bits) | RM(temp_reg) | RD(TMP_REG1))); + tmp = TMP_REG1; + } + FAIL_IF(push_inst(compiler, ins | RM(tmp) | RN(mem_reg) | RD(src_reg))); + if (!cmp) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst(compiler, cmp | RM(tmp) | RN(temp_reg))); + FAIL_IF(push_inst(compiler, (CSET ^ inv_bits) | RD(tmp))); + return push_inst(compiler, cmp | RM(tmp) | RN(TMP_ZERO)); +#else /* !__ARM_FEATURE_ATOMICS */ + SLJIT_UNUSED_ARG(tmp); + SLJIT_UNUSED_ARG(inv_bits); + + if (op & SLJIT_SET_ATOMIC_STORED) + cmp = (SUBI ^ W_OP) | (1 << 29); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV32: + case SLJIT_MOV_U32: + ins = STXR ^ (1 << 30); + break; + case SLJIT_MOV_U8: + ins = STXRB; + break; + case SLJIT_MOV_U16: + ins = STXRH; + break; + default: + ins = STXR; + break; + } + + FAIL_IF(push_inst(compiler, ins | RM(TMP_REG1) | RN(mem_reg) | RT(src_reg))); + return cmp ? push_inst(compiler, cmp | RD(TMP_ZERO) | RN(TMP_REG1)) : SLJIT_SUCCESS; +#endif /* __ARM_FEATURE_ATOMICS */ +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) { sljit_s32 dst_reg; @@ -2399,26 +3422,28 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; - PTR_FAIL_IF(emit_imm64_const(compiler, dst_r, 0)); + PTR_FAIL_IF(push_inst(compiler, RD(dst_r))); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 1); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 1); + + compiler->size += 3; if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); - return put_label; + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_T2_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_T2_32.c old mode 100644 new mode 100755 index 73dd7f99d5..4d74f4803d --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_T2_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeARM_T2_32.c @@ -49,8 +49,20 @@ static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { 0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15 }; -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { - 0, 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, 6, 7 +static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = { + 0, + 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6, + 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6 +}; + +static const sljit_u8 freg_ebit_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = { + 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1 }; #define COPY_BITS(src, from, to, bits) \ @@ -75,13 +87,15 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { (reg_map[reg1] <= 7 && reg_map[reg2] <= 7 && reg_map[reg3] <= 7) /* Thumb32 encodings. */ -#define RD4(rd) ((sljit_ins)reg_map[rd] << 8) -#define RN4(rn) ((sljit_ins)reg_map[rn] << 16) #define RM4(rm) ((sljit_ins)reg_map[rm]) +#define RD4(rd) ((sljit_ins)reg_map[rd] << 8) #define RT4(rt) ((sljit_ins)reg_map[rt] << 12) -#define DD4(dd) ((sljit_ins)freg_map[dd] << 12) -#define DN4(dn) ((sljit_ins)freg_map[dn] << 16) -#define DM4(dm) ((sljit_ins)freg_map[dm]) +#define RN4(rn) ((sljit_ins)reg_map[rn] << 16) + +#define VM4(vm) (((sljit_ins)freg_map[vm]) | ((sljit_ins)freg_ebit_map[vm] << 5)) +#define VD4(vd) (((sljit_ins)freg_map[vd] << 12) | ((sljit_ins)freg_ebit_map[vd] << 22)) +#define VN4(vn) (((sljit_ins)freg_map[vn] << 16) | ((sljit_ins)freg_ebit_map[vn] << 7)) + #define IMM5(imm) \ (COPY_BITS(imm, 2, 12, 3) | (((sljit_ins)imm & 0x3) << 6)) #define IMM12(imm) \ @@ -128,9 +142,12 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define EORS 0x4040 #define EOR_W 0xea800000 #define IT 0xbf00 -#define LDR_SP 0x9800 #define LDR 0xf8d00000 +#define LDR_SP 0x9800 #define LDRD 0xe9500000 +#define LDREX 0xe8500f00 +#define LDREXB 0xe8d00f4f +#define LDREXH 0xe8d00f5f #define LDRI 0xf8500800 #define LSLS 0x4080 #define LSLSI 0x0000 @@ -162,6 +179,8 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define PUSH_W 0xe92d0000 #define REV 0xba00 #define REV_W 0xfa90f080 +#define REV16 0xba40 +#define REV16_W 0xfa90f090 #define RBIT 0xfa90f0a0 #define RORS 0x41c0 #define ROR_W 0xfa60f000 @@ -173,8 +192,11 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define SBC_W 0xeb600000 #define SDIV 0xfb90f0f0 #define SMULL 0xfb800000 -#define STRD 0xe9400000 #define STR_SP 0x9000 +#define STRD 0xe9400000 +#define STREX 0xe8400000 +#define STREXB 0xe8c00f40 +#define STREXH 0xe8c00f50 #define SUBS 0x1a00 #define SUBSI3 0x1e00 #define SUBSI8 0x3800 @@ -197,23 +219,57 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define UXTH_W 0xfa1ff080 #define VABS_F32 0xeeb00ac0 #define VADD_F32 0xee300a00 +#define VAND 0xef000110 #define VCMP_F32 0xeeb40a40 #define VCVT_F32_S32 0xeeb80ac0 +#define VCVT_F32_U32 0xeeb80a40 #define VCVT_F64_F32 0xeeb70ac0 #define VCVT_S32_F32 0xeebd0ac0 #define VDIV_F32 0xee800a00 +#define VDUP 0xee800b10 +#define VDUP_s 0xffb00c00 +#define VEOR 0xff000110 +#define VLD1 0xf9200000 +#define VLD1_r 0xf9a00c00 +#define VLD1_s 0xf9a00000 #define VLDR_F32 0xed100a00 #define VMOV_F32 0xeeb00a40 #define VMOV 0xee000a10 #define VMOV2 0xec400a10 +#define VMOV_i 0xef800010 +#define VMOV_s 0xee000b10 +#define VMOVN 0xffb20200 #define VMRS 0xeef1fa10 #define VMUL_F32 0xee200a00 #define VNEG_F32 0xeeb10a40 +#define VORR 0xef200110 #define VPOP 0xecbd0b00 #define VPUSH 0xed2d0b00 +#define VSHLL 0xef800a10 +#define VSHR 0xef800010 +#define VSRA 0xef800110 +#define VST1 0xf9000000 +#define VST1_s 0xf9800000 #define VSTR_F32 0xed000a00 #define VSUB_F32 0xee300a40 +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + +static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32) +{ + if (compiler->scratches == -1) + return 0; + + if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0)) + fr -= SLJIT_F64_SECOND(0); + + return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches)) + || (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0) + || (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)); +} + +#endif /* SLJIT_ARGUMENT_CHECKS */ + static sljit_s32 push_inst16(struct sljit_compiler *compiler, sljit_ins inst) { sljit_u16 *ptr; @@ -236,7 +292,7 @@ static sljit_s32 push_inst32(struct sljit_compiler *compiler, sljit_ins inst) return SLJIT_SUCCESS; } -static SLJIT_INLINE sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm) +static sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm) { FAIL_IF(push_inst32(compiler, MOVW | RD4(dst) | COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff))); @@ -244,134 +300,259 @@ static SLJIT_INLINE sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, | COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16)); } -static SLJIT_INLINE void modify_imm32_const(sljit_u16 *inst, sljit_uw new_imm) +/* Dst must be in bits[11-8] */ +static void set_imm32_const(sljit_u16 *inst, sljit_ins dst, sljit_uw new_imm) { - sljit_ins dst = inst[1] & 0x0f00; - SLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00)); inst[0] = (sljit_u16)((MOVW >> 16) | COPY_BITS(new_imm, 12, 0, 4) | COPY_BITS(new_imm, 11, 10, 1)); inst[1] = (sljit_u16)(dst | COPY_BITS(new_imm, 8, 12, 3) | (new_imm & 0xff)); inst[2] = (sljit_u16)((MOVT >> 16) | COPY_BITS(new_imm, 12 + 16, 0, 4) | COPY_BITS(new_imm, 11 + 16, 10, 1)); inst[3] = (sljit_u16)(dst | COPY_BITS(new_imm, 8 + 16, 12, 3) | ((new_imm & 0xff0000) >> 16)); } -static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code, sljit_sw executable_offset) +static SLJIT_INLINE void modify_imm32_const(sljit_u16 *inst, sljit_uw new_imm) +{ + sljit_ins dst = inst[1] & 0x0f00; + SLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00)); + set_imm32_const(inst, dst, new_imm); +} + +static SLJIT_INLINE sljit_u16* detect_jump_type(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code, sljit_sw executable_offset) { sljit_sw diff; if (jump->flags & SLJIT_REWRITABLE_JUMP) - return 0; + goto exit; if (jump->flags & JUMP_ADDR) { /* Branch to ARM code is not optimized yet. */ if (!(jump->u.target & 0x1)) - return 0; - diff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset) >> 1; - } - else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); - diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)) >> 1; + goto exit; + diff = (sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset; + } else { + SLJIT_ASSERT(jump->u.label != NULL); + diff = (sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2); } if (jump->flags & IS_COND) { SLJIT_ASSERT(!(jump->flags & IS_BL)); - if (diff <= 127 && diff >= -128) { + /* Size of the prefix IT instruction. */ + diff += SSIZE_OF(u16); + if (diff <= 0xff && diff >= -0x100) { jump->flags |= PATCH_TYPE1; - return 5; + jump->addr = (sljit_uw)(code_ptr - 1); + return code_ptr - 1; } - if (diff <= 524287 && diff >= -524288) { + if (diff <= 0xfffff && diff >= -0x100000) { jump->flags |= PATCH_TYPE2; - return 4; + jump->addr = (sljit_uw)(code_ptr - 1); + return code_ptr; } - /* +1 comes from the prefix IT instruction. */ - diff--; - if (diff <= 8388607 && diff >= -8388608) { - jump->flags |= PATCH_TYPE3; - return 3; - } - } - else if (jump->flags & IS_BL) { - if (diff <= 8388607 && diff >= -8388608) { - jump->flags |= PATCH_BL; - return 3; - } - } - else { - if (diff <= 1023 && diff >= -1024) { - jump->flags |= PATCH_TYPE4; - return 4; - } - if (diff <= 8388607 && diff >= -8388608) { + diff -= SSIZE_OF(u16); + } else if (jump->flags & IS_BL) { + /* Branch and link. */ + if (diff <= 0xffffff && diff >= -0x1000000) { jump->flags |= PATCH_TYPE5; - return 3; + return code_ptr + 1; } + goto exit; + } else if (diff <= 0x7ff && diff >= -0x800) { + jump->flags |= PATCH_TYPE3; + return code_ptr; } - return 0; + if (diff <= 0xffffff && diff >= -0x1000000) { + jump->flags |= PATCH_TYPE4; + return code_ptr + 1; + } + +exit: + code_ptr[4] = code_ptr[0]; + + if (jump->flags & IS_COND) { + code_ptr[3] = code_ptr[-1]; + jump->addr = (sljit_uw)(code_ptr - 1); + } + + return code_ptr + 4; } -static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump, sljit_sw executable_offset) +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code, sljit_sw executable_offset) +{ + sljit_uw addr; + sljit_sw diff; + SLJIT_UNUSED_ARG(executable_offset); + + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + /* The pc+4 offset is represented by the 2 * SSIZE_OF(sljit_u16) below. */ + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + /* Note: ADR with imm8 does not set the last bit (Thumb2 flag). */ + + if (diff <= 0xffd + 2 * SSIZE_OF(u16) && diff >= -0xfff + 2 * SSIZE_OF(u16)) { + jump->flags |= PATCH_TYPE6; + return 1; + } + + return 3; +} + +static SLJIT_INLINE void generate_jump_or_mov_addr(struct sljit_jump *jump, sljit_sw executable_offset) { sljit_s32 type = (jump->flags >> 4) & 0xf; + sljit_u16 *jump_inst = (sljit_u16*)jump->addr; sljit_sw diff; - sljit_u16 *jump_inst; - sljit_s32 s, j1, j2; + sljit_ins ins; + + diff = (sljit_sw)((jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr); if (SLJIT_UNLIKELY(type == 0)) { - modify_imm32_const((sljit_u16*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target); + ins = (jump->flags & JUMP_MOV_ADDR) ? *jump_inst : RDN3(TMP_REG1); + set_imm32_const((sljit_u16*)jump->addr, ins, (sljit_uw)diff); return; } - if (jump->flags & JUMP_ADDR) { - SLJIT_ASSERT(jump->u.target & 0x1); - diff = ((sljit_sw)jump->u.target - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1; + if (SLJIT_UNLIKELY(type == 6)) { + SLJIT_ASSERT(jump->flags & JUMP_MOV_ADDR); + diff -= (sljit_sw)SLJIT_ADD_EXEC_OFFSET(jump_inst + 2, executable_offset) & ~(sljit_sw)0x3; + + SLJIT_ASSERT(diff <= 0xfff && diff >= -0xfff); + + ins = ADDWI >> 16; + if (diff <= 0) { + diff = -diff; + ins = SUBWI >> 16; + } + + jump_inst[1] = (sljit_u16)(jump_inst[0] | COPY_BITS(diff, 8, 12, 3) | (diff & 0xff)); + jump_inst[0] = (sljit_u16)(ins | 0xf | COPY_BITS(diff, 11, 10, 1)); + return; } - else { - SLJIT_ASSERT(jump->u.label->addr & 0x1); - diff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1; - } - jump_inst = (sljit_u16*)jump->addr; + + SLJIT_ASSERT((diff & 0x1) != 0 && !(jump->flags & JUMP_MOV_ADDR)); + diff = (diff - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1; switch (type) { case 1: /* Encoding T1 of 'B' instruction */ - SLJIT_ASSERT(diff <= 127 && diff >= -128 && (jump->flags & IS_COND)); + SLJIT_ASSERT(diff <= 0x7f && diff >= -0x80 && (jump->flags & IS_COND)); jump_inst[0] = (sljit_u16)(0xd000 | (jump->flags & 0xf00) | ((sljit_ins)diff & 0xff)); return; case 2: /* Encoding T3 of 'B' instruction */ - SLJIT_ASSERT(diff <= 524287 && diff >= -524288 && (jump->flags & IS_COND)); + SLJIT_ASSERT(diff <= 0x7ffff && diff >= -0x80000 && (jump->flags & IS_COND)); jump_inst[0] = (sljit_u16)(0xf000 | COPY_BITS(jump->flags, 8, 6, 4) | COPY_BITS(diff, 11, 0, 6) | COPY_BITS(diff, 19, 10, 1)); jump_inst[1] = (sljit_u16)(0x8000 | COPY_BITS(diff, 17, 13, 1) | COPY_BITS(diff, 18, 11, 1) | ((sljit_ins)diff & 0x7ff)); return; case 3: - SLJIT_ASSERT(jump->flags & IS_COND); - *jump_inst++ = (sljit_u16)(IT | ((jump->flags >> 4) & 0xf0) | 0x8); - diff--; - type = 5; - break; - case 4: /* Encoding T2 of 'B' instruction */ - SLJIT_ASSERT(diff <= 1023 && diff >= -1024 && !(jump->flags & IS_COND)); + SLJIT_ASSERT(diff <= 0x3ff && diff >= -0x400 && !(jump->flags & IS_COND)); jump_inst[0] = (sljit_u16)(0xe000 | (diff & 0x7ff)); return; } - SLJIT_ASSERT(diff <= 8388607 && diff >= -8388608); + SLJIT_ASSERT(diff <= 0x7fffff && diff >= -0x800000); - /* Really complex instruction form for branches. */ - s = (diff >> 23) & 0x1; - j1 = (~(diff >> 22) ^ s) & 0x1; - j2 = (~(diff >> 21) ^ s) & 0x1; - jump_inst[0] = (sljit_u16)(0xf000 | ((sljit_ins)s << 10) | COPY_BITS(diff, 11, 0, 10)); - jump_inst[1] = (sljit_u16)((j1 << 13) | (j2 << 11) | (diff & 0x7ff)); + /* Really complex instruction form for branches. Negate with sign bit. */ + diff ^= ((diff >> 2) & 0x600000) ^ 0x600000; + + jump_inst[0] = (sljit_u16)(0xf000 | COPY_BITS(diff, 11, 0, 10) | COPY_BITS(diff, 23, 10, 1)); + jump_inst[1] = (sljit_u16)((diff & 0x7ff) | COPY_BITS(diff, 22, 13, 1) | COPY_BITS(diff, 21, 11, 1)); + + SLJIT_ASSERT(type == 4 || type == 5); /* The others have a common form. */ - if (type == 5) /* Encoding T4 of 'B' instruction */ + if (type == 4) /* Encoding T4 of 'B' instruction */ jump_inst[1] |= 0x9000; - else if (type == 6) /* Encoding T1 of 'BL' instruction */ + else /* Encoding T1 of 'BL' instruction */ jump_inst[1] |= 0xd000; - else - SLJIT_UNREACHABLE(); +} + +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + SLJIT_NEXT_DEFINE_TYPES; + sljit_uw total_size; + sljit_uw size_reduce = 0; + sljit_sw diff; + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + + while (1) { + SLJIT_GET_NEXT_MIN(); + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr == next_const_addr) { + const_->addr -= size_reduce; + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + continue; + } + + if (next_min_addr != next_jump_addr) + continue; + + jump->addr -= size_reduce; + if (!(jump->flags & JUMP_MOV_ADDR)) { + total_size = JUMP_MAX_SIZE; + + if (!(jump->flags & (SLJIT_REWRITABLE_JUMP | JUMP_ADDR))) { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr - 2; + + if (jump->flags & IS_COND) { + diff++; + + if (diff <= (0xff / SSIZE_OF(u16)) && diff >= (-0x100 / SSIZE_OF(u16))) + total_size = 0; + else if (diff <= (0xfffff / SSIZE_OF(u16)) && diff >= (-0x100000 / SSIZE_OF(u16))) + total_size = 1; + diff--; + } else if (!(jump->flags & IS_BL) && diff <= (0x7ff / SSIZE_OF(u16)) && diff >= (-0x800 / SSIZE_OF(u16))) + total_size = 1; + + if (total_size == JUMP_MAX_SIZE && diff <= (0xffffff / SSIZE_OF(u16)) && diff >= (-0x1000000 / SSIZE_OF(u16))) + total_size = 2; + } + + size_reduce += JUMP_MAX_SIZE - total_size; + } else { + /* Real size minus 1. Unit size: instruction. */ + total_size = 3; + + if (!(jump->flags & JUMP_ADDR)) { + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if (diff <= (0xffd / SSIZE_OF(u16)) && diff >= (-0xfff / SSIZE_OF(u16))) + total_size = 1; + } + + size_reduce += 3 - total_size; + } + + jump->flags |= total_size << JUMP_SIZE_SHIFT; + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; } SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) @@ -382,64 +563,76 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_u16 *buf_ptr; sljit_u16 *buf_end; sljit_uw half_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; + sljit_sw addr; sljit_sw executable_offset; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); + + reduce_code_size(compiler); code = (sljit_u16*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_u16), compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; code_ptr = code; half_count = 0; - next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { buf_ptr = (sljit_u16*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 1); do { *code_ptr = *buf_ptr++; - if (next_addr == half_count) { + if (next_min_addr == half_count) { SLJIT_ASSERT(!label || label->size >= half_count); SLJIT_ASSERT(!jump || jump->addr >= half_count); SLJIT_ASSERT(!const_ || const_->addr >= half_count); - SLJIT_ASSERT(!put_label || put_label->addr >= half_count); /* These structures are ordered by their address. */ - if (label && label->size == half_count) { - label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; + if (next_min_addr == next_label_size) { + label->u.addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (jump && jump->addr == half_count) { - jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8); - code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == half_count) { + + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { + half_count = half_count - 1 + (jump->flags >> JUMP_SIZE_SHIFT); + jump->addr = (sljit_uw)code_ptr; + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + SLJIT_ASSERT((sljit_uw)code_ptr - jump->addr < + ((jump->flags >> JUMP_SIZE_SHIFT) + ((jump->flags & 0xf0) <= PATCH_TYPE2)) * sizeof(sljit_u16)); + } else { + half_count += jump->flags >> JUMP_SIZE_SHIFT; + addr = (sljit_sw)code_ptr; + code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset); + jump->addr = (sljit_uw)addr; + } + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == half_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; half_count++; @@ -449,7 +642,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } while (buf); if (label && label->size == half_count) { - label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; + label->u.addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; label->size = (sljit_uw)(code_ptr - code); label = label->next; } @@ -457,21 +650,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; while (jump) { - set_jump_instruction(jump, executable_offset); + generate_jump_or_mov_addr(jump, executable_offset); jump = jump->next; } - put_label = compiler->put_labels; - while (put_label) { - modify_imm32_const((sljit_u16 *)put_label->addr, put_label->label->addr); - put_label = put_label->next; - } - compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_u16); @@ -490,13 +676,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) { switch (feature_type) { case SLJIT_HAS_FPU: + case SLJIT_HAS_F64_AS_F32_PAIR: + case SLJIT_HAS_SIMD: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #else /* Available by default. */ return 1; #endif + case SLJIT_SIMD_REGS_ARE_PAIRS: case SLJIT_HAS_CLZ: case SLJIT_HAS_CTZ: case SLJIT_HAS_REV: @@ -505,6 +694,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) case SLJIT_HAS_PREFETCH: case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: + case SLJIT_HAS_ATOMIC: return 1; default: @@ -621,6 +811,10 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s case SLJIT_CLZ: case SLJIT_CTZ: case SLJIT_REV: + case SLJIT_REV_U16: + case SLJIT_REV_S16: + case SLJIT_REV_U32: + case SLJIT_REV_S32: case SLJIT_MUL: /* No form with immediate operand. */ break; @@ -657,9 +851,14 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s break; case SLJIT_ADDC: compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD; - imm = get_imm(imm); - if (imm != INVALID_IMM) - return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + imm2 = get_imm(imm); + if (imm2 != INVALID_IMM) + return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm2); + if (flags & ARG2_IMM) { + imm = get_imm(~imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + } break; case SLJIT_SUB: compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB; @@ -712,9 +911,12 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB; if (flags & ARG1_IMM) break; - imm = get_imm(imm); + imm2 = get_imm(imm); + if (imm2 != INVALID_IMM) + return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm2); + imm = get_imm(~imm); if (imm != INVALID_IMM) - return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); break; case SLJIT_AND: imm2 = get_imm(imm); @@ -793,8 +995,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s imm = arg2; arg2 = (arg1 == TMP_REG1) ? TMP_REG2 : TMP_REG1; FAIL_IF(load_immediate(compiler, (sljit_s32)arg2, imm)); - } - else { + } else { imm = arg1; arg1 = (arg2 == TMP_REG1) ? TMP_REG2 : TMP_REG1; FAIL_IF(load_immediate(compiler, (sljit_s32)arg1, imm)); @@ -842,9 +1043,28 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s FAIL_IF(push_inst32(compiler, RBIT | RN4(arg2) | RD4(dst) | RM4(arg2))); return push_inst32(compiler, CLZ | RN4(dst) | RD4(dst) | RM4(dst)); case SLJIT_REV: + case SLJIT_REV_U32: + case SLJIT_REV_S32: + SLJIT_ASSERT(arg1 == TMP_REG2); if (IS_2_LO_REGS(dst, arg2)) return push_inst16(compiler, REV | RD3(dst) | RN3(arg2)); return push_inst32(compiler, REV_W | RN4(arg2) | RD4(dst) | RM4(arg2)); + case SLJIT_REV_U16: + case SLJIT_REV_S16: + SLJIT_ASSERT(arg1 == TMP_REG2 && dst != TMP_REG2); + + flags &= 0xffff; + if (IS_2_LO_REGS(dst, arg2)) + FAIL_IF(push_inst16(compiler, REV16 | RD3(dst) | RN3(arg2))); + else + FAIL_IF(push_inst32(compiler, REV16_W | RN4(arg2) | RD4(dst) | RM4(arg2))); + + if (dst == TMP_REG1 || (arg2 == TMP_REG1 && flags == SLJIT_REV_U16)) + return SLJIT_SUCCESS; + + if (reg_map[dst] <= 7) + return push_inst16(compiler, (flags == SLJIT_REV_U16 ? UXTH : SXTH) | RD3(dst) | RN3(dst)); + return push_inst32(compiler, (flags == SLJIT_REV_U16 ? UXTH_W : SXTH_W) | RD4(dst) | RM4(dst)); case SLJIT_ADD: compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD; if (IS_3_LO_REGS(dst, arg1, arg2)) @@ -895,32 +1115,36 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst16(compiler, EORS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, EOR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MSHL: - FAIL_IF(push_inst32(compiler, ANDI | RD4(TMP_REG2) | RN4(arg2) | 0x1f)); - arg2 = TMP_REG2; + reg = (arg2 == TMP_REG1) ? TMP_REG1 : TMP_REG2; + FAIL_IF(push_inst32(compiler, ANDI | RD4(reg) | RN4(arg2) | 0x1f)); + arg2 = (sljit_uw)reg; /* fallthrough */ case SLJIT_SHL: if (dst == (sljit_s32)arg1 && IS_2_LO_REGS(dst, arg2)) return push_inst16(compiler, LSLS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, LSL_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MLSHR: - FAIL_IF(push_inst32(compiler, ANDI | RD4(TMP_REG2) | RN4(arg2) | 0x1f)); - arg2 = TMP_REG2; + reg = (arg2 == TMP_REG1) ? TMP_REG1 : TMP_REG2; + FAIL_IF(push_inst32(compiler, ANDI | RD4(reg) | RN4(arg2) | 0x1f)); + arg2 = (sljit_uw)reg; /* fallthrough */ case SLJIT_LSHR: if (dst == (sljit_s32)arg1 && IS_2_LO_REGS(dst, arg2)) return push_inst16(compiler, LSRS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, LSR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MASHR: - FAIL_IF(push_inst32(compiler, ANDI | RD4(TMP_REG2) | RN4(arg2) | 0x1f)); - arg2 = TMP_REG2; + reg = (arg2 == TMP_REG1) ? TMP_REG1 : TMP_REG2; + FAIL_IF(push_inst32(compiler, ANDI | RD4(reg) | RN4(arg2) | 0x1f)); + arg2 = (sljit_uw)reg; /* fallthrough */ case SLJIT_ASHR: if (dst == (sljit_s32)arg1 && IS_2_LO_REGS(dst, arg2)) return push_inst16(compiler, ASRS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, ASR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_ROTL: - FAIL_IF(push_inst32(compiler, RSB_WI | RD4(TMP_REG2) | RN4(arg2) | 0)); - arg2 = TMP_REG2; + reg = (arg2 == TMP_REG1) ? TMP_REG1 : TMP_REG2; + FAIL_IF(push_inst32(compiler, RSB_WI | RD4(reg) | RN4(arg2) | 0)); + arg2 = (sljit_uw)reg; /* fallthrough */ case SLJIT_ROTR: if (dst == (sljit_s32)arg1 && IS_2_LO_REGS(dst, arg2)) @@ -1180,12 +1404,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi } if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) { - FAIL_IF(push_inst32(compiler, VPUSH | DD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); + FAIL_IF(push_inst32(compiler, VPUSH | VD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); } else { if (fsaveds > 0) - FAIL_IF(push_inst32(compiler, VPUSH | DD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); + FAIL_IF(push_inst32(compiler, VPUSH | VD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) - FAIL_IF(push_inst32(compiler, VPUSH | DD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); + FAIL_IF(push_inst32(compiler, VPUSH | VD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); } } @@ -1262,17 +1486,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi switch (arg_types & SLJIT_ARG_MASK) { case SLJIT_ARG_TYPE_F64: if (offset != old_offset) - *remap_ptr++ = VMOV_F32 | SLJIT_32 | DD4(offset) | DM4(old_offset); + *remap_ptr++ = VMOV_F32 | SLJIT_32 | VD4(offset) | VM4(old_offset); old_offset++; offset++; break; case SLJIT_ARG_TYPE_F32: if (f32_offset != 0) { - *remap_ptr++ = VMOV_F32 | 0x20 | DD4(offset) | DM4(f32_offset); + *remap_ptr++ = VMOV_F32 | 0x20 | VD4(offset) | VM4(f32_offset); f32_offset = 0; } else { if (offset != old_offset) - *remap_ptr++ = VMOV_F32 | DD4(offset) | DM4(old_offset); + *remap_ptr++ = VMOV_F32 | VD4(offset) | VM4(old_offset); f32_offset = old_offset; old_offset++; } @@ -1406,12 +1630,12 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit FAIL_IF(emit_add_sp(compiler, (sljit_uw)local_size)); if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) { - FAIL_IF(push_inst32(compiler, VPOP | DD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); + FAIL_IF(push_inst32(compiler, VPOP | VD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1))); } else { if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) - FAIL_IF(push_inst32(compiler, VPOP | DD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); + FAIL_IF(push_inst32(compiler, VPOP | VD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1))); if (fsaveds > 0) - FAIL_IF(push_inst32(compiler, VPOP | DD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); + FAIL_IF(push_inst32(compiler, VPOP | VD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1))); } local_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1) & 0x7; @@ -1710,22 +1934,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile break; case SLJIT_MOV_U8: flags = BYTE_SIZE; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_u8)srcw; break; case SLJIT_MOV_S8: flags = BYTE_SIZE | SIGNED; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_s8)srcw; break; case SLJIT_MOV_U16: flags = HALF_SIZE; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_u16)srcw; break; case SLJIT_MOV_S16: flags = HALF_SIZE | SIGNED; - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) srcw = (sljit_s16)srcw; break; default: @@ -1734,7 +1958,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile break; } - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG2, (sljit_uw)srcw)); else if (src & SLJIT_MEM) { FAIL_IF(emit_op_mem(compiler, flags, dst_r, src, srcw, TMP_REG1)); @@ -1750,10 +1974,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2); } + SLJIT_COMPILE_ASSERT(WORD_SIZE == 0, word_size_must_be_0); flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0; + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) + flags |= HALF_SIZE; + if (src & SLJIT_MEM) { - FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); + FAIL_IF(emit_op_mem(compiler, flags, TMP_REG1, src, srcw, TMP_REG1)); src = TMP_REG1; } @@ -1783,7 +2011,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile if (dst == TMP_REG1) flags |= UNUSED_RETURN; - if (src1 & SLJIT_IMM) + if (src1 == SLJIT_IMM) flags |= ARG1_IMM; else if (src1 & SLJIT_MEM) { emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1); @@ -1792,7 +2020,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile else src1w = src1; - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) flags |= ARG2_IMM; else if (src2 & SLJIT_MEM) { src2_reg = (!(flags & ARG1_IMM) && (src1w == TMP_REG1)) ? TMP_REG2 : TMP_REG1; @@ -1841,7 +2069,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= 0x1f; if (src3w == 0) @@ -1946,16 +2174,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); - return (freg_map[reg] << 1); + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type == SLJIT_FLOAT_REGISTER || type == SLJIT_SIMD_REG_64) + return freg_map[reg]; + + if (type != SLJIT_SIMD_REG_128) + return freg_map[reg] & ~0x1; + + return -1; } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, @@ -1991,35 +2223,35 @@ static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, if ((arg & REG_MASK) && (argw & 0x3) == 0) { if (!(argw & ~0x3fc)) - return push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | DD4(reg) | ((sljit_uw)argw >> 2)); + return push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | VD4(reg) | ((sljit_uw)argw >> 2)); if (!(-argw & ~0x3fc)) - return push_inst32(compiler, inst | RN4(arg & REG_MASK) | DD4(reg) | ((sljit_uw)-argw >> 2)); + return push_inst32(compiler, inst | RN4(arg & REG_MASK) | VD4(reg) | ((sljit_uw)-argw >> 2)); } if (arg & REG_MASK) { if (emit_set_delta(compiler, TMP_REG1, arg & REG_MASK, argw) != SLJIT_ERR_UNSUPPORTED) { FAIL_IF(compiler->error); - return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg)); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg)); } imm = get_imm((sljit_uw)argw & ~(sljit_uw)0x3fc); if (imm != INVALID_IMM) { FAIL_IF(push_inst32(compiler, ADD_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm)); - return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2)); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2)); } imm = get_imm((sljit_uw)-argw & ~(sljit_uw)0x3fc); if (imm != INVALID_IMM) { argw = -argw; FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm)); - return push_inst32(compiler, inst | RN4(TMP_REG1) | DD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2)); + return push_inst32(compiler, inst | RN4(TMP_REG1) | VD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2)); } } FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)argw)); if (arg & REG_MASK) FAIL_IF(push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, (arg & REG_MASK)))); - return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg)); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg)); } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, @@ -2033,41 +2265,53 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp src = TMP_FREG1; } - FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_32) | DD4(TMP_FREG1) | DM4(src))); + FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_32) | VD4(TMP_FREG1) | VM4(src))); if (FAST_IS_REG(dst)) - return push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | DN4(TMP_FREG1)); + return push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | VN4(TMP_FREG1)); /* Store the integer value from a VFP register. */ return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - op ^= SLJIT_32; - if (FAST_IS_REG(src)) - FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1))); + FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | VN4(TMP_FREG1))); else if (src & SLJIT_MEM) { /* Load the integer value into a VFP register. */ FAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw)); } else { FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw)); - FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1))); + FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | VN4(TMP_FREG1))); } - FAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_32) | DD4(dst_r) | DM4(TMP_FREG1))); + FAIL_IF(push_inst32(compiler, ins | VD4(dst_r) | VM4(TMP_FREG1))); if (dst & SLJIT_MEM) - return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw); + return emit_fop_mem(compiler, (ins & SLJIT_32), TMP_FREG1, dst, dstw); return SLJIT_SUCCESS; } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_S32 | (~op & SLJIT_32), dst, dstw, src, srcw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_U32 | (~op & SLJIT_32), dst, dstw, src, srcw); +} + static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) @@ -2075,17 +2319,23 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile op ^= SLJIT_32; if (src1 & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w)); src1 = TMP_FREG1; } if (src2 & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w)); src2 = TMP_FREG2; } - FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_32) | DD4(src1) | DM4(src2))); - return push_inst32(compiler, VMRS); + FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_32) | VD4(src1) | VM4(src2))); + FAIL_IF(push_inst32(compiler, VMRS)); + + if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst16(compiler, IT | (0x6 << 4) | 0x8)); + return push_inst16(compiler, CMP /* Rm, Rn = r0 */); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -2105,7 +2355,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil op ^= SLJIT_32; if (src & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, dst_r, src, srcw); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, dst_r, src, srcw)); src = dst_r; } @@ -2113,19 +2363,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil case SLJIT_MOV_F64: if (src != dst_r) { if (dst_r != TMP_FREG1) - FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src))); + FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src))); else dst_r = src; } break; case SLJIT_NEG_F64: - FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src))); + FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src))); break; case SLJIT_ABS_F64: - FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src))); + FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src))); break; case SLJIT_CONV_F64_FROM_F32: - FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src))); + FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src))); op ^= SLJIT_32; break; } @@ -2152,27 +2402,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; if (src1 & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w)); src1 = TMP_FREG1; } if (src2 & SLJIT_MEM) { - emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w); + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w)); src2 = TMP_FREG2; } switch (GET_OPCODE(op)) { case SLJIT_ADD_F64: - FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2))); + FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2))); break; case SLJIT_SUB_F64: - FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2))); + FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2))); break; case SLJIT_MUL_F64: - FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2))); + FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2))); break; case SLJIT_DIV_F64: - FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2))); + FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2))); break; + case SLJIT_COPYSIGN_F64: + FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(src2) | RT4(TMP_REG1) | ((op & SLJIT_32) ? (1 << 7) : 0))); + FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src1))); + FAIL_IF(push_inst32(compiler, CMPI_W | RN4(TMP_REG1) | 0)); + FAIL_IF(push_inst16(compiler, IT | (0xb << 4) | 0x8)); + return push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(dst_r)); } if (!(dst & SLJIT_MEM)) @@ -2180,6 +2436,74 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ +#if defined(__ARM_NEON) && __ARM_NEON + sljit_u32 exp; + sljit_ins ins; +#endif /* NEON */ + union { + sljit_u32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + +#if defined(__ARM_NEON) && __ARM_NEON + if ((u.imm << (32 - 19)) == 0) { + exp = (u.imm >> (23 + 2)) & 0x3f; + + if (exp == 0x20 || exp == 0x1f) { + ins = ((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f); + return push_inst32(compiler, (VMOV_F32 ^ (1 << 6)) | ((ins & 0xf0) << 12) | VD4(freg) | (ins & 0xf)); + } + } +#endif /* NEON */ + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + return push_inst32(compiler, VMOV | VN4(freg) | RT4(TMP_REG1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ +#if defined(__ARM_NEON) && __ARM_NEON + sljit_u32 exp; + sljit_ins ins; +#endif /* NEON */ + union { + sljit_u32 imm[2]; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + +#if defined(__ARM_NEON) && __ARM_NEON + if (u.imm[0] == 0 && (u.imm[1] << (64 - 48)) == 0) { + exp = (u.imm[1] >> ((52 - 32) + 2)) & 0x1ff; + + if (exp == 0x100 || exp == 0xff) { + ins = ((u.imm[1] >> (56 - 32)) & 0x80) | ((u.imm[1] >> (48 - 32)) & 0x7f); + return push_inst32(compiler, (VMOV_F32 ^ (1 << 6)) | (1 << 8) | ((ins & 0xf0) << 12) | VD4(freg) | (ins & 0xf)); + } + } +#endif /* NEON */ + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0])); + if (u.imm[0] == u.imm[1]) + return push_inst32(compiler, VMOV2 | RN4(TMP_REG1) | RT4(TMP_REG1) | VM4(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1])); + return push_inst32(compiler, VMOV2 | RN4(TMP_REG2) | RT4(TMP_REG1) | VM4(freg)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -2193,9 +2517,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi reg2 = REG_PAIR_SECOND(reg); reg = REG_PAIR_FIRST(reg); - inst = VMOV2 | RN4(reg) | RT4(reg2) | DM4(freg); + inst = VMOV2 | RN4(reg) | RT4(reg2) | VM4(freg); } else { - inst = VMOV | DN4(freg) | RT4(reg); + inst = VMOV | VN4(freg) | RT4(reg); if (!(op & SLJIT_32)) inst |= 1 << 7; @@ -2215,15 +2539,17 @@ static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL: + case SLJIT_ATOMIC_STORED: case SLJIT_F_EQUAL: case SLJIT_ORDERED_EQUAL: - case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */ + case SLJIT_UNORDERED_OR_EQUAL: return 0x0; case SLJIT_NOT_EQUAL: + case SLJIT_ATOMIC_NOT_STORED: case SLJIT_F_NOT_EQUAL: case SLJIT_UNORDERED_OR_NOT_EQUAL: - case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */ + case SLJIT_ORDERED_NOT_EQUAL: return 0x1; case SLJIT_CARRY: @@ -2327,7 +2653,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); type &= 0xff; - PTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); if (type < SLJIT_JUMP) { jump->flags |= IS_COND; cc = get_cc(compiler, type); @@ -2343,6 +2668,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile PTR_FAIL_IF(push_inst16(compiler, BLX | RN3(TMP_REG1))); } + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return jump; } @@ -2498,18 +2825,18 @@ static sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit switch (arg_types & SLJIT_ARG_MASK) { case SLJIT_ARG_TYPE_F64: if (offset != new_offset) - FAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_32 | DD4(new_offset) | DM4(offset))); + FAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_32 | VD4(new_offset) | VM4(offset))); new_offset++; offset++; break; case SLJIT_ARG_TYPE_F32: if (f32_offset != 0) { - FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | DD4(f32_offset) | DM4(offset))); + FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | VD4(f32_offset) | VM4(offset))); f32_offset = 0; } else { if (offset != new_offset) - FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | DD4(new_offset) | DM4(offset))); + FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | VD4(new_offset) | VM4(offset))); f32_offset = new_offset; new_offset++; } @@ -2591,7 +2918,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi SLJIT_ASSERT(reg_map[TMP_REG1] != 14); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { if (FAST_IS_REG(src)) { SLJIT_ASSERT(reg_map[src] != 14); return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(src)); @@ -2608,8 +2935,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); jump->u.target = (sljit_uw)srcw; - FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); jump->addr = compiler->size; + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(TMP_REG1)); } @@ -2690,8 +3018,8 @@ static SLJIT_INLINE sljit_s32 emit_fmov_before_return(struct sljit_compiler *com if (FAST_IS_REG(src)) { if (op & SLJIT_32) - return push_inst32(compiler, VMOV | (1 << 20) | DN4(src) | RT4(SLJIT_R0)); - return push_inst32(compiler, VMOV2 | (1 << 20) | DM4(src) | RT4(SLJIT_R0) | RN4(SLJIT_R1)); + return push_inst32(compiler, VMOV | (1 << 20) | VN4(src) | RT4(SLJIT_R0)); + return push_inst32(compiler, VMOV2 | (1 << 20) | VM4(src) | RT4(SLJIT_R0) | RN4(SLJIT_R1)); } SLJIT_SKIP_CHECKS(compiler); @@ -2756,23 +3084,47 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return push_inst32(compiler, MOV_W | SET_FLAGS | RD4(TMP_REG1) | RM4(dst_r)); } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { sljit_uw cc, tmp; CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (src2_reg != dst_reg && src1 == dst_reg) { + src1 = src2_reg; + src1w = 0; + src2_reg = dst_reg; + type ^= 0x1; + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, (src2_reg != dst_reg) ? dst_reg : TMP_REG1, src1, src1w, TMP_REG2)); + + if (src2_reg != dst_reg) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + src1 = TMP_REG1; + src1w = 0; + } + } else if (dst_reg != src2_reg) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(dst_reg, src2_reg))); cc = get_cc(compiler, type & ~SLJIT_32); - if (!(src & SLJIT_IMM)) { + if (src1 != SLJIT_IMM) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); - return push_inst16(compiler, MOV | SET_REGS44(dst_reg, src)); + return push_inst16(compiler, MOV | SET_REGS44(dst_reg, src1)); } - tmp = (sljit_uw) srcw; + tmp = (sljit_uw)src1w; if (tmp < 0x10000) { /* set low 16 bits, set hi 16 bits to 0. */ @@ -2781,13 +3133,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil | COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff)); } - tmp = get_imm((sljit_uw)srcw); + tmp = get_imm((sljit_uw)src1w); if (tmp != INVALID_IMM) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); return push_inst32(compiler, MOV_WI | RD4(dst_reg) | tmp); } - tmp = get_imm(~(sljit_uw)srcw); + tmp = get_imm(~(sljit_uw)src1w); if (tmp != INVALID_IMM) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); return push_inst32(compiler, MVN_WI | RD4(dst_reg) | tmp); @@ -2795,13 +3147,43 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil FAIL_IF(push_inst16(compiler, IT | (cc << 4) | ((cc & 0x1) << 3) | 0x4)); - tmp = (sljit_uw) srcw; + tmp = (sljit_uw)src1w; FAIL_IF(push_inst32(compiler, MOVW | RD4(dst_reg) | COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff))); return push_inst32(compiler, MOVT | RD4(dst_reg) | COPY_BITS(tmp, 12 + 16, 16, 4) | COPY_BITS(tmp, 11 + 16, 26, 1) | COPY_BITS(tmp, 8 + 16, 12, 3) | ((tmp & 0xff0000) >> 16)); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + type ^= SLJIT_32; + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst32(compiler, VMOV_F32 | (type & SLJIT_32) | VD4(dst_freg) | VM4(src2_freg))); + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w)); + src1 = TMP_FREG1; + } + + FAIL_IF(push_inst16(compiler, IT | (get_cc(compiler, type & ~SLJIT_32) << 4) | 0x8)); + return push_inst32(compiler, VMOV_F32 | (type & SLJIT_32) | VD4(dst_freg) | VM4(src1)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) @@ -2815,7 +3197,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile if (!(reg & REG_PAIR_MASK)) return sljit_emit_mem_unaligned(compiler, type, reg, mem, memw); - if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)) { + if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)) { if ((mem & REG_MASK) == 0) { if ((memw & 0xfff) >= (0x1000 - SSIZE_OF(sw))) { imm = get_imm((sljit_uw)((memw + 0x1000) & ~0xfff)); @@ -2826,7 +3208,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile imm = get_imm((sljit_uw)(memw & ~0xfff)); if (imm != INVALID_IMM) - memw &= 0xff; + memw &= 0xfff; } if (imm == INVALID_IMM) { @@ -3103,11 +3485,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil CHECK_ERROR(); CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw)); - if (type & SLJIT_MEM_UNALIGNED_32) + if (type & SLJIT_MEM_ALIGNED_32) return emit_fop_mem(compiler, ((type ^ SLJIT_32) & SLJIT_32) | ((type & SLJIT_MEM_STORE) ? 0 : FPU_LOAD), freg, mem, memw); if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | DN4(freg) | RT4(TMP_REG2))); + FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(freg) | RT4(TMP_REG2))); if (type & SLJIT_32) return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw, TMP_REG1); @@ -3116,13 +3498,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil mem |= SLJIT_MEM; FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw, TMP_REG1)); - FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | DN4(freg) | 0x80 | RT4(TMP_REG2))); + FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(freg) | 0x80 | RT4(TMP_REG2))); return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw + 4, TMP_REG1); } if (type & SLJIT_32) { FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1)); - return push_inst32(compiler, VMOV | DN4(freg) | RT4(TMP_REG2)); + return push_inst32(compiler, VMOV | VN4(freg) | RT4(TMP_REG2)); } FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4)); @@ -3130,11 +3512,715 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1)); FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, mem, memw + 4, TMP_REG1)); - return push_inst32(compiler, VMOV2 | DM4(freg) | RT4(TMP_REG2) | RN4(TMP_REG1)); + return push_inst32(compiler, VMOV2 | VM4(freg) | RT4(TMP_REG2) | RN4(TMP_REG1)); +} + +static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw) +{ + sljit_uw imm; + sljit_s32 mem = *mem_ptr; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + *mem_ptr = TMP_REG1; + return push_inst32(compiler, ADD_W | RD4(TMP_REG1) | RN4(mem & REG_MASK) | RM4(OFFS_REG(mem)) | ((sljit_uw)(memw & 0x3) << 6)); + } + + if (SLJIT_UNLIKELY(!(mem & REG_MASK))) { + *mem_ptr = TMP_REG1; + return load_immediate(compiler, TMP_REG1, (sljit_uw)memw); + } + + mem &= REG_MASK; + + if (memw == 0) { + *mem_ptr = mem; + return SLJIT_SUCCESS; + } + + *mem_ptr = TMP_REG1; + imm = get_imm((sljit_uw)(memw < 0 ? -memw : memw)); + + if (imm != INVALID_IMM) + return push_inst32(compiler, ((memw < 0) ? SUB_WI : ADD_WI) | RD4(TMP_REG1) | RN4(mem) | imm); + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)memw)); + return push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, mem)); +} + +static SLJIT_INLINE sljit_s32 simd_get_quad_reg_index(sljit_s32 freg) +{ + freg += freg & 0x1; + + SLJIT_ASSERT((freg_map[freg] & 0x1) == (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)); + + if (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS) + freg--; + + return freg; +} + +#define SLJIT_QUAD_OTHER_HALF(freg) ((((freg) & 0x1) << 1) - 1) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (!(srcdst & SLJIT_MEM)) { + if (reg_size == 4) + srcdst = simd_get_quad_reg_index(srcdst); + + if (type & SLJIT_SIMD_STORE) + ins = VD4(srcdst) | VN4(freg) | VM4(freg); + else + ins = VD4(freg) | VN4(srcdst) | VM4(srcdst); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst32(compiler, VORR | ins); + } + + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + if (elem_size > 3) + elem_size = 3; + + ins = ((type & SLJIT_SIMD_STORE) ? VST1 : VLD1) | VD4(freg) + | (sljit_ins)((reg_size == 3) ? (0x7 << 8) : (0xa << 8)); + + SLJIT_ASSERT(reg_size >= alignment); + + if (alignment == 3) + ins |= 0x10; + else if (alignment >= 4) + ins |= 0x20; + + return push_inst32(compiler, ins | RN4(srcdst) | ((sljit_ins)elem_size) << 6 | 0xf); +} + +static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value) +{ + sljit_ins result; + + if (elem_size > 1 && (sljit_u16)value == (value >> 16)) { + elem_size = 1; + value = (sljit_u16)value; + } + + if (elem_size == 1 && (sljit_u8)value == (value >> 8)) { + elem_size = 0; + value = (sljit_u8)value; + } + + switch (elem_size) { + case 0: + SLJIT_ASSERT(value <= 0xff); + result = 0xe00; + break; + case 1: + SLJIT_ASSERT(value <= 0xffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x800; + break; + } + + if ((value & 0xff) == 0) { + value >>= 8; + result |= 0xa00; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value ^= (sljit_uw)0xffff; + result = (1 << 5); + } + break; + default: + SLJIT_ASSERT(value <= 0xffffffff); + result = 0; + + while (1) { + if (value <= 0xff) { + result |= 0x000; + break; + } + + if ((value & ~(sljit_uw)0xff00) == 0) { + value >>= 8; + result |= 0x200; + break; + } + + if ((value & ~(sljit_uw)0xff0000) == 0) { + value >>= 16; + result |= 0x400; + break; + } + + if ((value & ~(sljit_uw)0xff000000) == 0) { + value >>= 24; + result |= 0x600; + break; + } + + if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) { + value >>= 8; + result |= 0xc00; + break; + } + + if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) { + value >>= 16; + result |= 0xd00; + break; + } + + if (result != 0) + return ~(sljit_ins)0; + + value = ~value; + result = (1 << 5); + } + break; + } + + return ((sljit_ins)value & 0xf) | (((sljit_ins)value & 0x70) << 12) | (((sljit_ins)value & 0x80) << 21) | result; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imm; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (src == SLJIT_IMM && srcw == 0) + return push_inst32(compiler, VMOV_i | ((reg_size == 4) ? (1 << 6) : 0) | VD4(freg)); + + if (SLJIT_UNLIKELY(elem_size == 3)) { + SLJIT_ASSERT(type & SLJIT_SIMD_FLOAT); + + if (src & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, FPU_LOAD | SLJIT_32, freg, src, srcw)); + src = freg; + } else if (freg != src) + FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (freg != src) + return push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src)); + return SLJIT_SUCCESS; + } + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + + ins = (sljit_ins)(elem_size << 6); + + if (reg_size == 4) + ins |= 1 << 5; + + return push_inst32(compiler, VLD1_r | ins | VD4(freg) | RN4(src) | 0xf); + } + + if (type & SLJIT_SIMD_FLOAT) { + SLJIT_ASSERT(elem_size == 2); + ins = ((sljit_ins)freg_ebit_map[src] << (16 + 2 + 1)) | ((sljit_ins)1 << (16 + 2)); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst32(compiler, VDUP_s | ins | VD4(freg) | (sljit_ins)freg_map[src]); + } + + if (src == SLJIT_IMM) { + if (elem_size < 2) + srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + imm = simd_get_imm(elem_size, (sljit_uw)srcw); + + if (imm != ~(sljit_ins)0) { + if (reg_size == 4) + imm |= (sljit_ins)1 << 6; + + return push_inst32(compiler, VMOV_i | imm | VD4(freg)); + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw)); + src = TMP_REG1; + } + + switch (elem_size) { + case 0: + ins = 1 << 22; + break; + case 1: + ins = 1 << 5; + break; + default: + ins = 0; + break; + } + + if (reg_size == 4) + ins |= (sljit_ins)1 << 21; + + return push_inst32(compiler, VDUP | ins | VN4(freg) | RT4(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (type & SLJIT_SIMD_LANE_ZERO) { + ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 6); + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 3 && !(srcdst & SLJIT_MEM)) { + if (lane_index == 1) + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (srcdst != freg) + FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(srcdst) | VM4(srcdst))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst32(compiler, VMOV_i | VD4(freg)); + } + + if (srcdst == freg || (elem_size == 3 && srcdst == (freg + SLJIT_QUAD_OTHER_HALF(freg)))) { + FAIL_IF(push_inst32(compiler, VORR | ins | VD4(TMP_FREG2) | VN4(freg) | VM4(freg))); + srcdst = TMP_FREG2; + srcdstw = 0; + } + } + + FAIL_IF(push_inst32(compiler, VMOV_i | ins | VD4(freg))); + } + + if (reg_size == 4 && lane_index >= (0x8 >> elem_size)) { + lane_index -= (0x8 >> elem_size); + freg += SLJIT_QUAD_OTHER_HALF(freg); + } + + if (srcdst & SLJIT_MEM) { + if (elem_size == 3) + return emit_fop_mem(compiler, ((type & SLJIT_SIMD_STORE) ? 0 : FPU_LOAD) | SLJIT_32, freg, srcdst, srcdstw); + + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw)); + + lane_index = lane_index << elem_size; + ins = (sljit_ins)((elem_size << 10) | (lane_index << 5)); + return push_inst32(compiler, ((type & SLJIT_SIMD_STORE) ? VST1_s : VLD1_s) | ins | VD4(freg) | RN4(srcdst) | 0xf); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 3) { + if (type & SLJIT_SIMD_STORE) + return push_inst32(compiler, VORR | VD4(srcdst) | VN4(freg) | VM4(freg)); + return push_inst32(compiler, VMOV_F32 | SLJIT_32 | VD4(freg) | VM4(srcdst)); + } + + if (type & SLJIT_SIMD_STORE) { + if (freg_ebit_map[freg] == 0) { + if (lane_index == 1) + freg = SLJIT_F64_SECOND(freg); + + return push_inst32(compiler, VMOV_F32 | VD4(srcdst) | VM4(freg)); + } + + FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | ((sljit_ins)lane_index << 21) | VN4(freg) | RT4(TMP_REG1))); + return push_inst32(compiler, VMOV | VN4(srcdst) | RT4(TMP_REG1)); + } + + FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(srcdst) | RT4(TMP_REG1))); + return push_inst32(compiler, VMOV_s | ((sljit_ins)lane_index << 21) | VN4(freg) | RT4(TMP_REG1)); + } + + if (srcdst == SLJIT_IMM) { + if (elem_size < 2) + srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1; + + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcdstw)); + srcdst = TMP_REG1; + } + + if (elem_size == 0) + ins = 0x400000; + else if (elem_size == 1) + ins = 0x20; + else + ins = 0; + + lane_index = lane_index << elem_size; + ins |= (sljit_ins)(((lane_index & 0x4) << 19) | ((lane_index & 0x3) << 5)); + + if (type & SLJIT_SIMD_STORE) { + ins |= (1 << 20); + + if (elem_size < 2 && !(type & SLJIT_SIMD_LANE_SIGNED)) + ins |= (1 << 23); + } + + return push_inst32(compiler, VMOV_s | ins | VN4(freg) | RT4(srcdst)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) { + freg = simd_get_quad_reg_index(freg); + src = simd_get_quad_reg_index(src); + + if (src_lane_index >= (0x8 >> elem_size)) { + src_lane_index -= (0x8 >> elem_size); + src += SLJIT_QUAD_OTHER_HALF(src); + } + } + + if (elem_size == 3) { + if (freg != src) + FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src))); + + freg += SLJIT_QUAD_OTHER_HALF(freg); + + if (freg != src) + return push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src)); + return SLJIT_SUCCESS; + } + + ins = ((((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size)); + + if (reg_size == 4) + ins |= (sljit_ins)1 << 6; + + return push_inst32(compiler, VDUP_s | ins | VD4(freg) | VM4(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_s32 dst_reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + freg = simd_get_quad_reg_index(freg); + + if (src & SLJIT_MEM) { + FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw)); + if (reg_size == 4 && elem2_size - elem_size == 1) + FAIL_IF(push_inst32(compiler, VLD1 | (0x7 << 8) | VD4(freg) | RN4(src) | 0xf)); + else + FAIL_IF(push_inst32(compiler, VLD1_s | (sljit_ins)((reg_size - elem2_size + elem_size) << 10) | VD4(freg) | RN4(src) | 0xf)); + src = freg; + } else if (reg_size == 4) + src = simd_get_quad_reg_index(src); + + if (!(type & SLJIT_SIMD_FLOAT)) { + dst_reg = (reg_size == 4) ? freg : TMP_FREG2; + + do { + FAIL_IF(push_inst32(compiler, VSHLL | ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0 : (1 << 28)) + | ((sljit_ins)1 << (19 + elem_size)) | VD4(dst_reg) | VM4(src))); + src = dst_reg; + } while (++elem_size < elem2_size); + + if (dst_reg == TMP_FREG2) + return push_inst32(compiler, VORR | VD4(freg) | VN4(TMP_FREG2) | VM4(TMP_FREG2)); + return SLJIT_SUCCESS; + } + + /* No SIMD variant, must use VFP instead. */ + SLJIT_ASSERT(reg_size == 4); + + if (freg == src) { + freg += SLJIT_QUAD_OTHER_HALF(freg); + FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src) | 0x20)); + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src)); + } + + FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src))); + freg += SLJIT_QUAD_OTHER_HALF(freg); + return push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src) | 0x20); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins, imms; + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + switch (elem_size) { + case 0: + imms = 0x243219; + ins = VSHR | (1 << 28) | (0x9 << 16); + break; + case 1: + imms = (reg_size == 4) ? 0x243219 : 0x2231; + ins = VSHR | (1 << 28) | (0x11 << 16); + break; + case 2: + imms = (reg_size == 4) ? 0x2231 : 0x21; + ins = VSHR | (1 << 28) | (0x21 << 16); + break; + default: + imms = 0x21; + ins = VSHR | (1 << 28) | (0x1 << 16) | (1 << 7); + break; + } + + if (reg_size == 4) { + freg = simd_get_quad_reg_index(freg); + ins |= (sljit_ins)1 << 6; + } + + SLJIT_ASSERT((freg_map[TMP_FREG2] & 0x1) == 0); + FAIL_IF(push_inst32(compiler, ins | VD4(TMP_FREG2) | VM4(freg))); + + if (reg_size == 4 && elem_size > 0) + FAIL_IF(push_inst32(compiler, VMOVN | ((sljit_ins)(elem_size - 1) << 18) | VD4(TMP_FREG2) | VM4(TMP_FREG2))); + + ins = (reg_size == 4 && elem_size == 0) ? (1 << 6) : 0; + + while (imms >= 0x100) { + FAIL_IF(push_inst32(compiler, VSRA | (1 << 28) | ins | ((imms & 0xff) << 16) | VD4(TMP_FREG2) | VM4(TMP_FREG2))); + imms >>= 8; + } + + FAIL_IF(push_inst32(compiler, VSRA | (1 << 28) | ins | (1 << 7) | (imms << 16) | VD4(TMP_FREG2) | VM4(TMP_FREG2))); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RT4(dst_r) | VN4(TMP_FREG2))); + + if (reg_size == 4 && elem_size == 0) { + SLJIT_ASSERT(freg_map[TMP_FREG2] + 1 == freg_map[TMP_FREG1]); + FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RT4(TMP_REG2)| VN4(TMP_FREG1))); + FAIL_IF(push_inst32(compiler, ORR_W | RD4(dst_r) | RN4(dst_r) | RM4(TMP_REG2) | (0x2 << 12))); + } + + if (dst_r == TMP_REG1) + return emit_op_mem(compiler, STORE | WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + + if (reg_size != 3 && reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + switch (SLJIT_SIMD_GET_OPCODE(type)) { + case SLJIT_SIMD_OP2_AND: + ins = VAND; + break; + case SLJIT_SIMD_OP2_OR: + ins = VORR; + break; + case SLJIT_SIMD_OP2_XOR: + ins = VEOR; + break; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) { + dst_freg = simd_get_quad_reg_index(dst_freg); + src1_freg = simd_get_quad_reg_index(src1_freg); + src2_freg = simd_get_quad_reg_index(src2_freg); + ins |= (sljit_ins)1 << 6; + } + + return push_inst32(compiler, ins | VD4(dst_freg) | VN4(src1_freg) | VM4(src2_freg)); } #undef FPU_LOAD +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = LDREXB; + break; + case SLJIT_MOV_U16: + ins = LDREXH; + break; + default: + ins = LDREX; + break; + } + + return push_inst32(compiler, ins | RN4(mem_reg) | RT4(dst_reg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_ins ins; + + /* temp_reg == mem_reg is undefined so use another temp register */ + SLJIT_UNUSED_ARG(temp_reg); + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = STREXB | RM4(TMP_REG1); + break; + case SLJIT_MOV_U16: + ins = STREXH | RM4(TMP_REG1); + break; + default: + ins = STREX | RD4(TMP_REG1); + break; + } + + FAIL_IF(push_inst32(compiler, ins | RN4(mem_reg) | RT4(src_reg))); + if (op & SLJIT_SET_ATOMIC_STORED) + return push_inst32(compiler, CMPI_W | RN4(TMP_REG1)); + + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { struct sljit_const *const_; @@ -3156,25 +4242,26 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; - PTR_FAIL_IF(emit_imm32_const(compiler, dst_r, 0)); + PTR_FAIL_IF(push_inst16(compiler, RDN3(dst_r))); + compiler->size += 3; if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); - return put_label; + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeLOONGARCH_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeLOONGARCH_64.c new file mode 100755 index 0000000000..a6fd044855 --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeLOONGARCH_64.c @@ -0,0 +1,3158 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ + return "LOONGARCH" SLJIT_CPUINFO; +} + +typedef sljit_u32 sljit_ins; + +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) +#define TMP_ZERO 0 + +/* Flags are kept in volatile registers. */ +#define EQUAL_FLAG (SLJIT_NUMBER_OF_REGISTERS + 5) +#define RETURN_ADDR_REG TMP_REG2 +#define OTHER_FLAG (SLJIT_NUMBER_OF_REGISTERS + 6) + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = { + 0, 4, 5, 6, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 22, 31, 30, 29, 28, 27, 26, 25, 24, 23, 3, 13, 1, 14, 12, 15 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 31, 30, 29, 28, 27, 26, 25, 24, 8, 9 +}; + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +/* +LoongArch instructions are 32 bits wide, belonging to 9 basic instruction formats (and variants of them): + +| Format name | Composition | +| 2R | Opcode + Rj + Rd | +| 3R | Opcode + Rk + Rj + Rd | +| 4R | Opcode + Ra + Rk + Rj + Rd | +| 2RI8 | Opcode + I8 + Rj + Rd | +| 2RI12 | Opcode + I12 + Rj + Rd | +| 2RI14 | Opcode + I14 + Rj + Rd | +| 2RI16 | Opcode + I16 + Rj + Rd | +| 1RI21 | Opcode + I21L + Rj + I21H | +| I26 | Opcode + I26L + I26H | + +Rd is the destination register operand, while Rj, Rk and Ra (“a” stands for “additional”) are the source register operands. +I8/I12/I14/I16/I21/I26 are immediate operands of respective width. The longer I21 and I26 are stored in separate higher and +lower parts in the instruction word, denoted by the “L” and “H” suffixes. */ + +#define RD(rd) ((sljit_ins)reg_map[rd]) +#define RJ(rj) ((sljit_ins)reg_map[rj] << 5) +#define RK(rk) ((sljit_ins)reg_map[rk] << 10) +#define RA(ra) ((sljit_ins)reg_map[ra] << 15) + +#define FD(fd) ((sljit_ins)reg_map[fd]) +#define FRD(fd) ((sljit_ins)freg_map[fd]) +#define FRJ(fj) ((sljit_ins)freg_map[fj] << 5) +#define FRK(fk) ((sljit_ins)freg_map[fk] << 10) +#define FRA(fa) ((sljit_ins)freg_map[fa] << 15) + +#define IMM_I8(imm) (((sljit_ins)(imm)&0xff) << 10) +#define IMM_I12(imm) (((sljit_ins)(imm)&0xfff) << 10) +#define IMM_I14(imm) (((sljit_ins)(imm)&0xfff3) << 10) +#define IMM_I16(imm) (((sljit_ins)(imm)&0xffff) << 10) +#define IMM_I21(imm) ((((sljit_ins)(imm)&0xffff) << 10) | (((sljit_ins)(imm) >> 16) & 0x1f)) +#define IMM_I26(imm) ((((sljit_ins)(imm)&0xffff) << 10) | (((sljit_ins)(imm) >> 16) & 0x3ff)) + +#define OPC_I26(opc) ((sljit_ins)(opc) << 26) +#define OPC_1RI21(opc) ((sljit_ins)(opc) << 26) +#define OPC_2RI16(opc) ((sljit_ins)(opc) << 26) +#define OPC_2RI14(opc) ((sljit_ins)(opc) << 24) +#define OPC_2RI12(opc) ((sljit_ins)(opc) << 22) +#define OPC_2RI8(opc) ((sljit_ins)(opc) << 18) +#define OPC_4R(opc) ((sljit_ins)(opc) << 20) +#define OPC_3R(opc) ((sljit_ins)(opc) << 15) +#define OPC_2R(opc) ((sljit_ins)(opc) << 10) +#define OPC_1RI20(opc) ((sljit_ins)(opc) << 25) + +/* Arithmetic operation instructions */ +#define ADD_W OPC_3R(0x20) +#define ADD_D OPC_3R(0x21) +#define SUB_W OPC_3R(0x22) +#define SUB_D OPC_3R(0x23) +#define ADDI_W OPC_2RI12(0xa) +#define ADDI_D OPC_2RI12(0xb) +#define ANDI OPC_2RI12(0xd) +#define ORI OPC_2RI12(0xe) +#define XORI OPC_2RI12(0xf) +#define ADDU16I_D OPC_2RI16(0x4) +#define LU12I_W OPC_1RI20(0xa) +#define LU32I_D OPC_1RI20(0xb) +#define LU52I_D OPC_2RI12(0xc) +#define SLT OPC_3R(0x24) +#define SLTU OPC_3R(0x25) +#define SLTI OPC_2RI12(0x8) +#define SLTUI OPC_2RI12(0x9) +#define PCADDI OPC_1RI20(0xc) +#define PCALAU12I OPC_1RI20(0xd) +#define PCADDU12I OPC_1RI20(0xe) +#define PCADDU18I OPC_1RI20(0xf) +#define NOR OPC_3R(0x28) +#define AND OPC_3R(0x29) +#define OR OPC_3R(0x2a) +#define XOR OPC_3R(0x2b) +#define ORN OPC_3R(0x2c) +#define ANDN OPC_3R(0x2d) +#define MUL_W OPC_3R(0x38) +#define MULH_W OPC_3R(0x39) +#define MULH_WU OPC_3R(0x3a) +#define MUL_D OPC_3R(0x3b) +#define MULH_D OPC_3R(0x3c) +#define MULH_DU OPC_3R(0x3d) +#define MULW_D_W OPC_3R(0x3e) +#define MULW_D_WU OPC_3R(0x3f) +#define DIV_W OPC_3R(0x40) +#define MOD_W OPC_3R(0x41) +#define DIV_WU OPC_3R(0x42) +#define MOD_WU OPC_3R(0x43) +#define DIV_D OPC_3R(0x44) +#define MOD_D OPC_3R(0x45) +#define DIV_DU OPC_3R(0x46) +#define MOD_DU OPC_3R(0x47) + +/* Bit-shift instructions */ +#define SLL_W OPC_3R(0x2e) +#define SRL_W OPC_3R(0x2f) +#define SRA_W OPC_3R(0x30) +#define SLL_D OPC_3R(0x31) +#define SRL_D OPC_3R(0x32) +#define SRA_D OPC_3R(0x33) +#define ROTR_W OPC_3R(0x36) +#define ROTR_D OPC_3R(0x37) +#define SLLI_W OPC_3R(0x81) +#define SLLI_D ((sljit_ins)(0x41) << 16) +#define SRLI_W OPC_3R(0x89) +#define SRLI_D ((sljit_ins)(0x45) << 16) +#define SRAI_W OPC_3R(0x91) +#define SRAI_D ((sljit_ins)(0x49) << 16) +#define ROTRI_W OPC_3R(0x99) +#define ROTRI_D ((sljit_ins)(0x4d) << 16) + +/* Bit-manipulation instructions */ +#define CLO_W OPC_2R(0x4) +#define CLZ_W OPC_2R(0x5) +#define CTO_W OPC_2R(0x6) +#define CTZ_W OPC_2R(0x7) +#define CLO_D OPC_2R(0x8) +#define CLZ_D OPC_2R(0x9) +#define CTO_D OPC_2R(0xa) +#define CTZ_D OPC_2R(0xb) +#define REVB_2H OPC_2R(0xc) +#define REVB_4H OPC_2R(0xd) +#define REVB_2W OPC_2R(0xe) +#define REVB_D OPC_2R(0xf) +#define REVH_2W OPC_2R(0x10) +#define REVH_D OPC_2R(0x11) +#define BITREV_4B OPC_2R(0x12) +#define BITREV_8B OPC_2R(0x13) +#define BITREV_W OPC_2R(0x14) +#define BITREV_D OPC_2R(0x15) +#define EXT_W_H OPC_2R(0x16) +#define EXT_W_B OPC_2R(0x17) +#define BSTRINS_W (0x1 << 22 | 1 << 21) +#define BSTRPICK_W (0x1 << 22 | 1 << 21 | 1 << 15) +#define BSTRINS_D (0x2 << 22) +#define BSTRPICK_D (0x3 << 22) + +/* Branch instructions */ +#define BEQZ OPC_1RI21(0x10) +#define BNEZ OPC_1RI21(0x11) +#define JIRL OPC_2RI16(0x13) +#define B OPC_I26(0x14) +#define BL OPC_I26(0x15) +#define BEQ OPC_2RI16(0x16) +#define BNE OPC_2RI16(0x17) +#define BLT OPC_2RI16(0x18) +#define BGE OPC_2RI16(0x19) +#define BLTU OPC_2RI16(0x1a) +#define BGEU OPC_2RI16(0x1b) + +/* Memory access instructions */ +#define LD_B OPC_2RI12(0xa0) +#define LD_H OPC_2RI12(0xa1) +#define LD_W OPC_2RI12(0xa2) +#define LD_D OPC_2RI12(0xa3) + +#define ST_B OPC_2RI12(0xa4) +#define ST_H OPC_2RI12(0xa5) +#define ST_W OPC_2RI12(0xa6) +#define ST_D OPC_2RI12(0xa7) + +#define LD_BU OPC_2RI12(0xa8) +#define LD_HU OPC_2RI12(0xa9) +#define LD_WU OPC_2RI12(0xaa) + +#define LDX_B OPC_3R(0x7000) +#define LDX_H OPC_3R(0x7008) +#define LDX_W OPC_3R(0x7010) +#define LDX_D OPC_3R(0x7018) + +#define STX_B OPC_3R(0x7020) +#define STX_H OPC_3R(0x7028) +#define STX_W OPC_3R(0x7030) +#define STX_D OPC_3R(0x7038) + +#define LDX_BU OPC_3R(0x7040) +#define LDX_HU OPC_3R(0x7048) +#define LDX_WU OPC_3R(0x7050) + +#define PRELD OPC_2RI12(0xab) + +/* Atomic memory access instructions */ +#define LL_W OPC_2RI14(0x20) +#define SC_W OPC_2RI14(0x21) +#define LL_D OPC_2RI14(0x22) +#define SC_D OPC_2RI14(0x23) + +/* LoongArch V1.10 Instructions */ +#define AMCAS_B OPC_3R(0x70B0) +#define AMCAS_H OPC_3R(0x70B1) +#define AMCAS_W OPC_3R(0x70B2) +#define AMCAS_D OPC_3R(0x70B3) + +/* Other instructions */ +#define BREAK OPC_3R(0x54) +#define DBGCALL OPC_3R(0x55) +#define SYSCALL OPC_3R(0x56) + +/* Basic Floating-Point Instructions */ +/* Floating-Point Arithmetic Operation Instructions */ +#define FADD_S OPC_3R(0x201) +#define FADD_D OPC_3R(0x202) +#define FSUB_S OPC_3R(0x205) +#define FSUB_D OPC_3R(0x206) +#define FMUL_S OPC_3R(0x209) +#define FMUL_D OPC_3R(0x20a) +#define FDIV_S OPC_3R(0x20d) +#define FDIV_D OPC_3R(0x20e) +#define FCMP_COND_S OPC_4R(0xc1) +#define FCMP_COND_D OPC_4R(0xc2) +#define FCOPYSIGN_S OPC_3R(0x225) +#define FCOPYSIGN_D OPC_3R(0x226) +#define FSEL OPC_4R(0xd0) +#define FABS_S OPC_2R(0x4501) +#define FABS_D OPC_2R(0x4502) +#define FNEG_S OPC_2R(0x4505) +#define FNEG_D OPC_2R(0x4506) +#define FMOV_S OPC_2R(0x4525) +#define FMOV_D OPC_2R(0x4526) + +/* Floating-Point Conversion Instructions */ +#define FCVT_S_D OPC_2R(0x4646) +#define FCVT_D_S OPC_2R(0x4649) +#define FTINTRZ_W_S OPC_2R(0x46a1) +#define FTINTRZ_W_D OPC_2R(0x46a2) +#define FTINTRZ_L_S OPC_2R(0x46a9) +#define FTINTRZ_L_D OPC_2R(0x46aa) +#define FFINT_S_W OPC_2R(0x4744) +#define FFINT_S_L OPC_2R(0x4746) +#define FFINT_D_W OPC_2R(0x4748) +#define FFINT_D_L OPC_2R(0x474a) + +/* Floating-Point Move Instructions */ +#define FMOV_S OPC_2R(0x4525) +#define FMOV_D OPC_2R(0x4526) +#define MOVGR2FR_W OPC_2R(0x4529) +#define MOVGR2FR_D OPC_2R(0x452a) +#define MOVGR2FRH_W OPC_2R(0x452b) +#define MOVFR2GR_S OPC_2R(0x452d) +#define MOVFR2GR_D OPC_2R(0x452e) +#define MOVFRH2GR_S OPC_2R(0x452f) +#define MOVGR2FCSR OPC_2R(0x4530) +#define MOVFCSR2GR OPC_2R(0x4532) +#define MOVFR2CF OPC_2R(0x4534) +#define MOVCF2FR OPC_2R(0x4535) +#define MOVGR2CF OPC_2R(0x4536) +#define MOVCF2GR OPC_2R(0x4537) + +/* Floating-Point Branch Instructions */ +#define BCEQZ OPC_I26(0x12) +#define BCNEZ OPC_I26(0x12) + +/* Floating-Point Common Memory Access Instructions */ +#define FLD_S OPC_2RI12(0xac) +#define FLD_D OPC_2RI12(0xae) +#define FST_S OPC_2RI12(0xad) +#define FST_D OPC_2RI12(0xaf) + +#define FLDX_S OPC_3R(0x7060) +#define FLDX_D OPC_3R(0x7068) +#define FSTX_S OPC_3R(0x7070) +#define FSTX_D OPC_3R(0x7078) + +#define I12_MAX (0x7ff) +#define I12_MIN (-0x800) +#define BRANCH16_MAX (0x7fff << 2) +#define BRANCH16_MIN (-(0x8000 << 2)) +#define BRANCH21_MAX (0xfffff << 2) +#define BRANCH21_MIN (-(0x100000 << 2)) +#define JUMP_MAX (0x1ffffff << 2) +#define JUMP_MIN (-(0x2000000 << 2)) +#define JIRL_MAX (0x7fff << 2) +#define JIRL_MIN (-(0x8000 << 2)) + +#define S32_MAX (0x7fffffffl) +#define S32_MIN (-0x80000000l) +#define S52_MAX (0x7ffffffffffffl) + +#define INST(inst, type) ((sljit_ins)((type & SLJIT_32) ? inst##_W : inst##_D)) + +/* LoongArch CPUCFG register for feature detection */ +#define LOONGARCH_CFG2 0x02 +#define LOONGARCH_FEATURE_LAMCAS (1 << 28) + +static sljit_u32 cpu_feature_list = 0; + +static SLJIT_INLINE sljit_u32 get_cpu_features(void) +{ + if (cpu_feature_list == 0) + __asm__ ("cpucfg %0, %1" : "+&r"(cpu_feature_list) : "r"(LOONGARCH_CFG2)); + return cpu_feature_list; +} + +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) +{ + sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_sw diff; + sljit_uw target_addr; + sljit_ins *inst; + + inst = (sljit_ins *)jump->addr; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) + goto exit; + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->u.label != NULL); + target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; + } + + diff = (sljit_sw)target_addr - (sljit_sw)inst - executable_offset; + + if (jump->flags & IS_COND) { + inst--; + diff += SSIZE_OF(ins); + + if (diff >= BRANCH16_MIN && diff <= BRANCH16_MAX) { + jump->flags |= PATCH_B; + inst[0] = (inst[0] & 0xfc0003ff) ^ 0x4000000; + jump->addr = (sljit_uw)inst; + return inst; + } + + inst++; + diff -= SSIZE_OF(ins); + } + + if (diff >= JUMP_MIN && diff <= JUMP_MAX) { + if (jump->flags & IS_COND) { + inst[-1] |= (sljit_ins)IMM_I16(2); + } + + jump->flags |= PATCH_J; + return inst; + } + + if (diff >= S32_MIN && diff <= S32_MAX) { + if (jump->flags & IS_COND) + inst[-1] |= (sljit_ins)IMM_I16(3); + + jump->flags |= PATCH_REL32; + inst[1] = inst[0]; + return inst + 1; + } + + if (target_addr <= (sljit_uw)S32_MAX) { + if (jump->flags & IS_COND) + inst[-1] |= (sljit_ins)IMM_I16(3); + + jump->flags |= PATCH_ABS32; + inst[1] = inst[0]; + return inst + 1; + } + + if (target_addr <= S52_MAX) { + if (jump->flags & IS_COND) + inst[-1] |= (sljit_ins)IMM_I16(4); + + jump->flags |= PATCH_ABS52; + inst[2] = inst[0]; + return inst + 2; + } + +exit: + if (jump->flags & IS_COND) + inst[-1] |= (sljit_ins)IMM_I16(5); + inst[3] = inst[0]; + return inst + 3; +} + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label <= (sljit_uw)S32_MAX) { + put_label->flags = PATCH_ABS32; + return 1; + } + + if (max_label <= S52_MAX) { + put_label->flags = PATCH_ABS52; + return 2; + } + + put_label->flags = 0; + return 3; +} + +static SLJIT_INLINE void load_addr_to_reg(void *dst, sljit_u32 reg) +{ + struct sljit_jump *jump = NULL; + struct sljit_put_label *put_label; + sljit_uw flags; + sljit_ins *inst; + sljit_uw addr; + + if (reg != 0) { + jump = (struct sljit_jump*)dst; + flags = jump->flags; + inst = (sljit_ins*)jump->addr; + addr = (flags & JUMP_ADDR) ? jump->u.target : jump->u.label->addr; + } else { + put_label = (struct sljit_put_label*)dst; + flags = put_label->flags; + inst = (sljit_ins*)put_label->addr; + addr = put_label->label->addr; + reg = *inst; + } + + if (flags & PATCH_ABS32) { + SLJIT_ASSERT(addr <= S32_MAX); + inst[0] = LU12I_W | RD(reg) | (sljit_ins)(((addr & 0xffffffff) >> 12) << 5); + } else if (flags & PATCH_ABS52) { + inst[0] = LU12I_W | RD(reg) | (sljit_ins)(((addr & 0xffffffff) >> 12) << 5); + inst[1] = LU32I_D | RD(reg) | (sljit_ins)(((addr >> 32) & 0xfffff) << 5); + inst += 1; + } else { + inst[0] = LU12I_W | RD(reg) | (sljit_ins)(((addr & 0xffffffff) >> 12) << 5); + inst[1] = LU32I_D | RD(reg) | (sljit_ins)(((addr >> 32) & 0xfffff) << 5); + inst[2] = LU52I_D | RD(reg) | RJ(reg) | IMM_I12(addr >> 52); + inst += 2; + } + + if (jump != NULL) { + SLJIT_ASSERT((inst[1] & OPC_2RI16(0x3f)) == JIRL); + inst[1] = (inst[1] & (OPC_2RI16(0x3f) | 0x3ff)) | IMM_I16((addr & 0xfff) >> 2); + } else + inst[1] = ORI | RD(reg) | RJ(reg) | IMM_I12(addr); +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_uw addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = (sljit_uw)(code_ptr - code); + label = label->next; + } + if (jump && jump->addr == word_count) { + word_count += 3; + jump->addr = (sljit_uw)code_ptr; + code_ptr = detect_jump_type(jump, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + + code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + word_count += 3; + + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr++; + word_count++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw)code_ptr; + label->size = (sljit_uw)(code_ptr - code); + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); + + jump = compiler->jumps; + while (jump) { + do { + if (!(jump->flags & (PATCH_B | PATCH_J | PATCH_REL32))) { + load_addr_to_reg(jump, TMP_REG1); + break; + } + + addr = (jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->addr; + buf_ptr = (sljit_ins *)jump->addr; + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); + + if (jump->flags & PATCH_B) { + SLJIT_ASSERT((sljit_sw)addr >= BRANCH16_MIN && (sljit_sw)addr <= BRANCH16_MAX); + buf_ptr[0] |= (sljit_ins)IMM_I16(addr >> 2); + break; + } + + if (jump->flags & PATCH_REL32) { + SLJIT_ASSERT((sljit_sw)addr >= S32_MIN && (sljit_sw)addr <= S32_MAX); + + buf_ptr[0] = PCADDU12I | RD(TMP_REG1) | (sljit_ins)((sljit_sw)addr & ~0xfff); + SLJIT_ASSERT((buf_ptr[1] & OPC_2RI16(0x3f)) == JIRL); + buf_ptr[1] |= IMM_I16((addr & 0xfff) >> 2); + break; + } + + SLJIT_ASSERT((sljit_sw)addr >= JUMP_MIN && (sljit_sw)addr <= JUMP_MAX); + if (jump->flags & IS_CALL) + buf_ptr[0] = BL | (sljit_ins)IMM_I26(addr >> 2); + else + buf_ptr[0] = B | (sljit_ins)IMM_I26(addr >> 2); + } while (0); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { + load_addr_to_reg(put_label, 0); + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins); + + code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1); + return code; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) + { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return (SLJIT_IS_FPU_AVAILABLE) != 0; +#else + /* Available by default. */ + return 1; +#endif + + case SLJIT_HAS_ATOMIC: + return (LOONGARCH_FEATURE_LAMCAS & get_cpu_features()); + + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CTZ: + case SLJIT_HAS_REV: + case SLJIT_HAS_ROT: + case SLJIT_HAS_PREFETCH: + case SLJIT_HAS_COPY_F32: + case SLJIT_HAS_COPY_F64: + return 1; + + default: + return 0; + } +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) +{ + SLJIT_UNUSED_ARG(type); + + return 0; +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +/* Creates an index in data_transfer_insts array. */ +#define LOAD_DATA 0x01 +#define WORD_DATA 0x00 +#define BYTE_DATA 0x02 +#define HALF_DATA 0x04 +#define INT_DATA 0x06 +#define SIGNED_DATA 0x08 +/* Separates integer and floating point registers */ +#define GPR_REG 0x0f +#define DOUBLE_DATA 0x10 +#define SINGLE_DATA 0x12 + +#define MEM_MASK 0x1f + +#define ARG_TEST 0x00020 +#define ALT_KEEP_CACHE 0x00040 +#define CUMULATIVE_OP 0x00080 +#define IMM_OP 0x00100 +#define MOVE_OP 0x00200 +#define SRC2_IMM 0x00400 + +#define UNUSED_DEST 0x00800 +#define REG_DEST 0x01000 +#define REG1_SOURCE 0x02000 +#define REG2_SOURCE 0x04000 +#define SLOW_SRC1 0x08000 +#define SLOW_SRC2 0x10000 +#define SLOW_DEST 0x20000 + +#define STACK_STORE ST_D +#define STACK_LOAD LD_D + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r, sljit_sw imm) +{ + if (imm <= I12_MAX && imm >= I12_MIN) + return push_inst(compiler, ADDI_D | RD(dst_r) | RJ(TMP_ZERO) | IMM_I12(imm)); + + if (imm <= 0x7fffffffl && imm >= -0x80000000l) { + FAIL_IF(push_inst(compiler, LU12I_W | RD(dst_r) | (sljit_ins)(((imm & 0xffffffff) >> 12) << 5))); + return push_inst(compiler, ORI | RD(dst_r) | RJ(dst_r) | IMM_I12(imm)); + } else if (imm <= 0x7ffffffffffffl && imm >= -0x8000000000000l) { + FAIL_IF(push_inst(compiler, LU12I_W | RD(dst_r) | (sljit_ins)(((imm & 0xffffffff) >> 12) << 5))); + FAIL_IF(push_inst(compiler, ORI | RD(dst_r) | RJ(dst_r) | IMM_I12(imm))); + return push_inst(compiler, LU32I_D | RD(dst_r) | (sljit_ins)(((imm >> 32) & 0xfffff) << 5)); + } + FAIL_IF(push_inst(compiler, LU12I_W | RD(dst_r) | (sljit_ins)(((imm & 0xffffffff) >> 12) << 5))); + FAIL_IF(push_inst(compiler, ORI | RD(dst_r) | RJ(dst_r) | IMM_I12(imm))); + FAIL_IF(push_inst(compiler, LU32I_D | RD(dst_r) | (sljit_ins)(((imm >> 32) & 0xfffff) << 5))); + return push_inst(compiler, LU52I_D | RD(dst_r) | RJ(dst_r) | IMM_I12(imm >> 52)); +} + +#define STACK_MAX_DISTANCE (-I12_MIN) + +static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw); + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 i, tmp, offset; + sljit_s32 saved_arg_count = SLJIT_KEPT_SAVEDS_COUNT(options); + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 1); + local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64); + + local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf; + compiler->local_size = local_size; + + if (local_size <= STACK_MAX_DISTANCE) { + /* Frequent case. */ + FAIL_IF(push_inst(compiler, ADDI_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | IMM_I12(-local_size))); + offset = local_size - SSIZE_OF(sw); + local_size = 0; + } else { + FAIL_IF(push_inst(compiler, ADDI_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | IMM_I12(STACK_MAX_DISTANCE))); + local_size -= STACK_MAX_DISTANCE; + + if (local_size > STACK_MAX_DISTANCE) + FAIL_IF(load_immediate(compiler, TMP_REG1, local_size)); + offset = STACK_MAX_DISTANCE - SSIZE_OF(sw); + } + + FAIL_IF(push_inst(compiler, STACK_STORE | RD(RETURN_ADDR_REG) | RJ(SLJIT_SP) | IMM_I12(offset))); + + tmp = SLJIT_S0 - saveds; + for (i = SLJIT_S0 - saved_arg_count; i > tmp; i--) { + offset -= SSIZE_OF(sw); + FAIL_IF(push_inst(compiler, STACK_STORE | RD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + offset -= SSIZE_OF(sw); + FAIL_IF(push_inst(compiler, STACK_STORE | RD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + tmp = SLJIT_FS0 - fsaveds; + for (i = SLJIT_FS0; i > tmp; i--) { + offset -= SSIZE_OF(f64); + FAIL_IF(push_inst(compiler, FST_D | FRD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + for (i = fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) { + offset -= SSIZE_OF(f64); + FAIL_IF(push_inst(compiler, FST_D | FRD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + if (local_size > STACK_MAX_DISTANCE) + FAIL_IF(push_inst(compiler, SUB_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | RK(TMP_REG1))); + else if (local_size > 0) + FAIL_IF(push_inst(compiler, ADDI_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | IMM_I12(-local_size))); + + if (options & SLJIT_ENTER_REG_ARG) + return SLJIT_SUCCESS; + + arg_types >>= SLJIT_ARG_SHIFT; + saved_arg_count = 0; + tmp = SLJIT_R0; + + while (arg_types > 0) { + if ((arg_types & SLJIT_ARG_MASK) < SLJIT_ARG_TYPE_F64) { + if (!(arg_types & SLJIT_ARG_TYPE_SCRATCH_REG)) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(SLJIT_S0 - saved_arg_count) | RJ(tmp) | IMM_I12(0))); + saved_arg_count++; + } + tmp++; + } + + arg_types >>= SLJIT_ARG_SHIFT; + } + + return SLJIT_SUCCESS; +} + +#undef STACK_MAX_DISTANCE + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(options), 1); + local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64); + + compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf; + + return SLJIT_SUCCESS; +} + +#define STACK_MAX_DISTANCE (-I12_MIN - 16) + +static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit_s32 is_return_to) +{ + sljit_s32 i, tmp, offset; + sljit_s32 local_size = compiler->local_size; + + if (local_size > STACK_MAX_DISTANCE) { + local_size -= STACK_MAX_DISTANCE; + + if (local_size > STACK_MAX_DISTANCE) { + FAIL_IF(load_immediate(compiler, TMP_REG2, local_size)); + FAIL_IF(push_inst(compiler, ADD_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | RK(TMP_REG2))); + } else + FAIL_IF(push_inst(compiler, ADDI_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | IMM_I12(local_size))); + + local_size = STACK_MAX_DISTANCE; + } + + SLJIT_ASSERT(local_size > 0); + + offset = local_size - SSIZE_OF(sw); + if (!is_return_to) + FAIL_IF(push_inst(compiler, STACK_LOAD | RD(RETURN_ADDR_REG) | RJ(SLJIT_SP) | IMM_I12(offset))); + + tmp = SLJIT_S0 - compiler->saveds; + for (i = SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options); i > tmp; i--) { + offset -= SSIZE_OF(sw); + FAIL_IF(push_inst(compiler, STACK_LOAD | RD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + for (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + offset -= SSIZE_OF(sw); + FAIL_IF(push_inst(compiler, STACK_LOAD | RD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + tmp = SLJIT_FS0 - compiler->fsaveds; + for (i = SLJIT_FS0; i > tmp; i--) { + offset -= SSIZE_OF(f64); + FAIL_IF(push_inst(compiler, FLD_D | FRD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + for (i = compiler->fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) { + offset -= SSIZE_OF(f64); + FAIL_IF(push_inst(compiler, FLD_D | FRD(i) | RJ(SLJIT_SP) | IMM_I12(offset))); + } + + return push_inst(compiler, ADDI_D | RD(SLJIT_SP) | RJ(SLJIT_SP) | IMM_I12(local_size)); +} + +#undef STACK_MAX_DISTANCE + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_return_void(compiler)); + + FAIL_IF(emit_stack_frame_release(compiler, 0)); + return push_inst(compiler, JIRL | RD(TMP_ZERO) | RJ(RETURN_ADDR_REG) | IMM_I12(0)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_return_to(compiler, src, srcw)); + + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); + src = TMP_REG1; + srcw = 0; + } else if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG1) | RJ(src) | IMM_I12(0))); + src = TMP_REG1; + srcw = 0; + } + + FAIL_IF(emit_stack_frame_release(compiler, 1)); + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_ijump(compiler, SLJIT_JUMP, src, srcw); +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +static const sljit_ins data_transfer_insts[16 + 4] = { +/* u w s */ ST_D /* st.d */, +/* u w l */ LD_D /* ld.d */, +/* u b s */ ST_B /* st.b */, +/* u b l */ LD_BU /* ld.bu */, +/* u h s */ ST_H /* st.h */, +/* u h l */ LD_HU /* ld.hu */, +/* u i s */ ST_W /* st.w */, +/* u i l */ LD_WU /* ld.wu */, + +/* s w s */ ST_D /* st.d */, +/* s w l */ LD_D /* ld.d */, +/* s b s */ ST_B /* st.b */, +/* s b l */ LD_B /* ld.b */, +/* s h s */ ST_H /* st.h */, +/* s h l */ LD_H /* ld.h */, +/* s i s */ ST_W /* st.w */, +/* s i l */ LD_W /* ld.w */, + +/* d s */ FST_D /* fst.d */, +/* d l */ FLD_D /* fld.d */, +/* s s */ FST_S /* fst.s */, +/* s l */ FLD_S /* fld.s */, +}; + +static const sljit_ins data_transfer_insts_x[16 + 4] = { +/* u w s */ STX_D /* stx.d */, +/* u w l */ LDX_D /* ldx.d */, +/* u b s */ STX_B /* stx.b */, +/* u b l */ LDX_BU /* ldx.bu */, +/* u h s */ STX_H /* stx.h */, +/* u h l */ LDX_HU /* ldx.hu */, +/* u i s */ STX_W /* stx.w */, +/* u i l */ LDX_WU /* ldx.wu */, + +/* s w s */ STX_D /* stx.d */, +/* s w l */ LDX_D /* ldx.d */, +/* s b s */ STX_B /* stx.b */, +/* s b l */ LDX_B /* ldx.b */, +/* s h s */ STX_H /* stx.h */, +/* s h l */ LDX_H /* ldx.h */, +/* s i s */ STX_W /* stx.w */, +/* s i l */ LDX_W /* ldx.w */, + +/* d s */ FSTX_D /* fstx.d */, +/* d l */ FLDX_D /* fldx.d */, +/* s s */ FSTX_S /* fstx.s */, +/* s l */ FLDX_S /* fldx.s */, +}; + +static sljit_s32 push_mem_inst(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + sljit_ins ins; + sljit_s32 base = arg & REG_MASK; + + SLJIT_ASSERT(arg & SLJIT_MEM); + + if (arg & OFFS_REG_MASK) { + sljit_s32 offs = OFFS_REG(arg); + + SLJIT_ASSERT(!argw); + ins = data_transfer_insts_x[flags & MEM_MASK] | + ((flags & MEM_MASK) <= GPR_REG ? RD(reg) : FRD(reg)) | + RJ(base) | RK(offs); + } else { + SLJIT_ASSERT(argw <= 0xfff && argw >= I12_MIN); + + ins = data_transfer_insts[flags & MEM_MASK] | + ((flags & MEM_MASK) <= GPR_REG ? RD(reg) : FRD(reg)) | + RJ(base) | IMM_I12(argw); + } + return push_inst(compiler, ins); +} + +/* Can perform an operation using at most 1 instruction. */ +static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + SLJIT_ASSERT(arg & SLJIT_MEM); + + /* argw == 0 (ldx/stx rd, rj, rk) can be used. + * argw in [-2048, 2047] (ld/st rd, rj, imm) can be used. */ + if (!argw || (!(arg & OFFS_REG_MASK) && (argw <= I12_MAX && argw >= I12_MIN))) { + /* Works for both absolute and relative addresses. */ + if (SLJIT_UNLIKELY(flags & ARG_TEST)) + return 1; + + FAIL_IF(push_mem_inst(compiler, flags, reg, arg, argw)); + return -1; + } + return 0; +} + +#define TO_ARGW_HI(argw) (((argw) & ~0xfff) + (((argw) & 0x800) ? 0x1000 : 0)) + +/* See getput_arg below. + Note: can_cache is called only for binary operators. */ +static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); + + if (arg & OFFS_REG_MASK) + return 0; + + if (arg == next_arg) { + if (((next_argw - argw) <= I12_MAX && (next_argw - argw) >= I12_MIN) + || TO_ARGW_HI(argw) == TO_ARGW_HI(next_argw)) + return 1; + return 0; + } + + return 0; +} + +/* Emit the necessary instructions. See can_cache above. */ +static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + sljit_s32 base = arg & REG_MASK; + sljit_s32 tmp_r = TMP_REG1; + sljit_sw offset; + + SLJIT_ASSERT(arg & SLJIT_MEM); + if (!(next_arg & SLJIT_MEM)) { + next_arg = 0; + next_argw = 0; + } + + /* Since tmp can be the same as base or offset registers, + * these might be unavailable after modifying tmp. */ + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) + tmp_r = reg; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + if (SLJIT_UNLIKELY(argw)) + FAIL_IF(push_inst(compiler, SLLI_D | RD(TMP_REG3) | RJ(OFFS_REG(arg)) | IMM_I12(argw))); + return push_mem_inst(compiler, flags, reg, SLJIT_MEM2(base, TMP_REG3), 0); + } + + if (compiler->cache_arg == arg && argw - compiler->cache_argw <= I12_MAX && argw - compiler->cache_argw >= I12_MIN) + return push_mem_inst(compiler, flags, reg, SLJIT_MEM1(TMP_REG3), argw - compiler->cache_argw); + + if (compiler->cache_arg == SLJIT_MEM && (argw - compiler->cache_argw <= I12_MAX) && (argw - compiler->cache_argw >= I12_MIN)) { + offset = argw - compiler->cache_argw; + } else { + sljit_sw argw_hi=TO_ARGW_HI(argw); + compiler->cache_arg = SLJIT_MEM; + + if (next_arg && next_argw - argw <= I12_MAX && next_argw - argw >= I12_MIN && argw_hi != TO_ARGW_HI(next_argw)) { + FAIL_IF(load_immediate(compiler, TMP_REG3, argw)); + compiler->cache_argw = argw; + offset = 0; + } else { + FAIL_IF(load_immediate(compiler, TMP_REG3, argw_hi)); + compiler->cache_argw = argw_hi; + offset = argw & 0xfff; + argw = argw_hi; + } + } + + if (!base) + return push_mem_inst(compiler, flags, reg, SLJIT_MEM1(TMP_REG3), offset); + + if (arg == next_arg && next_argw - argw <= I12_MAX && next_argw - argw >= I12_MIN) { + compiler->cache_arg = arg; + FAIL_IF(push_inst(compiler, ADD_D | RD(TMP_REG3) | RJ(TMP_REG3) | RK(base))); + return push_mem_inst(compiler, flags, reg, SLJIT_MEM1(TMP_REG3), offset); + } + + if (!offset) + return push_mem_inst(compiler, flags, reg, SLJIT_MEM2(base, TMP_REG3), 0); + + FAIL_IF(push_inst(compiler, ADD_D | RD(tmp_r) | RJ(TMP_REG3) | RK(base))); + return push_mem_inst(compiler, flags, reg, SLJIT_MEM1(tmp_r), offset); +} + +static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + sljit_s32 base = arg & REG_MASK; + sljit_s32 tmp_r = TMP_REG1; + + if (getput_arg_fast(compiler, flags, reg, arg, argw)) + return compiler->error; + + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) + tmp_r = reg; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + if (SLJIT_UNLIKELY(argw)) + FAIL_IF(push_inst(compiler, SLLI_D | RD(tmp_r) | RJ(OFFS_REG(arg)) | IMM_I12(argw))); + return push_mem_inst(compiler, flags, reg, SLJIT_MEM2(base, tmp_r), 0); + } else { + FAIL_IF(load_immediate(compiler, tmp_r, argw)); + + if (base != 0) + return push_mem_inst(compiler, flags, reg, SLJIT_MEM2(base, tmp_r), 0); + return push_mem_inst(compiler, flags, reg, SLJIT_MEM1(tmp_r), 0); + } +} + +static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w) +{ + if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) + return compiler->error; + return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); +} + +#define IMM_EXTEND(v) (IMM_I12((op & SLJIT_32) ? (v) : (32 + (v)))) + +/* andi/ori/xori are zero-extended */ +#define EMIT_LOGICAL(op_imm, op_reg) \ + if (flags & SRC2_IMM) { \ + if (op & SLJIT_SET_Z) {\ + FAIL_IF(push_inst(compiler, ADDI_D | RD(EQUAL_FLAG) | RJ(TMP_ZERO) | IMM_I12(src2))); \ + FAIL_IF(push_inst(compiler, op_reg | RD(EQUAL_FLAG) | RJ(src1) | RK(EQUAL_FLAG))); \ + } \ + if (!(flags & UNUSED_DEST)) { \ + if (dst == src1) { \ + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG1) | RJ(TMP_ZERO) | IMM_I12(src2))); \ + FAIL_IF(push_inst(compiler, op_reg | RD(dst) | RJ(src1) | RK(TMP_REG1))); \ + } else { \ + FAIL_IF(push_inst(compiler, ADDI_D | RD(dst) | RJ(TMP_ZERO) | IMM_I12(src2))); \ + FAIL_IF(push_inst(compiler, op_reg | RD(dst) | RJ(src1) | RK(dst))); \ + } \ + } \ + } \ + else { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_reg | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_reg | RD(dst) | RJ(src1) | RK(src2))); \ + } \ + while (0) + +#define EMIT_SHIFT(imm, reg) \ + op_imm = (imm); \ + op_reg = (reg) + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_sw src2) +{ + sljit_s32 is_overflow, is_carry, carry_src_r, is_handled; + sljit_ins op_imm, op_reg; + sljit_ins word_size = ((op & SLJIT_32) ? 32 : 64); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (dst != src2) + return push_inst(compiler, INST(ADD, op) | RD(dst) | RJ(src2) | IMM_I12(0)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, ANDI | RD(dst) | RJ(src2) | IMM_I12(0xff)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, EXT_W_B | RD(dst) | RJ(src2)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, INST(BSTRPICK, op) | RD(dst) | RJ(src2) | (15 << 16)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, EXT_W_H | RD(dst) | RJ(src2)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, BSTRPICK_D | RD(dst) | RJ(src2) | (31 << 16)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_MOV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) + return push_inst(compiler, SLLI_W | RD(dst) | RJ(src2) | IMM_I12(0)); + SLJIT_ASSERT(dst == src2); + return SLJIT_SUCCESS; + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return push_inst(compiler, INST(CLZ, op) | RD(dst) | RJ(src2)); + + case SLJIT_CTZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return push_inst(compiler, INST(CTZ, op) | RD(dst) | RJ(src2)); + + case SLJIT_REV: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return push_inst(compiler, ((op & SLJIT_32) ? REVB_2W : REVB_D) | RD(dst) | RJ(src2)); + + case SLJIT_REV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + FAIL_IF(push_inst(compiler, REVB_2H | RD(dst) | RJ(src2))); + return push_inst(compiler, EXT_W_H | RD(dst) | RJ(dst)); + + case SLJIT_REV_U16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + FAIL_IF(push_inst(compiler, REVB_2H | RD(dst) | RJ(src2))); + return push_inst(compiler, INST(BSTRPICK, op) | RD(dst) | RJ(dst) | (15 << 16)); + + case SLJIT_REV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && dst != TMP_REG1); + FAIL_IF(push_inst(compiler, REVB_2W | RD(dst) | RJ(src2))); + return push_inst(compiler, SLLI_W | RD(dst) | RJ(dst) | IMM_I12(0)); + + case SLJIT_REV_U32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && dst != TMP_REG1); + FAIL_IF(push_inst(compiler, REVB_2W | RD(dst) | RJ(src2))); + return push_inst(compiler, BSTRPICK_D | RD(dst) | RJ(dst) | (31 << 16)); + + case SLJIT_ADD: + /* Overflow computation (both add and sub): overflow = src1_sign ^ src2_sign ^ result_sign ^ carry_flag */ + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + carry_src_r = GET_FLAG_TYPE(op) == SLJIT_CARRY; + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(0))); + else { + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(TMP_ZERO) | IMM_I12(-1))); + FAIL_IF(push_inst(compiler, XOR | RD(EQUAL_FLAG) | RJ(src1) | RK(EQUAL_FLAG))); + } + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(src2))); + + /* Only the zero flag is needed. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(dst) | RJ(src1) | IMM_I12(src2))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADD, op) | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + + if (is_overflow || carry_src_r != 0) { + if (src1 != dst) + carry_src_r = (sljit_s32)src1; + else if (src2 != dst) + carry_src_r = (sljit_s32)src2; + else { + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(OTHER_FLAG) | RJ(src1) | IMM_I12(0))); + carry_src_r = OTHER_FLAG; + } + } + + /* Only the zero flag is needed. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, INST(ADD, op) | RD(dst) | RJ(src1) | RK(src2))); + } + + /* Carry is zero if a + b >= a or a + b >= b, otherwise it is 1. */ + if (is_overflow || carry_src_r != 0) { + if (flags & SRC2_IMM) + FAIL_IF(push_inst(compiler, SLTUI | RD(OTHER_FLAG) | RJ(dst) | IMM_I12(src2))); + else + FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RJ(dst) | RK(carry_src_r))); + } + + if (!is_overflow) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst(compiler, XOR | RD(TMP_REG1) | RJ(dst) | RK(EQUAL_FLAG))); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADD, op) | RD(EQUAL_FLAG) | RJ(dst) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, INST(SRLI, op) | RD(TMP_REG1) | RJ(TMP_REG1) | IMM_EXTEND(31))); + return push_inst(compiler, XOR | RD(OTHER_FLAG) | RJ(TMP_REG1) | RK(OTHER_FLAG)); + + case SLJIT_ADDC: + carry_src_r = GET_FLAG_TYPE(op) == SLJIT_CARRY; + + if (flags & SRC2_IMM) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(dst) | RJ(src1) | IMM_I12(src2))); + } else { + if (carry_src_r != 0) { + if (src1 != dst) + carry_src_r = (sljit_s32)src1; + else if (src2 != dst) + carry_src_r = (sljit_s32)src2; + else { + FAIL_IF(push_inst(compiler, ADDI_D | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(0))); + carry_src_r = EQUAL_FLAG; + } + } + + FAIL_IF(push_inst(compiler, ADD_D | RD(dst) | RJ(src1) | RK(src2))); + } + + /* Carry is zero if a + b >= a or a + b >= b, otherwise it is 1. */ + if (carry_src_r != 0) { + if (flags & SRC2_IMM) + FAIL_IF(push_inst(compiler, SLTUI | RD(EQUAL_FLAG) | RJ(dst) | IMM_I12(src2))); + else + FAIL_IF(push_inst(compiler, SLTU | RD(EQUAL_FLAG) | RJ(dst) | RK(carry_src_r))); + } + + FAIL_IF(push_inst(compiler, ADD_D | RD(dst) | RJ(dst) | RK(OTHER_FLAG))); + + if (carry_src_r == 0) + return SLJIT_SUCCESS; + + /* Set ULESS_FLAG (dst == 0) && (OTHER_FLAG == 1). */ + FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RJ(dst) | RK(OTHER_FLAG))); + /* Set carry flag. */ + return push_inst(compiler, OR | RD(OTHER_FLAG) | RJ(OTHER_FLAG) | RK(EQUAL_FLAG)); + + case SLJIT_SUB: + if ((flags & SRC2_IMM) && src2 == I12_MIN) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG2) | RJ(TMP_ZERO) | IMM_I12(src2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_handled = 0; + + if (flags & SRC2_IMM) { + if (GET_FLAG_TYPE(op) == SLJIT_LESS) { + FAIL_IF(push_inst(compiler, SLTUI | RD(OTHER_FLAG) | RJ(src1) | IMM_I12(src2))); + is_handled = 1; + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS) { + FAIL_IF(push_inst(compiler, SLTI | RD(OTHER_FLAG) | RJ(src1) | IMM_I12(src2))); + is_handled = 1; + } + } + + if (!is_handled && GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + is_handled = 1; + + if (flags & SRC2_IMM) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG2) | RJ(TMP_ZERO) | IMM_I12(src2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + switch (GET_FLAG_TYPE(op)) { + case SLJIT_LESS: + FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RJ(src1) | RK(src2))); + break; + case SLJIT_GREATER: + FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RJ(src2) | RK(src1))); + break; + case SLJIT_SIG_LESS: + FAIL_IF(push_inst(compiler, SLT | RD(OTHER_FLAG) | RJ(src1) | RK(src2))); + break; + case SLJIT_SIG_GREATER: + FAIL_IF(push_inst(compiler, SLT | RD(OTHER_FLAG) | RJ(src2) | RK(src1))); + break; + } + } + + if (is_handled) { + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(-src2))); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, INST(ADDI, op) | RD(dst) | RJ(src1) | IMM_I12(-src2)); + } + else { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, INST(SUB, op) | RD(dst) | RJ(src1) | RK(src2)); + } + return SLJIT_SUCCESS; + } + + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY; + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(0))); + else { + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(-1))); + FAIL_IF(push_inst(compiler, XOR | RD(EQUAL_FLAG) | RJ(src1) | RK(EQUAL_FLAG))); + } + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(-src2))); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTUI | RD(OTHER_FLAG) | RJ(src1) | IMM_I12(src2))); + + /* Only the zero flag is needed. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(dst) | RJ(src1) | IMM_I12(-src2))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RJ(src1) | RK(src2))); + + /* Only the zero flag is needed. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(dst) | RJ(src1) | RK(src2))); + } + + if (!is_overflow) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst(compiler, XOR | RD(TMP_REG1) | RJ(dst) | RK(EQUAL_FLAG))); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(EQUAL_FLAG) | RJ(dst) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, INST(SRLI, op) | RD(TMP_REG1) | RJ(TMP_REG1) | IMM_EXTEND(31))); + return push_inst(compiler, XOR | RD(OTHER_FLAG) | RJ(TMP_REG1) | RK(OTHER_FLAG)); + + case SLJIT_SUBC: + if ((flags & SRC2_IMM) && src2 == I12_MIN) { + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(TMP_REG2) | RJ(TMP_ZERO) | IMM_I12(src2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY; + + if (flags & SRC2_IMM) { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTUI | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(src2))); + + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(dst) | RJ(src1) | IMM_I12(-src2))); + } + else { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(dst) | RJ(src1) | RK(src2))); + } + + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | RD(TMP_REG1) | RJ(dst) | RK(OTHER_FLAG))); + + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(dst) | RJ(dst) | RK(OTHER_FLAG))); + + if (!is_carry) + return SLJIT_SUCCESS; + + return push_inst(compiler, OR | RD(OTHER_FLAG) | RJ(EQUAL_FLAG) | RK(TMP_REG1)); + + case SLJIT_MUL: + SLJIT_ASSERT(!(flags & SRC2_IMM)); + + if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) + return push_inst(compiler, INST(MUL, op) | RD(dst) | RJ(src1) | RK(src2)); + + if (op & SLJIT_32) { + FAIL_IF(push_inst(compiler, MUL_D | RD(OTHER_FLAG) | RJ(src1) | RK(src2))); + FAIL_IF(push_inst(compiler, MUL_W | RD(dst) | RJ(src1) | RK(src2))); + return push_inst(compiler, SUB_D | RD(OTHER_FLAG) | RJ(dst) | RK(OTHER_FLAG)); + } + + FAIL_IF(push_inst(compiler, MULH_D | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + FAIL_IF(push_inst(compiler, MUL_D | RD(dst) | RJ(src1) | RK(src2))); + FAIL_IF(push_inst(compiler, SRAI_D | RD(OTHER_FLAG) | RJ(dst) | IMM_I12((63)))); + return push_inst(compiler, SUB_D | RD(OTHER_FLAG) | RJ(EQUAL_FLAG) | RK(OTHER_FLAG)); + + case SLJIT_AND: + EMIT_LOGICAL(ANDI, AND); + return SLJIT_SUCCESS; + + case SLJIT_OR: + EMIT_LOGICAL(ORI, OR); + return SLJIT_SUCCESS; + + case SLJIT_XOR: + EMIT_LOGICAL(XORI, XOR); + return SLJIT_SUCCESS; + + case SLJIT_SHL: + case SLJIT_MSHL: + if (op & SLJIT_32) { + EMIT_SHIFT(SLLI_W, SLL_W); + } else { + EMIT_SHIFT(SLLI_D, SLL_D); + } + break; + + case SLJIT_LSHR: + case SLJIT_MLSHR: + if (op & SLJIT_32) { + EMIT_SHIFT(SRLI_W, SRL_W); + } else { + EMIT_SHIFT(SRLI_D, SRL_D); + } + break; + + case SLJIT_ASHR: + case SLJIT_MASHR: + if (op & SLJIT_32) { + EMIT_SHIFT(SRAI_W, SRA_W); + } else { + EMIT_SHIFT(SRAI_D, SRA_D); + } + break; + + case SLJIT_ROTL: + case SLJIT_ROTR: + if (flags & SRC2_IMM) { + SLJIT_ASSERT(src2 != 0); + + if (GET_OPCODE(op) == SLJIT_ROTL) + src2 = word_size - src2; + return push_inst(compiler, INST(ROTRI, op) | RD(dst) | RJ(src1) | IMM_I12(src2)); + + } + + if (src2 == TMP_ZERO) { + if (dst != src1) + return push_inst(compiler, INST(ADDI, op) | RD(dst) | RJ(src1) | IMM_I12(0)); + return SLJIT_SUCCESS; + } + + if (GET_OPCODE(op) == SLJIT_ROTL) { + FAIL_IF(push_inst(compiler, INST(SUB, op)| RD(OTHER_FLAG) | RJ(TMP_ZERO) | RK(src2))); + src2 = OTHER_FLAG; + } + return push_inst(compiler, INST(ROTR, op) | RD(dst) | RJ(src1) | RK(src2)); + + default: + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + } + + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, op_imm | RD(EQUAL_FLAG) | RJ(src1) | IMM_I12(src2))); + + if (flags & UNUSED_DEST) + return SLJIT_SUCCESS; + return push_inst(compiler, op_imm | RD(dst) | RJ(src1) | IMM_I12(src2)); + } + + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, op_reg | RD(EQUAL_FLAG) | RJ(src1) | RK(src2))); + + if (flags & UNUSED_DEST) + return SLJIT_SUCCESS; + return push_inst(compiler, op_reg | RD(dst) | RJ(src1) | RK(src2)); +} + +#undef IMM_EXTEND + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* arg1 goes to TMP_REG1 or src reg + arg2 goes to TMP_REG2, imm or src reg + TMP_REG3 can be used for caching + result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ + sljit_s32 dst_r = TMP_REG2; + sljit_s32 src1_r; + sljit_sw src2_r = 0; + sljit_s32 sugg_src2_r = TMP_REG2; + + if (!(flags & ALT_KEEP_CACHE)) { + compiler->cache_arg = 0; + compiler->cache_argw = 0; + } + + if (dst == 0) { + SLJIT_ASSERT(HAS_FLAGS(op)); + flags |= UNUSED_DEST; + dst = TMP_REG2; + } + else if (FAST_IS_REG(dst)) { + dst_r = dst; + flags |= REG_DEST; + if (flags & MOVE_OP) + sugg_src2_r = dst_r; + } + else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw)) + flags |= SLOW_DEST; + + if (flags & IMM_OP) { + if (src2 == SLJIT_IMM && src2w != 0 && src2w <= I12_MAX && src2w >= I12_MIN) { + flags |= SRC2_IMM; + src2_r = src2w; + } + else if ((flags & CUMULATIVE_OP) && src1 == SLJIT_IMM && src1w != 0 && src1w <= I12_MAX && src1w >= I12_MIN) { + flags |= SRC2_IMM; + src2_r = src1w; + + /* And swap arguments. */ + src1 = src2; + src1w = src2w; + src2 = SLJIT_IMM; + /* src2w = src2_r unneeded. */ + } + } + + /* Source 1. */ + if (FAST_IS_REG(src1)) { + src1_r = src1; + flags |= REG1_SOURCE; + } + else if (src1 == SLJIT_IMM) { + if (src1w) { + FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1_r = TMP_REG1; + } + else + src1_r = TMP_ZERO; + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC1; + src1_r = TMP_REG1; + } + + /* Source 2. */ + if (FAST_IS_REG(src2)) { + src2_r = src2; + flags |= REG2_SOURCE; + if ((flags & (REG_DEST | MOVE_OP)) == MOVE_OP) + dst_r = (sljit_s32)src2_r; + } + else if (src2 == SLJIT_IMM) { + if (!(flags & SRC2_IMM)) { + if (src2w) { + FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w)); + src2_r = sugg_src2_r; + } + else { + src2_r = TMP_ZERO; + if (flags & MOVE_OP) { + if (dst & SLJIT_MEM) + dst_r = 0; + else + op = SLJIT_MOV; + } + } + } + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC2; + + src2_r = sugg_src2_r; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + SLJIT_ASSERT(src2_r == TMP_REG2); + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w, dst, dstw)); + + FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r)); + + if (dst & SLJIT_MEM) { + if (!(flags & SLOW_DEST)) { + getput_arg_fast(compiler, flags, dst_r, dst, dstw); + return compiler->error; + } + return getput_arg(compiler, flags, dst_r, dst, dstw, 0, 0); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + switch (GET_OPCODE(op)) { + case SLJIT_BREAKPOINT: + return push_inst(compiler, BREAK); + case SLJIT_NOP: + return push_inst(compiler, ANDI | RD(TMP_ZERO) | RJ(TMP_ZERO) | IMM_I12(0)); + case SLJIT_LMUL_UW: + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG1) | RJ(SLJIT_R1) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, MULH_DU | RD(SLJIT_R1) | RJ(SLJIT_R0) | RK(SLJIT_R1))); + return push_inst(compiler, MUL_D | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(TMP_REG1)); + case SLJIT_LMUL_SW: + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG1) | RJ(SLJIT_R1) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, MULH_D | RD(SLJIT_R1) | RJ(SLJIT_R0) | RK(SLJIT_R1))); + return push_inst(compiler, MUL_D | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(TMP_REG1)); + case SLJIT_DIVMOD_UW: + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(TMP_REG1) | RJ(SLJIT_R0) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, ((op & SLJIT_32)? DIV_WU: DIV_DU) | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(SLJIT_R1))); + return push_inst(compiler, ((op & SLJIT_32)? MOD_WU: MOD_DU) | RD(SLJIT_R1) | RJ(TMP_REG1) | RK(SLJIT_R1)); + case SLJIT_DIVMOD_SW: + FAIL_IF(push_inst(compiler, INST(ADDI, op) | RD(TMP_REG1) | RJ(SLJIT_R0) | IMM_I12(0))); + FAIL_IF(push_inst(compiler, INST(DIV, op) | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(SLJIT_R1))); + return push_inst(compiler, INST(MOD, op) | RD(SLJIT_R1) | RJ(TMP_REG1) | RK(SLJIT_R1)); + case SLJIT_DIV_UW: + return push_inst(compiler, ((op & SLJIT_32)? DIV_WU: DIV_DU) | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(SLJIT_R1)); + case SLJIT_DIV_SW: + return push_inst(compiler, INST(DIV, op) | RD(SLJIT_R0) | RJ(SLJIT_R0) | RK(SLJIT_R1)); + case SLJIT_ENDBR: + case SLJIT_SKIP_FRAMES_BEFORE_RETURN: + return SLJIT_SUCCESS; + } + + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 flags = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (op & SLJIT_32) + flags = INT_DATA | SIGNED_DATA; + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_P: + return emit_op(compiler, SLJIT_MOV, WORD_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U32: + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u32)srcw : srcw); + + case SLJIT_MOV_S32: + /* Logical operators have no W variant, so sign extended input is necessary for them. */ + case SLJIT_MOV32: + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s32)srcw : srcw); + + case SLJIT_MOV_U8: + return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw); + + case SLJIT_MOV_S8: + return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw); + + case SLJIT_MOV_U16: + return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw); + + case SLJIT_MOV_S16: + return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw); + + case SLJIT_CLZ: + case SLJIT_CTZ: + case SLJIT_REV: + return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U16: + case SLJIT_REV_S16: + return emit_op(compiler, op, HALF_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U32: + case SLJIT_REV_S32: + return emit_op(compiler, op | SLJIT_32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 flags = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (op & SLJIT_32) { + flags |= INT_DATA | SIGNED_DATA; + if (src1 == SLJIT_IMM) + src1w = (sljit_s32)src1w; + if (src2 == SLJIT_IMM) + src2w = (sljit_s32)src2w; + } + + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + case SLJIT_ADDC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD; + return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUB: + case SLJIT_SUBC: + compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB; + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_MUL: + compiler->status_flags_state = 0; + return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_MSHL: + case SLJIT_LSHR: + case SLJIT_MLSHR: + case SLJIT_ASHR: + case SLJIT_MASHR: + case SLJIT_ROTL: + case SLJIT_ROTR: + if (src2 == SLJIT_IMM) { + if (op & SLJIT_32) + src2w &= 0x1f; + else + src2w &= 0x3f; + } + + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w)); + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 src1_reg, + sljit_s32 src2_reg, + sljit_s32 src3, sljit_sw src3w) +{ + sljit_s32 is_left; + sljit_ins ins1, ins2, ins3; + sljit_s32 inp_flags = ((op & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; + sljit_sw bit_length = (op & SLJIT_32) ? 32 : 64; + + + CHECK_ERROR(); + CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w)); + + is_left = (GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_MSHL); + + if (src1_reg == src2_reg) { + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w); + } + + ADJUST_LOCAL_OFFSET(src3, src3w); + + if (src3 == SLJIT_IMM) { + src3w &= bit_length - 1; + + if (src3w == 0) + return SLJIT_SUCCESS; + + if (is_left) { + ins1 = INST(SLLI, op) | IMM_I12(src3w); + src3w = bit_length - src3w; + ins2 = INST(SRLI, op) | IMM_I12(src3w); + } else { + ins1 = INST(SRLI, op) | IMM_I12(src3w); + src3w = bit_length - src3w; + ins2 = INST(SLLI, op) | IMM_I12(src3w); + } + + FAIL_IF(push_inst(compiler, ins1 | RD(dst_reg) | RJ(src1_reg))); + FAIL_IF(push_inst(compiler, ins2 | RD(TMP_REG1) | RJ(src2_reg))); + return push_inst(compiler, OR | RD(dst_reg) | RJ(dst_reg) | RK(TMP_REG1)); + } + + if (src3 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG2, src3, src3w)); + src3 = TMP_REG2; + } else if (dst_reg == src3) { + push_inst(compiler, INST(ADDI, op) | RD(TMP_REG2) | RJ(src3) | IMM_I12(0)); + src3 = TMP_REG2; + } + + if (is_left) { + ins1 = INST(SLL, op); + ins2 = INST(SRLI, op); + ins3 = INST(SRL, op); + } else { + ins1 = INST(SRL, op); + ins2 = INST(SLLI, op); + ins3 = INST(SLL, op); + } + + FAIL_IF(push_inst(compiler, ins1 | RD(dst_reg) | RJ(src1_reg) | RK(src3))); + + if (!(op & SLJIT_SHIFT_INTO_NON_ZERO)) { + FAIL_IF(push_inst(compiler, ins2 | RD(TMP_REG1) | RJ(src2_reg) | IMM_I12(1))); + FAIL_IF(push_inst(compiler, XORI | RD(TMP_REG2) | RJ(src3) | IMM_I12((sljit_ins)bit_length - 1))); + src2_reg = TMP_REG1; + } else + FAIL_IF(push_inst(compiler, INST(SUB, op) | RD(TMP_REG2) | RJ(TMP_ZERO) | RK(src3))); + + FAIL_IF(push_inst(compiler, ins3 | RD(TMP_REG1) | RJ(src2_reg) | RK(TMP_REG2))); + return push_inst(compiler, OR | RD(dst_reg) | RJ(dst_reg) | RK(TMP_REG1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 base = src & REG_MASK; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_src(compiler, op, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + switch (op) { + case SLJIT_FAST_RETURN: + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, ADDI_D | RD(RETURN_ADDR_REG) | RJ(src) | IMM_I12(0))); + else + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); + + return push_inst(compiler, JIRL | RD(TMP_ZERO) | RJ(RETURN_ADDR_REG) | IMM_I12(0)); + case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN: + return SLJIT_SUCCESS; + case SLJIT_PREFETCH_L1: + case SLJIT_PREFETCH_L2: + case SLJIT_PREFETCH_L3: + case SLJIT_PREFETCH_ONCE: + if (SLJIT_UNLIKELY(src & OFFS_REG_MASK)) { + srcw &= 0x3; + if (SLJIT_UNLIKELY(srcw)) + FAIL_IF(push_inst(compiler, SLLI_D | RD(TMP_REG1) | RJ(OFFS_REG(src)) | IMM_I12(srcw))); + FAIL_IF(push_inst(compiler, ADD_D | RD(TMP_REG1) | RJ(base) | RK(TMP_REG1))); + } else { + if (base && srcw <= I12_MAX && srcw >= I12_MIN) + return push_inst(compiler,PRELD | RJ(base) | IMM_I12(srcw)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + if (base != 0) + FAIL_IF(push_inst(compiler, ADD_D | RD(TMP_REG1) | RJ(base) | RK(TMP_REG1))); + } + return push_inst(compiler, PRELD | RD(0) | RJ(TMP_REG1)); + } + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + switch (op) { + case SLJIT_FAST_ENTER: + if (FAST_IS_REG(dst)) + return push_inst(compiler, ADDI_D | RD(dst) | RJ(RETURN_ADDR_REG) | IMM_I12(0)); + + SLJIT_ASSERT(RETURN_ADDR_REG == TMP_REG2); + break; + case SLJIT_GET_RETURN_ADDRESS: + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size - SSIZE_OF(sw))); + break; + } + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type != SLJIT_FLOAT_REGISTER) + return -1; + + return freg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_u32 size) +{ + SLJIT_UNUSED_ARG(size); + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_ins*)instruction); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ +#define SET_COND(cond) (sljit_ins)(cond << 15) + +#define COND_CUN SET_COND(0x8) /* UN */ +#define COND_CEQ SET_COND(0x4) /* EQ */ +#define COND_CUEQ SET_COND(0xc) /* UN EQ */ +#define COND_CLT SET_COND(0x2) /* LT */ +#define COND_CULT SET_COND(0xa) /* UN LT */ +#define COND_CLE SET_COND(0x6) /* LT EQ */ +#define COND_CULE SET_COND(0xe) /* UN LT EQ */ +#define COND_CNE SET_COND(0x10) /* GT LT */ +#define COND_CUNE SET_COND(0x18) /* UN GT LT */ +#define COND_COR SET_COND(0x14) /* GT LT EQ */ + +#define FINST(inst, type) (sljit_ins)((type & SLJIT_32) ? inst##_S : inst##_D) +#define FCD(cd) (sljit_ins)(cd & 0x7) +#define FCJ(cj) (sljit_ins)((cj & 0x7) << 5) +#define FCA(ca) (sljit_ins)((ca & 0x7) << 15) +#define F_OTHER_FLAG 1 + +#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 7)) + +/* convert to inter exact toward zero */ +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inst; + sljit_u32 word_data = 0; + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + + switch (GET_OPCODE(op)) + { + case SLJIT_CONV_SW_FROM_F64: + word_data = 1; + inst = FINST(FTINTRZ_L, op); + break; + case SLJIT_CONV_S32_FROM_F64: + inst = FINST(FTINTRZ_W, op); + break; + default: + inst = BREAK; + SLJIT_UNREACHABLE(); + } + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw)); + src = TMP_FREG1; + } + + FAIL_IF(push_inst(compiler, inst | FRD(TMP_FREG1) | FRJ(src))); + FAIL_IF(push_inst(compiler, FINST(MOVFR2GR, word_data) | RD(dst_r) | FRJ(TMP_FREG1))); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, word_data ? WORD_DATA : INT_DATA, TMP_REG2, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inst; + sljit_u32 word_data = 0; + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + switch (GET_OPCODE(op)) + { + case SLJIT_CONV_F64_FROM_SW: + word_data = 1; + inst = (sljit_ins)((op & SLJIT_32) ? FFINT_S_L : FFINT_D_L); + break; + case SLJIT_CONV_F64_FROM_S32: + inst = (sljit_ins)((op & SLJIT_32) ? FFINT_S_W : FFINT_D_W); + break; + default: + inst = BREAK; + SLJIT_UNREACHABLE(); + } + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, (word_data ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw)); + src = TMP_REG1; + } else if (src == SLJIT_IMM) { + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + FAIL_IF(push_inst(compiler, (word_data ? MOVGR2FR_D : MOVGR2FR_W) | FRD(dst_r) | RJ(src))); + FAIL_IF(push_inst(compiler, inst | FRD(dst_r) | FRJ(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + return sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inst; + sljit_u32 word_data = 0; + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + switch (GET_OPCODE(op)) + { + case SLJIT_CONV_F64_FROM_UW: + word_data = 1; + inst = (sljit_ins)((op & SLJIT_32) ? FFINT_S_L : FFINT_D_L); + break; + case SLJIT_CONV_F64_FROM_U32: + inst = (sljit_ins)((op & SLJIT_32) ? FFINT_S_W : FFINT_D_W); + break; + default: + inst = BREAK; + SLJIT_UNREACHABLE(); + } + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, (word_data ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw)); + src = TMP_REG1; + } else if (src == SLJIT_IMM) { + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) + srcw = (sljit_u32)srcw; + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + + if (!word_data) + FAIL_IF(push_inst(compiler, SRLI_W | RD(src) | RJ(src) | IMM_I12(0))); + + FAIL_IF(push_inst(compiler, BLT | RJ(src) | RD(TMP_ZERO) | IMM_I16(4))); + + FAIL_IF(push_inst(compiler, (word_data ? MOVGR2FR_D : MOVGR2FR_W) | FRD(dst_r) | RJ(src))); + FAIL_IF(push_inst(compiler, inst | FRD(dst_r) | FRJ(dst_r))); + FAIL_IF(push_inst(compiler, B | IMM_I26(7))); + + FAIL_IF(push_inst(compiler, ANDI | RD(TMP_REG2) | RJ(src) | IMM_I12(1))); + FAIL_IF(push_inst(compiler, (word_data ? SRLI_D : SRLI_W) | RD(TMP_REG1) | RJ(src) | IMM_I12(1))); + FAIL_IF(push_inst(compiler, OR | RD(TMP_REG1) | RJ(TMP_REG1) | RK(TMP_REG2))); + FAIL_IF(push_inst(compiler, INST(MOVGR2FR, (!word_data)) | FRD(dst_r) | RJ(TMP_REG1))); + FAIL_IF(push_inst(compiler, inst | FRD(dst_r) | FRJ(dst_r))); + FAIL_IF(push_inst(compiler, FINST(FADD, op) | FRD(dst_r) | FRJ(dst_r) | FRK(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, 0, 0)); + src2 = TMP_FREG2; + } + + FAIL_IF(push_inst(compiler, XOR | RD(OTHER_FLAG) | RJ(OTHER_FLAG) | RK(OTHER_FLAG))); + + switch (GET_FLAG_TYPE(op)) { + case SLJIT_F_EQUAL: + case SLJIT_ORDERED_EQUAL: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CEQ | FCD(F_OTHER_FLAG) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_F_LESS: + case SLJIT_ORDERED_LESS: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CLT | FCD(F_OTHER_FLAG) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_F_GREATER: + case SLJIT_ORDERED_GREATER: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CLT | FCD(F_OTHER_FLAG) | FRJ(src2) | FRK(src1))); + break; + case SLJIT_UNORDERED_OR_GREATER: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CULT | FCD(F_OTHER_FLAG) | FRJ(src2) | FRK(src1))); + break; + case SLJIT_UNORDERED_OR_LESS: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CULT | FCD(F_OTHER_FLAG) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_UNORDERED_OR_EQUAL: + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CUEQ | FCD(F_OTHER_FLAG) | FRJ(src1) | FRK(src2))); + break; + default: /* SLJIT_UNORDERED */ + FAIL_IF(push_inst(compiler, FINST(FCMP_COND, op) | COND_CUN | FCD(F_OTHER_FLAG) | FRJ(src1) | FRK(src2))); + } + return push_inst(compiler, MOVCF2GR | RD(OTHER_FLAG) | FCJ(F_OTHER_FLAG)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + SLJIT_COMPILE_ASSERT((SLJIT_32 == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_32; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_r, src, srcw, dst, dstw)); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst(compiler, FINST(FMOV, op) | FRD(dst_r) | FRJ(src))); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, FINST(FNEG, op) | FRD(dst_r) | FRJ(src))); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, FINST(FABS, op) | FRD(dst_r) | FRJ(src))); + break; + case SLJIT_CONV_F64_FROM_F32: + /* The SLJIT_32 bit is inverted because sljit_f32 needs to be loaded from the memory. */ + FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? FCVT_D_S : FCVT_S_D) | FRD(dst_r) | FRJ(src))); + op ^= SLJIT_32; + break; + } + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), dst_r, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r, flags = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2; + + if (src1 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) { + FAIL_IF(compiler->error); + src1 = TMP_FREG1; + } else + flags |= SLOW_SRC1; + } + + if (src2 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) { + FAIL_IF(compiler->error); + src2 = TMP_FREG2; + } else + flags |= SLOW_SRC2; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw)); + + if (flags & SLOW_SRC1) + src1 = TMP_FREG1; + if (flags & SLOW_SRC2) + src2 = TMP_FREG2; + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, FINST(FADD, op) | FRD(dst_r) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, FINST(FSUB, op) | FRD(dst_r) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, FINST(FMUL, op) | FRD(dst_r) | FRJ(src1) | FRK(src2))); + break; + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, FINST(FDIV, op) | FRD(dst_r) | FRJ(src1) | FRK(src2))); + break; + } + + if (dst_r == TMP_FREG2) + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, 0, 0)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src2, src2w, 0, 0)); + src2 = TMP_FREG1; + } + + if (src1 & SLJIT_MEM) { + reg = (dst_freg == src2) ? TMP_FREG1 : dst_freg; + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, reg, src1, src1w, 0, 0)); + src1 = reg; + } + + return push_inst(compiler, FINST(FCOPYSIGN, op) | FRD(dst_freg) | FRJ(src1) | FRK(src2)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, MOVGR2FR_W | RJ(TMP_ZERO) | FRD(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + return push_inst(compiler, MOVGR2FR_W | RJ(TMP_REG1) | FRD(freg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, MOVGR2FR_D | RJ(TMP_ZERO) | FRD(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + return push_inst(compiler, MOVGR2FR_D | RJ(TMP_REG1) | FRD(freg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 freg, sljit_s32 reg) +{ + sljit_ins inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg)); + + if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) + inst = ((op & SLJIT_32) ? MOVGR2FR_W : MOVGR2FR_D) | FRD(freg) | RJ(reg); + else + inst = ((op & SLJIT_32) ? MOVFR2GR_S : MOVFR2GR_D) | RD(reg) | FRJ(freg); + return push_inst(compiler, inst); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +static sljit_ins get_jump_instruction(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_ATOMIC_NOT_STORED: + return BNE | RJ(EQUAL_FLAG) | RD(TMP_ZERO); + case SLJIT_NOT_EQUAL: + case SLJIT_ATOMIC_STORED: + return BEQ | RJ(EQUAL_FLAG) | RD(TMP_ZERO); + case SLJIT_LESS: + case SLJIT_GREATER: + case SLJIT_SIG_LESS: + case SLJIT_SIG_GREATER: + case SLJIT_OVERFLOW: + case SLJIT_CARRY: + return BEQ | RJ(OTHER_FLAG) | RD(TMP_ZERO); + case SLJIT_GREATER_EQUAL: + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + case SLJIT_NOT_OVERFLOW: + case SLJIT_NOT_CARRY: + return BNE | RJ(OTHER_FLAG) | RD(TMP_ZERO); + case SLJIT_F_EQUAL: + case SLJIT_ORDERED_EQUAL: + case SLJIT_F_LESS: + case SLJIT_ORDERED_LESS: + case SLJIT_ORDERED_GREATER: + case SLJIT_UNORDERED_OR_GREATER: + case SLJIT_F_GREATER: + case SLJIT_UNORDERED_OR_LESS: + case SLJIT_UNORDERED_OR_EQUAL: + case SLJIT_UNORDERED: + return BEQ | RJ(OTHER_FLAG) | RD(TMP_ZERO); + case SLJIT_ORDERED_NOT_EQUAL: + case SLJIT_ORDERED_LESS_EQUAL: + case SLJIT_ORDERED_GREATER_EQUAL: + case SLJIT_F_NOT_EQUAL: + case SLJIT_UNORDERED_OR_NOT_EQUAL: + case SLJIT_UNORDERED_OR_GREATER_EQUAL: + case SLJIT_UNORDERED_OR_LESS_EQUAL: + case SLJIT_F_LESS_EQUAL: + case SLJIT_F_GREATER_EQUAL: + case SLJIT_ORDERED: + return BNE | RJ(OTHER_FLAG) | RD(TMP_ZERO); + default: + /* Not conditional branch. */ + return 0; + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + sljit_ins inst; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + inst = get_jump_instruction(type); + + if (inst != 0) { + PTR_FAIL_IF(push_inst(compiler, inst)); + jump->flags |= IS_COND; + } + + jump->addr = compiler->size; + inst = JIRL | RJ(TMP_REG1) | IMM_I16(0); + + if (type >= SLJIT_FAST_CALL) { + jump->flags |= IS_CALL; + inst |= RD(RETURN_ADDR_REG); + } + + PTR_FAIL_IF(push_inst(compiler, inst)); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += 3; + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + SLJIT_UNUSED_ARG(arg_types); + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + + if (type & SLJIT_CALL_RETURN) { + PTR_FAIL_IF(emit_stack_frame_release(compiler, 0)); + type = SLJIT_JUMP | (type & SLJIT_REWRITABLE_JUMP); + } + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_jump(compiler, type); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + struct sljit_jump *jump; + sljit_s32 flags; + sljit_ins inst; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; + + if (src1 & SLJIT_MEM) { + PTR_FAIL_IF(emit_op_mem2(compiler, flags, TMP_REG1, src1, src1w, src2, src2w)); + src1 = TMP_REG1; + } + + if (src2 & SLJIT_MEM) { + PTR_FAIL_IF(emit_op_mem2(compiler, flags, TMP_REG2, src2, src2w, 0, 0)); + src2 = TMP_REG2; + } + + if (src1 == SLJIT_IMM) { + if (src1w != 0) { + PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1 = TMP_REG1; + } + else + src1 = TMP_ZERO; + } + + if (src2 == SLJIT_IMM) { + if (src2w != 0) { + PTR_FAIL_IF(load_immediate(compiler, TMP_REG2, src2w)); + src2 = TMP_REG2; + } + else + src2 = TMP_ZERO; + } + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, (sljit_u32)((type & SLJIT_REWRITABLE_JUMP) | IS_COND)); + type &= 0xff; + + switch (type) { + case SLJIT_EQUAL: + inst = BNE | RJ(src1) | RD(src2); + break; + case SLJIT_NOT_EQUAL: + inst = BEQ | RJ(src1) | RD(src2); + break; + case SLJIT_LESS: + inst = BGEU | RJ(src1) | RD(src2); + break; + case SLJIT_GREATER_EQUAL: + inst = BLTU | RJ(src1) | RD(src2); + break; + case SLJIT_GREATER: + inst = BGEU | RJ(src2) | RD(src1); + break; + case SLJIT_LESS_EQUAL: + inst = BLTU | RJ(src2) | RD(src1); + break; + case SLJIT_SIG_LESS: + inst = BGE | RJ(src1) | RD(src2); + break; + case SLJIT_SIG_GREATER_EQUAL: + inst = BLT | RJ(src1) | RD(src2); + break; + case SLJIT_SIG_GREATER: + inst = BGE | RJ(src2) | RD(src1); + break; + case SLJIT_SIG_LESS_EQUAL: + inst = BLT | RJ(src2) | RD(src1); + break; + default: + inst = BREAK; + SLJIT_UNREACHABLE(); + } + + PTR_FAIL_IF(push_inst(compiler, inst)); + + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, JIRL | RD(TMP_ZERO) | RJ(TMP_REG1) | IMM_I12(0))); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += 3; + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + + if (src != SLJIT_IMM) { + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); + src = TMP_REG1; + } + return push_inst(compiler, JIRL | RD((type >= SLJIT_FAST_CALL) ? RETURN_ADDR_REG : TMP_ZERO) | RJ(src) | IMM_I12(0)); + } + + /* These jumps are converted to jump/call instructions when possible. */ + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_CALL : 0)); + jump->u.target = (sljit_uw)srcw; + + jump->addr = compiler->size; + FAIL_IF(push_inst(compiler, JIRL | RD((type >= SLJIT_FAST_CALL) ? RETURN_ADDR_REG : TMP_ZERO) | RJ(TMP_REG1) | IMM_I12(0))); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += 3; + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(arg_types); + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); + src = TMP_REG1; + } + + if (type & SLJIT_CALL_RETURN) { + if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG1) | RJ(src) | IMM_I12(0))); + src = TMP_REG1; + } + + FAIL_IF(emit_stack_frame_release(compiler, 0)); + type = SLJIT_JUMP; + } + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_ijump(compiler, type, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 src_r, dst_r, invert; + sljit_s32 saved_op = op; + sljit_s32 mem_type = ((op & SLJIT_32) || op == SLJIT_MOV32) ? (INT_DATA | SIGNED_DATA) : WORD_DATA; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + op = GET_OPCODE(op); + dst_r = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2; + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + if (op >= SLJIT_ADD && (dst & SLJIT_MEM)) + FAIL_IF(emit_op_mem2(compiler, mem_type | LOAD_DATA, TMP_REG1, dst, dstw, dst, dstw)); + + if (type < SLJIT_F_EQUAL) { + src_r = OTHER_FLAG; + invert = type & 0x1; + + switch (type) { + case SLJIT_EQUAL: + case SLJIT_NOT_EQUAL: + FAIL_IF(push_inst(compiler, SLTUI | RD(dst_r) | RJ(EQUAL_FLAG) | IMM_I12(1))); + src_r = dst_r; + break; + case SLJIT_ATOMIC_STORED: + case SLJIT_ATOMIC_NOT_STORED: + FAIL_IF(push_inst(compiler, SLTUI | RD(dst_r) | RJ(EQUAL_FLAG) | IMM_I12(1))); + src_r = dst_r; + invert ^= 0x1; + break; + case SLJIT_OVERFLOW: + case SLJIT_NOT_OVERFLOW: + if (compiler->status_flags_state & (SLJIT_CURRENT_FLAGS_ADD | SLJIT_CURRENT_FLAGS_SUB)) { + src_r = OTHER_FLAG; + break; + } + FAIL_IF(push_inst(compiler, SLTUI | RD(dst_r) | RJ(OTHER_FLAG) | IMM_I12(1))); + src_r = dst_r; + invert ^= 0x1; + break; + } + } else { + invert = 0; + src_r = OTHER_FLAG; + + switch (type) { + case SLJIT_ORDERED_NOT_EQUAL: + case SLJIT_ORDERED_LESS_EQUAL: + case SLJIT_ORDERED_GREATER_EQUAL: + case SLJIT_F_NOT_EQUAL: + case SLJIT_UNORDERED_OR_NOT_EQUAL: + case SLJIT_UNORDERED_OR_GREATER_EQUAL: + case SLJIT_UNORDERED_OR_LESS_EQUAL: + case SLJIT_F_LESS_EQUAL: + case SLJIT_F_GREATER_EQUAL: + case SLJIT_ORDERED: + invert = 1; + break; + } + } + + if (invert) { + FAIL_IF(push_inst(compiler, XORI | RD(dst_r) | RJ(src_r) | IMM_I12(1))); + src_r = dst_r; + } + + if (op < SLJIT_ADD) { + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_type, src_r, dst, dstw); + + if (src_r != dst_r) + return push_inst(compiler, ADDI_D | RD(dst_r) | RJ(src_r) | IMM_I12(0)); + return SLJIT_SUCCESS; + } + + mem_type |= CUMULATIVE_OP | IMM_OP | ALT_KEEP_CACHE; + + if (dst & SLJIT_MEM) + return emit_op(compiler, saved_op, mem_type, dst, dstw, TMP_REG1, 0, src_r, 0); + return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, src_r, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) +{ + sljit_ins *ptr; + sljit_uw size; + sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; + + CHECK_ERROR(); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + FAIL_IF(push_inst(compiler, ADDI_D | RD(TMP_REG2) | RJ(dst_reg) | IMM_I12(0))); + + if ((src1 & REG_MASK) == dst_reg) + src1 = (src1 & ~REG_MASK) | TMP_REG2; + + if (OFFS_REG(src1) == dst_reg) + src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2); + } + + FAIL_IF(push_inst(compiler, ADDI_D | RD(dst_reg) | RJ(src2_reg) | IMM_I12(0))); + } + } + + size = compiler->size; + + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + compiler->size++; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w)); + } else if (src1 == SLJIT_IMM) { + if (type & SLJIT_32) + src1w = (sljit_s32)src1w; + FAIL_IF(load_immediate(compiler, dst_reg, src1w)); + } else + FAIL_IF(push_inst(compiler, ADDI_D | RD(dst_reg) | RJ(src1) | IMM_I12(0))); + + *ptr = get_jump_instruction(type & ~SLJIT_32) | IMM_I16(compiler->size - size); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_s32 invert = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if ((type & ~SLJIT_32) == SLJIT_EQUAL || (type & ~SLJIT_32) == SLJIT_NOT_EQUAL) { + if ((type & ~SLJIT_32) == SLJIT_EQUAL) + invert = 1; + FAIL_IF(push_inst(compiler, MOVGR2CF | FCD(F_OTHER_FLAG) | RJ(EQUAL_FLAG))); + } + else + FAIL_IF(push_inst(compiler, MOVGR2CF | FCD(F_OTHER_FLAG) | RJ(OTHER_FLAG))); + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, dst_freg, src1, src1w)); + if (invert) + return push_inst(compiler, FSEL | FRD(dst_freg) | FRJ(dst_freg) | FRK(src2_freg) | FCA(F_OTHER_FLAG)); + return push_inst(compiler, FSEL | FRD(dst_freg) | FRJ(src2_freg) | FRK(dst_freg) | FCA(F_OTHER_FLAG)); + } else { + if (invert) + return push_inst(compiler, FSEL | FRD(dst_freg) | FRJ(src1) | FRK(src2_freg) | FCA(F_OTHER_FLAG)); + return push_inst(compiler, FSEL | FRD(dst_freg) | FRJ(src2_freg) | FRK(src1) | FCA(F_OTHER_FLAG)); + } +} + +#undef FLOAT_DATA + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_s32 flags; + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + if (!(reg & REG_PAIR_MASK)) + return sljit_emit_mem_unaligned(compiler, type, reg, mem, memw); + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + memw &= 0x3; + + if (SLJIT_UNLIKELY(memw != 0)) { + FAIL_IF(push_inst(compiler, SLLI_D | RD(TMP_REG1) | RJ(OFFS_REG(mem)) | IMM_I12(memw))); + FAIL_IF(push_inst(compiler, ADD_D| RD(TMP_REG1) | RJ(TMP_REG1) | RK(mem & REG_MASK))); + } else + FAIL_IF(push_inst(compiler, ADD_D| RD(TMP_REG1) | RJ(mem & REG_MASK) | RK(OFFS_REG(mem)))); + + mem = TMP_REG1; + memw = 0; + } else if (memw > I12_MAX - SSIZE_OF(sw) || memw < I12_MIN) { + if (((memw + 0x800) & 0xfff) <= 0xfff - SSIZE_OF(sw)) { + FAIL_IF(load_immediate(compiler, TMP_REG1, TO_ARGW_HI(memw))); + memw &= 0xfff; + } else { + FAIL_IF(load_immediate(compiler, TMP_REG1, memw)); + memw = 0; + } + + if (mem & REG_MASK) + FAIL_IF(push_inst(compiler, ADD_D| RD(TMP_REG1) | RJ(TMP_REG1) | RK(mem & REG_MASK))); + + mem = TMP_REG1; + } else { + mem &= REG_MASK; + memw &= 0xfff; + } + + SLJIT_ASSERT((memw >= 0 && memw <= I12_MAX - SSIZE_OF(sw)) || (memw > I12_MAX && memw <= 0xfff)); + + if (!(type & SLJIT_MEM_STORE) && mem == REG_PAIR_FIRST(reg)) { + FAIL_IF(push_mem_inst(compiler, WORD_DATA | LOAD_DATA, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), (memw + SSIZE_OF(sw)) & 0xfff)); + return push_mem_inst(compiler, WORD_DATA | LOAD_DATA, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw); + } + + flags = WORD_DATA | (!(type & SLJIT_MEM_STORE) ? LOAD_DATA : 0); + + FAIL_IF(push_mem_inst(compiler, flags, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw)); + return push_mem_inst(compiler, flags, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), (memw + SSIZE_OF(sw)) & 0xfff); +} + +#undef TO_ARGW_HI + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, + sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + if (!(LOONGARCH_FEATURE_LAMCAS & get_cpu_features())) + return SLJIT_ERR_UNSUPPORTED; + + switch(GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = LD_BU; + break; + case SLJIT_MOV_U16: + ins = LD_HU; + break; + case SLJIT_MOV32: + ins = LD_W; + break; + case SLJIT_MOV_U32: + ins = LD_WU; + break; + default: + ins = LD_D; + break; + } + + return push_inst(compiler, ins | RD(dst_reg) | RJ(mem_reg) | IMM_I12(0)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, + sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_ins ins = 0; + sljit_ins unsign = 0; + sljit_s32 tmp = temp_reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + + if (!(LOONGARCH_FEATURE_LAMCAS & get_cpu_features())) + return SLJIT_ERR_UNSUPPORTED; + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_U8: + ins = AMCAS_B; + unsign = BSTRPICK_D | (7 << 16); + break; + case SLJIT_MOV_U16: + ins = AMCAS_H; + unsign = BSTRPICK_D | (15 << 16); + break; + case SLJIT_MOV32: + ins = AMCAS_W; + break; + case SLJIT_MOV_U32: + ins = AMCAS_W; + unsign = BSTRPICK_D | (31 << 16); + break; + default: + ins = AMCAS_D; + break; + } + + if (op & SLJIT_SET_ATOMIC_STORED) { + FAIL_IF(push_inst(compiler, XOR | RD(TMP_REG1) | RJ(temp_reg) | RK(TMP_ZERO))); + tmp = TMP_REG1; + } + FAIL_IF(push_inst(compiler, ins | RD(tmp) | RJ(mem_reg) | RK(src_reg))); + if (!(op & SLJIT_SET_ATOMIC_STORED)) + return SLJIT_SUCCESS; + + if (unsign) + FAIL_IF(push_inst(compiler, unsign | RD(tmp) | RJ(tmp))); + + FAIL_IF(push_inst(compiler, XOR | RD(EQUAL_FLAG) | RJ(tmp) | RK(temp_reg))); + return push_inst(compiler, SLTUI | RD(EQUAL_FLAG) | RJ(EQUAL_FLAG) | IMM_I12(1)); +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value, sljit_ins last_ins) +{ + SLJIT_UNUSED_ARG(last_ins); + + FAIL_IF(push_inst(compiler, LU12I_W | RD(dst) | (sljit_ins)(((init_value & 0xffffffff) >> 12) << 5))); + FAIL_IF(push_inst(compiler, LU32I_D | RD(dst) | (sljit_ins)(((init_value >> 32) & 0xfffff) << 5))); + FAIL_IF(push_inst(compiler, LU52I_D | RD(dst) | RJ(dst) | (sljit_ins)(IMM_I12(init_value >> 52)))); + return push_inst(compiler, ORI | RD(dst) | RJ(dst) | IMM_I12(init_value)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins*)addr; + SLJIT_UNUSED_ARG(executable_offset); + + SLJIT_UPDATE_WX_FLAGS(inst, inst + 4, 0); + + SLJIT_ASSERT((inst[0] & OPC_1RI20(0x7f)) == LU12I_W); + inst[0] = (inst[0] & (OPC_1RI20(0x7f) | 0x1f)) | (sljit_ins)(((new_target & 0xffffffff) >> 12) << 5); + + SLJIT_ASSERT((inst[1] & OPC_1RI20(0x7f)) == LU32I_D); + inst[1] = (inst[1] & (OPC_1RI20(0x7f) | 0x1f)) | (sljit_ins)(sljit_ins)(((new_target >> 32) & 0xfffff) << 5); + + SLJIT_ASSERT((inst[2] & OPC_2RI12(0x3ff)) == LU52I_D); + inst[2] = (inst[2] & (OPC_2RI12(0x3ff) | 0x3ff)) | IMM_I12(new_target >> 52); + + SLJIT_ASSERT((inst[3] & OPC_2RI12(0x3ff)) == ORI || (inst[3] & OPC_2RI16(0x3f)) == JIRL); + if ((inst[3] & OPC_2RI12(0x3ff)) == ORI) + inst[3] = (inst[3] & (OPC_2RI12(0x3ff) | 0x3ff)) | IMM_I12(new_target); + else + inst[3] = (inst[3] & (OPC_2RI16(0x3f) | 0x3ff)) | IMM_I12((new_target & 0xfff) >> 2); + + SLJIT_UPDATE_WX_FLAGS(inst, inst + 4, 1); + + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value, 0)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); + + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(push_inst(compiler, (sljit_ins)dst_r)); + + compiler->size += 3; + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); + + return put_label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_set_jump_addr(addr, (sljit_uw)new_constant, executable_offset); +} diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_32.c old mode 100644 new mode 100755 index 1691905db7..9620b945f6 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_32.c @@ -26,6 +26,49 @@ /* mips 32-bit arch dependent functions. */ +static sljit_s32 emit_copysign(struct sljit_compiler *compiler, sljit_s32 op, + sljit_sw src1, sljit_sw src2, sljit_sw dst) +{ + int is_32 = (op & SLJIT_32); + sljit_ins mfhc = MFC1, mthc = MTC1; + sljit_ins src1_r = FS(src1), src2_r = FS(src2), dst_r = FS(dst); + + if (!is_32) { + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + mfhc = MFHC1; + mthc = MTHC1; + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + src1_r |= (1 << 11); + src2_r |= (1 << 11); + dst_r |= (1 << 11); + break; + } + } + + FAIL_IF(push_inst(compiler, mfhc | T(TMP_REG1) | src1_r, DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, mfhc | T(TMP_REG2) | src2_r, DR(TMP_REG2))); + if (!is_32 && src1 != dst) + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(src1) | FD(dst), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + else + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + FAIL_IF(push_inst(compiler, XOR | T(TMP_REG1) | D(TMP_REG2) | S(TMP_REG2), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SRL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SLL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, XOR | T(TMP_REG2) | D(TMP_REG1) | S(TMP_REG1), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, mthc | T(TMP_REG1) | dst_r, MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + if (mthc == MTC1) + return push_inst(compiler, NOP, UNMOVABLE_INS); +#endif /* MIPS III */ + return SLJIT_SUCCESS; +} + static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm) { if (!(imm & ~0xffff)) @@ -44,33 +87,106 @@ static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_ return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst)); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + struct { +#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN + sljit_s32 lo; + sljit_s32 hi; +#else /* !SLJIT_LITTLE_ENDIAN */ + sljit_s32 hi; + sljit_s32 lo; +#endif /* SLJIT_LITTLE_ENDIAN */ + } bin; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.bin.lo != 0) + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.bin.lo)); + if (u.bin.hi != 0) + FAIL_IF(load_immediate(compiler, DR(TMP_REG2), u.bin.hi)); + + FAIL_IF(push_inst(compiler, MTC1 | (u.bin.lo != 0 ? T(TMP_REG1) : TA(0)) | FS(freg), MOVABLE_INS)); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + return push_inst(compiler, MTHC1 | (u.bin.hi != 0 ? T(TMP_REG2) : TA(0)) | FS(freg), MOVABLE_INS); +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + FAIL_IF(push_inst(compiler, MTC1 | (u.bin.hi != 0 ? T(TMP_REG2) : TA(0)) | FS(freg) | (1 << 11), MOVABLE_INS)); + break; + } +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { - sljit_s32 reg2; - sljit_ins inst; + sljit_s32 reg2 = 0; + sljit_ins inst = FS(freg); + sljit_ins mthc = MTC1, mfhc = MFC1; + int is_32 = (op & SLJIT_32); CHECK_ERROR(); CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg)); + op = GET_OPCODE(op); if (reg & REG_PAIR_MASK) { reg2 = REG_PAIR_SECOND(reg); reg = REG_PAIR_FIRST(reg); - inst = T(reg2) | FS(freg) | (1 << 11); + inst |= T(reg2); if (op == SLJIT_COPY_TO_F64) FAIL_IF(push_inst(compiler, MTC1 | inst, MOVABLE_INS)); else FAIL_IF(push_inst(compiler, MFC1 | inst, DR(reg2))); + + inst = FS(freg) | (1 << 11); +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + if (cpu_feature_list & CPU_FEATURE_FR) { + mthc = MTHC1; + mfhc = MFHC1; + inst = FS(freg); + } +#endif /* SLJIT_MIPS_REV >= 2 */ } - inst = T(reg) | FS(freg); + inst |= T(reg); + if (!is_32 && !reg2) { + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + mthc = MTHC1; + mfhc = MFHC1; + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + inst |= (1 << 11); + break; + } + } - if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) - return push_inst(compiler, MTC1 | inst, MOVABLE_INS); + if (op == SLJIT_COPY_TO_F64) + FAIL_IF(push_inst(compiler, mthc | inst, MOVABLE_INS)); + else + FAIL_IF(push_inst(compiler, mfhc | inst, DR(reg))); - return push_inst(compiler, MFC1 | inst, DR(reg)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + if (mthc == MTC1 || mfhc == MFC1) + return push_inst(compiler, NOP, UNMOVABLE_INS); +#endif /* MIPS III */ + return SLJIT_SUCCESS; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) @@ -103,6 +219,11 @@ static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_t sljit_ins ins = NOP; sljit_u8 offsets[4]; sljit_u8 *offsets_ptr = offsets; +#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN + sljit_ins f64_hi = TA(7), f64_lo = TA(6); +#else + sljit_ins f64_hi = TA(6), f64_lo = TA(7); +#endif /* SLJIT_LITTLE_ENDIAN */ SLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12); @@ -167,20 +288,28 @@ static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_t switch (types & SLJIT_ARG_MASK) { case SLJIT_ARG_TYPE_F64: - if (*offsets_ptr < 4 * sizeof (sljit_sw)) { + if (*offsets_ptr < 4 * sizeof(sljit_sw)) { if (prev_ins != NOP) FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS)); /* Must be preceded by at least one other argument, * and its starting offset must be 8 because of alignment. */ SLJIT_ASSERT((*offsets_ptr >> 2) == 2); - - prev_ins = MFC1 | TA(6) | FS(float_arg_count) | (1 << 11); - ins = MFC1 | TA(7) | FS(float_arg_count); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + prev_ins = MFHC1 | f64_hi | FS(float_arg_count); + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + prev_ins = MFC1 | f64_hi | FS(float_arg_count) | (1 << 11); + break; + } + ins = MFC1 | f64_lo | FS(float_arg_count); } else if (*offsets_ptr < 254) ins = SDC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(*offsets_ptr); else if (*offsets_ptr == 254) - ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1); + ins = MOV_fmt(FMT_D) | FS(SLJIT_FR0) | FD(TMP_FREG1); float_arg_count--; break; @@ -190,7 +319,7 @@ static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_t else if (*offsets_ptr < 254) ins = SWC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(*offsets_ptr); else if (*offsets_ptr == 254) - ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1); + ins = MOV_fmt(FMT_S) | FS(SLJIT_FR0) | FD(TMP_FREG1); float_arg_count--; break; @@ -314,7 +443,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw)); else if (src != PIC_ADDR_REG) FAIL_IF(push_inst(compiler, ADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG))); diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_64.c old mode 100644 new mode 100755 index a29fe0730d..52a0d3fb7a --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_64.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_64.c @@ -26,6 +26,23 @@ /* mips 64-bit arch dependent functions. */ +static sljit_s32 emit_copysign(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_s32 src2, sljit_s32 dst) +{ + FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | T(TMP_REG1) | FS(src1), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | T(TMP_REG2) | FS(src2), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG2) | T(TMP_REG1) | D(TMP_REG2), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SELECT_OP(DSRL32, SRL) | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | T(TMP_REG2) | D(TMP_REG1), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, SELECT_OP(DMTC1, MTC1) | T(TMP_REG1) | FS(dst), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + if (!(op & SLJIT_32)) + return push_inst(compiler, NOP, UNMOVABLE_INS); +#endif /* MIPS III */ + return SLJIT_SUCCESS; +} + static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm) { sljit_s32 shift = 32; @@ -128,6 +145,35 @@ static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_ return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst)); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) { + FAIL_IF(push_inst(compiler, DMTC1 | TA(0) | FS(freg), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + return SLJIT_SUCCESS; + } + + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.imm)); + FAIL_IF(push_inst(compiler, DMTC1 | T(TMP_REG1) | FS(freg), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -139,9 +185,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi inst = T(reg) | FS(freg); if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) - return push_inst(compiler, ((op & SLJIT_32) ? MTC1 : DMTC1) | inst, MOVABLE_INS); + FAIL_IF(push_inst(compiler, SELECT_OP(DMTC1, MTC1) | inst, MOVABLE_INS)); + else + FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | inst, DR(reg))); - return push_inst(compiler, ((op & SLJIT_32) ? MFC1 : DMFC1) | inst, DR(reg)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + if (!(op & SLJIT_32)) + return push_inst(compiler, NOP, UNMOVABLE_INS); +#endif /* MIPS III */ + return SLJIT_SUCCESS; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) @@ -199,17 +251,17 @@ static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_t switch (types & SLJIT_ARG_MASK) { case SLJIT_ARG_TYPE_F64: if (arg_count != float_arg_count) - ins = MOV_S | FMT_D | FS(float_arg_count) | FD(arg_count); + ins = MOV_fmt(FMT_D) | FS(float_arg_count) | FD(arg_count); else if (arg_count == 1) - ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1); + ins = MOV_fmt(FMT_D) | FS(SLJIT_FR0) | FD(TMP_FREG1); arg_count--; float_arg_count--; break; case SLJIT_ARG_TYPE_F32: if (arg_count != float_arg_count) - ins = MOV_S | FMT_S | FS(float_arg_count) | FD(arg_count); + ins = MOV_fmt(FMT_S) | FS(float_arg_count) | FD(arg_count); else if (arg_count == 1) - ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1); + ins = MOV_fmt(FMT_S) | FS(SLJIT_FR0) | FD(TMP_FREG1); arg_count--; float_arg_count--; break; @@ -316,7 +368,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw)); else if (src != PIC_ADDR_REG) FAIL_IF(push_inst(compiler, DADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG))); diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_common.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_common.c old mode 100644 new mode 100755 index 2b00d4f16d..eda4a1a64e --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_common.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeMIPS_common.c @@ -26,9 +26,12 @@ /* Latest MIPS architecture. */ -#ifndef __mips_hard_float +#ifdef HAVE_PRCTL +#include +#endif + +#if !defined(__mips_hard_float) || defined(__mips_single_float) /* Disable automatic detection, covers both -msoft-float and -mno-float */ -#undef SLJIT_IS_FPU_AVAILABLE #define SLJIT_IS_FPU_AVAILABLE 0 #endif @@ -42,6 +45,14 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) return "MIPS64-R6" SLJIT_CPUINFO; #endif /* SLJIT_CONFIG_MIPS_32 */ +#elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 5) + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return "MIPS32-R5" SLJIT_CPUINFO; +#else /* !SLJIT_CONFIG_MIPS_32 */ + return "MIPS64-R5" SLJIT_CPUINFO; +#endif /* SLJIT_CONFIG_MIPS_32 */ + #elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) @@ -83,27 +94,31 @@ typedef sljit_u32 sljit_ins; #define EQUAL_FLAG 3 #define OTHER_FLAG 1 +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = { + 0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31, 3, 1 +}; + #define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) #define TMP_FREG3 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3) -static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { - 0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31 -}; - #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { - 0, 0, 14, 2, 4, 6, 8, 18, 30, 28, 26, 24, 22, 20, 12, 10, 16 +static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3) << 1) + 1] = { + 0, + 0, 14, 2, 4, 6, 8, 18, 30, 28, 26, 24, 22, 20, + 12, 10, 16, + 1, 15, 3, 5, 7, 9, 19, 31, 29, 27, 25, 23, 21, + 13, 11, 17 }; -#else +#else /* !SLJIT_CONFIG_MIPS_32 */ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 31, 30, 29, 28, 27, 26, 25, 24, 12, 11, 10 }; -#endif +#endif /* SLJIT_CONFIG_MIPS_32 */ /* --------------------------------------------------------------------- */ /* Instrucion forms */ @@ -200,12 +215,18 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define DMULTU (HI(0) | LO(29)) #endif /* SLJIT_MIPS_REV >= 6 */ #define DIV_S (HI(17) | FMT_S | LO(3)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 #define DINSU (HI(31) | LO(6)) -#define DMFC1 (HI(17) | (1 << 21) | LO(0)) -#define DMTC1 (HI(17) | (5 << 21) | LO(0)) +#endif /* SLJIT_MIPS_REV >= 2 */ +#define DMFC1 (HI(17) | (1 << 21)) +#define DMTC1 (HI(17) | (5 << 21)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 #define DROTR (HI(0) | (1 << 21) | LO(58)) #define DROTR32 (HI(0) | (1 << 21) | LO(62)) #define DROTRV (HI(0) | (1 << 6) | LO(22)) +#define DSBH (HI(31) | (2 << 6) | LO(36)) +#define DSHD (HI(31) | (5 << 6) | LO(36)) +#endif /* SLJIT_MIPS_REV >= 2 */ #define DSLL (HI(0) | LO(56)) #define DSLL32 (HI(0) | LO(60)) #define DSLLV (HI(0) | LO(20)) @@ -233,7 +254,10 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define LWL (HI(34)) #define LWR (HI(38)) #define LWC1 (HI(49)) -#define MFC1 (HI(17) | (0 << 21)) +#define MFC1 (HI(17)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 +#define MFHC1 (HI(17) | (3 << 21)) +#endif /* SLJIT_MIPS_REV >= 2 */ #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6) #define MOD (HI(0) | (3 << 6) | LO(26)) #define MODU (HI(0) | (3 << 6) | LO(27)) @@ -241,8 +265,10 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define MFHI (HI(0) | LO(16)) #define MFLO (HI(0) | LO(18)) #endif /* SLJIT_MIPS_REV >= 6 */ -#define MOV_S (HI(17) | FMT_S | LO(6)) #define MTC1 (HI(17) | (4 << 21)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 +#define MTHC1 (HI(17) | (7 << 21)) +#endif /* SLJIT_MIPS_REV >= 2 */ #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6) #define MUH (HI(0) | (3 << 6) | LO(24)) #define MUHU (HI(0) | (3 << 6) | LO(25)) @@ -258,8 +284,10 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define NOR (HI(0) | LO(39)) #define OR (HI(0) | LO(37)) #define ORI (HI(13)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 #define ROTR (HI(0) | (1 << 21) | LO(2)) #define ROTRV (HI(0) | (1 << 6) | LO(6)) +#endif /* SLJIT_MIPS_REV >= 2 */ #define SD (HI(63)) #define SDL (HI(44)) #define SDR (HI(45)) @@ -281,6 +309,9 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define SWR (HI(46)) #define SWC1 (HI(57)) #define TRUNC_W_S (HI(17) | FMT_S | LO(13)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 +#define WSBH (HI(31) | (2 << 6) | LO(32)) +#endif /* SLJIT_MIPS_REV >= 2 */ #define XOR (HI(0) | LO(38)) #define XORI (HI(14)) @@ -291,15 +322,21 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #else /* SLJIT_MIPS_REV < 6 */ #define DCLZ (HI(28) | LO(36)) #define MOVF (HI(0) | (0 << 16) | LO(1)) +#define MOVF_S (HI(17) | FMT_S | (0 << 16) | LO(17)) #define MOVN (HI(0) | LO(11)) +#define MOVN_S (HI(17) | FMT_S | LO(19)) #define MOVT (HI(0) | (1 << 16) | LO(1)) +#define MOVT_S (HI(17) | FMT_S | (1 << 16) | LO(17)) #define MOVZ (HI(0) | LO(10)) +#define MOVZ_S (HI(17) | FMT_S | LO(18)) #define MUL (HI(28) | LO(2)) #endif /* SLJIT_MIPS_REV >= 6 */ #define PREF (HI(51)) #define PREFX (HI(19) | LO(15)) +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 #define SEB (HI(31) | (16 << 6) | LO(32)) #define SEH (HI(31) | (24 << 6) | LO(32)) +#endif /* SLJIT_MIPS_REV >= 2 */ #endif /* SLJIT_MIPS_REV >= 1 */ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) @@ -320,10 +357,107 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { #define LOAD_W LD #endif +#define MOV_fmt(f) (HI(17) | f | LO(6)) + #define SIMM_MAX (0x7fff) #define SIMM_MIN (-0x8000) #define UIMM_MAX (0xffff) +#define CPU_FEATURE_DETECTED (1 << 0) +#define CPU_FEATURE_FPU (1 << 1) +#define CPU_FEATURE_FP64 (1 << 2) +#define CPU_FEATURE_FR (1 << 3) + +static sljit_u32 cpu_feature_list = 0; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + && (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + +static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32) +{ + if (compiler->scratches == -1) + return 0; + + if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0)) + fr -= SLJIT_F64_SECOND(0); + + return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches)) + || (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0) + || (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)); +} + +#endif /* SLJIT_CONFIG_MIPS_32 && SLJIT_ARGUMENT_CHECKS */ + +static void get_cpu_features(void) +{ +#if !defined(SLJIT_IS_FPU_AVAILABLE) && defined(__GNUC__) + sljit_u32 fir = 0; +#endif /* !SLJIT_IS_FPU_AVAILABLE && __GNUC__ */ + sljit_u32 feature_list = CPU_FEATURE_DETECTED; + +#if defined(SLJIT_IS_FPU_AVAILABLE) +#if SLJIT_IS_FPU_AVAILABLE + feature_list |= CPU_FEATURE_FPU; +#if SLJIT_IS_FPU_AVAILABLE == 64 + feature_list |= CPU_FEATURE_FP64; +#endif /* SLJIT_IS_FPU_AVAILABLE == 64 */ +#endif /* SLJIT_IS_FPU_AVAILABLE */ +#elif defined(__GNUC__) + __asm__ ("cfc1 %0, $0" : "=r"(fir)); + if ((fir & (0x3 << 16)) == (0x3 << 16)) + feature_list |= CPU_FEATURE_FPU; + +#if (defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64) \ + && (!defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV < 2) + if ((feature_list & CPU_FEATURE_FPU)) + feature_list |= CPU_FEATURE_FP64; +#else /* SLJIT_CONFIG_MIPS32 || SLJIT_MIPS_REV >= 2 */ + if ((fir & (1 << 22))) + feature_list |= CPU_FEATURE_FP64; +#endif /* SLJIT_CONFIG_MIPS_64 && SLJIT_MIPS_REV < 2 */ +#endif /* SLJIT_IS_FPU_AVAILABLE */ + + if ((feature_list & CPU_FEATURE_FPU) && (feature_list & CPU_FEATURE_FP64)) { +#if defined(SLJIT_CONFIG_MIPS_32) && SLJIT_CONFIG_MIPS_32 +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 6 + feature_list |= CPU_FEATURE_FR; +#elif defined(SLJIT_DETECT_FR) && SLJIT_DETECT_FR == 0 +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 5 + feature_list |= CPU_FEATURE_FR; +#endif /* SLJIT_MIPS_REV >= 5 */ +#else + sljit_s32 flag = -1; +#ifndef FR_GET_FP_MODE + sljit_f64 zero = 0.0; +#else /* PR_GET_FP_MODE */ + flag = prctl(PR_GET_FP_MODE); + + if (flag > 0) + feature_list |= CPU_FEATURE_FR; +#endif /* FP_GET_PR_MODE */ +#if ((defined(SLJIT_DETECT_FR) && SLJIT_DETECT_FR == 2) \ + || (!defined(PR_GET_FP_MODE) && (!defined(SLJIT_DETECT_FR) || SLJIT_DETECT_FR >= 1))) \ + && (defined(__GNUC__) && (defined(__mips) && __mips >= 2)) + if (flag < 0) { + __asm__ (".set oddspreg\n" + "lwc1 $f17, %0\n" + "ldc1 $f16, %1\n" + "swc1 $f17, %0\n" + : "+m" (flag) : "m" (zero) : "$f16", "$f17"); + if (flag) + feature_list |= CPU_FEATURE_FR; + } +#endif /* (!PR_GET_FP_MODE || (PR_GET_FP_MODE && SLJIT_DETECT_FR == 2)) && __GNUC__ */ +#endif /* SLJIT_MIPS_REV >= 6 */ +#else /* !SLJIT_CONFIG_MIPS_32 */ + /* StatusFR=1 is the only mode supported by the code in MIPS64 */ + feature_list |= CPU_FEATURE_FR; +#endif /* SLJIT_CONFIG_MIPS_32 */ + } + + cpu_feature_list = feature_list; +} + /* dest_reg is the absolute name of the register Useful for reordering instructions in the delay slot. */ static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot) @@ -370,7 +504,7 @@ static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_i if (jump->flags & JUMP_ADDR) target_addr = jump->u.target; else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(jump->u.label != NULL); target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; } @@ -501,72 +635,63 @@ static __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_ #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) -static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_ins *code, sljit_sw executable_offset) { - if (max_label < 0x80000000l) { - put_label->flags = PATCH_ABS32; + sljit_uw addr; + SLJIT_UNUSED_ARG(executable_offset); + + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + if (addr < 0x80000000l) { + jump->flags |= PATCH_ABS32; return 1; } - if (max_label < 0x800000000000l) { - put_label->flags = PATCH_ABS48; + if (addr < 0x800000000000l) { + jump->flags |= PATCH_ABS48; return 3; } - put_label->flags = 0; return 5; } #endif /* SLJIT_CONFIG_MIPS_64 */ -static SLJIT_INLINE void load_addr_to_reg(void *dst, sljit_u32 reg) +static SLJIT_INLINE void load_addr_to_reg(struct sljit_jump *jump) { - struct sljit_jump *jump; - struct sljit_put_label *put_label; - sljit_uw flags; - sljit_ins *inst; - sljit_uw addr; - - if (reg != 0) { - jump = (struct sljit_jump*)dst; - flags = jump->flags; - inst = (sljit_ins*)jump->addr; - addr = (flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; - } else { - put_label = (struct sljit_put_label*)dst; -#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) - flags = put_label->flags; -#endif - inst = (sljit_ins*)put_label->addr; - addr = put_label->label->addr; - reg = *inst; - } + sljit_uw flags = jump->flags; + sljit_ins *ins = (sljit_ins*)jump->addr; + sljit_uw addr = (flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; + sljit_u32 reg = (flags & JUMP_MOV_ADDR) ? *ins : PIC_ADDR_REG; #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - inst[0] = LUI | T(reg) | IMM(addr >> 16); + ins[0] = LUI | T(reg) | IMM(addr >> 16); #else /* !SLJIT_CONFIG_MIPS_32 */ if (flags & PATCH_ABS32) { SLJIT_ASSERT(addr < 0x80000000l); - inst[0] = LUI | T(reg) | IMM(addr >> 16); + ins[0] = LUI | T(reg) | IMM(addr >> 16); } else if (flags & PATCH_ABS48) { SLJIT_ASSERT(addr < 0x800000000000l); - inst[0] = LUI | T(reg) | IMM(addr >> 32); - inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); - inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); - inst += 2; + ins[0] = LUI | T(reg) | IMM(addr >> 32); + ins[1] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + ins[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + ins += 2; } else { - inst[0] = LUI | T(reg) | IMM(addr >> 48); - inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 32) & 0xffff); - inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); - inst[3] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); - inst[4] = DSLL | T(reg) | D(reg) | SH_IMM(16); - inst += 4; + ins[0] = LUI | T(reg) | IMM(addr >> 48); + ins[1] = ORI | S(reg) | T(reg) | IMM((addr >> 32) & 0xffff); + ins[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + ins[3] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + ins[4] = DSLL | T(reg) | D(reg) | SH_IMM(16); + ins += 4; } #endif /* SLJIT_CONFIG_MIPS_32 */ - inst[1] = ORI | S(reg) | T(reg) | IMM(addr & 0xffff); + ins[1] = ORI | S(reg) | T(reg) | IMM(addr & 0xffff); } SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) @@ -577,14 +702,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; sljit_sw executable_offset; sljit_uw addr; - struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -596,58 +719,61 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; - next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - if (next_addr == word_count) { + if (next_min_addr == word_count) { SLJIT_ASSERT(!label || label->size >= word_count); SLJIT_ASSERT(!jump || jump->addr >= word_count); SLJIT_ASSERT(!const_ || const_->addr >= word_count); - SLJIT_ASSERT(!put_label || put_label->addr >= word_count); /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + if (next_min_addr == next_label_size) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (jump && jump->addr == word_count) { + + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - word_count += 2; -#else - word_count += 6; -#endif - jump->addr = (sljit_uw)(code_ptr - 1); - code_ptr = detect_jump_type(jump, code, executable_offset); + word_count += 2; +#else /* !SLJIT_CONFIG_MIPS_32 */ + word_count += 6; +#endif /* SLJIT_CONFIG_MIPS_32 */ + jump->addr = (sljit_uw)(code_ptr - 1); + code_ptr = detect_jump_type(jump, code, executable_offset); + } else { + jump->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + code_ptr += 1; + word_count += 1; +#else /* !SLJIT_CONFIG_MIPS_32 */ + code_ptr += mov_addr_get_length(jump, code, executable_offset); + word_count += 5; +#endif /* SLJIT_CONFIG_MIPS_32 */ + } + jump = jump->next; - } - if (const_ && const_->addr == word_count) { + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == word_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; -#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - code_ptr += 1; - word_count += 1; -#else - code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); - word_count += 5; -#endif - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; word_count++; @@ -657,7 +783,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } while (buf); if (label && label->size == word_count) { - label->addr = (sljit_uw)code_ptr; + label->u.addr = (sljit_uw)code_ptr; label->size = (sljit_uw)(code_ptr - code); label = label->next; } @@ -665,13 +791,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; while (jump) { do { - addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + addr = (jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; buf_ptr = (sljit_ins *)jump->addr; if (jump->flags & PATCH_B) { @@ -687,15 +812,10 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil break; } - load_addr_to_reg(jump, PIC_ADDR_REG); + load_addr_to_reg(jump); } while (0); - jump = jump->next; - } - put_label = compiler->put_labels; - while (put_label) { - load_addr_to_reg(put_label, 0); - put_label = put_label->next; + jump = jump->next; } compiler->error = SLJIT_ERR_COMPILED; @@ -717,20 +837,20 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) { -#if defined(__GNUC__) && !defined(SLJIT_IS_FPU_AVAILABLE) - sljit_sw fir = 0; -#endif /* __GNUC__ && !SLJIT_IS_FPU_AVAILABLE */ - switch (feature_type) { +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + && (!defined(SLJIT_IS_FPU_AVAILABLE) || SLJIT_IS_FPU_AVAILABLE) + case SLJIT_HAS_F64_AS_F32_PAIR: + if (!cpu_feature_list) + get_cpu_features(); + + return (cpu_feature_list & CPU_FEATURE_FR) != 0; +#endif /* SLJIT_CONFIG_MIPS_32 && SLJIT_IS_FPU_AVAILABLE */ case SLJIT_HAS_FPU: -#ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; -#elif defined(__GNUC__) - __asm__ ("cfc1 %0, $0" : "=r"(fir)); - return (fir >> 22) & 0x1; -#else -#error "FIR check is not implemented for this architecture" -#endif + if (!cpu_feature_list) + get_cpu_features(); + + return (cpu_feature_list & CPU_FEATURE_FPU) != 0; case SLJIT_HAS_ZERO_REGISTER: case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: @@ -745,6 +865,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) return 2; #endif /* SLJIT_MIPS_REV >= 1 */ #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) + case SLJIT_HAS_REV: case SLJIT_HAS_ROT: return 1; #endif /* SLJIT_MIPS_REV >= 2 */ @@ -755,7 +876,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - return (type >= SLJIT_ORDERED_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL); + SLJIT_UNUSED_ARG(type); + return 0; } /* --------------------------------------------------------------------- */ @@ -795,6 +917,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw); static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit_s32 frame_size, sljit_ins *ins_ptr); +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define SELECT_OP(a, b) (b) +#else +#define SELECT_OP(a, b) (!(op & SLJIT_32) ? a : b) +#endif + #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #include "sljitNativeMIPS_32.c" #else @@ -922,10 +1050,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi if (word_arg_count == 0 && float_arg_count <= 2) { if (float_arg_count == 1) - FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); } else if (arg_count < 4) { FAIL_IF(push_inst(compiler, MTC1 | TA(4 + arg_count) | FS(float_arg_count), MOVABLE_INS)); - FAIL_IF(push_inst(compiler, MTC1 | TA(5 + arg_count) | FS(float_arg_count) | (1 << 11), MOVABLE_INS)); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + FAIL_IF(push_inst(compiler, MTHC1 | TA(5 + arg_count) | FS(float_arg_count), MOVABLE_INS)); + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + FAIL_IF(push_inst(compiler, MTC1 | TA(5 + arg_count) | FS(float_arg_count) | (1 << 11), MOVABLE_INS)); + break; + } } else FAIL_IF(push_inst(compiler, LDC1 | base | FT(float_arg_count) | IMM(local_size + (arg_count << 2)), MOVABLE_INS)); arg_count++; @@ -935,7 +1072,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi if (word_arg_count == 0 && float_arg_count <= 2) { if (float_arg_count == 1) - FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); } else if (arg_count < 4) FAIL_IF(push_inst(compiler, MTC1 | TA(4 + arg_count) | FS(float_arg_count), MOVABLE_INS)); else @@ -970,16 +1107,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi case SLJIT_ARG_TYPE_F64: float_arg_count++; if (arg_count != float_arg_count) - FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(arg_count) | FD(float_arg_count), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(arg_count) | FD(float_arg_count), MOVABLE_INS)); else if (arg_count == 1) - FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); break; case SLJIT_ARG_TYPE_F32: float_arg_count++; if (arg_count != float_arg_count) - FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(arg_count) | FD(float_arg_count), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(arg_count) | FD(float_arg_count), MOVABLE_INS)); else if (arg_count == 1) - FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS)); break; default: word_arg_count++; @@ -1142,7 +1279,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *c FAIL_IF(emit_stack_frame_release(compiler, 1, &ins)); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { FAIL_IF(push_inst(compiler, JR | S(src), UNMOVABLE_INS)); return push_inst(compiler, ins, UNMOVABLE_INS); } @@ -1392,16 +1529,12 @@ static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, slji #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -#define SELECT_OP(a, b) (b) - #define EMIT_SHIFT(dimm, dimm32, imm, dv, v) \ op_imm = (imm); \ op_v = (v); #else /* !SLJIT_CONFIG_MIPS_32 */ -#define SELECT_OP(a, b) \ - (!(op & SLJIT_32) ? a : b) #define EMIT_SHIFT(dimm, dimm32, imm, dv, v) \ op_dimm = (dimm); \ @@ -1418,10 +1551,10 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj { sljit_s32 is_clz = (GET_OPCODE(op) == SLJIT_CLZ); #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) - sljit_ins max = (op & SLJIT_32) ? 32 : 64; -#else /* !SLJIT_CONFIG_RISCV_64 */ - sljit_ins max = 32; -#endif /* SLJIT_CONFIG_RISCV_64 */ + sljit_ins word_size = (op & SLJIT_32) ? 32 : 64; +#else /* !SLJIT_CONFIG_MIPS_64 */ + sljit_ins word_size = 32; +#endif /* SLJIT_CONFIG_MIPS_64 */ /* The TMP_REG2 is the next value. */ if (src != TMP_REG2) @@ -1429,7 +1562,7 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG2) | TA(0) | IMM(is_clz ? 13 : 14), UNMOVABLE_INS)); /* The OTHER_FLAG is the counter. Delay slot. */ - FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(max), OTHER_FLAG)); + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(word_size), OTHER_FLAG)); if (!is_clz) { FAIL_IF(push_inst(compiler, ANDI | S(TMP_REG2) | T(TMP_REG1) | IMM(1), DR(TMP_REG1))); @@ -1441,7 +1574,7 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(0), OTHER_FLAG)); /* The TMP_REG1 is the next shift. */ - FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(TMP_REG1) | IMM(max), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(TMP_REG1) | IMM(word_size), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(TMP_REG2) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG)); FAIL_IF(push_inst(compiler, SELECT_OP(DSRL, SRL) | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1))); @@ -1465,18 +1598,39 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src) { - SLJIT_UNUSED_ARG(op); +#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64 + int is_32 = (op & SLJIT_32); +#endif /* SLJIT_CONFIG_MIPS_64 */ + op = GET_OPCODE(op); +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 +#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64 + if (!is_32 && (op == SLJIT_REV)) { + FAIL_IF(push_inst(compiler, DSBH | T(src) | D(dst), DR(dst))); + return push_inst(compiler, DSHD | T(dst) | D(dst), DR(dst)); + } + if (op != SLJIT_REV && src != TMP_REG2) { + FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG1), DR(TMP_REG1))); + src = TMP_REG1; + } +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, WSBH | T(src) | D(dst), DR(dst))); + FAIL_IF(push_inst(compiler, ROTR | T(dst) | D(dst) | SH_IMM(16), DR(dst))); +#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64 + if (op == SLJIT_REV_U32 && dst != TMP_REG2 && dst != TMP_REG3) + FAIL_IF(push_inst(compiler, DINSU | T(dst) | SA(0) | (31 << 11), DR(dst))); +#endif /* SLJIT_CONFIG_MIPS_64 */ +#else /* SLJIT_MIPS_REV < 2 */ #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) - if (!(op & SLJIT_32)) { + if (!is_32) { FAIL_IF(push_inst(compiler, DSRL32 | T(src) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, ORI | SA(0) | TA(OTHER_FLAG) | 0xffff, OTHER_FLAG)); FAIL_IF(push_inst(compiler, DSLL32 | T(src) | D(dst) | SH_IMM(0), DR(dst))); FAIL_IF(push_inst(compiler, DSLL32 | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(0), OTHER_FLAG)); FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst))); - FAIL_IF(push_inst(compiler, ORI | SA(OTHER_FLAG) | TA(OTHER_FLAG) | 0xffff, OTHER_FLAG)); FAIL_IF(push_inst(compiler, DSRL | T(dst) | D(TMP_REG1) | SH_IMM(16), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, ORI | SA(OTHER_FLAG) | TA(OTHER_FLAG) | 0xffff, OTHER_FLAG)); FAIL_IF(push_inst(compiler, AND | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); FAIL_IF(push_inst(compiler, AND | S(TMP_REG1) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, DSLL | TA(OTHER_FLAG) | DA(EQUAL_FLAG) | SH_IMM(8), EQUAL_FLAG)); @@ -1490,6 +1644,11 @@ static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s FAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(8), DR(dst))); return push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)); } + + if (op != SLJIT_REV && src != TMP_REG2) { + FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG2) | SH_IMM(0), DR(TMP_REG2))); + src = TMP_REG2; + } #endif /* SLJIT_CONFIG_MIPS_64 */ FAIL_IF(push_inst(compiler, SRL | T(src) | D(TMP_REG1) | SH_IMM(16), DR(TMP_REG1))); @@ -1502,7 +1661,37 @@ static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s FAIL_IF(push_inst(compiler, AND | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); FAIL_IF(push_inst(compiler, AND | S(TMP_REG1) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, SLL | T(dst) | D(dst) | SH_IMM(8), DR(dst))); + FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst))); + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (op == SLJIT_REV_U32 && dst != TMP_REG2 && dst != TMP_REG3) { + FAIL_IF(push_inst(compiler, DSLL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst))); + FAIL_IF(push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst))); + } +#endif /* SLJIT_CONFIG_MIPS_64 */ +#endif /* SLJIT_MIPR_REV >= 2 */ + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_rev16(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src) +{ +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 +#if defined(SLJIT_CONFIG_MIPS_32) && SLJIT_CONFIG_MIPS_32 + FAIL_IF(push_inst(compiler, WSBH | T(src) | D(dst), DR(dst))); +#else /* !SLJIT_CONFIG_MIPS_32 */ + FAIL_IF(push_inst(compiler, DSBH | T(src) | D(dst), DR(dst))); +#endif /* SLJIT_CONFIG_MIPS_32 */ + if (GET_OPCODE(op) == SLJIT_REV_U16) + return push_inst(compiler, ANDI | S(dst) | T(dst) | 0xffff, DR(dst)); + else + return push_inst(compiler, SEH | T(dst) | D(dst), DR(dst)); +#else /* SLJIT_MIPS_REV < 2 */ + FAIL_IF(push_inst(compiler, SELECT_OP(DSRL, SRL) | T(src) | D(TMP_REG1) | SH_IMM(8), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | T(src) | D(dst) | SH_IMM(24), DR(dst))); + FAIL_IF(push_inst(compiler, ANDI | S(TMP_REG1) | T(TMP_REG1) | 0xff, DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, (GET_OPCODE(op) == SLJIT_REV_U16 ? SELECT_OP(DSRL32, SRL) : SELECT_OP(DSRA32, SRA)) | T(dst) | D(dst) | SH_IMM(16), DR(dst))); return push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)); +#endif /* SLJIT_MIPS_REV >= 2 */ } static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, @@ -1532,17 +1721,17 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst)); -#else /* SLJIT_MIPS_REV < 1 */ +#else /* SLJIT_MIPS_REV < 2 */ FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst))); return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst)); -#endif /* SLJIT_MIPS_REV >= 1 */ +#endif /* SLJIT_MIPS_REV >= 2 */ #else /* !SLJIT_CONFIG_MIPS_32 */ -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) if (op & SLJIT_32) return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst)); -#endif /* SLJIT_MIPS_REV >= 1 */ +#endif /* SLJIT_MIPS_REV >= 2 */ FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst))); return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst)); #endif /* SLJIT_CONFIG_MIPS_32 */ @@ -1561,17 +1750,17 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst)); -#else /* SLJIT_MIPS_REV < 1 */ +#else /* SLJIT_MIPS_REV < 2 */ FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst))); return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst)); -#endif /* SLJIT_MIPS_REV >= 1 */ +#endif /* SLJIT_MIPS_REV >= 2 */ #else /* !SLJIT_CONFIG_MIPS_32 */ -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) if (op & SLJIT_32) return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst)); -#endif /* SLJIT_MIPS_REV >= 1 */ +#endif /* SLJIT_MIPS_REV >= 2 */ FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst))); return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst)); #endif /* SLJIT_CONFIG_MIPS_32 */ @@ -1585,7 +1774,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) if (dst == src2) - return push_inst(compiler, DINSU | T(src2) | SA(0) | (31 << 11) | (0 << 11), DR(dst)); + return push_inst(compiler, DINSU | T(src2) | SA(0) | (31 << 11), DR(dst)); #endif /* SLJIT_MIPS_REV >= 2 */ FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst))); return push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst)); @@ -1630,9 +1819,16 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl #endif /* SLJIT_MIPS_REV >= 1 */ case SLJIT_REV: - SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + case SLJIT_REV_U32: + case SLJIT_REV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && src2 != TMP_REG1 && dst != TMP_REG1); return emit_rev(compiler, op, dst, src2); + case SLJIT_REV_U16: + case SLJIT_REV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return emit_rev16(compiler, op, dst, src2); + case SLJIT_ADD: /* Overflow computation (both add and sub): overflow = src1_sign ^ src2_sign ^ result_sign ^ carry_flag */ is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; @@ -2080,9 +2276,10 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 compiler->cache_argw = 0; } - if (dst == TMP_REG2) { + if (dst == 0) { SLJIT_ASSERT(HAS_FLAGS(op)); flags |= UNUSED_DEST; + dst = TMP_REG2; } else if (FAST_IS_REG(dst)) { dst_r = dst; @@ -2094,10 +2291,10 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 flags |= SLOW_DEST; if (flags & IMM_OP) { - if ((src2 & SLJIT_IMM) && src2w != 0 && CHECK_IMM(flags, src2w)) { + if (src2 == SLJIT_IMM && src2w != 0 && CHECK_IMM(flags, src2w)) { flags |= SRC2_IMM; src2_r = src2w; - } else if ((flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w != 0 && CHECK_IMM(flags, src1w)) { + } else if ((flags & CUMULATIVE_OP) && src1 == SLJIT_IMM && src1w != 0 && CHECK_IMM(flags, src1w)) { flags |= SRC2_IMM; src2_r = src1w; @@ -2114,7 +2311,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 src1_r = src1; flags |= REG1_SOURCE; } - else if (src1 & SLJIT_IMM) { + else if (src1 == SLJIT_IMM) { if (src1w) { FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); src1_r = TMP_REG1; @@ -2137,7 +2334,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 if ((flags & (REG_DEST | MOVE_OP)) == MOVE_OP) dst_r = (sljit_s32)src2_r; } - else if (src2 & SLJIT_IMM) { + else if (src2 == SLJIT_IMM) { if (!(flags & SRC2_IMM)) { if (src2w) { FAIL_IF(load_immediate(compiler, DR(sugg_src2_r), src2w)); @@ -2325,29 +2522,37 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) case SLJIT_MOV_U32: - return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u32)srcw : srcw); case SLJIT_MOV_S32: case SLJIT_MOV32: - return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s32)srcw : srcw); #endif case SLJIT_MOV_U8: - return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw); case SLJIT_MOV_S8: - return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw); case SLJIT_MOV_U16: - return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw); case SLJIT_MOV_S16: - return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw); case SLJIT_CLZ: case SLJIT_CTZ: case SLJIT_REV: return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U16: + case SLJIT_REV_S16: + return emit_op(compiler, op, HALF_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U32: + case SLJIT_REV_S32: + return emit_op(compiler, op | SLJIT_32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); } SLJIT_UNREACHABLE(); @@ -2370,9 +2575,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) if (op & SLJIT_32) { flags |= INT_DATA | SIGNED_DATA; - if (src1 & SLJIT_IMM) + if (src1 == SLJIT_IMM) src1w = (sljit_s32)src1w; - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) src2w = (sljit_s32)src2w; } #endif @@ -2393,7 +2598,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_XOR: - if (((src1 & SLJIT_IMM) && src1w == -1) || ((src2 & SLJIT_IMM) && src2w == -1)) { + if ((src1 == SLJIT_IMM && src1w == -1) || (src2 == SLJIT_IMM && src2w == -1)) { return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); } /* fallthrough */ @@ -2410,10 +2615,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile case SLJIT_ROTL: case SLJIT_ROTR: #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) src2w &= 0x1f; #else - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { if (op & SLJIT_32) src2w &= 0x1f; else @@ -2435,7 +2640,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compil CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w)); SLJIT_SKIP_CHECKS(compiler); - return sljit_emit_op2(compiler, op, TMP_REG2, 0, src1, src1w, src2, src2w); + return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w); } #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) @@ -2474,7 +2679,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= bit_length - 1; if (src3w == 0) @@ -2591,21 +2796,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type != SLJIT_FLOAT_REGISTER) + return -1; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); return FR(reg); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_u32 size) { + SLJIT_UNUSED_ARG(size); + CHECK_ERROR(); CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); @@ -2617,14 +2825,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c /* --------------------------------------------------------------------- */ #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 7)) -#define FMT(op) ((((sljit_ins)op & SLJIT_32) ^ SLJIT_32) << (21 - 8)) +#define FMT(op) (FMT_S | (~(sljit_ins)op & SLJIT_32) << (21 - (5 + 3))) static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -# define flags (sljit_u32)0 + sljit_u32 flags = 0; #else sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64)) << 21; #endif @@ -2638,18 +2846,13 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp if (FAST_IS_REG(dst)) { FAIL_IF(push_inst(compiler, MFC1 | flags | T(dst) | FS(TMP_FREG1), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) +#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1) FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif +#endif /* MIPS III */ return SLJIT_SUCCESS; } - /* Store the integer value from a VFP register. */ return emit_op_mem2(compiler, flags ? DOUBLE_DATA : SINGLE_DATA, FR(TMP_FREG1), dst, dstw, 0, 0); - -#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -# undef flags -#endif } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, @@ -2657,43 +2860,158 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp sljit_s32 src, sljit_sw srcw) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -# define flags (sljit_u32)0 + sljit_u32 flags = 0; #else sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)) << 21; #endif - sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - if (FAST_IS_REG(src)) { - FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) - FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif - } else if (src & SLJIT_MEM) { - /* Load the integer value into a VFP register. */ + if (src & SLJIT_MEM) FAIL_IF(emit_op_mem2(compiler, (flags ? DOUBLE_DATA : SINGLE_DATA) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw)); - } else { + if (src == SLJIT_IMM) { #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) - if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - srcw = (sljit_s32)srcw; + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; #endif - FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); - FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); + src = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1) FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif +#endif /* MIPS III */ } - FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((((sljit_ins)op & SLJIT_32) ^ SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); if (dst & SLJIT_MEM) return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0); return SLJIT_SUCCESS; +} +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -# undef flags + sljit_u32 flags = 0; +#else + sljit_u32 flags = 1 << 21; #endif + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW ? WORD_DATA : INT_DATA) | LOAD_DATA, DR(TMP_REG1), src, srcw, dst, dstw)); + src = TMP_REG1; + } else if (src == SLJIT_IMM) { +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) + srcw = (sljit_u32)srcw; +#endif + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); + src = TMP_REG1; + } + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) { + if (src != TMP_REG1) { + FAIL_IF(push_inst(compiler, DSLL32 | T(src) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, DSRL32 | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1))); + } + + FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0); + return SLJIT_SUCCESS; + } +#else /* !SLJIT_CONFIG_MIPS_64 */ + if (!(op & SLJIT_32)) { + FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG2) | SH_IMM(1), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SRL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(1), DR(TMP_REG2))); + + FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG2) | FS(TMP_FREG1), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | 1 | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + +#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1) + FAIL_IF(push_inst(compiler, BGEZ | S(src) | 5, UNMOVABLE_INS)); +#else /* SLJIT_MIPS_REV >= 1 */ + FAIL_IF(push_inst(compiler, BGEZ | S(src) | 4, UNMOVABLE_INS)); +#endif /* SLJIT_MIPS_REV < 1 */ + + FAIL_IF(push_inst(compiler, LUI | T(TMP_REG2) | IMM(0x41e0), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, MTC1 | TA(0) | FS(TMP_FREG2), UNMOVABLE_INS)); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + FAIL_IF(push_inst(compiler, MTHC1 | T(TMP_REG2) | FS(TMP_FREG2), UNMOVABLE_INS)); + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(TMP_FREG2) | (1 << 11), UNMOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + break; + } + FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(TMP_FREG2) | FS(dst_r) | FD(dst_r), UNMOVABLE_INS)); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0); + return SLJIT_SUCCESS; + } +#endif /* SLJIT_CONFIG_MIPS_64 */ + +#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1) + FAIL_IF(push_inst(compiler, BLTZ | S(src) | 5, UNMOVABLE_INS)); +#else /* SLJIT_MIPS_REV >= 1 */ + FAIL_IF(push_inst(compiler, BLTZ | S(src) | 4, UNMOVABLE_INS)); +#endif /* SLJIT_MIPS_REV < 1 */ + FAIL_IF(push_inst(compiler, ANDI | S(src) | T(TMP_REG2) | IMM(1), DR(TMP_REG2))); + + FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* !SLJIT_MIPS_REV */ + + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + +#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1) + FAIL_IF(push_inst(compiler, BEQ | 6, UNMOVABLE_INS)); +#else /* SLJIT_MIPS_REV >= 1 */ + FAIL_IF(push_inst(compiler, BEQ | 5, UNMOVABLE_INS)); +#endif /* SLJIT_MIPS_REV < 1 */ + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + FAIL_IF(push_inst(compiler, DSRL | T(src) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1))); +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, SRL | T(src) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1))); +#endif /* SLJIT_CONFIG_MIPS_64 */ + + FAIL_IF(push_inst(compiler, OR | S(TMP_REG1) | T(TMP_REG2) | D(TMP_REG1), DR(TMP_REG1))); + + FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS)); +#if !defined(SLJIT_MIPS_REV) + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* !SLJIT_MIPS_REV */ + + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(dst_r) | FS(dst_r) | FD(dst_r), UNMOVABLE_INS)); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0); + return SLJIT_SUCCESS; } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, @@ -2772,7 +3090,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil case SLJIT_MOV_F64: if (src != dst_r) { if (dst_r != TMP_FREG1) - FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MOV_fmt(FMT(op)) | FS(src) | FD(dst_r), MOVABLE_INS)); else dst_r = src; } @@ -2853,18 +3171,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil case SLJIT_ADD_F64: FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); break; - case SLJIT_SUB_F64: FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); break; - case SLJIT_MUL_F64: FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); break; - case SLJIT_DIV_F64: FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); break; + case SLJIT_COPYSIGN_F64: + return emit_copysign(compiler, op, src1, src2, dst_r); } if (dst_r == TMP_FREG2) @@ -2873,8 +3190,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return SLJIT_SUCCESS; } -#undef FLOAT_DATA -#undef FMT +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, MTC1 | TA(0) | FS(freg), MOVABLE_INS); + + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.imm)); + return push_inst(compiler, MTC1 | T(TMP_REG1) | FS(freg), MOVABLE_INS); +} /* --------------------------------------------------------------------- */ /* Conditional instructions */ @@ -3032,7 +3366,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile } #define RESOLVE_IMM1() \ - if (src1 & SLJIT_IMM) { \ + if (src1 == SLJIT_IMM) { \ if (src1w) { \ PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); \ src1 = TMP_REG1; \ @@ -3042,7 +3376,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile } #define RESOLVE_IMM2() \ - if (src2 & SLJIT_IMM) { \ + if (src2 == SLJIT_IMM) { \ if (src2w) { \ PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG2), src2w)); \ src2 = TMP_REG2; \ @@ -3094,10 +3428,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2))) jump->flags |= IS_MOVABLE; PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | BRANCH_LENGTH, UNMOVABLE_INS)); - } - else if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) { + } else if (type >= SLJIT_SIG_LESS && ((src1 == SLJIT_IMM && src1w == 0) || (src2 == SLJIT_IMM && src2w == 0))) { inst = NOP; - if ((src1 & SLJIT_IMM) && (src1w == 0)) { + if (src1 == SLJIT_IMM && src1w == 0) { RESOLVE_IMM2(); switch (type) { case SLJIT_SIG_LESS: @@ -3145,7 +3478,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler else { if (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) { RESOLVE_IMM1(); - if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN) + if (src2 == SLJIT_IMM && src2w <= SIMM_MAX && src2w >= SIMM_MIN) PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1))); else { RESOLVE_IMM2(); @@ -3155,7 +3488,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler } else { RESOLVE_IMM2(); - if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN) + if (src1 == SLJIT_IMM && src1w <= SIMM_MAX && src1w >= SIMM_MIN) PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1))); else { RESOLVE_IMM1(); @@ -3190,9 +3523,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler #undef BR_T #undef BR_F -#undef FLOAT_DATA -#undef FMT - SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) { struct sljit_jump *jump = NULL; @@ -3200,7 +3530,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi CHECK_ERROR(); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); FAIL_IF(!jump); set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0)); @@ -3232,8 +3562,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi #endif } - FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); - return SLJIT_SUCCESS; + return push_inst(compiler, NOP, UNMOVABLE_INS); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, @@ -3335,50 +3664,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, TMP_REG2, 0); } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, - sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) + +static sljit_ins get_select_cc(sljit_s32 type, sljit_s32 is_float) { -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) - sljit_ins ins; -#endif /* SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6 */ - - CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); - -#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) - - if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { -#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) - if (type & SLJIT_32) - srcw = (sljit_s32)srcw; -#endif - FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); - src = TMP_REG1; - srcw = 0; - } - switch (type & ~SLJIT_32) { case SLJIT_EQUAL: - ins = MOVZ | TA(EQUAL_FLAG); - break; + return (is_float ? MOVZ_S : MOVZ) | TA(EQUAL_FLAG); case SLJIT_NOT_EQUAL: - ins = MOVN | TA(EQUAL_FLAG); - break; + return (is_float ? MOVN_S : MOVN) | TA(EQUAL_FLAG); case SLJIT_LESS: case SLJIT_GREATER: case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW: - ins = MOVN | TA(OTHER_FLAG); - break; + case SLJIT_CARRY: + return (is_float ? MOVN_S : MOVN) | TA(OTHER_FLAG); case SLJIT_GREATER_EQUAL: case SLJIT_LESS_EQUAL: case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW: - ins = MOVZ | TA(OTHER_FLAG); - break; + case SLJIT_NOT_CARRY: + return (is_float ? MOVZ_S : MOVZ) | TA(OTHER_FLAG); case SLJIT_F_EQUAL: case SLJIT_F_LESS: case SLJIT_F_LESS_EQUAL: @@ -3389,8 +3697,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_UNORDERED_OR_LESS_EQUAL: case SLJIT_ORDERED_LESS_EQUAL: case SLJIT_UNORDERED: - ins = MOVT; - break; + return is_float ? MOVT_S : MOVT; case SLJIT_F_NOT_EQUAL: case SLJIT_F_GREATER_EQUAL: case SLJIT_F_GREATER: @@ -3401,21 +3708,159 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil case SLJIT_ORDERED_GREATER: case SLJIT_UNORDERED_OR_GREATER: case SLJIT_ORDERED: - ins = MOVF; - break; + return is_float ? MOVF_S : MOVF; default: - ins = MOVZ | TA(OTHER_FLAG); SLJIT_UNREACHABLE(); - break; + return (is_float ? MOVZ_S : MOVZ) | TA(OTHER_FLAG); + } +} + +#endif /* SLJIT_MIPS_REV >= 1 */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) +{ +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; + sljit_ins mov_ins = (type & SLJIT_32) ? ADDU : DADDU; +#else /* !SLJIT_CONFIG_MIPS_64 */ + sljit_s32 inp_flags = WORD_DATA | LOAD_DATA; + sljit_ins mov_ins = ADDU; +#endif /* SLJIT_CONFIG_MIPS_64 */ + +#if !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) + struct sljit_label *label; + struct sljit_jump *jump; +#endif /* !(SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) */ + + CHECK_ERROR(); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + ADJUST_LOCAL_OFFSET(src1, src1w); + +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, DR(TMP_REG2), src1, src1w)); + src1 = TMP_REG2; + } else if (src1 == SLJIT_IMM) { +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (type & SLJIT_32) + src1w = (sljit_s32)src1w; +#endif + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); + src1 = TMP_REG1; } - return push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg)); + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, mov_ins | S(src2_reg) | TA(0) | D(dst_reg), DR(dst_reg))); + } + + return push_inst(compiler, get_select_cc(type, 0) | S(src1) | D(dst_reg), DR(dst_reg)); #else /* SLJIT_MIPS_REV < 1 || SLJIT_MIPS_REV >= 6 */ - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + FAIL_IF(push_inst(compiler, ADDU_W | S(dst_reg) | TA(0) | D(TMP_REG2), DR(TMP_REG2))); + + if ((src1 & REG_MASK) == dst_reg) + src1 = (src1 & ~REG_MASK) | TMP_REG2; + + if (OFFS_REG(src1) == dst_reg) + src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2); + } + + FAIL_IF(push_inst(compiler, mov_ins | S(src2_reg) | TA(0) | D(dst_reg), DR(dst_reg))); + } + } + + SLJIT_SKIP_CHECKS(compiler); + jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1); + FAIL_IF(!jump); + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, DR(dst_reg), src1, src1w)); + } else if (src1 == SLJIT_IMM) { +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (type & SLJIT_32) + src1w = (sljit_s32)src1w; +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(load_immediate(compiler, DR(dst_reg), src1w)); + } else + FAIL_IF(push_inst(compiler, mov_ins | S(src1) | TA(0) | D(dst_reg), DR(dst_reg))); + + SLJIT_SKIP_CHECKS(compiler); + label = sljit_emit_label(compiler); + FAIL_IF(!label); + + sljit_set_label(jump, label); + return SLJIT_SUCCESS; #endif /* SLJIT_MIPS_REV >= 1 */ } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ +#if !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) + struct sljit_label *label; + struct sljit_jump *jump; +#endif /* !(SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) */ + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, MOV_fmt(FMT(type)) | FS(src2_freg) | FD(dst_freg), MOVABLE_INS)); + } + +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, FR(TMP_FREG1), src1, src1w)); + src1 = TMP_FREG1; + } + + return push_inst(compiler, get_select_cc(type, 1) | FMT(type) | FS(src1) | FD(dst_freg), MOVABLE_INS); + +#else /* SLJIT_MIPS_REV < 1 || SLJIT_MIPS_REV >= 6 */ + SLJIT_SKIP_CHECKS(compiler); + jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1); + FAIL_IF(!jump); + + if (src1 & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, FR(dst_freg), src1, src1w)); + else + FAIL_IF(push_inst(compiler, MOV_fmt(FMT(type)) | FS(src1) | FD(dst_freg), MOVABLE_INS)); + + SLJIT_SKIP_CHECKS(compiler); + label = sljit_emit_label(compiler); + FAIL_IF(!label); + + sljit_set_label(jump, label); + return SLJIT_SUCCESS; +#endif /* SLJIT_MIPS_REV >= 1 */ +} + +#undef FLOAT_DATA +#undef FMT + static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem, sljit_sw *memw, sljit_s16 max_offset) { sljit_s32 arg = *mem; @@ -3458,21 +3903,33 @@ static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem } #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) -#define MEM16_IMM_FIRST(memw) IMM((memw) + 1) -#define MEM16_IMM_SECOND(memw) IMM(memw) -#define MEMF64_FS_FIRST(freg) FS(freg) -#define MEMF64_FS_SECOND(freg) (FS(freg) | ((sljit_ins)1 << 11)) +#define IMM_LEFT(memw) IMM((memw) + SSIZE_OF(sw) - 1) +#define IMM_RIGHT(memw) IMM(memw) +#define IMM_32_LEFT(memw) IMM((memw) + SSIZE_OF(s32) - 1) +#define IMM_32_RIGHT(memw) IMM(memw) +#define IMM_F64_FIRST_LEFT(memw) IMM((memw) + SSIZE_OF(s32) - 1) +#define IMM_F64_FIRST_RIGHT(memw) IMM(memw) +#define IMM_F64_SECOND_LEFT(memw) IMM((memw) + SSIZE_OF(f64) - 1) +#define IMM_F64_SECOND_RIGHT(memw) IMM((memw) + SSIZE_OF(s32)) +#define IMM_16_FIRST(memw) IMM((memw) + 1) +#define IMM_16_SECOND(memw) IMM(memw) #else /* !SLJIT_LITTLE_ENDIAN */ -#define MEM16_IMM_FIRST(memw) IMM(memw) -#define MEM16_IMM_SECOND(memw) IMM((memw) + 1) -#define MEMF64_FS_FIRST(freg) (FS(freg) | ((sljit_ins)1 << 11)) -#define MEMF64_FS_SECOND(freg) FS(freg) +#define IMM_LEFT(memw) IMM(memw) +#define IMM_RIGHT(memw) IMM((memw) + SSIZE_OF(sw) - 1) +#define IMM_32_LEFT(memw) IMM(memw) +#define IMM_32_RIGHT(memw) IMM((memw) + SSIZE_OF(s32) - 1) +#define IMM_F64_FIRST_LEFT(memw) IMM((memw) + SSIZE_OF(s32)) +#define IMM_F64_FIRST_RIGHT(memw) IMM((memw) + SSIZE_OF(f64) - 1) +#define IMM_F64_SECOND_LEFT(memw) IMM(memw) +#define IMM_F64_SECOND_RIGHT(memw) IMM((memw) + SSIZE_OF(s32) - 1) +#define IMM_16_FIRST(memw) IMM(memw) +#define IMM_16_SECOND(memw) IMM((memw) + 1) #endif /* SLJIT_LITTLE_ENDIAN */ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16)) +#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16)) #else /* !SLJIT_CONFIG_MIPS_32 */ -#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)) +#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)) #endif /* SLJIT_CONFIG_MIPS_32 */ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, @@ -3509,10 +3966,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile ins_right = ((type & SLJIT_MEM_STORE) ? SDR : LDR) | S(mem); #endif /* SLJIT_CONFIG_MIPS_32 */ - FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_FIRST(reg)) | IMM(memw), DR(REG_PAIR_FIRST(reg)))); - FAIL_IF(push_inst(compiler, ins_right | T(REG_PAIR_FIRST(reg)) | IMM(memw + (SSIZE_OF(sw) - 1)), DR(REG_PAIR_FIRST(reg)))); - FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_SECOND(reg)) | IMM(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg)))); - return push_inst(compiler, ins_right | T(REG_PAIR_SECOND(reg)) | IMM((memw + 2 * SSIZE_OF(sw) - 1)), DR(REG_PAIR_SECOND(reg))); + FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_FIRST(reg)) | IMM_LEFT(memw), DR(REG_PAIR_FIRST(reg)))); + FAIL_IF(push_inst(compiler, ins_right | T(REG_PAIR_FIRST(reg)) | IMM_RIGHT(memw), DR(REG_PAIR_FIRST(reg)))); + FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_SECOND(reg)) | IMM_LEFT(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg)))); + return push_inst(compiler, ins_right | T(REG_PAIR_SECOND(reg)) | IMM_RIGHT(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg))); } #endif /* !(SLJIT_MIPS_REV >= 6) */ @@ -3553,8 +4010,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile if (type & SLJIT_MEM_STORE) { FAIL_IF(push_inst(compiler, SRA_W | T(reg) | D(TMP_REG2) | SH_IMM(8), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(TMP_REG2) | MEM16_IMM_FIRST(memw), MOVABLE_INS)); - return push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(reg) | MEM16_IMM_SECOND(memw), MOVABLE_INS); + FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(TMP_REG2) | IMM_16_FIRST(memw), MOVABLE_INS)); + return push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(reg) | IMM_16_SECOND(memw), MOVABLE_INS); } flags = BYTE_DATA | LOAD_DATA; @@ -3562,15 +4019,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile if (op == SLJIT_MOV_S16) flags |= SIGNED_DATA; - FAIL_IF(push_inst(compiler, data_transfer_insts[flags] | S(mem) | T(TMP_REG2) | MEM16_IMM_FIRST(memw), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA | LOAD_DATA] | S(mem) | T(reg) | MEM16_IMM_SECOND(memw), DR(reg))); + FAIL_IF(push_inst(compiler, data_transfer_insts[flags] | S(mem) | T(TMP_REG2) | IMM_16_FIRST(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA | LOAD_DATA] | S(mem) | T(reg) | IMM_16_SECOND(memw), DR(reg))); FAIL_IF(push_inst(compiler, SLL_W | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(8), DR(TMP_REG2))); return push_inst(compiler, OR | S(reg) | T(TMP_REG2) | D(reg), DR(reg)); case SLJIT_MOV: case SLJIT_MOV_P: #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - if (type & SLJIT_MEM_UNALIGNED_32) { + if (type & SLJIT_MEM_ALIGNED_32) { flags = WORD_DATA; if (!(type & SLJIT_MEM_STORE)) flags |= LOAD_DATA; @@ -3582,8 +4039,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile SLJIT_ASSERT(FAST_IS_REG(mem) && mem != TMP_REG2); if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst(compiler, SDL | S(mem) | T(reg) | IMM(memw), MOVABLE_INS)); - return push_inst(compiler, SDR | S(mem) | T(reg) | IMM(memw + 7), MOVABLE_INS); + FAIL_IF(push_inst(compiler, SDL | S(mem) | T(reg) | IMM_LEFT(memw), MOVABLE_INS)); + return push_inst(compiler, SDR | S(mem) | T(reg) | IMM_RIGHT(memw), MOVABLE_INS); } if (mem == reg) { @@ -3591,8 +4048,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile mem = TMP_REG1; } - FAIL_IF(push_inst(compiler, LDL | S(mem) | T(reg) | IMM(memw), DR(reg))); - return push_inst(compiler, LDR | S(mem) | T(reg) | IMM(memw + 7), DR(reg)); + FAIL_IF(push_inst(compiler, LDL | S(mem) | T(reg) | IMM_LEFT(memw), DR(reg))); + return push_inst(compiler, LDR | S(mem) | T(reg) | IMM_RIGHT(memw), DR(reg)); #endif /* SLJIT_CONFIG_MIPS_32 */ } @@ -3600,8 +4057,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile SLJIT_ASSERT(FAST_IS_REG(mem) && mem != TMP_REG2); if (type & SLJIT_MEM_STORE) { - FAIL_IF(push_inst(compiler, SWL | S(mem) | T(reg) | IMM(memw), MOVABLE_INS)); - return push_inst(compiler, SWR | S(mem) | T(reg) | IMM(memw + 3), MOVABLE_INS); + FAIL_IF(push_inst(compiler, SWL | S(mem) | T(reg) | IMM_32_LEFT(memw), MOVABLE_INS)); + return push_inst(compiler, SWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), MOVABLE_INS); } if (mem == reg) { @@ -3609,18 +4066,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile mem = TMP_REG1; } - FAIL_IF(push_inst(compiler, LWL | S(mem) | T(reg) | IMM(memw), DR(reg))); + FAIL_IF(push_inst(compiler, LWL | S(mem) | T(reg) | IMM_32_LEFT(memw), DR(reg))); #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - return push_inst(compiler, LWR | S(mem) | T(reg) | IMM(memw + 3), DR(reg)); + return push_inst(compiler, LWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), DR(reg)); #else /* !SLJIT_CONFIG_MIPS_32 */ - FAIL_IF(push_inst(compiler, LWR | S(mem) | T(reg) | IMM(memw + 3), DR(reg))); + FAIL_IF(push_inst(compiler, LWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), DR(reg))); if (op != SLJIT_MOV_U32) return SLJIT_SUCCESS; #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2) - return push_inst(compiler, DINSU | T(reg) | SA(0) | (31 << 11) | (0 << 11), DR(reg)); -#else /* SLJIT_MIPS_REV < 1 */ + return push_inst(compiler, DINSU | T(reg) | SA(0) | (31 << 11), DR(reg)); +#else /* SLJIT_MIPS_REV < 2 */ FAIL_IF(push_inst(compiler, DSLL32 | T(reg) | D(reg) | SH_IMM(0), DR(reg))); return push_inst(compiler, DSRL32 | T(reg) | D(reg) | SH_IMM(0), DR(reg)); #endif /* SLJIT_MIPS_REV >= 2 */ @@ -3643,77 +4100,97 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil if (type & SLJIT_MEM_STORE) { if (type & SLJIT_32) { FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2))); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) +#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1) FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif - FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS)); - return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), MOVABLE_INS); +#endif /* MIPS III */ + FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_32_LEFT(memw), MOVABLE_INS)); + return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_32_RIGHT(memw), MOVABLE_INS); } #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | MEMF64_FS_FIRST(freg), DR(TMP_REG2))); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) + FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2))); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ + FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_LEFT(memw), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_RIGHT(memw), MOVABLE_INS)); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + FAIL_IF(push_inst(compiler, MFHC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2))); + break; +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg) | (1 << 11), DR(TMP_REG2))); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); #endif - FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS)); - FAIL_IF(push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), MOVABLE_INS)); + break; + } - FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | MEMF64_FS_SECOND(freg), DR(TMP_REG2))); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) - FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif - FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw + 4), MOVABLE_INS)); - return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 7), MOVABLE_INS); + FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_LEFT(memw), MOVABLE_INS)); + return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_RIGHT(memw), MOVABLE_INS); #else /* !SLJIT_CONFIG_MIPS_32 */ - FAIL_IF(push_inst(compiler, MFC1 | (1 << 21) | T(TMP_REG2) | FS(freg), DR(TMP_REG2))); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) + FAIL_IF(push_inst(compiler, DMFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2))); +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif - FAIL_IF(push_inst(compiler, SDL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS)); - return push_inst(compiler, SDR | S(mem) | T(TMP_REG2) | IMM(memw + 7), MOVABLE_INS); +#endif /* MIPS III */ + FAIL_IF(push_inst(compiler, SDL | S(mem) | T(TMP_REG2) | IMM_LEFT(memw), MOVABLE_INS)); + return push_inst(compiler, SDR | S(mem) | T(TMP_REG2) | IMM_RIGHT(memw), MOVABLE_INS); #endif /* SLJIT_CONFIG_MIPS_32 */ } if (type & SLJIT_32) { - FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_32_LEFT(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_32_RIGHT(memw), DR(TMP_REG2))); FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) +#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1) FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif +#endif /* MIPS III */ return SLJIT_SUCCESS; } #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | MEMF64_FS_FIRST(freg), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_LEFT(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_RIGHT(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS)); - FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw + 4), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 7), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | MEMF64_FS_SECOND(freg), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) - FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif + FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_LEFT(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_RIGHT(memw), DR(TMP_REG2))); + switch (cpu_feature_list & CPU_FEATURE_FR) { +#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2 + case CPU_FEATURE_FR: + return push_inst(compiler, MTHC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS); +#endif /* SLJIT_MIPS_REV >= 2 */ + default: + FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg) | (1 << 11), MOVABLE_INS)); + break; + } #else /* !SLJIT_CONFIG_MIPS_32 */ - FAIL_IF(push_inst(compiler, LDL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, LDR | S(mem) | T(TMP_REG2) | IMM(memw + 7), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LDL | S(mem) | T(TMP_REG2) | IMM_LEFT(memw), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, LDR | S(mem) | T(TMP_REG2) | IMM_RIGHT(memw), DR(TMP_REG2))); - FAIL_IF(push_inst(compiler, MTC1 | (1 << 21) | T(TMP_REG2) | FS(freg), MOVABLE_INS)); -#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3) - FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif + FAIL_IF(push_inst(compiler, DMTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS)); #endif /* SLJIT_CONFIG_MIPS_32 */ +#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1 + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* MIPS III */ return SLJIT_SUCCESS; } #endif /* !SLJIT_MIPS_REV || SLJIT_MIPS_REV < 6 */ -#undef MEM16_IMM_FIRST -#undef MEM16_IMM_SECOND -#undef MEMF64_FS_FIRST -#undef MEMF64_FS_SECOND +#undef IMM_16_SECOND +#undef IMM_16_FIRST +#undef IMM_F64_SECOND_RIGHT +#undef IMM_F64_SECOND_LEFT +#undef IMM_F64_FIRST_RIGHT +#undef IMM_F64_FIRST_LEFT +#undef IMM_32_RIGHT +#undef IMM_32_LEFT +#undef IMM_RIGHT +#undef IMM_LEFT #undef MEM_CHECK_UNALIGNED #undef TO_ARGW_HI @@ -3740,18 +4217,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; PTR_FAIL_IF(push_inst(compiler, (sljit_ins)dst_r, UNMOVABLE_INS)); @@ -3764,5 +4241,5 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct slj if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, DR(TMP_REG2), dst, dstw)); - return put_label; + return jump; } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_32.c old mode 100644 new mode 100755 index 25cfcb9072..2352fad5d4 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_32.c @@ -325,6 +325,109 @@ static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_ return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value)); } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + sljit_s32 invert_sign = 1; + + if (src == SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ (sljit_sw)0x80000000)); + src = TMP_REG1; + invert_sign = 0; + } else if (!FAST_IS_REG(src)) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + /* First, a special double precision floating point value is constructed: + (2^53 + (src xor (2^31))) + The upper 32 bits of this number is a constant, and the lower 32 bits + is simply the value of the source argument. The xor 2^31 operation adds + 0x80000000 to the source argument, which moves it into the 0 - 0xffffffff + range. Finally we substract 2^53 + 2^31 to get the converted value. */ + FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330)); + if (invert_sign) + FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000)); + FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI)); + FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); + FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + + FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2))); + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src == SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } else if (!FAST_IS_REG(src)) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + /* First, a special double precision floating point value is constructed: + (2^53 + src) + The upper 32 bits of this number is a constant, and the lower 32 bits + is simply the value of the source argument. Finally we substract 2^53 + to get the converted value. */ + FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330)); + FAIL_IF(push_inst(compiler, STW | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); + FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI)); + + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, STW | S(TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + + FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2))); + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_s32 imm[2]; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm[0] != 0) + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0])); + if (u.imm[1] != 0) + FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1])); + + /* Saved in the same endianness. */ + FAIL_IF(push_inst(compiler, STW | S(u.imm[0] != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, STW | S(u.imm[1] != 0 ? TMP_REG2 : TMP_ZERO) | A(SLJIT_SP) | (TMP_MEM_OFFSET + sizeof(sljit_s32)))); + return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -352,9 +455,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi FAIL_IF(push_inst(compiler, STW | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI)); if (reg2 != 0) - FAIL_IF(push_inst(compiler, STW | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LOW)); + FAIL_IF(push_inst(compiler, STW | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); else - FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET_LOW)); + FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET); } @@ -362,7 +465,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET)); if (reg2 != 0) - FAIL_IF(push_inst(compiler, LWZ | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LOW)); + FAIL_IF(push_inst(compiler, LWZ | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO)); return push_inst(compiler, LWZ | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI); } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_64.c old mode 100644 new mode 100755 index 8d774cf57a..b3cf9d074d --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_64.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_64.c @@ -49,7 +49,7 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, if (imm <= SIMM_MAX && imm >= SIMM_MIN) return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm)); - if (!(imm & ~0xffff)) + if (((sljit_uw)imm >> 16) == 0) return push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm)); if (imm <= 0x7fffffffl && imm >= -0x80000000l) { @@ -57,6 +57,11 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS; } + if (((sljit_uw)imm >> 32) == 0) { + FAIL_IF(push_inst(compiler, ORIS | S(TMP_ZERO) | A(reg) | IMM(imm >> 16))); + return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS; + } + /* Count leading zeroes. */ tmp = (sljit_uw)((imm >= 0) ? imm : ~imm); ASM_SLJIT_CLZ(tmp, shift); @@ -563,6 +568,126 @@ static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_ return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value)); } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src == SLJIT_IMM) { + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) { + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1))); + else + FAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + if (FAST_IS_REG(src)) { + FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + } else + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1)); + + FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) { + if (src == SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_u32)srcw)); + src = TMP_REG1; + } else { + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, CLRLDI(TMP_REG1, src, 32))); + else + FAIL_IF(emit_op_mem(compiler, INT_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); + } else { + if (src == SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } else if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, CMPI | CRD(0 | 1) | A(src) | 0)); + FAIL_IF(push_inst(compiler, BCx | (12 << 21) | (0 << 16) | 20)); + FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); + FAIL_IF(push_inst(compiler, Bx | ((op & SLJIT_32) ? 36 : 32))); + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, RLWINM | S(src) | A(TMP_REG2) | RLWI_SH(10) | RLWI_MBE(10, 21))); + else + FAIL_IF(push_inst(compiler, ANDI | S(src) | A(TMP_REG2) | 0x1)); + + /* Shift right. */ + FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(63) | RLDI_MB(1))); + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, RLDICR | S(TMP_REG1) | A(TMP_REG1) | RLDI_SH(0) | RLDI_ME(53))); + + FAIL_IF(push_inst(compiler, OR | S(TMP_REG1) | A(TMP_REG1) | B(TMP_REG2))); + + FAIL_IF(push_inst(compiler, STD | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); + FAIL_IF(push_inst(compiler, FADD | FD(dst_r) | FA(dst_r) | FB(dst_r))); + } + + if (op & SLJIT_32) + FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm != 0) + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + + FAIL_IF(push_inst(compiler, STD | S(u.imm != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_common.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_common.c old mode 100644 new mode 100755 index 81ba7d36b0..d40764826e --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_common.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativePPC_common.c @@ -132,7 +132,7 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { OE and Rc flag (see ALT_SET_FLAGS). */ #define OE(flags) ((flags) & ALT_SET_FLAGS) /* Rc flag (see ALT_SET_FLAGS). */ -#define RC(flags) (((flags) & ALT_SET_FLAGS) >> 10) +#define RC(flags) ((sljit_ins)((flags) & ALT_SET_FLAGS) >> 10) #define HI(opcode) ((sljit_ins)(opcode) << 26) #define LO(opcode) ((sljit_ins)(opcode) << 1) @@ -150,6 +150,9 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define BCx (HI(16)) #define BCCTR (HI(19) | LO(528) | (3 << 11)) #define BLR (HI(19) | LO(16) | (0x14 << 21)) +#if defined(_ARCH_PWR10) && _ARCH_PWR10 +#define BRD (HI(31) | LO(187)) +#endif /* POWER10 */ #define CNTLZD (HI(31) | LO(58)) #define CNTLZW (HI(31) | LO(26)) #define CMP (HI(31) | LO(0)) @@ -184,6 +187,10 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define LD (HI(58) | 0) #define LFD (HI(50)) #define LFS (HI(48)) +#if defined(_ARCH_PWR7) && _ARCH_PWR7 +#define LDBRX (HI(31) | LO(532)) +#endif /* POWER7 */ +#define LHBRX (HI(31) | LO(790)) #define LWBRX (HI(31) | LO(534)) #define LWZ (HI(32)) #define MFCR (HI(31) | LO(19)) @@ -221,11 +228,15 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define SRD (HI(31) | LO(539)) #define SRW (HI(31) | LO(536)) #define STD (HI(62) | 0) +#if defined(_ARCH_PWR7) && _ARCH_PWR7 +#define STDBRX (HI(31) | LO(660)) +#endif /* POWER7 */ #define STDU (HI(62) | 1) #define STDUX (HI(31) | LO(181)) #define STFD (HI(54)) #define STFIWX (HI(31) | LO(983)) #define STFS (HI(52)) +#define STHBRX (HI(31) | LO(918)) #define STW (HI(36)) #define STWBRX (HI(31) | LO(662)) #define STWU (HI(37)) @@ -264,11 +275,15 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #endif /* SLJIT_CONFIG_PPC_32 */ #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) -#define TMP_MEM_OFFSET_LOW TMP_MEM_OFFSET -#define TMP_MEM_OFFSET_HI (TMP_MEM_OFFSET + sizeof(sljit_s32)) +#define TMP_MEM_OFFSET_LO (TMP_MEM_OFFSET) +#define TMP_MEM_OFFSET_HI (TMP_MEM_OFFSET + sizeof(sljit_s32)) +#define LWBRX_FIRST_REG S(TMP_REG1) +#define LWBRX_SECOND_REG S(dst) #else /* !SLJIT_LITTLE_ENDIAN */ -#define TMP_MEM_OFFSET_LOW (TMP_MEM_OFFSET + sizeof(sljit_s32)) -#define TMP_MEM_OFFSET_HI TMP_MEM_OFFSET +#define TMP_MEM_OFFSET_LO (TMP_MEM_OFFSET + sizeof(sljit_s32)) +#define TMP_MEM_OFFSET_HI (TMP_MEM_OFFSET) +#define LWBRX_FIRST_REG S(dst) +#define LWBRX_SECOND_REG S(TMP_REG1) #endif /* SLJIT_LITTLE_ENDIAN */ #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) @@ -295,24 +310,23 @@ static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) return SLJIT_SUCCESS; } -static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) { sljit_sw diff; sljit_uw target_addr; - sljit_uw extra_jump_flags; #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL)) - return 0; + goto exit; #else if (jump->flags & SLJIT_REWRITABLE_JUMP) - return 0; + goto exit; #endif if (jump->flags & JUMP_ADDR) target_addr = jump->u.target; else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(jump->u.label != NULL); target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; } @@ -321,99 +335,254 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_in goto keep_address; #endif - diff = ((sljit_sw)target_addr - (sljit_sw)(code_ptr) - executable_offset) & ~0x3l; + diff = (sljit_sw)target_addr - (sljit_sw)code_ptr - executable_offset; - extra_jump_flags = 0; if (jump->flags & IS_COND) { if (diff <= 0x7fff && diff >= -0x8000) { jump->flags |= PATCH_B; - return 1; + return code_ptr; } if (target_addr <= 0xffff) { jump->flags |= PATCH_B | PATCH_ABS_B; - return 1; + return code_ptr; } - extra_jump_flags = REMOVE_COND; diff -= SSIZE_OF(ins); } if (diff <= 0x01ffffff && diff >= -0x02000000) { - jump->flags |= PATCH_B | extra_jump_flags; - return 1; + jump->flags |= PATCH_B; + } else if (target_addr <= 0x01ffffff) { + jump->flags |= PATCH_B | PATCH_ABS_B; } - if (target_addr <= 0x03ffffff) { - jump->flags |= PATCH_B | PATCH_ABS_B | extra_jump_flags; - return 1; + if (jump->flags & PATCH_B) { + if (!(jump->flags & IS_COND)) + return code_ptr; + + code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001); + code_ptr[1] = Bx; + jump->addr += sizeof(sljit_ins); + jump->flags -= IS_COND; + return code_ptr + 1; } #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) keep_address: -#endif - if (target_addr <= 0x7fffffff) { +#endif /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ + if (target_addr < 0x80000000l) { jump->flags |= PATCH_ABS32; - return 1; + code_ptr[2] = MTCTR | S(TMP_CALL_REG); + code_ptr[3] = code_ptr[0]; + return code_ptr + 3; } - if (target_addr <= 0x7fffffffffffl) { + if (target_addr < 0x800000000000l) { jump->flags |= PATCH_ABS48; - return 1; + code_ptr[4] = MTCTR | S(TMP_CALL_REG); + code_ptr[5] = code_ptr[0]; + return code_ptr + 5; } -#endif +#endif /* SLJIT_CONFIG_PPC_64 */ - return 0; +exit: +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + code_ptr[2] = MTCTR | S(TMP_CALL_REG); + code_ptr[3] = code_ptr[0]; +#else /* !SLJIT_CONFIG_PPC_32 */ + code_ptr[5] = MTCTR | S(TMP_CALL_REG); + code_ptr[6] = code_ptr[0]; +#endif /* SLJIT_CONFIG_PPC_32 */ + return code_ptr + JUMP_MAX_SIZE - 1; } #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) -static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_ins *code, sljit_sw executable_offset) { - if (max_label < 0x100000000l) { - put_label->flags = 0; + sljit_uw addr; + SLJIT_UNUSED_ARG(executable_offset); + + SLJIT_ASSERT(jump->flags < ((sljit_uw)5 << JUMP_SIZE_SHIFT)); + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + if (addr < 0x80000000l) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)1 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS32; return 1; } - if (max_label < 0x1000000000000l) { - put_label->flags = 1; + if (addr < 0x800000000000l) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)3 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS48; return 3; } - put_label->flags = 2; + SLJIT_ASSERT(jump->flags >= ((sljit_uw)4 << JUMP_SIZE_SHIFT)); return 4; } -static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label) +#endif /* SLJIT_CONFIG_PPC_64 */ + +static void generate_jump_or_mov_addr(struct sljit_jump *jump, sljit_sw executable_offset) { - sljit_uw addr = put_label->label->addr; - sljit_ins *inst = (sljit_ins *)put_label->addr; - sljit_u32 reg = *inst; + sljit_uw flags = jump->flags; + sljit_uw addr = (flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; + sljit_ins *ins = (sljit_ins*)jump->addr; + sljit_s32 reg; + SLJIT_UNUSED_ARG(executable_offset); - if (put_label->flags == 0) { - SLJIT_ASSERT(addr < 0x100000000l); - inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 16); - } - else { - if (put_label->flags == 1) { - SLJIT_ASSERT(addr < 0x1000000000000l); - inst[0] = ORI | S(TMP_ZERO) | A(reg) | IMM(addr >> 32); - } - else { - inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 48); - inst[1] = ORI | S(reg) | A(reg) | IMM((addr >> 32) & 0xffff); - inst++; + if (flags & PATCH_B) { + if (flags & IS_COND) { + if (!(flags & PATCH_ABS_B)) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset); + SLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000); + ins[0] = BCx | ((sljit_ins)addr & 0xfffc) | (ins[0] & 0x03ff0001); + } else { + SLJIT_ASSERT(addr <= 0xffff); + ins[0] = BCx | ((sljit_ins)addr & 0xfffc) | 0x2 | ((*ins) & 0x03ff0001); + } + return; } - inst[1] = SLDI(32) | S(reg) | A(reg); - inst[2] = ORIS | S(reg) | A(reg) | IMM((addr >> 16) & 0xffff); - inst += 2; + if (!(flags & PATCH_ABS_B)) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset); + SLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000); + ins[0] = Bx | ((sljit_ins)addr & 0x03fffffc) | (ins[0] & 0x1); + } else { + SLJIT_ASSERT(addr <= 0x03ffffff); + ins[0] = Bx | ((sljit_ins)addr & 0x03fffffc) | 0x2 | (ins[0] & 0x1); + } + return; } - inst[1] = ORI | S(reg) | A(reg) | IMM(addr & 0xffff); + reg = (flags & JUMP_MOV_ADDR) ? (sljit_s32)ins[0] : TMP_CALL_REG; + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + ins[0] = ADDIS | D(reg) | A(0) | IMM(addr >> 16); + ins[1] = ORI | S(reg) | A(reg) | IMM(addr); +#else /* !SLJIT_CONFIG_PPC_32 */ + + /* The TMP_ZERO cannot be used because it is restored for tail calls. */ + if (flags & PATCH_ABS32) { + SLJIT_ASSERT(addr < 0x80000000l); + ins[0] = ADDIS | D(reg) | A(0) | IMM(addr >> 16); + ins[1] = ORI | S(reg) | A(reg) | IMM(addr); + return; + } + + if (flags & PATCH_ABS48) { + SLJIT_ASSERT(addr < 0x800000000000l); + ins[0] = ADDIS | D(reg) | A(0) | IMM(addr >> 32); + ins[1] = ORI | S(reg) | A(reg) | IMM(addr >> 16); + ins[2] = SLDI(16) | S(reg) | A(reg); + ins[3] = ORI | S(reg) | A(reg) | IMM(addr); + return; + } + + ins[0] = ADDIS | D(reg) | A(0) | IMM(addr >> 48); + ins[1] = ORI | S(reg) | A(reg) | IMM(addr >> 32); + ins[2] = SLDI(32) | S(reg) | A(reg); + ins[3] = ORIS | S(reg) | A(reg) | IMM(addr >> 16); + ins[4] = ORI | S(reg) | A(reg) | IMM(addr); +#endif /* SLJIT_CONFIG_PPC_32 */ } +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + SLJIT_NEXT_DEFINE_TYPES; + sljit_uw total_size; + sljit_uw size_reduce = 0; + sljit_sw diff; + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + + while (1) { + SLJIT_GET_NEXT_MIN(); + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr == next_const_addr) { + const_->addr -= size_reduce; + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + continue; + } + + if (next_min_addr != next_jump_addr) + continue; + + jump->addr -= size_reduce; + if (!(jump->flags & JUMP_MOV_ADDR)) { + total_size = JUMP_MAX_SIZE - 1; + + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) { + if (jump->flags & JUMP_ADDR) { + if (jump->u.target <= 0x01ffffff) + total_size = 1 - 1; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + else if (jump->u.target < 0x80000000l) + total_size = 4 - 1; + else if (jump->u.target < 0x800000000000l) + total_size = 6 - 1; #endif /* SLJIT_CONFIG_PPC_64 */ + } else { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if (jump->flags & IS_COND) { + if (diff <= (0x7fff / SSIZE_OF(ins)) && diff >= (-0x8000 / SSIZE_OF(ins))) + total_size = 1 - 1; + else if ((diff - 1) <= (0x01ffffff / SSIZE_OF(ins)) && (diff - 1) >= (-0x02000000 / SSIZE_OF(ins))) + total_size = 2 - 1; + } else if (diff <= (0x01ffffff / SSIZE_OF(ins)) && diff >= (-0x02000000 / SSIZE_OF(ins))) + total_size = 1 - 1; + } + } + + size_reduce += (JUMP_MAX_SIZE - 1) - total_size; + jump->flags |= total_size << JUMP_SIZE_SHIFT; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + } else { + total_size = (sljit_uw)4 << JUMP_SIZE_SHIFT; + + if (jump->flags & JUMP_ADDR) { + if (jump->u.target < 0x80000000l) { + total_size = (sljit_uw)1 << JUMP_SIZE_SHIFT; + size_reduce += 3; + } else if (jump->u.target < 0x800000000000l) { + total_size = (sljit_uw)3 << JUMP_SIZE_SHIFT; + size_reduce += 1; + } + } + jump->flags |= total_size; +#endif /* SLJIT_CONFIG_PPC_64 */ + } + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; +} SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { @@ -423,20 +592,20 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; sljit_sw executable_offset; - sljit_uw addr; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); + + reduce_code_size(compiler); #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) + /* add to compiler->size additional instruction space to hold the trampoline and padding */ #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) compiler->size += (compiler->size & 0x1) + (sizeof(struct sljit_function_context) / sizeof(sljit_ins)); #else @@ -445,91 +614,64 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil #endif code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; code_ptr = code; word_count = 0; - next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - if (next_addr == word_count) { + if (next_min_addr == word_count) { SLJIT_ASSERT(!label || label->size >= word_count); SLJIT_ASSERT(!jump || jump->addr >= word_count); SLJIT_ASSERT(!const_ || const_->addr >= word_count); - SLJIT_ASSERT(!put_label || put_label->addr >= word_count); /* These structures are ordered by their address. */ - if (label && label->size == word_count) { + if (next_min_addr == next_label_size) { /* Just recording the address. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (jump && jump->addr == word_count) { -#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - jump->addr = (sljit_uw)(code_ptr - 3); -#else - jump->addr = (sljit_uw)(code_ptr - 6); -#endif - if (detect_jump_type(jump, code_ptr, code, executable_offset)) { -#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - code_ptr[-3] = code_ptr[0]; - code_ptr -= 3; -#else - if (jump->flags & PATCH_ABS32) { - code_ptr -= 3; - code_ptr[-1] = code_ptr[2]; - code_ptr[0] = code_ptr[3]; - } - else if (jump->flags & PATCH_ABS48) { - code_ptr--; - code_ptr[-1] = code_ptr[0]; - code_ptr[0] = code_ptr[1]; - /* rldicr rX,rX,32,31 -> rX,rX,16,47 */ - SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6); - code_ptr[-3] ^= 0x8422; - /* oris -> ori */ - code_ptr[-2] ^= 0x4000000; - } - else { - code_ptr[-6] = code_ptr[0]; - code_ptr -= 6; - } -#endif - if (jump->flags & REMOVE_COND) { - code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001); - code_ptr++; - jump->addr += sizeof(sljit_ins); - code_ptr[0] = Bx; - jump->flags -= IS_COND; - } + + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { + word_count += jump->flags >> JUMP_SIZE_SHIFT; + jump->addr = (sljit_uw)code_ptr; + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + SLJIT_ASSERT(((sljit_uw)code_ptr - jump->addr <= (jump->flags >> JUMP_SIZE_SHIFT) * sizeof(sljit_ins))); + } else { + jump->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + word_count += jump->flags >> JUMP_SIZE_SHIFT; + code_ptr += mov_addr_get_length(jump, code, executable_offset); +#else /* !SLJIT_CONFIG_PPC_64 */ + word_count++; + code_ptr++; +#endif /* SLJIT_CONFIG_PPC_64 */ } jump = jump->next; - } - if (const_ && const_->addr == word_count) { + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == word_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; -#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); - word_count += 4; -#endif - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; word_count++; @@ -539,7 +681,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } while (buf); if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; } @@ -547,7 +689,6 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) SLJIT_ASSERT(code_ptr - code <= (sljit_sw)(compiler->size - (sizeof(struct sljit_function_context) / sizeof(sljit_ins)))); @@ -557,87 +698,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = compiler->jumps; while (jump) { - do { - addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; - buf_ptr = (sljit_ins *)jump->addr; - - if (jump->flags & PATCH_B) { - if (jump->flags & IS_COND) { - if (!(jump->flags & PATCH_ABS_B)) { - addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); - SLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000); - *buf_ptr = BCx | ((sljit_ins)addr & 0xfffc) | ((*buf_ptr) & 0x03ff0001); - } - else { - SLJIT_ASSERT(addr <= 0xffff); - *buf_ptr = BCx | ((sljit_ins)addr & 0xfffc) | 0x2 | ((*buf_ptr) & 0x03ff0001); - } - } - else { - if (!(jump->flags & PATCH_ABS_B)) { - addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); - SLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000); - *buf_ptr = Bx | ((sljit_ins)addr & 0x03fffffc) | ((*buf_ptr) & 0x1); - } - else { - SLJIT_ASSERT(addr <= 0x03ffffff); - *buf_ptr = Bx | ((sljit_ins)addr & 0x03fffffc) | 0x2 | ((*buf_ptr) & 0x1); - } - } - break; - } - - /* Set the fields of immediate loads. */ -#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - SLJIT_ASSERT(((buf_ptr[0] | buf_ptr[1]) & 0xffff) == 0); - buf_ptr[0] |= (sljit_ins)(addr >> 16) & 0xffff; - buf_ptr[1] |= (sljit_ins)addr & 0xffff; -#else - if (jump->flags & PATCH_ABS32) { - SLJIT_ASSERT(addr <= 0x7fffffff); - SLJIT_ASSERT(((buf_ptr[0] | buf_ptr[1]) & 0xffff) == 0); - buf_ptr[0] |= (sljit_ins)(addr >> 16) & 0xffff; - buf_ptr[1] |= (sljit_ins)addr & 0xffff; - break; - } - - if (jump->flags & PATCH_ABS48) { - SLJIT_ASSERT(addr <= 0x7fffffffffff); - SLJIT_ASSERT(((buf_ptr[0] | buf_ptr[1] | buf_ptr[3]) & 0xffff) == 0); - buf_ptr[0] |= (sljit_ins)(addr >> 32) & 0xffff; - buf_ptr[1] |= (sljit_ins)(addr >> 16) & 0xffff; - buf_ptr[3] |= (sljit_ins)addr & 0xffff; - break; - } - - SLJIT_ASSERT(((buf_ptr[0] | buf_ptr[1] | buf_ptr[3] | buf_ptr[4]) & 0xffff) == 0); - buf_ptr[0] |= (sljit_ins)(addr >> 48) & 0xffff; - buf_ptr[1] |= (sljit_ins)(addr >> 32) & 0xffff; - buf_ptr[3] |= (sljit_ins)(addr >> 16) & 0xffff; - buf_ptr[4] |= (sljit_ins)addr & 0xffff; -#endif - } while (0); + generate_jump_or_mov_addr(jump, executable_offset); jump = jump->next; } - put_label = compiler->put_labels; - while (put_label) { -#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - addr = put_label->label->addr; - buf_ptr = (sljit_ins *)put_label->addr; - - SLJIT_ASSERT((buf_ptr[0] & 0xfc1f0000) == ADDIS && (buf_ptr[1] & 0xfc000000) == ORI); - buf_ptr[0] |= (addr >> 16) & 0xffff; - buf_ptr[1] |= addr & 0xffff; -#else - put_label_set(put_label); -#endif - put_label = put_label->next; - } - compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; - compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins); code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); @@ -655,8 +721,10 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1); #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) + compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins) + sizeof(struct sljit_function_context); return code_ptr; #else + compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins); return code; #endif } @@ -666,12 +734,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) switch (feature_type) { case SLJIT_HAS_FPU: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #else /* Available by default. */ return 1; #endif - + case SLJIT_HAS_REV: +#if defined(_ARCH_PWR10) && _ARCH_PWR10 + return 1; +#else /* !POWER10 */ + return 2; +#endif /* POWER10 */ /* A saved register is set to a zero value. */ case SLJIT_HAS_ZERO_REGISTER: case SLJIT_HAS_CLZ: @@ -680,7 +753,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) return 1; case SLJIT_HAS_CTZ: - case SLJIT_HAS_REV: return 2; default: @@ -690,7 +762,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - return (type >= SLJIT_UNORDERED && type <= SLJIT_ORDERED_LESS_EQUAL); + switch (type) { + case SLJIT_UNORDERED_OR_EQUAL: + case SLJIT_ORDERED_NOT_EQUAL: + case SLJIT_UNORDERED_OR_LESS: + case SLJIT_ORDERED_GREATER_EQUAL: + case SLJIT_UNORDERED_OR_GREATER: + case SLJIT_ORDERED_LESS_EQUAL: + return 1; + } + + return 0; } /* --------------------------------------------------------------------- */ @@ -714,6 +796,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) #define MEM_MASK 0x7f +#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 6)) + /* Other inp_flags. */ /* Integer opertion and set flags -> requires exts on 64 bit systems. */ @@ -737,6 +821,9 @@ ALT_FORM1 0x001000 ... ALT_FORM5 0x010000 */ +static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, + sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg); + #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) #include "sljitNativePPC_32.c" #else @@ -759,9 +846,6 @@ ALT_FORM5 0x010000 */ #define STACK_MAX_DISTANCE (0x8000 - SSIZE_OF(sw) - LR_SAVE_OFFSET) -static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, - sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg); - SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) @@ -1237,7 +1321,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 src1_r = src1; flags |= REG1_SOURCE; } - else if (src1 & SLJIT_IMM) { + else if (src1 == SLJIT_IMM) { src1_r = TMP_ZERO; if (src1w != 0) { FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); @@ -1257,7 +1341,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P) dst_r = src2_r; } - else if (src2 & SLJIT_IMM) { + else if (src2 == SLJIT_IMM) { src2_r = TMP_ZERO; if (src2w != 0) { FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w)); @@ -1327,30 +1411,58 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile return SLJIT_SUCCESS; } -static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op_flags, +static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_s32 mem, offs_reg, inp_flags; sljit_sw memw; - SLJIT_UNUSED_ARG(op_flags); +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + sljit_s32 is_32 = op & SLJIT_32; + + op = GET_OPCODE(op); +#endif /* SLJIT_CONFIG_PPC_64 */ if (!((dst | src) & SLJIT_MEM)) { /* Both are registers. */ + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) { + if (src == dst) { + FAIL_IF(push_inst(compiler, RLWIMI | S(dst) | A(dst) | RLWI_SH(16) | RLWI_MBE(8, 15))); + FAIL_IF(push_inst(compiler, RLWINM | S(dst) | A(dst) | RLWI_SH(24) | RLWI_MBE(16, 31))); + } else { + FAIL_IF(push_inst(compiler, RLWINM | S(src) | A(dst) | RLWI_SH(8) | RLWI_MBE(16, 23))); + FAIL_IF(push_inst(compiler, RLWIMI | S(src) | A(dst) | RLWI_SH(24) | RLWI_MBE(24, 31))); + } + + if (op == SLJIT_REV_U16) + return SLJIT_SUCCESS; + return push_inst(compiler, EXTSH | S(dst) | A(dst)); + } + #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - if (!(op_flags & SLJIT_32)) { + if (!is_32) { +#if defined(_ARCH_PWR10) && _ARCH_PWR10 + return push_inst(compiler, BRD | S(src) | A(dst)); +#else /* !POWER10 */ FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET_HI))); FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32))); FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(SLJIT_SP) | B(TMP_REG2))); - FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET_LOW))); + FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET_LO))); FAIL_IF(push_inst(compiler, STWBRX | S(TMP_REG1) | A(SLJIT_SP) | B(TMP_REG2))); return push_inst(compiler, LD | D(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET); +#endif /* POWER10 */ } #endif /* SLJIT_CONFIG_PPC_64 */ FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET))); FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(SLJIT_SP) | B(TMP_REG2))); - return push_inst(compiler, LWZ | D(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET); + FAIL_IF(push_inst(compiler, LWZ | D(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op == SLJIT_REV_S32) + return push_inst(compiler, EXTSW | S(dst) | A(dst)); +#endif /* SLJIT_CONFIG_PPC_64 */ + return SLJIT_SUCCESS; } mem = src; @@ -1361,11 +1473,16 @@ static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op_flags, memw = dstw; if (src & SLJIT_MEM) { + inp_flags = HALF_DATA | LOAD_DATA; + + if (op != SLJIT_REV_U16 && op != SLJIT_REV_S16) { #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - inp_flags = ((op_flags & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; + inp_flags = (is_32 ? INT_DATA : WORD_DATA) | LOAD_DATA; #else /* !SLJIT_CONFIG_PPC_64 */ - inp_flags = WORD_DATA | LOAD_DATA; + inp_flags = WORD_DATA | LOAD_DATA; #endif /* SLJIT_CONFIG_PPC_64 */ + } + FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG1, src, srcw, TMP_REG2)); src = TMP_REG1; } @@ -1395,30 +1512,60 @@ static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op_flags, offs_reg = TMP_REG2; } + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) { + if (dst & SLJIT_MEM) + return push_inst(compiler, STHBRX | S(src) | A(mem) | B(offs_reg)); + + FAIL_IF(push_inst(compiler, LHBRX | S(dst) | A(mem) | B(offs_reg))); + + if (op == SLJIT_REV_U16) + return SLJIT_SUCCESS; + return push_inst(compiler, EXTSH | S(dst) | A(dst)); + } + #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - if (!(op_flags & SLJIT_32)) { + if (!is_32) { if (dst & SLJIT_MEM) { +#if defined(_ARCH_PWR7) && _ARCH_PWR7 + return push_inst(compiler, STDBRX | S(src) | A(mem) | B(offs_reg)); +#else /* !POWER7 */ +#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN + FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32))); + FAIL_IF(push_inst(compiler, STWBRX | S(TMP_REG1) | A(mem) | B(offs_reg))); + FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32)))); + return push_inst(compiler, STWBRX | S(src) | A(mem) | B(TMP_REG2)); +#else /* !SLJIT_LITTLE_ENDIAN */ FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(mem) | B(offs_reg))); FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32))); FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32)))); return push_inst(compiler, STWBRX | S(TMP_REG1) | A(mem) | B(TMP_REG2)); +#endif /* SLJIT_LITTLE_ENDIAN */ +#endif /* POWER7 */ } - - FAIL_IF(push_inst(compiler, LWBRX | S(dst) | A(mem) | B(offs_reg))); +#if defined(_ARCH_PWR7) && _ARCH_PWR7 + return push_inst(compiler, LDBRX | S(dst) | A(mem) | B(offs_reg)); +#else /* !POWER7 */ + FAIL_IF(push_inst(compiler, LWBRX | LWBRX_FIRST_REG | A(mem) | B(offs_reg))); FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32)))); - FAIL_IF(push_inst(compiler, LWBRX | S(TMP_REG1) | A(mem) | B(TMP_REG2))); + FAIL_IF(push_inst(compiler, LWBRX | LWBRX_SECOND_REG | A(mem) | B(TMP_REG2))); return push_inst(compiler, RLDIMI | S(TMP_REG1) | A(dst) | RLDI_SH(32) | RLDI_MB(0)); +#endif /* POWER7 */ } #endif /* SLJIT_CONFIG_PPC_64 */ if (dst & SLJIT_MEM) return push_inst(compiler, STWBRX | S(src) | A(mem) | B(offs_reg)); - return push_inst(compiler, LWBRX | S(dst) | A(mem) | B(offs_reg)); + FAIL_IF(push_inst(compiler, LWBRX | S(dst) | A(mem) | B(offs_reg))); +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op == SLJIT_REV_S32) + return push_inst(compiler, EXTSW | S(dst) | A(dst)); +#endif /* SLJIT_CONFIG_PPC_64 */ + return SLJIT_SUCCESS; } #define EMIT_MOV(type, type_flags, type_cast) \ - emit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw) + emit_op(compiler, (src == SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? type_cast srcw : srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, @@ -1449,7 +1596,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile if (op == SLJIT_MOV_S32) op = SLJIT_MOV_U32; } - else if (src & SLJIT_IMM) { + else if (src == SLJIT_IMM) { if (op == SLJIT_MOV_U32) op = SLJIT_MOV_S32; } @@ -1497,12 +1644,23 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile case SLJIT_CLZ: case SLJIT_CTZ: #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - return emit_op(compiler, op, flags | (!(op_flags & SLJIT_32) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw); -#else + if (op_flags & SLJIT_32) + flags |= ALT_FORM1; +#endif /* SLJIT_CONFIG_PPC_64 */ return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); -#endif + case SLJIT_REV_U32: + case SLJIT_REV_S32: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + op |= SLJIT_32; +#endif /* SLJIT_CONFIG_PPC_64 */ + /* fallthrough */ case SLJIT_REV: - return emit_rev(compiler, op_flags, dst, dstw, src, srcw); + case SLJIT_REV_U16: + case SLJIT_REV_S16: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + op |= (op_flags & SLJIT_32); +#endif /* SLJIT_CONFIG_PPC_64 */ + return emit_rev(compiler, op, dst, dstw, src, srcw); } return SLJIT_SUCCESS; @@ -1510,40 +1668,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #undef EMIT_MOV +/* Macros for checking different operand types / values. */ #define TEST_SL_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN) - + ((src) == SLJIT_IMM && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN) #define TEST_UL_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && !((srcw) & ~0xffff)) - -#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) -#define TEST_SH_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l) -#else -#define TEST_SH_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && !((srcw) & 0xffff)) -#endif - + ((src) == SLJIT_IMM && !((srcw) & ~0xffff)) #define TEST_UH_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && !((srcw) & ~(sljit_sw)0xffff0000)) + ((src) == SLJIT_IMM && !((srcw) & ~(sljit_sw)0xffff0000)) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_SH_IMM(src, srcw) \ + ((src) == SLJIT_IMM && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l) #define TEST_ADD_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l) -#else -#define TEST_ADD_IMM(src, srcw) \ - ((src) & SLJIT_IMM) -#endif - -#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + ((src) == SLJIT_IMM && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l) #define TEST_UI_IMM(src, srcw) \ - (((src) & SLJIT_IMM) && !((srcw) & ~0xffffffff)) -#else -#define TEST_UI_IMM(src, srcw) \ - ((src) & SLJIT_IMM) -#endif + ((src) == SLJIT_IMM && !((srcw) & ~0xffffffff)) -#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #define TEST_ADD_FORM1(op) \ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ || (op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_32 | SLJIT_SET_Z | SLJIT_SET_CARRY)) @@ -1553,14 +1693,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #define TEST_SUB_FORM3(op) \ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \ || (op & (SLJIT_32 | SLJIT_SET_Z)) == (SLJIT_32 | SLJIT_SET_Z)) -#else + +#else /* !SLJIT_CONFIG_PPC_64 */ +#define TEST_SH_IMM(src, srcw) \ + ((src) == SLJIT_IMM && !((srcw) & 0xffff)) +#define TEST_ADD_IMM(src, srcw) \ + ((src) == SLJIT_IMM) +#define TEST_UI_IMM(src, srcw) \ + ((src) == SLJIT_IMM) + #define TEST_ADD_FORM1(op) \ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) #define TEST_SUB_FORM2(op) \ (GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) #define TEST_SUB_FORM3(op) \ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) -#endif +#endif /* SLJIT_CONFIG_PPC_64 */ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, @@ -1579,9 +1727,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile if (op & SLJIT_32) { /* Most operations expect sign extended arguments. */ flags |= INT_DATA | SIGNED_DATA; - if (src1 & SLJIT_IMM) + if (src1 == SLJIT_IMM) src1w = (sljit_s32)(src1w); - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) src2w = (sljit_s32)(src2w); if (HAS_FLAGS(op)) flags |= ALT_SIGN_EXT; @@ -1597,7 +1745,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile if (TEST_ADD_FORM1(op)) return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); - if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { + if (!HAS_FLAGS(op) && (src1 == SLJIT_IMM || src2 == SLJIT_IMM)) { if (TEST_SL_IMM(src2, src2w)) { compiler->imm = (sljit_ins)src2w & 0xffff; return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); @@ -1666,7 +1814,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); } - if ((src2 & SLJIT_IMM) && src2w >= 0 && src2w <= (SIMM_MAX + 1)) { + if (src2 == SLJIT_IMM && src2w >= 0 && src2w <= (SIMM_MAX + 1)) { compiler->imm = (sljit_ins)src2w; return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); } @@ -1682,7 +1830,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile } if (TEST_SUB_FORM2(op)) { - if ((src2 & SLJIT_IMM) && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) { + if (src2 == SLJIT_IMM && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) { compiler->imm = (sljit_ins)src2w & 0xffff; return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); } @@ -1741,10 +1889,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_op(compiler, SLJIT_MUL, flags, dst, dstw, src1, src1w, src2, src2w); case SLJIT_XOR: - if ((src2 & SLJIT_IMM) && src2w == -1) { + if (src2 == SLJIT_IMM && src2w == -1) { return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM4, dst, dstw, TMP_REG1, 0, src1, src1w); } - if ((src1 & SLJIT_IMM) && src1w == -1) { + if (src1 == SLJIT_IMM && src1w == -1) { return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM4, dst, dstw, TMP_REG1, 0, src2, src2w); } /* fallthrough */ @@ -1794,7 +1942,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile if (op & SLJIT_32) flags |= ALT_FORM2; #endif - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { compiler->imm = (sljit_ins)src2w; return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0); } @@ -1846,7 +1994,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= bit_length - 1; if (src3w == 0) @@ -1985,21 +2133,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type != SLJIT_FLOAT_REGISTER) + return -1; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); return freg_map[reg]; } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_u32 size) { + SLJIT_UNUSED_ARG(size); + CHECK_ERROR(); CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); @@ -2010,7 +2161,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c /* Floating point operators */ /* --------------------------------------------------------------------- */ -#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 6)) #define SELECT_FOP(op, single, double) ((sljit_ins)((op & SLJIT_32) ? single : double)) static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, @@ -2068,83 +2218,6 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp return push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw)); } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, - sljit_s32 dst, sljit_sw dstw, - sljit_s32 src, sljit_sw srcw) -{ -#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) - - sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - - if (src & SLJIT_IMM) { - if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - srcw = (sljit_s32)srcw; - - FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); - src = TMP_REG1; - } else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) { - if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1))); - else - FAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); - src = TMP_REG1; - } - - if (FAST_IS_REG(src)) { - FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET)); - FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); - } else - FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1)); - - FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); - - if (dst & SLJIT_MEM) - return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); - - if (op & SLJIT_32) - return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); - return SLJIT_SUCCESS; - -#else /* !SLJIT_CONFIG_PPC_64 */ - - sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - sljit_s32 invert_sign = 1; - - if (src & SLJIT_IMM) { - FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ (sljit_sw)0x80000000)); - src = TMP_REG1; - invert_sign = 0; - } else if (!FAST_IS_REG(src)) { - FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); - src = TMP_REG1; - } - - /* First, a special double floating point value is constructed: (2^53 + (input xor (2^31))) - The double precision format has exactly 53 bit precision, so the lower 32 bit represents - the lower 32 bit of such value. The result of xor 2^31 is the same as adding 0x80000000 - to the input, which shifts it into the 0 - 0xffffffff range. To get the converted floating - point value, we need to subtract 2^53 + 2^31 from the constructed value. */ - FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330)); - if (invert_sign) - FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000)); - FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI)); - FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LOW)); - FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000)); - FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); - FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LOW)); - FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET)); - - FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2))); - - if (dst & SLJIT_MEM) - return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); - if (op & SLJIT_32) - return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); - return SLJIT_SUCCESS; - -#endif /* SLJIT_CONFIG_PPC_64 */ -} - static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) @@ -2252,18 +2325,30 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil case SLJIT_ADD_F64: FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2))); break; - case SLJIT_SUB_F64: FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2))); break; - case SLJIT_MUL_F64: FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */)); break; - case SLJIT_DIV_F64: FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2))); break; + case SLJIT_COPYSIGN_F64: + FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? STFS : STFD) | FS(src2) | A(SLJIT_SP) | TMP_MEM_OFFSET)); +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + FAIL_IF(push_inst(compiler, LWZ | S(TMP_REG1) | A(SLJIT_SP) | ((op & SLJIT_32) ? TMP_MEM_OFFSET : TMP_MEM_OFFSET_HI))); +#else /* !SLJIT_CONFIG_PPC_32 */ + FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? LWZ : LD) | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET)); +#endif /* SLJIT_CONFIG_PPC_32 */ + FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src1))); +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(TMP_REG1) | 0)); +#else /* !SLJIT_CONFIG_PPC_32 */ + FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((op & SLJIT_32) ? 0 : 1)) | A(TMP_REG1) | 0)); +#endif /* SLJIT_CONFIG_PPC_32 */ + FAIL_IF(push_inst(compiler, BCx | (4 << 21) | (0 << 16) | 8)); + return push_inst(compiler, FNEG | FD(dst_r) | FB(dst_r)); } if (dst & SLJIT_MEM) @@ -2274,6 +2359,26 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil #undef SELECT_FOP +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm != 0) + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm)); + + FAIL_IF(push_inst(compiler, STW | S(u.imm != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET)); + return push_inst(compiler, LFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET); +} + /* --------------------------------------------------------------------- */ /* Conditional instructions */ /* --------------------------------------------------------------------- */ @@ -2394,7 +2499,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile set_jump(jump, compiler, (sljit_u32)type & SLJIT_REWRITABLE_JUMP); type &= 0xff; - if (type == SLJIT_CARRY || type == SLJIT_NOT_CARRY) + if ((type | 0x1) == SLJIT_NOT_CARRY) PTR_FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO))); /* In PPC, we don't need to touch the arguments. */ @@ -2405,16 +2510,19 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile jump->flags |= IS_CALL; #endif - PTR_FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0)); - PTR_FAIL_IF(push_inst(compiler, MTCTR | S(TMP_CALL_REG))); jump->addr = compiler->size; PTR_FAIL_IF(push_inst(compiler, BCCTR | bo_bi_flags | (type >= SLJIT_FAST_CALL ? 1 : 0))); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; return jump; } SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types) { + SLJIT_UNUSED_ARG(arg_types); + CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); @@ -2440,18 +2548,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi CHECK_ERROR(); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); - if (FAST_IS_REG(src)) { -#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) - if (type >= SLJIT_CALL && src != TMP_CALL_REG) { - FAIL_IF(push_inst(compiler, OR | S(src) | A(TMP_CALL_REG) | B(src))); - src_r = TMP_CALL_REG; - } - else - src_r = src; -#else /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ - src_r = src; -#endif /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ - } else if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { /* These jumps are converted to jump/call instructions when possible. */ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); FAIL_IF(!jump); @@ -2463,8 +2560,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi jump->flags |= IS_CALL; #endif /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ - FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0)); - src_r = TMP_CALL_REG; + jump->addr = compiler->size; + FAIL_IF(push_inst(compiler, BCCTR | (20 << 21) | (type >= SLJIT_FAST_CALL ? 1 : 0))); + + /* Maximum number of instructions required for generating a constant. */ + compiler->size += JUMP_MAX_SIZE - 1; + return SLJIT_SUCCESS; + } + + if (FAST_IS_REG(src)) { +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) + if (type >= SLJIT_CALL && src != TMP_CALL_REG) { + FAIL_IF(push_inst(compiler, OR | S(src) | A(TMP_CALL_REG) | B(src))); + src_r = TMP_CALL_REG; + } else + src_r = src; +#else /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ + src_r = src; +#endif /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */ } else { ADJUST_LOCAL_OFFSET(src, srcw); FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_CALL_REG, src, srcw, TMP_CALL_REG)); @@ -2472,8 +2585,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi } FAIL_IF(push_inst(compiler, MTCTR | S(src_r))); - if (jump) - jump->addr = compiler->size; return push_inst(compiler, BCCTR | (20 << 21) | (type >= SLJIT_FAST_CALL ? 1 : 0)); } @@ -2481,6 +2592,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi sljit_s32 arg_types, sljit_s32 src, sljit_sw srcw) { + SLJIT_UNUSED_ARG(arg_types); + CHECK_ERROR(); CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); @@ -2663,14 +2776,106 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return sljit_emit_op2(compiler, saved_op, dst, 0, dst, 0, TMP_REG2, 0); } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { - CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + sljit_ins *ptr; + sljit_uw size; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; +#else /* !SLJIT_CONFIG_PPC_64 */ + sljit_s32 inp_flags = WORD_DATA | LOAD_DATA; +#endif /* SLJIT_CONFIG_PPC_64 */ - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);; + CHECK_ERROR(); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + FAIL_IF(push_inst(compiler, OR | S(dst_reg) | A(TMP_REG2) | B(dst_reg))); + + if ((src1 & REG_MASK) == dst_reg) + src1 = (src1 & ~REG_MASK) | TMP_REG2; + + if (OFFS_REG(src1) == dst_reg) + src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2); + } + + FAIL_IF(push_inst(compiler, OR | S(src2_reg) | A(dst_reg) | B(src2_reg))); + } + } + + if (((type & ~SLJIT_32) | 0x1) == SLJIT_NOT_CARRY) + FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO))); + + size = compiler->size; + + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + compiler->size++; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w, TMP_REG1)); + } else if (src1 == SLJIT_IMM) { +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + if (type & SLJIT_32) + src1w = (sljit_s32)src1w; +#endif /* SLJIT_CONFIG_RISCV_64 */ + FAIL_IF(load_immediate(compiler, dst_reg, src1w)); + } else + FAIL_IF(push_inst(compiler, OR | S(src1) | A(dst_reg) | B(src1))); + + *ptr = BCx | get_bo_bi_flags(compiler, (type ^ 0x1) & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 2); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_ins *ptr; + sljit_uw size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, FMR | FD(dst_freg) | FB(src2_freg))); + } + + if (((type & ~SLJIT_32) | 0x1) == SLJIT_NOT_CARRY) + FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO))); + + size = compiler->size; + + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + compiler->size++; + + if (src1 & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, dst_freg, src1, src1w, TMP_REG1)); + else + FAIL_IF(push_inst(compiler, FMR | FD(dst_freg) | FB(src1))); + + *ptr = BCx | get_bo_bi_flags(compiler, (type ^ 0x1) & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 2); + return SLJIT_SUCCESS; } #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) @@ -2909,31 +3114,31 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; -#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); -#else PTR_FAIL_IF(push_inst(compiler, (sljit_ins)dst_r)); +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + compiler->size++; +#else compiler->size += 4; #endif if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); - return put_label; + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_32.c old mode 100644 new mode 100755 index 4490be2aaf..396c956c19 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_32.c @@ -27,7 +27,6 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r, sljit_sw imm, sljit_s32 tmp_r) { SLJIT_UNUSED_ARG(tmp_r); - SLJIT_ASSERT(dst_r != tmp_r); if (imm <= SIMM_MAX && imm >= SIMM_MIN) return push_inst(compiler, ADDI | RD(dst_r) | RS1(TMP_ZERO) | IMM_I(imm)); @@ -43,6 +42,31 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r return push_inst(compiler, ADDI | RD(dst_r) | RS1(dst_r) | IMM_I(imm)); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_s32 imm[2]; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm[0] != 0) + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0], TMP_REG3)); + if (u.imm[1] != 0) + FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1], TMP_REG3)); + + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(-16))); + FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(u.imm[0] != 0 ? TMP_REG1 : TMP_ZERO) | (8 << 7))); + FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(u.imm[1] != 0 ? TMP_REG2 : TMP_ZERO) | (12 << 7))); + FAIL_IF(push_inst(compiler, FLD | FRD(freg) | RS1(SLJIT_SP) | IMM_I(8))); + return push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(16)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_64.c old mode 100644 new mode 100755 index f93d6ff667..7fcf2c5273 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_64.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_64.c @@ -28,8 +28,6 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r { sljit_sw high; - SLJIT_ASSERT(dst_r != tmp_r); - if (imm <= SIMM_MAX && imm >= SIMM_MIN) return push_inst(compiler, ADDI | RD(dst_r) | RS1(TMP_ZERO) | IMM_I(imm)); @@ -81,6 +79,8 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r return SLJIT_SUCCESS; } + SLJIT_ASSERT(dst_r != tmp_r); + high = imm >> 32; imm = (sljit_s32)imm; @@ -126,6 +126,26 @@ static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r return push_inst(compiler, XOR | RD(dst_r) | RS1(dst_r) | RS2(tmp_r)); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, FMV_W_X | (1 << 25) | RS1(TMP_ZERO) | FRD(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm, TMP_REG3)); + return push_inst(compiler, FMV_W_X | (1 << 25) | RS1(TMP_REG1) | FRD(freg)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_common.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_common.c old mode 100644 new mode 100755 index 473e06040a..a0996276a3 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_common.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeRISCV_common.c @@ -100,6 +100,7 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { /* These conversion opcodes are partly defined. */ #define FCVT_S_D (F7(0x20) | OPC(0x53)) #define FCVT_S_W (F7(0x68) | OPC(0x53)) +#define FCVT_S_WU (F7(0x68) | F12(0x1) | OPC(0x53)) #define FCVT_W_S (F7(0x60) | F3(0x1) | OPC(0x53)) #define FMUL_S (F7(0x8) | F3(0x7) | OPC(0x53)) #define FMV_X_W (F7(0x70) | F3(0x0) | OPC(0x53)) @@ -180,24 +181,23 @@ static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_i if (jump->flags & JUMP_ADDR) target_addr = jump->u.target; else { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(jump->u.label != NULL); target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; } diff = (sljit_sw)target_addr - (sljit_sw)inst - executable_offset; if (jump->flags & IS_COND) { - inst--; diff += SSIZE_OF(ins); if (diff >= BRANCH_MIN && diff <= BRANCH_MAX) { - jump->flags |= PATCH_B; + inst--; inst[0] = (inst[0] & 0x1fff07f) ^ 0x1000; + jump->flags |= PATCH_B; jump->addr = (sljit_uw)inst; return inst; } - inst++; diff -= SSIZE_OF(ins); } @@ -264,113 +264,236 @@ exit: #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) -static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +static SLJIT_INLINE sljit_sw mov_addr_get_length(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) { - if (max_label <= (sljit_uw)S32_MAX) { - put_label->flags = PATCH_ABS32; + sljit_uw addr; + sljit_sw diff; + SLJIT_UNUSED_ARG(executable_offset); + + SLJIT_ASSERT(jump->flags < ((sljit_uw)6 << JUMP_SIZE_SHIFT)); + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset); + + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + if (diff >= S32_MIN && diff <= S32_MAX) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)1 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_REL32; return 1; } - if (max_label <= S44_MAX) { - put_label->flags = PATCH_ABS44; + if (addr <= S32_MAX) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)1 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS32; + return 1; + } + + if (addr <= S44_MAX) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)3 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS44; return 3; } - if (max_label <= S52_MAX) { - put_label->flags = PATCH_ABS52; + if (addr <= S52_MAX) { + SLJIT_ASSERT(jump->flags >= ((sljit_uw)4 << JUMP_SIZE_SHIFT)); + jump->flags |= PATCH_ABS52; return 4; } - put_label->flags = 0; + SLJIT_ASSERT(jump->flags >= ((sljit_uw)5 << JUMP_SIZE_SHIFT)); return 5; } #endif /* SLJIT_CONFIG_RISCV_64 */ -static SLJIT_INLINE void load_addr_to_reg(void *dst, sljit_u32 reg) +static SLJIT_INLINE void load_addr_to_reg(struct sljit_jump *jump, sljit_sw executable_offset) { - struct sljit_jump *jump = NULL; - struct sljit_put_label *put_label; - sljit_uw flags; - sljit_ins *inst; + sljit_uw flags = jump->flags; + sljit_uw addr = (flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; + sljit_ins *ins = (sljit_ins*)jump->addr; + sljit_u32 reg = (flags & JUMP_MOV_ADDR) ? *ins : TMP_REG1; #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) sljit_sw high; #endif - sljit_uw addr; + SLJIT_UNUSED_ARG(executable_offset); - if (reg != 0) { - jump = (struct sljit_jump*)dst; - flags = jump->flags; - inst = (sljit_ins*)jump->addr; - addr = (flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; - } else { - put_label = (struct sljit_put_label*)dst; #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - flags = put_label->flags; -#endif - inst = (sljit_ins*)put_label->addr; - addr = put_label->label->addr; - reg = *inst; + if (flags & PATCH_REL32) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset); + + SLJIT_ASSERT((sljit_sw)addr >= S32_MIN && (sljit_sw)addr <= S32_MAX); + + if ((addr & 0x800) != 0) + addr += 0x1000; + + ins[0] = AUIPC | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); + + if (!(flags & JUMP_MOV_ADDR)) { + SLJIT_ASSERT((ins[1] & 0x707f) == JALR); + ins[1] = (ins[1] & 0xfffff) | IMM_I(addr); + } else + ins[1] = ADDI | RD(reg) | RS1(reg) | IMM_I(addr); + return; } +#endif if ((addr & 0x800) != 0) addr += 0x1000; #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - inst[0] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); + ins[0] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); #else /* !SLJIT_CONFIG_RISCV_32 */ if (flags & PATCH_ABS32) { SLJIT_ASSERT(addr <= S32_MAX); - inst[0] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); + ins[0] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); } else if (flags & PATCH_ABS44) { high = (sljit_sw)addr >> 12; SLJIT_ASSERT((sljit_uw)high <= 0x7fffffff); if (high > S32_MAX) { SLJIT_ASSERT((high & 0x800) != 0); - inst[0] = LUI | RD(reg) | (sljit_ins)0x80000000u; - inst[1] = XORI | RD(reg) | RS1(reg) | IMM_I(high); + ins[0] = LUI | RD(reg) | (sljit_ins)0x80000000u; + ins[1] = XORI | RD(reg) | RS1(reg) | IMM_I(high); } else { if ((high & 0x800) != 0) high += 0x1000; - inst[0] = LUI | RD(reg) | (sljit_ins)(high & ~0xfff); - inst[1] = ADDI | RD(reg) | RS1(reg) | IMM_I(high); + ins[0] = LUI | RD(reg) | (sljit_ins)(high & ~0xfff); + ins[1] = ADDI | RD(reg) | RS1(reg) | IMM_I(high); } - inst[2] = SLLI | RD(reg) | RS1(reg) | IMM_I(12); - inst += 2; + ins[2] = SLLI | RD(reg) | RS1(reg) | IMM_I(12); + ins += 2; } else { high = (sljit_sw)addr >> 32; if ((addr & 0x80000000l) != 0) high = ~high; - if ((high & 0x800) != 0) - high += 0x1000; - if (flags & PATCH_ABS52) { SLJIT_ASSERT(addr <= S52_MAX); - inst[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high << 12); + ins[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high << 12); } else { - inst[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high & ~0xfff); - inst[1] = ADDI | RD(TMP_REG3) | RS1(TMP_REG3) | IMM_I(high); - inst++; + if ((high & 0x800) != 0) + high += 0x1000; + ins[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high & ~0xfff); + ins[1] = ADDI | RD(TMP_REG3) | RS1(TMP_REG3) | IMM_I(high); + ins++; } - inst[1] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); - inst[2] = SLLI | RD(TMP_REG3) | RS1(TMP_REG3) | IMM_I((flags & PATCH_ABS52) ? 20 : 32); - inst[3] = XOR | RD(reg) | RS1(reg) | RS2(TMP_REG3); - inst += 3; + ins[1] = LUI | RD(reg) | (sljit_ins)((sljit_sw)addr & ~0xfff); + ins[2] = SLLI | RD(TMP_REG3) | RS1(TMP_REG3) | IMM_I((flags & PATCH_ABS52) ? 20 : 32); + ins[3] = XOR | RD(reg) | RS1(reg) | RS2(TMP_REG3); + ins += 3; } #endif /* !SLJIT_CONFIG_RISCV_32 */ - if (jump != NULL) { - SLJIT_ASSERT((inst[1] & 0x707f) == JALR); - inst[1] = (inst[1] & 0xfffff) | IMM_I(addr); + if (!(flags & JUMP_MOV_ADDR)) { + SLJIT_ASSERT((ins[1] & 0x707f) == JALR); + ins[1] = (ins[1] & 0xfffff) | IMM_I(addr); } else - inst[1] = ADDI | RD(reg) | RS1(reg) | IMM_I(addr); + ins[1] = ADDI | RD(reg) | RS1(reg) | IMM_I(addr); +} + +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + SLJIT_NEXT_DEFINE_TYPES; + sljit_uw total_size; + sljit_uw size_reduce = 0; + sljit_sw diff; + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + + while (1) { + SLJIT_GET_NEXT_MIN(); + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr == next_const_addr) { + const_->addr -= size_reduce; + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); + continue; + } + + if (next_min_addr != next_jump_addr) + continue; + + jump->addr -= size_reduce; + if (!(jump->flags & JUMP_MOV_ADDR)) { + total_size = JUMP_MAX_SIZE; + + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) { + if (jump->flags & JUMP_ADDR) { +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + if (jump->u.target <= S32_MAX) + total_size = 2; + else if (jump->u.target <= S44_MAX) + total_size = 4; + else if (jump->u.target <= S52_MAX) + total_size = 5; +#endif /* SLJIT_CONFIG_RISCV_64 */ + } else { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if ((jump->flags & IS_COND) && (diff + 1) <= (BRANCH_MAX / SSIZE_OF(ins)) && (diff + 1) >= (BRANCH_MIN / SSIZE_OF(ins))) + total_size = 0; + else if (diff >= (JUMP_MIN / SSIZE_OF(ins)) && diff <= (JUMP_MAX / SSIZE_OF(ins))) + total_size = 1; +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + else if (diff >= (S32_MIN / SSIZE_OF(ins)) && diff <= (S32_MAX / SSIZE_OF(ins))) + total_size = 2; +#endif /* SLJIT_CONFIG_RISCV_64 */ + } + } + + size_reduce += JUMP_MAX_SIZE - total_size; + jump->flags |= total_size << JUMP_SIZE_SHIFT; +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + } else { + total_size = 5; + + if (!(jump->flags & JUMP_ADDR)) { + /* Real size minus 1. Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)jump->addr; + + if (diff >= (S32_MIN / SSIZE_OF(ins)) && diff <= (S32_MAX / SSIZE_OF(ins))) + total_size = 1; + } else if (jump->u.target < S32_MAX) + total_size = 1; + else if (jump->u.target < S44_MAX) + total_size = 3; + else if (jump->u.target <= S52_MAX) + total_size = 4; + + size_reduce += 5 - total_size; + jump->flags |= total_size << JUMP_SIZE_SHIFT; +#endif /* !SLJIT_CONFIG_RISCV_64 */ + } + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; } SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) @@ -381,77 +504,80 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; - sljit_uw next_addr; + SLJIT_NEXT_DEFINE_TYPES; sljit_sw executable_offset; sljit_uw addr; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); + + reduce_code_size(compiler); code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; code_ptr = code; word_count = 0; - next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - if (next_addr == word_count) { + if (next_min_addr == word_count) { SLJIT_ASSERT(!label || label->size >= word_count); SLJIT_ASSERT(!jump || jump->addr >= word_count); SLJIT_ASSERT(!const_ || const_->addr >= word_count); - SLJIT_ASSERT(!put_label || put_label->addr >= word_count); /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + if (next_min_addr == next_label_size) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); } - if (jump && jump->addr == word_count) { + + if (next_min_addr == next_jump_addr) { + if (!(jump->flags & JUMP_MOV_ADDR)) { + word_count = word_count - 1 + (jump->flags >> JUMP_SIZE_SHIFT); + jump->addr = (sljit_uw)code_ptr; + code_ptr = detect_jump_type(jump, code, executable_offset); + SLJIT_ASSERT((jump->flags & PATCH_B) || ((sljit_uw)code_ptr - jump->addr < (jump->flags >> JUMP_SIZE_SHIFT) * sizeof(sljit_ins))); + } else { #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - word_count += 1; -#else - word_count += 5; -#endif - jump->addr = (sljit_uw)code_ptr; - code_ptr = detect_jump_type(jump, code, executable_offset); + word_count += 1; + jump->addr = (sljit_uw)code_ptr; + code_ptr += 1; +#else /* !SLJIT_CONFIG_RISCV_32 */ + word_count += jump->flags >> JUMP_SIZE_SHIFT; + addr = (sljit_uw)code_ptr; + code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset); + jump->addr = addr; +#endif /* SLJIT_CONFIG_RISCV_32 */ + } jump = jump->next; - } - if (const_ && const_->addr == word_count) { + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { const_->addr = (sljit_uw)code_ptr; const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - if (put_label && put_label->addr == word_count) { - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; -#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - code_ptr += 1; - word_count += 1; -#else - code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); - word_count += 5; -#endif - put_label = put_label->next; - } - next_addr = compute_next_addr(label, jump, const_, put_label); + + SLJIT_GET_NEXT_MIN(); } code_ptr++; word_count++; @@ -461,7 +587,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } while (buf); if (label && label->size == word_count) { - label->addr = (sljit_uw)code_ptr; + label->u.addr = (sljit_uw)code_ptr; label->size = (sljit_uw)(code_ptr - code); label = label->next; } @@ -469,18 +595,17 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; while (jump) { do { - if (!(jump->flags & (PATCH_B | PATCH_J | PATCH_REL32))) { - load_addr_to_reg(jump, TMP_REG1); + if (!(jump->flags & (PATCH_B | PATCH_J)) || (jump->flags & JUMP_MOV_ADDR)) { + load_addr_to_reg(jump, executable_offset); break; } - addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + addr = (jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; buf_ptr = (sljit_ins *)jump->addr; addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); @@ -491,31 +616,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil break; } -#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - if (jump->flags & PATCH_REL32) { - SLJIT_ASSERT((sljit_sw)addr >= S32_MIN && (sljit_sw)addr <= S32_MAX); - - if ((addr & 0x800) != 0) - addr += 0x1000; - - buf_ptr[0] = AUIPC | RD(TMP_REG1) | (sljit_ins)((sljit_sw)addr & ~0xfff); - SLJIT_ASSERT((buf_ptr[1] & 0x707f) == JALR); - buf_ptr[1] |= IMM_I(addr); - break; - } -#endif - SLJIT_ASSERT((sljit_sw)addr >= JUMP_MIN && (sljit_sw)addr <= JUMP_MAX); addr = (addr & 0xff000) | ((addr & 0x800) << 9) | ((addr & 0x7fe) << 20) | ((addr & 0x100000) << 11); buf_ptr[0] = JAL | RD((jump->flags & IS_CALL) ? RETURN_ADDR_REG : TMP_ZERO) | (sljit_ins)addr; } while (0); - jump = jump->next; - } - put_label = compiler->put_labels; - while (put_label) { - load_addr_to_reg(put_label, 0); - put_label = put_label->next; + jump = jump->next; } compiler->error = SLJIT_ERR_COMPILED; @@ -535,7 +641,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) switch (feature_type) { case SLJIT_HAS_FPU: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #elif defined(__riscv_float_abi_soft) return 0; #else @@ -554,7 +660,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - return (type >= SLJIT_ORDERED_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL); + switch (type) { + case SLJIT_UNORDERED_OR_EQUAL: + case SLJIT_ORDERED_NOT_EQUAL: + return 2; + + case SLJIT_UNORDERED: + case SLJIT_ORDERED: + return 1; + } + + return 0; } /* --------------------------------------------------------------------- */ @@ -929,7 +1045,7 @@ static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sl /* Since tmp can be the same as base or offset registers, * these might be unavailable after modifying tmp. */ - if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA) && reg == TMP_REG2) tmp_r = reg; if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { @@ -1057,16 +1173,16 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj { sljit_s32 is_clz = (GET_OPCODE(op) == SLJIT_CLZ); #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - sljit_ins word = (op & SLJIT_32) >> 5; - sljit_ins max = (op & SLJIT_32) ? 32 : 64; + sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5; + sljit_ins word_size = (op & SLJIT_32) ? 32 : 64; #else /* !SLJIT_CONFIG_RISCV_64 */ - sljit_ins max = 32; + sljit_ins word_size = 32; #endif /* SLJIT_CONFIG_RISCV_64 */ SLJIT_ASSERT(WORD == 0 || WORD == 0x8); /* The OTHER_FLAG is the counter. */ - FAIL_IF(push_inst(compiler, ADDI | WORD | RD(OTHER_FLAG) | RS1(TMP_ZERO) | IMM_I(max))); + FAIL_IF(push_inst(compiler, ADDI | WORD | RD(OTHER_FLAG) | RS1(TMP_ZERO) | IMM_I(word_size))); /* The TMP_REG2 is the next value. */ if (src != TMP_REG2) @@ -1082,7 +1198,7 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 op, slj FAIL_IF(push_inst(compiler, BLT | RS1(TMP_REG2) | RS2(TMP_ZERO) | ((sljit_ins)(2 * SSIZE_OF(ins)) << 7) | ((sljit_ins)(8 * SSIZE_OF(ins)) << 20))); /* The TMP_REG1 is the next shift. */ - FAIL_IF(push_inst(compiler, ADDI | WORD | RD(TMP_REG1) | RS1(TMP_ZERO) | IMM_I(max))); + FAIL_IF(push_inst(compiler, ADDI | WORD | RD(TMP_REG1) | RS1(TMP_ZERO) | IMM_I(word_size))); FAIL_IF(push_inst(compiler, ADDI | WORD | RD(EQUAL_FLAG) | RS1(TMP_REG2) | IMM_I(0))); FAIL_IF(push_inst(compiler, SRLI | WORD | RD(TMP_REG1) | RS1(TMP_REG1) | IMM_I(1))); @@ -1140,6 +1256,22 @@ static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s return push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1)); } +static sljit_s32 emit_rev16(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src) +{ +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5; + sljit_ins word_size = (op & SLJIT_32) ? 32 : 64; +#else /* !SLJIT_CONFIG_RISCV_64 */ + sljit_ins word_size = 32; +#endif /* SLJIT_CONFIG_RISCV_64 */ + + FAIL_IF(push_inst(compiler, SRLI | WORD | RD(TMP_REG1) | RS1(src) | IMM_I(8))); + FAIL_IF(push_inst(compiler, SLLI | WORD | RD(dst) | RS1(src) | IMM_I(word_size - 8))); + FAIL_IF(push_inst(compiler, ANDI | RD(TMP_REG1) | RS1(TMP_REG1) | IMM_I(0xff))); + FAIL_IF(push_inst(compiler, (GET_OPCODE(op) == SLJIT_REV_U16 ? SRLI : SRAI) | WORD | RD(dst) | RS1(dst) | IMM_I(word_size - 16))); + return push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1)); +} + #define EMIT_LOGICAL(op_imm, op_reg) \ if (flags & SRC2_IMM) { \ if (op & SLJIT_SET_Z) \ @@ -1164,7 +1296,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl sljit_s32 is_overflow, is_carry, carry_src_r, is_handled; sljit_ins op_imm, op_reg; #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - sljit_ins word = (op & SLJIT_32) >> 5; + sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5; #endif /* SLJIT_CONFIG_RISCV_64 */ SLJIT_ASSERT(WORD == 0 || WORD == 0x8); @@ -1234,9 +1366,28 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl return emit_clz_ctz(compiler, op, dst, src2); case SLJIT_REV: + case SLJIT_REV_S32: +#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) + case SLJIT_REV_U32: +#endif /* SLJIT_CONFIG_RISCV_32 */ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); return emit_rev(compiler, op, dst, src2); + case SLJIT_REV_U16: + case SLJIT_REV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return emit_rev16(compiler, op, dst, src2); + +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + case SLJIT_REV_U32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && dst != TMP_REG1); + FAIL_IF(emit_rev(compiler, op, dst, src2)); + if (dst == TMP_REG2) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SLLI | RD(dst) | RS1(dst) | IMM_I(32))); + return push_inst(compiler, SRLI | RD(dst) | RS1(dst) | IMM_I(32)); +#endif /* SLJIT_CONFIG_RISCV_32 */ + case SLJIT_ADD: /* Overflow computation (both add and sub): overflow = src1_sign ^ src2_sign ^ result_sign ^ carry_flag */ is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; @@ -1593,9 +1744,10 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 compiler->cache_argw = 0; } - if (dst == TMP_REG2) { + if (dst == 0) { SLJIT_ASSERT(HAS_FLAGS(op)); flags |= UNUSED_DEST; + dst = TMP_REG2; } else if (FAST_IS_REG(dst)) { dst_r = dst; @@ -1607,11 +1759,11 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 flags |= SLOW_DEST; if (flags & IMM_OP) { - if ((src2 & SLJIT_IMM) && src2w != 0 && src2w <= SIMM_MAX && src2w >= SIMM_MIN) { + if (src2 == SLJIT_IMM && src2w != 0 && src2w <= SIMM_MAX && src2w >= SIMM_MIN) { flags |= SRC2_IMM; src2_r = src2w; } - else if ((flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w != 0 && src1w <= SIMM_MAX && src1w >= SIMM_MIN) { + else if ((flags & CUMULATIVE_OP) && src1 == SLJIT_IMM && src1w != 0 && src1w <= SIMM_MAX && src1w >= SIMM_MIN) { flags |= SRC2_IMM; src2_r = src1w; @@ -1628,7 +1780,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 src1_r = src1; flags |= REG1_SOURCE; } - else if (src1 & SLJIT_IMM) { + else if (src1 == SLJIT_IMM) { if (src1w) { FAIL_IF(load_immediate(compiler, TMP_REG1, src1w, TMP_REG3)); src1_r = TMP_REG1; @@ -1651,7 +1803,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 if ((flags & (REG_DEST | MOVE_OP)) == MOVE_OP) dst_r = (sljit_s32)src2_r; } - else if (src2 & SLJIT_IMM) { + else if (src2 == SLJIT_IMM) { if (!(flags & SRC2_IMM)) { if (src2w) { FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w, TMP_REG3)); @@ -1708,7 +1860,7 @@ static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s3 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) { #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - sljit_ins word = (op & SLJIT_32) >> 5; + sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5; SLJIT_ASSERT(word == 0 || word == 0x8); #endif /* SLJIT_CONFIG_RISCV_64 */ @@ -1777,30 +1929,38 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) case SLJIT_MOV_U32: - return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u32)srcw : srcw); case SLJIT_MOV_S32: /* Logical operators have no W variant, so sign extended input is necessary for them. */ case SLJIT_MOV32: - return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw); + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s32)srcw : srcw); #endif case SLJIT_MOV_U8: - return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw); case SLJIT_MOV_S8: - return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw); case SLJIT_MOV_U16: - return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw); case SLJIT_MOV_S16: - return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw); case SLJIT_CLZ: case SLJIT_CTZ: case SLJIT_REV: return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U16: + case SLJIT_REV_S16: + return emit_op(compiler, op, HALF_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_REV_U32: + case SLJIT_REV_S32: + return emit_op(compiler, op | SLJIT_32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); } SLJIT_UNREACHABLE(); @@ -1823,9 +1983,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) if (op & SLJIT_32) { flags |= INT_DATA | SIGNED_DATA; - if (src1 & SLJIT_IMM) + if (src1 == SLJIT_IMM) src1w = (sljit_s32)src1w; - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) src2w = (sljit_s32)src2w; } #endif @@ -1858,7 +2018,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile case SLJIT_MASHR: case SLJIT_ROTL: case SLJIT_ROTR: - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) src2w &= 0x1f; #else /* !SLJIT_CONFIG_RISCV_32 */ @@ -1884,7 +2044,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compil CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w)); SLJIT_SKIP_CHECKS(compiler); - return sljit_emit_op2(compiler, op, TMP_REG2, 0, src1, src1w, src2, src2w); + return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op, @@ -1896,7 +2056,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * sljit_s32 is_left; sljit_ins ins1, ins2, ins3; #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - sljit_ins word = (op & SLJIT_32) >> 5; + sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5; sljit_s32 inp_flags = ((op & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; sljit_sw bit_length = (op & SLJIT_32) ? 32 : 64; #else /* !SLJIT_CONFIG_RISCV_64 */ @@ -1918,7 +2078,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= bit_length - 1; if (src3w == 0) @@ -1970,8 +2130,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * return push_inst(compiler, OR | RD(dst_reg) | RS1(dst_reg) | RS2(TMP_REG1)); } -#undef WORD - SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) { @@ -2027,21 +2185,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return reg_map[reg]; + + if (type != SLJIT_FLOAT_REGISTER) + return -1; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); return freg_map[reg]; } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_u32 size) { + SLJIT_UNUSED_ARG(size); + CHECK_ERROR(); CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); @@ -2088,51 +2249,73 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp #endif } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { - sljit_ins inst; -#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)) << 21; -#endif - sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; if (src & SLJIT_MEM) { #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) FAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw)); -#else - FAIL_IF(emit_op_mem2(compiler, (flags ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw)); -#endif +#else /* SLJIT_CONFIG_RISCV_32 */ + FAIL_IF(emit_op_mem2(compiler, ((ins & (1 << 21)) ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw)); +#endif /* !SLJIT_CONFIG_RISCV_32 */ src = TMP_REG1; - } else if (src & SLJIT_IMM) { -#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) - if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - srcw = (sljit_s32)srcw; -#endif - + } else if (src == SLJIT_IMM) { FAIL_IF(load_immediate(compiler, TMP_REG1, srcw, TMP_REG3)); src = TMP_REG1; } - inst = FCVT_S_W | FMT(op) | FRD(dst_r) | RS1(src); + FAIL_IF(push_inst(compiler, ins | FRD(dst_r) | RS1(src))); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, DOUBLE_DATA | ((sljit_s32)(~ins >> 24) & 0x2), TMP_FREG1, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins = FCVT_S_W | FMT(op); #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) if (op & SLJIT_32) - inst |= F3(0x7); -#else - inst |= flags; + ins |= F3(0x7); +#else /* !SLJIT_CONFIG_RISCV_32 */ + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) + ins |= (1 << 21); + else if (src == SLJIT_IMM) + srcw = (sljit_s32)srcw; if (op != SLJIT_CONV_F64_FROM_S32) - inst |= F3(0x7); -#endif + ins |= F3(0x7); +#endif /* SLJIT_CONFIG_RISCV_32 */ - FAIL_IF(push_inst(compiler, inst)); + return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw); +} - if (dst & SLJIT_MEM) - return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); - return SLJIT_SUCCESS; +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins = FCVT_S_WU | FMT(op); + +#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) + if (op & SLJIT_32) + ins |= F3(0x7); +#else /* !SLJIT_CONFIG_RISCV_32 */ + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW) + ins |= (1 << 21); + else if (src == SLJIT_IMM) + srcw = (sljit_u32)srcw; + + if (op != SLJIT_CONV_F64_FROM_S32) + ins |= F3(0x7); +#endif /* SLJIT_CONFIG_RISCV_32 */ + + return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw); } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, @@ -2170,14 +2353,19 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile case SLJIT_UNORDERED_OR_LESS: inst = FLE_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src2) | FRS2(src1); break; - case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */ + case SLJIT_UNORDERED_OR_EQUAL: FAIL_IF(push_inst(compiler, FLT_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src2))); FAIL_IF(push_inst(compiler, FLT_S | FMT(op) | RD(TMP_REG1) | FRS1(src2) | FRS2(src1))); inst = OR | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(TMP_REG1); break; default: /* SLJIT_UNORDERED */ - FAIL_IF(push_inst(compiler, FADD_S | FMT(op) | FRD(TMP_FREG1) | FRS1(src1) | FRS2(src2))); - inst = FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(TMP_FREG1) | FRS2(TMP_FREG1); + if (src1 == src2) { + inst = FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src1); + break; + } + FAIL_IF(push_inst(compiler, FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src1))); + FAIL_IF(push_inst(compiler, FEQ_S | FMT(op) | RD(TMP_REG1) | FRS1(src2) | FRS2(src2))); + inst = AND | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(TMP_REG1); break; } @@ -2304,6 +2492,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil case SLJIT_DIV_F64: FAIL_IF(push_inst(compiler, FDIV_S | FMT(op) | FRD(dst_r) | FRS1(src1) | FRS2(src2))); break; + + case SLJIT_COPYSIGN_F64: + return push_inst(compiler, FSGNJ_S | FMT(op) | FRD(dst_r) | FRS1(src1) | FRS2(src2)); } if (dst_r == TMP_FREG2) @@ -2312,8 +2503,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return SLJIT_SUCCESS; } -#undef FLOAT_DATA -#undef FMT +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm == 0) + return push_inst(compiler, FMV_W_X | RS1(TMP_ZERO) | FRD(freg)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm, TMP_REG3)); + return push_inst(compiler, FMV_W_X | RS1(TMP_REG1) | FRD(freg)); +} /* --------------------------------------------------------------------- */ /* Conditional instructions */ @@ -2341,6 +2549,54 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi #define BRANCH_LENGTH ((sljit_ins)(7 * sizeof(sljit_ins)) << 7) #endif +static sljit_ins get_jump_instruction(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + return BNE | RS1(EQUAL_FLAG) | RS2(TMP_ZERO); + case SLJIT_NOT_EQUAL: + return BEQ | RS1(EQUAL_FLAG) | RS2(TMP_ZERO); + case SLJIT_LESS: + case SLJIT_GREATER: + case SLJIT_SIG_LESS: + case SLJIT_SIG_GREATER: + case SLJIT_OVERFLOW: + case SLJIT_CARRY: + case SLJIT_F_EQUAL: + case SLJIT_ORDERED_EQUAL: + case SLJIT_ORDERED_NOT_EQUAL: + case SLJIT_F_LESS: + case SLJIT_ORDERED_LESS: + case SLJIT_ORDERED_GREATER: + case SLJIT_F_LESS_EQUAL: + case SLJIT_ORDERED_LESS_EQUAL: + case SLJIT_ORDERED_GREATER_EQUAL: + case SLJIT_ORDERED: + return BEQ | RS1(OTHER_FLAG) | RS2(TMP_ZERO); + break; + case SLJIT_GREATER_EQUAL: + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + case SLJIT_NOT_OVERFLOW: + case SLJIT_NOT_CARRY: + case SLJIT_F_NOT_EQUAL: + case SLJIT_UNORDERED_OR_NOT_EQUAL: + case SLJIT_UNORDERED_OR_EQUAL: + case SLJIT_F_GREATER_EQUAL: + case SLJIT_UNORDERED_OR_GREATER_EQUAL: + case SLJIT_UNORDERED_OR_LESS_EQUAL: + case SLJIT_F_GREATER: + case SLJIT_UNORDERED_OR_GREATER: + case SLJIT_UNORDERED_OR_LESS: + case SLJIT_UNORDERED: + return BNE | RS1(OTHER_FLAG) | RS2(TMP_ZERO); + default: + /* Not conditional branch. */ + return 0; + } +} + SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) { struct sljit_jump *jump; @@ -2354,57 +2610,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); type &= 0xff; - switch (type) { - case SLJIT_EQUAL: - inst = BNE | RS1(EQUAL_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH; - break; - case SLJIT_NOT_EQUAL: - inst = BEQ | RS1(EQUAL_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH; - break; - case SLJIT_LESS: - case SLJIT_GREATER: - case SLJIT_SIG_LESS: - case SLJIT_SIG_GREATER: - case SLJIT_OVERFLOW: - case SLJIT_CARRY: - case SLJIT_F_EQUAL: - case SLJIT_ORDERED_EQUAL: - case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */ - case SLJIT_F_LESS: - case SLJIT_ORDERED_LESS: - case SLJIT_ORDERED_GREATER: - case SLJIT_F_LESS_EQUAL: - case SLJIT_ORDERED_LESS_EQUAL: - case SLJIT_ORDERED_GREATER_EQUAL: - case SLJIT_ORDERED: - inst = BEQ | RS1(OTHER_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH; - break; - case SLJIT_GREATER_EQUAL: - case SLJIT_LESS_EQUAL: - case SLJIT_SIG_GREATER_EQUAL: - case SLJIT_SIG_LESS_EQUAL: - case SLJIT_NOT_OVERFLOW: - case SLJIT_NOT_CARRY: - case SLJIT_F_NOT_EQUAL: - case SLJIT_UNORDERED_OR_NOT_EQUAL: - case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */ - case SLJIT_F_GREATER_EQUAL: - case SLJIT_UNORDERED_OR_GREATER_EQUAL: - case SLJIT_UNORDERED_OR_LESS_EQUAL: - case SLJIT_F_GREATER: - case SLJIT_UNORDERED_OR_GREATER: - case SLJIT_UNORDERED_OR_LESS: - case SLJIT_UNORDERED: - inst = BNE | RS1(OTHER_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH; - break; - default: - /* Not conditional branch. */ - inst = 0; - break; - } + inst = get_jump_instruction(type); if (inst != 0) { - PTR_FAIL_IF(push_inst(compiler, inst)); + PTR_FAIL_IF(push_inst(compiler, inst | BRANCH_LENGTH)); jump->flags |= IS_COND; } @@ -2419,11 +2628,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile PTR_FAIL_IF(push_inst(compiler, inst)); /* Maximum number of instructions required for generating a constant. */ -#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - compiler->size += 1; -#else - compiler->size += 5; -#endif + compiler->size += JUMP_MAX_SIZE - 1; return jump; } @@ -2474,7 +2679,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler src2 = TMP_REG2; } - if (src1 & SLJIT_IMM) { + if (src1 == SLJIT_IMM) { if (src1w != 0) { PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, src1w, TMP_REG3)); src1 = TMP_REG1; @@ -2483,7 +2688,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler src1 = TMP_ZERO; } - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { if (src2w != 0) { PTR_FAIL_IF(load_immediate(compiler, TMP_REG2, src2w, TMP_REG3)); src2 = TMP_REG2; @@ -2536,11 +2741,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler PTR_FAIL_IF(push_inst(compiler, JALR | RD(TMP_ZERO) | RS1(TMP_REG1) | IMM_I(0))); /* Maximum number of instructions required for generating a constant. */ -#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - compiler->size += 1; -#else - compiler->size += 5; -#endif + compiler->size += JUMP_MAX_SIZE - 1; return jump; } @@ -2553,7 +2754,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi CHECK_ERROR(); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { if (src & SLJIT_MEM) { ADJUST_LOCAL_OFFSET(src, srcw); FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); @@ -2572,11 +2773,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi FAIL_IF(push_inst(compiler, JALR | RD((type >= SLJIT_FAST_CALL) ? RETURN_ADDR_REG : TMP_ZERO) | RS1(TMP_REG1) | IMM_I(0))); /* Maximum number of instructions required for generating a constant. */ -#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) - compiler->size += 1; -#else - compiler->size += 5; -#endif + compiler->size += JUMP_MAX_SIZE - 1; return SLJIT_SUCCESS; } @@ -2695,16 +2892,110 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, src_r, 0); } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { - CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + sljit_ins *ptr; + sljit_uw size; +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + sljit_ins word = (sljit_ins)(type & SLJIT_32) >> 5; + sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA; +#else /* !SLJIT_CONFIG_RISCV_64 */ + sljit_s32 inp_flags = WORD_DATA | LOAD_DATA; +#endif /* SLJIT_CONFIG_RISCV_64 */ - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);; + SLJIT_ASSERT(WORD == 0 || WORD == 0x8); + + CHECK_ERROR(); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + FAIL_IF(push_inst(compiler, ADDI | RD(TMP_REG2) | RS1(dst_reg) | IMM_I(0))); + + if ((src1 & REG_MASK) == dst_reg) + src1 = (src1 & ~REG_MASK) | TMP_REG2; + + if (OFFS_REG(src1) == dst_reg) + src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2); + } + + FAIL_IF(push_inst(compiler, ADDI | WORD | RD(dst_reg) | RS1(src2_reg) | IMM_I(0))); + } + } + + size = compiler->size; + + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + compiler->size++; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w)); + } else if (src1 == SLJIT_IMM) { +#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) + if (word) + src1w = (sljit_s32)src1w; +#endif /* SLJIT_CONFIG_RISCV_64 */ + FAIL_IF(load_immediate(compiler, dst_reg, src1w, TMP_REG1)); + } else + FAIL_IF(push_inst(compiler, ADDI | WORD | RD(dst_reg) | RS1(src1) | IMM_I(0))); + + *ptr = get_jump_instruction(type & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 9); + return SLJIT_SUCCESS; } +#undef WORD + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_ins *ptr; + sljit_uw size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, FSGNJ_S | FMT(type) | FRD(dst_freg) | FRS1(src2_freg) | FRS2(src2_freg))); + } + + size = compiler->size; + + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + compiler->size++; + + if (src1 & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, dst_freg, src1, src1w)); + else + FAIL_IF(push_inst(compiler, FSGNJ_S | FMT(type) | FRD(dst_freg) | FRS1(src1) | FRS2(src1))); + + *ptr = get_jump_instruction(type & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 9); + return SLJIT_SUCCESS; +} + +#undef FLOAT_DATA +#undef FMT + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) @@ -2783,31 +3074,31 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_s32 dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; PTR_FAIL_IF(push_inst(compiler, (sljit_ins)dst_r)); #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) compiler->size += 1; -#else +#else /* !SLJIT_CONFIG_RISCV_32 */ compiler->size += 5; -#endif +#endif /* SLJIT_CONFIG_RISCV_32 */ if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); - return put_label; + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeS390X.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeS390X.c old mode 100644 new mode 100755 index 8d86d072b1..0a7df4a684 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeS390X.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeS390X.c @@ -38,17 +38,14 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) return "s390x" SLJIT_CPUINFO; } -/* Instructions. */ +/* Instructions are stored as 64 bit values regardless their size. */ typedef sljit_uw sljit_ins; -/* Instruction tags (most significant halfword). */ -static const sljit_ins sljit_ins_const = (sljit_ins)1 << 48; - #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) -static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { - 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1 +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1, 14 }; /* there are also a[2-15] available, but they are slower to access and @@ -83,7 +80,7 @@ static const sljit_gpr r10 = 10; /* reg_map[9] */ static const sljit_gpr r11 = 11; /* reg_map[10] */ static const sljit_gpr r12 = 12; /* reg_map[11]: GOT */ static const sljit_gpr r13 = 13; /* reg_map[12]: Literal Pool pointer */ -static const sljit_gpr r14 = 14; /* reg_map[0]: return address and flag register */ +static const sljit_gpr r14 = 14; /* reg_map[0]: return address */ static const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */ /* WARNING: r12 and r13 shouldn't be used as per ABI recommendation */ @@ -96,20 +93,16 @@ static const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stac #define tmp0 r0 #define tmp1 r1 -/* TODO(carenas): flags should move to a different register so that - * link register doesn't need to change - */ - /* When reg cannot be unused. */ #define IS_GPR_REG(reg) ((reg > 0) && (reg) <= SLJIT_SP) /* Link register. */ static const sljit_gpr link_r = 14; /* r14 */ -#define TMP_FREG1 (0) +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { - 1, 0, 2, 4, 6, 3, 5, 7, 15, 14, 13, 12, 11, 10, 9, 8, +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = { + 0, 0, 2, 4, 6, 3, 5, 7, 15, 14, 13, 12, 11, 10, 9, 8, 1 }; #define R0A(r) (r) @@ -126,7 +119,10 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { #define F0(r) ((sljit_ins)freg_map[r]) #define F4(r) (R4A((sljit_ins)freg_map[r])) +#define F12(r) (R12A((sljit_ins)freg_map[r])) #define F20(r) (R20A((sljit_ins)freg_map[r])) +#define F28(r) (R28A((sljit_ins)freg_map[r])) +#define F32(r) (R32A((sljit_ins)freg_map[r])) #define F36(r) (R36A((sljit_ins)freg_map[r])) struct sljit_s390x_const { @@ -141,50 +137,21 @@ static SLJIT_INLINE sljit_gpr gpr(sljit_s32 r) return reg_map[r]; } -/* Size of instruction in bytes. Tags must already be cleared. */ -static SLJIT_INLINE sljit_uw sizeof_ins(sljit_ins ins) -{ - /* keep faulting instructions */ - if (ins == 0) - return 2; - - if ((ins & 0x00000000ffffL) == ins) - return 2; - if ((ins & 0x0000ffffffffL) == ins) - return 4; - if ((ins & 0xffffffffffffL) == ins) - return 6; - - SLJIT_UNREACHABLE(); - return (sljit_uw)-1; -} - static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) { sljit_ins *ibuf = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); FAIL_IF(!ibuf); *ibuf = ins; + + SLJIT_ASSERT(ins <= 0xffffffffffffL); + compiler->size++; - return SLJIT_SUCCESS; -} + if (ins & 0xffff00000000L) + compiler->size++; -static sljit_s32 encode_inst(void **ptr, sljit_ins ins) -{ - sljit_u16 *ibuf = (sljit_u16 *)*ptr; - sljit_uw size = sizeof_ins(ins); + if (ins & 0xffffffff0000L) + compiler->size++; - SLJIT_ASSERT((size & 6) == size); - switch (size) { - case 6: - *ibuf++ = (sljit_u16)(ins >> 32); - /* fallthrough */ - case 4: - *ibuf++ = (sljit_u16)(ins >> 16); - /* fallthrough */ - case 2: - *ibuf++ = (sljit_u16)(ins); - } - *ptr = (void*)ibuf; return SLJIT_SUCCESS; } @@ -211,6 +178,7 @@ static SLJIT_INLINE sljit_u8 get_cc(struct sljit_compiler *compiler, sljit_s32 t } /* fallthrough */ + case SLJIT_ATOMIC_STORED: case SLJIT_F_EQUAL: case SLJIT_ORDERED_EQUAL: return cc0; @@ -230,6 +198,7 @@ static SLJIT_INLINE sljit_u8 get_cc(struct sljit_compiler *compiler, sljit_s32 t return (cc1 | cc2 | cc3); case SLJIT_LESS: + case SLJIT_ATOMIC_NOT_STORED: return cc1; case SLJIT_GREATER_EQUAL: @@ -448,10 +417,12 @@ HAVE_FACILITY(have_misc2, MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY) static SLJIT_INLINE sljit_ins disp_s20(sljit_s32 d) { + sljit_uw dh, dl; + SLJIT_ASSERT(is_s20(d)); - sljit_uw dh = (d >> 12) & 0xff; - sljit_uw dl = (d << 8) & 0xfff00; + dh = (d >> 12) & 0xff; + dl = ((sljit_uw)d << 8) & 0xfff00; return (dh | dl) << 8; } @@ -893,23 +864,17 @@ static sljit_s32 push_load_imm_inst(struct sljit_compiler *compiler, sljit_gpr t if (((sljit_uw)v & ~(sljit_uw)0xffff000000000000) == 0) return push_inst(compiler, llihh(target, (sljit_u16)(v >> 48))); - /* 6 byte instructions (requires extended immediate facility) */ - if (have_eimm()) { - if (is_s32(v)) - return push_inst(compiler, lgfi(target, (sljit_s32)v)); + if (is_s32(v)) + return push_inst(compiler, lgfi(target, (sljit_s32)v)); - if (((sljit_uw)v >> 32) == 0) - return push_inst(compiler, llilf(target, (sljit_u32)v)); + if (((sljit_uw)v >> 32) == 0) + return push_inst(compiler, llilf(target, (sljit_u32)v)); - if (((sljit_uw)v << 32) == 0) - return push_inst(compiler, llihf(target, (sljit_u32)((sljit_uw)v >> 32))); + if (((sljit_uw)v << 32) == 0) + return push_inst(compiler, llihf(target, (sljit_u32)((sljit_uw)v >> 32))); - FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v))); - return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32))); - } - - /* TODO(mundaym): instruction sequences that don't use extended immediates */ - abort(); + FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v))); + return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32))); } struct addr { @@ -989,24 +954,47 @@ static sljit_s32 make_addr_bx(struct sljit_compiler *compiler, (cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr) /* May clobber tmp1. */ -static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst_r, +static sljit_s32 load_store_op(struct sljit_compiler *compiler, sljit_gpr reg, + sljit_s32 mem, sljit_sw memw, + sljit_s32 is_32bit, const sljit_ins* forms) +{ + struct addr addr; + + SLJIT_ASSERT(mem & SLJIT_MEM); + + if (is_32bit && ((mem & OFFS_REG_MASK) || is_u12(memw) || !is_s20(memw))) { + FAIL_IF(make_addr_bx(compiler, &addr, mem, memw, tmp1)); + return push_inst(compiler, forms[0] | R20A(reg) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset); + } + + FAIL_IF(make_addr_bxy(compiler, &addr, mem, memw, tmp1)); + return push_inst(compiler, (is_32bit ? forms[1] : forms[2]) | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)); +} + +static const sljit_ins load_forms[3] = { + 0x58000000 /* l */, + 0xe30000000058 /* ly */, + 0xe30000000004 /* lg */ +}; + +static const sljit_ins store_forms[3] = { + 0x50000000 /* st */, + 0xe30000000050 /* sty */, + 0xe30000000024 /* stg */ +}; + +static const sljit_ins load_halfword_forms[3] = { + 0x48000000 /* lh */, + 0xe30000000078 /* lhy */, + 0xe30000000015 /* lgh */ +}; + +/* May clobber tmp1. */ +static SLJIT_INLINE sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst_r, sljit_s32 src, sljit_sw srcw, sljit_s32 is_32bit) { - struct addr addr; - sljit_ins ins; - - SLJIT_ASSERT(src & SLJIT_MEM); - - if (is_32bit && ((src & OFFS_REG_MASK) || is_u12(srcw) || !is_s20(srcw))) { - FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1)); - return push_inst(compiler, 0x58000000 /* l */ | R20A(dst_r) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset); - } - - FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1)); - - ins = is_32bit ? 0xe30000000058 /* ly */ : 0xe30000000004 /* lg */; - return push_inst(compiler, ins | R36A(dst_r) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)); + return load_store_op(compiler, dst_r, src, srcw, is_32bit, load_forms); } /* May clobber tmp1. */ @@ -1026,24 +1014,11 @@ static sljit_s32 load_unsigned_word(struct sljit_compiler *compiler, sljit_gpr d } /* May clobber tmp1. */ -static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src_r, +static SLJIT_INLINE sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src_r, sljit_s32 dst, sljit_sw dstw, sljit_s32 is_32bit) { - struct addr addr; - sljit_ins ins; - - SLJIT_ASSERT(dst & SLJIT_MEM); - - if (is_32bit && ((dst & OFFS_REG_MASK) || is_u12(dstw) || !is_s20(dstw))) { - FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp1)); - return push_inst(compiler, 0x50000000 /* st */ | R20A(src_r) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset); - } - - FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1)); - - ins = is_32bit ? 0xe30000000050 /* sty */ : 0xe30000000024 /* stg */; - return push_inst(compiler, ins | R36A(src_r) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)); + return load_store_op(compiler, src_r, dst, dstw, is_32bit, store_forms); } #undef WHEN @@ -1052,15 +1027,17 @@ static sljit_s32 emit_move(struct sljit_compiler *compiler, sljit_gpr dst_r, sljit_s32 src, sljit_sw srcw) { + sljit_gpr src_r; + SLJIT_ASSERT(!IS_GPR_REG(src) || dst_r != gpr(src & REG_MASK)); - if (src & SLJIT_IMM) + if (src == SLJIT_IMM) return push_load_imm_inst(compiler, dst_r, srcw); if (src & SLJIT_MEM) return load_word(compiler, dst_r, src, srcw, (compiler->mode & SLJIT_32) != 0); - sljit_gpr src_r = gpr(src & REG_MASK); + src_r = gpr(src & REG_MASK); return push_inst(compiler, (compiler->mode & SLJIT_32) ? lr(dst_r, src_r) : lgr(dst_r, src_r)); } @@ -1253,10 +1230,10 @@ static sljit_s32 emit_siy(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_sw srcw) { - SLJIT_ASSERT(dst & SLJIT_MEM); - sljit_gpr dst_r = tmp1; + SLJIT_ASSERT(dst & SLJIT_MEM); + if (dst & OFFS_REG_MASK) { sljit_gpr index = tmp1; @@ -1419,90 +1396,54 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil { struct sljit_label *label; struct sljit_jump *jump; - struct sljit_s390x_const *const_; - struct sljit_put_label *put_label; + struct sljit_const *const_; sljit_sw executable_offset; - sljit_uw ins_size = 0; /* instructions */ + sljit_uw ins_size = compiler->size << 1; sljit_uw pool_size = 0; /* literal pool */ sljit_uw pad_size; - sljit_uw i, j = 0; + sljit_uw half_count; + SLJIT_NEXT_DEFINE_TYPES; struct sljit_memory_fragment *buf; - void *code, *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_u16 *code; + sljit_u16 *code_ptr; sljit_uw *pool, *pool_ptr; - sljit_sw source, offset; /* TODO(carenas): only need 32 bit */ + sljit_ins ins; + sljit_sw source, offset; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); reverse_buf(compiler); - /* branch handling */ - label = compiler->labels; jump = compiler->jumps; - put_label = compiler->put_labels; - - /* TODO(carenas): compiler->executable_size could be calculated - * before to avoid the following loop (except for - * pool_size) - */ - /* calculate the size of the code */ - for (buf = compiler->buf; buf != NULL; buf = buf->next) { - sljit_uw len = buf->used_size / sizeof(sljit_ins); - sljit_ins *ibuf = (sljit_ins *)buf->memory; - for (i = 0; i < len; ++i, ++j) { - sljit_ins ins = ibuf[i]; - - /* TODO(carenas): instruction tag vs size/addr == j - * using instruction tags for const is creative - * but unlike all other architectures, and is not - * done consistently for all other objects. - * This might need reviewing later. - */ - if (ins & sljit_ins_const) { - pool_size += sizeof(*pool); - ins &= ~sljit_ins_const; - } - if (label && label->size == j) { - label->size = ins_size; - label = label->next; - } - if (jump && jump->addr == j) { - if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) { - /* encoded: */ - /* brasl %r14, (or brcl , ) */ - /* replace with: */ - /* lgrl %r1, */ - /* bras %r14, %r1 (or bcr , %r1) */ - pool_size += sizeof(*pool); - ins_size += 2; - } - jump = jump->next; - } - if (put_label && put_label->addr == j) { - pool_size += sizeof(*pool); - put_label = put_label->next; - } - ins_size += sizeof_ins(ins); + while (jump != NULL) { + if (jump->flags & (SLJIT_REWRITABLE_JUMP | JUMP_ADDR | JUMP_MOV_ADDR)) { + /* encoded: */ + /* brasl %r14, (or brcl , ) */ + /* replace with: */ + /* lgrl %r1, */ + /* bras %r14, %r1 (or bcr , %r1) */ + pool_size += sizeof(*pool); + if (!(jump->flags & JUMP_MOV_ADDR)) + ins_size += 2; } + jump = jump->next; } - /* emit trailing label */ - if (label && label->size == j) { - label->size = ins_size; - label = label->next; + const_ = compiler->consts; + while (const_) { + pool_size += sizeof(*pool); + const_ = const_->next; } - SLJIT_ASSERT(!label); - SLJIT_ASSERT(!jump); - SLJIT_ASSERT(!put_label); - /* pad code size to 8 bytes so is accessible with half word offsets */ /* the literal pool needs to be doubleword aligned */ pad_size = ((ins_size + 7UL) & ~7UL) - ins_size; SLJIT_ASSERT(pad_size < 8UL); /* allocate target buffer */ - code = SLJIT_MALLOC_EXEC(ins_size + pad_size + pool_size, - compiler->exec_allocator_data); + code = SLJIT_MALLOC_EXEC(ins_size + pad_size + pool_size, compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); code_ptr = code; executable_offset = SLJIT_EXEC_OFFSET(code); @@ -1514,126 +1455,158 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil */ pool = (sljit_uw *)((sljit_uw)code + ins_size + pad_size); pool_ptr = pool; - const_ = (struct sljit_s390x_const *)compiler->consts; + buf = compiler->buf; + half_count = 0; - /* update label addresses */ label = compiler->labels; - while (label) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET( - (sljit_uw)code_ptr + label->size, executable_offset); - label = label->next; - } - - /* reset jumps */ jump = compiler->jumps; - put_label = compiler->put_labels; + const_ = compiler->consts; + SLJIT_NEXT_INIT_TYPES(); + SLJIT_GET_NEXT_MIN(); - /* emit the code */ - j = 0; - for (buf = compiler->buf; buf != NULL; buf = buf->next) { - sljit_uw len = buf->used_size / sizeof(sljit_ins); - sljit_ins *ibuf = (sljit_ins *)buf->memory; - for (i = 0; i < len; ++i, ++j) { - sljit_ins ins = ibuf[i]; - if (ins & sljit_ins_const) { - /* clear the const tag */ - ins &= ~sljit_ins_const; + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 3); + do { + ins = *buf_ptr++; - /* update instruction with relative address of constant */ - source = (sljit_sw)code_ptr; - offset = (sljit_sw)pool_ptr - source; + if (next_min_addr == half_count) { + SLJIT_ASSERT(!label || label->size >= half_count); + SLJIT_ASSERT(!jump || jump->addr >= half_count); + SLJIT_ASSERT(!const_ || const_->addr >= half_count); - SLJIT_ASSERT(!(offset & 1)); - offset >>= 1; /* halfword (not byte) offset */ - SLJIT_ASSERT(is_s32(offset)); + if (next_min_addr == next_label_size) { + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } - ins |= (sljit_ins)offset & 0xffffffff; + if (next_min_addr == next_jump_addr) { + if (SLJIT_UNLIKELY(jump->flags & JUMP_MOV_ADDR)) { + source = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - /* update address */ - const_->const_.addr = (sljit_uw)pool_ptr; + jump->addr = (sljit_uw)pool_ptr; - /* store initial value into pool and update pool address */ - *(pool_ptr++) = (sljit_uw)const_->init_value; + /* store target into pool */ + offset = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source; + pool_ptr++; - /* move to next constant */ - const_ = (struct sljit_s390x_const *)const_->const_.next; - } - if (jump && jump->addr == j) { - sljit_sw target = (sljit_sw)((jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target); - if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) { - jump->addr = (sljit_uw)pool_ptr; + SLJIT_ASSERT(!(offset & 1)); + offset >>= 1; + SLJIT_ASSERT(is_s32(offset)); + ins |= (sljit_ins)offset & 0xffffffff; + } else if (jump->flags & (SLJIT_REWRITABLE_JUMP | JUMP_ADDR)) { + sljit_ins arg; - /* load address into tmp1 */ - source = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - offset = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source; + jump->addr = (sljit_uw)pool_ptr; - SLJIT_ASSERT(!(offset & 1)); - offset >>= 1; + /* load address into tmp1 */ + source = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + offset = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source; + + SLJIT_ASSERT(!(offset & 1)); + offset >>= 1; + SLJIT_ASSERT(is_s32(offset)); + + code_ptr[0] = (sljit_u16)(0xc408 | R4A(tmp1) /* lgrl */); + code_ptr[1] = (sljit_u16)(offset >> 16); + code_ptr[2] = (sljit_u16)offset; + code_ptr += 3; + pool_ptr++; + + /* branch to tmp1 */ + arg = (ins >> 36) & 0xf; + if (((ins >> 32) & 0xf) == 4) { + /* brcl -> bcr */ + ins = bcr(arg, tmp1); + } else { + SLJIT_ASSERT(((ins >> 32) & 0xf) == 5); + /* brasl -> basr */ + ins = basr(arg, tmp1); + } + + /* Adjust half_count. */ + half_count += 2; + } else + jump->addr = (sljit_uw)code_ptr; + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } else if (next_min_addr == next_const_addr) { + /* update instruction with relative address of constant */ + source = (sljit_sw)code_ptr; + offset = (sljit_sw)pool_ptr - source; + + SLJIT_ASSERT(!(offset & 0x1)); + offset >>= 1; /* halfword (not byte) offset */ SLJIT_ASSERT(is_s32(offset)); - encode_inst(&code_ptr, lgrl(tmp1, offset & 0xffffffff)); - - /* store jump target into pool and update pool address */ - *(pool_ptr++) = (sljit_uw)target; - - /* branch to tmp1 */ - sljit_ins op = (ins >> 32) & 0xf; - sljit_ins arg = (ins >> 36) & 0xf; - switch (op) { - case 4: /* brcl -> bcr */ - ins = bcr(arg, tmp1); - break; - case 5: /* brasl -> basr */ - ins = basr(arg, tmp1); - break; - default: - abort(); - } - } - else { - jump->addr = (sljit_uw)code_ptr + 2; - source = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - offset = target - source; - - /* offset must be halfword aligned */ - SLJIT_ASSERT(!(offset & 1)); - offset >>= 1; - SLJIT_ASSERT(is_s32(offset)); /* TODO(mundaym): handle arbitrary offsets */ - - /* patch jump target */ ins |= (sljit_ins)offset & 0xffffffff; + + /* update address */ + const_->addr = (sljit_uw)pool_ptr; + + /* store initial value into pool and update pool address */ + *(pool_ptr++) = (sljit_uw)(((struct sljit_s390x_const*)const_)->init_value); + + /* move to next constant */ + const_ = const_->next; + next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_); } - jump = jump->next; + + SLJIT_GET_NEXT_MIN(); } - if (put_label && put_label->addr == j) { - source = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; - - /* store target into pool */ - *pool_ptr = put_label->label->addr; - offset = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source; - pool_ptr++; - - SLJIT_ASSERT(!(offset & 1)); - offset >>= 1; - SLJIT_ASSERT(is_s32(offset)); - ins |= (sljit_ins)offset & 0xffffffff; - - put_label = put_label->next; + if (ins & 0xffff00000000L) { + *code_ptr++ = (sljit_u16)(ins >> 32); + half_count++; } - encode_inst(&code_ptr, ins); - } - } - SLJIT_ASSERT((sljit_u8 *)code + ins_size == code_ptr); + + if (ins & 0xffffffff0000L) { + *code_ptr++ = (sljit_u16)(ins >> 16); + half_count++; + } + + *code_ptr++ = (sljit_u16)ins; + half_count++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + SLJIT_ASSERT(code + (ins_size >> 1) == code_ptr); SLJIT_ASSERT((sljit_u8 *)pool + pool_size == (sljit_u8 *)pool_ptr); + jump = compiler->jumps; + while (jump != NULL) { + offset = (sljit_sw)((jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr); + + if (jump->flags & (SLJIT_REWRITABLE_JUMP | JUMP_ADDR | JUMP_MOV_ADDR)) { + /* Store jump target into pool. */ + *(sljit_uw*)(jump->addr) = (sljit_uw)offset; + } else { + code_ptr = (sljit_u16*)jump->addr; + offset -= (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + /* offset must be halfword aligned */ + SLJIT_ASSERT(!(offset & 1)); + offset >>= 1; + SLJIT_ASSERT(is_s32(offset)); /* TODO(mundaym): handle arbitrary offsets */ + + code_ptr[1] = (sljit_u16)(offset >> 16); + code_ptr[2] = (sljit_u16)offset; + } + jump = jump->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = ins_size; - code = SLJIT_ADD_EXEC_OFFSET(code, executable_offset); - code_ptr = SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + if (pool_size) + compiler->executable_size += (pad_size + pool_size); + + code = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); SLJIT_CACHE_FLUSH(code, code_ptr); SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1); return code; @@ -1644,15 +1617,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) /* TODO(mundaym): implement all */ switch (feature_type) { case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return (SLJIT_IS_FPU_AVAILABLE) != 0; +#else + return 1; +#endif /* SLJIT_IS_FPU_AVAILABLE */ + case SLJIT_HAS_CLZ: case SLJIT_HAS_REV: case SLJIT_HAS_ROT: case SLJIT_HAS_PREFETCH: case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: + case SLJIT_HAS_SIMD: + case SLJIT_HAS_ATOMIC: return 1; + case SLJIT_HAS_CTZ: return 2; + case SLJIT_HAS_CMOV: return have_lscond1() ? 1 : 0; } @@ -1661,7 +1644,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - return (type >= SLJIT_UNORDERED && type <= SLJIT_ORDERED_LESS_EQUAL); + SLJIT_UNUSED_ARG(type); + return 0; } /* --------------------------------------------------------------------- */ @@ -1738,7 +1722,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi local_size = (local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE + 0xf) & ~0xf; compiler->local_size = local_size; - FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(-local_size))); + if (is_s20(-local_size)) + FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(-local_size))); + else + FAIL_IF(push_inst(compiler, 0xc20400000000 /* slgfi */ | R36A(r15) | (sljit_ins)local_size)); if (options & SLJIT_ENTER_REG_ARG) return SLJIT_SUCCESS; @@ -1783,8 +1770,10 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit if (is_u12(local_size)) FAIL_IF(push_inst(compiler, 0x41000000 /* ly */ | R20A(r15) | R12A(r15) | (sljit_ins)local_size)); - else + else if (is_s20(local_size)) FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(local_size))); + else + FAIL_IF(push_inst(compiler, 0xc20a00000000 /* algfi */ | R36A(r15) | (sljit_ins)local_size)); offset = 2 * SSIZE_OF(sw); if (saveds + scratches >= SLJIT_NUMBER_OF_REGISTERS) { @@ -2015,16 +2004,23 @@ static sljit_s32 sljit_emit_rev(struct sljit_compiler *compiler, sljit_s32 op, struct addr addr; sljit_gpr reg; sljit_ins ins; + sljit_s32 opcode = GET_OPCODE(op); + sljit_s32 is_16bit = (opcode == SLJIT_REV_U16 || opcode == SLJIT_REV_S16); if (dst & SLJIT_MEM) { if (src & SLJIT_MEM) { - FAIL_IF(load_word(compiler, tmp0, src, srcw, op & SLJIT_32)); + FAIL_IF(load_store_op(compiler, tmp0, src, srcw, op & SLJIT_32, is_16bit ? load_halfword_forms : load_forms)); reg = tmp0; } else reg = gpr(src); FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1)); - ins = (op & SLJIT_32) ? 0xe3000000003e /* strv */ : 0xe3000000002f /* strvg */; + + if (is_16bit) + ins = 0xe3000000003f /* strvh */; + else + ins = (op & SLJIT_32) ? 0xe3000000003e /* strv */ : 0xe3000000002f /* strvg */; + return push_inst(compiler, ins | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)); } @@ -2032,12 +2028,46 @@ static sljit_s32 sljit_emit_rev(struct sljit_compiler *compiler, sljit_s32 op, if (src & SLJIT_MEM) { FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1)); - ins = (op & SLJIT_32) ? 0xe3000000001e /* lrv */ : 0xe3000000000f /* lrvg */; - return push_inst(compiler, ins | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)); + + if (is_16bit) + ins = 0xe3000000001f /* lrvh */; + else + ins = (op & SLJIT_32) ? 0xe3000000001e /* lrv */ : 0xe3000000000f /* lrvg */; + + FAIL_IF(push_inst(compiler, ins | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset))); + + if (opcode == SLJIT_REV) + return SLJIT_SUCCESS; + + if (is_16bit) { + if (op & SLJIT_32) + ins = (opcode == SLJIT_REV_U16) ? 0xb9950000 /* llhr */ : 0xb9270000 /* lhr */; + else + ins = (opcode == SLJIT_REV_U16) ? 0xb9850000 /* llghr */ : 0xb9070000 /* lghr */; + } else + ins = (opcode == SLJIT_REV_U32) ? 0xb9160000 /* llgfr */ : 0xb9140000 /* lgfr */; + + return push_inst(compiler, ins | R4A(reg) | R0A(reg)); } ins = (op & SLJIT_32) ? 0xb91f0000 /* lrvr */ : 0xb90f0000 /* lrvgr */; - return push_inst(compiler, ins | R4A(reg) | R0A(gpr(src))); + FAIL_IF(push_inst(compiler, ins | R4A(reg) | R0A(gpr(src)))); + + if (opcode == SLJIT_REV) + return SLJIT_SUCCESS; + + if (!is_16bit) { + ins = (opcode == SLJIT_REV_U32) ? 0xb9160000 /* llgfr */ : 0xb9140000 /* lgfr */; + return push_inst(compiler, ins | R4A(reg) | R0A(reg)); + } + + if (op & SLJIT_32) { + ins = (opcode == SLJIT_REV_U16) ? 0x88000000 /* srl */ : 0x8a000000 /* sra */; + return push_inst(compiler, ins | R20A(reg) | 16); + } + + ins = (opcode == SLJIT_REV_U16) ? 0xeb000000000c /* srlg */ : 0xeb000000000a /* srag */; + return push_inst(compiler, ins | R36A(reg) | R32A(reg) | (48 << 16)); } /* LEVAL will be defined later with different parameters as needed */ @@ -2116,7 +2146,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return SLJIT_SUCCESS; } /* LOAD IMMEDIATE */ - if (FAST_IS_REG(dst) && (src & SLJIT_IMM)) { + if (FAST_IS_REG(dst) && src == SLJIT_IMM) { switch (opcode) { case SLJIT_MOV_U8: srcw = (sljit_sw)((sljit_u8)(srcw)); @@ -2195,14 +2225,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile return SLJIT_SUCCESS; } /* STORE and STORE IMMEDIATE */ - if ((dst & SLJIT_MEM) - && (FAST_IS_REG(src) || (src & SLJIT_IMM))) { + if ((dst & SLJIT_MEM) && (FAST_IS_REG(src) || src == SLJIT_IMM)) { + struct addr mem; sljit_gpr reg = FAST_IS_REG(src) ? gpr(src) : tmp0; - if (src & SLJIT_IMM) { + + if (src == SLJIT_IMM) { /* TODO(mundaym): MOVE IMMEDIATE? */ FAIL_IF(push_load_imm_inst(compiler, reg, srcw)); } - struct addr mem; FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1)); switch (opcode) { case SLJIT_MOV_U8: @@ -2269,7 +2299,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile SLJIT_UNREACHABLE(); } - SLJIT_ASSERT((src & SLJIT_IMM) == 0); /* no immediates */ + SLJIT_ASSERT(src != SLJIT_IMM); dst_r = FAST_IS_REG(dst) ? gpr(dst) : tmp0; src_r = FAST_IS_REG(src) ? gpr(src) : tmp0; @@ -2285,7 +2315,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile FAIL_IF(sljit_emit_clz_ctz(compiler, op, dst_r, src_r)); break; + case SLJIT_REV_U32: + case SLJIT_REV_S32: + op |= SLJIT_32; + /* fallthrough */ case SLJIT_REV: + case SLJIT_REV_U16: + case SLJIT_REV_S16: return sljit_emit_rev(compiler, op, dst, dstw, src, srcw); default: SLJIT_UNREACHABLE(); @@ -2341,7 +2377,7 @@ static sljit_s32 sljit_emit_add(struct sljit_compiler *compiler, sljit_s32 op, const struct ins_forms *forms; sljit_ins ins; - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { if (!sets_zero_overflow && is_s8(src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) { if (sets_overflow) ins = (op & SLJIT_32) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */; @@ -2426,9 +2462,8 @@ static sljit_s32 sljit_emit_sub(struct sljit_compiler *compiler, sljit_s32 op, compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_COMPARE; - if (src2 & SLJIT_IMM) { - if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w))) - { + if (src2 == SLJIT_IMM) { + if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w))) { if ((op & SLJIT_32) || is_s32(src2w)) { ins = (op & SLJIT_32) ? 0xc20d00000000 /* cfi */ : 0xc20c00000000 /* cgfi */; return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A); @@ -2469,7 +2504,7 @@ static sljit_s32 sljit_emit_sub(struct sljit_compiler *compiler, sljit_s32 op, goto done; } - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { sljit_sw neg_src2w = -src2w; if (sets_signed || neg_src2w != 0 || (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == 0) { @@ -2577,7 +2612,7 @@ static sljit_s32 sljit_emit_multiply(struct sljit_compiler *compiler, sljit_s32 return emit_commutative(compiler, &multiply_overflow_forms, dst, src1, src1w, src2, src2w); } - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { if (is_s16(src2w)) { ins = (op & SLJIT_32) ? 0xa70c0000 /* mhi */ : 0xa70d0000 /* mghi */; return emit_ri(compiler, ins, dst, src1, src1w, src2w, RI_A); @@ -2684,7 +2719,7 @@ static sljit_s32 sljit_emit_bitwise(struct sljit_compiler *compiler, sljit_s32 o sljit_s32 type = GET_OPCODE(op); const struct ins_forms *forms; - if ((src2 & SLJIT_IMM) && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == (sljit_s32)tmp0))) { + if (src2 == SLJIT_IMM && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == (sljit_s32)tmp0))) { sljit_s32 count16 = 0; sljit_uw imm = (sljit_uw)src2w; @@ -2748,7 +2783,7 @@ static sljit_s32 sljit_emit_shift(struct sljit_compiler *compiler, sljit_s32 op, else FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); - if (!(src2 & SLJIT_IMM)) { + if (src2 != SLJIT_IMM) { if (FAST_IS_REG(src2)) base_r = gpr(src2); else { @@ -2808,7 +2843,7 @@ static sljit_s32 sljit_emit_rotate(struct sljit_compiler *compiler, sljit_s32 op else FAIL_IF(emit_move(compiler, tmp0, src1, src1w)); - if (!(src2 & SLJIT_IMM)) { + if (src2 != SLJIT_IMM) { if (FAST_IS_REG(src2)) base_r = gpr(src2); else { @@ -2818,7 +2853,7 @@ static sljit_s32 sljit_emit_rotate(struct sljit_compiler *compiler, sljit_s32 op } if (GET_OPCODE(op) == SLJIT_ROTR) { - if (!(src2 & SLJIT_IMM)) { + if (src2 != SLJIT_IMM) { ins = (op & SLJIT_32) ? 0x1300 /* lcr */ : 0xb9030000 /* lcgr */; FAIL_IF(push_inst(compiler, ins | R4A(tmp1) | R0A(base_r))); base_r = tmp1; @@ -2826,7 +2861,7 @@ static sljit_s32 sljit_emit_rotate(struct sljit_compiler *compiler, sljit_s32 op src2w = -src2w; } - if (src2 & SLJIT_IMM) + if (src2 == SLJIT_IMM) imm = (sljit_ins)(src2w & ((op & SLJIT_32) ? 0x1f : 0x3f)); ins = (op & SLJIT_32) ? 0xeb000000001d /* rll */ : 0xeb000000001c /* rllg */; @@ -2867,7 +2902,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile compiler->mode = op & SLJIT_32; compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z); - if (is_commutative(op) && (src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM)) { + if (is_commutative(op) && src1 == SLJIT_IMM && src2 != SLJIT_IMM) { src1 ^= src2; src2 ^= src1; src1 ^= src2; @@ -2960,7 +2995,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * ADJUST_LOCAL_OFFSET(src3, src3w); - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { src3w &= bit_length - 1; if (src3w == 0) @@ -3113,15 +3148,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); - return (sljit_s32)gpr(reg); -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); + + if (type == SLJIT_GP_REGISTER) + return (sljit_s32)gpr(reg); + + if (type != SLJIT_FLOAT_REGISTER) + return -1; -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); return (sljit_s32)freg_map[reg]; } @@ -3213,33 +3249,61 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp return SLJIT_SUCCESS; } -static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, +static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; - sljit_ins ins; - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { FAIL_IF(push_load_imm_inst(compiler, tmp0, srcw)); src = (sljit_s32)tmp0; } else if (src & SLJIT_MEM) { - FAIL_IF(load_word(compiler, tmp0, src, srcw, GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_S32)); + FAIL_IF(load_word(compiler, tmp0, src, srcw, ins & 0x100000)); src = (sljit_s32)tmp0; } + FAIL_IF(push_inst(compiler, ins | F4(dst_r) | R0(src))); + + if (dst & SLJIT_MEM) + return float_mem(compiler, FLOAT_STORE | ((ins & 0x10000) ? 0 : SLJIT_32), TMP_FREG1, dst, dstw); + + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins; + + if (src == SLJIT_IMM && GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) ins = (op & SLJIT_32) ? 0xb3a40000 /* cegbr */ : 0xb3a50000 /* cdgbr */; else ins = (op & SLJIT_32) ? 0xb3940000 /* cefbr */ : 0xb3950000 /* cdfbr */; - FAIL_IF(push_inst(compiler, ins | F4(dst_r) | R0(src))); + return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw); +} - if (dst & SLJIT_MEM) - return float_mem(compiler, FLOAT_STORE | (op & SLJIT_32), TMP_FREG1, dst, dstw); +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins; - return SLJIT_SUCCESS; + if (src == SLJIT_IMM && GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) + srcw = (sljit_u32)srcw; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW) + ins = (op & SLJIT_32) ? 0xb3a00000 /* celgbr */ : 0xb3a10000 /* cdlgbr */; + else + ins = (op & SLJIT_32) ? 0xb3900000 /* celfbr */ : 0xb3910000 /* cdlfbr */; + + return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw); } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, @@ -3391,6 +3455,66 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return SLJIT_SUCCESS; } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (src2 & SLJIT_MEM) { + FAIL_IF(float_mem(compiler, FLOAT_LOAD | (op & SLJIT_32), TMP_FREG1, src2, src2w)); + src2 = TMP_FREG1; + } + + if (src1 & SLJIT_MEM) { + reg = (dst_freg == src2) ? TMP_FREG1 : dst_freg; + FAIL_IF(float_mem(compiler, FLOAT_LOAD | (op & SLJIT_32), reg, src1, src1w)); + src1 = reg; + } + + return push_inst(compiler, 0xb3720000 /* cpsdr */ | F12(src2) | F4(dst_freg) | F0(src1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + FAIL_IF(push_load_imm_inst(compiler, tmp1, (sljit_sw)(((sljit_uw)u.imm << 32)))); + return push_inst(compiler, 0xb3c10000 /* ldgr */ | F4(freg) | R0A(tmp1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + FAIL_IF(push_load_imm_inst(compiler, tmp1, (sljit_sw)u.imm)); + return push_inst(compiler, 0xb3c10000 /* ldgr */ | F4(freg) | R0A(tmp1)); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -3440,14 +3564,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) { + struct sljit_jump *jump; sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(compiler, type & 0xff) : 0xf; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_jump(compiler, type)); /* record jump */ - struct sljit_jump *jump = (struct sljit_jump *) - ensure_abuf(compiler, sizeof(struct sljit_jump)); + jump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump)); PTR_FAIL_IF(!jump); set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); jump->addr = compiler->size; @@ -3485,7 +3609,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi CHECK_ERROR(); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { SLJIT_ASSERT(!(srcw & 1)); /* target address must be even */ FAIL_IF(push_load_imm_inst(compiler, src_r, srcw)); } @@ -3505,6 +3629,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi sljit_s32 arg_types, sljit_s32 src, sljit_sw srcw) { + SLJIT_UNUSED_ARG(arg_types); + CHECK_ERROR(); CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); @@ -3536,13 +3662,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co sljit_s32 dst, sljit_sw dstw, sljit_s32 type) { + sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; + sljit_gpr loc_r = tmp1; sljit_u8 mask = get_cc(compiler, type); CHECK_ERROR(); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); - sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; - sljit_gpr loc_r = tmp1; switch (GET_OPCODE(op)) { case SLJIT_AND: case SLJIT_OR: @@ -3602,37 +3728,125 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { - sljit_ins mask = get_cc(compiler, type & ~SLJIT_32); + sljit_ins mask; sljit_gpr src_r; + sljit_gpr dst_r = gpr(dst_reg); sljit_ins ins; CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); - if (type & SLJIT_32) - srcw = (sljit_s32)srcw; + ADJUST_LOCAL_OFFSET(src1, src1w); - if (have_lscond2() && (src & SLJIT_IMM) && is_s16(srcw)) { - ins = (type & SLJIT_32) ? 0xec0000000042 /* lochi */ : 0xec0000000046 /* locghi */; - return push_inst(compiler, ins | R36A(gpr(dst_reg)) | (mask << 32) | (sljit_ins)(srcw & 0xffff) << 16); + if (dst_reg != src2_reg) { + if (src1 == dst_reg) { + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + FAIL_IF(load_word(compiler, dst_r, src1, src1w, type & SLJIT_32)); + src1 = src2_reg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(push_inst(compiler, ((type & SLJIT_32) ? 0x1800 /* lr */ : 0xb9040000 /* lgr */) | R4A(dst_r) | R0A(gpr(src2_reg)))); + } } - if (src & SLJIT_IMM) { - FAIL_IF(push_load_imm_inst(compiler, tmp0, srcw)); + mask = get_cc(compiler, type & ~SLJIT_32); + + if (src1 & SLJIT_MEM) { + if (src1 & OFFS_REG_MASK) { + src_r = gpr(OFFS_REG(src1)); + + if (src1w != 0) { + FAIL_IF(push_inst(compiler, 0xeb000000000d /* sllg */ | R36A(tmp1) | R32A(src_r) | ((sljit_ins)(src1w & 0x3) << 16))); + src_r = tmp1; + } + + FAIL_IF(push_inst(compiler, 0xb9e80000 /* agrk */ | R12A(src_r) | R4A(tmp1) | R0A(gpr(src1 & REG_MASK)))); + src_r = tmp1; + src1w = 0; + } else if (!is_s20(src1w)) { + FAIL_IF(push_load_imm_inst(compiler, tmp1, src1w)); + + if (src1 & REG_MASK) + FAIL_IF(push_inst(compiler, 0xb9e80000 /* agrk */ | R12A(tmp1) | R4A(tmp1) | R0A(gpr(src1 & REG_MASK)))); + + src_r = tmp1; + src1w = 0; + } else + src_r = gpr(src1 & REG_MASK); + + ins = (type & SLJIT_32) ? 0xeb00000000f2 /* loc */ : 0xeb00000000e2 /* locg */; + return push_inst(compiler, ins | R36A(dst_r) | (mask << 32) | R28A(src_r) | disp_s20((sljit_s32)src1w)); + } + + if (src1 == SLJIT_IMM) { + if (type & SLJIT_32) + src1w = (sljit_s32)src1w; + + if (have_lscond2() && is_s16(src1w)) { + ins = (type & SLJIT_32) ? 0xec0000000042 /* lochi */ : 0xec0000000046 /* locghi */; + return push_inst(compiler, ins | R36A(dst_r) | (mask << 32) | (sljit_ins)(src1w & 0xffff) << 16); + } + + FAIL_IF(push_load_imm_inst(compiler, tmp0, src1w)); src_r = tmp0; } else - src_r = gpr(src); + src_r = gpr(src1); - if (have_lscond1()) { - ins = (type & SLJIT_32) ? 0xb9f20000 /* locr */ : 0xb9e20000 /* locgr */; - return push_inst(compiler, ins | (mask << 12) | R4A(gpr(dst_reg)) | R0A(src_r)); + ins = (type & SLJIT_32) ? 0xb9f20000 /* locr */ : 0xb9e20000 /* locgr */; + return push_inst(compiler, ins | (mask << 12) | R4A(dst_r) | R0A(src_r)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_ins ins; + struct sljit_label *label; + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else { + ins = (type & SLJIT_32) ? 0x3800 /* ler */ : 0x2800 /* ldr */; + FAIL_IF(push_inst(compiler, ins | F4(dst_freg) | F0(src2_freg))); + } } - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); + SLJIT_SKIP_CHECKS(compiler); + jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1); + FAIL_IF(!jump); + + if (!(src1 & SLJIT_MEM)) { + ins = (type & SLJIT_32) ? 0x3800 /* ler */ : 0x2800 /* ldr */; + FAIL_IF(push_inst(compiler, ins | F4(dst_freg) | F0(src1))); + } else + FAIL_IF(float_mem(compiler, FLOAT_LOAD | (type & SLJIT_32), dst_freg, src1, src1w)); + + SLJIT_SKIP_CHECKS(compiler); + label = sljit_emit_label(compiler); + FAIL_IF(!label); + + sljit_set_label(jump, label); + return SLJIT_SUCCESS; } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, @@ -3694,6 +3908,502 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile return push_inst(compiler, ins | R36A(reg2) | disp_s20((sljit_s32)memw + SSIZE_OF(sw))); } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type); + struct addr addr; + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (!(srcdst & SLJIT_MEM)) { + if (type & SLJIT_SIMD_STORE) + ins = F36(srcdst) | F32(freg); + else + ins = F36(freg) | F32(srcdst); + + return push_inst(compiler, 0xe70000000056 /* vlr */ | ins); + } + + FAIL_IF(make_addr_bx(compiler, &addr, srcdst, srcdstw, tmp1)); + ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset); + + if (alignment >= 4) + ins |= 4 << 12; + else if (alignment == 3) + ins |= 3 << 12; + + return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? 0xe7000000000e /* vst */ : 0xe70000000006 /* vl */) | ins); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + struct addr addr; + sljit_gpr reg; + sljit_sw sign_ext; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1)); + return push_inst(compiler, 0xe70000000005 /* vlrep */ | F36(freg) + | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset) | ((sljit_ins)elem_size << 12)); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (src == SLJIT_IMM) + return push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg)); + + return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(src) | ((sljit_ins)elem_size << 12)); + } + + if (src == SLJIT_IMM) { + sign_ext = 0x10000; + + switch (elem_size) { + case 0: + srcw &= 0xff; + sign_ext = (sljit_s8)srcw; + break; + case 1: + srcw &= 0xffff; + sign_ext = (sljit_s16)srcw; + break; + case 2: + if ((sljit_s32)srcw == (sljit_s16)srcw) { + srcw &= 0xffff; + sign_ext = (sljit_s16)srcw; + } else + srcw &= 0xffffffff; + break; + default: + if (srcw == (sljit_s16)srcw) { + srcw &= 0xffff; + sign_ext = (sljit_s16)srcw; + } + break; + } + + if (sign_ext != 0x10000) { + if (sign_ext == 0 || sign_ext == -1) + return push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg) + | (sign_ext == 0 ? 0 : ((sljit_ins)0xffff << 16))); + + return push_inst(compiler, 0xe70000000045 /* vrepi */ | F36(freg) + | ((sljit_ins)srcw << 16) | ((sljit_ins)elem_size << 12)); + } + + push_load_imm_inst(compiler, tmp0, srcw); + reg = tmp0; + } else + reg = gpr(src); + + FAIL_IF(push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(reg) | ((sljit_ins)elem_size << 12))); + return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(freg) | ((sljit_ins)elem_size << 12)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + struct addr addr; + sljit_gpr reg; + sljit_ins ins = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (srcdst & SLJIT_MEM) { + FAIL_IF(make_addr_bx(compiler, &addr, srcdst, srcdstw, tmp1)); + ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset); + } + + if (type & SLJIT_SIMD_LANE_ZERO) { + if ((srcdst & SLJIT_MEM) && lane_index == ((1 << (3 - elem_size)) - 1)) + return push_inst(compiler, 0xe70000000004 /* vllez */ | ins | ((sljit_ins)elem_size << 12)); + + if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) { + FAIL_IF(push_inst(compiler, 0xe70000000056 /* vlr */ | F36(TMP_FREG1) | F32(freg))); + srcdst = TMP_FREG1; + srcdstw = 0; + } + + FAIL_IF(push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg))); + } + + if (srcdst & SLJIT_MEM) { + switch (elem_size) { + case 0: + ins |= 0xe70000000000 /* vleb */; + break; + case 1: + ins |= 0xe70000000001 /* vleh */; + break; + case 2: + ins |= 0xe70000000003 /* vlef */; + break; + default: + ins |= 0xe70000000002 /* vleg */; + break; + } + + /* Convert to vsteb - vsteg */ + if (type & SLJIT_SIMD_STORE) + ins |= 0x8; + + return push_inst(compiler, ins | ((sljit_ins)lane_index << 12)); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (type & SLJIT_SIMD_STORE) + return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(srcdst) | F32(freg) | ((sljit_ins)lane_index << 16) | ((sljit_ins)elem_size << 12)); + + if (elem_size == 3) { + if (lane_index == 0) + ins = F32(srcdst) | F28(freg) | (1 << 12); + else + ins = F32(freg) | F28(srcdst); + + return push_inst(compiler, 0xe70000000084 /* vpdi */ | F36(freg) | ins); + } + + FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(tmp0) | F32(srcdst) | ((sljit_ins)2 << 12))); + return push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(tmp0) | ((sljit_ins)lane_index << 16) | ((sljit_ins)2 << 12)); + } + + if (srcdst == SLJIT_IMM) { + switch (elem_size) { + case 0: + ins = 0xe70000000040 /* vleib */; + srcdstw &= 0xff; + break; + case 1: + ins = 0xe70000000041 /* vleih */; + srcdstw &= 0xffff; + break; + case 2: + if ((sljit_s32)srcdstw == (sljit_s16)srcdstw) { + srcdstw &= 0xffff; + ins = 0xe70000000043 /* vleif */; + } else + srcdstw &= 0xffffffff; + break; + default: + if (srcdstw == (sljit_s16)srcdstw) { + srcdstw &= 0xffff; + ins = 0xe70000000042 /* vleig */; + } + break; + } + + if (ins != 0) + return push_inst(compiler, ins | F36(freg) | ((sljit_ins)srcdstw << 16) | ((sljit_ins)lane_index << 12)); + + push_load_imm_inst(compiler, tmp0, srcdstw); + reg = tmp0; + } else + reg = gpr(srcdst); + + ins = ((sljit_ins)lane_index << 16) | ((sljit_ins)elem_size << 12); + + if (!(type & SLJIT_SIMD_STORE)) + return push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(reg) | ins); + + FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(reg) | F32(freg) | ins)); + + if (!(type & SLJIT_SIMD_LANE_SIGNED) || elem_size >= 3) + return SLJIT_SUCCESS; + + switch (elem_size) { + case 0: + ins = 0xb9060000 /* lgbr */; + break; + case 1: + ins = 0xb9070000 /* lghr */; + break; + default: + ins = 0xb9140000 /* lgfr */; + break; + } + + return push_inst(compiler, ins | R4A(reg) | R0A(reg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(src) + | ((sljit_ins)src_lane_index << 16) | ((sljit_ins)elem_size << 12)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type); + struct addr addr; + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1)); + ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset); + + switch (elem2_size - elem_size) { + case 1: + ins |= 0xe70000000002 /* vleg */; + break; + case 2: + ins |= 0xe70000000003 /* vlef */; + break; + default: + ins |= 0xe70000000001 /* vleh */; + break; + } + + FAIL_IF(push_inst(compiler, ins)); + src = freg; + } + + if (type & SLJIT_SIMD_FLOAT) { + FAIL_IF(push_inst(compiler, 0xe700000000d5 /* vuplh */ | F36(freg) | F32(src) | (2 << 12))); + FAIL_IF(push_inst(compiler, 0xe70000000030 /* vesl */ | F36(freg) | F32(freg) | (32 << 16) | (3 << 12))); + return push_inst(compiler, 0xe700000000c4 /* vfll */ | F36(freg) | F32(freg) | (2 << 12)); + } + + ins = ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0xe700000000d7 /* vuph */ : 0xe700000000d5 /* vuplh */) | F36(freg); + + do { + FAIL_IF(push_inst(compiler, ins | F32(src) | ((sljit_ins)elem_size << 12))); + src = freg; + } while (++elem_size < elem2_size); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_gpr dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + switch (elem_size) { + case 0: + push_load_imm_inst(compiler, tmp0, (sljit_sw)0x4048505860687078); + push_load_imm_inst(compiler, tmp1, (sljit_sw)0x0008101820283038); + FAIL_IF(push_inst(compiler, 0xe70000000062 /* vlvgp */ | F36(TMP_FREG1) | R32A(tmp1) | R28A(tmp0))); + break; + case 1: + push_load_imm_inst(compiler, tmp0, (sljit_sw)0x0010203040506070); + break; + case 2: + push_load_imm_inst(compiler, tmp0, (sljit_sw)0x8080808000204060); + break; + default: + push_load_imm_inst(compiler, tmp0, (sljit_sw)0x8080808080800040); + break; + } + + if (elem_size != 0) + FAIL_IF(push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(TMP_FREG1) | R32A(tmp0) | (1 << 16) | (3 << 12))); + + FAIL_IF(push_inst(compiler, 0xe70000000085 /* vbperm */ | F36(TMP_FREG1) | F32(freg) | F28(TMP_FREG1))); + + dst_r = FAST_IS_REG(dst) ? gpr(dst) : tmp0; + FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(dst_r) | F32(TMP_FREG1) + | (elem_size == 0 ? ((3 << 16) | (1 << 12)) : (7 << 16)))); + + if (dst_r == tmp0) + return store_word(compiler, tmp0, dst, dstw, type & SLJIT_32); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_ins ins = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + + if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + switch (SLJIT_SIMD_GET_OPCODE(type)) { + case SLJIT_SIMD_OP2_AND: + ins = 0xe70000000068 /* vn */; + break; + case SLJIT_SIMD_OP2_OR: + ins = 0xe7000000006a /* vo */; + break; + case SLJIT_SIMD_OP2_XOR: + ins = 0xe7000000006d /* vx */; + break; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + return push_inst(compiler, ins | F36(dst_freg) | F32(src1_freg) | F28(src2_freg)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_op1(compiler, op, dst_reg, 0, SLJIT_MEM1(mem_reg), 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_ins mask; + sljit_gpr tmp_r = gpr(temp_reg); + sljit_gpr mem_r = gpr(mem_reg); + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV32: + case SLJIT_MOV_U32: + return push_inst(compiler, 0xba000000 /* cs */ | R20A(tmp_r) | R16A(gpr(src_reg)) | R12A(mem_r)); + case SLJIT_MOV_U8: + mask = 0xff; + break; + case SLJIT_MOV_U16: + mask = 0xffff; + break; + default: + return push_inst(compiler, 0xeb0000000030 /* csg */ | R36A(tmp_r) | R32A(gpr(src_reg)) | R28A(mem_r)); + } + + /* tmp0 = (src_reg ^ tmp_r) & mask */ + FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | mask)); + FAIL_IF(push_inst(compiler, 0xb9e70000 /* xgrk */ | R4A(tmp0) | R0A(gpr(src_reg)) | R12A(tmp_r))); + FAIL_IF(push_inst(compiler, 0xa7090000 /* lghi */ | R20A(tmp_r) | 0xfffc)); + FAIL_IF(push_inst(compiler, 0xb9800000 /* ngr */ | R4A(tmp0) | R0A(tmp1))); + + /* tmp0 = tmp0 << (((mem_r ^ 0x3) & 0x3) << 3) */ + FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | (sljit_ins)((mask == 0xff) ? 0x18 : 0x10))); + FAIL_IF(push_inst(compiler, 0xb9800000 /* ngr */ | R4A(tmp_r) | R0A(mem_r))); + FAIL_IF(push_inst(compiler, 0xec0000000057 /* rxsbg */ | R36A(tmp1) | R32A(mem_r) | (59 << 24) | (60 << 16) | (3 << 8))); + FAIL_IF(push_inst(compiler, 0xeb000000000d /* sllg */ | R36A(tmp0) | R32A(tmp0) | R28A(tmp1))); + + /* Already computed: tmp_r = mem_r & ~0x3 */ + + FAIL_IF(push_inst(compiler, 0x58000000 /* l */ | R20A(tmp1) | R12A(tmp_r))); + FAIL_IF(push_inst(compiler, 0x1700 /* x */ | R4A(tmp0) | R0A(tmp1))); + return push_inst(compiler, 0xba000000 /* cs */ | R20A(tmp1) | R16A(tmp0) | R12A(tmp_r)); +} + /* --------------------------------------------------------------------- */ /* Other instructions */ /* --------------------------------------------------------------------- */ @@ -3724,9 +4434,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; if (have_genext()) - PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | lgrl(dst_r, 0))); + PTR_FAIL_IF(push_inst(compiler, lgrl(dst_r, 0))); else { - PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | larl(tmp1, 0))); + PTR_FAIL_IF(push_inst(compiler, larl(tmp1, 0))); PTR_FAIL_IF(push_inst(compiler, lg(dst_r, 0, r0, tmp1))); } @@ -3753,20 +4463,18 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta sljit_set_jump_addr(addr, (sljit_uw)new_constant, executable_offset); } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label( - struct sljit_compiler *compiler, - sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_gpr dst_r; CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0; @@ -3780,7 +4488,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label( if (dst & SLJIT_MEM) PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0)); - return put_label; + return jump; } /* TODO(carenas): EVAL probably should move up or be refactored */ diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_32.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_32.c old mode 100644 new mode 100755 index 69c917101f..d7399f8210 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_32.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_32.c @@ -62,21 +62,19 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw /* Both size flags cannot be switched on. */ SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG)); /* SSE2 and immediate is not possible. */ - SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2)); - SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3) - && (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66) - && (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66)); + SLJIT_ASSERT(a != SLJIT_IMM || !(flags & EX86_SSE2)); + SLJIT_ASSERT(((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) + & ((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0); + SLJIT_ASSERT((flags & (EX86_VEX_EXT | EX86_REX)) != EX86_VEX_EXT); size &= 0xf; - inst_size = size; + /* The mod r/m byte is always present. */ + inst_size = size + 1; - if (flags & (EX86_PREF_F2 | EX86_PREF_F3)) - inst_size++; - if (flags & EX86_PREF_66) + if (flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) inst_size++; /* Calculate size of b. */ - inst_size += 1; /* mod r/m byte. */ if (b & SLJIT_MEM) { if (!(b & REG_MASK)) inst_size += sizeof(sljit_sw); @@ -87,8 +85,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw inst_size += sizeof(sljit_s8); else inst_size += sizeof(sljit_sw); - } - else if (reg_map[b & REG_MASK] == 5) { + } else if (reg_map[b & REG_MASK] == 5) { /* Swap registers if possible. */ if ((b & OFFS_REG_MASK) && (immb & 0x3) == 0 && reg_map[OFFS_REG(b)] != 5) b = SLJIT_MEM | OFFS_REG(b) | TO_OFFS_REG(b & REG_MASK); @@ -105,15 +102,14 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw } /* Calculate size of a. */ - if (a & SLJIT_IMM) { + if (a == SLJIT_IMM) { if (flags & EX86_BIN_INS) { if (imma <= 127 && imma >= -128) { inst_size += 1; flags |= EX86_BYTE_ARG; } else inst_size += 4; - } - else if (flags & EX86_SHIFT_INS) { + } else if (flags & EX86_SHIFT_INS) { SLJIT_ASSERT(imma <= 0x1f); if (imma != 1) { inst_size++; @@ -125,8 +121,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw inst_size += sizeof(short); else inst_size += sizeof(sljit_sw); - } - else + } else SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size); @@ -136,27 +131,26 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw INC_SIZE(inst_size); if (flags & EX86_PREF_F2) *inst++ = 0xf2; - if (flags & EX86_PREF_F3) + else if (flags & EX86_PREF_F3) *inst++ = 0xf3; - if (flags & EX86_PREF_66) + else if (flags & EX86_PREF_66) *inst++ = 0x66; buf_ptr = inst + size; /* Encode mod/rm byte. */ if (!(flags & EX86_SHIFT_INS)) { - if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM)) + if ((flags & EX86_BIN_INS) && a == SLJIT_IMM) *inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81; - if (a & SLJIT_IMM) + if (a == SLJIT_IMM) *buf_ptr = 0; else if (!(flags & EX86_SSE2_OP1)) *buf_ptr = U8(reg_map[a] << 3); else - *buf_ptr = U8(a << 3); - } - else { - if (a & SLJIT_IMM) { + *buf_ptr = U8(freg_map[a] << 3); + } else { + if (a == SLJIT_IMM) { if (imma == 1) *inst = GROUP_SHIFT_1; else @@ -167,7 +161,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw } if (!(b & SLJIT_MEM)) { - *buf_ptr = U8(*buf_ptr | MOD_REG | (!(flags & EX86_SSE2_OP2) ? reg_map[b] : b)); + *buf_ptr = U8(*buf_ptr | MOD_REG | (!(flags & EX86_SSE2_OP2) ? reg_map[b] : freg_map[b])); buf_ptr++; } else if (b & REG_MASK) { reg_map_b = reg_map[b & REG_MASK]; @@ -183,8 +177,9 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw if (!(b & OFFS_REG_MASK)) *buf_ptr++ |= reg_map_b; else { - *buf_ptr++ |= 0x04; - *buf_ptr++ = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3)); + buf_ptr[0] |= 0x04; + buf_ptr[1] = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3)); + buf_ptr += 2; } if (immb != 0 || reg_map_b == 5) { @@ -195,25 +190,24 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw buf_ptr += sizeof(sljit_sw); } } - } - else { + } else { if (reg_map_b == 5) *buf_ptr |= 0x40; - *buf_ptr++ |= 0x04; - *buf_ptr++ = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3) | (immb << 6)); + buf_ptr[0] |= 0x04; + buf_ptr[1] = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3) | (immb << 6)); + buf_ptr += 2; if (reg_map_b == 5) *buf_ptr++ = 0; } - } - else { + } else { *buf_ptr++ |= 0x05; sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */ buf_ptr += sizeof(sljit_sw); } - if (a & SLJIT_IMM) { + if (a == SLJIT_IMM) { if (flags & EX86_BYTE_ARG) *buf_ptr = U8(imma); else if (flags & EX86_HALF_ARG) @@ -222,35 +216,92 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw sljit_unaligned_store_sw(buf_ptr, imma); } - return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1); + return inst; +} + +static sljit_s32 emit_vex_instruction(struct sljit_compiler *compiler, sljit_uw op, + /* The first and second register operand. */ + sljit_s32 a, sljit_s32 v, + /* The general operand (not immediate). */ + sljit_s32 b, sljit_sw immb) +{ + sljit_u8 *inst; + sljit_u8 vex = 0; + sljit_u8 vex_m = 0; + sljit_uw size; + + SLJIT_ASSERT(((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) + & ((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0); + + if (op & VEX_OP_0F38) + vex_m = 0x2; + else if (op & VEX_OP_0F3A) + vex_m = 0x3; + + if (op & VEX_W) { + if (vex_m == 0) + vex_m = 0x1; + + vex |= 0x80; + } + + if (op & EX86_PREF_66) + vex |= 0x1; + else if (op & EX86_PREF_F2) + vex |= 0x3; + else if (op & EX86_PREF_F3) + vex |= 0x2; + + op &= ~(EX86_PREF_66 | EX86_PREF_F2 | EX86_PREF_F3); + + if (op & VEX_256) + vex |= 0x4; + + vex = U8(vex | ((((op & VEX_SSE2_OPV) ? freg_map[v] : reg_map[v]) ^ 0xf) << 3)); + + size = op & ~(sljit_uw)0xff; + size |= (vex_m == 0) ? 3 : 4; + + inst = emit_x86_instruction(compiler, size, a, 0, b, immb); + FAIL_IF(!inst); + + if (vex_m == 0) { + inst[0] = 0xc5; + inst[1] = U8(vex | 0x80); + inst[2] = U8(op); + return SLJIT_SUCCESS; + } + + inst[0] = 0xc4; + inst[1] = U8(vex_m | 0xe0); + inst[2] = vex; + inst[3] = U8(op); + return SLJIT_SUCCESS; } /* --------------------------------------------------------------------- */ /* Enter / return */ /* --------------------------------------------------------------------- */ -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset) +static sljit_u8* detect_far_jump_type(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset) { sljit_uw type = jump->flags >> TYPE_SHIFT; if (type == SLJIT_JUMP) { *code_ptr++ = JMP_i32; - jump->addr++; - } - else if (type >= SLJIT_FAST_CALL) { + } else if (type >= SLJIT_FAST_CALL) { *code_ptr++ = CALL_i32; - jump->addr++; - } - else { + } else { *code_ptr++ = GROUP_0F; *code_ptr++ = get_jump_code(type); - jump->addr += 2; } - if (jump->flags & JUMP_LABEL) - jump->flags |= PATCH_MW; - else + jump->addr = (sljit_uw)code_ptr; + + if (jump->flags & JUMP_ADDR) sljit_unaligned_store_sw(code_ptr, (sljit_sw)(jump->u.target - (jump->addr + 4) - (sljit_uw)executable_offset)); + else + jump->flags |= PATCH_MW; code_ptr += 4; return code_ptr; @@ -578,8 +629,6 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler) { - sljit_u8 *inst; - CHECK_ERROR(); CHECK(check_sljit_emit_return_void(compiler)); @@ -588,11 +637,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler FAIL_IF(emit_stack_frame_release(compiler, 0)); - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - RET(); - return SLJIT_SUCCESS; + return emit_byte(compiler, RET_near); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, @@ -782,7 +827,7 @@ static sljit_s32 tail_call_with_args(struct sljit_compiler *compiler, offset = stack_size + compiler->local_size; - if (!(src & SLJIT_IMM) && src != SLJIT_R0) { + if (src != SLJIT_IMM && src != SLJIT_R0) { if (word_arg_count >= 1) { EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R0, 0); r2_offset = sizeof(sljit_sw); @@ -836,7 +881,7 @@ static sljit_s32 tail_call_with_args(struct sljit_compiler *compiler, stack_size = args_size + SSIZE_OF(sw); - if (word_arg_count >= 1 && !(src & SLJIT_IMM) && src != SLJIT_R0) { + if (word_arg_count >= 1 && src != SLJIT_IMM && src != SLJIT_R0) { r2_offset = SSIZE_OF(sw); stack_size += SSIZE_OF(sw); } @@ -865,7 +910,7 @@ static sljit_s32 tail_call_with_args(struct sljit_compiler *compiler, EMIT_MOV(compiler, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), word_arg4_offset); } - if (!(src & SLJIT_IMM) && src != SLJIT_R0) { + if (src != SLJIT_IMM && src != SLJIT_R0) { if (word_arg_count >= 1) { SLJIT_ASSERT(r2_offset == sizeof(sljit_sw)); EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R0, 0); @@ -952,13 +997,7 @@ static sljit_s32 emit_tail_call_end(struct sljit_compiler *compiler, sljit_s32 e sljit_u8 *inst; BINARY_IMM32(ADD, extra_space, SLJIT_SP, 0); - - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - RET(); - - return SLJIT_SUCCESS; + return emit_byte(compiler, RET_near); } static sljit_s32 tail_call_reg_arg_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) @@ -1075,7 +1114,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compi stack_size = type; FAIL_IF(tail_call_with_args(compiler, &stack_size, arg_types, src, srcw)); - if (!(src & SLJIT_IMM)) { + if (src != SLJIT_IMM) { src = SLJIT_R0; srcw = 0; } @@ -1148,15 +1187,9 @@ static sljit_s32 emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, CHECK_EXTRA_REGS(dst, dstw, (void)0); - if (FAST_IS_REG(dst)) { - /* Unused dest is possible here. */ - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - - INC_SIZE(1); - POP_REG(reg_map[dst]); - return SLJIT_SUCCESS; - } + /* Unused dest is possible here. */ + if (FAST_IS_REG(dst)) + return emit_byte(compiler, U8(POP_r + reg_map[dst])); /* Memory. */ inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw); @@ -1291,6 +1324,201 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile return SLJIT_SUCCESS; } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG; + sljit_u8 *inst, *jump_inst1, *jump_inst2; + sljit_uw size1, size2; + + /* Binary representation of 0x80000000. */ + static const sljit_f64 f64_high_bit = (sljit_f64)0x80000000ul; + + CHECK_EXTRA_REGS(src, srcw, (void)0); + + if (!(op & SLJIT_32)) { + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0); + FAIL_IF(!inst); + inst[1] |= ROL; + + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0); + FAIL_IF(!inst); + inst[1] |= SHR; + + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_PREF_F2 | EX86_SSE2_OP1, dst_r, TMP_REG1, 0)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = U8(get_jump_code(SLJIT_NOT_CARRY) - 0x10); + + size1 = compiler->size; + FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_PREF_F2 | EX86_SSE2, dst_r, SLJIT_MEM0(), (sljit_sw)&f64_high_bit)); + + inst[1] = U8(compiler->size - size1); + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, 0, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; + } + + if (!FAST_IS_REG(src)) { + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + src = TMP_REG1; + } + + BINARY_IMM32(CMP, 0, src, 0); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = JL_i8; + jump_inst1 = inst; + + size1 = compiler->size; + + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, 0)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = JMP_i8; + jump_inst2 = inst; + + size2 = compiler->size; + + jump_inst1[1] = U8(size2 - size1); + + if (src != TMP_REG1) + EMIT_MOV(compiler, TMP_REG1, 0, src, 0); + + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0); + FAIL_IF(!inst); + inst[1] |= SHR; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = JNC_i8; + jump_inst1 = inst; + + size1 = compiler->size; + + BINARY_IMM32(OR, 1, TMP_REG1, 0); + jump_inst1[1] = U8(compiler->size - size1); + + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0)); + FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, dst_r, 0)); + + jump_inst2[1] = U8(compiler->size - size2); + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + sljit_u8 *inst; + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm != 0) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + + inst[0] = GROUP_66; + inst[1] = GROUP_0F; + + if (u.imm == 0) { + inst[2] = PXOR_x_xm; + inst[3] = U8(freg | (freg << 3) | MOD_REG); + } else { + inst[2] = MOVD_x_rm; + inst[3] = U8(reg_map[TMP_REG1] | (freg << 3) | MOD_REG); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + sljit_u8 *inst; + sljit_s32 tmp_freg = freg; + union { + sljit_s32 imm[2]; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm[0] == 0) { + if (u.imm[1] == 0) + return emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0); + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[1]); + } else + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[0]); + + FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, TMP_REG1, 0)); + + if (u.imm[1] == 0) + return SLJIT_SUCCESS; + + if (u.imm[0] == 0) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + + inst[0] = GROUP_0F; + inst[1] = SHUFPS_x_xm; + inst[2] = U8(MOD_REG | (freg << 3) | freg); + inst[3] = 0x51; + return SLJIT_SUCCESS; + } + + if (u.imm[0] != u.imm[1]) { + SLJIT_ASSERT(u.imm[1] != 0 && cpu_feature_list != 0); + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[1]); + + if (cpu_feature_list & CPU_FEATURE_SSE41) { + FAIL_IF(emit_groupf_ext(compiler, PINSRD_x_rm_i8 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2_OP1, freg, TMP_REG1, 0)); + return emit_byte(compiler, 1); + } + + FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, TMP_REG1, 0)); + tmp_freg = TMP_FREG; + } + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 3); + FAIL_IF(!inst); + INC_SIZE(3); + + inst[0] = GROUP_0F; + inst[1] = UNPCKLPS_x_xm; + inst[2] = U8(MOD_REG | (freg << 3) | tmp_freg); + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { @@ -1305,6 +1533,27 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi reg2 = 0; reg2w = 0; + SLJIT_ASSERT(cpu_feature_list != 0); + + if (!(op & SLJIT_32) && (cpu_feature_list & CPU_FEATURE_SSE41)) { + if (reg & REG_PAIR_MASK) { + reg2 = REG_PAIR_FIRST(reg); + reg = REG_PAIR_SECOND(reg); + + CHECK_EXTRA_REGS(reg, regw, (void)0); + + FAIL_IF(emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x) + | EX86_PREF_66 | EX86_SSE2_OP1, freg, reg, regw)); + } else + reg2 = reg; + + CHECK_EXTRA_REGS(reg2, reg2w, (void)0); + + FAIL_IF(emit_groupf_ext(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? PINSRD_x_rm_i8 : PEXTRD_rm_x_i8) + | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2_OP1, freg, reg2, reg2w)); + return emit_byte(compiler, 1); + } + if (reg & REG_PAIR_MASK) { reg2 = REG_PAIR_SECOND(reg); reg = REG_PAIR_FIRST(reg); @@ -1317,12 +1566,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi CHECK_EXTRA_REGS(reg, regw, (void)0); - if (op & SLJIT_32) { - inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, reg, regw); - inst[0] = GROUP_0F; - inst[1] = GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x; - return SLJIT_SUCCESS; - } + if (op & SLJIT_32) + return emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x) + | EX86_PREF_66 | EX86_SSE2_OP1, freg, reg, regw); if (op == SLJIT_COPY_FROM_F64) { inst = (sljit_u8*)ensure_buf(compiler, 1 + 5); @@ -1334,32 +1580,23 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compi inst[2] = PSHUFD_x_xm; inst[3] = U8(MOD_REG | (TMP_FREG << 3) | freg); inst[4] = 1; - } else if (reg != 0) { - inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, 0, reg, regw); - inst[0] = GROUP_0F; - inst[1] = MOVD_x_rm; - } + } else if (reg != 0) + FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, reg, regw)); - if (reg2 != 0) { - inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, reg2, reg2w); - inst[0] = GROUP_0F; - inst[1] = GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x; - } + if (reg2 != 0) + FAIL_IF(emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x) + | EX86_PREF_66 | EX86_SSE2_OP1, freg, reg2, reg2w)); if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) { - inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + inst = (sljit_u8*)ensure_buf(compiler, 1 + 3); FAIL_IF(!inst); - INC_SIZE(4); + INC_SIZE(3); - inst[0] = GROUP_66; - inst[1] = GROUP_0F; - inst[2] = PUNPCKLDQ_x_xm; - inst[3] = U8(MOD_REG | (freg << 3) | (reg == 0 ? freg : TMP_FREG)); - } else { - inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, 0, reg, regw); inst[0] = GROUP_0F; - inst[1] = MOVD_rm_x; - } + inst[1] = UNPCKLPS_x_xm; + inst[2] = U8(MOD_REG | (freg << 3) | (reg == 0 ? freg : TMP_FREG)); + } else + FAIL_IF(emit_groupf(compiler, MOVD_rm_x | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, reg, regw)); return SLJIT_SUCCESS; } diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_64.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_64.c old mode 100644 new mode 100755 index b5efc1fda1..b537a1a3f8 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_64.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_64.c @@ -38,7 +38,7 @@ static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg, FAIL_IF(!inst); INC_SIZE(2 + sizeof(sljit_sw)); inst[0] = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B); - inst[1] = U8(MOV_r_i32 | (reg_map[reg] & 0x7)); + inst[1] = U8(MOV_r_i32 | reg_lmap[reg]); sljit_unaligned_store_sw(inst + 2, imm); return SLJIT_SUCCESS; } @@ -72,7 +72,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw sljit_uw inst_size; /* The immediate operand must be 32 bit. */ - SLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma)); + SLJIT_ASSERT(a != SLJIT_IMM || compiler->mode32 || IS_HALFWORD(imma)); /* Both cannot be switched on. */ SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS)); /* Size flags not allowed for typed instructions. */ @@ -80,26 +80,24 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw /* Both size flags cannot be switched on. */ SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG)); /* SSE2 and immediate is not possible. */ - SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2)); - SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3) - && (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66) - && (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66)); + SLJIT_ASSERT(a != SLJIT_IMM || !(flags & EX86_SSE2)); + SLJIT_ASSERT(((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) + & ((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0); + SLJIT_ASSERT((flags & (EX86_VEX_EXT | EX86_REX)) != EX86_VEX_EXT); size &= 0xf; - inst_size = size; + /* The mod r/m byte is always present. */ + inst_size = size + 1; if (!compiler->mode32 && !(flags & EX86_NO_REXW)) rex |= REX_W; else if (flags & EX86_REX) rex |= REX; - if (flags & (EX86_PREF_F2 | EX86_PREF_F3)) - inst_size++; - if (flags & EX86_PREF_66) + if (flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) inst_size++; /* Calculate size of b. */ - inst_size += 1; /* mod r/m byte. */ if (b & SLJIT_MEM) { if (!(b & OFFS_REG_MASK) && NOT_HALFWORD(immb)) { PTR_FAIL_IF(emit_load_imm64(compiler, TMP_REG2, immb)); @@ -119,8 +117,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw inst_size += sizeof(sljit_s8); else inst_size += sizeof(sljit_s32); - } - else if (reg_lmap[b & REG_MASK] == 5) { + } else if (reg_lmap[b & REG_MASK] == 5) { /* Swap registers if possible. */ if ((b & OFFS_REG_MASK) && (immb & 0x3) == 0 && reg_lmap[OFFS_REG(b)] != 5) b = SLJIT_MEM | OFFS_REG(b) | TO_OFFS_REG(b & REG_MASK); @@ -140,23 +137,26 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw rex |= REX_X; } } - } - else if (!(flags & EX86_SSE2_OP2)) { + } else if (!(flags & EX86_SSE2_OP2)) { if (reg_map[b] >= 8) rex |= REX_B; - } - else if (freg_map[b] >= 8) + } else if (freg_map[b] >= 8) rex |= REX_B; - if (a & SLJIT_IMM) { + if ((flags & EX86_VEX_EXT) && (rex & 0x3)) { + SLJIT_ASSERT(size == 2); + size++; + inst_size++; + } + + if (a == SLJIT_IMM) { if (flags & EX86_BIN_INS) { if (imma <= 127 && imma >= -128) { inst_size += 1; flags |= EX86_BYTE_ARG; } else inst_size += 4; - } - else if (flags & EX86_SHIFT_INS) { + } else if (flags & EX86_SHIFT_INS) { SLJIT_ASSERT(imma <= (compiler->mode32 ? 0x1f : 0x3f)); if (imma != 1) { inst_size++; @@ -168,8 +168,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw inst_size += sizeof(short); else inst_size += sizeof(sljit_s32); - } - else { + } else { SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); /* reg_map[SLJIT_PREF_SHIFT_REG] is less than 8. */ if (!(flags & EX86_SSE2_OP1)) { @@ -186,14 +185,16 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size); PTR_FAIL_IF(!inst); - /* Encoding the byte. */ + /* Encoding prefixes. */ INC_SIZE(inst_size); if (flags & EX86_PREF_F2) *inst++ = 0xf2; - if (flags & EX86_PREF_F3) + else if (flags & EX86_PREF_F3) *inst++ = 0xf3; - if (flags & EX86_PREF_66) + else if (flags & EX86_PREF_66) *inst++ = 0x66; + + /* Rex is always the last prefix. */ if (rex) *inst++ = rex; @@ -201,18 +202,17 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw /* Encode mod/rm byte. */ if (!(flags & EX86_SHIFT_INS)) { - if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM)) + if ((flags & EX86_BIN_INS) && a == SLJIT_IMM) *inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81; - if (a & SLJIT_IMM) + if (a == SLJIT_IMM) *buf_ptr = 0; else if (!(flags & EX86_SSE2_OP1)) *buf_ptr = U8(reg_lmap[a] << 3); else *buf_ptr = U8(freg_lmap[a] << 3); - } - else { - if (a & SLJIT_IMM) { + } else { + if (a == SLJIT_IMM) { if (imma == 1) *inst = GROUP_SHIFT_1; else @@ -239,8 +239,9 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw if (!(b & OFFS_REG_MASK)) *buf_ptr++ |= reg_lmap_b; else { - *buf_ptr++ |= 0x04; - *buf_ptr++ = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3)); + buf_ptr[0] |= 0x04; + buf_ptr[1] = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3)); + buf_ptr += 2; } if (immb != 0 || reg_lmap_b == 5) { @@ -251,26 +252,26 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw buf_ptr += sizeof(sljit_s32); } } - } - else { + } else { if (reg_lmap_b == 5) *buf_ptr |= 0x40; - *buf_ptr++ |= 0x04; - *buf_ptr++ = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6)); + buf_ptr[0] |= 0x04; + buf_ptr[1] = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6)); + buf_ptr += 2; if (reg_lmap_b == 5) *buf_ptr++ = 0; } - } - else { - *buf_ptr++ |= 0x04; - *buf_ptr++ = 0x25; + } else { + buf_ptr[0] |= 0x04; + buf_ptr[1] = 0x25; + buf_ptr += 2; sljit_unaligned_store_s32(buf_ptr, (sljit_s32)immb); /* 32 bit displacement. */ buf_ptr += sizeof(sljit_s32); } - if (a & SLJIT_IMM) { + if (a == SLJIT_IMM) { if (flags & EX86_BYTE_ARG) *buf_ptr = U8(imma); else if (flags & EX86_HALF_ARG) @@ -279,33 +280,106 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_uw sljit_unaligned_store_s32(buf_ptr, (sljit_s32)imma); } - return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1); + return inst; +} + +static sljit_s32 emit_vex_instruction(struct sljit_compiler *compiler, sljit_uw op, + /* The first and second register operand. */ + sljit_s32 a, sljit_s32 v, + /* The general operand (not immediate). */ + sljit_s32 b, sljit_sw immb) +{ + sljit_u8 *inst; + sljit_u8 vex = 0; + sljit_u8 vex_m = 0; + sljit_uw size; + + SLJIT_ASSERT(((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) + & ((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0); + + op |= EX86_REX; + + if (op & VEX_OP_0F38) + vex_m = 0x2; + else if (op & VEX_OP_0F3A) + vex_m = 0x3; + + if ((op & VEX_W) || ((op & VEX_AUTO_W) && !compiler->mode32)) { + if (vex_m == 0) + vex_m = 0x1; + + vex |= 0x80; + } + + if (op & EX86_PREF_66) + vex |= 0x1; + else if (op & EX86_PREF_F2) + vex |= 0x3; + else if (op & EX86_PREF_F3) + vex |= 0x2; + + op &= ~(EX86_PREF_66 | EX86_PREF_F2 | EX86_PREF_F3); + + if (op & VEX_256) + vex |= 0x4; + + vex = U8(vex | ((((op & VEX_SSE2_OPV) ? freg_map[v] : reg_map[v]) ^ 0xf) << 3)); + + size = op & ~(sljit_uw)0xff; + size |= (vex_m == 0) ? (EX86_VEX_EXT | 2) : 3; + + inst = emit_x86_instruction(compiler, size, a, 0, b, immb); + FAIL_IF(!inst); + + SLJIT_ASSERT((inst[-1] & 0xf0) == REX); + + /* If X or B is present in REX prefix. */ + if (vex_m == 0 && inst[-1] & 0x3) + vex_m = 0x1; + + if (vex_m == 0) { + vex |= U8(((inst[-1] >> 2) ^ 0x1) << 7); + + inst[-1] = 0xc5; + inst[0] = vex; + inst[1] = U8(op); + return SLJIT_SUCCESS; + } + + vex_m |= U8((inst[-1] ^ 0x7) << 5); + inst[-1] = 0xc4; + inst[0] = vex_m; + inst[1] = vex; + inst[2] = U8(op); + return SLJIT_SUCCESS; } /* --------------------------------------------------------------------- */ /* Enter / return */ /* --------------------------------------------------------------------- */ -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr) +static sljit_u8* detect_far_jump_type(struct sljit_jump *jump, sljit_u8 *code_ptr) { sljit_uw type = jump->flags >> TYPE_SHIFT; - int short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && !(jump->flags & JUMP_LABEL) && (jump->u.target <= 0xffffffff); + int short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && (jump->flags & JUMP_ADDR) && (jump->u.target <= 0xffffffff); /* The relative jump below specialized for this case. */ SLJIT_ASSERT(reg_map[TMP_REG2] >= 8); if (type < SLJIT_JUMP) { /* Invert type. */ - *code_ptr++ = U8(get_jump_code(type ^ 0x1) - 0x10); - *code_ptr++ = short_addr ? (6 + 3) : (10 + 3); + code_ptr[0] = U8(get_jump_code(type ^ 0x1) - 0x10); + code_ptr[1] = short_addr ? (6 + 3) : (10 + 3); + code_ptr += 2; } - *code_ptr++ = short_addr ? REX_B : (REX_W | REX_B); - *code_ptr++ = MOV_r_i32 | reg_lmap[TMP_REG2]; + code_ptr[0] = short_addr ? REX_B : (REX_W | REX_B); + code_ptr[1] = MOV_r_i32 | reg_lmap[TMP_REG2]; + code_ptr += 2; jump->addr = (sljit_uw)code_ptr; - if (jump->flags & JUMP_LABEL) + if (!(jump->flags & JUMP_ADDR)) jump->flags |= PATCH_MD; else if (short_addr) sljit_unaligned_store_s32(code_ptr, (sljit_s32)jump->u.target); @@ -314,60 +388,62 @@ static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ code_ptr += short_addr ? sizeof(sljit_s32) : sizeof(sljit_sw); - *code_ptr++ = REX_B; - *code_ptr++ = GROUP_FF; - *code_ptr++ = U8(MOD_REG | (type >= SLJIT_FAST_CALL ? CALL_rm : JMP_rm) | reg_lmap[TMP_REG2]); + code_ptr[0] = REX_B; + code_ptr[1] = GROUP_FF; + code_ptr[2] = U8(MOD_REG | (type >= SLJIT_FAST_CALL ? CALL_rm : JMP_rm) | reg_lmap[TMP_REG2]); - return code_ptr; + return code_ptr + 3; } -static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label) +static sljit_u8* generate_mov_addr_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset) { - if (max_label > HALFWORD_MAX) { - put_label->addr -= put_label->flags; - put_label->flags = PATCH_MD; + sljit_uw addr; + sljit_sw diff; + SLJIT_UNUSED_ARG(executable_offset); + + SLJIT_ASSERT(((jump->flags >> JUMP_SIZE_SHIFT) & 0x1f) <= 10); + if (jump->flags & JUMP_ADDR) + addr = jump->u.target; + else + addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + jump->u.label->size; + + if (addr > 0xffffffffl) { + diff = (sljit_sw)addr - (sljit_sw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + if (diff <= HALFWORD_MAX && diff >= HALFWORD_MIN) { + SLJIT_ASSERT(((jump->flags >> JUMP_SIZE_SHIFT) & 0x1f) >= 7); + code_ptr -= SSIZE_OF(s32) - 1; + + SLJIT_ASSERT((code_ptr[-3 - SSIZE_OF(s32)] & 0xf8) == REX_W); + SLJIT_ASSERT((code_ptr[-2 - SSIZE_OF(s32)] & 0xf8) == MOV_r_i32); + + code_ptr[-3 - SSIZE_OF(s32)] = U8(REX_W | ((code_ptr[-3 - SSIZE_OF(s32)] & 0x1) << 2)); + code_ptr[-1 - SSIZE_OF(s32)] = U8(((code_ptr[-2 - SSIZE_OF(s32)] & 0x7) << 3) | 0x5); + code_ptr[-2 - SSIZE_OF(s32)] = LEA_r_m; + + jump->flags |= PATCH_MW; + return code_ptr; + } + + jump->flags |= PATCH_MD; return code_ptr; } - if (put_label->flags == 0) { - /* Destination is register. */ - code_ptr = (sljit_u8*)put_label->addr - 2 - sizeof(sljit_uw); - - SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); - SLJIT_ASSERT((code_ptr[1] & 0xf8) == MOV_r_i32); - - if ((code_ptr[0] & 0x07) != 0) { - code_ptr[0] = U8(code_ptr[0] & ~0x08); - code_ptr += 2 + sizeof(sljit_s32); - } - else { - code_ptr[0] = code_ptr[1]; - code_ptr += 1 + sizeof(sljit_s32); - } - - put_label->addr = (sljit_uw)code_ptr; - return code_ptr; - } - - code_ptr -= put_label->flags + (2 + sizeof(sljit_uw)); - SLJIT_MEMMOVE(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags); + code_ptr -= 2 + sizeof(sljit_uw); SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + SLJIT_ASSERT((code_ptr[1] & 0xf8) == MOV_r_i32); - if ((code_ptr[1] & 0xf8) == MOV_r_i32) { - code_ptr += 2 + sizeof(sljit_uw); - SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + if ((code_ptr[0] & 0x07) != 0) { + SLJIT_ASSERT(((jump->flags >> JUMP_SIZE_SHIFT) & 0x1f) >= 6); + code_ptr[0] = U8(code_ptr[0] & ~0x08); + code_ptr += 2 + sizeof(sljit_s32); + } else { + SLJIT_ASSERT(((jump->flags >> JUMP_SIZE_SHIFT) & 0x1f) >= 5); + code_ptr[0] = code_ptr[1]; + code_ptr += 1 + sizeof(sljit_s32); } - SLJIT_ASSERT(code_ptr[1] == MOV_rm_r); - - code_ptr[0] = U8(code_ptr[0] & ~0x4); - code_ptr[1] = MOV_rm_i32; - code_ptr[2] = U8(code_ptr[2] & ~(0x7 << 3)); - - code_ptr = (sljit_u8*)(put_label->addr - (2 + sizeof(sljit_uw)) + sizeof(sljit_s32)); - put_label->addr = (sljit_uw)code_ptr; - put_label->flags = 0; return code_ptr; } @@ -539,16 +615,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi tmp = SLJIT_FS0 - fsaveds; for (i = SLJIT_FS0; i > tmp; i--) { - inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset); - inst[0] = GROUP_0F; - inst[1] = MOVAPS_xm_x; + FAIL_IF(emit_groupf(compiler, MOVAPS_xm_x | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset)); saved_float_regs_offset += 16; } for (i = fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) { - inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset); - inst[0] = GROUP_0F; - inst[1] = MOVAPS_xm_x; + FAIL_IF(emit_groupf(compiler, MOVAPS_xm_x | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset)); saved_float_regs_offset += 16; } } @@ -606,16 +678,12 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit tmp = SLJIT_FS0 - fsaveds; for (i = SLJIT_FS0; i > tmp; i--) { - inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset); - inst[0] = GROUP_0F; - inst[1] = MOVAPS_x_xm; + FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset)); saved_float_regs_offset += 16; } for (i = fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) { - inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset); - inst[0] = GROUP_0F; - inst[1] = MOVAPS_x_xm; + FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset)); saved_float_regs_offset += 16; } @@ -663,20 +731,13 @@ static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler) { - sljit_u8 *inst; - CHECK_ERROR(); CHECK(check_sljit_emit_return_void(compiler)); compiler->mode32 = 0; FAIL_IF(emit_stack_frame_release(compiler, 0)); - - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - RET(); - return SLJIT_SUCCESS; + return emit_byte(compiler, RET_near); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, @@ -875,13 +936,8 @@ static sljit_s32 emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_u8 *inst; if (FAST_IS_REG(dst)) { - if (reg_map[dst] < 8) { - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - POP_REG(reg_lmap[dst]); - return SLJIT_SUCCESS; - } + if (reg_map[dst] < 8) + return emit_byte(compiler, U8(POP_r + reg_lmap[dst])); inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); FAIL_IF(!inst); @@ -1040,15 +1096,15 @@ static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign, compiler->mode32 = 0; - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { if (FAST_IS_REG(dst)) { - if (sign || ((sljit_uw)srcw <= 0x7fffffff)) { - inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw); - FAIL_IF(!inst); - *inst = MOV_rm_i32; - return SLJIT_SUCCESS; - } - return emit_load_imm64(compiler, dst, srcw); + if (!sign || ((sljit_u32)srcw <= 0x7fffffff)) + return emit_do_imm32(compiler, reg_map[dst] <= 7 ? 0 : REX_B, U8(MOV_r_i32 | reg_lmap[dst]), srcw); + + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; } compiler->mode32 = 1; inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw); @@ -1069,7 +1125,7 @@ static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign, *inst = MOVSXD_r_rm; } else { compiler->mode32 = 1; - FAIL_IF(emit_mov(compiler, dst_r, 0, src, srcw)); + EMIT_MOV(compiler, dst_r, 0, src, srcw); compiler->mode32 = 0; } } @@ -1085,6 +1141,168 @@ static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign, return SLJIT_SUCCESS; } +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG; + sljit_u8 *inst, *jump_inst1, *jump_inst2; + sljit_uw size1, size2; + + compiler->mode32 = 0; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) { + if (src != SLJIT_IMM) { + compiler->mode32 = 1; + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + compiler->mode32 = 0; + } else + FAIL_IF(emit_do_imm32(compiler, reg_map[TMP_REG1] <= 7 ? 0 : REX_B, U8(MOV_r_i32 | reg_lmap[TMP_REG1]), srcw)); + + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0)); + + compiler->mode32 = 1; + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; + } + + if (!FAST_IS_REG(src)) { + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + src = TMP_REG1; + } + + BINARY_IMM32(CMP, 0, src, 0); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = JL_i8; + jump_inst1 = inst; + + size1 = compiler->size; + + compiler->mode32 = 0; + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, 0)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = JMP_i8; + jump_inst2 = inst; + + size2 = compiler->size; + + jump_inst1[1] = U8(size2 - size1); + + if (src != TMP_REG1) + EMIT_MOV(compiler, TMP_REG1, 0, src, 0); + + EMIT_MOV(compiler, TMP_REG2, 0, src, 0); + + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0); + FAIL_IF(!inst); + inst[1] |= SHR; + + compiler->mode32 = 1; + BINARY_IMM32(AND, 1, TMP_REG2, 0); + + compiler->mode32 = 0; + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG2, 0); + FAIL_IF(!inst); + inst[0] = OR_r_rm; + + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0)); + compiler->mode32 = 1; + FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, dst_r, 0)); + + jump_inst2[1] = U8(compiler->size - size2); + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; +} + +static sljit_s32 sljit_emit_fset(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_u8 rex, sljit_s32 is_zero) +{ + sljit_u8 *inst; + sljit_u32 size; + + if (is_zero) { + rex = freg_map[freg] >= 8 ? (REX_R | REX_B) : 0; + } else { + if (freg_map[freg] >= 8) + rex |= REX_R; + if (reg_map[TMP_REG1] >= 8) + rex |= REX_B; + } + + size = (rex != 0) ? 5 : 4; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + + *inst++ = GROUP_66; + if (rex != 0) + *inst++ = rex; + inst[0] = GROUP_0F; + + if (is_zero) { + inst[1] = PXOR_x_xm; + inst[2] = U8(freg_lmap[freg] | (freg_lmap[freg] << 3) | MOD_REG); + } else { + inst[1] = MOVD_x_rm; + inst[2] = U8(reg_lmap[TMP_REG1] | (freg_lmap[freg] << 3) | MOD_REG); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f32 value) +{ + union { + sljit_s32 imm; + sljit_f32 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset32(compiler, freg, value)); + + u.value = value; + + if (u.imm != 0) { + compiler->mode32 = 1; + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm); + } + + return sljit_emit_fset(compiler, freg, 0, u.imm == 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, + sljit_s32 freg, sljit_f64 value) +{ + union { + sljit_sw imm; + sljit_f64 value; + } u; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fset64(compiler, freg, value)); + + u.value = value; + + if (u.imm != 0) { + compiler->mode32 = 0; + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm); + } + + return sljit_emit_fset(compiler, freg, REX_W, u.imm == 0); +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg) { diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_common.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_common.c old mode 100644 new mode 100755 index a9645bc175..5e63067124 --- a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_common.c +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitNativeX86_common.c @@ -61,17 +61,20 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) 15 - R15 */ -#define TMP_FREG (0) +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_FREG (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) -/* Last register + 1. */ -#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = { 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 5, 7, 6, 4, 3 }; +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = { + 0, 1, 2, 3, 4, 5, 6, 7, 0 +}; + #define CHECK_EXTRA_REGS(p, w, do) \ if (p >= SLJIT_R3 && p <= SLJIT_S3) { \ w = (2 * SSIZE_OF(sw)) + ((p) - SLJIT_R3) * SSIZE_OF(sw); \ @@ -81,12 +84,10 @@ static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = { #else /* SLJIT_CONFIG_X86_32 */ -/* Last register + 1. */ -#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) /* Note: r12 & 0x7 == 0b100, which decoded as SIB byte present - Note: avoid to use r12 and r13 for memory addessing + Note: avoid to use r12 and r13 for memory addressing therefore r12 is better to be a higher saved register. */ #ifndef _WIN64 /* Args: rdi(=7), rsi(=6), rdx(=2), rcx(=1), r8, r9. Scratches: rax(=0), r10, r11 */ @@ -95,7 +96,7 @@ static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { }; /* low-map. reg_map & 0x7. */ static const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = { - 0, 0, 6, 7, 1, 0, 3, 2, 4, 5, 5, 6, 7, 3, 4, 2, 1 + 0, 0, 6, 7, 1, 0, 3, 2, 4, 5, 5, 6, 7, 3, 4, 2, 1 }; #else /* Args: rcx(=1), rdx(=2), r8, r9. Scratches: rax(=0), r10, r11 */ @@ -109,12 +110,12 @@ static const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = { #endif /* Args: xmm0-xmm3 */ -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { - 4, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = { + 0, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4 }; /* low-map. freg_map & 0x7. */ -static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { - 4, 0, 1, 2, 3, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 +static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = { + 0, 0, 1, 2, 3, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 4 }; #define REX_W 0x48 @@ -140,161 +141,242 @@ static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { #define U8(v) ((sljit_u8)(v)) - /* Size flags for emit_x86_instruction: */ -#define EX86_BIN_INS 0x0010 -#define EX86_SHIFT_INS 0x0020 -#define EX86_REX 0x0040 -#define EX86_NO_REXW 0x0080 -#define EX86_BYTE_ARG 0x0100 -#define EX86_HALF_ARG 0x0200 -#define EX86_PREF_66 0x0400 -#define EX86_PREF_F2 0x0800 -#define EX86_PREF_F3 0x1000 -#define EX86_SSE2_OP1 0x2000 -#define EX86_SSE2_OP2 0x4000 +#define EX86_BIN_INS ((sljit_uw)0x000010) +#define EX86_SHIFT_INS ((sljit_uw)0x000020) +#define EX86_BYTE_ARG ((sljit_uw)0x000040) +#define EX86_HALF_ARG ((sljit_uw)0x000080) +/* Size flags for both emit_x86_instruction and emit_vex_instruction: */ +#define EX86_REX ((sljit_uw)0x000100) +#define EX86_NO_REXW ((sljit_uw)0x000200) +#define EX86_PREF_66 ((sljit_uw)0x000400) +#define EX86_PREF_F2 ((sljit_uw)0x000800) +#define EX86_PREF_F3 ((sljit_uw)0x001000) +#define EX86_SSE2_OP1 ((sljit_uw)0x002000) +#define EX86_SSE2_OP2 ((sljit_uw)0x004000) #define EX86_SSE2 (EX86_SSE2_OP1 | EX86_SSE2_OP2) +#define EX86_VEX_EXT ((sljit_uw)0x008000) +/* Op flags for emit_vex_instruction: */ +#define VEX_OP_0F38 ((sljit_uw)0x010000) +#define VEX_OP_0F3A ((sljit_uw)0x020000) +#define VEX_SSE2_OPV ((sljit_uw)0x040000) +#define VEX_AUTO_W ((sljit_uw)0x080000) +#define VEX_W ((sljit_uw)0x100000) +#define VEX_256 ((sljit_uw)0x200000) + +#define EX86_SELECT_66(op) (((op) & SLJIT_32) ? 0 : EX86_PREF_66) +#define EX86_SELECT_F2_F3(op) (((op) & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2) /* --------------------------------------------------------------------- */ -/* Instrucion forms */ +/* Instruction forms */ /* --------------------------------------------------------------------- */ -#define ADD (/* BINARY */ 0 << 3) -#define ADD_EAX_i32 0x05 -#define ADD_r_rm 0x03 -#define ADD_rm_r 0x01 -#define ADDSD_x_xm 0x58 -#define ADC (/* BINARY */ 2 << 3) -#define ADC_EAX_i32 0x15 -#define ADC_r_rm 0x13 -#define ADC_rm_r 0x11 -#define AND (/* BINARY */ 4 << 3) -#define AND_EAX_i32 0x25 -#define AND_r_rm 0x23 -#define AND_rm_r 0x21 -#define ANDPD_x_xm 0x54 -#define BSR_r_rm (/* GROUP_0F */ 0xbd) -#define BSF_r_rm (/* GROUP_0F */ 0xbc) -#define BSWAP_r (/* GROUP_0F */ 0xc8) -#define CALL_i32 0xe8 -#define CALL_rm (/* GROUP_FF */ 2 << 3) -#define CDQ 0x99 -#define CMOVE_r_rm (/* GROUP_0F */ 0x44) -#define CMP (/* BINARY */ 7 << 3) -#define CMP_EAX_i32 0x3d -#define CMP_r_rm 0x3b -#define CMP_rm_r 0x39 -#define CVTPD2PS_x_xm 0x5a -#define CVTSI2SD_x_rm 0x2a -#define CVTTSD2SI_r_xm 0x2c -#define DIV (/* GROUP_F7 */ 6 << 3) -#define DIVSD_x_xm 0x5e -#define FLDS 0xd9 -#define FLDL 0xdd -#define FSTPS 0xd9 -#define FSTPD 0xdd -#define INT3 0xcc -#define IDIV (/* GROUP_F7 */ 7 << 3) -#define IMUL (/* GROUP_F7 */ 5 << 3) -#define IMUL_r_rm (/* GROUP_0F */ 0xaf) -#define IMUL_r_rm_i8 0x6b -#define IMUL_r_rm_i32 0x69 -#define JE_i8 0x74 -#define JNE_i8 0x75 -#define JMP_i8 0xeb -#define JMP_i32 0xe9 -#define JMP_rm (/* GROUP_FF */ 4 << 3) -#define LEA_r_m 0x8d -#define LOOP_i8 0xe2 -#define LZCNT_r_rm (/* GROUP_F3 */ /* GROUP_0F */ 0xbd) -#define MOV_r_rm 0x8b -#define MOV_r_i32 0xb8 -#define MOV_rm_r 0x89 -#define MOV_rm_i32 0xc7 -#define MOV_rm8_i8 0xc6 -#define MOV_rm8_r8 0x88 -#define MOVAPS_x_xm 0x28 -#define MOVAPS_xm_x 0x29 -#define MOVD_x_rm 0x6e -#define MOVD_rm_x 0x7e -#define MOVSD_x_xm 0x10 -#define MOVSD_xm_x 0x11 -#define MOVSXD_r_rm 0x63 -#define MOVSX_r_rm8 (/* GROUP_0F */ 0xbe) -#define MOVSX_r_rm16 (/* GROUP_0F */ 0xbf) -#define MOVZX_r_rm8 (/* GROUP_0F */ 0xb6) -#define MOVZX_r_rm16 (/* GROUP_0F */ 0xb7) -#define MUL (/* GROUP_F7 */ 4 << 3) -#define MULSD_x_xm 0x59 -#define NEG_rm (/* GROUP_F7 */ 3 << 3) -#define NOP 0x90 -#define NOT_rm (/* GROUP_F7 */ 2 << 3) -#define OR (/* BINARY */ 1 << 3) -#define OR_r_rm 0x0b -#define OR_EAX_i32 0x0d -#define OR_rm_r 0x09 -#define OR_rm8_r8 0x08 -#define POP_r 0x58 -#define POP_rm 0x8f -#define POPF 0x9d -#define PREFETCH 0x18 -#define PSHUFD_x_xm 0x70 -#define PUNPCKLDQ_x_xm 0x62 -#define PUSH_i32 0x68 -#define PUSH_r 0x50 -#define PUSH_rm (/* GROUP_FF */ 6 << 3) -#define PUSHF 0x9c -#define ROL (/* SHIFT */ 0 << 3) -#define ROR (/* SHIFT */ 1 << 3) -#define RET_near 0xc3 -#define RET_i16 0xc2 -#define SBB (/* BINARY */ 3 << 3) -#define SBB_EAX_i32 0x1d -#define SBB_r_rm 0x1b -#define SBB_rm_r 0x19 -#define SAR (/* SHIFT */ 7 << 3) -#define SHL (/* SHIFT */ 4 << 3) -#define SHLD (/* GROUP_0F */ 0xa5) -#define SHRD (/* GROUP_0F */ 0xad) -#define SHR (/* SHIFT */ 5 << 3) -#define SUB (/* BINARY */ 5 << 3) -#define SUB_EAX_i32 0x2d -#define SUB_r_rm 0x2b -#define SUB_rm_r 0x29 -#define SUBSD_x_xm 0x5c -#define TEST_EAX_i32 0xa9 -#define TEST_rm_r 0x85 -#define TZCNT_r_rm (/* GROUP_F3 */ /* GROUP_0F */ 0xbc) -#define UCOMISD_x_xm 0x2e -#define UNPCKLPD_x_xm 0x14 -#define XCHG_EAX_r 0x90 -#define XCHG_r_rm 0x87 -#define XOR (/* BINARY */ 6 << 3) -#define XOR_EAX_i32 0x35 -#define XOR_r_rm 0x33 -#define XOR_rm_r 0x31 -#define XORPD_x_xm 0x57 +#define ADD (/* BINARY */ 0 << 3) +#define ADD_EAX_i32 0x05 +#define ADD_r_rm 0x03 +#define ADD_rm_r 0x01 +#define ADDSD_x_xm 0x58 +#define ADC (/* BINARY */ 2 << 3) +#define ADC_EAX_i32 0x15 +#define ADC_r_rm 0x13 +#define ADC_rm_r 0x11 +#define AND (/* BINARY */ 4 << 3) +#define AND_EAX_i32 0x25 +#define AND_r_rm 0x23 +#define AND_rm_r 0x21 +#define ANDPD_x_xm 0x54 +#define BSR_r_rm (/* GROUP_0F */ 0xbd) +#define BSF_r_rm (/* GROUP_0F */ 0xbc) +#define BSWAP_r (/* GROUP_0F */ 0xc8) +#define CALL_i32 0xe8 +#define CALL_rm (/* GROUP_FF */ 2 << 3) +#define CDQ 0x99 +#define CMOVE_r_rm (/* GROUP_0F */ 0x44) +#define CMP (/* BINARY */ 7 << 3) +#define CMP_EAX_i32 0x3d +#define CMP_r_rm 0x3b +#define CMP_rm_r 0x39 +#define CMPS_x_xm 0xc2 +#define CMPXCHG_rm_r 0xb1 +#define CMPXCHG_rm8_r 0xb0 +#define CVTPD2PS_x_xm 0x5a +#define CVTPS2PD_x_xm 0x5a +#define CVTSI2SD_x_rm 0x2a +#define CVTTSD2SI_r_xm 0x2c +#define DIV (/* GROUP_F7 */ 6 << 3) +#define DIVSD_x_xm 0x5e +#define EXTRACTPS_x_xm 0x17 +#define FLDS 0xd9 +#define FLDL 0xdd +#define FSTPS 0xd9 +#define FSTPD 0xdd +#define INSERTPS_x_xm 0x21 +#define INT3 0xcc +#define IDIV (/* GROUP_F7 */ 7 << 3) +#define IMUL (/* GROUP_F7 */ 5 << 3) +#define IMUL_r_rm (/* GROUP_0F */ 0xaf) +#define IMUL_r_rm_i8 0x6b +#define IMUL_r_rm_i32 0x69 +#define JL_i8 0x7c +#define JE_i8 0x74 +#define JNC_i8 0x73 +#define JNE_i8 0x75 +#define JMP_i8 0xeb +#define JMP_i32 0xe9 +#define JMP_rm (/* GROUP_FF */ 4 << 3) +#define LEA_r_m 0x8d +#define LOOP_i8 0xe2 +#define LZCNT_r_rm (/* GROUP_F3 */ /* GROUP_0F */ 0xbd) +#define MOV_r_rm 0x8b +#define MOV_r_i32 0xb8 +#define MOV_rm_r 0x89 +#define MOV_rm_i32 0xc7 +#define MOV_rm8_i8 0xc6 +#define MOV_rm8_r8 0x88 +#define MOVAPS_x_xm 0x28 +#define MOVAPS_xm_x 0x29 +#define MOVD_x_rm 0x6e +#define MOVD_rm_x 0x7e +#define MOVDDUP_x_xm 0x12 +#define MOVDQA_x_xm 0x6f +#define MOVDQA_xm_x 0x7f +#define MOVHLPS_x_x 0x12 +#define MOVHPD_m_x 0x17 +#define MOVHPD_x_m 0x16 +#define MOVLHPS_x_x 0x16 +#define MOVLPD_m_x 0x13 +#define MOVLPD_x_m 0x12 +#define MOVMSKPS_r_x (/* GROUP_0F */ 0x50) +#define MOVQ_x_xm (/* GROUP_0F */ 0x7e) +#define MOVSD_x_xm 0x10 +#define MOVSD_xm_x 0x11 +#define MOVSHDUP_x_xm 0x16 +#define MOVSXD_r_rm 0x63 +#define MOVSX_r_rm8 (/* GROUP_0F */ 0xbe) +#define MOVSX_r_rm16 (/* GROUP_0F */ 0xbf) +#define MOVUPS_x_xm 0x10 +#define MOVZX_r_rm8 (/* GROUP_0F */ 0xb6) +#define MOVZX_r_rm16 (/* GROUP_0F */ 0xb7) +#define MUL (/* GROUP_F7 */ 4 << 3) +#define MULSD_x_xm 0x59 +#define NEG_rm (/* GROUP_F7 */ 3 << 3) +#define NOP 0x90 +#define NOT_rm (/* GROUP_F7 */ 2 << 3) +#define OR (/* BINARY */ 1 << 3) +#define OR_r_rm 0x0b +#define OR_EAX_i32 0x0d +#define OR_rm_r 0x09 +#define OR_rm8_r8 0x08 +#define ORPD_x_xm 0x56 +#define PACKSSWB_x_xm (/* GROUP_0F */ 0x63) +#define PAND_x_xm 0xdb +#define PCMPEQD_x_xm 0x76 +#define PINSRB_x_rm_i8 0x20 +#define PINSRW_x_rm_i8 0xc4 +#define PINSRD_x_rm_i8 0x22 +#define PEXTRB_rm_x_i8 0x14 +#define PEXTRW_rm_x_i8 0x15 +#define PEXTRD_rm_x_i8 0x16 +#define PMOVMSKB_r_x (/* GROUP_0F */ 0xd7) +#define PMOVSXBD_x_xm 0x21 +#define PMOVSXBQ_x_xm 0x22 +#define PMOVSXBW_x_xm 0x20 +#define PMOVSXDQ_x_xm 0x25 +#define PMOVSXWD_x_xm 0x23 +#define PMOVSXWQ_x_xm 0x24 +#define PMOVZXBD_x_xm 0x31 +#define PMOVZXBQ_x_xm 0x32 +#define PMOVZXBW_x_xm 0x30 +#define PMOVZXDQ_x_xm 0x35 +#define PMOVZXWD_x_xm 0x33 +#define PMOVZXWQ_x_xm 0x34 +#define POP_r 0x58 +#define POP_rm 0x8f +#define POPF 0x9d +#define POR_x_xm 0xeb +#define PREFETCH 0x18 +#define PSHUFB_x_xm 0x00 +#define PSHUFD_x_xm 0x70 +#define PSHUFLW_x_xm 0x70 +#define PSRLDQ_x 0x73 +#define PSLLD_x_i8 0x72 +#define PSLLQ_x_i8 0x73 +#define PUSH_i32 0x68 +#define PUSH_r 0x50 +#define PUSH_rm (/* GROUP_FF */ 6 << 3) +#define PUSHF 0x9c +#define PXOR_x_xm 0xef +#define ROL (/* SHIFT */ 0 << 3) +#define ROR (/* SHIFT */ 1 << 3) +#define RET_near 0xc3 +#define RET_i16 0xc2 +#define SBB (/* BINARY */ 3 << 3) +#define SBB_EAX_i32 0x1d +#define SBB_r_rm 0x1b +#define SBB_rm_r 0x19 +#define SAR (/* SHIFT */ 7 << 3) +#define SHL (/* SHIFT */ 4 << 3) +#define SHLD (/* GROUP_0F */ 0xa5) +#define SHRD (/* GROUP_0F */ 0xad) +#define SHR (/* SHIFT */ 5 << 3) +#define SHUFPS_x_xm 0xc6 +#define SUB (/* BINARY */ 5 << 3) +#define SUB_EAX_i32 0x2d +#define SUB_r_rm 0x2b +#define SUB_rm_r 0x29 +#define SUBSD_x_xm 0x5c +#define TEST_EAX_i32 0xa9 +#define TEST_rm_r 0x85 +#define TZCNT_r_rm (/* GROUP_F3 */ /* GROUP_0F */ 0xbc) +#define UCOMISD_x_xm 0x2e +#define UNPCKLPD_x_xm 0x14 +#define UNPCKLPS_x_xm 0x14 +#define VBROADCASTSD_x_xm 0x19 +#define VBROADCASTSS_x_xm 0x18 +#define VEXTRACTF128_x_ym 0x19 +#define VEXTRACTI128_x_ym 0x39 +#define VINSERTF128_y_y_xm 0x18 +#define VINSERTI128_y_y_xm 0x38 +#define VPBROADCASTB_x_xm 0x78 +#define VPBROADCASTD_x_xm 0x58 +#define VPBROADCASTQ_x_xm 0x59 +#define VPBROADCASTW_x_xm 0x79 +#define VPERMPD_y_ym 0x01 +#define VPERMQ_y_ym 0x00 +#define XCHG_EAX_r 0x90 +#define XCHG_r_rm 0x87 +#define XOR (/* BINARY */ 6 << 3) +#define XOR_EAX_i32 0x35 +#define XOR_r_rm 0x33 +#define XOR_rm_r 0x31 +#define XORPD_x_xm 0x57 -#define GROUP_0F 0x0f -#define GROUP_66 0x66 -#define GROUP_F3 0xf3 -#define GROUP_F7 0xf7 -#define GROUP_FF 0xff -#define GROUP_BINARY_81 0x81 -#define GROUP_BINARY_83 0x83 -#define GROUP_SHIFT_1 0xd1 -#define GROUP_SHIFT_N 0xc1 -#define GROUP_SHIFT_CL 0xd3 +#define GROUP_0F 0x0f +#define GROUP_66 0x66 +#define GROUP_F3 0xf3 +#define GROUP_F7 0xf7 +#define GROUP_FF 0xff +#define GROUP_BINARY_81 0x81 +#define GROUP_BINARY_83 0x83 +#define GROUP_SHIFT_1 0xd1 +#define GROUP_SHIFT_N 0xc1 +#define GROUP_SHIFT_CL 0xd3 +#define GROUP_LOCK 0xf0 -#define MOD_REG 0xc0 -#define MOD_DISP8 0x40 +#define MOD_REG 0xc0 +#define MOD_DISP8 0x40 -#define INC_SIZE(s) (*inst++ = U8(s), compiler->size += (s)) +#define INC_SIZE(s) (*inst++ = U8(s), compiler->size += (s)) -#define PUSH_REG(r) (*inst++ = U8(PUSH_r + (r))) -#define POP_REG(r) (*inst++ = U8(POP_r + (r))) -#define RET() (*inst++ = RET_near) -#define RET_I16(n) (*inst++ = RET_i16, *inst++ = U8(n), *inst++ = 0) +#define PUSH_REG(r) (*inst++ = U8(PUSH_r + (r))) +#define POP_REG(r) (*inst++ = U8(POP_r + (r))) +#define RET() (*inst++ = RET_near) +#define RET_I16(n) (*inst++ = RET_i16, *inst++ = U8(n), *inst++ = 0) + +#define SLJIT_INST_LABEL 255 +#define SLJIT_INST_JUMP 254 +#define SLJIT_INST_MOV_ADDR 253 +#define SLJIT_INST_CONST 252 /* Multithreading does not affect these static variables, since they store built-in CPU features. Therefore they can be overwritten by different threads @@ -303,9 +385,12 @@ static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) #define CPU_FEATURE_SSE2 0x002 #endif -#define CPU_FEATURE_LZCNT 0x004 -#define CPU_FEATURE_TZCNT 0x008 -#define CPU_FEATURE_CMOV 0x010 +#define CPU_FEATURE_SSE41 0x004 +#define CPU_FEATURE_LZCNT 0x008 +#define CPU_FEATURE_TZCNT 0x010 +#define CPU_FEATURE_CMOV 0x020 +#define CPU_FEATURE_AVX 0x040 +#define CPU_FEATURE_AVX2 0x080 static sljit_u32 cpu_feature_list = 0; @@ -338,124 +423,117 @@ static SLJIT_INLINE void sljit_unaligned_store_sw(void *addr, sljit_sw value) /* Utility functions */ /******************************************************/ -static void get_cpu_features(void) +static void execute_cpu_id(sljit_u32 info[4]) { - sljit_u32 feature_list = CPU_FEATURE_DETECTED; - sljit_u32 value; - #if defined(_MSC_VER) && _MSC_VER >= 1400 - int CPUInfo[4]; - - __cpuid(CPUInfo, 0); - if (CPUInfo[0] >= 7) { - __cpuidex(CPUInfo, 7, 0); - if (CPUInfo[1] & 0x8) - feature_list |= CPU_FEATURE_TZCNT; - } - - __cpuid(CPUInfo, (int)0x80000001); - if (CPUInfo[2] & 0x20) - feature_list |= CPU_FEATURE_LZCNT; - - __cpuid(CPUInfo, 1); - value = (sljit_u32)CPUInfo[3]; + __cpuidex((int*)info, (int)info[0], (int)info[2]); #elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C) || defined(__TINYC__) /* AT&T syntax. */ __asm__ ( - "movl $0x0, %%eax\n" - "lzcnt %%eax, %%eax\n" - "setnz %%al\n" - "movl %%eax, %0\n" - : "=g" (value) - : #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - : "eax" -#else - : "rax" -#endif - ); - - if (value & 0x1) - feature_list |= CPU_FEATURE_LZCNT; - - __asm__ ( - "movl $0x0, %%eax\n" - "tzcnt %%eax, %%eax\n" - "setnz %%al\n" - "movl %%eax, %0\n" - : "=g" (value) - : -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - : "eax" -#else - : "rax" -#endif - ); - - if (value & 0x1) - feature_list |= CPU_FEATURE_TZCNT; - - __asm__ ( - "movl $0x1, %%eax\n" -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - /* On x86-32, there is no red zone, so this - should work (no need for a local variable). */ - "push %%ebx\n" -#endif + "movl %0, %%esi\n" + "movl (%%esi), %%eax\n" + "movl 8(%%esi), %%ecx\n" + "pushl %%ebx\n" "cpuid\n" -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - "pop %%ebx\n" -#endif - "movl %%edx, %0\n" - : "=g" (value) + "movl %%eax, (%%esi)\n" + "movl %%ebx, 4(%%esi)\n" + "popl %%ebx\n" + "movl %%ecx, 8(%%esi)\n" + "movl %%edx, 12(%%esi)\n" +#else /* !SLJIT_CONFIG_X86_32 */ + "movq %0, %%rsi\n" + "movl (%%rsi), %%eax\n" + "movl 8(%%rsi), %%ecx\n" + "cpuid\n" + "movl %%eax, (%%rsi)\n" + "movl %%ebx, 4(%%rsi)\n" + "movl %%ecx, 8(%%rsi)\n" + "movl %%edx, 12(%%rsi)\n" +#endif /* SLJIT_CONFIG_X86_32 */ : + : "r" (info) #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - : "eax", "ecx", "edx" -#else - : "rax", "rbx", "rcx", "rdx" -#endif + : "memory", "eax", "ecx", "edx", "esi" +#else /* !SLJIT_CONFIG_X86_32 */ + : "memory", "rax", "rbx", "rcx", "rdx", "rsi" +#endif /* SLJIT_CONFIG_X86_32 */ ); -#else /* _MSC_VER && _MSC_VER >= 1400 */ +#else /* _MSC_VER < 1400 */ /* Intel syntax. */ __asm { - mov eax, 0 - lzcnt eax, eax - setnz al - mov value, eax - } - - if (value & 0x1) - feature_list |= CPU_FEATURE_LZCNT; - - __asm { - mov eax, 0 - tzcnt eax, eax - setnz al - mov value, eax - } - - if (value & 0x1) - feature_list |= CPU_FEATURE_TZCNT; - - __asm { - mov eax, 1 +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + mov esi, info + mov eax, [esi] + mov ecx, [esi + 8] cpuid - mov value, edx + mov [esi], eax + mov [esi + 4], ebx + mov [esi + 8], ecx + mov [esi + 12], edx +#else /* !SLJIT_CONFIG_X86_32 */ + mov rsi, info + mov eax, [rsi] + mov ecx, [rsi + 8] + cpuid + mov [rsi], eax + mov [rsi + 4], ebx + mov [rsi + 8], ecx + mov [rsi + 12], edx +#endif /* SLJIT_CONFIG_X86_32 */ } #endif /* _MSC_VER && _MSC_VER >= 1400 */ +} +static void get_cpu_features(void) +{ + sljit_u32 feature_list = CPU_FEATURE_DETECTED; + sljit_u32 info[4]; + sljit_u32 max_id; + + info[0] = 0; + execute_cpu_id(info); + max_id = info[0]; + + if (max_id >= 7) { + info[0] = 7; + info[2] = 0; + execute_cpu_id(info); + + if (info[1] & 0x8) + feature_list |= CPU_FEATURE_TZCNT; + if (info[1] & 0x20) + feature_list |= CPU_FEATURE_AVX2; + } + + if (max_id >= 1) { + info[0] = 1; + execute_cpu_id(info); + + if (info[2] & 0x80000) + feature_list |= CPU_FEATURE_SSE41; + if (info[2] & 0x10000000) + feature_list |= CPU_FEATURE_AVX; #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) - if (value & 0x4000000) - feature_list |= CPU_FEATURE_SSE2; + if (info[3] & 0x4000000) + feature_list |= CPU_FEATURE_SSE2; #endif - if (value & 0x8000) - feature_list |= CPU_FEATURE_CMOV; + if (info[3] & 0x8000) + feature_list |= CPU_FEATURE_CMOV; + } + + info[0] = 0x80000001; + info[2] = 0; /* Silences an incorrect compiler warning. */ + execute_cpu_id(info); + + if (info[2] & 0x20) + feature_list |= CPU_FEATURE_LZCNT; cpu_feature_list = feature_list; } @@ -464,15 +542,15 @@ static sljit_u8 get_jump_code(sljit_uw type) { switch (type) { case SLJIT_EQUAL: + case SLJIT_ATOMIC_STORED: case SLJIT_F_EQUAL: case SLJIT_UNORDERED_OR_EQUAL: - case SLJIT_ORDERED_EQUAL: /* Not supported. */ return 0x84 /* je */; case SLJIT_NOT_EQUAL: + case SLJIT_ATOMIC_NOT_STORED: case SLJIT_F_NOT_EQUAL: case SLJIT_ORDERED_NOT_EQUAL: - case SLJIT_UNORDERED_OR_NOT_EQUAL: /* Not supported. */ return 0x85 /* jne */; case SLJIT_LESS: @@ -520,61 +598,58 @@ static sljit_u8 get_jump_code(sljit_uw type) return 0x81 /* jno */; case SLJIT_UNORDERED: + case SLJIT_ORDERED_EQUAL: /* NaN. */ return 0x8a /* jp */; case SLJIT_ORDERED: + case SLJIT_UNORDERED_OR_NOT_EQUAL: /* Not NaN. */ return 0x8b /* jpo */; } return 0; } #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset); -#else -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr); -static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label); -#endif +static sljit_u8* detect_far_jump_type(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset); +#else /* !SLJIT_CONFIG_X86_32 */ +static sljit_u8* detect_far_jump_type(struct sljit_jump *jump, sljit_u8 *code_ptr); +static sljit_u8* generate_mov_addr_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset); +#endif /* SLJIT_CONFIG_X86_32 */ -static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset) +static sljit_u8* detect_near_jump_type(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset) { sljit_uw type = jump->flags >> TYPE_SHIFT; sljit_s32 short_jump; sljit_uw label_addr; - if (jump->flags & JUMP_LABEL) - label_addr = (sljit_uw)(code + jump->u.label->size); - else + if (jump->flags & JUMP_ADDR) label_addr = jump->u.target - (sljit_uw)executable_offset; + else + label_addr = (sljit_uw)(code + jump->u.label->size); #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN) - return generate_far_jump_code(jump, code_ptr); -#endif + if ((sljit_sw)(label_addr - (sljit_uw)(code_ptr + 6)) > HALFWORD_MAX || (sljit_sw)(label_addr - (sljit_uw)(code_ptr + 5)) < HALFWORD_MIN) + return detect_far_jump_type(jump, code_ptr); +#endif /* SLJIT_CONFIG_X86_64 */ - short_jump = (sljit_sw)(label_addr - (jump->addr + 2)) >= -128 && (sljit_sw)(label_addr - (jump->addr + 2)) <= 127; + short_jump = (sljit_sw)(label_addr - (sljit_uw)(code_ptr + 2)) >= -0x80 && (sljit_sw)(label_addr - (sljit_uw)(code_ptr + 2)) <= 0x7f; if (type == SLJIT_JUMP) { if (short_jump) *code_ptr++ = JMP_i8; else *code_ptr++ = JMP_i32; - jump->addr++; - } - else if (type >= SLJIT_FAST_CALL) { + } else if (type > SLJIT_JUMP) { short_jump = 0; *code_ptr++ = CALL_i32; - jump->addr++; - } - else if (short_jump) { + } else if (short_jump) { *code_ptr++ = U8(get_jump_code(type) - 0x10); - jump->addr++; - } - else { + } else { *code_ptr++ = GROUP_0F; *code_ptr++ = get_jump_code(type); - jump->addr += 2; } + jump->addr = (sljit_uw)code_ptr; + if (short_jump) { jump->flags |= PATCH_MB; code_ptr += sizeof(sljit_s8); @@ -586,6 +661,171 @@ static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code return code_ptr; } +static void generate_jump_or_mov_addr(struct sljit_jump *jump, sljit_sw executable_offset) +{ + sljit_uw flags = jump->flags; + sljit_uw addr = (flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr; + sljit_uw jump_addr = jump->addr; + SLJIT_UNUSED_ARG(executable_offset); + + if (SLJIT_UNLIKELY(flags & JUMP_MOV_ADDR)) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)(jump_addr - sizeof(sljit_sw)), (sljit_sw)addr); +#else /* SLJIT_CONFIG_X86_32 */ + if (flags & PATCH_MD) { + SLJIT_ASSERT(addr > HALFWORD_MAX); + sljit_unaligned_store_sw((void*)(jump_addr - sizeof(sljit_sw)), (sljit_sw)addr); + return; + } + + if (flags & PATCH_MW) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET((sljit_u8*)jump_addr, executable_offset); + SLJIT_ASSERT((sljit_sw)addr <= HALFWORD_MAX && (sljit_sw)addr >= HALFWORD_MIN); + } else { + SLJIT_ASSERT(addr <= HALFWORD_MAX); + } + sljit_unaligned_store_s32((void*)(jump_addr - sizeof(sljit_s32)), (sljit_s32)addr); +#endif /* !SLJIT_CONFIG_X86_32 */ + return; + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (SLJIT_UNLIKELY(flags & PATCH_MD)) { + SLJIT_ASSERT(!(flags & JUMP_ADDR)); + sljit_unaligned_store_sw((void*)jump_addr, (sljit_sw)addr); + return; + } +#endif /* SLJIT_CONFIG_X86_64 */ + + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET((sljit_u8*)jump_addr, executable_offset); + + if (flags & PATCH_MB) { + addr -= sizeof(sljit_s8); + SLJIT_ASSERT((sljit_sw)addr <= 0x7f && (sljit_sw)addr >= -0x80); + *(sljit_u8*)jump_addr = U8(addr); + return; + } else if (flags & PATCH_MW) { + addr -= sizeof(sljit_s32); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)jump_addr, (sljit_sw)addr); +#else /* !SLJIT_CONFIG_X86_32 */ + SLJIT_ASSERT((sljit_sw)addr <= HALFWORD_MAX && (sljit_sw)addr >= HALFWORD_MIN); + sljit_unaligned_store_s32((void*)jump_addr, (sljit_s32)addr); +#endif /* SLJIT_CONFIG_X86_32 */ + } +} + +static void reduce_code_size(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + struct sljit_jump *jump; + sljit_uw next_label_size; + sljit_uw next_jump_addr; + sljit_uw next_min_addr; + sljit_uw size_reduce = 0; + sljit_sw diff; + sljit_uw type; +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + sljit_uw size_reduce_max; +#endif /* SLJIT_DEBUG */ + + label = compiler->labels; + jump = compiler->jumps; + + next_label_size = SLJIT_GET_NEXT_SIZE(label); + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + + while (1) { + next_min_addr = next_label_size; + if (next_jump_addr < next_min_addr) + next_min_addr = next_jump_addr; + + if (next_min_addr == SLJIT_MAX_ADDRESS) + break; + + if (next_min_addr == next_label_size) { + label->size -= size_reduce; + + label = label->next; + next_label_size = SLJIT_GET_NEXT_SIZE(label); + } + + if (next_min_addr != next_jump_addr) + continue; + + if (!(jump->flags & JUMP_MOV_ADDR)) { +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + size_reduce_max = size_reduce + (((jump->flags >> TYPE_SHIFT) < SLJIT_JUMP) ? CJUMP_MAX_SIZE : JUMP_MAX_SIZE); +#endif /* SLJIT_DEBUG */ + + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) { + if (jump->flags & JUMP_ADDR) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (jump->u.target <= 0xffffffffl) + size_reduce += sizeof(sljit_s32); +#endif /* SLJIT_CONFIG_X86_64 */ + } else { + /* Unit size: instruction. */ + diff = (sljit_sw)jump->u.label->size - (sljit_sw)(jump->addr - size_reduce); + type = jump->flags >> TYPE_SHIFT; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (type == SLJIT_JUMP) { + if (diff <= 0x7f + 2 && diff >= -0x80 + 2) + size_reduce += JUMP_MAX_SIZE - 2; + else if (diff <= HALFWORD_MAX + 5 && diff >= HALFWORD_MIN + 5) + size_reduce += JUMP_MAX_SIZE - 5; + } else if (type < SLJIT_JUMP) { + if (diff <= 0x7f + 2 && diff >= -0x80 + 2) + size_reduce += CJUMP_MAX_SIZE - 2; + else if (diff <= HALFWORD_MAX + 6 && diff >= HALFWORD_MIN + 6) + size_reduce += CJUMP_MAX_SIZE - 6; + } else { + if (diff <= HALFWORD_MAX + 5 && diff >= HALFWORD_MIN + 5) + size_reduce += JUMP_MAX_SIZE - 5; + } +#else /* !SLJIT_CONFIG_X86_64 */ + if (type == SLJIT_JUMP) { + if (diff <= 0x7f + 2 && diff >= -0x80 + 2) + size_reduce += JUMP_MAX_SIZE - 2; + } else if (type < SLJIT_JUMP) { + if (diff <= 0x7f + 2 && diff >= -0x80 + 2) + size_reduce += CJUMP_MAX_SIZE - 2; + } +#endif /* SLJIT_CONFIG_X86_64 */ + } + } + +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + jump->flags |= (size_reduce_max - size_reduce) << JUMP_SIZE_SHIFT; +#endif /* SLJIT_DEBUG */ +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + } else { +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + size_reduce_max = size_reduce + 10; +#endif /* SLJIT_DEBUG */ + + if (!(jump->flags & JUMP_ADDR)) { + diff = (sljit_sw)jump->u.label->size - (sljit_sw)(jump->addr - size_reduce - 3); + + if (diff <= HALFWORD_MAX && diff >= HALFWORD_MIN) + size_reduce += 3; + } else if (jump->u.target <= 0xffffffffl) + size_reduce += (jump->flags & MOV_ADDR_HI) ? 4 : 5; + +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + jump->flags |= (size_reduce_max - size_reduce) << JUMP_SIZE_SHIFT; +#endif /* SLJIT_DEBUG */ +#endif /* SLJIT_CONFIG_X86_64 */ + } + + jump = jump->next; + next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); + } + + compiler->size -= size_reduce; +} + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_memory_fragment *buf; @@ -595,27 +835,30 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_u8 *buf_end; sljit_u8 len; sljit_sw executable_offset; - sljit_uw jump_addr; +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + sljit_uw addr; +#endif /* SLJIT_DEBUG */ struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; - struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); - reverse_buf(compiler); + + reduce_code_size(compiler); /* Second code generation pass. */ code = (sljit_u8*)SLJIT_MALLOC_EXEC(compiler->size, compiler->exec_allocator_data); PTR_FAIL_WITH_EXEC_IF(code); + + reverse_buf(compiler); buf = compiler->buf; code_ptr = code; label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; - put_label = compiler->put_labels; executable_offset = SLJIT_EXEC_OFFSET(code); do { @@ -623,49 +866,52 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil buf_end = buf_ptr + buf->used_size; do { len = *buf_ptr++; - if (len > 0) { + SLJIT_ASSERT(len > 0); + if (len < SLJIT_INST_CONST) { /* The code is already generated. */ SLJIT_MEMCPY(code_ptr, buf_ptr, len); code_ptr += len; buf_ptr += len; - } - else { - switch (*buf_ptr) { - case 0: - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + } else { + switch (len) { + case SLJIT_INST_LABEL: + label->u.addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); label->size = (sljit_uw)(code_ptr - code); label = label->next; break; - case 1: - jump->addr = (sljit_uw)code_ptr; + case SLJIT_INST_JUMP: +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + addr = (sljit_uw)code_ptr; +#endif /* SLJIT_DEBUG */ if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) - code_ptr = generate_near_jump_code(jump, code_ptr, code, executable_offset); + code_ptr = detect_near_jump_type(jump, code_ptr, code, executable_offset); else { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - code_ptr = generate_far_jump_code(jump, code_ptr, executable_offset); -#else - code_ptr = generate_far_jump_code(jump, code_ptr); -#endif + code_ptr = detect_far_jump_type(jump, code_ptr, executable_offset); +#else /* !SLJIT_CONFIG_X86_32 */ + code_ptr = detect_far_jump_type(jump, code_ptr); +#endif /* SLJIT_CONFIG_X86_32 */ } + + SLJIT_ASSERT((sljit_uw)code_ptr - addr <= ((jump->flags >> JUMP_SIZE_SHIFT) & 0x1f)); jump = jump->next; break; - case 2: + case SLJIT_INST_MOV_ADDR: +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + code_ptr = generate_mov_addr_code(jump, code_ptr, code, executable_offset); +#endif /* SLJIT_CONFIG_X86_64 */ + jump->addr = (sljit_uw)code_ptr; + jump = jump->next; + break; + default: + SLJIT_ASSERT(len == SLJIT_INST_CONST); const_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw); const_ = const_->next; break; - default: - SLJIT_ASSERT(*buf_ptr == 3); - SLJIT_ASSERT(put_label->label); - put_label->addr = (sljit_uw)code_ptr; -#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - code_ptr = generate_put_label_code(put_label, code_ptr, (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size); -#endif - put_label = put_label->next; - break; } - buf_ptr++; } } while (buf_ptr < buf_end); + SLJIT_ASSERT(buf_ptr == buf_end); buf = buf->next; } while (buf); @@ -673,61 +919,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); - SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr <= code + compiler->size); jump = compiler->jumps; while (jump) { - if (jump->flags & (PATCH_MB | PATCH_MW)) { - if (jump->flags & JUMP_LABEL) - jump_addr = jump->u.label->addr; - else - jump_addr = jump->u.target; - - jump_addr -= jump->addr + (sljit_uw)executable_offset; - - if (jump->flags & PATCH_MB) { - jump_addr -= sizeof(sljit_s8); - SLJIT_ASSERT((sljit_sw)jump_addr >= -128 && (sljit_sw)jump_addr <= 127); - *(sljit_u8*)jump->addr = U8(jump_addr); - } else { - jump_addr -= sizeof(sljit_s32); -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)jump_addr); -#else - SLJIT_ASSERT((sljit_sw)jump_addr >= HALFWORD_MIN && (sljit_sw)jump_addr <= HALFWORD_MAX); - sljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)jump_addr); -#endif - } - } -#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - else if (jump->flags & PATCH_MD) { - SLJIT_ASSERT(jump->flags & JUMP_LABEL); - sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)jump->u.label->addr); - } -#endif - + generate_jump_or_mov_addr(jump, executable_offset); jump = jump->next; } - put_label = compiler->put_labels; - while (put_label) { -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); -#else - if (put_label->flags & PATCH_MD) { - SLJIT_ASSERT(put_label->label->addr > HALFWORD_MAX); - sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); - } - else { - SLJIT_ASSERT(put_label->label->addr <= HALFWORD_MAX); - sljit_unaligned_store_s32((void*)(put_label->addr - sizeof(sljit_s32)), (sljit_s32)put_label->label->addr); - } -#endif - - put_label = put_label->next; - } - compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (sljit_uw)(code_ptr - code); @@ -743,7 +942,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) switch (feature_type) { case SLJIT_HAS_FPU: #ifdef SLJIT_IS_FPU_AVAILABLE - return SLJIT_IS_FPU_AVAILABLE; + return (SLJIT_IS_FPU_AVAILABLE) != 0; #elif (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) if (cpu_feature_list == 0) get_cpu_features(); @@ -779,17 +978,23 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) case SLJIT_HAS_PREFETCH: case SLJIT_HAS_COPY_F32: case SLJIT_HAS_COPY_F64: + case SLJIT_HAS_ATOMIC: return 1; - case SLJIT_HAS_SSE2: -#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) +#if !(defined SLJIT_IS_FPU_AVAILABLE) || SLJIT_IS_FPU_AVAILABLE + case SLJIT_HAS_AVX: if (cpu_feature_list == 0) get_cpu_features(); - return (cpu_feature_list & CPU_FEATURE_SSE2) != 0; -#else /* !SLJIT_DETECT_SSE2 */ - return 1; -#endif /* SLJIT_DETECT_SSE2 */ - + return (cpu_feature_list & CPU_FEATURE_AVX) != 0; + case SLJIT_HAS_AVX2: + if (cpu_feature_list == 0) + get_cpu_features(); + return (cpu_feature_list & CPU_FEATURE_AVX2) != 0; + case SLJIT_HAS_SIMD: + if (cpu_feature_list == 0) + get_cpu_features(); + return (cpu_feature_list & CPU_FEATURE_SSE41) != 0; +#endif /* SLJIT_IS_FPU_AVAILABLE */ default: return 0; } @@ -797,16 +1002,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) { - if (type < SLJIT_UNORDERED || type > SLJIT_ORDERED_LESS_EQUAL) - return 0; - switch (type) { case SLJIT_ORDERED_EQUAL: case SLJIT_UNORDERED_OR_NOT_EQUAL: - return 0; + return 2; } - return 1; + return 0; } /* --------------------------------------------------------------------- */ @@ -850,6 +1052,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type) #endif /* SLJIT_CONFIG_X86_64 */ +static sljit_s32 emit_byte(struct sljit_compiler *compiler, sljit_u8 byte) +{ + sljit_u8 *inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = byte; + return SLJIT_SUCCESS; +} + static sljit_s32 emit_mov(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw); @@ -857,6 +1068,14 @@ static sljit_s32 emit_mov(struct sljit_compiler *compiler, #define EMIT_MOV(compiler, dst, dstw, src, srcw) \ FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw)); +static sljit_s32 emit_groupf(struct sljit_compiler *compiler, + sljit_uw op, + sljit_s32 dst, sljit_s32 src, sljit_sw srcw); + +static sljit_s32 emit_groupf_ext(struct sljit_compiler *compiler, + sljit_uw op, + sljit_s32 dst, sljit_s32 src, sljit_sw srcw); + static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler, sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src); @@ -867,6 +1086,10 @@ static sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w); +static sljit_s32 emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw); + static SLJIT_INLINE sljit_s32 emit_endbranch(struct sljit_compiler *compiler) { #if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET) @@ -911,7 +1134,11 @@ static SLJIT_INLINE sljit_s32 emit_rdssp(struct sljit_compiler *compiler, sljit_ #endif inst[0] = GROUP_0F; inst[1] = 0x1e; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) inst[2] = U8(MOD_REG | (0x1 << 3) | reg_lmap[reg]); +#else + inst[2] = U8(MOD_REG | (0x1 << 3) | reg_map[reg]); +#endif return SLJIT_SUCCESS; } @@ -1021,7 +1248,8 @@ static sljit_s32 emit_mov(struct sljit_compiler *compiler, *inst = MOV_rm_r; return SLJIT_SUCCESS; } - if (src & SLJIT_IMM) { + + if (src == SLJIT_IMM) { if (FAST_IS_REG(dst)) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw); @@ -1068,6 +1296,27 @@ static sljit_s32 emit_mov(struct sljit_compiler *compiler, return SLJIT_SUCCESS; } +static sljit_s32 emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + sljit_uw size; + + SLJIT_ASSERT(type >= SLJIT_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = U8(get_jump_code((sljit_uw)type ^ 0x1) - 0x10); + + size = compiler->size; + EMIT_MOV(compiler, dst_reg, 0, src, srcw); + + inst[1] = U8(compiler->size - size); + return SLJIT_SUCCESS; +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) { sljit_u8 *inst; @@ -1080,17 +1329,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile switch (GET_OPCODE(op)) { case SLJIT_BREAKPOINT: - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = INT3; - break; + return emit_byte(compiler, INT3); case SLJIT_NOP: - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = NOP; - break; + return emit_byte(compiler, NOP); case SLJIT_LMUL_UW: case SLJIT_LMUL_SW: case SLJIT_DIVMOD_UW: @@ -1131,23 +1372,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile #endif #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = CDQ; + FAIL_IF(emit_byte(compiler, CDQ)); #else - if (compiler->mode32) { - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = CDQ; - } else { + if (!compiler->mode32) { inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); FAIL_IF(!inst); INC_SIZE(2); inst[0] = REX_W; inst[1] = CDQ; - } + } else + FAIL_IF(emit_byte(compiler, CDQ)); #endif } @@ -1213,29 +1447,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile return SLJIT_SUCCESS; } -#define ENCODE_PREFIX(prefix) \ - do { \ - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); \ - FAIL_IF(!inst); \ - INC_SIZE(1); \ - *inst = U8(prefix); \ - } while (0) - static sljit_s32 emit_mov_byte(struct sljit_compiler *compiler, sljit_s32 sign, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { sljit_u8* inst; sljit_s32 dst_r; -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - sljit_s32 work_r; -#endif #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 0; #endif - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { if (FAST_IS_REG(dst)) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw); @@ -1264,100 +1487,33 @@ static sljit_s32 emit_mov_byte(struct sljit_compiler *compiler, sljit_s32 sign, #else dst_r = src; #endif - } + } else { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - else if (FAST_IS_REG(src) && reg_map[src] >= 4) { - /* src, dst are registers. */ - SLJIT_ASSERT(FAST_IS_REG(dst)); - if (reg_map[dst] < 4) { - if (dst != src) - EMIT_MOV(compiler, dst, 0, src, 0); - inst = emit_x86_instruction(compiler, 2, dst, 0, dst, 0); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = sign ? MOVSX_r_rm8 : MOVZX_r_rm8; - } - else { - if (dst != src) - EMIT_MOV(compiler, dst, 0, src, 0); - if (sign) { - /* shl reg, 24 */ - inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0); - FAIL_IF(!inst); - *inst |= SHL; - /* sar reg, 24 */ - inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0); - FAIL_IF(!inst); - *inst |= SAR; - } - else { + if (FAST_IS_REG(src) && reg_map[src] >= 4) { + /* Both src and dst are registers. */ + SLJIT_ASSERT(FAST_IS_REG(dst)); + + if (src == dst && !sign) { inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 0xff, dst, 0); FAIL_IF(!inst); *(inst + 1) |= AND; + return SLJIT_SUCCESS; } + + EMIT_MOV(compiler, TMP_REG1, 0, src, 0); + src = TMP_REG1; + srcw = 0; } - return SLJIT_SUCCESS; - } -#endif - else { +#endif /* !SLJIT_CONFIG_X86_32 */ + /* src can be memory addr or reg_map[src] < 4 on x86_32 architectures. */ - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = sign ? MOVSX_r_rm8 : MOVZX_r_rm8; + FAIL_IF(emit_groupf(compiler, sign ? MOVSX_r_rm8 : MOVZX_r_rm8, dst_r, src, srcw)); } if (dst & SLJIT_MEM) { -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - if (dst_r == TMP_REG1) { - /* Find a non-used register, whose reg_map[src] < 4. */ - if ((dst & REG_MASK) == SLJIT_R0) { - if ((dst & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_R1)) - work_r = SLJIT_R2; - else - work_r = SLJIT_R1; - } - else { - if ((dst & OFFS_REG_MASK) != TO_OFFS_REG(SLJIT_R0)) - work_r = SLJIT_R0; - else if ((dst & REG_MASK) == SLJIT_R1) - work_r = SLJIT_R2; - else - work_r = SLJIT_R1; - } - - if (work_r == SLJIT_R0) { - ENCODE_PREFIX(XCHG_EAX_r | reg_map[TMP_REG1]); - } - else { - inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0); - FAIL_IF(!inst); - *inst = XCHG_r_rm; - } - - inst = emit_x86_instruction(compiler, 1, work_r, 0, dst, dstw); - FAIL_IF(!inst); - *inst = MOV_rm8_r8; - - if (work_r == SLJIT_R0) { - ENCODE_PREFIX(XCHG_EAX_r | reg_map[TMP_REG1]); - } - else { - inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0); - FAIL_IF(!inst); - *inst = XCHG_r_rm; - } - } - else { - inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw); - FAIL_IF(!inst); - *inst = MOV_rm8_r8; - } -#else inst = emit_x86_instruction(compiler, 1 | EX86_REX | EX86_NO_REXW, dst_r, 0, dst, dstw); FAIL_IF(!inst); *inst = MOV_rm8_r8; -#endif } return SLJIT_SUCCESS; @@ -1398,7 +1554,7 @@ static sljit_s32 emit_mov_half(struct sljit_compiler *compiler, sljit_s32 sign, compiler->mode32 = 0; #endif - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { if (FAST_IS_REG(dst)) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw); @@ -1419,12 +1575,8 @@ static sljit_s32 emit_mov_half(struct sljit_compiler *compiler, sljit_s32 sign, if ((dst & SLJIT_MEM) && FAST_IS_REG(src)) dst_r = src; - else { - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = sign ? MOVSX_r_rm16 : MOVZX_r_rm16; - } + else + FAIL_IF(emit_groupf(compiler, sign ? MOVSX_r_rm16 : MOVZX_r_rm16, dst_r, src, srcw)); if (dst & SLJIT_MEM) { inst = emit_x86_instruction(compiler, 1 | EX86_NO_REXW | EX86_PREF_66, dst_r, 0, dst, dstw); @@ -1481,26 +1633,19 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 is_clz, sljit_s32 dst_r; sljit_sw max; - if (cpu_feature_list == 0) - get_cpu_features(); + SLJIT_ASSERT(cpu_feature_list != 0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (is_clz ? (cpu_feature_list & CPU_FEATURE_LZCNT) : (cpu_feature_list & CPU_FEATURE_TZCNT)) { - inst = emit_x86_instruction(compiler, 2 | EX86_PREF_F3, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = is_clz ? LZCNT_r_rm : TZCNT_r_rm; + FAIL_IF(emit_groupf(compiler, (is_clz ? LZCNT_r_rm : TZCNT_r_rm) | EX86_PREF_F3, dst_r, src, srcw)); if (dst & SLJIT_MEM) EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); return SLJIT_SUCCESS; } - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = is_clz ? BSR_r_rm : BSF_r_rm; + FAIL_IF(emit_groupf(compiler, is_clz ? BSR_r_rm : BSF_r_rm, dst_r, src, srcw)); #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) max = is_clz ? (32 + 31) : 32; @@ -1518,7 +1663,7 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 is_clz, inst[1] = CMOVE_r_rm; } else - FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max)); + FAIL_IF(emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max)); if (is_clz) { inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 31, dst_r, 0); @@ -1533,14 +1678,9 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 is_clz, if (cpu_feature_list & CPU_FEATURE_CMOV) { EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, max); - - inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = CMOVE_r_rm; - } - else - FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max)); + FAIL_IF(emit_groupf(compiler, CMOVE_r_rm, dst_r, TMP_REG2, 0)); + } else + FAIL_IF(emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max)); if (is_clz) { inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, max >> 1, dst_r, 0); @@ -1555,6 +1695,7 @@ static sljit_s32 emit_clz_ctz(struct sljit_compiler *compiler, sljit_s32 is_clz, } static sljit_s32 emit_bswap(struct sljit_compiler *compiler, + sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) { @@ -1563,10 +1704,24 @@ static sljit_s32 emit_bswap(struct sljit_compiler *compiler, sljit_uw size; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) sljit_u8 rex = 0; +#else /* !SLJIT_CONFIG_X86_64 */ + sljit_s32 dst_is_ereg = op & SLJIT_32; #endif /* SLJIT_CONFIG_X86_64 */ - if (src != dst_r) - EMIT_MOV(compiler, dst_r, 0, src, srcw); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (op == SLJIT_REV_U32 || op == SLJIT_REV_S32) + compiler->mode32 = 1; +#else /* !SLJIT_CONFIG_X86_64 */ + op &= ~SLJIT_32; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (src != dst_r) { + /* Only the lower 16 bit is read for eregs. */ + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) + FAIL_IF(emit_mov_half(compiler, 0, dst_r, 0, src, srcw)); + else + EMIT_MOV(compiler, dst_r, 0, src, srcw); + } size = 2; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) @@ -1595,8 +1750,41 @@ static sljit_s32 emit_bswap(struct sljit_compiler *compiler, inst[1] = BSWAP_r | reg_map[dst_r]; #endif /* SLJIT_CONFIG_X86_64 */ - if (dst & SLJIT_MEM) - EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + size = compiler->mode32 ? 16 : 48; +#else /* !SLJIT_CONFIG_X86_64 */ + size = 16; +#endif /* SLJIT_CONFIG_X86_64 */ + + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, (sljit_sw)size, dst_r, 0); + FAIL_IF(!inst); + if (op == SLJIT_REV_U16) + inst[1] |= SHR; + else + inst[1] |= SAR; + } + + if (dst & SLJIT_MEM) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (dst_is_ereg) + op = SLJIT_REV; +#endif /* SLJIT_CONFIG_X86_32 */ + if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) + return emit_mov_half(compiler, 0, dst, dstw, TMP_REG1, 0); + + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (op == SLJIT_REV_S32) { + compiler->mode32 = 0; + inst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0); + FAIL_IF(!inst); + *inst = MOVSXD_r_rm; + } +#endif /* SLJIT_CONFIG_X86_64 */ + return SLJIT_SUCCESS; } @@ -1639,14 +1827,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile if (op == SLJIT_MOV_S32) op = SLJIT_MOV_U32; } - else if (src & SLJIT_IMM) { + else if (src == SLJIT_IMM) { if (op == SLJIT_MOV_U32) op = SLJIT_MOV_S32; } } #endif /* SLJIT_CONFIG_X86_64 */ - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { switch (op) { case SLJIT_MOV_U8: srcw = (sljit_u8)srcw; @@ -1731,7 +1919,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile case SLJIT_CTZ: return emit_clz_ctz(compiler, (op == SLJIT_CLZ), dst, dstw, src, srcw); case SLJIT_REV: - return emit_bswap(compiler, dst, dstw, src, srcw); + case SLJIT_REV_U16: + case SLJIT_REV_S16: + case SLJIT_REV_U32: + case SLJIT_REV_S32: +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (dst_is_ereg) + op |= SLJIT_32; +#endif /* SLJIT_CONFIG_X86_32 */ + return emit_bswap(compiler, op, dst, dstw, src, srcw); } return SLJIT_SUCCESS; @@ -1750,7 +1946,7 @@ static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, sljit_u8 op_imm = U8(op_types & 0xff); if (dst == src1 && dstw == src1w) { - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { #else @@ -1784,7 +1980,7 @@ static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, /* Only for cumulative operations. */ if (dst == src2 && dstw == src2w) { - if (src1 & SLJIT_IMM) { + if (src1 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) { #else @@ -1818,7 +2014,7 @@ static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, /* General version. */ if (FAST_IS_REG(dst)) { EMIT_MOV(compiler, dst, 0, src1, src1w); - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { BINARY_IMM(op_imm, op_mr, src2w, dst, 0); } else { @@ -1830,7 +2026,7 @@ static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, else { /* This version requires less memory writing. */ EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); } else { @@ -1857,7 +2053,7 @@ static sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler, sljit_u8 op_imm = U8(op_types & 0xff); if (dst == src1 && dstw == src1w) { - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { #else @@ -1891,7 +2087,7 @@ static sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler, /* General version. */ if (FAST_IS_REG(dst) && dst != src2) { EMIT_MOV(compiler, dst, 0, src1, src1w); - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { BINARY_IMM(op_imm, op_mr, src2w, dst, 0); } else { @@ -1903,7 +2099,7 @@ static sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler, else { /* This version requires less memory writing. */ EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); } else { @@ -1926,20 +2122,12 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler, sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; /* Register destination. */ - if (dst_r == src1 && !(src2 & SLJIT_IMM)) { - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = IMUL_r_rm; - } - else if (dst_r == src2 && !(src1 & SLJIT_IMM)) { - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src1, src1w); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = IMUL_r_rm; - } - else if (src1 & SLJIT_IMM) { - if (src2 & SLJIT_IMM) { + if (dst_r == src1 && src2 != SLJIT_IMM) { + FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src2, src2w)); + } else if (dst_r == src2 && src1 != SLJIT_IMM) { + FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src1, src1w)); + } else if (src1 == SLJIT_IMM) { + if (src2 == SLJIT_IMM) { EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, src2w); src2 = dst_r; src2w = 0; @@ -1949,10 +2137,8 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler, inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w); FAIL_IF(!inst); *inst = IMUL_r_rm_i8; - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = U8(src1w); + + FAIL_IF(emit_byte(compiler, U8(src1w))); } #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) else { @@ -1978,30 +2164,26 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler, if (dst_r != src2) EMIT_MOV(compiler, dst_r, 0, src2, src2w); FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src1w)); - inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = IMUL_r_rm; + FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, TMP_REG2, 0)); } #endif } - else if (src2 & SLJIT_IMM) { + else if (src2 == SLJIT_IMM) { /* Note: src1 is NOT immediate. */ if (src2w <= 127 && src2w >= -128) { inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); FAIL_IF(!inst); *inst = IMUL_r_rm_i8; - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = U8(src2w); + + FAIL_IF(emit_byte(compiler, U8(src2w))); } #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) else { inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); FAIL_IF(!inst); *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); FAIL_IF(!inst); INC_SIZE(4); @@ -2012,31 +2194,24 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler, inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); FAIL_IF(!inst); *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); FAIL_IF(!inst); INC_SIZE(4); sljit_unaligned_store_s32(inst, (sljit_s32)src2w); - } - else { + } else { if (dst_r != src1) EMIT_MOV(compiler, dst_r, 0, src1, src1w); FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w)); - inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = IMUL_r_rm; + FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, TMP_REG2, 0)); } #endif - } - else { + } else { /* Neither argument is immediate. */ if (ADDRESSING_DEPENDS_ON(src2, dst_r)) dst_r = TMP_REG1; EMIT_MOV(compiler, dst_r, 0, src1, src1w); - inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = IMUL_r_rm; + FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src2, src2w)); } if (dst & SLJIT_MEM) @@ -2069,10 +2244,10 @@ static sljit_s32 emit_lea_binary(struct sljit_compiler *compiler, done = 1; } #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if ((src2 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src2w))) { + if (src2 == SLJIT_IMM && (compiler->mode32 || IS_HALFWORD(src2w))) { inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), (sljit_s32)src2w); #else - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), src2w); #endif FAIL_IF(!inst); @@ -2082,10 +2257,10 @@ static sljit_s32 emit_lea_binary(struct sljit_compiler *compiler, } else if (FAST_IS_REG(src2)) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if ((src1 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src1w))) { + if (src1 == SLJIT_IMM && (compiler->mode32 || IS_HALFWORD(src1w))) { inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), (sljit_s32)src1w); #else - if (src1 & SLJIT_IMM) { + if (src1 == SLJIT_IMM) { inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), src1w); #endif FAIL_IF(!inst); @@ -2109,16 +2284,16 @@ static sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler, sljit_u8* inst; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { + if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { #else - if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) { + if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128)) { #endif BINARY_EAX_IMM(CMP_EAX_i32, src2w); return SLJIT_SUCCESS; } if (FAST_IS_REG(src1)) { - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { BINARY_IMM(CMP, CMP_rm_r, src2w, src1, 0); } else { @@ -2129,15 +2304,15 @@ static sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler, return SLJIT_SUCCESS; } - if (FAST_IS_REG(src2) && !(src1 & SLJIT_IMM)) { + if (FAST_IS_REG(src2) && src1 != SLJIT_IMM) { inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w); FAIL_IF(!inst); *inst = CMP_rm_r; return SLJIT_SUCCESS; } - if (src2 & SLJIT_IMM) { - if (src1 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { + if (src1 == SLJIT_IMM) { EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); src1 = TMP_REG1; src1w = 0; @@ -2160,25 +2335,25 @@ static sljit_s32 emit_test_binary(struct sljit_compiler *compiler, sljit_u8* inst; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { + if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { #else - if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) { + if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128)) { #endif BINARY_EAX_IMM(TEST_EAX_i32, src2w); return SLJIT_SUCCESS; } #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) { + if (src2 == SLJIT_R0 && src1 == SLJIT_IMM && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) { #else - if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128)) { + if (src2 == SLJIT_R0 && src1 == SLJIT_IMM && (src1w > 127 || src1w < -128)) { #endif BINARY_EAX_IMM(TEST_EAX_i32, src1w); return SLJIT_SUCCESS; } - if (!(src1 & SLJIT_IMM)) { - if (src2 & SLJIT_IMM) { + if (src1 != SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (IS_HALFWORD(src2w) || compiler->mode32) { inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w); @@ -2206,8 +2381,8 @@ static sljit_s32 emit_test_binary(struct sljit_compiler *compiler, } } - if (!(src2 & SLJIT_IMM)) { - if (src1 & SLJIT_IMM) { + if (src2 != SLJIT_IMM) { + if (src1 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (IS_HALFWORD(src1w) || compiler->mode32) { inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src1w, src2, src2w); @@ -2236,7 +2411,7 @@ static sljit_s32 emit_test_binary(struct sljit_compiler *compiler, } EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (IS_HALFWORD(src2w) || compiler->mode32) { inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0); @@ -2274,18 +2449,18 @@ static sljit_s32 emit_shift(struct sljit_compiler *compiler, #endif sljit_u8* inst; - if ((src2 & SLJIT_IMM) || (src2 == SLJIT_PREF_SHIFT_REG)) { + if (src2 == SLJIT_IMM || src2 == SLJIT_PREF_SHIFT_REG) { if (dst == src1 && dstw == src1w) { inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, dstw); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; return SLJIT_SUCCESS; } if (dst == SLJIT_PREF_SHIFT_REG && src2 == SLJIT_PREF_SHIFT_REG) { EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); return SLJIT_SUCCESS; } @@ -2293,14 +2468,14 @@ static sljit_s32 emit_shift(struct sljit_compiler *compiler, EMIT_MOV(compiler, dst, 0, src1, src1w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; return SLJIT_SUCCESS; } EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); return SLJIT_SUCCESS; } @@ -2310,7 +2485,7 @@ static sljit_s32 emit_shift(struct sljit_compiler *compiler, EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; return emit_mov(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); } @@ -2328,7 +2503,7 @@ static sljit_s32 emit_shift(struct sljit_compiler *compiler, EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, dst, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 0; #endif @@ -2354,7 +2529,7 @@ static sljit_s32 emit_shift(struct sljit_compiler *compiler, EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); FAIL_IF(!inst); - *inst |= mode; + inst[1] |= mode; #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, SLJIT_MEM1(SLJIT_SP), 0); @@ -2377,7 +2552,7 @@ static sljit_s32 emit_shift_with_flags(struct sljit_compiler *compiler, sljit_s32 src2, sljit_sw src2w) { /* The CPU does not set flags if the shift count is 0. */ - if (src2 & SLJIT_IMM) { + if (src2 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) src2w &= compiler->mode32 ? 0x1f : 0x3f; #else /* !SLJIT_CONFIG_X86_64 */ @@ -2442,7 +2617,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile return emit_unary(compiler, NEG_rm, dst, dstw, src2, src2w); if (!HAS_FLAGS(op)) { - if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED) + if (src2 == SLJIT_IMM && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED) return compiler->error; if (FAST_IS_REG(dst) && src2 == dst) { FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), dst, 0, dst, 0, src1, src1w)); @@ -2465,9 +2640,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile dst, dstw, src1, src1w, src2, src2w); case SLJIT_XOR: if (!HAS_FLAGS(op)) { - if ((src2 & SLJIT_IMM) && src2w == -1) + if (src2 == SLJIT_IMM && src2w == -1) return emit_unary(compiler, NOT_rm, dst, dstw, src1, src1w); - if ((src1 & SLJIT_IMM) && src1w == -1) + if (src1 == SLJIT_IMM && src1w == -1) return emit_unary(compiler, NOT_rm, dst, dstw, src2, src2w); } @@ -2553,7 +2728,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * compiler->mode32 = op & SLJIT_32; #endif /* SLJIT_CONFIG_X86_64 */ - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) src3w &= 0x1f; #else /* !SLJIT_CONFIG_X86_32 */ @@ -2580,7 +2755,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * } #endif /* SLJIT_CONFIG_X86_32 */ - if (dst_reg == SLJIT_PREF_SHIFT_REG && !(src3 & SLJIT_IMM) && (src3 != SLJIT_PREF_SHIFT_REG || src1_reg != SLJIT_PREF_SHIFT_REG)) { + if (dst_reg == SLJIT_PREF_SHIFT_REG && src3 != SLJIT_IMM && (src3 != SLJIT_PREF_SHIFT_REG || src1_reg != SLJIT_PREF_SHIFT_REG)) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) EMIT_MOV(compiler, TMP_REG1, 0, src1_reg, src1w); src1_reg = TMP_REG1; @@ -2605,7 +2780,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * if (src3 != SLJIT_PREF_SHIFT_REG) EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src3, src3w); } else { - if (src2_reg == SLJIT_PREF_SHIFT_REG && !(src3 & SLJIT_IMM) && src3 != SLJIT_PREF_SHIFT_REG) { + if (src2_reg == SLJIT_PREF_SHIFT_REG && src3 != SLJIT_IMM && src3 != SLJIT_PREF_SHIFT_REG) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 0; #endif /* SLJIT_CONFIG_X86_64 */ @@ -2653,7 +2828,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * } #endif /* SLJIT_CONFIG_X86_64 */ - if (!(src3 & SLJIT_IMM) && src3 != SLJIT_PREF_SHIFT_REG) { + if (src3 != SLJIT_IMM && src3 != SLJIT_PREF_SHIFT_REG) { if (!restore_ecx) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 0; @@ -2684,14 +2859,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler * FAIL_IF(!inst); inst[0] = GROUP_0F; - if (src3 & SLJIT_IMM) { + if (src3 == SLJIT_IMM) { inst[1] = U8((is_left ? SHLD : SHRD) - 1); - /* Immedate argument is added separately. */ - inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); - FAIL_IF(!inst); - INC_SIZE(1); - *inst = U8(src3w); + /* Immediate argument is added separately. */ + FAIL_IF(emit_byte(compiler, U8(src3w))); } else inst[1] = U8(is_left ? SHLD : SHRD); @@ -2765,24 +2937,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp return SLJIT_SUCCESS; } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg) { - CHECK_REG_INDEX(check_sljit_get_register_index(reg)); -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - if (reg >= SLJIT_R3 && reg <= SLJIT_R8) - return -1; -#endif - return reg_map[reg]; -} + CHECK_REG_INDEX(check_sljit_get_register_index(type, reg)); -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) -{ - CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + if (type == SLJIT_GP_REGISTER) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - return reg; -#else + if (reg >= SLJIT_R3 && reg <= SLJIT_R8) + return -1; +#endif /* SLJIT_CONFIG_X86_32 */ + return reg_map[reg]; + } + + if (type != SLJIT_FLOAT_REGISTER && type != SLJIT_SIMD_REG_128 && type != SLJIT_SIMD_REG_256 && type != SLJIT_SIMD_REG_512) + return -1; + return freg_map[reg]; -#endif } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, @@ -2810,6 +2980,8 @@ static sljit_u32 *sse2_buffer; static void init_compiler(void) { + get_cpu_features(); + /* Align to 16 bytes. */ sse2_buffer = (sljit_u32*)(((sljit_uw)sse2_data + 15) & ~(sljit_uw)0xf); @@ -2823,40 +2995,43 @@ static void init_compiler(void) sse2_buffer[13] = 0x7fffffff; } -static sljit_s32 emit_sse2(struct sljit_compiler *compiler, sljit_u8 opcode, - sljit_s32 single, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w) +static sljit_s32 emit_groupf(struct sljit_compiler *compiler, + sljit_uw op, + sljit_s32 dst, sljit_s32 src, sljit_sw srcw) { - sljit_u8 *inst; - - inst = emit_x86_instruction(compiler, 2 | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, xmm1, 0, xmm2, xmm2w); + sljit_u8 *inst = emit_x86_instruction(compiler, 2 | (op & ~(sljit_uw)0xff), dst, 0, src, srcw); FAIL_IF(!inst); inst[0] = GROUP_0F; - inst[1] = opcode; + inst[1] = op & 0xff; return SLJIT_SUCCESS; } -static sljit_s32 emit_sse2_logic(struct sljit_compiler *compiler, sljit_u8 opcode, - sljit_s32 pref66, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w) +static sljit_s32 emit_groupf_ext(struct sljit_compiler *compiler, + sljit_uw op, + sljit_s32 dst, sljit_s32 src, sljit_sw srcw) { sljit_u8 *inst; - inst = emit_x86_instruction(compiler, 2 | (pref66 ? EX86_PREF_66 : 0) | EX86_SSE2, xmm1, 0, xmm2, xmm2w); + SLJIT_ASSERT((op & EX86_SSE2) && ((op & VEX_OP_0F38) || (op & VEX_OP_0F3A))); + + inst = emit_x86_instruction(compiler, 3 | (op & ~((sljit_uw)0xff | VEX_OP_0F38 | VEX_OP_0F3A)), dst, 0, src, srcw); FAIL_IF(!inst); inst[0] = GROUP_0F; - inst[1] = opcode; + inst[1] = U8((op & VEX_OP_0F38) ? 0x38 : 0x3A); + inst[2] = op & 0xff; return SLJIT_SUCCESS; } static SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler, sljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw) { - return emit_sse2(compiler, MOVSD_x_xm, single, dst, src, srcw); + return emit_groupf(compiler, MOVSD_x_xm | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, dst, src, srcw); } static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler, sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src) { - return emit_sse2(compiler, MOVSD_xm_x, single, src, dst, dstw); + return emit_groupf(compiler, MOVSD_xm_x | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, src, dst, dstw); } static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, @@ -2864,7 +3039,6 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r; - sljit_u8 *inst; CHECK_EXTRA_REGS(dst, dstw, (void)0); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; @@ -2874,10 +3048,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp compiler->mode32 = 0; #endif - inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP2, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = CVTTSD2SI_r_xm; + FAIL_IF(emit_groupf(compiler, CVTTSD2SI_r_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP2, dst_r, src, srcw)); if (dst & SLJIT_MEM) return emit_mov(compiler, dst, dstw, TMP_REG1, 0); @@ -2889,7 +3060,6 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG; - sljit_u8 *inst; CHECK_EXTRA_REGS(src, srcw, (void)0); @@ -2898,7 +3068,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp compiler->mode32 = 0; #endif - if (src & SLJIT_IMM) { + if (src == SLJIT_IMM) { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) srcw = (sljit_s32)srcw; @@ -2908,10 +3078,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp srcw = 0; } - inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP1, dst_r, 0, src, srcw); - FAIL_IF(!inst); - inst[0] = GROUP_0F; - inst[1] = CVTSI2SD_x_rm; + FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, srcw)); #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 1; @@ -2926,14 +3093,28 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile sljit_s32 src2, sljit_sw src2w) { switch (GET_FLAG_TYPE(op)) { + case SLJIT_ORDERED_EQUAL: + /* Also: SLJIT_UNORDERED_OR_NOT_EQUAL */ + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src1, src1w)); + FAIL_IF(emit_groupf(compiler, CMPS_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, TMP_FREG, src2, src2w)); + + /* EQ */ + FAIL_IF(emit_byte(compiler, 0)); + + src1 = TMP_FREG; + src2 = TMP_FREG; + src2w = 0; + break; + case SLJIT_ORDERED_LESS: case SLJIT_UNORDERED_OR_GREATER: + /* Also: SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_ORDERED_LESS_EQUAL */ if (!FAST_IS_REG(src2)) { FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src2, src2w)); src2 = TMP_FREG; } - return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_32), src2, src1, src1w); + return emit_groupf(compiler, UCOMISD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, src2, src1, src1w); } if (!FAST_IS_REG(src1)) { @@ -2941,7 +3122,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile src1 = TMP_FREG; } - return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_32), src1, src2, src2w); + return emit_groupf(compiler, UCOMISD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, src1, src2, src2w); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -2949,6 +3130,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil sljit_s32 src, sljit_sw srcw) { sljit_s32 dst_r; + sljit_u8 *inst; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 1; @@ -2972,42 +3154,57 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil /* We overwrite the high bits of source. From SLJIT point of view, this is not an issue. Note: In SSE3, we could also use MOVDDUP and MOVSLDUP. */ - FAIL_IF(emit_sse2_logic(compiler, UNPCKLPD_x_xm, op & SLJIT_32, src, src, 0)); - } - else { + FAIL_IF(emit_groupf(compiler, UNPCKLPD_x_xm | ((op & SLJIT_32) ? EX86_PREF_66 : 0) | EX86_SSE2, src, src, 0)); + } else { FAIL_IF(emit_sse2_load(compiler, !(op & SLJIT_32), TMP_FREG, src, srcw)); src = TMP_FREG; } - FAIL_IF(emit_sse2_logic(compiler, CVTPD2PS_x_xm, op & SLJIT_32, dst_r, src, 0)); + FAIL_IF(emit_groupf(compiler, CVTPD2PS_x_xm | ((op & SLJIT_32) ? EX86_PREF_66 : 0) | EX86_SSE2, dst_r, src, 0)); if (dst_r == TMP_FREG) return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); return SLJIT_SUCCESS; } if (FAST_IS_REG(dst)) { - dst_r = dst; - if (dst != src) - FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_r, src, srcw)); - } - else { - dst_r = TMP_FREG; - FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_r, src, srcw)); + dst_r = (dst == src) ? TMP_FREG : dst; + + if (src & SLJIT_MEM) + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src, srcw)); + + FAIL_IF(emit_groupf(compiler, PCMPEQD_x_xm | EX86_PREF_66 | EX86_SSE2, dst_r, dst_r, 0)); + + inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP2, 0, 0, dst_r, 0); + inst[0] = GROUP_0F; + /* Same as PSRLD_x / PSRLQ_x */ + inst[1] = (op & SLJIT_32) ? PSLLD_x_i8 : PSLLQ_x_i8; + + if (GET_OPCODE(op) == SLJIT_ABS_F64) { + inst[2] |= 2 << 3; + FAIL_IF(emit_byte(compiler, 1)); + } else { + inst[2] |= 6 << 3; + FAIL_IF(emit_byte(compiler, ((op & SLJIT_32) ? 31 : 63))); + } + + if (dst_r != TMP_FREG) + dst_r = (src & SLJIT_MEM) ? TMP_FREG : src; + return emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_NEG_F64 ? XORPD_x_xm : ANDPD_x_xm) | EX86_SSE2, dst, dst_r, 0); } + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src, srcw)); + switch (GET_OPCODE(op)) { case SLJIT_NEG_F64: - FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_32 ? sse2_buffer : sse2_buffer + 8))); + FAIL_IF(emit_groupf(compiler, XORPD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8))); break; case SLJIT_ABS_F64: - FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_32 ? sse2_buffer + 4 : sse2_buffer + 12))); + FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer + 4 : sse2_buffer + 12))); break; } - if (dst_r == TMP_FREG) - return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); - return SLJIT_SUCCESS; + return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, @@ -3050,19 +3247,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil switch (GET_OPCODE(op)) { case SLJIT_ADD_F64: - FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_32, dst_r, src2, src2w)); + FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w)); break; case SLJIT_SUB_F64: - FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_32, dst_r, src2, src2w)); + FAIL_IF(emit_groupf(compiler, SUBSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w)); break; case SLJIT_MUL_F64: - FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_32, dst_r, src2, src2w)); + FAIL_IF(emit_groupf(compiler, MULSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w)); break; case SLJIT_DIV_F64: - FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_32, dst_r, src2, src2w)); + FAIL_IF(emit_groupf(compiler, DIVSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w)); break; } @@ -3071,6 +3268,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compil return SLJIT_SUCCESS; } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_uw pref; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif + + if (dst_freg == src1) { + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src2, src2w)); + pref = EX86_SELECT_66(op) | EX86_SSE2; + FAIL_IF(emit_groupf(compiler, XORPD_x_xm | pref, TMP_FREG, src1, src1w)); + FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | pref, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8))); + return emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, TMP_FREG, 0); + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src1, src1w)); + src1 = TMP_FREG; + src1w = 0; + } + + if (dst_freg != src2) + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_freg, src2, src2w)); + + pref = EX86_SELECT_66(op) | EX86_SSE2; + FAIL_IF(emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, src1, src1w)); + FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | pref, dst_freg, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8))); + return emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, src1, src1w); +} + /* --------------------------------------------------------------------- */ /* Conditional instructions */ /* --------------------------------------------------------------------- */ @@ -3090,10 +3326,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi PTR_FAIL_IF(!label); set_label(label, compiler); - inst = (sljit_u8*)ensure_buf(compiler, 2); + inst = (sljit_u8*)ensure_buf(compiler, 1); PTR_FAIL_IF(!inst); - inst[0] = 0; - inst[1] = 0; + inst[0] = SLJIT_INST_LABEL; return label; } @@ -3111,18 +3346,13 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile set_jump(jump, compiler, (sljit_u32)((type & SLJIT_REWRITABLE_JUMP) | ((type & 0xff) << TYPE_SHIFT))); type &= 0xff; + jump->addr = compiler->size; /* Worst case size. */ -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - compiler->size += (type >= SLJIT_JUMP) ? 5 : 6; -#else - compiler->size += (type >= SLJIT_JUMP) ? (10 + 3) : (2 + 10 + 3); -#endif - - inst = (sljit_u8*)ensure_buf(compiler, 2); + compiler->size += (type >= SLJIT_JUMP) ? JUMP_MAX_SIZE : CJUMP_MAX_SIZE; + inst = (sljit_u8*)ensure_buf(compiler, 1); PTR_FAIL_IF_NULL(inst); - inst[0] = 0; - inst[1] = 1; + inst[0] = SLJIT_INST_JUMP; return jump; } @@ -3143,20 +3373,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi set_jump(jump, compiler, (sljit_u32)(JUMP_ADDR | (type << TYPE_SHIFT))); jump->u.target = (sljit_uw)srcw; + jump->addr = compiler->size; /* Worst case size. */ -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - compiler->size += 5; -#else - compiler->size += 10 + 3; -#endif - - inst = (sljit_u8*)ensure_buf(compiler, 2); + compiler->size += JUMP_MAX_SIZE; + inst = (sljit_u8*)ensure_buf(compiler, 1); FAIL_IF_NULL(inst); - inst[0] = 0; - inst[1] = 1; - } - else { + inst[0] = SLJIT_INST_JUMP; + } else { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) /* REX_W is not necessary (src is not immediate). */ compiler->mode32 = 1; @@ -3289,43 +3513,1256 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co #endif /* SLJIT_CONFIG_X86_64 */ } -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, - sljit_s32 src, sljit_sw srcw) + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_reg) { - sljit_u8* inst; +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 dst = dst_reg; + sljit_sw dstw = 0; +#endif /* SLJIT_CONFIG_X86_32 */ + sljit_sw src2w = 0; CHECK_ERROR(); - CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg)); -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - type &= ~SLJIT_32; + ADJUST_LOCAL_OFFSET(src1, src1w); - if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV) || (dst_reg >= SLJIT_R3 && dst_reg <= SLJIT_S3)) - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); -#else - if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV)) - return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); -#endif - - /* ADJUST_LOCAL_OFFSET is not needed. */ - CHECK_EXTRA_REGS(src, srcw, (void)0); + CHECK_EXTRA_REGS(dst, dstw, (void)0); + CHECK_EXTRA_REGS(src1, src1w, (void)0); + CHECK_EXTRA_REGS(src2_reg, src2w, (void)0); #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = type & SLJIT_32; +#endif /* SLJIT_CONFIG_X86_64 */ type &= ~SLJIT_32; -#endif - if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { - EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (dst & SLJIT_MEM) { + if (src1 == SLJIT_IMM || (!(src1 & SLJIT_MEM) && (src2_reg & SLJIT_MEM))) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + src1 = src2_reg; + src1w = src2w; + type ^= 0x1; + } else + EMIT_MOV(compiler, TMP_REG1, 0, src2_reg, src2w); + + dst_reg = TMP_REG1; + } else { +#endif /* SLJIT_CONFIG_X86_32 */ + if (dst_reg != src2_reg) { + if (dst_reg == src1) { + src1 = src2_reg; + src1w = src2w; + type ^= 0x1; + } else { + if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) { + EMIT_MOV(compiler, dst_reg, 0, src1, src1w); + src1 = src2_reg; + src1w = src2w; + type ^= 0x1; + } else + EMIT_MOV(compiler, dst_reg, 0, src2_reg, src2w); + } + } + + if (SLJIT_UNLIKELY(src1 == SLJIT_IMM)) { + SLJIT_ASSERT(dst_reg != TMP_REG1); + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + src1 = TMP_REG1; + src1w = 0; + } +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + } +#endif /* SLJIT_CONFIG_X86_32 */ + + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV)) + FAIL_IF(emit_groupf(compiler, U8(get_jump_code((sljit_uw)type) - 0x40), dst_reg, src1, src1w)); + else + FAIL_IF(emit_cmov_generic(compiler, type, dst_reg, src1, src1w)); + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (dst_reg == TMP_REG1) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); +#endif /* SLJIT_CONFIG_X86_32 */ + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2_freg) +{ + sljit_u8* inst; + sljit_uw size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg)); + + ADJUST_LOCAL_OFFSET(src1, src1w); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (dst_freg != src2_freg) { + if (dst_freg == src1) { + src1 = src2_freg; + src1w = 0; + type ^= 0x1; + } else + FAIL_IF(emit_sse2_load(compiler, type & SLJIT_32, dst_freg, src2_freg, 0)); + } + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + inst[0] = U8(get_jump_code((sljit_uw)(type & ~SLJIT_32) ^ 0x1) - 0x10); + + size = compiler->size; + FAIL_IF(emit_sse2_load(compiler, type & SLJIT_32, dst_freg, src1, src1w)); + + inst[1] = U8(compiler->size - size); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_uw op; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + + switch (reg_size) { + case 4: + op = EX86_SSE2; + break; + case 5: + if (!(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + op = EX86_SSE2 | VEX_256; + break; + default: + return SLJIT_ERR_UNSUPPORTED; + } + + if (!(srcdst & SLJIT_MEM)) + alignment = reg_size; + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 2 || elem_size == 3) { + op |= alignment >= reg_size ? MOVAPS_x_xm : MOVUPS_x_xm; + + if (elem_size == 3) + op |= EX86_PREF_66; + + if (type & SLJIT_SIMD_STORE) + op += 1; + } else + return SLJIT_ERR_UNSUPPORTED; + } else { + op |= ((type & SLJIT_SIMD_STORE) ? MOVDQA_xm_x : MOVDQA_x_xm) + | (alignment >= reg_size ? EX86_PREF_66 : EX86_PREF_F3); + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (op & VEX_256) + return emit_vex_instruction(compiler, op, freg, 0, srcdst, srcdstw); + + return emit_groupf(compiler, op, freg, srcdst, srcdstw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_u8 *inst; + sljit_u8 opcode = 0; + sljit_uw size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + + if (!(type & SLJIT_SIMD_FLOAT)) { + CHECK_EXTRA_REGS(src, srcw, (void)0); + } + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2)) + return SLJIT_ERR_UNSUPPORTED; +#else /* !SLJIT_CONFIG_X86_32 */ + compiler->mode32 = 1; + + if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)) + return SLJIT_ERR_UNSUPPORTED; +#endif /* SLJIT_CONFIG_X86_32 */ + + if (cpu_feature_list & CPU_FEATURE_AVX2) { + if (reg_size < 4 || reg_size > 5) + return SLJIT_ERR_UNSUPPORTED; + + if (src != SLJIT_IMM && (reg_size == 5 || elem_size < 3 || !(type & SLJIT_SIMD_FLOAT))) { + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (!(src & SLJIT_MEM) && !(type & SLJIT_SIMD_FLOAT)) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (elem_size >= 3) + compiler->mode32 = 0; +#endif /* SLJIT_CONFIG_X86_64 */ + FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, src, srcw)); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + src = freg; + srcw = 0; + } + + switch (elem_size) { + case 0: + size = VPBROADCASTB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + case 1: + size = VPBROADCASTW_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + case 2: + size = ((type & SLJIT_SIMD_FLOAT) ? VBROADCASTSS_x_xm : VPBROADCASTD_x_xm) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + default: +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + size = VBROADCASTSD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; +#else /* !SLJIT_CONFIG_X86_32 */ + size = ((type & SLJIT_SIMD_FLOAT) ? VBROADCASTSD_x_xm : VPBROADCASTQ_x_xm) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; +#endif /* SLJIT_CONFIG_X86_32 */ + break; + } + + if (reg_size == 5) + size |= VEX_256; + + return emit_vex_instruction(compiler, size, freg, 0, src, srcw); + } + } else if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (type & SLJIT_SIMD_FLOAT) { + if (src == SLJIT_IMM) { + if (reg_size == 5) + return emit_vex_instruction(compiler, XORPD_x_xm | VEX_256 | (elem_size == 3 ? EX86_PREF_66 : 0) | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0); + + return emit_groupf(compiler, XORPD_x_xm | (elem_size == 3 ? EX86_PREF_66 : 0) | EX86_SSE2, freg, freg, 0); + } + + if (elem_size == 2 && freg != src) { + FAIL_IF(emit_sse2_load(compiler, 1, freg, src, srcw)); + src = freg; + srcw = 0; + } + + FAIL_IF(emit_groupf(compiler, (elem_size == 2 ? SHUFPS_x_xm : MOVDDUP_x_xm) | (elem_size == 2 ? 0 : EX86_PREF_F2) | EX86_SSE2, freg, src, srcw)); + + if (elem_size == 2) + return emit_byte(compiler, 0); + return SLJIT_SUCCESS; + } + + if (src == SLJIT_IMM) { + if (elem_size == 0) { + srcw = (sljit_u8)srcw; + srcw |= srcw << 8; + srcw |= srcw << 16; + elem_size = 2; + } else if (elem_size == 1) { + srcw = (sljit_u16)srcw; + srcw |= srcw << 16; + elem_size = 2; + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (elem_size == 2 && (sljit_s32)srcw == -1) + srcw = -1; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (srcw == 0 || srcw == -1) { + if (reg_size == 5) + return emit_vex_instruction(compiler, (srcw == 0 ? PXOR_x_xm : PCMPEQD_x_xm) | VEX_256 | EX86_PREF_66 | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0); + + return emit_groupf(compiler, (srcw == 0 ? PXOR_x_xm : PCMPEQD_x_xm) | EX86_PREF_66 | EX86_SSE2, freg, freg, 0); + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (elem_size == 3) + FAIL_IF(emit_load_imm64(compiler, TMP_REG1, srcw)); + else +#endif /* SLJIT_CONFIG_X86_64 */ + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw); + src = TMP_REG1; srcw = 0; } - inst = emit_x86_instruction(compiler, 2, dst_reg, 0, src, srcw); + size = 2; + opcode = MOVD_x_rm; + + switch (elem_size) { + case 0: + if (!FAST_IS_REG(src)) { + opcode = 0x3a /* Prefix of PINSRB_x_rm_i8. */; + size = 3; + } + break; + case 1: + if (!FAST_IS_REG(src)) + opcode = PINSRW_x_rm_i8; + break; + case 2: + break; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + case 3: + /* MOVQ */ + compiler->mode32 = 0; + break; +#endif /* SLJIT_CONFIG_X86_64 */ + } + + inst = emit_x86_instruction(compiler, size | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, src, srcw); FAIL_IF(!inst); inst[0] = GROUP_0F; - inst[1] = U8(get_jump_code((sljit_uw)type) - 0x40); + inst[1] = opcode; + + if (reg_size == 5) { + SLJIT_ASSERT(opcode == MOVD_x_rm); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + size = VPBROADCASTD_x_xm; +#else /* !SLJIT_CONFIG_X86_32 */ + size = (elem_size == 3) ? VPBROADCASTQ_x_xm : VPBROADCASTD_x_xm; +#endif /* SLJIT_CONFIG_X86_32 */ + return emit_vex_instruction(compiler, size | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0); + } + + if (size == 3) { + SLJIT_ASSERT(opcode == 0x3a); + inst[2] = PINSRB_x_rm_i8; + } + + if (opcode != MOVD_x_rm) + FAIL_IF(emit_byte(compiler, 0)); + + switch (elem_size) { + case 0: + FAIL_IF(emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, TMP_FREG, 0)); + return emit_groupf_ext(compiler, PSHUFB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, TMP_FREG, 0); + case 1: + FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | EX86_PREF_F2 | EX86_SSE2, freg, freg, 0)); + FAIL_IF(emit_byte(compiler, 0)); + /* fallthrough */ + default: + FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0)); + return emit_byte(compiler, 0); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + case 3: + compiler->mode32 = 1; + FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0)); + return emit_byte(compiler, 0x44); +#endif /* SLJIT_CONFIG_X86_64 */ + } +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, sljit_s32 lane_index, + sljit_s32 srcdst, sljit_sw srcdstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_u8 *inst; + sljit_u8 opcode = 0; + sljit_uw size; + sljit_s32 freg_orig = freg; +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 srcdst_is_ereg = 0; + sljit_s32 srcdst_orig = 0; + sljit_sw srcdstw_orig = 0; +#endif /* SLJIT_CONFIG_X86_32 */ + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw)); + + ADJUST_LOCAL_OFFSET(srcdst, srcdstw); + + if (reg_size == 5) { + if (!(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + } else if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : elem_size > 2) + return SLJIT_ERR_UNSUPPORTED; +#else /* SLJIT_CONFIG_X86_32 */ + if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)) + return SLJIT_ERR_UNSUPPORTED; +#endif /* SLJIT_CONFIG_X86_32 */ + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#else /* !SLJIT_CONFIG_X86_64 */ + if (!(type & SLJIT_SIMD_FLOAT)) { + CHECK_EXTRA_REGS(srcdst, srcdstw, srcdst_is_ereg = 1); + + if ((type & SLJIT_SIMD_STORE) && ((srcdst_is_ereg && elem_size < 2) || (elem_size == 0 && (type & SLJIT_SIMD_LANE_SIGNED) && FAST_IS_REG(srcdst) && reg_map[srcdst] >= 4))) { + srcdst_orig = srcdst; + srcdstw_orig = srcdstw; + srcdst = TMP_REG1; + srcdstw = 0; + } + } +#endif /* SLJIT_CONFIG_X86_64 */ + + if (type & SLJIT_SIMD_LANE_ZERO) { + if (lane_index == 0) { + if (!(type & SLJIT_SIMD_FLOAT)) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (elem_size == 3) { + compiler->mode32 = 0; + elem_size = 2; + } +#endif /* SLJIT_CONFIG_X86_64 */ + if (srcdst == SLJIT_IMM) { + if (elem_size == 0) + srcdstw = (sljit_u8)srcdstw; + else if (elem_size == 1) + srcdstw = (sljit_u16)srcdstw; + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcdstw); + srcdst = TMP_REG1; + srcdstw = 0; + elem_size = 2; + } + + if (elem_size == 2) { + if (reg_size == 4) + return emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, srcdst, srcdstw); + return emit_vex_instruction(compiler, MOVD_x_rm | VEX_AUTO_W | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, srcdst, srcdstw); + } + } else if (srcdst & SLJIT_MEM) { + SLJIT_ASSERT(elem_size == 2 || elem_size == 3); + + if (reg_size == 4) + return emit_groupf(compiler, MOVSD_x_xm | (elem_size == 2 ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, freg, srcdst, srcdstw); + return emit_vex_instruction(compiler, MOVSD_x_xm | (elem_size == 2 ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, freg, 0, srcdst, srcdstw); + } else if (elem_size == 3) { + if (reg_size == 4) + return emit_groupf(compiler, MOVQ_x_xm | EX86_PREF_F3 | EX86_SSE2, freg, srcdst, 0); + return emit_vex_instruction(compiler, MOVQ_x_xm | EX86_PREF_F3 | EX86_SSE2, freg, 0, srcdst, 0); + } + } + + if (reg_size == 5 && lane_index >= (1 << (4 - elem_size))) { + freg = TMP_FREG; + lane_index -= (1 << (4 - elem_size)); + } else if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) { + FAIL_IF(emit_sse2_load(compiler, elem_size == 2, TMP_FREG, srcdst, srcdstw)); + srcdst = TMP_FREG; + srcdstw = 0; + } + + size = ((!(type & SLJIT_SIMD_FLOAT) || elem_size != 2) ? EX86_PREF_66 : 0) + | ((type & SLJIT_SIMD_FLOAT) ? XORPD_x_xm : PXOR_x_xm) | EX86_SSE2; + + if (reg_size == 5) + FAIL_IF(emit_vex_instruction(compiler, size | VEX_256 | VEX_SSE2_OPV, freg, freg, freg, 0)); + else + FAIL_IF(emit_groupf(compiler, size, freg, freg, 0)); + } else if (reg_size == 5 && lane_index >= (1 << (4 - elem_size))) { + FAIL_IF(emit_vex_instruction(compiler, ((type & SLJIT_SIMD_FLOAT) ? VEXTRACTF128_x_ym : VEXTRACTI128_x_ym) | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, 0, TMP_FREG, 0)); + FAIL_IF(emit_byte(compiler, 1)); + + freg = TMP_FREG; + lane_index -= (1 << (4 - elem_size)); + } + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size == 3) { + if (srcdst & SLJIT_MEM) { + if (type & SLJIT_SIMD_STORE) + size = lane_index == 0 ? MOVLPD_m_x : MOVHPD_m_x; + else + size = lane_index == 0 ? MOVLPD_x_m : MOVHPD_x_m; + + FAIL_IF(emit_groupf(compiler, size | EX86_PREF_66 | EX86_SSE2, freg, srcdst, srcdstw)); + + /* In case of store, freg is not TMP_FREG. */ + } else if (type & SLJIT_SIMD_STORE) { + if (lane_index == 1) + return emit_groupf(compiler, MOVHLPS_x_x | EX86_SSE2, srcdst, freg, 0); + return emit_sse2_load(compiler, 0, srcdst, freg, 0); + } else { + if (lane_index == 1) + FAIL_IF(emit_groupf(compiler, MOVLHPS_x_x | EX86_SSE2, freg, srcdst, 0)); + else + FAIL_IF(emit_sse2_store(compiler, 0, freg, 0, srcdst)); + } + } else if (type & SLJIT_SIMD_STORE) { + if (lane_index == 0) + return emit_sse2_store(compiler, 1, srcdst, srcdstw, freg); + + if (srcdst & SLJIT_MEM) { + FAIL_IF(emit_groupf_ext(compiler, EXTRACTPS_x_xm | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, srcdst, srcdstw)); + return emit_byte(compiler, U8(lane_index)); + } + + if (srcdst == freg) + size = SHUFPS_x_xm | EX86_SSE2; + else { + if (cpu_feature_list & CPU_FEATURE_AVX) { + FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | EX86_SSE2 | VEX_SSE2_OPV, srcdst, freg, freg, 0)); + return emit_byte(compiler, U8(lane_index)); + } + + switch (lane_index) { + case 1: + size = MOVSHDUP_x_xm | EX86_PREF_F3 | EX86_SSE2; + break; + case 2: + size = MOVHLPS_x_x | EX86_SSE2; + break; + default: + SLJIT_ASSERT(lane_index == 3); + size = PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2; + break; + } + } + + FAIL_IF(emit_groupf(compiler, size, srcdst, freg, 0)); + + size &= 0xff; + if (size == SHUFPS_x_xm || size == PSHUFD_x_xm) + return emit_byte(compiler, U8(lane_index)); + + return SLJIT_SUCCESS; + } else { + if (lane_index != 0 || (srcdst & SLJIT_MEM)) { + FAIL_IF(emit_groupf_ext(compiler, INSERTPS_x_xm | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, srcdst, srcdstw)); + FAIL_IF(emit_byte(compiler, U8(lane_index << 4))); + } else + FAIL_IF(emit_sse2_store(compiler, 1, freg, 0, srcdst)); + } + + if (freg != TMP_FREG || (type & SLJIT_SIMD_STORE)) + return SLJIT_SUCCESS; + + SLJIT_ASSERT(reg_size == 5); + + if (type & SLJIT_SIMD_LANE_ZERO) { + FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg_orig, 0, TMP_FREG, 0)); + return emit_byte(compiler, 0x4e); + } + + FAIL_IF(emit_vex_instruction(compiler, VINSERTF128_y_y_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2 | VEX_SSE2_OPV, freg_orig, freg_orig, TMP_FREG, 0)); + return emit_byte(compiler, 1); + } + + if (srcdst == SLJIT_IMM) { + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcdstw); + srcdst = TMP_REG1; + srcdstw = 0; + } + + size = 3; + + switch (elem_size) { + case 0: + opcode = (type & SLJIT_SIMD_STORE) ? PEXTRB_rm_x_i8 : PINSRB_x_rm_i8; + break; + case 1: + if (!(type & SLJIT_SIMD_STORE)) { + size = 2; + opcode = PINSRW_x_rm_i8; + } else + opcode = PEXTRW_rm_x_i8; + break; + case 2: + opcode = (type & SLJIT_SIMD_STORE) ? PEXTRD_rm_x_i8 : PINSRD_x_rm_i8; + break; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + case 3: + /* PINSRQ / PEXTRQ */ + opcode = (type & SLJIT_SIMD_STORE) ? PEXTRD_rm_x_i8 : PINSRD_x_rm_i8; + compiler->mode32 = 0; + break; +#endif /* SLJIT_CONFIG_X86_64 */ + } + + inst = emit_x86_instruction(compiler, size | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, srcdst, srcdstw); + FAIL_IF(!inst); + inst[0] = GROUP_0F; + + if (size == 3) { + inst[1] = 0x3a; + inst[2] = opcode; + } else + inst[1] = opcode; + + FAIL_IF(emit_byte(compiler, U8(lane_index))); + + if (!(type & SLJIT_SIMD_LANE_SIGNED) || (srcdst & SLJIT_MEM)) { + if (freg == TMP_FREG && !(type & SLJIT_SIMD_STORE)) { + SLJIT_ASSERT(reg_size == 5); + + if (type & SLJIT_SIMD_LANE_ZERO) { + FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg_orig, 0, TMP_FREG, 0)); + return emit_byte(compiler, 0x4e); + } + + FAIL_IF(emit_vex_instruction(compiler, VINSERTI128_y_y_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2 | VEX_SSE2_OPV, freg_orig, freg_orig, TMP_FREG, 0)); + return emit_byte(compiler, 1); + } + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (srcdst_orig & SLJIT_MEM) + return emit_mov(compiler, srcdst_orig, srcdstw_orig, TMP_REG1, 0); +#endif /* SLJIT_CONFIG_X86_32 */ + return SLJIT_SUCCESS; + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (elem_size >= 3) + return SLJIT_SUCCESS; + + compiler->mode32 = (type & SLJIT_32); + + size = 2; + + if (elem_size == 0) + size |= EX86_REX; + + if (elem_size == 2) { + if (type & SLJIT_32) + return SLJIT_SUCCESS; + + SLJIT_ASSERT(!(compiler->mode32)); + size = 1; + } + + inst = emit_x86_instruction(compiler, size, srcdst, 0, srcdst, 0); + FAIL_IF(!inst); + + if (size != 1) { + inst[0] = GROUP_0F; + inst[1] = U8((elem_size == 0) ? MOVSX_r_rm8 : MOVSX_r_rm16); + } else + inst[0] = MOVSXD_r_rm; +#else /* !SLJIT_CONFIG_X86_64 */ + if (elem_size >= 2) + return SLJIT_SUCCESS; + + FAIL_IF(emit_groupf(compiler, (elem_size == 0) ? MOVSX_r_rm8 : MOVSX_r_rm16, + (srcdst_orig != 0 && FAST_IS_REG(srcdst_orig)) ? srcdst_orig : srcdst, srcdst, 0)); + + if (srcdst_orig & SLJIT_MEM) + return emit_mov(compiler, srcdst_orig, srcdstw_orig, TMP_REG1, 0); +#endif /* SLJIT_CONFIG_X86_64 */ + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_s32 src_lane_index) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_uw pref; + sljit_u8 byte; +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 opcode3 = TMP_REG1; +#else /* !SLJIT_CONFIG_X86_32 */ + sljit_s32 opcode3 = SLJIT_S0; +#endif /* SLJIT_CONFIG_X86_32 */ + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index)); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + SLJIT_ASSERT(reg_map[opcode3] == 3); + + if (reg_size == 5) { + if (!(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + } else if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_FLOAT) { + pref = 0; + byte = U8(src_lane_index); + + if (elem_size == 3) { + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 5) { + if (src_lane_index == 0) + return emit_vex_instruction(compiler, VBROADCASTSD_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0); + + FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0)); + + byte = U8(byte | (byte << 2)); + return emit_byte(compiler, U8(byte | (byte << 4))); + } + + if (src_lane_index == 0) + return emit_groupf(compiler, MOVDDUP_x_xm | EX86_PREF_F2 | EX86_SSE2, freg, src, 0); + + /* Changes it to SHUFPD_x_xm. */ + pref = EX86_PREF_66; + } else if (elem_size != 2) + return SLJIT_ERR_UNSUPPORTED; + else if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 5) { + SLJIT_ASSERT(elem_size == 2); + + if (src_lane_index == 0) + return emit_vex_instruction(compiler, VBROADCASTSS_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0); + + FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0)); + + byte = 0x44; + if (src_lane_index >= 4) { + byte = 0xee; + src_lane_index -= 4; + } + + FAIL_IF(emit_byte(compiler, byte)); + FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | VEX_256 | pref | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0)); + byte = U8(src_lane_index); + } else if (freg != src && (cpu_feature_list & CPU_FEATURE_AVX)) { + FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | pref | EX86_SSE2 | VEX_SSE2_OPV, freg, src, src, 0)); + } else { + if (freg != src) + FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | pref | EX86_SSE2, freg, src, 0)); + + FAIL_IF(emit_groupf(compiler, SHUFPS_x_xm | pref | EX86_SSE2, freg, freg, 0)); + } + + if (elem_size == 2) { + byte = U8(byte | (byte << 2)); + byte = U8(byte | (byte << 4)); + } else + byte = U8(byte | (byte << 1)); + + return emit_byte(compiler, U8(byte)); + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (elem_size == 0) { + if (reg_size == 5 && src_lane_index >= 16) { + FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0)); + FAIL_IF(emit_byte(compiler, src_lane_index >= 24 ? 0xff : 0xaa)); + src_lane_index &= 0x7; + src = freg; + } + + if ((freg != src && !(cpu_feature_list & CPU_FEATURE_AVX2)) || src_lane_index != 0) { + pref = 0; + + if ((src_lane_index & 0x3) == 0) { + pref = EX86_PREF_66; + byte = U8(src_lane_index >> 2); + } else if (src_lane_index < 8 && (src_lane_index & 0x1) == 0) { + pref = EX86_PREF_F2; + byte = U8(src_lane_index >> 1); + } else { + if (freg == src || !(cpu_feature_list & CPU_FEATURE_AVX2)) { + if (freg != src) + FAIL_IF(emit_groupf(compiler, MOVDQA_x_xm | EX86_PREF_66 | EX86_SSE2, freg, src, 0)); + + FAIL_IF(emit_groupf(compiler, PSRLDQ_x | EX86_PREF_66 | EX86_SSE2_OP2, opcode3, freg, 0)); + } else + FAIL_IF(emit_vex_instruction(compiler, PSRLDQ_x | EX86_PREF_66 | EX86_SSE2_OP2 | VEX_SSE2_OPV, opcode3, freg, src, 0)); + + FAIL_IF(emit_byte(compiler, U8(src_lane_index))); + } + + if (pref != 0) { + FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | pref | EX86_SSE2, freg, src, 0)); + FAIL_IF(emit_byte(compiler, byte)); + } + + src = freg; + } + + if (cpu_feature_list & CPU_FEATURE_AVX2) + return emit_vex_instruction(compiler, VPBROADCASTB_x_xm | (reg_size == 5 ? VEX_256 : 0) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0); + + SLJIT_ASSERT(reg_size == 4); + FAIL_IF(emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, TMP_FREG, 0)); + return emit_groupf_ext(compiler, PSHUFB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, TMP_FREG, 0); + } + + if ((cpu_feature_list & CPU_FEATURE_AVX2) && src_lane_index == 0 && elem_size <= 3) { + switch (elem_size) { + case 1: + pref = VPBROADCASTW_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + case 2: + pref = VPBROADCASTD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + default: + pref = VPBROADCASTQ_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2; + break; + } + + if (reg_size == 5) + pref |= VEX_256; + + return emit_vex_instruction(compiler, pref, freg, 0, src, 0); + } + + if (reg_size == 5) { + switch (elem_size) { + case 1: + byte = U8(src_lane_index & 0x3); + src_lane_index >>= 2; + pref = PSHUFLW_x_xm | VEX_256 | ((src_lane_index & 1) == 0 ? EX86_PREF_F2 : EX86_PREF_F3) | EX86_SSE2; + break; + case 2: + byte = U8(src_lane_index & 0x3); + src_lane_index >>= 1; + pref = PSHUFD_x_xm | VEX_256 | EX86_PREF_66 | EX86_SSE2; + break; + case 3: + pref = 0; + break; + default: + FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0)); + return emit_byte(compiler, U8(src_lane_index == 0 ? 0x44 : 0xee)); + } + + if (pref != 0) { + FAIL_IF(emit_vex_instruction(compiler, pref, freg, 0, src, 0)); + byte = U8(byte | (byte << 2)); + FAIL_IF(emit_byte(compiler, U8(byte | (byte << 4)))); + + if (src_lane_index == 0) + return emit_vex_instruction(compiler, VPBROADCASTQ_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0); + + src = freg; + } + + FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0)); + byte = U8(src_lane_index); + byte = U8(byte | (byte << 2)); + return emit_byte(compiler, U8(byte | (byte << 4))); + } + + switch (elem_size) { + case 1: + byte = U8(src_lane_index & 0x3); + src_lane_index >>= 1; + pref = (src_lane_index & 2) == 0 ? EX86_PREF_F2 : EX86_PREF_F3; + + FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | pref | EX86_SSE2, freg, src, 0)); + byte = U8(byte | (byte << 2)); + FAIL_IF(emit_byte(compiler, U8(byte | (byte << 4)))); + + if ((cpu_feature_list & CPU_FEATURE_AVX2) && pref == EX86_PREF_F2) + return emit_vex_instruction(compiler, VPBROADCASTD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0); + + src = freg; + /* fallthrough */ + case 2: + byte = U8(src_lane_index); + byte = U8(byte | (byte << 2)); + break; + default: + byte = U8(src_lane_index << 1); + byte = U8(byte | (byte << 2) | 0x4); + break; + } + + FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, src, 0)); + return emit_byte(compiler, U8(byte | (byte << 4))); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type); + sljit_u8 opcode; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw)); + + ADJUST_LOCAL_OFFSET(src, srcw); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (reg_size == 5) { + if (!(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + } else if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_FLOAT) { + if (elem_size != 2 || elem2_size != 3) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + return emit_groupf(compiler, CVTPS2PD_x_xm | EX86_SSE2, freg, src, srcw); + return emit_vex_instruction(compiler, CVTPS2PD_x_xm | VEX_256 | EX86_SSE2, freg, 0, src, srcw); + } + + switch (elem_size) { + case 0: + if (elem2_size == 1) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBW_x_xm : PMOVZXBW_x_xm; + else if (elem2_size == 2) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBD_x_xm : PMOVZXBD_x_xm; + else if (elem2_size == 3) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBQ_x_xm : PMOVZXBQ_x_xm; + else + return SLJIT_ERR_UNSUPPORTED; + break; + case 1: + if (elem2_size == 2) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXWD_x_xm : PMOVZXWD_x_xm; + else if (elem2_size == 3) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXWQ_x_xm : PMOVZXWQ_x_xm; + else + return SLJIT_ERR_UNSUPPORTED; + break; + case 2: + if (elem2_size == 3) + opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXDQ_x_xm : PMOVZXDQ_x_xm; + else + return SLJIT_ERR_UNSUPPORTED; + break; + default: + return SLJIT_ERR_UNSUPPORTED; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + if (reg_size == 4) + return emit_groupf_ext(compiler, opcode | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, src, srcw); + return emit_vex_instruction(compiler, opcode | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 dst, sljit_sw dstw) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 dst_r; + sljit_uw pref; + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)) + return SLJIT_ERR_UNSUPPORTED; + + if (reg_size == 4) { + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + pref = EX86_PREF_66 | EX86_SSE2_OP2; + + switch (elem_size) { + case 1: + FAIL_IF(emit_groupf(compiler, PACKSSWB_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, freg, 0)); + freg = TMP_FREG; + break; + case 2: + pref = EX86_SSE2_OP2; + break; + } + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + FAIL_IF(emit_groupf(compiler, (elem_size < 2 ? PMOVMSKB_r_x : MOVMSKPS_r_x) | pref, dst_r, freg, 0)); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = type & SLJIT_32; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (elem_size == 1) { + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 8, dst_r, 0); + FAIL_IF(!inst); + inst[1] |= SHR; + } + + if (dst_r == TMP_REG1) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + + return SLJIT_SUCCESS; + } + + if (reg_size != 5 || !(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (elem_size == 1) { + FAIL_IF(emit_vex_instruction(compiler, VEXTRACTI128_x_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, 0, TMP_FREG, 0)); + FAIL_IF(emit_byte(compiler, 1)); + FAIL_IF(emit_vex_instruction(compiler, PACKSSWB_x_xm | VEX_256 | EX86_PREF_66 | EX86_SSE2 | VEX_SSE2_OPV, TMP_FREG, freg, TMP_FREG, 0)); + FAIL_IF(emit_groupf(compiler, PMOVMSKB_r_x | EX86_PREF_66 | EX86_SSE2_OP2, dst_r, TMP_FREG, 0)); + } else { + pref = MOVMSKPS_r_x | VEX_256 | EX86_SSE2_OP2; + + if (elem_size == 0) + pref = PMOVMSKB_r_x | VEX_256 | EX86_PREF_66 | EX86_SSE2_OP2; + else if (elem_size == 3) + pref |= EX86_PREF_66; + + FAIL_IF(emit_vex_instruction(compiler, pref, dst_r, 0, freg, 0)); + } + + if (dst_r == TMP_REG1) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = type & SLJIT_32; +#endif /* SLJIT_CONFIG_X86_64 */ + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src_freg) +{ + sljit_uw op = ((type & SLJIT_SIMD_FLOAT) ? MOVAPS_x_xm : MOVDQA_x_xm) | EX86_SSE2; + + SLJIT_ASSERT(SLJIT_SIMD_GET_REG_SIZE(type) == 4); + + if (!(type & SLJIT_SIMD_FLOAT) || SLJIT_SIMD_GET_ELEM_SIZE(type) == 3) + op |= EX86_PREF_66; + + return emit_groupf(compiler, op, dst_freg, src_freg, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg) +{ + sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type); + sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type); + sljit_s32 needs_move = 0; + sljit_uw op = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg)); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif /* SLJIT_CONFIG_X86_64 */ + + if (reg_size == 5) { + if (!(cpu_feature_list & CPU_FEATURE_AVX2)) + return SLJIT_ERR_UNSUPPORTED; + } else if (reg_size != 4) + return SLJIT_ERR_UNSUPPORTED; + + if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3)) + return SLJIT_ERR_UNSUPPORTED; + + switch (SLJIT_SIMD_GET_OPCODE(type)) { + case SLJIT_SIMD_OP2_AND: + op = (type & SLJIT_SIMD_FLOAT) ? ANDPD_x_xm : PAND_x_xm; + + if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3) + op |= EX86_PREF_66; + break; + case SLJIT_SIMD_OP2_OR: + op = (type & SLJIT_SIMD_FLOAT) ? ORPD_x_xm : POR_x_xm; + + if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3) + op |= EX86_PREF_66; + break; + case SLJIT_SIMD_OP2_XOR: + op = (type & SLJIT_SIMD_FLOAT) ? XORPD_x_xm : PXOR_x_xm; + + if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3) + op |= EX86_PREF_66; + break; + } + + if (type & SLJIT_SIMD_TEST) + return SLJIT_SUCCESS; + + needs_move = dst_freg != src1_freg && dst_freg != src2_freg; + + if (reg_size == 5 || (needs_move && (cpu_feature_list & CPU_FEATURE_AVX2))) { + if (reg_size == 5) + op |= VEX_256; + + return emit_vex_instruction(compiler, op | EX86_SSE2 | VEX_SSE2_OPV, dst_freg, src1_freg, src2_freg, 0); + } + + if (needs_move) { + FAIL_IF(emit_simd_mov(compiler, type, dst_freg, src1_freg)); + } else if (dst_freg != src1_freg) { + SLJIT_ASSERT(dst_freg == src2_freg); + src2_freg = src1_freg; + } + + FAIL_IF(emit_groupf(compiler, op | EX86_SSE2, dst_freg, src2_freg, 0)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst_reg, + sljit_s32 mem_reg) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg)); + + SLJIT_SKIP_CHECKS(compiler); + return sljit_emit_op1(compiler, op, dst_reg, 0, SLJIT_MEM1(mem_reg), 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src_reg, + sljit_s32 mem_reg, + sljit_s32 temp_reg) +{ + sljit_uw pref; + sljit_s32 free_reg = TMP_REG1; +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_sw srcw = 0; + sljit_sw tempw = 0; +#endif /* SLJIT_CONFIG_X86_32 */ + + CHECK_ERROR(); + CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg)); + CHECK_EXTRA_REGS(src_reg, srcw, (void)0); + CHECK_EXTRA_REGS(temp_reg, tempw, (void)0); + + SLJIT_ASSERT(FAST_IS_REG(src_reg) || src_reg == SLJIT_MEM1(SLJIT_SP)); + SLJIT_ASSERT(FAST_IS_REG(temp_reg) || temp_reg == SLJIT_MEM1(SLJIT_SP)); + + op = GET_OPCODE(op); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if ((src_reg & SLJIT_MEM) || (op == SLJIT_MOV_U8 && reg_map[src_reg] >= 4)) { + /* Src is virtual register or its low byte is not accessible. */ + SLJIT_ASSERT(src_reg != SLJIT_R1); + free_reg = src_reg; + + EMIT_MOV(compiler, TMP_REG1, 0, src_reg, srcw); + src_reg = TMP_REG1; + + if (mem_reg == src_reg) + mem_reg = TMP_REG1; + } +#endif /* SLJIT_CONFIG_X86_32 */ + + if (temp_reg != SLJIT_R0) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; + + EMIT_MOV(compiler, free_reg, 0, SLJIT_R0, 0); + EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, 0); + + if (src_reg == SLJIT_R0) + src_reg = free_reg; + if (mem_reg == SLJIT_R0) + mem_reg = free_reg; +#else /* !SLJIT_CONFIG_X86_64 */ + if (src_reg == TMP_REG1 && mem_reg == SLJIT_R0 && (free_reg & SLJIT_MEM)) { + EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R1, 0); + EMIT_MOV(compiler, SLJIT_R1, 0, SLJIT_R0, 0); + EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, tempw); + + mem_reg = SLJIT_R1; + free_reg = SLJIT_R1; + } else { + EMIT_MOV(compiler, free_reg, 0, SLJIT_R0, 0); + EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, tempw); + + if (src_reg == SLJIT_R0) + src_reg = free_reg; + if (mem_reg == SLJIT_R0) + mem_reg = free_reg; + } +#endif /* SLJIT_CONFIG_X86_64 */ + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = op != SLJIT_MOV && op != SLJIT_MOV_P; +#endif /* SLJIT_CONFIG_X86_64 */ + + /* Lock prefix. */ + FAIL_IF(emit_byte(compiler, GROUP_LOCK)); + + pref = 0; + if (op == SLJIT_MOV_U16) + pref = EX86_HALF_ARG | EX86_PREF_66; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (op == SLJIT_MOV_U8) + pref = EX86_REX; +#endif /* SLJIT_CONFIG_X86_64 */ + + FAIL_IF(emit_groupf(compiler, (op == SLJIT_MOV_U8 ? CMPXCHG_rm8_r : CMPXCHG_rm_r) | pref, src_reg, SLJIT_MEM1(mem_reg), 0)); + + if (temp_reg != SLJIT_R0) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; + return emit_mov(compiler, SLJIT_R0, 0, TMP_REG1, 0); +#else /* !SLJIT_CONFIG_X86_64 */ + EMIT_MOV(compiler, SLJIT_R0, 0, free_reg, 0); + if (free_reg != TMP_REG1) + return emit_mov(compiler, free_reg, 0, (free_reg == SLJIT_R1) ? SLJIT_MEM1(SLJIT_SP) : TMP_REG1, 0); +#endif /* SLJIT_CONFIG_X86_64 */ + } return SLJIT_SUCCESS; } @@ -3389,11 +4826,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return NULL; #endif - inst = (sljit_u8*)ensure_buf(compiler, 2); + inst = (sljit_u8*)ensure_buf(compiler, 1); PTR_FAIL_IF(!inst); - inst[0] = 0; - inst[1] = 2; + inst[0] = SLJIT_INST_CONST; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (dst & SLJIT_MEM) @@ -3404,52 +4840,48 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } -SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) { - struct sljit_put_label *put_label; + struct sljit_jump *jump; sljit_u8 *inst; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) sljit_s32 reg; - sljit_uw start_size; -#endif +#endif /* SLJIT_CONFIG_X86_64 */ CHECK_ERROR_PTR(); - CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw)); ADJUST_LOCAL_OFFSET(dst, dstw); CHECK_EXTRA_REGS(dst, dstw, (void)0); - put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); - PTR_FAIL_IF(!put_label); - set_put_label(put_label, compiler, 0); + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_mov_addr(jump, compiler, 0); #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) compiler->mode32 = 0; reg = FAST_IS_REG(dst) ? dst : TMP_REG1; - if (emit_load_imm64(compiler, reg, 0)) - return NULL; -#else - if (emit_mov(compiler, dst, dstw, SLJIT_IMM, 0)) - return NULL; -#endif + PTR_FAIL_IF(emit_load_imm64(compiler, reg, 0)); + jump->addr = compiler->size; -#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - if (dst & SLJIT_MEM) { - start_size = compiler->size; - if (emit_mov(compiler, dst, dstw, TMP_REG1, 0)) - return NULL; - put_label->flags = compiler->size - start_size; - } -#endif + if (reg_map[reg] >= 8) + jump->flags |= MOV_ADDR_HI; +#else /* !SLJIT_CONFIG_X86_64 */ + PTR_FAIL_IF(emit_mov(compiler, dst, dstw, SLJIT_IMM, 0)); +#endif /* SLJIT_CONFIG_X86_64 */ - inst = (sljit_u8*)ensure_buf(compiler, 2); + inst = (sljit_u8*)ensure_buf(compiler, 1); PTR_FAIL_IF(!inst); - inst[0] = 0; - inst[1] = 3; + inst[0] = SLJIT_INST_MOV_ADDR; - return put_label; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_mov(compiler, dst, dstw, TMP_REG1, 0)); +#endif /* SLJIT_CONFIG_X86_64 */ + + return jump; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitSerialize.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitSerialize.c new file mode 100755 index 0000000000..4392b2da9a --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitSerialize.c @@ -0,0 +1,516 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_has_label(struct sljit_jump *jump) +{ + return !(jump->flags & JUMP_ADDR) && (jump->u.label != NULL); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_has_target(struct sljit_jump *jump) +{ + return (jump->flags & JUMP_ADDR) != 0; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_jump_is_mov_addr(struct sljit_jump *jump) +{ + return (jump->flags & JUMP_MOV_ADDR) != 0; +} + +#define SLJIT_SERIALIZE_DEBUG ((sljit_u16)0x1) + +struct sljit_serialized_compiler { + sljit_u32 signature; + sljit_u16 version; + sljit_u16 cpu_type; + + sljit_uw buf_segment_count; + sljit_uw label_count; + sljit_uw jump_count; + sljit_uw const_count; + + sljit_s32 options; + sljit_s32 scratches; + sljit_s32 saveds; + sljit_s32 fscratches; + sljit_s32 fsaveds; + sljit_s32 local_size; + sljit_uw size; + +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + sljit_s32 status_flags_state; +#endif /* SLJIT_HAS_STATUS_FLAGS_STATE */ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 args_size; +#endif /* SLJIT_CONFIG_X86_32 */ + +#if ((defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && (defined __SOFTFP__)) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + sljit_uw args_size; +#endif /* (SLJIT_CONFIG_ARM_32 && __SOFTFP__) || SLJIT_CONFIG_MIPS_32 */ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + sljit_uw cpool_diff; + sljit_uw cpool_fill; + sljit_uw patches; +#endif /* SLJIT_CONFIG_ARM_V6 */ + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + sljit_s32 delay_slot; +#endif /* SLJIT_CONFIG_MIPS */ + +}; + +struct sljit_serialized_debug_info { + sljit_sw last_flags; + sljit_s32 last_return; + sljit_s32 logical_local_size; +}; + +struct sljit_serialized_label { + sljit_uw size; +}; + +struct sljit_serialized_jump { + sljit_uw addr; + sljit_uw flags; + sljit_uw value; +}; + +struct sljit_serialized_const { + sljit_uw addr; +}; + +#define SLJIT_SERIALIZE_ALIGN(v) (((v) + sizeof(sljit_uw) - 1) & ~(sljit_uw)(sizeof(sljit_uw) - 1)) +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#define SLJIT_SERIALIZE_SIGNATURE 0x534c4a54 +#else /* !SLJIT_LITTLE_ENDIAN */ +#define SLJIT_SERIALIZE_SIGNATURE 0x544a4c53 +#endif /* SLJIT_LITTLE_ENDIAN */ +#define SLJIT_SERIALIZE_VERSION 1 + +SLJIT_API_FUNC_ATTRIBUTE sljit_uw* sljit_serialize_compiler(struct sljit_compiler *compiler, + sljit_s32 options, sljit_uw *size) +{ + sljit_uw total_size = sizeof(struct sljit_serialized_compiler); + struct sljit_memory_fragment *buf; + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_serialized_compiler *serialized_compiler; + struct sljit_serialized_label *serialized_label; + struct sljit_serialized_jump *serialized_jump; + struct sljit_serialized_const *serialized_const; +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + struct sljit_serialized_debug_info *serialized_debug_info; +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + sljit_uw counter, used_size; + sljit_u8 *result; + sljit_u8 *ptr; + SLJIT_UNUSED_ARG(options); + + if (size != NULL) + *size = 0; + + PTR_FAIL_IF(compiler->error); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + if (!(options & SLJIT_SERIALIZE_IGNORE_DEBUG)) + total_size += sizeof(struct sljit_serialized_debug_info); +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + total_size += SLJIT_SERIALIZE_ALIGN(compiler->cpool_fill * (sizeof(sljit_uw) + 1)); +#endif /* SLJIT_CONFIG_ARM_V6 */ + + /* Compute the size of the data. */ + buf = compiler->buf; + while (buf != NULL) { + total_size += sizeof(sljit_uw) + SLJIT_SERIALIZE_ALIGN(buf->used_size); + buf = buf->next; + } + + total_size += compiler->label_count * sizeof(struct sljit_serialized_label); + + jump = compiler->jumps; + while (jump != NULL) { + total_size += sizeof(struct sljit_serialized_jump); + jump = jump->next; + } + + const_ = compiler->consts; + while (const_ != NULL) { + total_size += sizeof(struct sljit_serialized_const); + const_ = const_->next; + } + + result = (sljit_u8*)SLJIT_MALLOC(total_size, compiler->allocator_data); + PTR_FAIL_IF_NULL(result); + + if (size != NULL) + *size = total_size; + + ptr = result; + serialized_compiler = (struct sljit_serialized_compiler*)ptr; + ptr += sizeof(struct sljit_serialized_compiler); + + serialized_compiler->signature = SLJIT_SERIALIZE_SIGNATURE; + serialized_compiler->version = SLJIT_SERIALIZE_VERSION; + serialized_compiler->cpu_type = 0; + serialized_compiler->label_count = compiler->label_count; + serialized_compiler->options = compiler->options; + serialized_compiler->scratches = compiler->scratches; + serialized_compiler->saveds = compiler->saveds; + serialized_compiler->fscratches = compiler->fscratches; + serialized_compiler->fsaveds = compiler->fsaveds; + serialized_compiler->local_size = compiler->local_size; + serialized_compiler->size = compiler->size; + +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + serialized_compiler->status_flags_state = compiler->status_flags_state; +#endif /* SLJIT_HAS_STATUS_FLAGS_STATE */ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + || ((defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && (defined __SOFTFP__)) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + serialized_compiler->args_size = compiler->args_size; +#endif /* SLJIT_CONFIG_X86_32 || (SLJIT_CONFIG_ARM_32 && __SOFTFP__) || SLJIT_CONFIG_MIPS_32 */ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + serialized_compiler->cpool_diff = compiler->cpool_diff; + serialized_compiler->cpool_fill = compiler->cpool_fill; + serialized_compiler->patches = compiler->patches; + + SLJIT_MEMCPY(ptr, compiler->cpool, compiler->cpool_fill * sizeof(sljit_uw)); + SLJIT_MEMCPY(ptr + compiler->cpool_fill * sizeof(sljit_uw), compiler->cpool_unique, compiler->cpool_fill); + ptr += SLJIT_SERIALIZE_ALIGN(compiler->cpool_fill * (sizeof(sljit_uw) + 1)); +#endif /* SLJIT_CONFIG_ARM_V6 */ + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + serialized_compiler->delay_slot = compiler->delay_slot; +#endif /* SLJIT_CONFIG_MIPS */ + + buf = compiler->buf; + counter = 0; + while (buf != NULL) { + used_size = buf->used_size; + *(sljit_uw*)ptr = used_size; + ptr += sizeof(sljit_uw); + SLJIT_MEMCPY(ptr, buf->memory, used_size); + ptr += SLJIT_SERIALIZE_ALIGN(used_size); + buf = buf->next; + counter++; + } + serialized_compiler->buf_segment_count = counter; + + label = compiler->labels; + while (label != NULL) { + serialized_label = (struct sljit_serialized_label*)ptr; + serialized_label->size = label->size; + ptr += sizeof(struct sljit_serialized_label); + label = label->next; + } + + jump = compiler->jumps; + counter = 0; + while (jump != NULL) { + serialized_jump = (struct sljit_serialized_jump*)ptr; + serialized_jump->addr = jump->addr; + serialized_jump->flags = jump->flags; + + if (jump->flags & JUMP_ADDR) + serialized_jump->value = jump->u.target; + else if (jump->u.label != NULL) + serialized_jump->value = jump->u.label->u.index; + else + serialized_jump->value = SLJIT_MAX_ADDRESS; + + ptr += sizeof(struct sljit_serialized_jump); + jump = jump->next; + counter++; + } + serialized_compiler->jump_count = counter; + + const_ = compiler->consts; + counter = 0; + while (const_ != NULL) { + serialized_const = (struct sljit_serialized_const*)ptr; + serialized_const->addr = const_->addr; + ptr += sizeof(struct sljit_serialized_const); + const_ = const_->next; + counter++; + } + serialized_compiler->const_count = counter; + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + if (!(options & SLJIT_SERIALIZE_IGNORE_DEBUG)) { + serialized_debug_info = (struct sljit_serialized_debug_info*)ptr; + serialized_debug_info->last_flags = compiler->last_flags; + serialized_debug_info->last_return = compiler->last_return; + serialized_debug_info->logical_local_size = compiler->logical_local_size; + serialized_compiler->cpu_type |= SLJIT_SERIALIZE_DEBUG; +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + ptr += sizeof(struct sljit_serialized_debug_info); +#endif /* SLJIT_DEBUG */ + } +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + + SLJIT_ASSERT((sljit_uw)(ptr - result) == total_size); + return (sljit_uw*)result; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler *sljit_deserialize_compiler(sljit_uw* buffer, sljit_uw size, + sljit_s32 options, void *allocator_data, void *exec_allocator_data) +{ + struct sljit_compiler *compiler; + struct sljit_serialized_compiler *serialized_compiler; + struct sljit_serialized_label *serialized_label; + struct sljit_serialized_jump *serialized_jump; + struct sljit_serialized_const *serialized_const; +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + struct sljit_serialized_debug_info *serialized_debug_info; +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + struct sljit_memory_fragment *buf; + struct sljit_memory_fragment *last_buf; + struct sljit_label *label; + struct sljit_label *last_label; + struct sljit_label **label_list = NULL; + struct sljit_jump *jump; + struct sljit_jump *last_jump; + struct sljit_const *const_; + struct sljit_const *last_const; + sljit_u8 *ptr = (sljit_u8*)buffer; + sljit_u8 *end = ptr + size; + sljit_uw i, used_size, aligned_size, label_count; + SLJIT_UNUSED_ARG(options); + + if (size < sizeof(struct sljit_serialized_compiler) || (size & (sizeof(sljit_uw) - 1)) != 0) + return NULL; + + serialized_compiler = (struct sljit_serialized_compiler*)ptr; + + if (serialized_compiler->signature != SLJIT_SERIALIZE_SIGNATURE || serialized_compiler->version != SLJIT_SERIALIZE_VERSION) + return NULL; + + compiler = sljit_create_compiler(allocator_data, exec_allocator_data); + PTR_FAIL_IF(compiler == NULL); + + compiler->label_count = serialized_compiler->label_count; + compiler->options = serialized_compiler->options; + compiler->scratches = serialized_compiler->scratches; + compiler->saveds = serialized_compiler->saveds; + compiler->fscratches = serialized_compiler->fscratches; + compiler->fsaveds = serialized_compiler->fsaveds; + compiler->local_size = serialized_compiler->local_size; + compiler->size = serialized_compiler->size; + +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE) + compiler->status_flags_state = serialized_compiler->status_flags_state; +#endif /* SLJIT_HAS_STATUS_FLAGS_STATE */ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + || ((defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && (defined __SOFTFP__)) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + compiler->args_size = serialized_compiler->args_size; +#endif /* SLJIT_CONFIG_X86_32 || (SLJIT_CONFIG_ARM_32 && __SOFTFP__) || SLJIT_CONFIG_MIPS_32 */ + +#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) + used_size = serialized_compiler->cpool_fill; + aligned_size = SLJIT_SERIALIZE_ALIGN(used_size * (sizeof(sljit_uw) + 1)); + compiler->cpool_diff = serialized_compiler->cpool_diff; + compiler->cpool_fill = used_size; + compiler->patches = serialized_compiler->patches; + + if ((sljit_uw)(end - ptr) < aligned_size) + goto error; + + SLJIT_MEMCPY(compiler->cpool, ptr, used_size * sizeof(sljit_uw)); + SLJIT_MEMCPY(compiler->cpool_unique, ptr + used_size * sizeof(sljit_uw), used_size); + ptr += aligned_size; +#endif /* SLJIT_CONFIG_ARM_V6 */ + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + compiler->delay_slot = serialized_compiler->delay_slot; +#endif /* SLJIT_CONFIG_MIPS */ + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + if (!(serialized_compiler->cpu_type & SLJIT_SERIALIZE_DEBUG)) + goto error; +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + + ptr += sizeof(struct sljit_serialized_compiler); + i = serialized_compiler->buf_segment_count; + last_buf = NULL; + while (i > 0) { + if ((sljit_uw)(end - ptr) < sizeof(sljit_uw)) + goto error; + + used_size = *(sljit_uw*)ptr; + aligned_size = SLJIT_SERIALIZE_ALIGN(used_size); + ptr += sizeof(sljit_uw); + + if ((sljit_uw)(end - ptr) < aligned_size) + goto error; + + if (last_buf == NULL) { + SLJIT_ASSERT(compiler->buf != NULL && compiler->buf->next == NULL); + buf = compiler->buf; + } else { + buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data); + if (!buf) + goto error; + buf->next = NULL; + } + + buf->used_size = used_size; + SLJIT_MEMCPY(buf->memory, ptr, used_size); + + if (last_buf != NULL) + last_buf->next = buf; + last_buf = buf; + + ptr += aligned_size; + i--; + } + + last_label = NULL; + label_count = serialized_compiler->label_count; + if ((sljit_uw)(end - ptr) < label_count * sizeof(struct sljit_serialized_label)) + goto error; + + label_list = (struct sljit_label **)SLJIT_MALLOC(label_count * sizeof(struct sljit_label*), allocator_data); + if (label_list == NULL) + goto error; + + for (i = 0; i < label_count; i++) { + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + if (label == NULL) + goto error; + + serialized_label = (struct sljit_serialized_label*)ptr; + label->next = NULL; + label->u.index = i; + label->size = serialized_label->size; + + if (last_label != NULL) + last_label->next = label; + else + compiler->labels = label; + last_label = label; + + label_list[i] = label; + ptr += sizeof(struct sljit_serialized_label); + } + compiler->last_label = last_label; + + last_jump = NULL; + i = serialized_compiler->jump_count; + if ((sljit_uw)(end - ptr) < i * sizeof(struct sljit_serialized_jump)) + goto error; + + while (i > 0) { + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + if (jump == NULL) + goto error; + + serialized_jump = (struct sljit_serialized_jump*)ptr; + jump->next = NULL; + jump->addr = serialized_jump->addr; + jump->flags = serialized_jump->flags; + + if (!(serialized_jump->flags & JUMP_ADDR)) { + if (serialized_jump->value != SLJIT_MAX_ADDRESS) { + if (serialized_jump->value >= label_count) + goto error; + jump->u.label = label_list[serialized_jump->value]; + } else + jump->u.label = NULL; + } else + jump->u.target = serialized_jump->value; + + if (last_jump != NULL) + last_jump->next = jump; + else + compiler->jumps = jump; + last_jump = jump; + + ptr += sizeof(struct sljit_serialized_jump); + i--; + } + compiler->last_jump = last_jump; + + SLJIT_FREE(label_list, allocator_data); + label_list = NULL; + + last_const = NULL; + i = serialized_compiler->const_count; + if ((sljit_uw)(end - ptr) < i * sizeof(struct sljit_serialized_const)) + goto error; + + while (i > 0) { + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + if (const_ == NULL) + goto error; + + serialized_const = (struct sljit_serialized_const*)ptr; + const_->next = NULL; + const_->addr = serialized_const->addr; + + if (last_const != NULL) + last_const->next = const_; + else + compiler->consts = const_; + last_const = const_; + + ptr += sizeof(struct sljit_serialized_const); + i--; + } + compiler->last_const = last_const; + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + if ((sljit_uw)(end - ptr) < sizeof(struct sljit_serialized_debug_info)) + goto error; + + serialized_debug_info = (struct sljit_serialized_debug_info*)ptr; + compiler->last_flags = (sljit_s32)serialized_debug_info->last_flags; + compiler->last_return = serialized_debug_info->last_return; + compiler->logical_local_size = serialized_debug_info->logical_local_size; +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */ + + return compiler; + +error: + sljit_free_compiler(compiler); + if (label_list != NULL) + SLJIT_FREE(label_list, allocator_data); + return NULL; +} diff --git a/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitUtils.c b/waterbox/ares64/ares/thirdparty/sljit/sljit_src/sljitUtils.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPost.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPost.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPre.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitConfigPre.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitMain.c b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitMain.c old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTest.c b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTest.c old mode 100644 new mode 100755 index 1a133a7a4d..b46cbe1218 --- a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTest.c +++ b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTest.c @@ -55,28 +55,30 @@ union executable_code { sljit_sw (SLJIT_FUNC *func2)(sljit_sw a, sljit_sw b); sljit_sw (SLJIT_FUNC *func3)(sljit_sw a, sljit_sw b, sljit_sw c); - void (SLJIT_FUNC *test70_f1)(sljit_s32 a, sljit_uw b, sljit_u32 c, sljit_sw d); - void (SLJIT_FUNC *test70_f2)(sljit_s32 a, sljit_u32 b, sljit_sw c, sljit_sw d); - void (SLJIT_FUNC *test70_f3)(sljit_s32 a, sljit_f32 b, sljit_uw c, sljit_f64 d); - void (SLJIT_FUNC *test70_f4)(sljit_f32 a, sljit_f64 b, sljit_f32 c, sljit_s32 d); - void (SLJIT_FUNC *test70_f5)(sljit_f64 a, sljit_f32 b, sljit_u32 c, sljit_f32 d); - void (SLJIT_FUNC *test70_f6)(sljit_f64 a, sljit_s32 b, sljit_f32 c, sljit_f64 d); - void (SLJIT_FUNC *test70_f7)(sljit_f32 a, sljit_s32 b, sljit_uw c, sljit_u32 d); - void (SLJIT_FUNC *test70_f8)(sljit_f64 a, sljit_f64 b, sljit_uw c, sljit_sw d); - void (SLJIT_FUNC *test70_f9)(sljit_f64 a, sljit_f64 b, sljit_uw c, sljit_f64 d); - void (SLJIT_FUNC *test70_f10)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_s32 d); + void (SLJIT_FUNC *test57_f1)(sljit_s32 a, sljit_uw b, sljit_u32 c, sljit_sw d); + void (SLJIT_FUNC *test57_f2)(sljit_s32 a, sljit_u32 b, sljit_sw c, sljit_sw d); - sljit_sw (SLJIT_FUNC *test71_f1)(sljit_f32 a, sljit_f64 b); - sljit_sw (SLJIT_FUNC *test71_f2)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_f64 d); - sljit_sw (SLJIT_FUNC *test71_f3)(sljit_f64 a, sljit_f64 b, sljit_f64 c); + void (SLJIT_FUNC *test58_f1)(sljit_s32 a, sljit_sw b, sljit_sw c, sljit_s32 d); + void (SLJIT_FUNC *test58_f2)(sljit_sw a, sljit_sw b, sljit_s32 c, sljit_s32 d); - void (SLJIT_FUNC *test73_f1)(sljit_s32 a, sljit_sw b, sljit_sw c, sljit_s32 d); - void (SLJIT_FUNC *test73_f2)(sljit_sw a, sljit_sw b, sljit_s32 c, sljit_s32 d); - void (SLJIT_FUNC *test73_f3)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_sw d); - void (SLJIT_FUNC *test73_f4)(sljit_f64 a, sljit_f64 b, sljit_sw c, sljit_sw d); + void (SLJIT_FUNC *test_float12_f1)(sljit_s32 a, sljit_f32 b, sljit_uw c, sljit_f64 d); + void (SLJIT_FUNC *test_float12_f2)(sljit_f32 a, sljit_f64 b, sljit_f32 c, sljit_s32 d); + void (SLJIT_FUNC *test_float12_f3)(sljit_f64 a, sljit_f32 b, sljit_u32 c, sljit_f32 d); + void (SLJIT_FUNC *test_float12_f4)(sljit_f64 a, sljit_s32 b, sljit_f32 c, sljit_f64 d); + void (SLJIT_FUNC *test_float12_f5)(sljit_f32 a, sljit_s32 b, sljit_uw c, sljit_u32 d); + void (SLJIT_FUNC *test_float12_f6)(sljit_f64 a, sljit_f64 b, sljit_uw c, sljit_sw d); + void (SLJIT_FUNC *test_float12_f7)(sljit_f64 a, sljit_f64 b, sljit_uw c, sljit_f64 d); + void (SLJIT_FUNC *test_float12_f8)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_s32 d); - sljit_f32 (SLJIT_FUNC *test81_f1)(sljit_sw a); - sljit_f64 (SLJIT_FUNC *test81_f2)(sljit_sw a); + void (SLJIT_FUNC *test_float14_f1)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_sw d); + void (SLJIT_FUNC *test_float14_f2)(sljit_f64 a, sljit_f64 b, sljit_sw c, sljit_sw d); + + sljit_sw (SLJIT_FUNC *test_call6_f1)(sljit_f32 a, sljit_f64 b); + sljit_sw (SLJIT_FUNC *test_call6_f2)(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_f64 d); + sljit_sw (SLJIT_FUNC *test_call6_f3)(sljit_f64 a, sljit_f64 b, sljit_f64 c); + + sljit_f32 (SLJIT_FUNC *test_call10_f1)(sljit_sw a); + sljit_f64 (SLJIT_FUNC *test_call10_f2)(sljit_sw a); }; typedef union executable_code executable_code; @@ -98,11 +100,33 @@ static sljit_s32 silent = 0; } #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#define IS_32BIT 0 +#define IS_64BIT 1 #define WCONST(const64, const32) ((sljit_sw)SLJIT_W(const64)) #else /* !SLJIT_64BIT_ARCHITECTURE */ +#define IS_32BIT 1 +#define IS_64BIT 0 #define WCONST(const64, const32) ((sljit_sw)const32) #endif /* SLJIT_64BIT_ARCHITECTURE */ +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +#define IS_X86 1 +#else /* !SLJIT_CONFIG_X86 */ +#define IS_X86 0 +#endif /* SLJIT_CONFIG_X86 */ + +#if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) +#define IS_ARM 1 +#else /* !SLJIT_CONFIG_ARM */ +#define IS_ARM 0 +#endif /* SLJIT_CONFIG_ARM */ + +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#define LITTLE_BIG(a, b) (a) +#else /* !SLJIT_LITTLE_ENDIAN */ +#define LITTLE_BIG(a, b) (b) +#endif /* SLJIT_LITTLE_ENDIAN */ + static void cond_set(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_s32 type) { /* Testing both sljit_emit_op_flags and sljit_emit_jump. */ @@ -118,7 +142,7 @@ static void cond_set(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw ds #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) -/* For interface testing and for test64. */ +/* For interface testing and for test51. */ void *sljit_test_malloc_exec(sljit_uw size, void *exec_allocator_data) { if (exec_allocator_data) @@ -188,6 +212,45 @@ static void test_exec_allocator(void) #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */ +static void test_macros(void) +{ + SLJIT_ASSERT(SLJIT_IS_MEM(SLJIT_MEM0())); + SLJIT_ASSERT(SLJIT_IS_MEM(SLJIT_MEM1(SLJIT_S0))); + SLJIT_ASSERT(SLJIT_IS_MEM(SLJIT_MEM2(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(SLJIT_IS_MEM0(SLJIT_MEM0())); + SLJIT_ASSERT(!SLJIT_IS_MEM0(SLJIT_MEM1(SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_MEM0(SLJIT_MEM2(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_MEM1(SLJIT_MEM0())); + SLJIT_ASSERT(SLJIT_IS_MEM1(SLJIT_MEM1(SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_MEM1(SLJIT_MEM2(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_MEM2(SLJIT_MEM0())); + SLJIT_ASSERT(!SLJIT_IS_MEM2(SLJIT_MEM1(SLJIT_R0))); + SLJIT_ASSERT(SLJIT_IS_MEM2(SLJIT_MEM2(SLJIT_R0, SLJIT_R1))); + + SLJIT_ASSERT(!SLJIT_IS_REG(SLJIT_IMM)); + SLJIT_ASSERT(!SLJIT_IS_MEM(SLJIT_IMM)); + SLJIT_ASSERT(SLJIT_IS_IMM(SLJIT_IMM)); + SLJIT_ASSERT(!SLJIT_IS_REG_PAIR(SLJIT_IMM)); + SLJIT_ASSERT(SLJIT_IS_REG(SLJIT_S0)); + SLJIT_ASSERT(!SLJIT_IS_MEM(SLJIT_S0)); + SLJIT_ASSERT(!SLJIT_IS_IMM(SLJIT_S0)); + SLJIT_ASSERT(!SLJIT_IS_REG_PAIR(SLJIT_S0)); + SLJIT_ASSERT(!SLJIT_IS_REG(SLJIT_REG_PAIR(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_MEM(SLJIT_REG_PAIR(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(!SLJIT_IS_IMM(SLJIT_REG_PAIR(SLJIT_R0, SLJIT_S0))); + SLJIT_ASSERT(SLJIT_IS_REG_PAIR(SLJIT_REG_PAIR(SLJIT_R0, SLJIT_S0))); + + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_R2) == SLJIT_R2); + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_FR1) == SLJIT_FR1); + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_MEM1(SLJIT_S2)) == SLJIT_S2); + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_MEM2(SLJIT_S1, SLJIT_S2)) == SLJIT_S1); + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_REG_PAIR(SLJIT_R3, SLJIT_S3)) == SLJIT_R3); + SLJIT_ASSERT(SLJIT_EXTRACT_REG(SLJIT_REG_PAIR(SLJIT_FR2, SLJIT_FR4)) == SLJIT_FR2); + SLJIT_ASSERT(SLJIT_EXTRACT_SECOND_REG(SLJIT_MEM2(SLJIT_S1, SLJIT_S2)) == SLJIT_S2); + SLJIT_ASSERT(SLJIT_EXTRACT_SECOND_REG(SLJIT_REG_PAIR(SLJIT_R3, SLJIT_S3)) == SLJIT_S3); + SLJIT_ASSERT(SLJIT_EXTRACT_SECOND_REG(SLJIT_REG_PAIR(SLJIT_FR2, SLJIT_FR4)) == SLJIT_FR4); +} + static void test1(void) { /* Enter and return from an sljit function. */ @@ -222,7 +285,8 @@ static void test2(void) /* Test mov. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - sljit_sw buf[10]; + sljit_sw buf[12]; + sljit_s32 i; static sljit_sw data[2] = { 0, -9876 }; if (verbose) @@ -230,14 +294,10 @@ static void test2(void) FAILED(!compiler, "cannot create compiler\n"); + for (i = 0; i < 12; i++) + buf[i] = 0; buf[0] = 5678; - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - buf[4] = 0; - buf[5] = 0; - buf[6] = 0; - buf[7] = 0; + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 3, 2, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 9999); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_S0, 0); @@ -273,6 +333,13 @@ static void test2(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -2450); /* buf[9] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), -0xfff100, SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf - 0xffef01 + 10 * (sljit_sw)sizeof(sljit_sw)); + /* buf[10] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 0xffef01, SLJIT_IMM, 8796); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf + 0xffef01 + 11 * (sljit_sw)sizeof(sljit_sw)); + /* buf[11] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), -0xffef01, SLJIT_IMM, 5704); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R2, 0); code.code = sljit_generate_code(compiler); @@ -289,6 +356,8 @@ static void test2(void) FAILED(buf[7] != 3456, "test2 case 8 failed\n"); FAILED(buf[8] != 7896, "test2 case 9 failed\n"); FAILED(buf[9] != -2450, "test2 case 10 failed\n"); + FAILED(buf[10] != 8796, "test2 case 11 failed\n"); + FAILED(buf[11] != 5704, "test2 case 12 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; @@ -456,22 +525,16 @@ static void test6(void) /* Test addc, sub, subc. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - sljit_sw buf[11]; + sljit_sw buf[21]; + sljit_s32 i; if (verbose) printf("Run test6\n"); FAILED(!compiler, "cannot create compiler\n"); - buf[0] = 0; - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - buf[4] = 0; - buf[5] = 0; - buf[6] = 0; - buf[7] = 0; - buf[8] = 0; - buf[9] = 0; + + for (i = 0; i < 21; i++) + buf[i] = 0; buf[10] = 4000; sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 3, 1, 0, 0, 0); @@ -517,6 +580,47 @@ static void test6(void) /* buf[10] */ sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_R1, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_R1, 0); + /* buf[11] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -1); + sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 11, SLJIT_IMM, 0xff00ff, SLJIT_R1, 0); + /* buf[12] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); + sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_CARRY, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 12, SLJIT_R1, 0, SLJIT_IMM, 0xff00ff); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4); + /* buf[13] */ + sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 13, SLJIT_R0, 0, SLJIT_IMM, -2); + /* buf[14] */ + sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 14, SLJIT_R1, 0, SLJIT_IMM, -2); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -4); + sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, -2); + sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, -2); + /* buf[15] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 15, SLJIT_R0, 0); + /* buf[16] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 16, SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 4); + sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, -4); + sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, -4); + /* buf[17] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 17, SLJIT_R1, 0); + /* buf[18] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 18, SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -3); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -4); + /* buf[19] */ + sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_CARRY, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 19, SLJIT_R1, 0, SLJIT_IMM, -4); + /* buf[20] */ + sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 20, SLJIT_R2, 0, SLJIT_IMM, -4); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 10); sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_CARRY, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 5); sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 2); @@ -539,6 +643,16 @@ static void test6(void) FAILED(buf[8] != 100 + 32767, "test6 case 10 failed\n"); FAILED(buf[9] != 0x152aa42e, "test6 case 11 failed\n"); FAILED(buf[10] != -2000, "test6 case 12 failed\n"); + FAILED(buf[11] != 0xff0100, "test6 case 13 failed\n"); + FAILED(buf[12] != -0xff0101, "test6 case 14 failed\n"); + FAILED(buf[13] != 3, "test6 case 15 failed\n"); + FAILED(buf[14] != 3, "test6 case 16 failed\n"); + FAILED(buf[15] != -3, "test6 case 17 failed\n"); + FAILED(buf[16] != -3, "test6 case 18 failed\n"); + FAILED(buf[17] != -1, "test6 case 19 failed\n"); + FAILED(buf[18] != 0, "test6 case 20 failed\n"); + FAILED(buf[19] != 1, "test6 case 21 failed\n"); + FAILED(buf[20] != 0, "test6 case 22 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; @@ -629,7 +743,7 @@ static void test8(void) for (i = 1; i < 21; i++) buf[i] = 3; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 2, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 20); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 10); sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_IMM, 6, SLJIT_IMM, 5); @@ -772,7 +886,7 @@ static void test9(void) buf[4] = 1 << 10; buf[9] = 3; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 4, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 2, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xf); sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 3); sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1); @@ -826,12 +940,12 @@ static void test9(void) sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x7d00); sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 32); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0); #endif sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xe30000); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffc0); #else sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffe0); @@ -839,7 +953,7 @@ static void test9(void) sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x25000000); sljit_emit_op2(compiler, SLJIT_SHL32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xfffe1); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0); #endif /* buf[11] */ @@ -850,7 +964,7 @@ static void test9(void) sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R1, 0, SLJIT_R0, 0, shift_reg, 0); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xf600); sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_R0, 0, SLJIT_R0, 0, shift_reg, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT /* Alternative form of uint32 type cast. */ sljit_emit_op2(compiler, SLJIT_AND, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffffffff); #endif @@ -942,7 +1056,7 @@ static void test10(void) sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R0, 0); /* buf[5] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_R0, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3); sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x123456789)); /* buf[6] */ @@ -962,7 +1076,7 @@ static void test10(void) FAILED(buf[3] != -12, "test10 case 5 failed\n"); FAILED(buf[4] != 100, "test10 case 6 failed\n"); FAILED(buf[5] != 81, "test10 case 7 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT FAILED(buf[6] != SLJIT_W(0x123456789) * 3, "test10 case 8 failed\n"); #endif @@ -985,13 +1099,8 @@ static void test11(void) sljit_uw const2_addr; sljit_uw const3_addr; sljit_uw const4_addr; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw word_value1 = (sljit_sw)SLJIT_W(0xaaaaaaaaaaaaaaaa); - sljit_sw word_value2 = (sljit_sw)SLJIT_W(0xfee1deadfbadf00d); -#else - sljit_sw word_value1 = (sljit_sw)0xaaaaaaaal; - sljit_sw word_value2 = (sljit_sw)0xfbadf00dl; -#endif + sljit_sw word_value1 = WCONST(0xaaaaaaaaaaaaaaaa, 0xaaaaaaaa); + sljit_sw word_value2 = WCONST(0xfee1deadfbadf00d, 0xfbadf00d); sljit_sw buf[3]; if (verbose) @@ -1031,7 +1140,7 @@ static void test11(void) memset(value, 255, 16); } - /* Return vaue */ + /* Return value */ const4 = sljit_emit_const(compiler, SLJIT_RETURN_REG, 0, (sljit_sw)0xf7afcdb7); sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); @@ -1092,7 +1201,7 @@ static void test12(void) FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, W), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, W), 3, 2, 0, 0, 0); sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_GREATER, SLJIT_S1, 0, SLJIT_IMM, 10); jump1 = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_SIG_GREATER); /* Default handler. */ @@ -1159,405 +1268,77 @@ static void test12(void) static void test13(void) { - /* Test fpu monadic functions. */ + /* Test emit const and jumps. */ executable_code code; - struct sljit_compiler* compiler; - sljit_f64 buf[7]; - sljit_sw buf2[6]; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *label; + struct sljit_jump *jump1; + struct sljit_jump *jump2; + struct sljit_const* const1; + struct sljit_jump *mov_addr; + sljit_sw executable_offset; + sljit_uw const_addr; + sljit_uw jump_addr; + sljit_uw label_addr; + sljit_sw buf[4]; if (verbose) printf("Run test13\n"); - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test13 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); + buf[0] = 0; + buf[1] = 0; - buf[0] = 7.75; - buf[1] = -4.5; - buf[2] = 0.0; - buf[3] = 0.0; - buf[4] = 0.0; - buf[5] = 0.0; - buf[6] = 0.0; + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 2, 0, 0, 0); - buf2[0] = 10; - buf2[1] = 10; - buf2[2] = 10; - buf2[3] = 10; - buf2[4] = 10; - buf2[5] = 10; + jump1 = sljit_emit_jump(compiler, SLJIT_JUMP); + label = sljit_emit_label(compiler); + jump2 = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump2, label); + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 3, 2, 6, 0, 0); - /* buf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1]); - /* buf[3] */ - sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - /* buf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM0(), (sljit_sw)&buf[0]); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0); - sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR2, 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_FR2, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[4], SLJIT_FR3, 0); - /* buf[5] */ - sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_FR4, 0, SLJIT_FR1, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR4, 0); - /* buf[6] */ - sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR4, 0); + mov_addr = sljit_emit_mov_addr(compiler, SLJIT_R2, 0); + /* buf[0] */ + const1 = sljit_emit_const(compiler, SLJIT_MEM1(SLJIT_S0), 0, -1234); - /* buf2[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_F_GREATER); - /* buf2[1] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR5, 0); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_F_GREATER); - /* buf2[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_FR5, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR1, 0); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_F_EQUAL); - /* buf2[3] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR1, 0); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_F_LESS); - /* buf2[4] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_F_EQUAL); - /* buf2[5] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_F_NOT_EQUAL); + sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, -1234); + + label = sljit_emit_label(compiler); + sljit_set_label(mov_addr, label); + + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, -56789); + jump1 = sljit_emit_jump(compiler, SLJIT_JUMP | SLJIT_REWRITABLE_JUMP); + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 0); + label = sljit_emit_label(compiler); sljit_emit_return_void(compiler); code.code = sljit_generate_code(compiler); CHECK(compiler); + executable_offset = sljit_get_executable_offset(compiler); + const_addr = sljit_get_const_addr(const1); + jump_addr = sljit_get_jump_addr(jump1); + label_addr = sljit_get_label_addr(label); sljit_free_compiler(compiler); - code.func2((sljit_sw)&buf, (sljit_sw)&buf2); - FAILED(buf[2] != -4.5, "test13 case 1 failed\n"); - FAILED(buf[3] != 4.5, "test13 case 2 failed\n"); - FAILED(buf[4] != -7.75, "test13 case 3 failed\n"); - FAILED(buf[5] != 4.5, "test13 case 4 failed\n"); - FAILED(buf[6] != -4.5, "test13 case 5 failed\n"); + sljit_set_const(const_addr, 87654, executable_offset); + sljit_set_jump_addr(jump_addr, label_addr, executable_offset); - FAILED(buf2[0] != 1, "test13 case 6 failed\n"); - FAILED(buf2[1] != 0, "test13 case 7 failed\n"); - FAILED(buf2[2] != 1, "test13 case 8 failed\n"); - FAILED(buf2[3] != 0, "test13 case 9 failed\n"); - FAILED(buf2[4] != 0, "test13 case 10 failed\n"); - FAILED(buf2[5] != 1, "test13 case 11 failed\n"); + code.func1((sljit_sw)&buf); + FAILED(buf[0] != 87654, "test13 case 1 failed\n"); + FAILED(buf[1] != -56789, "test13 case 2 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } static void test14(void) -{ - /* Test fpu diadic functions. */ - executable_code code; - struct sljit_compiler* compiler; - sljit_f64 buf[15]; - - if (verbose) - printf("Run test14\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test14 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - buf[0] = 7.25; - buf[1] = 3.5; - buf[2] = 1.75; - buf[3] = 0.0; - buf[4] = 0.0; - buf[5] = 0.0; - buf[6] = 0.0; - buf[7] = 0.0; - buf[8] = 0.0; - buf[9] = 0.0; - buf[10] = 0.0; - buf[11] = 0.0; - buf[12] = 8.0; - buf[13] = 4.0; - buf[14] = 0.0; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 6, 0, 0); - - /* ADD */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); - /* buf[3] */ - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 3, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR1, 0); - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR1, 0, SLJIT_FR0, 0, SLJIT_FR1, 0); - /* buf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 4, SLJIT_FR0, 0); - /* buf[5] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 5, SLJIT_FR1, 0); - - /* SUB */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); - /* buf[6] */ - sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 6, SLJIT_FR3, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT); - sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR2, 0, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); - sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR3, 0, SLJIT_FR2, 0, SLJIT_FR3, 0); - /* buf[7] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 7, SLJIT_FR2, 0); - /* buf[8] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 8, SLJIT_FR3, 0); - - /* MUL */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); - /* buf[9] */ - sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 9, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT, SLJIT_FR1, 0); - sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR1, 0, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2, SLJIT_FR2, 0); - /* buf[10] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 10, SLJIT_FR1, 0); - /* buf[11] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 11, SLJIT_FR5, 0); - - /* DIV */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_FR5, 0); - /* buf[12] */ - sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_FR1, 0); - sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR5, 0, SLJIT_FR5, 0, SLJIT_FR1, 0); - sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR4, 0, SLJIT_FR1, 0, SLJIT_FR4, 0); - /* buf[13] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13, SLJIT_FR5, 0); - /* buf[14] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 14, SLJIT_FR4, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - FAILED(buf[3] != 10.75, "test14 case 1 failed\n"); - FAILED(buf[4] != 5.25, "test14 case 2 failed\n"); - FAILED(buf[5] != 7.0, "test14 case 3 failed\n"); - FAILED(buf[6] != 0.0, "test14 case 4 failed\n"); - FAILED(buf[7] != 5.5, "test14 case 5 failed\n"); - FAILED(buf[8] != 3.75, "test14 case 6 failed\n"); - FAILED(buf[9] != 24.5, "test14 case 7 failed\n"); - FAILED(buf[10] != 38.5, "test14 case 8 failed\n"); - FAILED(buf[11] != 9.625, "test14 case 9 failed\n"); - FAILED(buf[12] != 2.0, "test14 case 10 failed\n"); - FAILED(buf[13] != 2.0, "test14 case 11 failed\n"); - FAILED(buf[14] != 0.5, "test14 case 12 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static sljit_sw func(sljit_sw a, sljit_sw b, sljit_sw c) -{ - return a + b + c + 5; -} - -static sljit_sw func4(sljit_sw a, sljit_sw b, sljit_sw c, sljit_sw d) -{ - return func(a, b, c) + d; -} - -static void test15(void) -{ - /* Test function call. */ - executable_code code; - struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - struct sljit_jump* jump = NULL; - sljit_sw buf[9]; - - if (verbose) - printf("Run test15\n"); - - FAILED(!compiler, "cannot create compiler\n"); - buf[0] = 0; - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - buf[4] = 0; - buf[5] = 0; - buf[6] = 0; - buf[7] = 0; - buf[8] = SLJIT_FUNC_ADDR(func); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 4, 2, 0, 0, 0); - - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); - - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -10); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); - jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_REWRITABLE_JUMP, SLJIT_ARGS3(W, W, W, W)); - sljit_set_target(jump, (sljit_uw)-1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 40); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -60); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -30); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 10); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 16); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 110); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 120); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R3, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 3); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 3); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -6); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func4)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W), SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - /* buf[8] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -10); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -16); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 6); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_set_jump_addr(sljit_get_jump_addr(jump), SLJIT_FUNC_UADDR(func), sljit_get_executable_offset(compiler)); - sljit_free_compiler(compiler); - - FAILED(code.func1((sljit_sw)&buf) != -15, "test15 case 1 failed\n"); - FAILED(buf[0] != 14, "test15 case 2 failed\n"); - FAILED(buf[1] != -8, "test15 case 3 failed\n"); - FAILED(buf[2] != SLJIT_FUNC_ADDR(func) + 42, "test15 case 4 failed\n"); - FAILED(buf[3] != SLJIT_FUNC_ADDR(func) - 85, "test15 case 5 failed\n"); - FAILED(buf[4] != SLJIT_FUNC_ADDR(func) + 31, "test15 case 6 failed\n"); - FAILED(buf[5] != 335, "test15 case 7 failed\n"); - FAILED(buf[6] != 11, "test15 case 8 failed\n"); - FAILED(buf[7] != 5, "test15 case 9 failed\n"); - FAILED(buf[8] != -15, "test15 case 10 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test16(void) -{ - /* Ackermann benchmark. */ - executable_code code; - struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - struct sljit_label *entry; - struct sljit_label *label; - struct sljit_jump *jump; - struct sljit_jump *jump1; - struct sljit_jump *jump2; - - if (verbose) - printf("Run test16\n"); - - FAILED(!compiler, "cannot create compiler\n"); - - entry = sljit_emit_label(compiler); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(W, W, W), 3, 2, 0, 0, 0); - /* If x == 0. */ - sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_S0, 0, SLJIT_IMM, 0); - jump1 = sljit_emit_jump(compiler, SLJIT_EQUAL); - /* If y == 0. */ - sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_S1, 0, SLJIT_IMM, 0); - jump2 = sljit_emit_jump(compiler, SLJIT_EQUAL); - - /* Ack(x,y-1). */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 1); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); - sljit_set_label(jump, entry); - - /* Returns with Ack(x-1, Ack(x,y-1)). */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_RETURN_REG, 0); - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); - sljit_set_label(jump, entry); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - /* Returns with y+1. */ - label = sljit_emit_label(compiler); - sljit_set_label(jump1, label); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1, SLJIT_S1, 0); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - /* Returns with Ack(x-1,1) */ - label = sljit_emit_label(compiler); - sljit_set_label(jump2, label); - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); - sljit_set_label(jump, entry); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func2(3, 3) != 61, "test16 case 1 failed\n"); - /* For benchmarking. */ - /* FAILED(code.func2(3, 11) != 16381, "test16 case 1 failed\n"); */ - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test17(void) { /* Test arm constant pool. */ executable_code code; @@ -1566,14 +1347,14 @@ static void test17(void) sljit_sw buf[5]; if (verbose) - printf("Run test17\n"); + printf("Run test14\n"); FAILED(!compiler, "cannot create compiler\n"); for (i = 0; i < 5; i++) buf[i] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 0, 0, 0); for (i = 0; i <= 0xfff; i++) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0x81818000 | i); if ((i & 0x3ff) == 0) @@ -1589,17 +1370,17 @@ static void test17(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); - FAILED((sljit_uw)buf[0] != 0x81818000, "test17 case 1 failed\n"); - FAILED((sljit_uw)buf[1] != 0x81818400, "test17 case 2 failed\n"); - FAILED((sljit_uw)buf[2] != 0x81818800, "test17 case 3 failed\n"); - FAILED((sljit_uw)buf[3] != 0x81818c00, "test17 case 4 failed\n"); - FAILED((sljit_uw)buf[4] != 0x81818fff, "test17 case 5 failed\n"); + FAILED((sljit_uw)buf[0] != 0x81818000, "test14 case 1 failed\n"); + FAILED((sljit_uw)buf[1] != 0x81818400, "test14 case 2 failed\n"); + FAILED((sljit_uw)buf[2] != 0x81818800, "test14 case 3 failed\n"); + FAILED((sljit_uw)buf[3] != 0x81818c00, "test14 case 4 failed\n"); + FAILED((sljit_uw)buf[4] != 0x81818fff, "test14 case 5 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test18(void) +static void test15(void) { /* Test 64 bit. */ executable_code code; @@ -1607,7 +1388,7 @@ static void test18(void) sljit_sw buf[11]; if (verbose) - printf("Run test18\n"); + printf("Run test15\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; @@ -1620,15 +1401,15 @@ static void test18(void) buf[7] = 100; buf[8] = 100; buf[9] = 0; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) +#if IS_64BIT && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) buf[10] = SLJIT_W(1) << 32; #else buf[10] = 1; #endif - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 2, 0, 0, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, SLJIT_W(0x1122334455667788)); /* buf[1] */ @@ -1668,12 +1449,12 @@ static void test18(void) sljit_emit_op2(compiler, SLJIT_SHL32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 9, SLJIT_IMM, SLJIT_W(0xffff0000), SLJIT_R0, 0); /* buf[10] */ sljit_emit_op2(compiler, SLJIT_MUL32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_IMM, -1); -#else /* !SLJIT_64BIT_ARCHITECTURE */ +#else /* !IS_64BIT */ /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0x11223344); /* buf[1] */ sljit_emit_op2(compiler, SLJIT_ADD32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 0x44332211); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ sljit_emit_return_void(compiler); @@ -1682,41 +1463,41 @@ static void test18(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[0] != SLJIT_W(0x1122334455667788), "test18 case 1 failed\n"); +#if IS_64BIT + FAILED(buf[0] != SLJIT_W(0x1122334455667788), "test15 case 1 failed\n"); #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) - FAILED(buf[1] != 0x55667788, "test18 case 2 failed\n"); + FAILED(buf[1] != 0x55667788, "test15 case 2 failed\n"); #else /* !SLJIT_LITTLE_ENDIAN */ - FAILED(buf[1] != SLJIT_W(0x5566778800000000), "test18 case 2 failed\n"); + FAILED(buf[1] != SLJIT_W(0x5566778800000000), "test15 case 2 failed\n"); #endif /* SLJIT_LITTLE_ENDIAN */ - FAILED(buf[2] != SLJIT_W(2000000000000), "test18 case 3 failed\n"); - FAILED(buf[3] != SLJIT_W(4000000000000), "test18 case 4 failed\n"); + FAILED(buf[2] != SLJIT_W(2000000000000), "test15 case 3 failed\n"); + FAILED(buf[3] != SLJIT_W(4000000000000), "test15 case 4 failed\n"); #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) - FAILED(buf[4] != 0x28282828, "test18 case 5 failed\n"); + FAILED(buf[4] != 0x28282828, "test15 case 5 failed\n"); #else /* !SLJIT_LITTLE_ENDIAN */ - FAILED(buf[4] != SLJIT_W(0x2828282800000000), "test18 case 5 failed\n"); + FAILED(buf[4] != SLJIT_W(0x2828282800000000), "test15 case 5 failed\n"); #endif /* SLJIT_LITTLE_ENDIAN */ - FAILED(buf[5] != 0, "test18 case 6 failed\n"); - FAILED(buf[6] != 1, "test18 case 7 failed\n"); - FAILED(buf[7] != 1, "test18 case 8 failed\n"); - FAILED(buf[8] != 0, "test18 case 9 failed\n"); + FAILED(buf[5] != 0, "test15 case 6 failed\n"); + FAILED(buf[6] != 1, "test15 case 7 failed\n"); + FAILED(buf[7] != 1, "test15 case 8 failed\n"); + FAILED(buf[8] != 0, "test15 case 9 failed\n"); #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) - FAILED(buf[9] != (sljit_sw)0xfff00000, "test18 case 10 failed\n"); - FAILED(buf[10] != (sljit_sw)0xffffffff, "test18 case 11 failed\n"); + FAILED(buf[9] != (sljit_sw)0xfff00000, "test15 case 10 failed\n"); + FAILED(buf[10] != (sljit_sw)0xffffffff, "test15 case 11 failed\n"); #else /* !SLJIT_LITTLE_ENDIAN */ - FAILED(buf[9] != (sljit_sw)SLJIT_W(0xfff0000000000000), "test18 case 10 failed\n"); - FAILED(buf[10] != (sljit_sw)SLJIT_W(0xffffffff00000000), "test18 case 11 failed\n"); + FAILED(buf[9] != (sljit_sw)SLJIT_W(0xfff0000000000000), "test15 case 10 failed\n"); + FAILED(buf[10] != (sljit_sw)SLJIT_W(0xffffffff00000000), "test15 case 11 failed\n"); #endif /* SLJIT_LITTLE_ENDIAN */ -#else /* !SLJIT_64BIT_ARCHITECTURE */ - FAILED(buf[0] != 0x11223344, "test18 case 1 failed\n"); - FAILED(buf[1] != 0x44332211, "test18 case 2 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#else /* !IS_64BIT */ + FAILED(buf[0] != 0x11223344, "test15 case 1 failed\n"); + FAILED(buf[1] != 0x44332211, "test15 case 2 failed\n"); +#endif /* IS_64BIT */ sljit_free_code(code.code, NULL); successful_tests++; } -static void test19(void) +static void test16(void) { /* Test arm partial instruction caching. */ executable_code code; @@ -1724,7 +1505,7 @@ static void test19(void) sljit_sw buf[10]; if (verbose) - printf("Run test19\n"); + printf("Run test16\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 6; @@ -1736,7 +1517,7 @@ static void test19(void) buf[6] = 2; buf[7] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 0, 0, 0); /* buf[0] */ sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)); /* buf[2] */ @@ -1762,20 +1543,20 @@ static void test19(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); - FAILED(buf[0] != 10, "test19 case 1 failed\n"); - FAILED(buf[1] != 4, "test19 case 2 failed\n"); - FAILED(buf[2] != 14, "test19 case 3 failed\n"); - FAILED(buf[3] != 14, "test19 case 4 failed\n"); - FAILED(buf[4] != 8, "test19 case 5 failed\n"); - FAILED(buf[5] != 6, "test19 case 6 failed\n"); - FAILED(buf[6] != 12, "test19 case 7 failed\n"); - FAILED(buf[7] != 10, "test19 case 8 failed\n"); + FAILED(buf[0] != 10, "test16 case 1 failed\n"); + FAILED(buf[1] != 4, "test16 case 2 failed\n"); + FAILED(buf[2] != 14, "test16 case 3 failed\n"); + FAILED(buf[3] != 14, "test16 case 4 failed\n"); + FAILED(buf[4] != 8, "test16 case 5 failed\n"); + FAILED(buf[5] != 6, "test16 case 6 failed\n"); + FAILED(buf[6] != 12, "test16 case 7 failed\n"); + FAILED(buf[7] != 10, "test16 case 8 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test20(void) +static void test17(void) { /* Test stack. */ executable_code code; @@ -1783,14 +1564,10 @@ static void test20(void) struct sljit_jump* jump; struct sljit_label* label; sljit_sw buf[6]; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw offset_value = SLJIT_W(0x1234567812345678); -#else - sljit_sw offset_value = SLJIT_W(0x12345678); -#endif + sljit_sw offset_value = WCONST(0x1234567812345678, 0x12345678); if (verbose) - printf("Run test20\n"); + printf("Run test17\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 5; @@ -1828,11 +1605,11 @@ static void test20(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != -12345, "test20 case 1 failed\n") + FAILED(code.func1((sljit_sw)&buf) != -12345, "test17 case 1 failed\n"); - FAILED(buf[2] != 60, "test20 case 2 failed\n"); - FAILED(buf[3] != 17, "test20 case 3 failed\n"); - FAILED(buf[4] != 7, "test20 case 4 failed\n"); + FAILED(buf[2] != 60, "test17 case 2 failed\n"); + FAILED(buf[3] != 17, "test17 case 3 failed\n"); + FAILED(buf[4] != 7, "test17 case 4 failed\n"); sljit_free_code(code.code, NULL); @@ -1858,13 +1635,13 @@ static void test20(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func3(1234, 5678, 9012) != 15924, "test20 case 5 failed\n"); + FAILED(code.func3(1234, 5678, 9012) != 15924, "test17 case 5 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test21(void) +static void test18(void) { /* Test set context. The parts of the jit code can be separated in the memory. */ executable_code code1; @@ -1876,7 +1653,7 @@ static void test21(void) sljit_sw buf[4]; if (verbose) - printf("Run test21\n"); + printf("Run test18\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 9; @@ -1922,16 +1699,16 @@ static void test21(void) sljit_set_jump_addr(addr, SLJIT_FUNC_UADDR(code2.code), executable_offset); - FAILED(code1.func1((sljit_sw)&buf) != 19, "test21 case 1 failed\n"); - FAILED(buf[2] != -16, "test21 case 2 failed\n"); - FAILED(buf[3] != 100, "test21 case 3 failed\n"); + FAILED(code1.func1((sljit_sw)&buf) != 19, "test18 case 1 failed\n"); + FAILED(buf[2] != -16, "test18 case 2 failed\n"); + FAILED(buf[3] != 100, "test18 case 3 failed\n"); sljit_free_code(code1.code, NULL); sljit_free_code(code2.code, NULL); successful_tests++; } -static void test22(void) +static void test19(void) { /* Test simple byte and half-int data transfers. */ executable_code code; @@ -1941,7 +1718,7 @@ static void test22(void) sljit_s8 bbuf[5]; if (verbose) - printf("Run test22\n"); + printf("Run test19\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; @@ -1963,7 +1740,7 @@ static void test22(void) bbuf[3] = 0; bbuf[4] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 3, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 3, 3, 0, 0, 0); /* sbuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, -13); @@ -2023,30 +1800,30 @@ static void test22(void) sljit_free_compiler(compiler); code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf); - FAILED(buf[0] != -9, "test22 case 1 failed\n"); - FAILED(buf[1] != -56, "test22 case 2 failed\n"); - FAILED(buf[2] != 0, "test22 case 3 failed\n"); - FAILED(buf[3] != 0, "test22 case 4 failed\n"); + FAILED(buf[0] != -9, "test19 case 1 failed\n"); + FAILED(buf[1] != -56, "test19 case 2 failed\n"); + FAILED(buf[2] != 0, "test19 case 3 failed\n"); + FAILED(buf[3] != 0, "test19 case 4 failed\n"); - FAILED(sbuf[0] != -13, "test22 case 5 failed\n"); - FAILED(sbuf[1] != 0x1234, "test22 case 6 failed\n"); - FAILED(sbuf[3] != 0x1234, "test22 case 7 failed\n"); - FAILED(sbuf[4] != 8000, "test22 case 8 failed\n"); - FAILED(sbuf[5] != -9317, "test22 case 9 failed\n"); - FAILED(sbuf[6] != -9317, "test22 case 10 failed\n"); - FAILED(sbuf[7] != -8888, "test22 case 11 failed\n"); - FAILED(sbuf[8] != -8888, "test22 case 12 failed\n"); + FAILED(sbuf[0] != -13, "test19 case 5 failed\n"); + FAILED(sbuf[1] != 0x1234, "test19 case 6 failed\n"); + FAILED(sbuf[3] != 0x1234, "test19 case 7 failed\n"); + FAILED(sbuf[4] != 8000, "test19 case 8 failed\n"); + FAILED(sbuf[5] != -9317, "test19 case 9 failed\n"); + FAILED(sbuf[6] != -9317, "test19 case 10 failed\n"); + FAILED(sbuf[7] != -8888, "test19 case 11 failed\n"); + FAILED(sbuf[8] != -8888, "test19 case 12 failed\n"); - FAILED(bbuf[0] != -45, "test22 case 13 failed\n"); - FAILED(bbuf[1] != 0x12, "test22 case 14 failed\n"); - FAILED(bbuf[3] != -56, "test22 case 15 failed\n"); - FAILED(bbuf[4] != 4, "test22 case 16 failed\n"); + FAILED(bbuf[0] != -45, "test19 case 13 failed\n"); + FAILED(bbuf[1] != 0x12, "test19 case 14 failed\n"); + FAILED(bbuf[3] != -56, "test19 case 15 failed\n"); + FAILED(bbuf[4] != 4, "test19 case 16 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test23(void) +static void test20(void) { /* Test 32 bit / 64 bit signed / unsigned int transfer and conversion. This test has do real things on 64 bit systems, but works on 32 bit systems as well. */ @@ -2058,14 +1835,10 @@ static void test23(void) sljit_s32 asint; sljit_u8 asbytes[4]; } u; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw garbage = SLJIT_W(0x1234567812345678); -#else - sljit_sw garbage = 0x12345678; -#endif + sljit_sw garbage = WCONST(0x1234567812345678, 0x12345678); if (verbose) - printf("Run test23\n"); + printf("Run test20\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; @@ -2140,37 +1913,37 @@ static void test23(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func2((sljit_sw)&buf, (sljit_sw)&ibuf) != -13, "test23 case 1 failed\n"); - FAILED(buf[0] != -5791, "test23 case 2 failed\n"); - FAILED(buf[1] != 43579, "test23 case 3 failed\n"); - FAILED(buf[2] != 658923, "test23 case 4 failed\n"); - FAILED(buf[3] != 0x0f00f00, "test23 case 5 failed\n"); - FAILED(buf[4] != 0x0f00f00, "test23 case 6 failed\n"); - FAILED(buf[5] != 80, "test23 case 7 failed\n"); - FAILED(buf[6] != 0x123456, "test23 case 8 failed\n"); - FAILED(buf[7] != (sljit_sw)&buf[5], "test23 case 9 failed\n"); - FAILED(buf[8] != (sljit_sw)&buf[5] + 6, "test23 case 10 failed\n"); + FAILED(code.func2((sljit_sw)&buf, (sljit_sw)&ibuf) != -13, "test20 case 1 failed\n"); + FAILED(buf[0] != -5791, "test20 case 2 failed\n"); + FAILED(buf[1] != 43579, "test20 case 3 failed\n"); + FAILED(buf[2] != 658923, "test20 case 4 failed\n"); + FAILED(buf[3] != 0x0f00f00, "test20 case 5 failed\n"); + FAILED(buf[4] != 0x0f00f00, "test20 case 6 failed\n"); + FAILED(buf[5] != 80, "test20 case 7 failed\n"); + FAILED(buf[6] != 0x123456, "test20 case 8 failed\n"); + FAILED(buf[7] != (sljit_sw)&buf[5], "test20 case 9 failed\n"); + FAILED(buf[8] != (sljit_sw)&buf[5] + 6, "test20 case 10 failed\n"); - FAILED(ibuf[0] != 34567, "test23 case 11 failed\n"); - FAILED(ibuf[1] != -7654, "test23 case 12 failed\n"); + FAILED(ibuf[0] != 34567, "test20 case 11 failed\n"); + FAILED(ibuf[1] != -7654, "test20 case 12 failed\n"); u.asint = ibuf[4]; #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) - FAILED(u.asbytes[0] != 0x78, "test23 case 13 failed\n"); - FAILED(u.asbytes[1] != 0x56, "test23 case 14 failed\n"); - FAILED(u.asbytes[2] != 0x34, "test23 case 15 failed\n"); - FAILED(u.asbytes[3] != 0x12, "test23 case 16 failed\n"); + FAILED(u.asbytes[0] != 0x78, "test20 case 13 failed\n"); + FAILED(u.asbytes[1] != 0x56, "test20 case 14 failed\n"); + FAILED(u.asbytes[2] != 0x34, "test20 case 15 failed\n"); + FAILED(u.asbytes[3] != 0x12, "test20 case 16 failed\n"); #else - FAILED(u.asbytes[0] != 0x12, "test23 case 13 failed\n"); - FAILED(u.asbytes[1] != 0x34, "test23 case 14 failed\n"); - FAILED(u.asbytes[2] != 0x56, "test23 case 15 failed\n"); - FAILED(u.asbytes[3] != 0x78, "test23 case 16 failed\n"); + FAILED(u.asbytes[0] != 0x12, "test20 case 13 failed\n"); + FAILED(u.asbytes[1] != 0x34, "test20 case 14 failed\n"); + FAILED(u.asbytes[2] != 0x56, "test20 case 15 failed\n"); + FAILED(u.asbytes[3] != 0x78, "test20 case 16 failed\n"); #endif sljit_free_code(code.code, NULL); successful_tests++; } -static void test24(void) +static void test21(void) { /* Some complicated addressing modes. */ executable_code code; @@ -2180,7 +1953,7 @@ static void test24(void) sljit_s8 bbuf[7]; if (verbose) - printf("Run test24\n"); + printf("Run test21\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -2208,7 +1981,7 @@ static void test24(void) bbuf[5] = 0; bbuf[6] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 3, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 3, 3, 0, 0, 0); /* Nothing should be updated. */ /* sbuf[1] */ @@ -2261,12 +2034,12 @@ static void test24(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&bbuf + 0x7fff7fff + 5 * (sljit_sw)sizeof(sljit_s8)); /* bbuf[5] */ sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_R0), -0x7fff7fff, SLJIT_MEM1(SLJIT_R0), -0x7fff8000); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456)); /* bbuf[6] */ sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_R0), SLJIT_W(0x123456123456) + 6 * sizeof(sljit_s8), SLJIT_MEM1(SLJIT_R1), SLJIT_W(0x123456123456)); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ sljit_emit_return_void(compiler); @@ -2275,40 +2048,40 @@ static void test24(void) sljit_free_compiler(compiler); code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf); - FAILED(buf[2] != 176366, "test24 case 1 failed\n"); - FAILED(buf[3] != 64, "test24 case 2 failed\n"); - FAILED(buf[4] != -100, "test24 case 3 failed\n"); - FAILED(buf[5] != 100567, "test24 case 4 failed\n"); - FAILED(buf[6] != 952467, "test24 case 5 failed\n"); - FAILED(buf[7] != 952467, "test24 case 6 failed\n"); - FAILED(buf[8] != 952467 * 2, "test24 case 7 failed\n"); + FAILED(buf[2] != 176366, "test21 case 1 failed\n"); + FAILED(buf[3] != 64, "test21 case 2 failed\n"); + FAILED(buf[4] != -100, "test21 case 3 failed\n"); + FAILED(buf[5] != 100567, "test21 case 4 failed\n"); + FAILED(buf[6] != 952467, "test21 case 5 failed\n"); + FAILED(buf[7] != 952467, "test21 case 6 failed\n"); + FAILED(buf[8] != 952467 * 2, "test21 case 7 failed\n"); - FAILED(sbuf[1] != 30000, "test24 case 8 failed\n"); - FAILED(sbuf[2] != -12345, "test24 case 9 failed\n"); - FAILED(sbuf[4] != sizeof(sljit_s16), "test24 case 10 failed\n"); + FAILED(sbuf[1] != 30000, "test21 case 8 failed\n"); + FAILED(sbuf[2] != -12345, "test21 case 9 failed\n"); + FAILED(sbuf[4] != sizeof(sljit_s16), "test21 case 10 failed\n"); - FAILED(bbuf[1] != -128, "test24 case 11 failed\n"); - FAILED(bbuf[2] != 99, "test24 case 12 failed\n"); - FAILED(bbuf[4] != 99, "test24 case 13 failed\n"); - FAILED(bbuf[5] != 99, "test24 case 14 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(bbuf[6] != -128, "test24 case 15 failed\n"); + FAILED(bbuf[1] != -128, "test21 case 11 failed\n"); + FAILED(bbuf[2] != 99, "test21 case 12 failed\n"); + FAILED(bbuf[4] != 99, "test21 case 13 failed\n"); + FAILED(bbuf[5] != 99, "test21 case 14 failed\n"); +#if IS_64BIT + FAILED(bbuf[6] != -128, "test21 case 15 failed\n"); #endif sljit_free_code(code.code, NULL); successful_tests++; } -static void test25(void) +static void test22(void) { -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT /* 64 bit loads. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); sljit_sw buf[14]; if (verbose) - printf("Run test25\n"); + printf("Run test22\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 7; @@ -2326,7 +2099,7 @@ static void test25(void) buf[12] = 0; buf[13] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 1 * sizeof(sljit_sw), SLJIT_IMM, 0x7fff); @@ -2350,27 +2123,27 @@ static void test25(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); - FAILED(buf[0] != 0, "test25 case 1 failed\n"); - FAILED(buf[1] != 0x7fff, "test25 case 2 failed\n"); - FAILED(buf[2] != -0x8000, "test25 case 3 failed\n"); - FAILED(buf[3] != 0x7fffffff, "test25 case 4 failed\n"); - FAILED(buf[4] != SLJIT_W(-0x80000000), "test25 case 5 failed\n"); - FAILED(buf[5] != SLJIT_W(0x1234567887654321), "test25 case 6 failed\n"); - FAILED(buf[6] != SLJIT_W(0xff80000000), "test25 case 7 failed\n"); - FAILED(buf[7] != SLJIT_W(0x3ff0000000), "test25 case 8 failed\n"); - FAILED((sljit_uw)buf[8] != SLJIT_W(0xfffffff800100000), "test25 case 9 failed\n"); - FAILED((sljit_uw)buf[9] != SLJIT_W(0xfffffff80010f000), "test25 case 10 failed\n"); - FAILED(buf[10] != SLJIT_W(0x07fff00000008001), "test25 case 11 failed\n"); - FAILED(buf[11] != SLJIT_W(0x07fff00080010000), "test25 case 12 failed\n"); - FAILED(buf[12] != SLJIT_W(0x07fff00080018001), "test25 case 13 failed\n"); - FAILED(buf[13] != SLJIT_W(0x07fff00ffff00000), "test25 case 14 failed\n"); + FAILED(buf[0] != 0, "test22 case 1 failed\n"); + FAILED(buf[1] != 0x7fff, "test22 case 2 failed\n"); + FAILED(buf[2] != -0x8000, "test22 case 3 failed\n"); + FAILED(buf[3] != 0x7fffffff, "test22 case 4 failed\n"); + FAILED(buf[4] != SLJIT_W(-0x80000000), "test22 case 5 failed\n"); + FAILED(buf[5] != SLJIT_W(0x1234567887654321), "test22 case 6 failed\n"); + FAILED(buf[6] != SLJIT_W(0xff80000000), "test22 case 7 failed\n"); + FAILED(buf[7] != SLJIT_W(0x3ff0000000), "test22 case 8 failed\n"); + FAILED((sljit_uw)buf[8] != SLJIT_W(0xfffffff800100000), "test22 case 9 failed\n"); + FAILED((sljit_uw)buf[9] != SLJIT_W(0xfffffff80010f000), "test22 case 10 failed\n"); + FAILED(buf[10] != SLJIT_W(0x07fff00000008001), "test22 case 11 failed\n"); + FAILED(buf[11] != SLJIT_W(0x07fff00080010000), "test22 case 12 failed\n"); + FAILED(buf[12] != SLJIT_W(0x07fff00080018001), "test22 case 13 failed\n"); + FAILED(buf[13] != SLJIT_W(0x07fff00ffff00000), "test22 case 14 failed\n"); sljit_free_code(code.code, NULL); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ successful_tests++; } -static void test26(void) +static void test23(void) { /* Aligned access without aligned offsets. */ executable_code code; @@ -2380,7 +2153,7 @@ static void test26(void) sljit_f64 dbuf[4]; if (verbose) - printf("Run test26\n"); + printf("Run test23\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -2399,7 +2172,7 @@ static void test26(void) dbuf[2] = 0.0; dbuf[3] = -4.0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 3, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 3, 3, 0, 0, 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 3); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, 1); @@ -2438,28 +2211,28 @@ static void test26(void) code.func3((sljit_sw)&buf, (sljit_sw)&ibuf, (sljit_sw)&dbuf); - FAILED(buf[1] != -689, "test26 case 1 failed\n"); - FAILED(buf[2] != -16, "test26 case 2 failed\n"); - FAILED(ibuf[1] != -2789, "test26 case 3 failed\n"); - FAILED(ibuf[2] != -18, "test26 case 4 failed\n"); + FAILED(buf[1] != -689, "test23 case 1 failed\n"); + FAILED(buf[2] != -16, "test23 case 2 failed\n"); + FAILED(ibuf[1] != -2789, "test23 case 3 failed\n"); + FAILED(ibuf[2] != -18, "test23 case 4 failed\n"); if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - FAILED(dbuf[1] != 5.75, "test26 case 5 failed\n"); - FAILED(dbuf[2] != 11.5, "test26 case 6 failed\n"); - FAILED(dbuf[3] != -2.875, "test26 case 7 failed\n"); + FAILED(dbuf[1] != 5.75, "test23 case 5 failed\n"); + FAILED(dbuf[2] != 11.5, "test23 case 6 failed\n"); + FAILED(dbuf[3] != -2.875, "test23 case 7 failed\n"); } sljit_free_code(code.code, NULL); successful_tests++; } -static void test27(void) +static void test24(void) { #define SET_NEXT_BYTE(type) \ cond_set(compiler, SLJIT_R2, 0, type); \ sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R2, 0); \ sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT #define RESULT(i) i #else #define RESULT(i) (3 - i) @@ -2479,7 +2252,7 @@ static void test27(void) SLJIT_ASSERT(shift_reg >= SLJIT_R2 && shift_reg <= SLJIT_R3); if (verbose) - printf("Run test27\n"); + printf("Run test24\n"); for (i = 0; i < sizeof(buf); ++i) buf[i] = 10; @@ -2487,7 +2260,7 @@ static void test27(void) FAILED(!compiler, "cannot create compiler\n"); /* 3 arguments passed, 3 arguments used. */ - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 4, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 3, 0, 0, 0); /* buf[0] */ sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); @@ -2650,7 +2423,7 @@ static void test27(void) sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_LESS, SLJIT_R0, 0, SLJIT_IMM, 0x1234); SET_NEXT_BYTE(SLJIT_SIG_LESS); /* buf[38] */ -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x12300000000) - 43); #else sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, -43); @@ -2670,54 +2443,54 @@ static void test27(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != RESULT(1), "test27 case 1 failed\n"); - FAILED(buf[1] != RESULT(2), "test27 case 2 failed\n"); - FAILED(buf[2] != 2, "test27 case 3 failed\n"); - FAILED(buf[3] != 1, "test27 case 4 failed\n"); - FAILED(buf[4] != RESULT(1), "test27 case 5 failed\n"); - FAILED(buf[5] != RESULT(2), "test27 case 6 failed\n"); - FAILED(buf[6] != 2, "test27 case 7 failed\n"); - FAILED(buf[7] != 1, "test27 case 8 failed\n"); + FAILED(buf[0] != RESULT(1), "test24 case 1 failed\n"); + FAILED(buf[1] != RESULT(2), "test24 case 2 failed\n"); + FAILED(buf[2] != 2, "test24 case 3 failed\n"); + FAILED(buf[3] != 1, "test24 case 4 failed\n"); + FAILED(buf[4] != RESULT(1), "test24 case 5 failed\n"); + FAILED(buf[5] != RESULT(2), "test24 case 6 failed\n"); + FAILED(buf[6] != 2, "test24 case 7 failed\n"); + FAILED(buf[7] != 1, "test24 case 8 failed\n"); - FAILED(buf[8] != 2, "test27 case 9 failed\n"); - FAILED(buf[9] != 1, "test27 case 10 failed\n"); - FAILED(buf[10] != 2, "test27 case 11 failed\n"); - FAILED(buf[11] != 1, "test27 case 12 failed\n"); - FAILED(buf[12] != 1, "test27 case 13 failed\n"); - FAILED(buf[13] != 2, "test27 case 14 failed\n"); - FAILED(buf[14] != 2, "test27 case 15 failed\n"); - FAILED(buf[15] != 1, "test27 case 16 failed\n"); - FAILED(buf[16] != 1, "test27 case 17 failed\n"); - FAILED(buf[17] != 2, "test27 case 18 failed\n"); - FAILED(buf[18] != 1, "test27 case 19 failed\n"); - FAILED(buf[19] != 1, "test27 case 20 failed\n"); - FAILED(buf[20] != 1, "test27 case 21 failed\n"); - FAILED(buf[21] != 2, "test27 case 22 failed\n"); + FAILED(buf[8] != 2, "test24 case 9 failed\n"); + FAILED(buf[9] != 1, "test24 case 10 failed\n"); + FAILED(buf[10] != 2, "test24 case 11 failed\n"); + FAILED(buf[11] != 1, "test24 case 12 failed\n"); + FAILED(buf[12] != 1, "test24 case 13 failed\n"); + FAILED(buf[13] != 2, "test24 case 14 failed\n"); + FAILED(buf[14] != 2, "test24 case 15 failed\n"); + FAILED(buf[15] != 1, "test24 case 16 failed\n"); + FAILED(buf[16] != 1, "test24 case 17 failed\n"); + FAILED(buf[17] != 2, "test24 case 18 failed\n"); + FAILED(buf[18] != 1, "test24 case 19 failed\n"); + FAILED(buf[19] != 1, "test24 case 20 failed\n"); + FAILED(buf[20] != 1, "test24 case 21 failed\n"); + FAILED(buf[21] != 2, "test24 case 22 failed\n"); - FAILED(buf[22] != RESULT(1), "test27 case 23 failed\n"); - FAILED(buf[23] != RESULT(2), "test27 case 24 failed\n"); - FAILED(buf[24] != 2, "test27 case 25 failed\n"); - FAILED(buf[25] != 1, "test27 case 26 failed\n"); + FAILED(buf[22] != RESULT(1), "test24 case 23 failed\n"); + FAILED(buf[23] != RESULT(2), "test24 case 24 failed\n"); + FAILED(buf[24] != 2, "test24 case 25 failed\n"); + FAILED(buf[25] != 1, "test24 case 26 failed\n"); - FAILED(buf[26] != 5, "test27 case 27 failed\n"); - FAILED(buf[27] != 9, "test27 case 28 failed\n"); + FAILED(buf[26] != 5, "test24 case 27 failed\n"); + FAILED(buf[27] != 9, "test24 case 28 failed\n"); - FAILED(buf[28] != 2, "test27 case 29 failed\n"); - FAILED(buf[29] != 1, "test27 case 30 failed\n"); + FAILED(buf[28] != 2, "test24 case 29 failed\n"); + FAILED(buf[29] != 1, "test24 case 30 failed\n"); - FAILED(buf[30] != 1, "test27 case 31 failed\n"); - FAILED(buf[31] != 1, "test27 case 32 failed\n"); - FAILED(buf[32] != 1, "test27 case 33 failed\n"); - FAILED(buf[33] != 1, "test27 case 34 failed\n"); + FAILED(buf[30] != 1, "test24 case 31 failed\n"); + FAILED(buf[31] != 1, "test24 case 32 failed\n"); + FAILED(buf[32] != 1, "test24 case 33 failed\n"); + FAILED(buf[33] != 1, "test24 case 34 failed\n"); - FAILED(buf[34] != 1, "test27 case 35 failed\n"); - FAILED(buf[35] != 0, "test27 case 36 failed\n"); + FAILED(buf[34] != 1, "test24 case 35 failed\n"); + FAILED(buf[35] != 0, "test24 case 36 failed\n"); - FAILED(buf[36] != 2, "test27 case 37 failed\n"); - FAILED(buf[37] != 1, "test27 case 38 failed\n"); - FAILED(buf[38] != 2, "test27 case 39 failed\n"); - FAILED(buf[39] != 1, "test27 case 40 failed\n"); - FAILED(buf[40] != 10, "test27 case 41 failed\n"); + FAILED(buf[36] != 2, "test24 case 37 failed\n"); + FAILED(buf[37] != 1, "test24 case 38 failed\n"); + FAILED(buf[38] != 2, "test24 case 39 failed\n"); + FAILED(buf[39] != 1, "test24 case 40 failed\n"); + FAILED(buf[40] != 10, "test24 case 41 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; @@ -2725,7 +2498,7 @@ static void test27(void) #undef RESULT } -static void test28(void) +static void test25(void) { /* Test mov. */ executable_code code; @@ -2736,7 +2509,7 @@ static void test28(void) sljit_sw buf[5]; if (verbose) - printf("Run test28\n"); + printf("Run test25\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -2780,17 +2553,17 @@ static void test28(void) sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != 8, "test28 case 1 failed\n"); - FAILED(buf[1] != -1872, "test28 case 2 failed\n"); - FAILED(buf[2] != 1, "test28 case 3 failed\n"); - FAILED(buf[3] != 2, "test28 case 4 failed\n"); - FAILED(buf[4] != (sljit_sw)label_addr, "test28 case 5 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != 8, "test25 case 1 failed\n"); + FAILED(buf[1] != -1872, "test25 case 2 failed\n"); + FAILED(buf[2] != 1, "test25 case 3 failed\n"); + FAILED(buf[3] != 2, "test25 case 4 failed\n"); + FAILED(buf[4] != (sljit_sw)label_addr, "test25 case 5 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test29(void) +static void test26(void) { /* Test signed/unsigned bytes and halfs. */ executable_code code; @@ -2799,13 +2572,13 @@ static void test29(void) sljit_s32 i; if (verbose) - printf("Run test29\n"); + printf("Run test26\n"); for (i = 0; i < 25; i++) buf[i] = 0; FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 5, 5, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_IMM, -187); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); @@ -2825,7 +2598,7 @@ static void test29(void) sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R4, 0, SLJIT_IMM, 0x9cb0a6); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_uw), SLJIT_R4, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-3580429715)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_uw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-100722768662)); @@ -2834,7 +2607,7 @@ static void test29(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_uw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R4, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_uw), SLJIT_R4, 0); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -187); sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_R1, 0); @@ -2862,7 +2635,7 @@ static void test29(void) sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R4, 0, SLJIT_R3, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 19 * sizeof(sljit_uw), SLJIT_R4, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(-3580429715)); sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R1, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_uw), SLJIT_R0, 0); @@ -2875,7 +2648,7 @@ static void test29(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5)); sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R4, 0, SLJIT_R3, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_uw), SLJIT_R4, 0); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 0x9faa5); sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_S2, 0, SLJIT_S2, 0); @@ -2888,45 +2661,45 @@ static void test29(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); - FAILED(buf[0] != 69, "test29 case 1 failed\n"); - FAILED(buf[1] != -93, "test29 case 2 failed\n"); - FAILED(buf[2] != 200, "test29 case 3 failed\n"); - FAILED(buf[3] != 0xe5, "test29 case 4 failed\n"); - FAILED(buf[4] != 19640, "test29 case 5 failed\n"); - FAILED(buf[5] != -31005, "test29 case 6 failed\n"); - FAILED(buf[6] != 52646, "test29 case 7 failed\n"); - FAILED(buf[7] != 0xb0a6, "test29 case 8 failed\n"); + FAILED(buf[0] != 69, "test26 case 1 failed\n"); + FAILED(buf[1] != -93, "test26 case 2 failed\n"); + FAILED(buf[2] != 200, "test26 case 3 failed\n"); + FAILED(buf[3] != 0xe5, "test26 case 4 failed\n"); + FAILED(buf[4] != 19640, "test26 case 5 failed\n"); + FAILED(buf[5] != -31005, "test26 case 6 failed\n"); + FAILED(buf[6] != 52646, "test26 case 7 failed\n"); + FAILED(buf[7] != 0xb0a6, "test26 case 8 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[8] != SLJIT_W(714537581), "test29 case 9 failed\n"); - FAILED(buf[9] != SLJIT_W(-1938520854), "test29 case 10 failed\n"); - FAILED(buf[10] != SLJIT_W(3236202668), "test29 case 11 failed\n"); - FAILED(buf[11] != SLJIT_W(0xf97a70b5), "test29 case 12 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#if IS_64BIT + FAILED(buf[8] != SLJIT_W(714537581), "test26 case 9 failed\n"); + FAILED(buf[9] != SLJIT_W(-1938520854), "test26 case 10 failed\n"); + FAILED(buf[10] != SLJIT_W(3236202668), "test26 case 11 failed\n"); + FAILED(buf[11] != SLJIT_W(0xf97a70b5), "test26 case 12 failed\n"); +#endif /* IS_64BIT */ - FAILED(buf[12] != 69, "test29 case 13 failed\n"); - FAILED(buf[13] != -93, "test29 case 14 failed\n"); - FAILED(buf[14] != 200, "test29 case 15 failed\n"); - FAILED(buf[15] != 0xe5, "test29 case 16 failed\n"); - FAILED(buf[16] != 19640, "test29 case 17 failed\n"); - FAILED(buf[17] != -31005, "test29 case 18 failed\n"); - FAILED(buf[18] != 52646, "test29 case 19 failed\n"); - FAILED(buf[19] != 0xb0a6, "test29 case 20 failed\n"); + FAILED(buf[12] != 69, "test26 case 13 failed\n"); + FAILED(buf[13] != -93, "test26 case 14 failed\n"); + FAILED(buf[14] != 200, "test26 case 15 failed\n"); + FAILED(buf[15] != 0xe5, "test26 case 16 failed\n"); + FAILED(buf[16] != 19640, "test26 case 17 failed\n"); + FAILED(buf[17] != -31005, "test26 case 18 failed\n"); + FAILED(buf[18] != 52646, "test26 case 19 failed\n"); + FAILED(buf[19] != 0xb0a6, "test26 case 20 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[20] != SLJIT_W(714537581), "test29 case 21 failed\n"); - FAILED(buf[21] != SLJIT_W(-1938520854), "test29 case 22 failed\n"); - FAILED(buf[22] != SLJIT_W(3236202668), "test29 case 23 failed\n"); - FAILED(buf[23] != SLJIT_W(0xf97a70b5), "test29 case 24 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#if IS_64BIT + FAILED(buf[20] != SLJIT_W(714537581), "test26 case 21 failed\n"); + FAILED(buf[21] != SLJIT_W(-1938520854), "test26 case 22 failed\n"); + FAILED(buf[22] != SLJIT_W(3236202668), "test26 case 23 failed\n"); + FAILED(buf[23] != SLJIT_W(0xf97a70b5), "test26 case 24 failed\n"); +#endif /* IS_64BIT */ - FAILED(buf[24] != -91, "test29 case 25 failed\n"); + FAILED(buf[24] != -91, "test26 case 25 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test30(void) +static void test27(void) { /* Test unused results. */ executable_code code; @@ -2934,18 +2707,18 @@ static void test30(void) sljit_sw buf[1]; if (verbose) - printf("Run test30\n"); + printf("Run test27\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 5, 5, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 1); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 1); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 1); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_IMM, SLJIT_W(-0x123ffffffff)); #else sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_IMM, 1); @@ -2981,29 +2754,24 @@ static void test30(void) sljit_free_compiler(compiler); code.func1((sljit_sw)&buf); - FAILED(buf[0] != 9, "test30 case 1 failed\n"); + FAILED(buf[0] != 9, "test27 case 1 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test31(void) +static void test28(void) { /* Integer mul and set flags. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); sljit_sw buf[12]; sljit_s32 i; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw big_word = SLJIT_W(0x7fffffff00000000); - sljit_sw big_word2 = SLJIT_W(0x7fffffff00000012); -#else - sljit_sw big_word = 0x7fffffff; - sljit_sw big_word2 = 0x00000012; -#endif + sljit_sw big_word = WCONST(0x7fffffff00000000, 0x7fffffff); + sljit_sw big_word2 = WCONST(0x7fffffff00000012, 0x00000012); if (verbose) - printf("Run test31\n"); + printf("Run test28\n"); for (i = 0; i < 12; i++) buf[i] = 3; @@ -3011,7 +2779,7 @@ static void test31(void) FAILED(!compiler, "cannot create compiler\n"); /* buf[0] */ - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 5, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 5, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); sljit_emit_op2u(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R1, 0, SLJIT_IMM, -45); cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_NOT_OVERFLOW); @@ -3063,150 +2831,22 @@ static void test31(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != 1, "test31 case 1 failed\n"); - FAILED(buf[1] != 2, "test31 case 2 failed\n"); -/* Qemu issues for 64 bit muls. */ -#if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[2] != 1, "test31 case 3 failed\n"); - FAILED(buf[3] != 2, "test31 case 4 failed\n"); -#endif - FAILED(buf[4] != 1, "test31 case 5 failed\n"); - FAILED((buf[5] & (sljit_sw)0xffffffff) != (sljit_sw)0x85540c10, "test31 case 6 failed\n"); - FAILED(buf[6] != 2, "test31 case 7 failed\n"); - FAILED(buf[7] != 1, "test31 case 8 failed\n"); -#if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[8] != 1, "test31 case 9 failed\n"); -#endif - FAILED(buf[9] != -1541, "test31 case 10 failed\n"); + FAILED(buf[0] != 1, "test28 case 1 failed\n"); + FAILED(buf[1] != 2, "test28 case 2 failed\n"); + FAILED(buf[2] != 1, "test28 case 3 failed\n"); + FAILED(buf[3] != 2, "test28 case 4 failed\n"); + FAILED(buf[4] != 1, "test28 case 5 failed\n"); + FAILED((buf[5] & (sljit_sw)0xffffffff) != (sljit_sw)0x85540c10, "test28 case 6 failed\n"); + FAILED(buf[6] != 2, "test28 case 7 failed\n"); + FAILED(buf[7] != 1, "test28 case 8 failed\n"); + FAILED(buf[8] != 1, "test28 case 9 failed\n"); + FAILED(buf[9] != -1541, "test28 case 10 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test32(void) -{ - /* Floating point set flags. */ - executable_code code; - struct sljit_compiler* compiler; - sljit_s32 i; - - sljit_sw buf[16]; - union { - sljit_f64 value; - struct { - sljit_s32 value1; - sljit_s32 value2; - } u; - } dbuf[4]; - - if (verbose) - printf("Run test32\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test32 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - for (i = 0; i < 16; i++) - buf[i] = 5; - - /* Two NaNs */ - dbuf[0].u.value1 = 0x7fffffff; - dbuf[0].u.value2 = 0x7fffffff; - dbuf[1].u.value1 = 0x7fffffff; - dbuf[1].u.value2 = 0x7fffffff; - dbuf[2].value = -13.0; - dbuf[3].value = 27.0; - - SLJIT_ASSERT(sizeof(sljit_f64) == 8 && sizeof(sljit_s32) == 4 && sizeof(dbuf[0]) == 8); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 1, 2, 4, 0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); - /* buf[0] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_UNORDERED); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); - /* buf[1] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_ORDERED); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[2] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_UNORDERED); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[3] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_ORDERED); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[4] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_F_LESS); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[5] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_F_GREATER_EQUAL); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[6] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_F_GREATER); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[7] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_F_LESS_EQUAL); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[8] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_F_EQUAL); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - /* buf[9] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_F_NOT_EQUAL); - - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR3, 0, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); - /* buf[10] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_UNORDERED); - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); - /* buf[11] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_F_EQUAL); - - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); - /* buf[12] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_ORDERED); - - sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR3, 0, SLJIT_FR2, 0); - sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), 0); - /* buf[13] */ - cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_UNORDERED); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func2((sljit_sw)&buf, (sljit_sw)&dbuf); - - FAILED(buf[0] != 1, "test32 case 1 failed\n"); - FAILED(buf[1] != 2, "test32 case 2 failed\n"); - FAILED(buf[2] != 2, "test32 case 3 failed\n"); - FAILED(buf[3] != 1, "test32 case 4 failed\n"); - FAILED(buf[4] != 1, "test32 case 5 failed\n"); - FAILED(buf[5] != 2, "test32 case 6 failed\n"); - FAILED(buf[6] != 2, "test32 case 7 failed\n"); - FAILED(buf[7] != 1, "test32 case 8 failed\n"); - FAILED(buf[8] != 2, "test32 case 9 failed\n"); - FAILED(buf[9] != 1, "test32 case 10 failed\n"); - FAILED(buf[10] != 2, "test32 case 11 failed\n"); - FAILED(buf[11] != 1, "test32 case 12 failed\n"); - FAILED(buf[12] != 2, "test32 case 13 failed\n"); - FAILED(buf[13] != 1, "test32 case 14 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test33(void) +static void test29(void) { /* Test setting multiple flags. */ executable_code code; @@ -3215,7 +2855,7 @@ static void test33(void) sljit_sw buf[10]; if (verbose) - printf("Run test33\n"); + printf("Run test29\n"); buf[0] = 3; buf[1] = 3; @@ -3230,7 +2870,7 @@ static void test33(void) FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 3, 0, 0, 0); /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 20); @@ -3253,7 +2893,7 @@ static void test33(void) sljit_set_label(jump, sljit_emit_label(compiler)); /* buf[4-5] */ -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)SLJIT_W(0x8000000000000000)); #else sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)SLJIT_W(0x80000000)); @@ -3281,7 +2921,7 @@ static void test33(void) sljit_set_label(jump, sljit_emit_label(compiler)); /* buf[8] */ -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)SLJIT_W(0x8000000000000000)); #else sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)SLJIT_W(0x80000000)); @@ -3303,22 +2943,22 @@ static void test33(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != 0, "test33 case 1 failed\n"); - FAILED(buf[1] != 11, "test33 case 2 failed\n"); - FAILED(buf[2] != 1, "test33 case 3 failed\n"); - FAILED(buf[3] != 45, "test33 case 4 failed\n"); - FAILED(buf[4] != 13, "test33 case 5 failed\n"); - FAILED(buf[5] != 0, "test33 case 6 failed\n"); - FAILED(buf[6] != 0, "test33 case 7 failed\n"); - FAILED(buf[7] != 48, "test33 case 8 failed\n"); - FAILED(buf[8] != 50, "test33 case 9 failed\n"); - FAILED(buf[9] != 1, "test33 case 10 failed\n"); + FAILED(buf[0] != 0, "test29 case 1 failed\n"); + FAILED(buf[1] != 11, "test29 case 2 failed\n"); + FAILED(buf[2] != 1, "test29 case 3 failed\n"); + FAILED(buf[3] != 45, "test29 case 4 failed\n"); + FAILED(buf[4] != 13, "test29 case 5 failed\n"); + FAILED(buf[5] != 0, "test29 case 6 failed\n"); + FAILED(buf[6] != 0, "test29 case 7 failed\n"); + FAILED(buf[7] != 48, "test29 case 8 failed\n"); + FAILED(buf[8] != 50, "test29 case 9 failed\n"); + FAILED(buf[9] != 1, "test29 case 10 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test34(void) +static void test30(void) { /* Test fast calls. */ executable_code codeA; @@ -3334,7 +2974,7 @@ static void test34(void) sljit_p buf[2]; if (verbose) - printf("Run test34\n"); + printf("Run test30\n"); buf[0] = 0; buf[1] = 0; @@ -3390,6 +3030,10 @@ static void test34(void) FAILED(!compiler, "cannot create compiler\n"); sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p)); + label = sljit_emit_label(compiler); + jump = sljit_emit_jump(compiler, SLJIT_JUMP | SLJIT_REWRITABLE_JUMP); + sljit_set_label(jump, label); + label = sljit_emit_label(compiler); sljit_emit_op0(compiler, SLJIT_ENDBR); sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_SP), 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 10); @@ -3398,6 +3042,7 @@ static void test34(void) codeD.code = sljit_generate_code(compiler); CHECK(compiler); + addr = sljit_get_label_addr(label); sljit_free_compiler(compiler); /* E */ @@ -3407,7 +3052,7 @@ static void test34(void) sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_S0), 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 12); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p), SLJIT_IMM, SLJIT_FUNC_ADDR(codeD.code)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p), SLJIT_IMM, (sljit_sw)addr); sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p)); sljit_emit_op_src(compiler, SLJIT_FAST_RETURN, SLJIT_MEM1(SLJIT_S0), 0); @@ -3430,8 +3075,8 @@ static void test34(void) addr = sljit_get_label_addr(label); sljit_free_compiler(compiler); - FAILED(codeF.func1((sljit_sw)&buf) != 40, "test34 case 1 failed\n"); - FAILED(buf[0] != addr - SLJIT_RETURN_ADDRESS_OFFSET, "test34 case 2 failed\n"); + FAILED(codeF.func1((sljit_sw)&buf) != 40, "test30 case 1 failed\n"); + FAILED(buf[0] != addr - SLJIT_RETURN_ADDRESS_OFFSET, "test30 case 2 failed\n"); sljit_free_code(codeA.code, NULL); sljit_free_code(codeB.code, NULL); @@ -3442,7 +3087,7 @@ static void test34(void) successful_tests++; } -static void test35(void) +static void test31(void) { /* More complicated tests for fast calls. */ executable_code codeA; @@ -3457,7 +3102,7 @@ static void test35(void) sljit_p buf[1]; if (verbose) - printf("Run test35\n"); + printf("Run test31\n"); buf[0] = 0; @@ -3512,8 +3157,8 @@ static void test35(void) return_addr = sljit_get_label_addr(label); sljit_free_compiler(compiler); - FAILED(codeC.func0() != 12, "test35 case 1 failed\n"); - FAILED(buf[0] != return_addr - SLJIT_RETURN_ADDRESS_OFFSET, "test35 case 2 failed\n"); + FAILED(codeC.func0() != 12, "test31 case 1 failed\n"); + FAILED(buf[0] != return_addr - SLJIT_RETURN_ADDRESS_OFFSET, "test31 case 2 failed\n"); sljit_free_code(codeA.code, NULL); sljit_free_code(codeB.code, NULL); @@ -3537,7 +3182,7 @@ static void cmp_test(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 } #define TEST_CASES (7 + 10 + 12 + 11 + 4) -static void test36(void) +static void test32(void) { /* Compare instruction. */ executable_code code; @@ -3555,7 +3200,7 @@ static void test36(void) sljit_s32 i; if (verbose) - printf("Run test36\n"); + printf("Run test32\n"); FAILED(!compiler, "cannot create compiler\n"); for (i = 0; i < TEST_CASES; ++i) @@ -3565,7 +3210,7 @@ static void test36(void) data[2] = 43; data[3] = -13; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 3, 2, 0, 0, 0); sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 13); @@ -3631,7 +3276,7 @@ static void test36(void) cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_IMM, -1, SLJIT_R1, 0); cmp_test(compiler, SLJIT_SIG_GREATER | SLJIT_REWRITABLE_JUMP, SLJIT_R1, 0, SLJIT_IMM, -1); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xf00000004)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R1, 0); @@ -3642,7 +3287,7 @@ static void test36(void) sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R0, 0); cmp_test(compiler, SLJIT_SIG_GREATER | SLJIT_32, SLJIT_R1, 0, SLJIT_IMM, 5); cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, 5); -#else /* !SLJIT_64BIT_ARCHITECTURE */ +#else /* !IS_64BIT */ sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 4); /* buf[40-43] */ cmp_test(compiler, SLJIT_LESS | SLJIT_32, SLJIT_R0, 0, SLJIT_IMM, 5); @@ -3650,7 +3295,7 @@ static void test36(void) sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0xf0000004); cmp_test(compiler, SLJIT_SIG_GREATER | SLJIT_32, SLJIT_R0, 0, SLJIT_IMM, 5); cmp_test(compiler, SLJIT_SIG_LESS | SLJIT_32, SLJIT_R0, 0, SLJIT_IMM, 5); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ sljit_emit_return_void(compiler); @@ -3662,7 +3307,7 @@ static void test36(void) for (i = 0; i < TEST_CASES; ++i) if (SLJIT_UNLIKELY(buf[i] != compare_buf[i])) { - printf("test36 case %d failed\n", i + 1); + printf("test32 case %d failed\n", i + 1); return; } @@ -3671,13 +3316,13 @@ static void test36(void) } #undef TEST_CASES -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT #define BITN(n) (SLJIT_W(1) << (63 - (n))) -#else /* !SLJIT_64BIT_ARCHITECTURE */ +#else /* !IS_64BIT */ #define BITN(n) (1 << (31 - ((n) & 0x1f))) -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ -static void test37(void) +static void test33(void) { /* Test count leading zeroes. */ executable_code code; @@ -3687,7 +3332,7 @@ static void test37(void) sljit_s32 i; if (verbose) - printf("Run test37\n"); + printf("Run test33\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -3698,7 +3343,7 @@ static void test37(void) buf[2] = 0; buf[4] = BITN(13); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 2, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 2, 3, 0, 0, 0); /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, BITN(27)); sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); @@ -3749,18 +3394,18 @@ static void test37(void) sljit_free_compiler(compiler); code.func2((sljit_sw)&buf, (sljit_sw)&ibuf); - FAILED(buf[0] != 27, "test37 case 1 failed\n"); - FAILED(buf[1] != WCONST(47, 15), "test37 case 2 failed\n"); - FAILED(buf[2] != WCONST(64, 32), "test37 case 3 failed\n"); - FAILED(buf[3] != 0, "test37 case 4 failed\n"); - FAILED(ibuf[0] != 32, "test37 case 5 failed\n"); - FAILED(buf[4] != 13, "test37 case 6 failed\n"); - FAILED(buf[5] != WCONST(58, 26), "test37 case 7 failed\n"); - FAILED(buf[6] != WCONST(64, 32), "test37 case 8 failed\n"); - FAILED(ibuf[1] != 4, "test37 case 9 failed\n"); - FAILED((buf[7] & (sljit_sw)0xffffffff) != 4, "test37 case 10 failed\n"); - FAILED((buf[8] & (sljit_sw)0xffffffff) != 0, "test37 case 11 failed\n"); - FAILED(ibuf[2] != 8, "test37 case 12 failed\n"); + FAILED(buf[0] != 27, "test33 case 1 failed\n"); + FAILED(buf[1] != WCONST(47, 15), "test33 case 2 failed\n"); + FAILED(buf[2] != WCONST(64, 32), "test33 case 3 failed\n"); + FAILED(buf[3] != 0, "test33 case 4 failed\n"); + FAILED(ibuf[0] != 32, "test33 case 5 failed\n"); + FAILED(buf[4] != 13, "test33 case 6 failed\n"); + FAILED(buf[5] != WCONST(58, 26), "test33 case 7 failed\n"); + FAILED(buf[6] != WCONST(64, 32), "test33 case 8 failed\n"); + FAILED(ibuf[1] != 4, "test33 case 9 failed\n"); + FAILED((buf[7] & (sljit_sw)0xffffffff) != 4, "test33 case 10 failed\n"); + FAILED((buf[8] & (sljit_sw)0xffffffff) != 0, "test33 case 11 failed\n"); + FAILED(ibuf[2] != 8, "test33 case 12 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; @@ -3768,7 +3413,7 @@ static void test37(void) #undef BITN -static void test38(void) +static void test34(void) { #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) /* Test stack utility. */ @@ -3785,7 +3430,7 @@ static void test38(void) struct sljit_label* label; if (verbose) - printf("Run test38\n"); + printf("Run test34\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -3845,7 +3490,7 @@ static void test38(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(VOID, P, P), SLJIT_IMM, SLJIT_FUNC_ADDR(sljit_free_stack)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2V(P, P), SLJIT_IMM, SLJIT_FUNC_ADDR(sljit_free_stack)); sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 4567); @@ -3864,14 +3509,14 @@ static void test38(void) sljit_free_compiler(compiler); /* Just survive this. */ - FAILED(code.func0() != 4567, "test38 case 1 failed\n"); + FAILED(code.func0() != 4567, "test34 case 1 failed\n"); sljit_free_code(code.code, NULL); #endif successful_tests++; } -static void test39(void) +static void test35(void) { /* Test error handling. */ executable_code code; @@ -3879,14 +3524,14 @@ static void test39(void) struct sljit_jump* jump; if (verbose) - printf("Run test39\n"); + printf("Run test35\n"); FAILED(!compiler, "cannot create compiler\n"); /* Such assignment should never happen in a regular program. */ compiler->error = -3967; - SLJIT_ASSERT(sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 6, 0, 32) == -3967); + SLJIT_ASSERT(sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 6, 0, 32) == -3967); SLJIT_ASSERT(sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R1, 0) == -3967); SLJIT_ASSERT(sljit_emit_op0(compiler, SLJIT_NOP) == -3967); SLJIT_ASSERT(sljit_emit_op0(compiler, SLJIT_ENDBR) == -3967); @@ -3911,25 +3556,25 @@ static void test39(void) SLJIT_ASSERT(!compiler->abuf->next && !compiler->abuf->used_size); sljit_set_compiler_memory_error(compiler); - FAILED(sljit_get_compiler_error(compiler) != -3967, "test39 case 1 failed\n"); + FAILED(sljit_get_compiler_error(compiler) != -3967, "test35 case 1 failed\n"); code.code = sljit_generate_code(compiler); - FAILED(sljit_get_compiler_error(compiler) != -3967, "test39 case 2 failed\n"); - FAILED(!!code.code, "test39 case 3 failed\n"); + FAILED(sljit_get_compiler_error(compiler) != -3967, "test35 case 2 failed\n"); + FAILED(!!code.code, "test35 case 3 failed\n"); sljit_free_compiler(compiler); compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - FAILED(sljit_get_compiler_error(compiler) != SLJIT_SUCCESS, "test39 case 4 failed\n"); + FAILED(sljit_get_compiler_error(compiler) != SLJIT_SUCCESS, "test35 case 4 failed\n"); sljit_set_compiler_memory_error(compiler); - FAILED(sljit_get_compiler_error(compiler) != SLJIT_ERR_ALLOC_FAILED, "test39 case 5 failed\n"); + FAILED(sljit_get_compiler_error(compiler) != SLJIT_ERR_ALLOC_FAILED, "test35 case 5 failed\n"); sljit_free_compiler(compiler); successful_tests++; } -static void test40(void) +static void test36(void) { /* Test emit_op_flags. */ executable_code code; @@ -3937,7 +3582,7 @@ static void test40(void) sljit_sw buf[10]; if (verbose) - printf("Run test40\n"); + printf("Run test36\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = -100; @@ -4019,29 +3664,28 @@ static void test40(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != 0xbaddead, "test40 case 1 failed\n"); - FAILED(buf[0] != 0x123457, "test40 case 2 failed\n"); - FAILED(buf[1] != 1, "test40 case 3 failed\n"); - FAILED(buf[2] != 0, "test40 case 4 failed\n"); - FAILED(buf[3] != -7, "test40 case 5 failed\n"); - FAILED(buf[4] != 0, "test40 case 6 failed\n"); - FAILED(buf[5] != 0x89, "test40 case 7 failed\n"); - FAILED(buf[6] != 0, "test40 case 8 failed\n"); - FAILED(buf[7] != 1, "test40 case 9 failed\n"); - FAILED(buf[8] != 1, "test40 case 10 failed\n"); - FAILED(buf[9] != 0x123457, "test40 case 11 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != 0xbaddead, "test36 case 1 failed\n"); + FAILED(buf[0] != 0x123457, "test36 case 2 failed\n"); + FAILED(buf[1] != 1, "test36 case 3 failed\n"); + FAILED(buf[2] != 0, "test36 case 4 failed\n"); + FAILED(buf[3] != -7, "test36 case 5 failed\n"); + FAILED(buf[4] != 0, "test36 case 6 failed\n"); + FAILED(buf[5] != 0x89, "test36 case 7 failed\n"); + FAILED(buf[6] != 0, "test36 case 8 failed\n"); + FAILED(buf[7] != 1, "test36 case 9 failed\n"); + FAILED(buf[8] != 1, "test36 case 10 failed\n"); + FAILED(buf[9] != 0x123457, "test36 case 11 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test41(void) +static void test37(void) { /* Test inline assembly. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); sljit_s32 i; - sljit_f64 buf[3]; #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) sljit_u8 inst[16]; #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) @@ -4052,7 +3696,7 @@ static void test41(void) #endif if (verbose) - printf("Run test41\n"); + printf("Run test37\n"); #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) SLJIT_ASSERT(sljit_has_cpu_feature(SLJIT_HAS_VIRTUAL_REGISTERS) == 0); @@ -4061,11 +3705,12 @@ static void test41(void) for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) if (SLJIT_R(i) >= SLJIT_R3 && SLJIT_R(i) <= SLJIT_R8) { - SLJIT_ASSERT(sljit_get_register_index(SLJIT_R(i)) == -1); + SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) == -1); continue; } #endif - SLJIT_ASSERT(sljit_get_register_index(SLJIT_R(i)) >= 0 && sljit_get_register_index(SLJIT_R(i)) < 64); + SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) >= 0 + && sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) < 64); } FAILED(!compiler, "cannot create compiler\n"); @@ -4076,82 +3721,82 @@ static void test41(void) /* lea SLJIT_RETURN_REG, [SLJIT_S0, SLJIT_S1] */ inst[0] = 0x48; inst[1] = 0x8d; - inst[2] = (sljit_u8)(0x04 | ((sljit_get_register_index(SLJIT_RETURN_REG) & 0x7) << 3)); - inst[3] = (sljit_u8)((sljit_get_register_index(SLJIT_S0) & 0x7) - | ((sljit_get_register_index(SLJIT_S1) & 0x7) << 3)); + inst[2] = (sljit_u8)(0x04 | ((sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) & 0x7) << 3)); + inst[3] = (sljit_u8)((sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) & 0x7) + | ((sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) & 0x7) << 3)); sljit_emit_op_custom(compiler, inst, 4); #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) /* lea SLJIT_RETURN_REG, [SLJIT_S0, SLJIT_S1] */ inst[0] = 0x48; /* REX_W */ inst[1] = 0x8d; - reg = sljit_get_register_index(SLJIT_RETURN_REG); + reg = sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG); inst[2] = (sljit_u8)(0x04 | ((reg & 0x7) << 3)); if (reg > 7) inst[0] |= 0x04; /* REX_R */ - reg = sljit_get_register_index(SLJIT_S0); + reg = sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0); inst[3] = (sljit_u8)(reg & 0x7); if (reg > 7) inst[0] |= 0x01; /* REX_B */ - reg = sljit_get_register_index(SLJIT_S1); + reg = sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1); inst[3] = (sljit_u8)(inst[3] | ((reg & 0x7) << 3)); if (reg > 7) inst[0] |= 0x02; /* REX_X */ sljit_emit_op_custom(compiler, inst, 4); -#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) /* add rd, rn, rm */ - inst = 0xe0800000 | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 12) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 16) - | (sljit_u32)sljit_get_register_index(SLJIT_S1); + inst = 0xe0800000 | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 12) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 16) + | (sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) /* add rd, rn, rm */ - inst = 0xeb000000 | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 8) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 16) - | (sljit_u32)sljit_get_register_index(SLJIT_S1); + inst = 0xeb000000 | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 8) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 16) + | (sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) /* add rd, rn, rm */ - inst = 0x8b000000 | (sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 5) - | ((sljit_u32)sljit_get_register_index(SLJIT_S1) << 16); + inst = 0x8b000000 | (sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 5) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 16); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) /* add rD, rA, rB */ - inst = (31 << 26) | (266 << 1) | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 21) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 16) - | ((sljit_u32)sljit_get_register_index(SLJIT_S1) << 11); + inst = (31 << 26) | (266 << 1) | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 21) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 16) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 11); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) /* addu rd, rs, rt */ - inst = 33 | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 11) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 21) - | ((sljit_u32)sljit_get_register_index(SLJIT_S1) << 16); + inst = 33 | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 11) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 21) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 16); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) /* daddu rd, rs, rt */ - inst = 45 | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 11) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 21) - | ((sljit_u32)sljit_get_register_index(SLJIT_S1) << 16); + inst = 45 | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 11) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 21) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 16); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) /* add rd, rs1, rs2 */ - inst = 0x33 | (0 << 12) | (0 << 25) | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 7) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 15) - | ((sljit_u32)sljit_get_register_index(SLJIT_S1) << 20); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - /* add rd, rs1, rs2 */ - inst = (0x2u << 30) | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 25) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 14) - | (sljit_u32)sljit_get_register_index(SLJIT_S1); + inst = 0x33 | (0 << 12) | (0 << 25) | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 7) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 15) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 20); sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) /* agrk rd, rs1, rs2 */ inst = (0xb9e8u << 16) - | ((sljit_u32)sljit_get_register_index(SLJIT_RETURN_REG) << 4) - | ((sljit_u32)sljit_get_register_index(SLJIT_S0) << 12) - | (sljit_u32)sljit_get_register_index(SLJIT_S1); + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) << 4) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 12) + | (sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1); sljit_emit_op_custom(compiler, &inst, sizeof(inst)); +#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) + /* add.d rd, rs1, rs2 */ + inst = (0x21u << 15) | (sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_RETURN_REG) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S0) << 5) + | ((sljit_u32)sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_S1) << 10); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); #else inst = 0; sljit_emit_op_custom(compiler, &inst, 0); @@ -4163,116 +3808,17 @@ static void test41(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func2(32, -11) != 21, "test41 case 1 failed\n"); - FAILED(code.func2(1000, 234) != 1234, "test41 case 2 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(code.func2(SLJIT_W(0x20f0a04090c06070), SLJIT_W(0x020f0a04090c0607)) != SLJIT_W(0x22ffaa4499cc6677), "test41 case 3 failed\n"); + FAILED(code.func2(32, -11) != 21, "test37 case 1 failed\n"); + FAILED(code.func2(1000, 234) != 1234, "test37 case 2 failed\n"); +#if IS_64BIT + FAILED(code.func2(SLJIT_W(0x20f0a04090c06070), SLJIT_W(0x020f0a04090c0607)) != SLJIT_W(0x22ffaa4499cc6677), "test37 case 3 failed\n"); #endif sljit_free_code(code.code, NULL); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - buf[0] = 13.5; - buf[1] = -2.25; - buf[2] = 0.0; - - compiler = sljit_create_compiler(NULL, NULL); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, 2, 0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - /* addsd x, xm */ - inst[0] = 0xf2; - inst[1] = 0x0f; - inst[2] = 0x58; - inst[3] = (sljit_u8)(0xc0 | (sljit_get_float_register_index(SLJIT_FR0) << 3) - | sljit_get_float_register_index(SLJIT_FR1)); - sljit_emit_op_custom(compiler, inst, 4); -#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) - /* addsd x, xm */ - if (sljit_get_float_register_index(SLJIT_FR0) > 7 || sljit_get_float_register_index(SLJIT_FR1) > 7) { - inst[0] = 0; - if (sljit_get_float_register_index(SLJIT_FR0) > 7) - inst[0] |= 0x04; /* REX_R */ - if (sljit_get_float_register_index(SLJIT_FR1) > 7) - inst[0] |= 0x01; /* REX_B */ - inst[1] = 0xf2; - inst[2] = 0x0f; - inst[3] = 0x58; - inst[4] = (sljit_u8)(0xc0 | ((sljit_get_float_register_index(SLJIT_FR0) & 0x7) << 3) - | (sljit_get_float_register_index(SLJIT_FR1) & 0x7)); - sljit_emit_op_custom(compiler, inst, 5); - } - else { - inst[0] = 0xf2; - inst[1] = 0x0f; - inst[2] = 0x58; - inst[3] = (sljit_u8)(0xc0 | (sljit_get_float_register_index(SLJIT_FR0) << 3) - | sljit_get_float_register_index(SLJIT_FR1)); - sljit_emit_op_custom(compiler, inst, 4); - } -#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) - /* vadd.f64 dd, dn, dm */ - inst = 0xee300b00 | (((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) >> 1) << 12) - | (((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) >> 1) << 16) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR1) >> 1); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) - /* fadd rd, rn, rm */ - inst = 0x1e602800 | (sljit_u32)sljit_get_float_register_index(SLJIT_FR0) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 5) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR1) << 16); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) - /* fadd frD, frA, frB */ - inst = (63u << 26) | (21u << 1) | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 21) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 16) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR1) << 11); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) - /* add.d fd, fs, ft */ - inst = (17u << 26) | (17u << 21) | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 6) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 11) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR1) << 16); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) - /* fadd.d rd, rs1, rs2 */ - inst = (0x1u << 25) | (0x7u << 12) | (0x53u) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 7) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 15) - | (sljit_u32)sljit_get_float_register_index(SLJIT_FR1) << 20; - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - /* faddd rd, rs1, rs2 */ - inst = (0x2u << 30) | (0x34u << 19) | (0x42u << 5) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 25) - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 14) - | (sljit_u32)sljit_get_float_register_index(SLJIT_FR1); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) - /* adbr r1, r2 */ - inst = 0xb31a0000 - | ((sljit_u32)sljit_get_float_register_index(SLJIT_FR0) << 4) - | (sljit_u32)sljit_get_float_register_index(SLJIT_FR1); - sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); -#endif - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - FAILED(buf[2] != 11.25, "test41 case 4 failed\n"); - - sljit_free_code(code.code, NULL); - } - successful_tests++; } -static void test42(void) +static void test38(void) { /* Test long multiply and division. */ executable_code code; @@ -4281,13 +3827,13 @@ static void test42(void) sljit_sw buf[7 + 4 + 8 + 8]; if (verbose) - printf("Run test42\n"); + printf("Run test38\n"); FAILED(!compiler, "cannot create compiler\n"); for (i = 0; i < 7 + 4 + 8 + 8; i++) buf[i] = -1; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 5, 5, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -0x1fb308a); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0xf50c873); @@ -4297,7 +3843,7 @@ static void test42(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, 0x5a4d0c4); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_IMM, 0x9a3b06d); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT /* buf[7-26] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df)); @@ -4367,7 +3913,7 @@ static void test42(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 25 * sizeof(sljit_sw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_R1, 0); -#else /* !SLJIT_64BIT_ARCHITECTURE */ +#else /* !IS_64BIT */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -0x58cd67f5); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x3cb088df); sljit_emit_op0(compiler, SLJIT_LMUL_UW); @@ -4431,7 +3977,7 @@ static void test42(void) sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_R1, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 25 * sizeof(sljit_sw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_R1, 0); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#endif /* IS_64BIT */ /* buf[0-6] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R2, 0); @@ -4450,135 +3996,43 @@ static void test42(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != -0x1fb308a, "test42 case 1 failed\n"); - FAILED(buf[1] != 0xf50c873, "test42 case 2 failed\n"); - FAILED(buf[2] != 0x8a0475b, "test42 case 3 failed\n"); - FAILED(buf[3] != 0x9dc849b, "test42 case 4 failed\n"); - FAILED(buf[4] != -0x7c69a35, "test42 case 5 failed\n"); - FAILED(buf[5] != 0x5a4d0c4, "test42 case 6 failed\n"); - FAILED(buf[6] != 0x9a3b06d, "test42 case 7 failed\n"); + FAILED(buf[0] != -0x1fb308a, "test38 case 1 failed\n"); + FAILED(buf[1] != 0xf50c873, "test38 case 2 failed\n"); + FAILED(buf[2] != 0x8a0475b, "test38 case 3 failed\n"); + FAILED(buf[3] != 0x9dc849b, "test38 case 4 failed\n"); + FAILED(buf[4] != -0x7c69a35, "test38 case 5 failed\n"); + FAILED(buf[5] != 0x5a4d0c4, "test38 case 6 failed\n"); + FAILED(buf[6] != 0x9a3b06d, "test38 case 7 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[7] != SLJIT_W(-4388959407985636971), "test42 case 8 failed\n"); - FAILED(buf[8] != SLJIT_W(2901680654366567099), "test42 case 9 failed\n"); - FAILED(buf[9] != SLJIT_W(-4388959407985636971), "test42 case 10 failed\n"); - FAILED(buf[10] != SLJIT_W(-1677173957268872740), "test42 case 11 failed\n"); - FAILED(buf[11] != SLJIT_W(2), "test42 case 12 failed\n"); - FAILED(buf[12] != SLJIT_W(2532236178951865933), "test42 case 13 failed\n"); - FAILED(buf[13] != SLJIT_W(-1), "test42 case 14 failed\n"); - FAILED(buf[14] != SLJIT_W(-2177944059851366166), "test42 case 15 failed\n"); -#else /* !SLJIT_64BIT_ARCHITECTURE */ - FAILED(buf[7] != -1587000939, "test42 case 8 failed\n"); - FAILED(buf[8] != 665003983, "test42 case 9 failed\n"); - FAILED(buf[9] != -1587000939, "test42 case 10 failed\n"); - FAILED(buf[10] != -353198352, "test42 case 11 failed\n"); - FAILED(buf[11] != 2, "test42 case 12 failed\n"); - FAILED(buf[12] != 768706125, "test42 case 13 failed\n"); - FAILED(buf[13] != -1, "test42 case 14 failed\n"); - FAILED(buf[14] != -471654166, "test42 case 15 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ + FAILED(buf[7] != WCONST(-4388959407985636971, -1587000939), "test38 case 8 failed\n"); + FAILED(buf[8] != WCONST(2901680654366567099, 665003983), "test38 case 9 failed\n"); + FAILED(buf[9] != WCONST(-4388959407985636971, -1587000939), "test38 case 10 failed\n"); + FAILED(buf[10] != WCONST(-1677173957268872740, -353198352), "test38 case 11 failed\n"); + FAILED(buf[11] != 2, "test38 case 12 failed\n"); + FAILED(buf[12] != WCONST(2532236178951865933, 768706125), "test38 case 13 failed\n"); + FAILED(buf[13] != -1, "test38 case 14 failed\n"); + FAILED(buf[14] != WCONST(-2177944059851366166, -471654166), "test38 case 15 failed\n"); - FAILED(buf[15] != 56, "test42 case 16 failed\n"); - FAILED(buf[16] != 58392872, "test42 case 17 failed\n"); - FAILED(buf[17] != -47, "test42 case 18 failed\n"); - FAILED(buf[18] != 35949148, "test42 case 19 failed\n"); + FAILED(buf[15] != 56, "test38 case 16 failed\n"); + FAILED(buf[16] != 58392872, "test38 case 17 failed\n"); + FAILED(buf[17] != -47, "test38 case 18 failed\n"); + FAILED(buf[18] != 35949148, "test38 case 19 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(buf[19] != SLJIT_W(0x3340bfc), "test42 case 20 failed\n"); - FAILED(buf[20] != SLJIT_W(0x3d4af2c543), "test42 case 21 failed\n"); - FAILED(buf[21] != SLJIT_W(-0xaf978), "test42 case 22 failed\n"); - FAILED(buf[22] != SLJIT_W(0xa64ae42b7d6), "test42 case 23 failed\n"); -#else /* !SLJIT_64BIT_ARCHITECTURE */ - FAILED(buf[19] != SLJIT_W(0xda5), "test42 case 20 failed\n"); - FAILED(buf[20] != SLJIT_W(0xb86d0), "test42 case 21 failed\n"); - FAILED(buf[21] != SLJIT_W(-0x6b6e), "test42 case 22 failed\n"); - FAILED(buf[22] != SLJIT_W(0xd357), "test42 case 23 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ + FAILED(buf[19] != WCONST(0x3340bfc, 0xda5), "test38 case 20 failed\n"); + FAILED(buf[20] != WCONST(0x3d4af2c543, 0xb86d0), "test38 case 21 failed\n"); + FAILED(buf[21] != WCONST(-0xaf978, -0x6b6e), "test38 case 22 failed\n"); + FAILED(buf[22] != WCONST(0xa64ae42b7d6, 0xd357), "test38 case 23 failed\n"); - FAILED(buf[23] != 0x0, "test42 case 24 failed\n"); - FAILED(buf[24] != (sljit_sw)0xf2906b14, "test42 case 25 failed\n"); - FAILED(buf[25] != -0x8, "test42 case 26 failed\n"); - FAILED(buf[26] != -0xa63c923, "test42 case 27 failed\n"); + FAILED(buf[23] != 0x0, "test38 case 24 failed\n"); + FAILED(buf[24] != (sljit_sw)0xf2906b14, "test38 case 25 failed\n"); + FAILED(buf[25] != -0x8, "test38 case 26 failed\n"); + FAILED(buf[26] != -0xa63c923, "test38 case 27 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test43(void) -{ - /* Test floating point compare. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump* jump; - - union { - sljit_f64 value; - struct { - sljit_u32 value1; - sljit_u32 value2; - } u; - } dbuf[4]; - - if (verbose) - printf("Run test43\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test43 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - dbuf[0].value = 12.125; - /* a NaN */ - dbuf[1].u.value1 = 0x7fffffff; - dbuf[1].u.value2 = 0x7fffffff; - dbuf[2].value = -13.5; - dbuf[3].value = 12.125; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 1, 1, 3, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); - /* dbuf[0] < dbuf[2] -> -2 */ - jump = sljit_emit_fcmp(compiler, SLJIT_F_GREATER_EQUAL, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, -2); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - /* dbuf[0] and dbuf[1] is not NaN -> 5 */ - jump = sljit_emit_fcmp(compiler, SLJIT_UNORDERED, SLJIT_MEM0(), (sljit_sw)&dbuf[1], SLJIT_FR1, 0); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11); - /* dbuf[0] == dbuf[3] -> 11 */ - jump = sljit_emit_fcmp(compiler, SLJIT_F_EQUAL, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0); - - /* else -> -17 */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -17); - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func1((sljit_sw)&dbuf) != 11, "test43 case 1 failed\n"); - dbuf[3].value = 12; - FAILED(code.func1((sljit_sw)&dbuf) != -17, "test43 case 2 failed\n"); - dbuf[1].value = 0; - FAILED(code.func1((sljit_sw)&dbuf) != 5, "test43 case 3 failed\n"); - dbuf[2].value = 20; - FAILED(code.func1((sljit_sw)&dbuf) != -2, "test43 case 4 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test44(void) +static void test39(void) { /* Test mov. */ executable_code code; @@ -4586,7 +4040,7 @@ static void test44(void) void *buf[5]; if (verbose) - printf("Run test44\n"); + printf("Run test39\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -4620,146 +4074,17 @@ static void test44(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)(buf + 2), "test44 case 1 failed\n"); - FAILED(buf[1] != buf + 2, "test44 case 2 failed\n"); - FAILED(buf[2] != buf + 3, "test44 case 3 failed\n"); - FAILED(buf[3] != buf + 4, "test44 case 4 failed\n"); - FAILED(buf[4] != buf + 2, "test44 case 5 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)(buf + 2), "test39 case 1 failed\n"); + FAILED(buf[1] != buf + 2, "test39 case 2 failed\n"); + FAILED(buf[2] != buf + 3, "test39 case 3 failed\n"); + FAILED(buf[3] != buf + 4, "test39 case 4 failed\n"); + FAILED(buf[4] != buf + 2, "test39 case 5 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test45(void) -{ - /* Test single precision floating point. */ - - executable_code code; - struct sljit_compiler* compiler; - sljit_f32 buf[12]; - sljit_sw buf2[6]; - struct sljit_jump* jump; - - if (verbose) - printf("Run test45\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test45 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - buf[0] = 5.5; - buf[1] = -7.25; - buf[2] = 0; - buf[3] = 0; - buf[4] = 0; - buf[5] = 0; - buf[6] = 0; - buf[7] = 8.75; - buf[8] = 0; - buf[9] = 16.5; - buf[10] = 0; - buf[11] = 0; - - buf2[0] = -1; - buf2[1] = -1; - buf2[2] = -1; - buf2[3] = -1; - buf2[4] = -1; - buf2[5] = -1; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 3, 2, 6, 0, 0); - - /* buf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32), SLJIT_FR0, 0); - /* buf[3] */ - sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_FR1, 0, SLJIT_FR5, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_FR1, 0); - /* buf[4] */ - sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_FR5, 0); - /* buf[5] */ - sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_FR4, 0); - - /* buf[6] */ - sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR0, 0); - /* buf[7] */ - sljit_emit_fop2(compiler, SLJIT_SUB_F32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_FR5, 0); - /* buf[8] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop2(compiler, SLJIT_MUL_F32, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f32), SLJIT_FR0, 0, SLJIT_FR0, 0); - /* buf[9] */ - sljit_emit_fop2(compiler, SLJIT_DIV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR2, 0); - /* buf[10] */ - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac); - sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), 0x3d0ac); - /* buf[11] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac + sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), -0x3d0ac); - - /* buf2[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_F_EQUAL); - /* buf2[1] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - cond_set(compiler, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_F_LESS); - /* buf2[2] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_F_EQUAL); - /* buf2[3] */ - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_F_GREATER_EQUAL); - - /* buf2[4] */ - jump = sljit_emit_fcmp(compiler, SLJIT_F_LESS_EQUAL | SLJIT_32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_IMM, 7); - sljit_set_label(jump, sljit_emit_label(compiler)); - - /* buf2[5] */ - jump = sljit_emit_fcmp(compiler, SLJIT_F_GREATER | SLJIT_32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_IMM, 6); - sljit_set_label(jump, sljit_emit_label(compiler)); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func2((sljit_sw)&buf, (sljit_sw)&buf2); - FAILED(buf[2] != -5.5, "test45 case 1 failed\n"); - FAILED(buf[3] != 7.25, "test45 case 2 failed\n"); - FAILED(buf[4] != 7.25, "test45 case 3 failed\n"); - FAILED(buf[5] != -5.5, "test45 case 4 failed\n"); - FAILED(buf[6] != -1.75, "test45 case 5 failed\n"); - FAILED(buf[7] != 16.0, "test45 case 6 failed\n"); - FAILED(buf[8] != 30.25, "test45 case 7 failed\n"); - FAILED(buf[9] != 3, "test45 case 8 failed\n"); - FAILED(buf[10] != -5.5, "test45 case 9 failed\n"); - FAILED(buf[11] != 7.25, "test45 case 10 failed\n"); - FAILED(buf2[0] != 1, "test45 case 11 failed\n"); - FAILED(buf2[1] != 2, "test45 case 12 failed\n"); - FAILED(buf2[2] != 2, "test45 case 13 failed\n"); - FAILED(buf2[3] != 1, "test45 case 14 failed\n"); - FAILED(buf2[4] != 7, "test45 case 15 failed\n"); - FAILED(buf2[5] != -1, "test45 case 16 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test46(void) +static void test40(void) { /* Test sljit_emit_op_flags with 32 bit operations. */ @@ -4770,7 +4095,7 @@ static void test46(void) sljit_s32 i; if (verbose) - printf("Run test46\n"); + printf("Run test40\n"); for (i = 0; i < 24; ++i) buf[i] = -17; @@ -4779,7 +4104,7 @@ static void test46(void) buf2[i] = -13; buf2[4] = -124; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 3, 3, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 3, 3, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -7); sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_R2, 0, SLJIT_IMM, 13); @@ -4851,43 +4176,43 @@ static void test46(void) sljit_free_compiler(compiler); code.func2((sljit_sw)&buf, (sljit_sw)&buf2); - FAILED(buf[0] != 0, "test46 case 1 failed\n"); - FAILED(buf[1] != -17, "test46 case 2 failed\n"); - FAILED(buf[2] != 1, "test46 case 3 failed\n"); - FAILED(buf[3] != -17, "test46 case 4 failed\n"); - FAILED(buf[4] != 1, "test46 case 5 failed\n"); - FAILED(buf[5] != -17, "test46 case 6 failed\n"); - FAILED(buf[6] != 1, "test46 case 7 failed\n"); - FAILED(buf[7] != -17, "test46 case 8 failed\n"); - FAILED(buf[8] != 0, "test46 case 9 failed\n"); - FAILED(buf[9] != -17, "test46 case 10 failed\n"); - FAILED(buf[10] != 1, "test46 case 11 failed\n"); - FAILED(buf[11] != -17, "test46 case 12 failed\n"); - FAILED(buf[12] != 1, "test46 case 13 failed\n"); - FAILED(buf[13] != -17, "test46 case 14 failed\n"); - FAILED(buf[14] != 1, "test46 case 15 failed\n"); - FAILED(buf[15] != -17, "test46 case 16 failed\n"); - FAILED(buf[16] != 0, "test46 case 17 failed\n"); - FAILED(buf[17] != -17, "test46 case 18 failed\n"); - FAILED(buf[18] != 0, "test46 case 19 failed\n"); - FAILED(buf[19] != -17, "test46 case 20 failed\n"); - FAILED(buf[20] != -18, "test46 case 21 failed\n"); - FAILED(buf[21] != -17, "test46 case 22 failed\n"); - FAILED(buf[22] != 38, "test46 case 23 failed\n"); - FAILED(buf[23] != -17, "test46 case 24 failed\n"); + FAILED(buf[0] != 0, "test40 case 1 failed\n"); + FAILED(buf[1] != -17, "test40 case 2 failed\n"); + FAILED(buf[2] != 1, "test40 case 3 failed\n"); + FAILED(buf[3] != -17, "test40 case 4 failed\n"); + FAILED(buf[4] != 1, "test40 case 5 failed\n"); + FAILED(buf[5] != -17, "test40 case 6 failed\n"); + FAILED(buf[6] != 1, "test40 case 7 failed\n"); + FAILED(buf[7] != -17, "test40 case 8 failed\n"); + FAILED(buf[8] != 0, "test40 case 9 failed\n"); + FAILED(buf[9] != -17, "test40 case 10 failed\n"); + FAILED(buf[10] != 1, "test40 case 11 failed\n"); + FAILED(buf[11] != -17, "test40 case 12 failed\n"); + FAILED(buf[12] != 1, "test40 case 13 failed\n"); + FAILED(buf[13] != -17, "test40 case 14 failed\n"); + FAILED(buf[14] != 1, "test40 case 15 failed\n"); + FAILED(buf[15] != -17, "test40 case 16 failed\n"); + FAILED(buf[16] != 0, "test40 case 17 failed\n"); + FAILED(buf[17] != -17, "test40 case 18 failed\n"); + FAILED(buf[18] != 0, "test40 case 19 failed\n"); + FAILED(buf[19] != -17, "test40 case 20 failed\n"); + FAILED(buf[20] != -18, "test40 case 21 failed\n"); + FAILED(buf[21] != -17, "test40 case 22 failed\n"); + FAILED(buf[22] != 38, "test40 case 23 failed\n"); + FAILED(buf[23] != -17, "test40 case 24 failed\n"); - FAILED(buf2[0] != 0, "test46 case 25 failed\n"); - FAILED(buf2[1] != 1, "test46 case 26 failed\n"); - FAILED(buf2[2] != 0, "test46 case 27 failed\n"); - FAILED(buf2[3] != 1, "test46 case 28 failed\n"); - FAILED(buf2[4] != -123, "test46 case 29 failed\n"); - FAILED(buf2[5] != -14, "test46 case 30 failed\n"); + FAILED(buf2[0] != 0, "test40 case 25 failed\n"); + FAILED(buf2[1] != 1, "test40 case 26 failed\n"); + FAILED(buf2[2] != 0, "test40 case 27 failed\n"); + FAILED(buf2[3] != 1, "test40 case 28 failed\n"); + FAILED(buf2[4] != -123, "test40 case 29 failed\n"); + FAILED(buf2[5] != -14, "test40 case 30 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test47(void) +static void test41(void) { /* Test jump optimizations. */ executable_code code; @@ -4895,7 +4220,7 @@ static void test47(void) sljit_sw buf[3]; if (verbose) - printf("Run test47\n"); + printf("Run test41\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; @@ -4910,13 +4235,13 @@ static void test47(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); /* buf[1] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xd37c10); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_set_target(sljit_emit_jump(compiler, SLJIT_LESS), SLJIT_W(0x112233445566)); #endif sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); /* buf[2] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x59b48e); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_set_target(sljit_emit_jump(compiler, SLJIT_LESS), SLJIT_W(0x1122334455667788)); #endif sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0); @@ -4926,386 +4251,16 @@ static void test47(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != 0x59b48e, "test47 case 1 failed\n"); - FAILED(buf[0] != 0x3a5c6f, "test47 case 2 failed\n"); - FAILED(buf[1] != 0xd37c10, "test47 case 3 failed\n"); - FAILED(buf[2] != 0x59b48e, "test47 case 4 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != 0x59b48e, "test41 case 1 failed\n"); + FAILED(buf[0] != 0x3a5c6f, "test41 case 2 failed\n"); + FAILED(buf[1] != 0xd37c10, "test41 case 3 failed\n"); + FAILED(buf[2] != 0x59b48e, "test41 case 4 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test48(void) -{ - /* Test floating point conversions. */ - executable_code code; - struct sljit_compiler* compiler; - int i; - sljit_f64 dbuf[10]; - sljit_f32 sbuf[10]; - sljit_sw wbuf[10]; - sljit_s32 ibuf[10]; - - if (verbose) - printf("Run test48\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test48 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - for (i = 0; i < 10; i++) { - dbuf[i] = 0.0; - sbuf[i] = 0.0; - wbuf[i] = 0; - ibuf[i] = 0; - } - - dbuf[0] = 123.5; - dbuf[1] = -367; - dbuf[2] = 917.75; - - sbuf[0] = 476.25; - sbuf[1] = -1689.75; - - wbuf[0] = 2345; - - ibuf[0] = 312; - ibuf[1] = -9324; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 3, 3, 6, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf); - - /* sbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3); - /* sbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_FR5, 0); - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 0); - /* dbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR4, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR2, 0, SLJIT_FR3, 0); - /* dbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR2, 0); - /* sbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR3, 0); - - /* wbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT); - /* wbuf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S1), 0); - /* wbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_FR5, 0); - sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR0, 0, SLJIT_FR5, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4); - /* wbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); - /* ibuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_FR4, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_R0, 0, SLJIT_FR1, 0); - /* ibuf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 3 * sizeof(sljit_s32), SLJIT_R0, 0); - - /* dbuf[5] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0); - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_FR2, 0, SLJIT_IMM, -6213); - /* dbuf[6] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR2, 0); - /* dbuf[7] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_MEM0(), (sljit_sw)&ibuf[0]); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32)); - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_FR1, 0, SLJIT_R0, 0); - /* dbuf[8] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_FR1, 0); - /* dbuf[9] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM0(), (sljit_sw)(dbuf + 9), SLJIT_IMM, -77); - /* sbuf[5] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_IMM, -123); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 7190); - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_FR3, 0, SLJIT_R0, 0); - /* sbuf[6] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_FR3, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 123); - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_R2, 0, SLJIT_IMM, 123 * sizeof(sljit_s32)); - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 2); - /* sbuf[7] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_FR1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 3812); - /* sbuf[8] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_R1, 0); - /* sbuf[9] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM0(), (sljit_sw)(sbuf + 9), SLJIT_IMM, -79); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func0(); - FAILED(dbuf[3] != 476.25, "test48 case 1 failed\n"); - FAILED(dbuf[4] != 476.25, "test48 case 2 failed\n"); - FAILED(dbuf[5] != 2345.0, "test48 case 3 failed\n"); - FAILED(dbuf[6] != -6213.0, "test48 case 4 failed\n"); - FAILED(dbuf[7] != 312.0, "test48 case 5 failed\n"); - FAILED(dbuf[8] != -9324.0, "test48 case 6 failed\n"); - FAILED(dbuf[9] != -77.0, "test48 case 7 failed\n"); - - FAILED(sbuf[2] != 123.5, "test48 case 8 failed\n"); - FAILED(sbuf[3] != 123.5, "test48 case 9 failed\n"); - FAILED(sbuf[4] != 476.25, "test48 case 10 failed\n"); - FAILED(sbuf[5] != -123, "test48 case 11 failed\n"); - FAILED(sbuf[6] != 7190, "test48 case 12 failed\n"); - FAILED(sbuf[7] != 312, "test48 case 13 failed\n"); - FAILED(sbuf[8] != 3812, "test48 case 14 failed\n"); - FAILED(sbuf[9] != -79.0, "test48 case 15 failed\n"); - - FAILED(wbuf[1] != -367, "test48 case 16 failed\n"); - FAILED(wbuf[2] != 917, "test48 case 17 failed\n"); - FAILED(wbuf[3] != 476, "test48 case 18 failed\n"); - FAILED(wbuf[4] != -476, "test48 case 19 failed\n"); - - FAILED(ibuf[2] != -917, "test48 case 20 failed\n"); - FAILED(ibuf[3] != -1689, "test48 case 21 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test49(void) -{ - /* Test floating point conversions. */ - executable_code code; - struct sljit_compiler* compiler; - int i; - sljit_f64 dbuf[10]; - sljit_f32 sbuf[9]; - sljit_sw wbuf[9]; - sljit_s32 ibuf[9]; - sljit_s32* dbuf_ptr = (sljit_s32*)dbuf; - sljit_s32* sbuf_ptr = (sljit_s32*)sbuf; - - if (verbose) - printf("Run test49\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test49 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - for (i = 0; i < 9; i++) { - dbuf_ptr[i << 1] = -1; - dbuf_ptr[(i << 1) + 1] = -1; - sbuf_ptr[i] = -1; - wbuf[i] = -1; - ibuf[i] = -1; - } - -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - dbuf[9] = (sljit_f64)SLJIT_W(0x1122334455); -#endif - dbuf[0] = 673.75; - sbuf[0] = -879.75; - wbuf[0] = 345; - ibuf[0] = -249; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 3, 3, 3, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf); - - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S1), 0); - /* sbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0); - /* wbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0); - /* wbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S1), 0); - /* ibuf[2] */ - sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 0); - /* ibuf[4] */ - sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_MEM1(SLJIT_R2), 4 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S1), 0); - /* dbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0); - /* sbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S2), 0); - /* dbuf[6] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_R2), 0); - /* sbuf[6] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R2), 0); - -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64)); - /* wbuf[8] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 8 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_R0, 0, SLJIT_FR2, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0); - sljit_emit_op2(compiler, SLJIT_AND32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffff); - /* ibuf[8] */ - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), 8 * sizeof(sljit_s32), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x4455667788)); - /* dbuf[8] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_R0, 0); - /* dbuf[9] */ - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64), SLJIT_IMM, SLJIT_W(0x7766554433)); -#endif /* SLJIT_64BIT_ARCHITECTURE */ - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func0(); - - FAILED(dbuf_ptr[(1 * 2) + 0] != -1, "test49 case 1 failed\n"); - FAILED(dbuf_ptr[(1 * 2) + 1] != -1, "test49 case 2 failed\n"); - FAILED(dbuf[2] != -879.75, "test49 case 3 failed\n"); - FAILED(dbuf_ptr[(3 * 2) + 0] != -1, "test49 case 4 failed\n"); - FAILED(dbuf_ptr[(3 * 2) + 1] != -1, "test49 case 5 failed\n"); - FAILED(dbuf[4] != 345, "test49 case 6 failed\n"); - FAILED(dbuf_ptr[(5 * 2) + 0] != -1, "test49 case 7 failed\n"); - FAILED(dbuf_ptr[(5 * 2) + 1] != -1, "test49 case 8 failed\n"); - FAILED(dbuf[6] != -249, "test49 case 9 failed\n"); - FAILED(dbuf_ptr[(7 * 2) + 0] != -1, "test49 case 10 failed\n"); - FAILED(dbuf_ptr[(7 * 2) + 1] != -1, "test49 case 11 failed\n"); - - FAILED(sbuf_ptr[1] != -1, "test49 case 12 failed\n"); - FAILED(sbuf[2] != 673.75, "test49 case 13 failed\n"); - FAILED(sbuf_ptr[3] != -1, "test49 case 14 failed\n"); - FAILED(sbuf[4] != 345, "test49 case 15 failed\n"); - FAILED(sbuf_ptr[5] != -1, "test49 case 16 failed\n"); - FAILED(sbuf[6] != -249, "test49 case 17 failed\n"); - FAILED(sbuf_ptr[7] != -1, "test49 case 18 failed\n"); - - FAILED(wbuf[1] != -1, "test49 case 19 failed\n"); - FAILED(wbuf[2] != 673, "test49 case 20 failed\n"); - FAILED(wbuf[3] != -1, "test49 case 21 failed\n"); - FAILED(wbuf[4] != -879, "test49 case 22 failed\n"); - FAILED(wbuf[5] != -1, "test49 case 23 failed\n"); - - FAILED(ibuf[1] != -1, "test49 case 24 failed\n"); - FAILED(ibuf[2] != 673, "test49 case 25 failed\n"); - FAILED(ibuf[3] != -1, "test49 case 26 failed\n"); - FAILED(ibuf[4] != -879, "test49 case 27 failed\n"); - FAILED(ibuf[5] != -1, "test49 case 28 failed\n"); - -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(dbuf[8] != (sljit_f64)SLJIT_W(0x4455667788), "test49 case 29 failed\n"); - FAILED(dbuf[9] != (sljit_f64)SLJIT_W(0x66554433), "test49 case 30 failed\n"); - FAILED(wbuf[8] != SLJIT_W(0x1122334455), "test48 case 31 failed\n"); - FAILED(ibuf[8] == 0x4455, "test48 case 32 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test50(void) -{ - /* Test stack and floating point operations. */ - executable_code code; - struct sljit_compiler* compiler; -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - sljit_uw size1, size2, size3; - int result; -#endif - sljit_f32 sbuf[7]; - - if (verbose) - printf("Run test50\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test50 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sbuf[0] = 245.5; - sbuf[1] = -100.25; - sbuf[2] = 713.75; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 3, 6, 0, 8 * sizeof(sljit_f32)); - - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0); - /* sbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32)); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); - sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32)); - /* sbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32)); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_IMM, 5934); - sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32)); - /* sbuf[5] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32)); - -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - size1 = compiler->size; -#endif - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32)); -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - size2 = compiler->size; -#endif - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_FR2, 0); -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - size3 = compiler->size; -#endif - /* sbuf[6] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR5, 0); -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - result = (compiler->size - size3) == (size3 - size2) && (size3 - size2) == (size2 - size1); -#endif - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&sbuf); - - FAILED(sbuf[3] != 245.5, "test50 case 1 failed\n"); - FAILED(sbuf[4] != 145.25, "test50 case 2 failed\n"); - FAILED(sbuf[5] != 5934, "test50 case 3 failed\n"); - FAILED(sbuf[6] != 713.75, "test50 case 4 failed\n"); -#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) - FAILED(!result, "test50 case 5 failed\n"); -#endif - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test51(void) +static void test42(void) { /* Test all registers provided by the CPU. */ executable_code code; @@ -5315,13 +4270,13 @@ static void test51(void) sljit_s32 i; if (verbose) - printf("Run test51\n"); + printf("Run test42\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 39; - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 32); @@ -5330,7 +4285,7 @@ static void test51(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) { - if (sljit_get_register_index(SLJIT_R(i)) >= 0) { + if (sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) >= 0) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_R0, 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R(i)), 0); } else @@ -5339,7 +4294,7 @@ static void test51(void) sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 32); for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) { - if (sljit_get_register_index(SLJIT_R(i)) >= 0) { + if (sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) >= 0) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_R0, 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R(i)), 32); } else @@ -5347,7 +4302,7 @@ static void test51(void) } for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) { - if (sljit_get_register_index(SLJIT_R(i)) >= 0) { + if (sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) >= 0) { sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 32); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R(i), SLJIT_R0), 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_R(i)), 0); @@ -5367,7 +4322,7 @@ static void test51(void) code.func0(); - FAILED(buf[1] != (39 * 5 * (SLJIT_NUMBER_OF_REGISTERS - 2)), "test51 case 1 failed\n"); + FAILED(buf[1] != (39 * 5 * (SLJIT_NUMBER_OF_REGISTERS - 2)), "test42 case 1 failed\n"); sljit_free_code(code.code, NULL); @@ -5391,7 +4346,7 @@ static void test51(void) sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 35); sljit_emit_return_void(compiler); @@ -5400,7 +4355,7 @@ static void test51(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func0() != (SLJIT_NUMBER_OF_SAVED_REGISTERS * 17), "test51 case 2 failed\n"); + FAILED(code.func0() != (SLJIT_NUMBER_OF_SAVED_REGISTERS * 17), "test42 case 2 failed\n"); sljit_free_code(code.code, NULL); @@ -5426,7 +4381,7 @@ static void test51(void) sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0); for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 43); sljit_emit_return_void(compiler); @@ -5435,106 +4390,13 @@ static void test51(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code.func0() != (SLJIT_NUMBER_OF_SAVED_REGISTERS * 68), "test51 case 3 failed\n"); + FAILED(code.func0() != (SLJIT_NUMBER_OF_SAVED_REGISTERS * 68), "test42 case 3 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test52(void) -{ - /* Test all registers provided by the CPU. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump* jump; - sljit_f64 buf[3]; - sljit_s32 i; - - if (verbose) - printf("Run test52\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test52 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - buf[0] = 6.25; - buf[1] = 17.75; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0); - - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0); - - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(VOID)); - /* SLJIT_FR0 contains the first value. */ - for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 1, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]); - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_R0), 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * 17.75 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * 6.25), "test52 case 1 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - buf[0] = -32.5; - buf[1] = -11.25; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0); - - for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0); - for (i = 0; i < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FS(i), 0, SLJIT_MEM1(SLJIT_S0), 0); - - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(VOID)); - /* SLJIT_FR0 contains the first value. */ - for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 1, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]); - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_R0), 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * -11.25 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * -32.5), "test52 case 2 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test53(void) +static void test43(void) { /* Test addressing modes. */ executable_code code; @@ -5553,7 +4415,7 @@ static void test53(void) buf[i] = 0; if (verbose) - printf("Run test53\n"); + printf("Run test43\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -5561,7 +4423,7 @@ static void test53(void) addr /= 3; for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++, addr++) { - if (sljit_get_register_index(SLJIT_R(i)) == -1) + if (sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) == -1) continue; /* buf_start[i * 3] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, (sljit_sw)addr); @@ -5585,14 +4447,14 @@ static void test53(void) code.func0(); for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) { - if (sljit_get_register_index(SLJIT_R(i)) == -1) + if (sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R(i)) == -1) continue; - FAILED(buf_start[i * 3] != 88 + i, "test78 case 1 failed\n"); + FAILED(buf_start[i * 3] != 88 + i, "test43 case 1 failed\n"); if (i != 0) { - FAILED(buf_start[i * 3 + 1] != 147 + i, "test78 case 2 failed\n"); + FAILED(buf_start[i * 3 + 1] != 147 + i, "test43 case 2 failed\n"); } - FAILED(buf_start[i * 3 + 2] != 191 + i, "test78 case 3 failed\n"); + FAILED(buf_start[i * 3 + 2] != 191 + i, "test43 case 3 failed\n"); } sljit_free_code(code.code, NULL); @@ -5600,19 +4462,14 @@ static void test53(void) successful_tests++; } -static void test54(void) +static void test44(void) { - /* Check cmov. */ + /* Test select operation. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw large_num = SLJIT_W(0x1234567812345678); -#else - sljit_sw large_num = SLJIT_W(0x12345678); -#endif int i; - sljit_sw buf[19]; - sljit_s32 ibuf[4]; + sljit_sw buf[25]; + sljit_s32 ibuf[6]; union { sljit_f32 value; @@ -5624,80 +4481,123 @@ static void test54(void) sbuf[2].value = -14.75; if (verbose) - printf("Run test54\n"); + printf("Run test44\n"); FAILED(!compiler, "cannot create compiler\n"); - for (i = 0; i < 19; i++) + for (i = 0; i < 25; i++) buf[i] = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < 6; i++) ibuf[i] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 5, 3, 3, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 5, 3, 3, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 17); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 34); sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_LESS, SLJIT_R0, 0, SLJIT_IMM, -10); - sljit_emit_cmov(compiler, SLJIT_SIG_LESS, SLJIT_R0, SLJIT_R1, 0); + sljit_emit_select(compiler, SLJIT_SIG_LESS, SLJIT_R0, SLJIT_R1, 0, SLJIT_R0); /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, -10); - sljit_emit_cmov(compiler, SLJIT_SIG_GREATER, SLJIT_R0, SLJIT_R1, 0); + sljit_emit_select(compiler, SLJIT_SIG_GREATER, SLJIT_R0, SLJIT_R1, 0, SLJIT_R0); /* buf[1] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 24); - sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_R0, 0, SLJIT_IMM, 24); - sljit_emit_cmov(compiler, SLJIT_NOT_EQUAL, SLJIT_R0, SLJIT_IMM, 66); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -67); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 81); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, -10); + sljit_emit_select(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_R0, SLJIT_R0, 0, SLJIT_R1); /* buf[2] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_IMM, 78); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, -66); + sljit_emit_select(compiler, SLJIT_SIG_GREATER, SLJIT_R0, SLJIT_R0, 0, SLJIT_R1); /* buf[3] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_IMM, large_num); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 24); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_R0, 0, SLJIT_IMM, 23); + sljit_emit_select(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_IMM, 66, SLJIT_R0); /* buf[4] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_IMM, 78); + sljit_emit_select(compiler, SLJIT_NOT_EQUAL, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_select(compiler, SLJIT_NOT_EQUAL, SLJIT_R0, SLJIT_IMM, WCONST(0x1234567812345678, 0x12345678), SLJIT_R0); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R0, 0); #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - SLJIT_ASSERT(sljit_get_register_index(SLJIT_R3) == -1 && sljit_get_register_index(SLJIT_R4) == -1); + SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R3) == -1 && sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_R4) == -1); #endif sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 7); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -45); sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_cmov(compiler, SLJIT_OVERFLOW, SLJIT_R3, SLJIT_IMM, 35); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R3, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, large_num); - sljit_emit_op2u(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R0, 0, SLJIT_IMM, large_num); - sljit_emit_cmov(compiler, SLJIT_OVERFLOW, SLJIT_R3, SLJIT_IMM, 35); - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 71); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 13); - sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R3, SLJIT_R0, 0); + sljit_emit_select(compiler, SLJIT_OVERFLOW, SLJIT_R3, SLJIT_IMM, 35, SLJIT_R3); /* buf[7] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 12); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -29); - sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_cmov(compiler, SLJIT_NOT_OVERFLOW, SLJIT_R0, SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, WCONST(0x1010000000, 0x100000)); + sljit_emit_op2u(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R0, 0, SLJIT_IMM, WCONST(0x1010000000, 0x100000)); + sljit_emit_select(compiler, SLJIT_OVERFLOW, SLJIT_R3, SLJIT_IMM, 35, SLJIT_R3); /* buf[8] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R3, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -12); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 21); - sljit_emit_op2u(compiler, SLJIT_AND | SLJIT_SET_Z, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_cmov(compiler, SLJIT_NOT_EQUAL, SLJIT_R3, SLJIT_R4, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 71); + sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 8); + sljit_emit_select(compiler, SLJIT_NOT_ZERO, SLJIT_R3, SLJIT_IMM, 13, SLJIT_R0); /* buf[9] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R3, 0); - sljit_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R3, SLJIT_R4, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 12); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -29); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_OVERFLOW, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 8); + sljit_emit_select(compiler, SLJIT_OVERFLOW, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R3); /* buf[10] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_IMM, -12); + sljit_emit_op2u(compiler, SLJIT_AND | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_IMM, 8); + sljit_emit_select(compiler, SLJIT_NOT_EQUAL, SLJIT_R0, SLJIT_MEM1(SLJIT_R0), 11 * sizeof(sljit_sw), SLJIT_R1); + /* buf[11] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 99); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_IMM, -21); + sljit_emit_select(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_MEM1(SLJIT_R0), 12 * sizeof(sljit_sw), SLJIT_R1); + /* buf[12] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, 43); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 90); + sljit_emit_op2u(compiler, SLJIT_XOR | SLJIT_SET_Z, SLJIT_R0, 0, SLJIT_IMM, 2); + sljit_emit_select(compiler, SLJIT_ZERO, SLJIT_R1, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R1); + /* buf[13] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_IMM, -62); + sljit_emit_select(compiler, SLJIT_NOT_ZERO, SLJIT_R2, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_R1); + /* buf[14] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 15); + sljit_emit_op2u(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 15 * sizeof(sljit_sw), SLJIT_IMM, 38); + sljit_emit_select(compiler, SLJIT_CARRY, SLJIT_R0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_R0); + /* buf[15] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 15 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, WCONST(0x8800000000, 0x8800000) + 16 * sizeof(sljit_sw)); + sljit_emit_op2u(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_IMM, 77); + sljit_emit_select(compiler, SLJIT_CARRY, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), WCONST(-0x8800000000, -0x8800000), SLJIT_R0); + /* buf[16] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_R0, 0); + if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), 0); sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); @@ -5705,68 +4605,88 @@ static void test54(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16); sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_cmov(compiler, SLJIT_F_EQUAL, SLJIT_R0, SLJIT_IMM, -45); - /* buf[11] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_cmov(compiler, SLJIT_F_GREATER, SLJIT_R0, SLJIT_IMM, -45); - /* buf[12] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_cmov(compiler, SLJIT_F_GREATER_EQUAL, SLJIT_R0, SLJIT_IMM, 33); - /* buf[13] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_cmov(compiler, SLJIT_F_LESS, SLJIT_R0, SLJIT_IMM, -70); - /* buf[14] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS_EQUAL, SLJIT_FR2, 0, SLJIT_FR1, 0); - sljit_emit_cmov(compiler, SLJIT_F_LESS_EQUAL, SLJIT_R0, SLJIT_IMM, -60); - /* buf[15] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 15 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); - sljit_emit_cmov(compiler, SLJIT_F_NOT_EQUAL, SLJIT_R0, SLJIT_IMM, 31); - /* buf[16] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 53); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_ORDERED, SLJIT_FR1, 0, SLJIT_FR0, 0); - sljit_emit_cmov(compiler, SLJIT_ORDERED, SLJIT_R0, SLJIT_IMM, 17); + sljit_emit_select(compiler, SLJIT_F_EQUAL, SLJIT_R0, SLJIT_IMM, -45, SLJIT_R0); /* buf[17] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 17 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_UNORDERED, SLJIT_FR1, 0, SLJIT_FR0, 0); - sljit_emit_cmov(compiler, SLJIT_UNORDERED, SLJIT_R0, SLJIT_IMM, 59); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_select(compiler, SLJIT_F_GREATER, SLJIT_R0, SLJIT_IMM, -45, SLJIT_R0); /* buf[18] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 18 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_select(compiler, SLJIT_F_GREATER_EQUAL, SLJIT_R0, SLJIT_IMM, 33, SLJIT_R0); + /* buf[19] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 19 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -70); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 8); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_select(compiler, SLJIT_F_LESS, SLJIT_R0, SLJIT_R0, 0, SLJIT_R1); + /* buf[20] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS_EQUAL, SLJIT_FR2, 0, SLJIT_FR1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -60); + sljit_emit_select(compiler, SLJIT_F_GREATER, SLJIT_R0, SLJIT_IMM, 8, SLJIT_R0); + /* buf[21] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 21 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_select(compiler, SLJIT_F_NOT_EQUAL, SLJIT_R0, SLJIT_IMM, 31, SLJIT_R0); + /* buf[22] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 22 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_IMM, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 53); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_ORDERED, SLJIT_FR1, 0, SLJIT_FR0, 0); + sljit_emit_select(compiler, SLJIT_ORDERED, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_R1); + /* buf[23] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 24 * sizeof(sljit_sw), SLJIT_IMM, 59); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_UNORDERED, SLJIT_FR0, 0, SLJIT_FR1, 0); + sljit_emit_select(compiler, SLJIT_UNORDERED, SLJIT_R0, SLJIT_MEM1(SLJIT_R0), 24 * sizeof(sljit_sw), SLJIT_R1); + /* buf[24] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 24 * sizeof(sljit_sw), SLJIT_R0, 0); } sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 177); sljit_emit_op2u(compiler, SLJIT_SUB32 | SLJIT_SET_LESS, SLJIT_R0, 0, SLJIT_IMM, 178); - sljit_emit_cmov(compiler, SLJIT_LESS | SLJIT_32, SLJIT_R0, SLJIT_IMM, 200); + sljit_emit_select(compiler, SLJIT_LESS | SLJIT_32, SLJIT_R0, SLJIT_IMM, 200, SLJIT_R0); /* ibuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 95); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_IMM, 177); - sljit_emit_op2u(compiler, SLJIT_SUB32 | SLJIT_SET_LESS_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 95); - sljit_emit_cmov(compiler, SLJIT_LESS_EQUAL | SLJIT_32, SLJIT_R3, SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_s32) >> 1); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_IMM, 177); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 95); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_s32)); + sljit_emit_select(compiler, SLJIT_LESS_EQUAL | SLJIT_32, SLJIT_R0, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), 1, SLJIT_R1); /* ibuf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_IMM, 56); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R4, 0, SLJIT_IMM, -63); sljit_emit_op2u(compiler, SLJIT_SUB32 | SLJIT_SET_SIG_LESS, SLJIT_R3, 0, SLJIT_R4, 0); - sljit_emit_cmov(compiler, SLJIT_SIG_LESS | SLJIT_32, SLJIT_R3, SLJIT_R4, 0); + sljit_emit_select(compiler, SLJIT_SIG_LESS | SLJIT_32, SLJIT_R3, SLJIT_R4, 0, SLJIT_R3); /* ibuf[2] */ sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_s32), SLJIT_R3, 0); - sljit_emit_op2u(compiler, SLJIT_SUB32 | SLJIT_SET_SIG_GREATER, SLJIT_R3, 0, SLJIT_R4, 0); - sljit_emit_cmov(compiler, SLJIT_SIG_GREATER | SLJIT_32, SLJIT_R3, SLJIT_R4, 0); + sljit_emit_op2u(compiler, SLJIT_SUB32 | SLJIT_SET_SIG_LESS, SLJIT_R3, 0, SLJIT_R4, 0); + sljit_emit_select(compiler, SLJIT_SIG_GREATER_EQUAL | SLJIT_32, SLJIT_R3, SLJIT_R4, 0, SLJIT_R3); /* ibuf[3] */ sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32), SLJIT_IMM, 467); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 10); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 20); + sljit_emit_select(compiler, SLJIT_SIG_LESS | SLJIT_32, SLJIT_R2, SLJIT_MEM0(), (sljit_sw)(ibuf + 4), SLJIT_R2); + /* ibuf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5 * sizeof(sljit_s32)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_s32), SLJIT_IMM, -29); + sljit_emit_op2u(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_select(compiler, SLJIT_CARRY | SLJIT_32, SLJIT_R2, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), 0, SLJIT_R2); + /* ibuf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_s32), SLJIT_R2, 0); + sljit_emit_return_void(compiler); code.code = sljit_generate_code(compiler); @@ -5775,39 +4695,47 @@ static void test54(void) code.func3((sljit_sw)&buf, (sljit_sw)&ibuf, (sljit_sw)&sbuf); - FAILED(buf[0] != 17, "test54 case 1 failed\n"); - FAILED(buf[1] != 34, "test54 case 2 failed\n"); - FAILED(buf[2] != 24, "test54 case 3 failed\n"); - FAILED(buf[3] != 78, "test54 case 4 failed\n"); - FAILED(buf[4] != large_num, "test54 case 5 failed\n"); - FAILED(buf[5] != -45, "test54 case 6 failed\n"); - FAILED(buf[6] != 35, "test54 case 7 failed\n"); - FAILED(buf[7] != 71, "test54 case 8 failed\n"); - FAILED(buf[8] != -29, "test54 case 9 failed\n"); - FAILED(buf[9] != -12, "test54 case 10 failed\n"); - FAILED(buf[10] != 21, "test54 case 11 failed\n"); + FAILED(buf[0] != 17, "test44 case 1 failed\n"); + FAILED(buf[1] != 34, "test44 case 2 failed\n"); + FAILED(buf[2] != -67, "test44 case 3 failed\n"); + FAILED(buf[3] != 81, "test44 case 4 failed\n"); + FAILED(buf[4] != 24, "test44 case 5 failed\n"); + FAILED(buf[5] != 78, "test44 case 6 failed\n"); + FAILED(buf[6] != WCONST(0x1234567812345678, 0x12345678), "test44 case 7 failed\n"); + FAILED(buf[7] != -45, "test44 case 8 failed\n"); + FAILED(buf[8] != 35, "test44 case 9 failed\n"); + FAILED(buf[9] != 71, "test44 case 10 failed\n"); + FAILED(buf[10] != -29, "test44 case 11 failed\n"); + FAILED(buf[11] != 16, "test44 case 12 failed\n"); + FAILED(buf[12] != -21, "test44 case 13 failed\n"); + FAILED(buf[13] != 90, "test44 case 14 failed\n"); + FAILED(buf[14] != -62, "test44 case 15 failed\n"); + FAILED(buf[15] != 38, "test44 case 16 failed\n"); + FAILED(buf[16] != 77, "test44 case 17 failed\n"); if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - FAILED(buf[11] != 16, "test54 case 12 failed\n"); - FAILED(buf[12] != -45, "test54 case 13 failed\n"); - FAILED(buf[13] != 33, "test54 case 14 failed\n"); - FAILED(buf[14] != 8, "test54 case 15 failed\n"); - FAILED(buf[15] != -60, "test54 case 16 failed\n"); - FAILED(buf[16] != 31, "test54 case 17 failed\n"); - FAILED(buf[17] != 53, "test54 case 18 failed\n"); - FAILED(buf[18] != 59, "test54 case 19 failed\n"); + FAILED(buf[17] != 16, "test44 case 18 failed\n"); + FAILED(buf[18] != -45, "test44 case 19 failed\n"); + FAILED(buf[19] != 33, "test44 case 20 failed\n"); + FAILED(buf[20] != 8, "test44 case 21 failed\n"); + FAILED(buf[21] != -60, "test44 case 22 failed\n"); + FAILED(buf[22] != 31, "test44 case 23 failed\n"); + FAILED(buf[23] != 53, "test44 case 24 failed\n"); + FAILED(buf[24] != 59, "test44 case 25 failed\n"); } - FAILED(ibuf[0] != 200, "test54 case 12 failed\n"); - FAILED(ibuf[1] != 95, "test54 case 13 failed\n"); - FAILED(ibuf[2] != 56, "test54 case 14 failed\n"); - FAILED(ibuf[3] != -63, "test54 case 15 failed\n"); + FAILED(ibuf[0] != 200, "test44 case 26 failed\n"); + FAILED(ibuf[1] != 177, "test44 case 27 failed\n"); + FAILED(ibuf[2] != 56, "test44 case 28 failed\n"); + FAILED(ibuf[3] != -63, "test44 case 29 failed\n"); + FAILED(ibuf[4] != 467, "test44 case 30 failed\n"); + FAILED(ibuf[5] != -29, "test44 case 31 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test55(void) +static void test45(void) { /* Check value preservation. */ executable_code code; @@ -5816,13 +4744,13 @@ static void test55(void) sljit_s32 i; if (verbose) - printf("Run test55\n"); + printf("Run test45\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; buf[1] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, sizeof (sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, sizeof (sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, 217); @@ -5862,14 +4790,14 @@ static void test55(void) code.func0(); - FAILED(buf[0] != (SLJIT_NUMBER_OF_REGISTERS - 2) * 118 + 217, "test55 case 1 failed\n"); - FAILED(buf[1] != (SLJIT_NUMBER_OF_REGISTERS - 1) * 146 + 217, "test55 case 2 failed\n"); + FAILED(buf[0] != (SLJIT_NUMBER_OF_REGISTERS - 2) * 118 + 217, "test45 case 1 failed\n"); + FAILED(buf[1] != (SLJIT_NUMBER_OF_REGISTERS - 1) * 146 + 217, "test45 case 2 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test56(void) +static void test46(void) { /* Check integer subtraction with negative immediate. */ executable_code code; @@ -5878,14 +4806,14 @@ static void test56(void) sljit_s32 i; if (verbose) - printf("Run test56\n"); + printf("Run test46\n"); for (i = 0; i < 13; i++) buf[i] = 77; FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 90 << 12); sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_SIG_GREATER, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, -(91 << 12)); @@ -5940,25 +4868,25 @@ static void test56(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != (181 << 12), "test56 case 1 failed\n"); - FAILED(buf[1] != 1, "test56 case 2 failed\n"); - FAILED(buf[2] != (181 << 12), "test56 case 3 failed\n"); - FAILED(buf[3] != 1, "test56 case 4 failed\n"); - FAILED(buf[4] != 1, "test56 case 5 failed\n"); - FAILED(buf[5] != 1, "test56 case 6 failed\n"); - FAILED(buf[6] != 0, "test56 case 7 failed\n"); - FAILED(buf[7] != 0, "test56 case 8 failed\n"); - FAILED(buf[8] != 181, "test56 case 9 failed\n"); - FAILED(buf[9] != 1, "test56 case 10 failed\n"); - FAILED(buf[10] != 1, "test56 case 11 failed\n"); - FAILED(buf[11] != 1, "test56 case 12 failed\n"); - FAILED(buf[12] != 1, "test56 case 13 failed\n"); + FAILED(buf[0] != (181 << 12), "test46 case 1 failed\n"); + FAILED(buf[1] != 1, "test46 case 2 failed\n"); + FAILED(buf[2] != (181 << 12), "test46 case 3 failed\n"); + FAILED(buf[3] != 1, "test46 case 4 failed\n"); + FAILED(buf[4] != 1, "test46 case 5 failed\n"); + FAILED(buf[5] != 1, "test46 case 6 failed\n"); + FAILED(buf[6] != 0, "test46 case 7 failed\n"); + FAILED(buf[7] != 0, "test46 case 8 failed\n"); + FAILED(buf[8] != 181, "test46 case 9 failed\n"); + FAILED(buf[9] != 1, "test46 case 10 failed\n"); + FAILED(buf[10] != 1, "test46 case 11 failed\n"); + FAILED(buf[11] != 1, "test46 case 12 failed\n"); + FAILED(buf[12] != 1, "test46 case 13 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test57(void) +static void test47(void) { /* Check prefetch instructions. */ executable_code code; @@ -5968,11 +4896,11 @@ static void test57(void) int i; if (verbose) - printf("Run test57\n"); + printf("Run test47\n"); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 3, 1, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0); labels[0] = sljit_emit_label(compiler); @@ -5981,7 +4909,7 @@ static void test57(void) labels[1] = sljit_emit_label(compiler); sljit_emit_op_src(compiler, SLJIT_PREFETCH_L2, SLJIT_MEM0(), 0); labels[2] = sljit_emit_label(compiler); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#if IS_64BIT sljit_emit_op_src(compiler, SLJIT_PREFETCH_L3, SLJIT_MEM1(SLJIT_R0), SLJIT_W(0x1122334455667788)); #else sljit_emit_op_src(compiler, SLJIT_PREFETCH_L3, SLJIT_MEM1(SLJIT_R0), 0x11223344); @@ -6003,306 +4931,22 @@ static void test57(void) code.func0(); if (sljit_has_cpu_feature(SLJIT_HAS_PREFETCH)) { - FAILED(addr[0] == addr[1], "test57 case 1 failed\n"); - FAILED(addr[1] == addr[2], "test57 case 2 failed\n"); - FAILED(addr[2] == addr[3], "test57 case 3 failed\n"); - FAILED(addr[3] == addr[4], "test57 case 4 failed\n"); - } - else { - FAILED(addr[0] != addr[1], "test57 case 1 failed\n"); - FAILED(addr[1] != addr[2], "test57 case 2 failed\n"); - FAILED(addr[2] != addr[3], "test57 case 3 failed\n"); - FAILED(addr[3] != addr[4], "test57 case 4 failed\n"); + FAILED(addr[0] == addr[1], "test47 case 1 failed\n"); + FAILED(addr[1] == addr[2], "test47 case 2 failed\n"); + FAILED(addr[2] == addr[3], "test47 case 3 failed\n"); + FAILED(addr[3] == addr[4], "test47 case 4 failed\n"); + } else { + FAILED(addr[0] != addr[1], "test47 case 1 failed\n"); + FAILED(addr[1] != addr[2], "test47 case 2 failed\n"); + FAILED(addr[2] != addr[3], "test47 case 3 failed\n"); + FAILED(addr[3] != addr[4], "test47 case 4 failed\n"); } sljit_free_code(code.code, NULL); successful_tests++; } -static sljit_f64 test58_f1(sljit_f32 a, sljit_f32 b, sljit_f64 c) -{ - return (sljit_f64)a + (sljit_f64)b + c; -} - -static sljit_f32 test58_f2(sljit_sw a, sljit_f64 b, sljit_f32 c) -{ - return (sljit_f32)((sljit_f64)a + b + (sljit_f64)c); -} - -static sljit_f64 test58_f3(sljit_sw a, sljit_f32 b, sljit_sw c) -{ - return (sljit_f64)a + (sljit_f64)b + (sljit_f64)c; -} - -static sljit_f64 test58_f4(sljit_f32 a, sljit_sw b) -{ - return (sljit_f64)a + (sljit_f64)b; -} - -static sljit_f32 test58_f5(sljit_f32 a, sljit_f64 b, sljit_s32 c) -{ - return (sljit_f32)((sljit_f64)a + b + (sljit_f64)c); -} - -static sljit_sw test58_f6(sljit_f64 a, sljit_sw b) -{ - return (sljit_sw)(a + (sljit_f64)b); -} - -static void test58(void) -{ - /* Check function calls with floating point arguments. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump* jump = NULL; - sljit_f64 dbuf[7]; - sljit_f32 sbuf[7]; - sljit_sw wbuf[2]; - - if (verbose) - printf("Run test58\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test58 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - dbuf[0] = 5.25; - dbuf[1] = 0.0; - dbuf[2] = 2.5; - dbuf[3] = 0.0; - dbuf[4] = 0.0; - dbuf[5] = 0.0; - dbuf[6] = -18.0; - - sbuf[0] = 6.75; - sbuf[1] = -3.5; - sbuf[2] = 1.5; - sbuf[3] = 0.0; - sbuf[4] = 0.0; - - wbuf[0] = 0; - wbuf[1] = 0; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 3, 3, 4, 0, sizeof(sljit_sw)); - - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, F32, F32, F64), SLJIT_IMM, SLJIT_FUNC_ADDR(test58_f1)); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, F32, F32, F64)); - sljit_set_target(jump, SLJIT_FUNC_UADDR(test58_f1)); - /* dbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test58_f2)); - sljit_get_local_base(compiler, SLJIT_R1, 0, -16); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F32, W, F64, F32), SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); - /* sbuf[3] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f32), SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -4); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 9); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, W, F32, W)); - sljit_set_target(jump, SLJIT_FUNC_UADDR(test58_f3)); - /* dbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -6); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(F64, F32, W)); - sljit_set_target(jump, SLJIT_FUNC_UADDR(test58_f4)); - /* dbuf[5] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test58_f5)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F32, F32, F64, 32), SLJIT_MEM1(SLJIT_SP), 0); - /* sbuf[4] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test58_f6)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, F64, W), SLJIT_R0, 0); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_R0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 319); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test58_f6)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, F64, W), SLJIT_R1, 0); - /* wbuf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func3((sljit_sw)&dbuf, (sljit_sw)&sbuf, (sljit_sw)&wbuf); - - FAILED(dbuf[1] != 8.5, "test58 case 1 failed\n"); - FAILED(dbuf[3] != 0.5, "test58 case 2 failed\n"); - FAILED(sbuf[3] != 17.75, "test58 case 3 failed\n"); - FAILED(dbuf[4] != 11.75, "test58 case 4 failed\n"); - FAILED(dbuf[5] != -9.5, "test58 case 5 failed\n"); - FAILED(sbuf[4] != 12, "test58 case 6 failed\n"); - FAILED(wbuf[0] != SLJIT_FUNC_ADDR(test58_f6) - 18, "test58 case 7 failed\n"); - FAILED(wbuf[1] != 301, "test58 case 8 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static sljit_sw test59_f1(sljit_sw a, sljit_s32 b, sljit_sw c, sljit_sw d) -{ - return (sljit_sw)(a + b + c + d - SLJIT_FUNC_ADDR(test59_f1)); -} - -static sljit_s32 test59_f2(sljit_f64 a, sljit_f32 b, sljit_f64 c, sljit_sw d) -{ - return (sljit_s32)(a + b + c + (sljit_f64)d); -} - -static sljit_f32 test59_f3(sljit_f32 a, sljit_s32 b, sljit_f64 c, sljit_sw d) -{ - return (sljit_f32)(a + (sljit_f64)b + c + (sljit_f64)d); -} - -static sljit_f32 test59_f4(sljit_f32 a, sljit_f64 b, sljit_f32 c, sljit_f64 d) -{ - return (sljit_f32)(a + b + c + (sljit_f64)d); -} - -static void test59(void) -{ - /* Check function calls with four arguments. */ - executable_code code; - struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - struct sljit_jump* jump = NULL; - sljit_sw wbuf[5]; - sljit_f64 dbuf[3]; - sljit_f32 sbuf[4]; - - if (verbose) - printf("Run test59\n"); - - wbuf[0] = 0; - wbuf[1] = 0; - wbuf[2] = SLJIT_FUNC_ADDR(test59_f1); - wbuf[3] = 0; - wbuf[4] = 0; - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - dbuf[0] = 5.125; - dbuf[1] = 6.125; - dbuf[2] = 4.25; - - sbuf[0] = 0.75; - sbuf[1] = -1.5; - sbuf[2] = 0.0; - sbuf[3] = 0.0; - } - - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 33); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, -20); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test59_f1)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -40); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_R2, 0); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test59_f1)); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, -25); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 100); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -10); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_R0, 0); - /* wbuf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 231); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test59_f1) - 100); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_MEM2(SLJIT_R0, SLJIT_R2), SLJIT_WORD_SHIFT); - /* wbuf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -100); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(32, F64, F32, F64, W), SLJIT_IMM, SLJIT_FUNC_ADDR(test59_f2)); - sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0); - /* wbuf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 36); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 41); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS4(F32, F32, 32, F64, W)); - sljit_set_target(jump, SLJIT_FUNC_UADDR(test59_f3)); - /* sbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32), SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test59_f4)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(F32, F32, F64, F32, F64), SLJIT_R0, 0); - /* sbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_f32), SLJIT_FR0, 0); - } - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func3((sljit_sw)&wbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); - - FAILED(wbuf[0] != -27, "test59 case 1 failed\n"); - FAILED(wbuf[1] != 65, "test59 case 2 failed\n"); - FAILED(wbuf[3] != (sljit_sw)wbuf + 133, "test59 case 3 failed\n"); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - FAILED(wbuf[4] != -88, "test59 case 4 failed\n"); - FAILED(sbuf[2] != 79.75, "test59 case 5 failed\n"); - FAILED(sbuf[3] != 8.625, "test59 case 6 failed\n"); - } - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test60(void) +static void test48(void) { /* Test memory accesses with pre/post updates. */ executable_code code; @@ -6326,7 +4970,7 @@ static void test60(void) #endif if (verbose) - printf("Run test60\n"); + printf("Run test48\n"); for (i = 0; i < 18; i++) wbuf[i] = 0; @@ -6342,7 +4986,7 @@ static void test60(void) FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); supported[0] = sljit_emit_mem_update(compiler, SLJIT_MOV | SLJIT_MEM_SUPP, SLJIT_R1, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_sw)); if (supported[0] == SLJIT_SUCCESS) { @@ -6461,7 +5105,7 @@ static void test60(void) code.func3((sljit_sw)&wbuf, (sljit_sw)&bbuf, (sljit_sw)&ibuf); - FAILED(sizeof(expected) != sizeof(supported) / sizeof(sljit_s32), "test60 case 1 failed\n"); + FAILED(sizeof(expected) != sizeof(supported) / sizeof(sljit_s32), "test48 case 1 failed\n"); for (i = 0; i < sizeof(expected); i++) { if (expected[i]) { @@ -6471,196 +5115,38 @@ static void test60(void) } } else { if (supported[i] == SLJIT_SUCCESS) { - printf("test60 case %d should not be supported\n", i + 1); + printf("test48 case %d should not be supported\n", i + 1); return; } } } - FAILED(supported[0] == SLJIT_SUCCESS && wbuf[0] != -887766, "test60 case 2 failed\n"); - FAILED(supported[0] == SLJIT_SUCCESS && wbuf[1] != (sljit_sw)(wbuf + 2), "test60 case 3 failed\n"); - FAILED(supported[1] == SLJIT_SUCCESS && wbuf[3] != -13, "test60 case 4 failed\n"); - FAILED(supported[1] == SLJIT_SUCCESS && wbuf[4] != (sljit_sw)(bbuf), "test60 case 5 failed\n"); - FAILED(supported[2] == SLJIT_SUCCESS && wbuf[5] != -5678, "test60 case 6 failed\n"); - FAILED(supported[2] == SLJIT_SUCCESS && wbuf[6] != (sljit_sw)(ibuf), "test60 case 7 failed\n"); - FAILED(supported[3] == SLJIT_SUCCESS && ibuf[1] != -8765, "test60 case 8 failed\n"); - FAILED(supported[3] == SLJIT_SUCCESS && wbuf[7] != (sljit_sw)(ibuf + 1), "test60 case 9 failed\n"); - FAILED(supported[4] == SLJIT_SUCCESS && bbuf[0] != -121, "test60 case 10 failed\n"); - FAILED(supported[4] == SLJIT_SUCCESS && wbuf[8] != (sljit_sw)(bbuf) - 128 * (sljit_sw)sizeof(sljit_s8), "test60 case 11 failed\n"); - FAILED(supported[5] == SLJIT_SUCCESS && wbuf[9] != -881199, "test60 case 12 failed\n"); - FAILED(supported[5] == SLJIT_SUCCESS && wbuf[10] != (sljit_sw)(wbuf + 9), "test60 case 13 failed\n"); - FAILED(supported[6] == SLJIT_SUCCESS && wbuf[11] != -5678, "test60 case 14 failed\n"); - FAILED(supported[6] == SLJIT_SUCCESS && wbuf[12] != (sljit_sw)(ibuf), "test60 case 15 failed\n"); - FAILED(supported[7] == SLJIT_SUCCESS && ibuf[2] != -7890, "test60 case 16 failed\n"); - FAILED(supported[7] == SLJIT_SUCCESS && wbuf[13] != (sljit_sw)(ibuf + 2), "test60 case 17 failed\n"); - FAILED(supported[8] == SLJIT_SUCCESS && wbuf[14] != -887766, "test60 case 18 failed\n"); - FAILED(supported[8] == SLJIT_SUCCESS && wbuf[15] != (sljit_sw)(wbuf + 10), "test60 case 19 failed\n"); - FAILED(supported[9] == SLJIT_SUCCESS && wbuf[16] != -13, "test60 case 20 failed\n"); - FAILED(supported[9] == SLJIT_SUCCESS && wbuf[17] != (sljit_sw)(bbuf), "test60 case 21 failed\n"); + FAILED(supported[0] == SLJIT_SUCCESS && wbuf[0] != -887766, "test48 case 2 failed\n"); + FAILED(supported[0] == SLJIT_SUCCESS && wbuf[1] != (sljit_sw)(wbuf + 2), "test48 case 3 failed\n"); + FAILED(supported[1] == SLJIT_SUCCESS && wbuf[3] != -13, "test48 case 4 failed\n"); + FAILED(supported[1] == SLJIT_SUCCESS && wbuf[4] != (sljit_sw)(bbuf), "test48 case 5 failed\n"); + FAILED(supported[2] == SLJIT_SUCCESS && wbuf[5] != -5678, "test48 case 6 failed\n"); + FAILED(supported[2] == SLJIT_SUCCESS && wbuf[6] != (sljit_sw)(ibuf), "test48 case 7 failed\n"); + FAILED(supported[3] == SLJIT_SUCCESS && ibuf[1] != -8765, "test48 case 8 failed\n"); + FAILED(supported[3] == SLJIT_SUCCESS && wbuf[7] != (sljit_sw)(ibuf + 1), "test48 case 9 failed\n"); + FAILED(supported[4] == SLJIT_SUCCESS && bbuf[0] != -121, "test48 case 10 failed\n"); + FAILED(supported[4] == SLJIT_SUCCESS && wbuf[8] != (sljit_sw)(bbuf) - 128 * (sljit_sw)sizeof(sljit_s8), "test48 case 11 failed\n"); + FAILED(supported[5] == SLJIT_SUCCESS && wbuf[9] != -881199, "test48 case 12 failed\n"); + FAILED(supported[5] == SLJIT_SUCCESS && wbuf[10] != (sljit_sw)(wbuf + 9), "test48 case 13 failed\n"); + FAILED(supported[6] == SLJIT_SUCCESS && wbuf[11] != -5678, "test48 case 14 failed\n"); + FAILED(supported[6] == SLJIT_SUCCESS && wbuf[12] != (sljit_sw)(ibuf), "test48 case 15 failed\n"); + FAILED(supported[7] == SLJIT_SUCCESS && ibuf[2] != -7890, "test48 case 16 failed\n"); + FAILED(supported[7] == SLJIT_SUCCESS && wbuf[13] != (sljit_sw)(ibuf + 2), "test48 case 17 failed\n"); + FAILED(supported[8] == SLJIT_SUCCESS && wbuf[14] != -887766, "test48 case 18 failed\n"); + FAILED(supported[8] == SLJIT_SUCCESS && wbuf[15] != (sljit_sw)(wbuf + 10), "test48 case 19 failed\n"); + FAILED(supported[9] == SLJIT_SUCCESS && wbuf[16] != -13, "test48 case 20 failed\n"); + FAILED(supported[9] == SLJIT_SUCCESS && wbuf[17] != (sljit_sw)(bbuf), "test48 case 21 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test61(void) -{ - /* Test float memory accesses with pre/post updates. */ - executable_code code; - struct sljit_compiler* compiler; - sljit_u32 i; - sljit_s32 supported[6]; - sljit_sw wbuf[6]; - sljit_f64 dbuf[4]; - sljit_f32 sbuf[4]; -#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) - static sljit_u8 expected[6] = { 1, 1, 1, 1, 0, 0 }; -#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) - static sljit_u8 expected[6] = { 1, 0, 1, 0, 1, 1 }; -#else - static sljit_u8 expected[6] = { 0, 0, 0, 0, 0, 0 }; -#endif - - if (verbose) - printf("Run test61\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test61 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - for (i = 0; i < 6; i++) - wbuf[i] = 0; - - dbuf[0] = 66.725; - dbuf[1] = 0.0; - dbuf[2] = 0.0; - dbuf[3] = 0.0; - - sbuf[0] = 0.0; - sbuf[1] = -22.125; - sbuf[2] = 0.0; - sbuf[3] = 0.0; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); - - supported[0] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_f64)); - if (supported[0] == SLJIT_SUCCESS) { - /* dbuf[1] */ - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 4 * sizeof(sljit_f64)); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F64, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); - } - - supported[1] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), -(sljit_sw)sizeof(sljit_f64)); - if (supported[1] == SLJIT_SUCCESS) { - /* dbuf[2] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), -(sljit_sw)sizeof(sljit_f64)); - /* wbuf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); - } - - supported[2] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE, SLJIT_FR1, SLJIT_MEM1(SLJIT_R2), -4 * (sljit_sw)sizeof(sljit_f32)); - if (supported[2] == SLJIT_SUCCESS) { - /* sbuf[0] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S2, 0, SLJIT_IMM, 4 * sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE, SLJIT_FR1, SLJIT_MEM1(SLJIT_R2), -4 * (sljit_sw)sizeof(sljit_f32)); - /* wbuf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R2, 0); - } - - supported[3] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR1, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f32)); - if (supported[3] == SLJIT_SUCCESS) { - /* sbuf[2] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S2, 0, SLJIT_IMM, sizeof(sljit_f32)); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_POST, SLJIT_FR1, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32), SLJIT_FR1, 0); - /* wbuf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R1, 0); - } - - supported[4] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); - if (supported[4] == SLJIT_SUCCESS) { - /* dbuf[3] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 8 * sizeof(sljit_f64)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -8 * (sljit_sw)sizeof(sljit_f64)); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F64, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); - /* wbuf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0); - } - - supported[5] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE, SLJIT_FR2, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 0); - if (supported[5] == SLJIT_SUCCESS) { - /* sbuf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3 * sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE, SLJIT_FR2, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 0); - /* wbuf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R2, 0); - } - - SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), 0) == SLJIT_ERR_UNSUPPORTED); - SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), 0) == SLJIT_ERR_UNSUPPORTED); - -#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) - /* TODO: at least for ARM (both V5 and V7) the range below needs further fixing */ - SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 256) == SLJIT_ERR_UNSUPPORTED); - SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -257) == SLJIT_ERR_UNSUPPORTED); -#endif - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func3((sljit_sw)&wbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); - - FAILED(sizeof(expected) != sizeof(supported) / sizeof(sljit_s32), "test61 case 1 failed\n"); - - for (i = 0; i < sizeof(expected); i++) { - if (expected[i]) { - if (supported[i] != SLJIT_SUCCESS) { - printf("tast61 case %d should be supported\n", i + 1); - return; - } - } else { - if (supported[i] == SLJIT_SUCCESS) { - printf("test61 case %d should not be supported\n", i + 1); - return; - } - } - } - - FAILED(supported[0] == SLJIT_SUCCESS && dbuf[1] != 66.725, "test61 case 2 failed\n"); - FAILED(supported[0] == SLJIT_SUCCESS && wbuf[0] != (sljit_sw)(dbuf), "test61 case 3 failed\n"); - FAILED(supported[1] == SLJIT_SUCCESS && dbuf[2] != 66.725, "test61 case 4 failed\n"); - FAILED(supported[1] == SLJIT_SUCCESS && wbuf[1] != (sljit_sw)(dbuf + 1), "test61 case 5 failed\n"); - FAILED(supported[2] == SLJIT_SUCCESS && sbuf[0] != -22.125, "test61 case 6 failed\n"); - FAILED(supported[2] == SLJIT_SUCCESS && wbuf[2] != (sljit_sw)(sbuf), "test61 case 7 failed\n"); - FAILED(supported[3] == SLJIT_SUCCESS && sbuf[2] != -22.125, "test61 case 8 failed\n"); - FAILED(supported[3] == SLJIT_SUCCESS && wbuf[3] != (sljit_sw)(sbuf + 2), "test61 case 9 failed\n"); - FAILED(supported[4] == SLJIT_SUCCESS && dbuf[3] != 66.725, "test61 case 10 failed\n"); - FAILED(supported[4] == SLJIT_SUCCESS && wbuf[4] != (sljit_sw)(dbuf), "test61 case 11 failed\n"); - FAILED(supported[5] == SLJIT_SUCCESS && sbuf[3] != -22.125, "test61 case 12 failed\n"); - FAILED(supported[5] == SLJIT_SUCCESS && wbuf[5] != (sljit_sw)(sbuf + 3), "test61 case 13 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test62(void) +static void test49(void) { /* Test fast calls flag preservation. */ executable_code code1; @@ -6668,7 +5154,7 @@ static void test62(void) struct sljit_compiler* compiler; if (verbose) - printf("Run test62\n"); + printf("Run test49\n"); /* A */ compiler = sljit_create_compiler(NULL, NULL); @@ -6700,32 +5186,28 @@ static void test62(void) CHECK(compiler); sljit_free_compiler(compiler); - FAILED(code2.func1(88) != 0, "test62 case 1 failed\n"); - FAILED(code2.func1(42) != 1, "test62 case 2 failed\n"); - FAILED(code2.func1(0) != 2, "test62 case 3 failed\n"); + FAILED(code2.func1(88) != 0, "test49 case 1 failed\n"); + FAILED(code2.func1(42) != 1, "test49 case 2 failed\n"); + FAILED(code2.func1(0) != 2, "test49 case 3 failed\n"); sljit_free_code(code1.code, NULL); sljit_free_code(code2.code, NULL); successful_tests++; } -static void test63(void) +static void test50(void) { /* Test put label. */ executable_code code; struct sljit_label *label[2]; - struct sljit_put_label *put_label[5]; + struct sljit_jump *mov_addr[5]; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); sljit_uw addr[2]; sljit_uw buf[4]; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw offs = SLJIT_W(0x123456789012); -#else - sljit_sw offs = 0x12345678; -#endif + sljit_sw offs = WCONST(0x123456789012, 0x12345678); if (verbose) - printf("Run test63\n"); + printf("Run test50\n"); FAILED(!compiler, "cannot create compiler\n"); buf[0] = 0; @@ -6736,30 +5218,30 @@ static void test63(void) sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 3, 1, 0, 0, 2 * sizeof(sljit_sw)); /* buf[0-1] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_R0, 0); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); - put_label[1] = sljit_emit_put_label(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); + mov_addr[1] = sljit_emit_mov_addr(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); label[0] = sljit_emit_label(compiler); - sljit_set_put_label(put_label[0], label[0]); - sljit_set_put_label(put_label[1], label[0]); + sljit_set_label(mov_addr[0], label[0]); + sljit_set_label(mov_addr[1], label[0]); /* buf[2-3] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)(buf + 2) - offs); - put_label[2] = sljit_emit_put_label(compiler, SLJIT_MEM1(SLJIT_R0), offs); + mov_addr[2] = sljit_emit_mov_addr(compiler, SLJIT_MEM1(SLJIT_R0), offs); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (offs + (sljit_sw)sizeof(sljit_uw)) >> 1); - put_label[3] = sljit_emit_put_label(compiler, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1); + mov_addr[3] = sljit_emit_mov_addr(compiler, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1); label[1] = sljit_emit_label(compiler); - sljit_set_put_label(put_label[2], label[1]); - sljit_set_put_label(put_label[3], label[1]); + sljit_set_label(mov_addr[2], label[1]); + sljit_set_label(mov_addr[3], label[1]); /* Return value */ - put_label[4] = sljit_emit_put_label(compiler, SLJIT_RETURN_REG, 0); - sljit_set_put_label(put_label[4], label[0]); + mov_addr[4] = sljit_emit_mov_addr(compiler, SLJIT_RETURN_REG, 0); + sljit_set_label(mov_addr[4], label[0]); sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); code.code = sljit_generate_code(compiler); @@ -6770,45 +5252,38 @@ static void test63(void) sljit_free_compiler(compiler); - FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)addr[0], "test63 case 1 failed\n"); - FAILED(buf[0] != addr[0], "test63 case 2 failed\n"); - FAILED(buf[1] != addr[0], "test63 case 3 failed\n"); - FAILED(buf[2] != addr[1], "test63 case 4 failed\n"); - FAILED(buf[3] != addr[1], "test63 case 5 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)addr[0], "test50 case 1 failed\n"); + FAILED(buf[0] != addr[0], "test50 case 2 failed\n"); + FAILED(buf[1] != addr[0], "test50 case 3 failed\n"); + FAILED(buf[2] != addr[1], "test50 case 4 failed\n"); + FAILED(buf[3] != addr[1], "test50 case 5 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test64(void) +static void test51(void) { /* Test put label with absolute label addresses */ executable_code code; sljit_uw malloc_addr; - struct sljit_label label[6]; - struct sljit_put_label *put_label[2]; + struct sljit_jump *mov_addr[2]; struct sljit_compiler* compiler; - sljit_uw buf[7]; + sljit_uw buf[9]; sljit_s32 i; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) /* Must be even because it is also used for addressing. */ - sljit_sw offs1 = SLJIT_W(0x1234567812); - sljit_sw offs2 = SLJIT_W(0x123456781122); - sljit_sw offs3 = SLJIT_W(0x7fffffff7ff); - sljit_sw offs4 = SLJIT_W(0x1234567811223344); -#else /* !SLJIT_64BIT_ARCHITECTURE */ - sljit_sw offs1 = (sljit_sw)0x80000000; - sljit_sw offs2 = (sljit_sw)0xe0000000; - sljit_sw offs3 = (sljit_sw)0x87654321; - sljit_sw offs4 = (sljit_sw)0xffffffff; -#endif /* SLJIT_64BIT_ARCHITECTURE */ + sljit_uw offs1 = 0x7f1f; + sljit_uw offs2 = 0x7f1f2f3f; + sljit_uw offs3 = (sljit_uw)WCONST(0xfedcba9876, 0x80000000); + sljit_uw offs4 = (sljit_uw)WCONST(0x789abcdeff12, 0xefdfcfbf); + sljit_uw offs5 = (sljit_uw)WCONST(0x7fffffff7ff, 0x87654321); + sljit_uw offs6 = (sljit_uw)WCONST(0xfedcba9811223344, 0xffffffff); if (verbose) - printf("Run test64\n"); + printf("Run test51\n"); /* lock next allocation; see sljit_test_malloc_exec() */ -#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) - malloc_addr = (sljit_uw)SLJIT_MALLOC_EXEC(1024, NULL); + malloc_addr = (sljit_uw)SLJIT_MALLOC_EXEC(2048, NULL); if (!malloc_addr) { printf("Cannot allocate executable memory\n"); @@ -6817,98 +5292,87 @@ static void test64(void) compiler = sljit_create_compiler(NULL, (void*)malloc_addr); malloc_addr += (sljit_uw)SLJIT_EXEC_OFFSET((void*)malloc_addr); -#else /* SLJIT_CONFIG_UNSUPPORTED */ - malloc_addr = 0; - compiler = sljit_create_compiler(NULL, (void*)malloc_addr); -#endif /* !SLJIT_CONFIG_UNSUPPORTED */ - - label[0].addr = 0x1234; - label[0].size = (sljit_uw)0x1234 - malloc_addr; - - label[1].addr = 0x12345678; - label[1].size = (sljit_uw)0x12345678 - malloc_addr; - - label[2].addr = (sljit_uw)offs1; - label[2].size = (sljit_uw)offs1 - malloc_addr; - - label[3].addr = (sljit_uw)offs2; - label[3].size = (sljit_uw)offs2 - malloc_addr; - - label[4].addr = (sljit_uw)offs3; - label[4].size = (sljit_uw)offs3 - malloc_addr; - - label[5].addr = (sljit_uw)offs4; - label[5].size = (sljit_uw)offs4 - malloc_addr; - FAILED(!compiler, "cannot create compiler\n"); - for (i = 0; i < 6; i++) + for (i = 0; i < 9; i++) buf[i] = 0; - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 3, 1, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 3, 3, 0, 0, 2 * sizeof(sljit_sw)); /* buf[0] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_R0, 0); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); /* buf[1] */ - put_label[1] = sljit_emit_put_label(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); + mov_addr[1] = sljit_emit_mov_addr(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw)); - sljit_set_put_label(put_label[0], &label[0]); - sljit_set_put_label(put_label[1], &label[0]); + sljit_set_target(mov_addr[0], malloc_addr); + sljit_set_target(mov_addr[1], malloc_addr + 1); /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)(buf + 2) - offs1); - put_label[0] = sljit_emit_put_label(compiler, SLJIT_MEM1(SLJIT_R0), offs1); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_uw), SLJIT_S2, 0); /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (offs1 + (sljit_sw)sizeof(sljit_uw)) >> 1); - put_label[1] = sljit_emit_put_label(compiler, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1); + mov_addr[1] = sljit_emit_mov_addr(compiler, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), 0); - sljit_set_put_label(put_label[0], &label[1]); - sljit_set_put_label(put_label[1], &label[1]); + sljit_set_target(mov_addr[0], offs1); + sljit_set_target(mov_addr[1], offs1); /* buf[4] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_R1, 0); - sljit_set_put_label(put_label[0], &label[2]); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_uw), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)(buf + 4) - (sljit_sw)offs1); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_MEM1(SLJIT_R0), (sljit_sw)offs1); /* buf[5] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_R2, 0); - sljit_set_put_label(put_label[0], &label[3]); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_uw), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)(buf + 5) - 0x1234); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)0x1234 >> 1); + mov_addr[1] = sljit_emit_mov_addr(compiler, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1); + + sljit_set_target(mov_addr[0], offs2); + sljit_set_target(mov_addr[1], offs2); /* buf[6] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_R1, 0); - sljit_set_put_label(put_label[0], &label[4]); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_R1, 0); + sljit_set_target(mov_addr[0], offs3); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_uw), SLJIT_R1, 0); /* buf[7] */ - put_label[0] = sljit_emit_put_label(compiler, SLJIT_RETURN_REG, 0); - sljit_set_put_label(put_label[0], &label[5]); + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_R2, 0); + sljit_set_target(mov_addr[0], offs4); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_uw), SLJIT_R2, 0); + + /* buf[8] */ + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_S1, 0); + sljit_set_target(mov_addr[0], offs5); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_uw), SLJIT_S1, 0); + + mov_addr[0] = sljit_emit_mov_addr(compiler, SLJIT_RETURN_REG, 0); + sljit_set_target(mov_addr[0], offs6); sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); code.code = sljit_generate_code(compiler); CHECK(compiler); sljit_free_compiler(compiler); - SLJIT_ASSERT(SLJIT_FUNC_UADDR(code.code) >= malloc_addr && SLJIT_FUNC_UADDR(code.code) <= malloc_addr + 8); - FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)label[5].addr, "test64 case 1 failed\n"); - FAILED(buf[0] != label[0].addr, "test64 case 2 failed\n"); - FAILED(buf[1] != label[0].addr, "test64 case 3 failed\n"); - FAILED(buf[2] != label[1].addr, "test64 case 4 failed\n"); - FAILED(buf[3] != label[1].addr, "test64 case 5 failed\n"); - FAILED(buf[4] != label[2].addr, "test64 case 6 failed\n"); - FAILED(buf[5] != label[3].addr, "test64 case 7 failed\n"); - FAILED(buf[6] != label[4].addr, "test64 case 8 failed\n"); + FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)offs6, "test51 case 1 failed\n"); + FAILED(buf[0] != malloc_addr, "test51 case 2 failed\n"); + FAILED(buf[1] != malloc_addr + 1, "test51 case 3 failed\n"); + FAILED(buf[2] != offs1, "test51 case 4 failed\n"); + FAILED(buf[3] != offs1, "test51 case 5 failed\n"); + FAILED(buf[4] != offs2, "test51 case 6 failed\n"); + FAILED(buf[5] != offs2, "test51 case 7 failed\n"); + FAILED(buf[6] != offs3, "test51 case 8 failed\n"); + FAILED(buf[7] != offs4, "test51 case 9 failed\n"); + FAILED(buf[8] != offs5, "test51 case 10 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test65(void) +static void test52(void) { /* Test jump tables. */ executable_code code; @@ -6920,7 +5384,7 @@ static void test65(void) struct sljit_jump *jump; if (verbose) - printf("Run test65\n"); + printf("Run test52\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -6949,17 +5413,17 @@ static void test65(void) sljit_free_compiler(compiler); - FAILED(code.func2(64, 0) != -1, "test65 case 1 failed\n"); + FAILED(code.func2(64, 0) != -1, "test52 case 1 failed\n"); for (i = 0; i < 64; i++) { - FAILED(code.func2(i, i * 2) != i * 4, "test65 case 2 failed\n"); + FAILED(code.func2(i, i * 2) != i * 4, "test52 case 2 failed\n"); } sljit_free_code(code.code, NULL); successful_tests++; } -static void test66(void) +static void test53(void) { /* Test direct jumps (computed goto). */ executable_code code; @@ -6969,7 +5433,7 @@ static void test66(void) struct sljit_label *labels[64]; if (verbose) - printf("Run test66\n"); + printf("Run test53\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -6993,14 +5457,14 @@ static void test66(void) sljit_free_compiler(compiler); for (i = 0; i < 64; i++) { - FAILED(code.func2((sljit_sw)addr[i], i) != i * 3, "test66 case 1 failed\n"); + FAILED(code.func2((sljit_sw)addr[i], i) != i * 3, "test53 case 1 failed\n"); } sljit_free_code(code.code, NULL); successful_tests++; } -static void test67(void) +static void test54(void) { /* Test skipping returns from fast calls (return type is fast). */ executable_code code; @@ -7009,7 +5473,7 @@ static void test67(void) struct sljit_label *label; if (verbose) - printf("Run test67\n"); + printf("Run test54\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -7053,13 +5517,13 @@ static void test67(void) sljit_free_compiler(compiler); - FAILED(code.func0() != 3, "test67 case 1 failed\n"); + FAILED(code.func0() != 3, "test54 case 1 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test68(void) +static void test55(void) { /* Test skipping returns from fast calls (return type is normal). */ executable_code code; @@ -7069,7 +5533,7 @@ static void test68(void) int i; if (verbose) - printf("Run test68\n"); + printf("Run test55\n"); for (i = 0; i < 6; i++) { compiler = sljit_create_compiler(NULL, NULL); @@ -7104,7 +5568,7 @@ static void test68(void) sljit_free_compiler(compiler); if (SLJIT_UNLIKELY(code.func0() != 4)) { - printf("test68 case %d failed\n", i + 1); + printf("test55 case %d failed\n", i + 1); return; } sljit_free_code(code.code, NULL); @@ -7113,7 +5577,7 @@ static void test68(void) successful_tests++; } -static void test69(void) +static void test56(void) { /* Test sljit_set_current_flags. */ executable_code code; @@ -7122,14 +5586,14 @@ static void test69(void) sljit_s32 i; if (verbose) - printf("Run test69\n"); + printf("Run test56\n"); for (i = 0; i < 8; i++) buf[i] = 4; FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 3, 1, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 0, 0, 0); /* buf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)1 << ((sizeof (sljit_sw) * 8) - 2)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_R0, 0); @@ -7187,31 +5651,29 @@ static void test69(void) code.func1((sljit_sw)&buf); - FAILED(buf[0] != 1, "test69 case 1 failed\n"); - FAILED(buf[1] != 2, "test69 case 2 failed\n"); - FAILED(buf[2] != 1, "test69 case 3 failed\n"); - FAILED(buf[3] != 2, "test69 case 4 failed\n"); - FAILED(buf[4] != 1, "test69 case 5 failed\n"); - FAILED(buf[5] != 2, "test69 case 6 failed\n"); - FAILED(buf[6] != 1, "test69 case 7 failed\n"); - FAILED(buf[7] != 2, "test69 case 8 failed\n"); + FAILED(buf[0] != 1, "test56 case 1 failed\n"); + FAILED(buf[1] != 2, "test56 case 2 failed\n"); + FAILED(buf[2] != 1, "test56 case 3 failed\n"); + FAILED(buf[3] != 2, "test56 case 4 failed\n"); + FAILED(buf[4] != 1, "test56 case 5 failed\n"); + FAILED(buf[5] != 2, "test56 case 6 failed\n"); + FAILED(buf[6] != 1, "test56 case 7 failed\n"); + FAILED(buf[7] != 2, "test56 case 8 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test70(void) +static void test57(void) { /* Test argument passing to sljit_emit_enter. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); sljit_sw wbuf[2]; sljit_s32 ibuf[2]; - sljit_f64 dbuf[3]; - sljit_f32 fbuf[2]; if (verbose) - printf("Run test70\n"); + printf("Run test57\n"); wbuf[0] = 0; wbuf[1] = 0; @@ -7220,7 +5682,7 @@ static void test70(void) FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32, W, 32, W), 1, 4, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32, W, 32, W), 1, 4, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S1, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S3, 0); @@ -7233,19 +5695,19 @@ static void test70(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test70_f1(-1478, 9476, 4928, -6832); + code.test57_f1(-1478, 9476, 4928, -6832); - FAILED(wbuf[0] != 9476, "test70 case 1 failed\n"); - FAILED(wbuf[1] != -6832, "test70 case 2 failed\n"); - FAILED(ibuf[0] != -1478, "test70 case 3 failed\n"); - FAILED(ibuf[1] != 4928, "test70 case 4 failed\n"); + FAILED(wbuf[0] != 9476, "test57 case 1 failed\n"); + FAILED(wbuf[1] != -6832, "test57 case 2 failed\n"); + FAILED(ibuf[0] != -1478, "test57 case 3 failed\n"); + FAILED(ibuf[1] != 4928, "test57 case 4 failed\n"); sljit_free_code(code.code, NULL); compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32, 32, W, W), 1, 4, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32, 32, W, W), 1, 4, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); @@ -7258,677 +5720,35 @@ static void test70(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test70_f2(4721, 7892, -3579, -4830); + code.test57_f2(4721, 7892, -3579, -4830); - FAILED(wbuf[0] != 4721, "test70 case 5 failed\n"); - FAILED(wbuf[1] != 7892, "test70 case 6 failed\n"); - FAILED(ibuf[0] != -3579, "test70 case 7 failed\n"); - FAILED(ibuf[1] != -4830, "test70 case 8 failed\n"); + FAILED(wbuf[0] != 4721, "test57 case 5 failed\n"); + FAILED(wbuf[1] != 7892, "test57 case 6 failed\n"); + FAILED(ibuf[0] != -3579, "test57 case 7 failed\n"); + FAILED(ibuf[1] != -4830, "test57 case 8 failed\n"); sljit_free_code(code.code, NULL); - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - wbuf[0] = 0; - ibuf[0] = 0; - dbuf[0] = 0; - fbuf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32, F32, W, F64), 2, 2, 2, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR1, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR0, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f3(-6834, 674.5, 2789, -895.25); - - FAILED(wbuf[0] != 2789, "test70 case 9 failed\n"); - FAILED(ibuf[0] != -6834, "test70 case 10 failed\n"); - FAILED(dbuf[0] != -895.25, "test70 case 11 failed\n"); - FAILED(fbuf[0] != 674.5, "test70 case 12 failed\n"); - - ibuf[0] = 0; - dbuf[0] = 0; - fbuf[0] = 0; - fbuf[1] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F32, F64, F32, 32), 1, 1, 3, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&fbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_FR2, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f4(-4712.5, 5342.25, 2904.25, -4607); - - FAILED(ibuf[0] != -4607, "test70 case 13 failed\n"); - FAILED(dbuf[0] != 5342.25, "test70 case 14 failed\n"); - FAILED(fbuf[0] != -4712.5, "test70 case 15 failed\n"); - FAILED(fbuf[1] != 2904.25, "test70 case 16 failed\n"); - - ibuf[0] = 0; - dbuf[0] = 0; - fbuf[0] = 0; - fbuf[1] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F32, 32, F32), 1, 1, 3, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&fbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR1, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_FR2, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f5(3578.5, 4619.25, 6859, -1807.75); - - FAILED(ibuf[0] != 6859, "test70 case 17 failed\n"); - FAILED(dbuf[0] != 3578.5, "test70 case 18 failed\n"); - FAILED(fbuf[0] != 4619.25, "test70 case 19 failed\n"); - FAILED(fbuf[1] != -1807.75, "test70 case 20 failed\n"); - - ibuf[0] = 0; - dbuf[0] = 0; - dbuf[1] = 0; - fbuf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, 32, F32, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 2, 1, 3, 0, 33); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR2, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR1, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f6(2740.75, -2651, -7909.25, 3671.5); - - FAILED(ibuf[0] != -2651, "test70 case 21 failed\n"); - FAILED(dbuf[0] != 2740.75, "test70 case 22 failed\n"); - FAILED(dbuf[1] != 3671.5, "test70 case 23 failed\n"); - FAILED(fbuf[0] != -7909.25, "test70 case 24 failed\n"); - - wbuf[0] = 0; - ibuf[0] = 0; - ibuf[1] = 0; - fbuf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F32, 32, W, 32), 1, 3, 1, 0, 1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&ibuf); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_s32), SLJIT_S2, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR0, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f7(-5219.25, -4530, 7214, 6741); - - FAILED(wbuf[0] != 7214, "test70 case 25 failed\n"); - FAILED(ibuf[0] != -4530, "test70 case 26 failed\n"); - FAILED(ibuf[1] != 6741, "test70 case 27 failed\n"); - FAILED(fbuf[0] != -5219.25, "test70 case 28 failed\n"); - - wbuf[0] = 0; - wbuf[1] = 0; - dbuf[0] = 0; - dbuf[1] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F64, W, W), 1, 5, 2, 0, SLJIT_MAX_LOCAL_SIZE - 1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_S0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), SLJIT_MAX_LOCAL_SIZE - 2 * sizeof(sljit_f64), SLJIT_FR0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f8(-3749.75, 5280.5, 9134, -6506); - - FAILED(wbuf[0] != 9134, "test70 case 29 failed\n"); - FAILED(wbuf[1] != -6506, "test70 case 30 failed\n"); - FAILED(dbuf[0] != -3749.75, "test70 case 31 failed\n"); - FAILED(dbuf[1] != 5280.5, "test70 case 32 failed\n"); - - wbuf[0] = 0; - dbuf[0] = 0; - dbuf[1] = 0; - dbuf[2] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F64, W, F64), 1, 1, 3, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f9(-6049.25, 7301.5, 4610, -4312.75); - - FAILED(wbuf[0] != 4610, "test70 case 33 failed\n"); - FAILED(dbuf[0] != -6049.25, "test70 case 34 failed\n"); - FAILED(dbuf[1] != 7301.5, "test70 case 35 failed\n"); - FAILED(dbuf[2] != -4312.75, "test70 case 36 failed\n"); - - ibuf[0] = 0; - dbuf[0] = 0; - dbuf[1] = 0; - dbuf[2] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F64, F64, 32), 1, 1, 3, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test70_f10(4810.5, -9148.75, 8601.25, 6703); - - FAILED(ibuf[0] != 6703, "test70 case 37 failed\n"); - FAILED(dbuf[0] != 4810.5, "test70 case 38 failed\n"); - FAILED(dbuf[1] != -9148.75, "test70 case 39 failed\n"); - FAILED(dbuf[2] != 8601.25, "test70 case 40 failed\n"); - } - successful_tests++; } -static sljit_sw test71_f1(sljit_sw a) +static void test58(void) { - return a + 10000; -} - -static sljit_sw test71_f2(sljit_sw a, sljit_s32 b, sljit_s32 c, sljit_sw d) -{ - return a | b | c | d; -} - -static sljit_sw test71_f3(sljit_sw a, sljit_s32 b, sljit_s32 c, sljit_sw d) -{ - SLJIT_UNUSED_ARG(a); - return b | c | d; -} - -static sljit_sw test71_f4(void) -{ - return 7461932; -} - -static sljit_sw test71_f5(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_f64 d) -{ - if (a == 1345.5 && b == -8724.25 && c == 9034.75 && d == 6307.5) - return 8920567; - return 0; -} - -static sljit_sw test71_f6(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_sw d) -{ - if (a == 4061.25 && b == -3291.75 && c == 8703.5 && d == 1706) - return 5074526; - return 0; -} - -static void test71(void) -{ - /* Test tail calls. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump *jump; - sljit_uw jump_addr; - sljit_sw executable_offset; - sljit_sw wbuf[1]; - sljit_f64 dbuf[4]; - - if (verbose) - printf("Run test71\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 4, 4, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS1(W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f1)); - /* Should crash. */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func1(7987) != 17987, "test71 case 1 failed\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 1, 4, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1); - jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_REWRITABLE_JUMP | SLJIT_CALL_RETURN, SLJIT_ARGS1(W, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_target(jump, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - executable_offset = sljit_get_executable_offset(compiler); - jump_addr = sljit_get_jump_addr(jump); - sljit_free_compiler(compiler); - - sljit_set_jump_addr(jump_addr, SLJIT_FUNC_UADDR(test71_f1), executable_offset); - - FAILED(code.func1(3903) != 13903, "test71 case 2 failed\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f2)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x28000000); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x00140000); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x00002800); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x00000041); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_MEM1(SLJIT_SP), 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func0() != 0x28142841, "test71 case 3 failed\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 4, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f2)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0x81000000); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x00480000); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x00002100); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x00000014); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_S3, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func0() != (sljit_sw)0x81482114, "test71 case 4 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 0, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f3)); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x342); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x451000); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x21000000); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func0() != 0x21451342, "test71 case 5 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 0, 0, 0, 9); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS0(W), SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f4)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.func0() != 7461932, "test71 case 6 failed\n"); - - sljit_free_code(code.code, NULL); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - /* Next test. */ - - dbuf[0] = 9034.75; - dbuf[1] = 6307.5; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(W, F32, F64), 1, 1, 4, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR0, 0, SLJIT_FR0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64)); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, F64), SLJIT_IMM, SLJIT_FUNC_ADDR(test71_f5)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.test71_f1(1345.5, -8724.25) != 8920567, "test71 case 7 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - wbuf[0] = SLJIT_FUNC_ADDR(test71_f5); - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(W, F64, F64, F64, F64), 1, 0, 4, 0, 0); - sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, F64), SLJIT_MEM0(), (sljit_sw)wbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.test71_f2(1345.5, -8724.25, 9034.75, 6307.5) != 8920567, "test71 case 8 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), 1, 0, 4, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); - jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_target(jump, SLJIT_FUNC_UADDR(test71_f6)); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.test71_f3(4061.25, -3291.75, 8703.5) != 5074526, "test71 case 9 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 1, 0, 4, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); - jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_target(jump, SLJIT_FUNC_UADDR(test71_f6)); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.test71_f3(4061.25, -3291.75, 8703.5) != 5074526, "test71 case 10 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 1, 1, 3, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); - jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_target(jump, SLJIT_FUNC_UADDR(test71_f6)); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - FAILED(code.test71_f3(4061.25, -3291.75, 8703.5) != 5074526, "test71 case 11 failed\n"); - - sljit_free_code(code.code, NULL); - } - - successful_tests++; -} - -static void test72(void) -{ - /* Test using all fpu registers. */ - executable_code code; - struct sljit_compiler* compiler; - sljit_f64 buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS]; - sljit_f64 buf2[2]; - struct sljit_jump *jump; - sljit_s32 i; - - if (verbose) - printf("Run test72\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test72 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - buf2[0] = 7.75; - buf2[1] = -8.25; - - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - buf[i] = 0.0; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 1, 2, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S1, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1(VOID, W)); - - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), i * (sljit_sw)sizeof(sljit_f64), SLJIT_FR(i), 0); - sljit_emit_return_void(compiler); - - /* Called function. */ - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); - - sljit_set_context(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func2((sljit_sw)buf, (sljit_sw)buf2); - - for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) { - FAILED(buf[i] != -8.25, "test72 case 1 failed\n"); - } - - for (i = SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) { - FAILED(buf[i] != 7.75, "test72 case 2 failed\n"); - } - - sljit_free_code(code.code, NULL); - - /* Next test. */ - if (SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS >= 3) { - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - buf2[0] = -6.25; - buf2[1] = 3.75; - - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - buf[i] = 0.0; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 1, 2, SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2, 1, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FS0, 0, SLJIT_MEM1(SLJIT_S1), 0); - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FS0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S1, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1(VOID, W)); - - for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), i * (sljit_sw)sizeof(sljit_f64), SLJIT_FR(i), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1) * (sljit_sw)sizeof(sljit_f64), SLJIT_FS0, 0); - sljit_emit_return_void(compiler); - - /* Called function. */ - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); - for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); - - sljit_set_context(compiler, 0, SLJIT_ARGS1(VOID, P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func2((sljit_sw)buf, (sljit_sw)buf2); - - for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) { - FAILED(buf[i] != 3.75, "test72 case 3 failed\n"); - } - - for (i = SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) { - FAILED(buf[i] != -6.25, "test72 case 4 failed\n"); - } - - FAILED(buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2] != 0, "test72 case 5 failed\n"); - FAILED(buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1] != -6.25, "test72 case 6 failed\n"); - - sljit_free_code(code.code, NULL); - } - successful_tests++; -} - -static void test73(void) -{ - /* Test pasing arguments in registers. */ + /* Test passing arguments in registers. */ executable_code code; struct sljit_compiler* compiler; sljit_sw wbuf[2]; sljit_s32 ibuf[2]; - sljit_f64 dbuf[3]; if (verbose) - printf("Run test73\n"); + printf("Run test58\n"); /* Next test. */ compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32_R, W, W_R, 32), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32_R, W, W_R, 32), 3, 2, 0, 0, 0); /* wbuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_S0, 0); @@ -7945,12 +5765,12 @@ static void test73(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test73_f1(3467, -6781, 5038, 6310); + code.test58_f1(3467, -6781, 5038, 6310); - FAILED(wbuf[0] != -6781, "test73 case 1 failed\n"); - FAILED(wbuf[1] != 5038, "test73 case 2 failed\n"); - FAILED(ibuf[0] != 3467, "test73 case 3 failed\n"); - FAILED(ibuf[1] != 6310, "test73 case 4 failed\n"); + FAILED(wbuf[0] != -6781, "test58 case 1 failed\n"); + FAILED(wbuf[1] != 5038, "test58 case 2 failed\n"); + FAILED(ibuf[0] != 3467, "test58 case 3 failed\n"); + FAILED(ibuf[1] != 6310, "test58 case 4 failed\n"); sljit_free_code(code.code, NULL); /* Next test. */ @@ -7958,7 +5778,7 @@ static void test73(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32, W_R, W, 32_R), 4, 2, 0, 0, 8192); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32, W_R, W, 32_R), 4, 2, 0, 0, 8192); /* wbuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_R1, 0); @@ -7975,12 +5795,12 @@ static void test73(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test73_f1(-9723, 5208, 4761, 5084); + code.test58_f1(-9723, 5208, 4761, 5084); - FAILED(wbuf[0] != 5208, "test73 case 5 failed\n"); - FAILED(wbuf[1] != 4761, "test73 case 6 failed\n"); - FAILED(ibuf[0] != -9723, "test73 case 7 failed\n"); - FAILED(ibuf[1] != 5084, "test73 case 8 failed\n"); + FAILED(wbuf[0] != 5208, "test58 case 5 failed\n"); + FAILED(wbuf[1] != 4761, "test58 case 6 failed\n"); + FAILED(ibuf[0] != -9723, "test58 case 7 failed\n"); + FAILED(ibuf[1] != 5084, "test58 case 8 failed\n"); sljit_free_code(code.code, NULL); /* Next test. */ @@ -7988,7 +5808,7 @@ static void test73(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, 32_R, W_R, W_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32_R, W_R, W_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); /* wbuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R1, 0); @@ -8005,12 +5825,12 @@ static void test73(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test73_f1(5934, 6043, -8572, -3861); + code.test58_f1(5934, 6043, -8572, -3861); - FAILED(wbuf[0] != 6043, "test73 case 9 failed\n"); - FAILED(wbuf[1] != -8572, "test73 case 10 failed\n"); - FAILED(ibuf[0] != 5934, "test73 case 11 failed\n"); - FAILED(ibuf[1] != -3861, "test73 case 12 failed\n"); + FAILED(wbuf[0] != 6043, "test58 case 9 failed\n"); + FAILED(wbuf[1] != -8572, "test58 case 10 failed\n"); + FAILED(ibuf[0] != 5934, "test58 case 11 failed\n"); + FAILED(ibuf[1] != -3861, "test58 case 12 failed\n"); sljit_free_code(code.code, NULL); /* Next test. */ @@ -8018,8 +5838,8 @@ static void test73(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, W_R, W_R, 32_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_set_context(compiler, 0, SLJIT_ARGS4(VOID, W_R, W_R, 32_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(W_R, W_R, 32_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_set_context(compiler, 0, SLJIT_ARGS4V(W_R, W_R, 32_R, 32_R), 4, 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); /* wbuf[0] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&wbuf); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); @@ -8036,79 +5856,18 @@ static void test73(void) CHECK(compiler); sljit_free_compiler(compiler); - code.test73_f2(6732, -5916, 2740, -3621); + code.test58_f2(6732, -5916, 2740, -3621); - FAILED(wbuf[0] != 6732, "test73 case 13 failed\n"); - FAILED(wbuf[1] != -5916, "test73 case 14 failed\n"); - FAILED(ibuf[0] != 2740, "test73 case 15 failed\n"); - FAILED(ibuf[1] != -3621, "test73 case 16 failed\n"); + FAILED(wbuf[0] != 6732, "test58 case 13 failed\n"); + FAILED(wbuf[1] != -5916, "test58 case 14 failed\n"); + FAILED(ibuf[0] != 2740, "test58 case 15 failed\n"); + FAILED(ibuf[1] != -3621, "test58 case 16 failed\n"); sljit_free_code(code.code, NULL); - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F64, F64, W_R), 1, 0, 3, 0, SLJIT_MAX_LOCAL_SIZE); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_R0, 0); - /* dbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test73_f3(7390.25, -8045.5, 1390.75, 8201); - - FAILED(wbuf[0] != 8201, "test73 case 17 failed\n"); - FAILED(dbuf[0] != 7390.25, "test73 case 18 failed\n"); - FAILED(dbuf[1] != -8045.5, "test73 case 19 failed\n"); - FAILED(dbuf[2] != 1390.75, "test73 case 20 failed\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS4(VOID, F64, F64, W, W_R), 2, 1, 2, 0, SLJIT_MAX_LOCAL_SIZE); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); - /* wbuf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_R1, 0); - /* dbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.test73_f4(4892.75, -3702.5, 4731, 8530); - - FAILED(wbuf[0] != 4731, "test73 case 21 failed\n"); - FAILED(wbuf[1] != 8530, "test73 case 22 failed\n"); - FAILED(dbuf[0] != 4892.75, "test73 case 23 failed\n"); - FAILED(dbuf[1] != -3702.5, "test73 case 24 failed\n"); - } - successful_tests++; } -static void test74(void) +static void test59(void) { /* Test carry flag. */ executable_code code; @@ -8117,7 +5876,7 @@ static void test74(void) sljit_s32 i; if (verbose) - printf("Run test74\n"); + printf("Run test59\n"); for (i = 0; i < 15; i++) wbuf[i] = -1; @@ -8125,7 +5884,7 @@ static void test74(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W), 3, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W), 3, 2, 0, 0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1); sljit_emit_op2u(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_IMM, 1); @@ -8230,907 +5989,21 @@ static void test74(void) code.func1((sljit_sw)&wbuf); - FAILED(wbuf[0] != 1, "test74 case 1 failed\n"); - FAILED(wbuf[1] != 1, "test74 case 2 failed\n"); - FAILED(wbuf[2] != 2, "test74 case 3 failed\n"); - FAILED(wbuf[3] != 1, "test74 case 4 failed\n"); - FAILED(wbuf[4] != 2, "test74 case 5 failed\n"); - FAILED(wbuf[5] != 1, "test74 case 6 failed\n"); - FAILED(wbuf[6] != 1, "test74 case 7 failed\n"); - FAILED(wbuf[7] != 1, "test74 case 8 failed\n"); - FAILED(wbuf[8] != 2, "test74 case 9 failed\n"); - FAILED(wbuf[9] != 2, "test74 case 10 failed\n"); - FAILED(wbuf[10] != 1, "test74 case 11 failed\n"); - FAILED(wbuf[11] != 2, "test74 case 12 failed\n"); - FAILED(wbuf[12] != 1, "test74 case 13 failed\n"); - FAILED(wbuf[13] != 1, "test74 case 14 failed\n"); - FAILED(wbuf[14] != 1, "test74 case 15 failed\n"); - - successful_tests++; -} - -static void test75_set(struct sljit_compiler *compiler, sljit_s32 compare, sljit_s32 type, sljit_s32 left_fr, sljit_s32 right_fr) -{ - /* Testing both sljit_emit_op_flags and sljit_emit_jump. */ - struct sljit_jump* jump1; - struct sljit_jump* jump2; - sljit_s32 is_ordered; - - if (sljit_cmp_info(type)) { - sljit_emit_fop1(compiler, compare | SLJIT_SET(type & 0xfe), left_fr, 0, right_fr, 0); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R0, 0, type); - jump1 = sljit_emit_jump(compiler, type); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2); - sljit_set_label(jump1, sljit_emit_label(compiler)); - } else { - if (type < SLJIT_UNORDERED_OR_EQUAL) { - is_ordered = (type & 0x1) ^ 0x1; - type += SLJIT_UNORDERED_OR_EQUAL - SLJIT_ORDERED_EQUAL; - } else { - is_ordered = type & 0x1; - type -= SLJIT_UNORDERED_OR_EQUAL - SLJIT_ORDERED_EQUAL; - } - SLJIT_ASSERT(sljit_cmp_info(type) && sljit_cmp_info(SLJIT_UNORDERED) && sljit_cmp_info(SLJIT_ORDERED)); - - sljit_emit_fop1(compiler, compare | SLJIT_SET(type & 0xfe), left_fr, 0, right_fr, 0); - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R0, 0, type); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); - - if (is_ordered) { - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_ORDERED); - - jump1 = sljit_emit_jump(compiler, SLJIT_UNORDERED); - jump2 = sljit_emit_jump(compiler, type); - sljit_set_label(jump1, sljit_emit_label(compiler)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); - sljit_set_label(jump2, sljit_emit_label(compiler)); - - sljit_emit_op2(compiler, SLJIT_AND, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R1, 0); - } else { - sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_UNORDERED); - - jump1 = sljit_emit_jump(compiler, SLJIT_UNORDERED); - jump2 = sljit_emit_jump(compiler, type); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); - sljit_set_label(jump1, sljit_emit_label(compiler)); - sljit_set_label(jump2, sljit_emit_label(compiler)); - - sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R1, 0); - } - - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R2, 0); - } - - sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_s8)); -} - -static void test75(void) -{ - /* Test floating point comparison. */ - executable_code code; - struct sljit_compiler* compiler; - sljit_s8 bbuf[96]; - sljit_s32 i; - - union { - sljit_f64 value; - struct { - sljit_s32 value1; - sljit_s32 value2; - } u; - } dbuf[3]; - - union { - sljit_f32 value; - sljit_s32 value1; - } sbuf[3]; - - if (verbose) - printf("Run test75\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test75 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - dbuf[0].u.value1 = 0x7fffffff; - dbuf[0].u.value2 = 0x7fffffff; - dbuf[1].value = -13.0; - dbuf[2].value = 27.0; - - sbuf[0].value1 = 0x7fffffff; - sbuf[1].value = -13.0; - sbuf[2].value = 27.0; - - for (i = 0; i < 96; i++) - bbuf[i] = -3; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 3, 3, 6, 0, 0); - - i = SLJIT_CMP_F64; - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); - - while (1) { - /* bbuf[0] and bbuf[48] */ - test75_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR2, SLJIT_FR3); - /* bbuf[1] and bbuf[49] */ - test75_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[2] and bbuf[50] */ - test75_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[3] and bbuf[51] */ - test75_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[4] and bbuf[52] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR2, SLJIT_FR3); - /* bbuf[5] and bbuf[53] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[6] and bbuf[54] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[7] and bbuf[55] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[8] and bbuf[56] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR2, SLJIT_FR3); - /* bbuf[9] and bbuf[57] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR2, SLJIT_FR4); - /* bbuf[10] and bbuf[58] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR0, SLJIT_FR1); - /* bbuf[11] and bbuf[59] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[12] and bbuf[60] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[13] and bbuf[61] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR4, SLJIT_FR2); - /* bbuf[14] and bbuf[62] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[15] and bbuf[63] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[16] and bbuf[64] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR2, SLJIT_FR4); - /* bbuf[17] and bbuf[65] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR4, SLJIT_FR2); - /* bbuf[18] and bbuf[66] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR0, SLJIT_FR1); - /* bbuf[19] and bbuf[67] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[20] and bbuf[68] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[21] and bbuf[69] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR4, SLJIT_FR2); - /* bbuf[22] and bbuf[70] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[23] and bbuf[71] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[24] and bbuf[72] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[25] and bbuf[73] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR2, SLJIT_FR3); - /* bbuf[26] and bbuf[74] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[27] and bbuf[75] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[28] and bbuf[76] */ - test75_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR2, SLJIT_FR3); - /* bbuf[29] and bbuf[77] */ - test75_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[30] and bbuf[78] */ - test75_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[31] and bbuf[79] */ - test75_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[32] and bbuf[80] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR2, SLJIT_FR4); - /* bbuf[33] and bbuf[81] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR2, SLJIT_FR3); - /* bbuf[34] and bbuf[82] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR0, SLJIT_FR1); - /* bbuf[35] and bbuf[83] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[36] and bbuf[84] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR2, SLJIT_FR4); - /* bbuf[37] and bbuf[85] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR4, SLJIT_FR2); - /* bbuf[38] and bbuf[86] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[39] and bbuf[87] */ - test75_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[40] and bbuf[88] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR2, SLJIT_FR4); - /* bbuf[41] and bbuf[89] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR4, SLJIT_FR2); - /* bbuf[42] and bbuf[90] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR0, SLJIT_FR1); - /* bbuf[43] and bbuf[91] */ - test75_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR0, SLJIT_FR2); - - /* bbuf[44] and bbuf[92] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR2, SLJIT_FR3); - /* bbuf[45] and bbuf[93] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR4, SLJIT_FR2); - /* bbuf[46] and bbuf[94] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR0, SLJIT_FR1); - /* bbuf[47] and bbuf[95] */ - test75_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR0, SLJIT_FR2); - - if (i == SLJIT_CMP_F32) - break; - - i = SLJIT_CMP_F32; - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32)); - } - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func3((sljit_sw)&bbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); - - /* SLJIT_CMP_F64 */ - FAILED(bbuf[0] != 1, "test75 case 1 failed\n"); - FAILED(bbuf[1] != 2, "test75 case 2 failed\n"); - FAILED(bbuf[2] != 2, "test75 case 3 failed\n"); - FAILED(bbuf[3] != 2, "test75 case 4 failed\n"); - - FAILED(bbuf[4] != 2, "test75 case 5 failed\n"); - FAILED(bbuf[5] != 1, "test75 case 6 failed\n"); - FAILED(bbuf[6] != 1, "test75 case 7 failed\n"); - FAILED(bbuf[7] != 1, "test75 case 8 failed\n"); - - FAILED(bbuf[8] != 2, "test75 case 9 failed\n"); - FAILED(bbuf[9] != 1, "test75 case 10 failed\n"); - FAILED(bbuf[10] != 2, "test75 case 11 failed\n"); - FAILED(bbuf[11] != 2, "test75 case 12 failed\n"); - - FAILED(bbuf[12] != 2, "test75 case 13 failed\n"); - FAILED(bbuf[13] != 1, "test75 case 14 failed\n"); - FAILED(bbuf[14] != 1, "test75 case 15 failed\n"); - FAILED(bbuf[15] != 1, "test75 case 16 failed\n"); - - FAILED(bbuf[16] != 2, "test75 case 17 failed\n"); - FAILED(bbuf[17] != 1, "test75 case 18 failed\n"); - FAILED(bbuf[18] != 2, "test75 case 19 failed\n"); - FAILED(bbuf[19] != 2, "test75 case 20 failed\n"); - - FAILED(bbuf[20] != 1, "test75 case 21 failed\n"); - FAILED(bbuf[21] != 2, "test75 case 22 failed\n"); - FAILED(bbuf[22] != 1, "test75 case 23 failed\n"); - FAILED(bbuf[23] != 1, "test75 case 24 failed\n"); - - FAILED(bbuf[24] != 2, "test75 case 25 failed\n"); - FAILED(bbuf[25] != 1, "test75 case 26 failed\n"); - FAILED(bbuf[26] != 1, "test75 case 27 failed\n"); - FAILED(bbuf[27] != 1, "test75 case 28 failed\n"); - - FAILED(bbuf[28] != 2, "test75 case 29 failed\n"); - FAILED(bbuf[29] != 1, "test75 case 30 failed\n"); - FAILED(bbuf[30] != 2, "test75 case 31 failed\n"); - FAILED(bbuf[31] != 2, "test75 case 32 failed\n"); - - FAILED(bbuf[32] != 1, "test75 case 33 failed\n"); - FAILED(bbuf[33] != 2, "test75 case 34 failed\n"); - FAILED(bbuf[34] != 1, "test75 case 35 failed\n"); - FAILED(bbuf[35] != 1, "test75 case 36 failed\n"); - - FAILED(bbuf[36] != 2, "test75 case 37 failed\n"); - FAILED(bbuf[37] != 1, "test75 case 38 failed\n"); - FAILED(bbuf[38] != 2, "test75 case 39 failed\n"); - FAILED(bbuf[39] != 2, "test75 case 40 failed\n"); - - FAILED(bbuf[40] != 2, "test75 case 41 failed\n"); - FAILED(bbuf[41] != 1, "test75 case 42 failed\n"); - FAILED(bbuf[42] != 1, "test75 case 43 failed\n"); - FAILED(bbuf[43] != 1, "test75 case 44 failed\n"); - - FAILED(bbuf[44] != 1, "test75 case 45 failed\n"); - FAILED(bbuf[45] != 2, "test75 case 46 failed\n"); - FAILED(bbuf[46] != 2, "test75 case 47 failed\n"); - FAILED(bbuf[47] != 2, "test75 case 48 failed\n"); - - /* SLJIT_CMP_F32 */ - FAILED(bbuf[48] != 1, "test75 case 49 failed\n"); - FAILED(bbuf[49] != 2, "test75 case 50 failed\n"); - FAILED(bbuf[50] != 2, "test75 case 51 failed\n"); - FAILED(bbuf[51] != 2, "test75 case 52 failed\n"); - - FAILED(bbuf[52] != 2, "test75 case 53 failed\n"); - FAILED(bbuf[53] != 1, "test75 case 54 failed\n"); - FAILED(bbuf[54] != 1, "test75 case 55 failed\n"); - FAILED(bbuf[55] != 1, "test75 case 56 failed\n"); - - FAILED(bbuf[56] != 2, "test75 case 57 failed\n"); - FAILED(bbuf[57] != 1, "test75 case 58 failed\n"); - FAILED(bbuf[58] != 2, "test75 case 59 failed\n"); - FAILED(bbuf[59] != 2, "test75 case 60 failed\n"); - - FAILED(bbuf[60] != 2, "test75 case 61 failed\n"); - FAILED(bbuf[61] != 1, "test75 case 62 failed\n"); - FAILED(bbuf[62] != 1, "test75 case 63 failed\n"); - FAILED(bbuf[63] != 1, "test75 case 64 failed\n"); - - FAILED(bbuf[64] != 2, "test75 case 65 failed\n"); - FAILED(bbuf[65] != 1, "test75 case 66 failed\n"); - FAILED(bbuf[66] != 2, "test75 case 67 failed\n"); - FAILED(bbuf[67] != 2, "test75 case 68 failed\n"); - - FAILED(bbuf[68] != 1, "test75 case 69 failed\n"); - FAILED(bbuf[69] != 2, "test75 case 70 failed\n"); - FAILED(bbuf[70] != 1, "test75 case 71 failed\n"); - FAILED(bbuf[71] != 1, "test75 case 72 failed\n"); - - FAILED(bbuf[72] != 2, "test75 case 73 failed\n"); - FAILED(bbuf[73] != 1, "test75 case 74 failed\n"); - FAILED(bbuf[74] != 1, "test75 case 75 failed\n"); - FAILED(bbuf[75] != 1, "test75 case 76 failed\n"); - - FAILED(bbuf[76] != 2, "test75 case 77 failed\n"); - FAILED(bbuf[77] != 1, "test75 case 78 failed\n"); - FAILED(bbuf[78] != 2, "test75 case 79 failed\n"); - FAILED(bbuf[79] != 2, "test75 case 80 failed\n"); - - FAILED(bbuf[80] != 1, "test75 case 81 failed\n"); - FAILED(bbuf[81] != 2, "test75 case 82 failed\n"); - FAILED(bbuf[82] != 1, "test75 case 83 failed\n"); - FAILED(bbuf[83] != 1, "test75 case 84 failed\n"); - - FAILED(bbuf[84] != 2, "test75 case 85 failed\n"); - FAILED(bbuf[85] != 1, "test75 case 86 failed\n"); - FAILED(bbuf[86] != 2, "test75 case 87 failed\n"); - FAILED(bbuf[87] != 2, "test75 case 88 failed\n"); - - FAILED(bbuf[88] != 2, "test75 case 89 failed\n"); - FAILED(bbuf[89] != 1, "test75 case 90 failed\n"); - FAILED(bbuf[90] != 1, "test75 case 91 failed\n"); - FAILED(bbuf[91] != 1, "test75 case 92 failed\n"); - - FAILED(bbuf[92] != 1, "test75 case 93 failed\n"); - FAILED(bbuf[93] != 2, "test75 case 94 failed\n"); - FAILED(bbuf[94] != 2, "test75 case 95 failed\n"); - FAILED(bbuf[95] != 2, "test75 case 96 failed\n"); - - successful_tests++; -} - -static void test76(void) -{ - /* Test register argument and keep saved registers. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump* jump; - sljit_sw buf[9]; - sljit_f64 dbuf[3]; - sljit_s32 i; - - if (verbose) - printf("Run test76\n"); - - for (i = 0; i < 9; i++) - buf[i] = -1; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 4, 2, 0, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 7945); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -9267); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 4309); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -8321); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6803); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -5497); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, W, W, W, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 2, 0, 0, 32); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[3-6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 6028); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4982); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1289); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 6028, "test76 case 1 failed\n"); - FAILED(buf[1] != 6803, "test76 case 2 failed\n"); - FAILED(buf[2] != -5497, "test76 case 3 failed\n"); - FAILED(buf[3] != 7945, "test76 case 4 failed\n"); - FAILED(buf[4] != -9267, "test76 case 5 failed\n"); - FAILED(buf[5] != 4309, "test76 case 6 failed\n"); - FAILED(buf[6] != -8321, "test76 case 7 failed\n"); - - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 4, 2, 0, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -2608); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4751); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 5740); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -9704); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -8749); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 9213); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, W, W, W, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 6, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_set_context(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 6, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[3-7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_sw), SLJIT_R2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -7351); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 3628); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != -7351, "test76 case 8 failed\n"); - FAILED(buf[1] != 3628, "test76 case 9 failed\n"); - FAILED(buf[2] != 9213, "test76 case 10 failed\n"); - FAILED(buf[3] != -8749, "test76 case 11 failed\n"); - FAILED(buf[4] != -2608, "test76 case 12 failed\n"); - FAILED(buf[5] != 4751, "test76 case 13 failed\n"); - FAILED(buf[6] != 5740, "test76 case 14 failed\n"); - FAILED(buf[7] != -9704, "test76 case 15 failed\n"); - FAILED(buf[8] != -1, "test76 case 16 failed\n"); - - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 4, 2, 0, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8653); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7245); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3610); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 4591); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -2865); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 2510); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(VOID, W, W, W, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[2-7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_S1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_sw), SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 6 * sizeof(sljit_sw), SLJIT_R2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 7 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 5789); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -9214); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 5789, "test76 case 17 failed\n"); - FAILED(buf[1] != -9214, "test76 case 18 failed\n"); - FAILED(buf[2] != -2865, "test76 case 19 failed\n"); - FAILED(buf[3] != 2510, "test76 case 20 failed\n"); - FAILED(buf[4] != 8653, "test76 case 21 failed\n"); - FAILED(buf[5] != 7245, "test76 case 22 failed\n"); - FAILED(buf[6] != -3610, "test76 case 23 failed\n"); - FAILED(buf[7] != 4591, "test76 case 24 failed\n"); - FAILED(buf[8] != -1, "test76 case 25 failed\n"); - - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 2, 3, 0, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6071); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -3817); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 9250); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0(W), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S1, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -6278); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1467); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 7150 - 1467); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 8413); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4892); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -7513); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, W, W, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 2, 0, 0, 256); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_R1, 0); - /* buf[7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R2, 0); - /* buf[8] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 6923); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 6923, "test76 case 26 failed\n"); - FAILED(buf[1] != 4892, "test76 case 27 failed\n"); - FAILED(buf[2] != -7513, "test76 case 28 failed\n"); - FAILED(buf[3] != 9250, "test76 case 29 failed\n"); - FAILED(buf[4] != 6071, "test76 case 30 failed\n"); - FAILED(buf[5] != -3817, "test76 case 31 failed\n"); - FAILED(buf[6] != -6278, "test76 case 32 failed\n"); - FAILED(buf[7] != 7150, "test76 case 33 failed\n"); - FAILED(buf[8] != 8413, "test76 case 34 failed\n"); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - dbuf[0] = 4061.25; - dbuf[1] = -3291.75; - dbuf[2] = 8703.5; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 2, 3, 3, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&dbuf); - /* dbuf[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R1), 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f64)); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_f64)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -8956); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 4381); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -5314); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, F64, F64, F64, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, F64, F64, F64, W_R), 1, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&dbuf); - /* dbuf[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_FR2, 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64), SLJIT_FR1, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2784); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 1503); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 2784, "test76 case 35 failed\n"); - FAILED(buf[1] != 1503, "test76 case 36 failed\n"); - FAILED(buf[2] != 4381, "test76 case 37 failed\n"); - FAILED(buf[3] != -5314, "test76 case 38 failed\n"); - FAILED(buf[4] != -8956, "test76 case 39 failed\n"); - FAILED(buf[5] != 1706, "test76 case 40 failed\n"); - FAILED(buf[6] != -1, "test76 case 41 failed\n"); - FAILED(dbuf[0] != 8703.5, "test76 case 42 failed\n"); - FAILED(dbuf[1] != 4061.25, "test76 case 43 failed\n"); - FAILED(dbuf[2] != -3291.75, "test76 case 44 failed\n"); - - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - dbuf[0] = 4061.25; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 3, 3, 1, 0, 0); - - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM0(), (sljit_sw)&dbuf); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8793); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -4027); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2910); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4619); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1502); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 5316); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(VOID, F64, W, W, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_sw), SLJIT_S2, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS4(VOID, F64, W_R, W_R, W_R), 3, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_sw), SLJIT_R0, 0); - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 6 * sizeof(sljit_sw), SLJIT_R1, 0); - /* buf[7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 7 * sizeof(sljit_sw), SLJIT_R2, 0); - - sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 7839); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -9215); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 7839, "test76 case 45 failed\n"); - FAILED(buf[1] != -9215, "test76 case 46 failed\n"); - FAILED(buf[2] != 5316, "test76 case 47 failed\n"); - FAILED(buf[3] != 4619, "test76 case 48 failed\n"); - FAILED(buf[4] != -1502, "test76 case 49 failed\n"); - FAILED(buf[5] != 8793, "test76 case 50 failed\n"); - FAILED(buf[6] != -4027, "test76 case 51 failed\n"); - FAILED(buf[7] != 2910, "test76 case 52 failed\n"); - FAILED(buf[8] != -1, "test76 case 53 failed\n"); - FAILED(dbuf[0] != -4061.25, "test76 case 54 failed\n"); - - /* Next test. */ - - for (i = 0; i < 9; i++) - buf[i] = -1; - - dbuf[0] = 4061.25; - dbuf[1] = -3291.75; - dbuf[2] = 8703.5; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 2, 3, 0, 0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 7869); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -5406); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 4951); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0(W), 1, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S1, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - /* dbuf[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R0), 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64)); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4713); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -2078); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, F64, F64, F64, W_R), 1, 0, 3, 0, 256); - - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&buf[6], SLJIT_R0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); - /* dbuf[0] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR2, 0); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR0, 0); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR1, 0); - - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5074); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != 5074, "test76 case 55 failed\n"); - FAILED(buf[1] != 4713, "test76 case 56 failed\n"); - FAILED(buf[2] != -2078, "test76 case 57 failed\n"); - FAILED(buf[3] != 4951, "test76 case 58 failed\n"); - FAILED(buf[4] != 7869, "test76 case 59 failed\n"); - FAILED(buf[5] != -5406, "test76 case 60 failed\n"); - FAILED(buf[6] != 1706, "test76 case 61 failed\n"); - FAILED(buf[7] != -1, "test76 case 62 failed\n"); - FAILED(dbuf[0] != 8703.5, "test76 case 63 failed\n"); - FAILED(dbuf[1] != 4061.25, "test76 case 64 failed\n"); - FAILED(dbuf[2] != -3291.75, "test76 case 65 failed\n"); - } + FAILED(wbuf[0] != 1, "test59 case 1 failed\n"); + FAILED(wbuf[1] != 1, "test59 case 2 failed\n"); + FAILED(wbuf[2] != 2, "test59 case 3 failed\n"); + FAILED(wbuf[3] != 1, "test59 case 4 failed\n"); + FAILED(wbuf[4] != 2, "test59 case 5 failed\n"); + FAILED(wbuf[5] != 1, "test59 case 6 failed\n"); + FAILED(wbuf[6] != 1, "test59 case 7 failed\n"); + FAILED(wbuf[7] != 1, "test59 case 8 failed\n"); + FAILED(wbuf[8] != 2, "test59 case 9 failed\n"); + FAILED(wbuf[9] != 2, "test59 case 10 failed\n"); + FAILED(wbuf[10] != 1, "test59 case 11 failed\n"); + FAILED(wbuf[11] != 2, "test59 case 12 failed\n"); + FAILED(wbuf[12] != 1, "test59 case 13 failed\n"); + FAILED(wbuf[13] != 1, "test59 case 14 failed\n"); + FAILED(wbuf[14] != 1, "test59 case 15 failed\n"); successful_tests++; } @@ -9158,7 +6031,7 @@ static int cmp_u8(const void *src1, sljit_sw offset, const void *src2, sljit_uw return 1; } -static void test77(void) +static void test60(void) { /* Test unaligned accesses. */ executable_code code; @@ -9175,7 +6048,7 @@ static void test77(void) SLJIT_ASSERT(((sljit_uw)bbuf & 0x7) == 0); if (verbose) - printf("Run test77\n"); + printf("Run test60\n"); for (i = 0; i < 13; i++) wbuf[i] = -3; @@ -9201,7 +6074,7 @@ static void test77(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P, P), 2, 2, 0, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 2, 2, 0, 0, 0); sljit_emit_mem(compiler, SLJIT_MOV_S8 | SLJIT_MEM_UNALIGNED, SLJIT_R0, SLJIT_MEM0(), (sljit_sw)bbuf); /* wbuf[1] */ @@ -9262,31 +6135,31 @@ static void test77(void) #endif /* SLJIT_UNALIGNED */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 18 >> 1); - sljit_emit_mem(compiler, SLJIT_MOV_S32 | SLJIT_MEM_UNALIGNED_16, SLJIT_R0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1); + sljit_emit_mem(compiler, SLJIT_MOV_S32 | SLJIT_MEM_ALIGNED_16, SLJIT_R0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1); /* wbuf[8] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_MEM0(), (sljit_sw)&ibuf); /* bbuf[18] */ - sljit_emit_mem(compiler, SLJIT_MOV_S32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_R0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1); + sljit_emit_mem(compiler, SLJIT_MOV_S32 | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_R0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1); - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_UNALIGNED_16, SLJIT_R0, SLJIT_MEM0(), (sljit_sw)bbuf + 22); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_ALIGNED_16, SLJIT_R0, SLJIT_MEM0(), (sljit_sw)bbuf + 22); /* wbuf[9] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R0, 0); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 0); /* bbuf[22] */ - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_R0, SLJIT_MEM0(), (sljit_sw)bbuf + 22); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_R0, SLJIT_MEM0(), (sljit_sw)bbuf + 22); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 128); - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_UNALIGNED_32, SLJIT_R0, SLJIT_MEM1(SLJIT_R0), -128 + 32); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_ALIGNED_32, SLJIT_R0, SLJIT_MEM1(SLJIT_R0), -128 + 32); /* wbuf[10] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R0, 0); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 128); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 0); /* bbuf[32] */ - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_32, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), -128 + 32); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_32, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), -128 + 32); sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_UNALIGNED, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 0); /* wbuf[11] */ @@ -9302,29 +6175,25 @@ static void test77(void) code.func2((sljit_sw)&wbuf, (sljit_sw)bbuf); - FAILED(wbuf[1] != -73, "test77 case 1 failed\n"); - FAILED(wbuf[2] != (sljit_u8)-73, "test77 case 2 failed\n"); - FAILED(bbuf[1] != -73, "test77 case 3 failed\n"); - FAILED(wbuf[3] != -28531, "test77 case 4 failed\n"); - FAILED(wbuf[4] != (sljit_u16)-28531, "test77 case 5 failed\n"); - FAILED(cmp_u8(bbuf, 3, hbuf, sizeof(sljit_s16)) != 1, "test77 case 6 failed\n"); - FAILED(wbuf[5] != -38512, "test77 case 7 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(wbuf[6] != (sljit_u32)-38512, "test77 case 8 failed\n"); -#else - FAILED(wbuf[6] != -38512, "test77 case 8 failed\n"); -#endif - FAILED(cmp_u8(bbuf, 5, ibuf, sizeof(sljit_s32)) != 1, "test77 case 9 failed\n"); - FAILED(wbuf[7] != -46870, "test77 case 10 failed\n"); - FAILED(cmp_u8(bbuf, 9, wbuf, sizeof(sljit_sw)) != 1, "test77 case 11 failed\n"); - FAILED(wbuf[8] != -38512, "test77 case 12 failed\n"); - FAILED(cmp_u8(bbuf, 18, ibuf, sizeof(sljit_s32)) != 1, "test77 case 13 failed\n"); - FAILED(wbuf[9] != -46870, "test77 case 14 failed\n"); - FAILED(cmp_u8(bbuf, 22, wbuf, sizeof(sljit_sw)) != 1, "test77 case 15 failed\n"); - FAILED(wbuf[10] != -46870, "test77 case 16 failed\n"); - FAILED(cmp_u8(bbuf, 32, wbuf, sizeof(sljit_sw)) != 1, "test77 case 17 failed\n"); - FAILED(wbuf[11] != -62945, "test77 case 18 failed\n"); - FAILED(wbuf[12] != (sljit_sw)&wbuf, "test77 case 19 failed\n"); + FAILED(wbuf[1] != -73, "test60 case 1 failed\n"); + FAILED(wbuf[2] != (sljit_u8)-73, "test60 case 2 failed\n"); + FAILED(bbuf[1] != -73, "test60 case 3 failed\n"); + FAILED(wbuf[3] != -28531, "test60 case 4 failed\n"); + FAILED(wbuf[4] != (sljit_u16)-28531, "test60 case 5 failed\n"); + FAILED(cmp_u8(bbuf, 3, hbuf, sizeof(sljit_s16)) != 1, "test60 case 6 failed\n"); + FAILED(wbuf[5] != -38512, "test60 case 7 failed\n"); + FAILED(wbuf[6] != WCONST((sljit_u32)-38512, -38512), "test60 case 8 failed\n"); + FAILED(cmp_u8(bbuf, 5, ibuf, sizeof(sljit_s32)) != 1, "test60 case 9 failed\n"); + FAILED(wbuf[7] != -46870, "test60 case 10 failed\n"); + FAILED(cmp_u8(bbuf, 9, wbuf, sizeof(sljit_sw)) != 1, "test60 case 11 failed\n"); + FAILED(wbuf[8] != -38512, "test60 case 12 failed\n"); + FAILED(cmp_u8(bbuf, 18, ibuf, sizeof(sljit_s32)) != 1, "test60 case 13 failed\n"); + FAILED(wbuf[9] != -46870, "test60 case 14 failed\n"); + FAILED(cmp_u8(bbuf, 22, wbuf, sizeof(sljit_sw)) != 1, "test60 case 15 failed\n"); + FAILED(wbuf[10] != -46870, "test60 case 16 failed\n"); + FAILED(cmp_u8(bbuf, 32, wbuf, sizeof(sljit_sw)) != 1, "test60 case 17 failed\n"); + FAILED(wbuf[11] != -62945, "test60 case 18 failed\n"); + FAILED(wbuf[12] != (sljit_sw)&wbuf, "test60 case 19 failed\n"); sljit_free_code(code.code, NULL); @@ -9349,7 +6218,7 @@ static void test77(void) compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sljit_emit_enter(compiler, 0, SLJIT_ARGS3(VOID, P, P, P), 1, 3, 1, 0, 0); + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 1, 3, 1, 0, 0); sljit_emit_fmem(compiler, SLJIT_MOV_F32 | SLJIT_MEM_UNALIGNED, SLJIT_FR0, SLJIT_MEM0(), (sljit_sw)bbuf + 1); /* sbuf[1] */ @@ -9376,35 +6245,35 @@ static void test77(void) sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 100000 + 5); #endif /* SLJIT_FPU_UNALIGNED */ - sljit_emit_fmem(compiler, SLJIT_MOV_F32 | SLJIT_MEM_UNALIGNED_16, SLJIT_FR0, SLJIT_MEM1(SLJIT_S2), 14); + sljit_emit_fmem(compiler, SLJIT_MOV_F32 | SLJIT_MEM_ALIGNED_16, SLJIT_FR0, SLJIT_MEM1(SLJIT_S2), 14); /* sbuf[2] */ sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_FR0, 0); sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); /* bbuf[14] */ - sljit_emit_fmem(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_FR0, SLJIT_MEM1(SLJIT_S2), 14); + sljit_emit_fmem(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_FR0, SLJIT_MEM1(SLJIT_S2), 14); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 18 >> 1); - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_UNALIGNED_16, SLJIT_FR0, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_ALIGNED_16, SLJIT_FR0, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); /* dbuf[2] */ sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); /* bbuf[18] */ - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_FR0, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_FR0, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S2, 0, SLJIT_IMM, 128); - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_UNALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -128 + 28); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_ALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -128 + 28); /* dbuf[3] */ sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); /* bbuf[28] */ - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -128 + 28); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -128 + 28); - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_UNALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_ALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); /* dbuf[4] */ - sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64)); + sljit_emit_fmem(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64)); sljit_emit_return_void(compiler); @@ -9414,17 +6283,17 @@ static void test77(void) code.func3((sljit_sw)&dbuf, (sljit_sw)&sbuf, (sljit_sw)bbuf); - FAILED(sbuf[1] != -8812.25, "test77 case 20 failed\n"); - FAILED(cmp_u8(bbuf, 1, sbuf, sizeof(sljit_f32)) != 1, "test77 case 21 failed\n"); - FAILED(dbuf[1] != 6897.75, "test77 case 22 failed\n"); - FAILED(cmp_u8(bbuf, 5, dbuf, sizeof(sljit_f64)) != 1, "test77 case 23 failed\n"); - FAILED(sbuf[2] != -8812.25, "test77 case 24 failed\n"); - FAILED(cmp_u8(bbuf, 14, sbuf, sizeof(sljit_f32)) != 1, "test77 case 25 failed\n"); - FAILED(dbuf[2] != 6897.75, "test77 case 26 failed\n"); - FAILED(cmp_u8(bbuf, 18, dbuf, sizeof(sljit_f64)) != 1, "test77 case 27 failed\n"); - FAILED(dbuf[3] != 6897.75, "test77 case 28 failed\n"); - FAILED(cmp_u8(bbuf, 28, dbuf, sizeof(sljit_f64)) != 1, "test77 case 29 failed\n"); - FAILED(dbuf[4] != -18046.5, "test77 case 30 failed\n"); + FAILED(sbuf[1] != -8812.25, "test60 case 20 failed\n"); + FAILED(cmp_u8(bbuf, 1, sbuf, sizeof(sljit_f32)) != 1, "test60 case 21 failed\n"); + FAILED(dbuf[1] != 6897.75, "test60 case 22 failed\n"); + FAILED(cmp_u8(bbuf, 5, dbuf, sizeof(sljit_f64)) != 1, "test60 case 23 failed\n"); + FAILED(sbuf[2] != -8812.25, "test60 case 24 failed\n"); + FAILED(cmp_u8(bbuf, 14, sbuf, sizeof(sljit_f32)) != 1, "test60 case 25 failed\n"); + FAILED(dbuf[2] != 6897.75, "test60 case 26 failed\n"); + FAILED(cmp_u8(bbuf, 18, dbuf, sizeof(sljit_f64)) != 1, "test60 case 27 failed\n"); + FAILED(dbuf[3] != 6897.75, "test60 case 28 failed\n"); + FAILED(cmp_u8(bbuf, 28, dbuf, sizeof(sljit_f64)) != 1, "test60 case 29 failed\n"); + FAILED(dbuf[4] != -18046.5, "test60 case 30 failed\n"); sljit_free_code(code.code, NULL); } @@ -9432,88 +6301,7 @@ static void test77(void) successful_tests++; } -static void test78(void) -{ - /* Test register register preservation in keep saveds mode. */ - executable_code code; - struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - sljit_sw buf[6 + SLJIT_NUMBER_OF_REGISTERS]; - struct sljit_jump* jump; - sljit_s32 i; - - if (verbose) - printf("Run test78\n"); - - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), SLJIT_NUMBER_OF_REGISTERS - 3, 3, 0, 0, 0); - - for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 8469 + 1805 * i); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 3671); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 2418); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 1597); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(VOID, W, W, W, W)); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 6), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 3 * sizeof(sljit_sw), SLJIT_S0, 0); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S1, 0); - /* buf[5] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S2, 0); - - for (i = 1; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), (6 + i) * (sljit_sw)sizeof(sljit_sw), SLJIT_R(i), 0); - - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS4(VOID, W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_set_context(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS4(VOID, W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); - - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 0), SLJIT_S0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 1), SLJIT_S1, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 2), SLJIT_S2, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6501); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 7149); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 5732); - - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS0(VOID)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM0(), 0); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS0(VOID), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE / 2); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - code.func0(); - - FAILED(buf[0] != 3671, "test78 case 1 failed\n"); - FAILED(buf[1] != 2418, "test78 case 2 failed\n"); - FAILED(buf[2] != 1597, "test78 case 3 failed\n"); - FAILED(buf[3] != 6501, "test78 case 4 failed\n"); - FAILED(buf[4] != 7149, "test78 case 5 failed\n"); - FAILED(buf[5] != 5732, "test78 case 6 failed\n"); - - for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) { - FAILED(buf[6 + i] != 8469 + 1805 * i, "test78 case 7 failed\n"); - } - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test79(void) +static void test61(void) { /* Test register pair movement. */ executable_code code; @@ -9524,7 +6312,7 @@ static void test79(void) sljit_s32 i; if (verbose) - printf("Run test79\n"); + printf("Run test61\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -9543,7 +6331,7 @@ static void test79(void) copy_u8(bbuf, 34, buf + 2, sizeof(sljit_sw)); copy_u8(bbuf, 34 + sizeof(sljit_sw), buf + 3, sizeof(sljit_sw)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W), 5, 5, 0, 0, 3 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W), 5, 5, 0, 0, 3 * sizeof(sljit_sw)); sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_LOAD, SLJIT_REG_PAIR(SLJIT_R0, SLJIT_R1), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)); /* buf[4] */ @@ -9624,10 +6412,10 @@ static void test79(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_IMM, -9035); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)bbuf + 18 - 0x7f0f); /* bbuf[18], buf[18] + sizeof(sljit_sw) */ - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_REG_PAIR(SLJIT_R4, SLJIT_S4), SLJIT_MEM1(SLJIT_R0), 0x7f0f); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_REG_PAIR(SLJIT_R4, SLJIT_S4), SLJIT_MEM1(SLJIT_R0), 0x7f0f); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)bbuf + 34 - 0xfff); - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_LOAD | SLJIT_MEM_UNALIGNED_16, SLJIT_REG_PAIR(SLJIT_S1, SLJIT_R0), SLJIT_MEM1(SLJIT_S1), 0xfff); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_LOAD | SLJIT_MEM_ALIGNED_16, SLJIT_REG_PAIR(SLJIT_S1, SLJIT_R0), SLJIT_MEM1(SLJIT_S1), 0xfff); /* buf[26] */ sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_S1, 0); /* buf[27] */ @@ -9650,7 +6438,7 @@ static void test79(void) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)bbuf + 50 + 0xfff); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -9035); /* bbuf[50], buf[50] + sizeof(sljit_sw) */ - sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED_16, SLJIT_REG_PAIR(SLJIT_R2, SLJIT_R3), SLJIT_MEM1(SLJIT_R2), -0xfff); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_ALIGNED_16, SLJIT_REG_PAIR(SLJIT_R2, SLJIT_R3), SLJIT_MEM1(SLJIT_R2), -0xfff); sljit_emit_return_void(compiler); @@ -9660,65 +6448,68 @@ static void test79(void) code.func1((sljit_sw)buf); - FAILED(buf[3] != (sljit_sw)bbuf + 50 + 0xfff, "test79 case 1 failed\n"); - FAILED(buf[4] != 3724, "test79 case 1 failed\n"); - FAILED(buf[5] != -9035, "test79 case 2 failed\n"); - FAILED(buf[6] != 5814, "test79 case 3 failed\n"); - FAILED(buf[7] != 7201, "test79 case 4 failed\n"); - FAILED(buf[8] != -5836, "test79 case 5 failed\n"); - FAILED(buf[9] != 3724, "test79 case 6 failed\n"); - FAILED(buf[10] != -9035, "test79 case 7 failed\n"); - FAILED(buf[11] != buf[3], "test79 case 8 failed\n"); - FAILED(buf[12] != -8402, "test79 case 9 failed\n"); - FAILED(buf[13] != 6257, "test79 case 10 failed\n"); - FAILED(buf[14] != 6139, "test79 case 11 failed\n"); - FAILED(buf[15] != -7049, "test79 case 12 failed\n"); - FAILED(buf[16] != -5836, "test79 case 13 failed\n"); - FAILED(buf[17] != 3724, "test79 case 14 failed\n"); - FAILED(buf[18] != 3724, "test79 case 15 failed\n"); - FAILED(buf[19] != -9035, "test79 case 16 failed\n"); - FAILED(buf[20] != 3065, "test79 case 17 failed\n"); - FAILED(buf[21] != 7481, "test79 case 18 failed\n"); - FAILED(buf[22] != 3275, "test79 case 19 failed\n"); - FAILED(buf[23] != -8714, "test79 case 20 failed\n"); - FAILED(buf[24] != -5836, "test79 case 21 failed\n"); - FAILED(buf[25] != 3724, "test79 case 22 failed\n"); - FAILED(cmp_u8(bbuf, 18, buf + 1, sizeof(sljit_sw)) != 1, "test79 case 23 failed\n"); - FAILED(cmp_u8(bbuf, 18 + sizeof(sljit_sw), buf + 2, sizeof(sljit_sw)) != 1, "test79 case 24 failed\n"); - FAILED(buf[26] != -9035, "test79 case 25 failed\n"); - FAILED(buf[27] != buf[3], "test79 case 26 failed\n"); - FAILED(buf[28] != -9035, "test79 case 27 failed\n"); - FAILED(buf[29] != buf[3], "test79 case 28 failed\n"); - FAILED(buf[30] != -5836, "test79 case 29 failed\n"); - FAILED(buf[31] != 3724, "test79 case 30 failed\n"); - FAILED(cmp_u8(bbuf, 50, buf + 3, sizeof(sljit_sw)) != 1, "test79 case 31 failed\n"); - FAILED(cmp_u8(bbuf, 50 + sizeof(sljit_sw), buf + 2, sizeof(sljit_sw)) != 1, "test79 case 32 failed\n"); - FAILED(buf[32] != -1, "test79 case 33 failed\n"); + FAILED(buf[3] != (sljit_sw)bbuf + 50 + 0xfff, "test61 case 1 failed\n"); + FAILED(buf[4] != 3724, "test61 case 2 failed\n"); + FAILED(buf[5] != -9035, "test61 case 3 failed\n"); + FAILED(buf[6] != 5814, "test61 case 4 failed\n"); + FAILED(buf[7] != 7201, "test61 case 5 failed\n"); + FAILED(buf[8] != -5836, "test61 case 6 failed\n"); + FAILED(buf[9] != 3724, "test61 case 7 failed\n"); + FAILED(buf[10] != -9035, "test61 case 8 failed\n"); + FAILED(buf[11] != buf[3], "test61 case 9 failed\n"); + FAILED(buf[12] != -8402, "test61 case 10 failed\n"); + FAILED(buf[13] != 6257, "test61 case 11 failed\n"); + FAILED(buf[14] != 6139, "test61 case 12 failed\n"); + FAILED(buf[15] != -7049, "test61 case 13 failed\n"); + FAILED(buf[16] != -5836, "test61 case 14 failed\n"); + FAILED(buf[17] != 3724, "test61 case 15 failed\n"); + FAILED(buf[18] != 3724, "test61 case 16 failed\n"); + FAILED(buf[19] != -9035, "test61 case 17 failed\n"); + FAILED(buf[20] != 3065, "test61 case 18 failed\n"); + FAILED(buf[21] != 7481, "test61 case 19 failed\n"); + FAILED(buf[22] != 3275, "test61 case 20 failed\n"); + FAILED(buf[23] != -8714, "test61 case 21 failed\n"); + FAILED(buf[24] != -5836, "test61 case 22 failed\n"); + FAILED(buf[25] != 3724, "test61 case 23 failed\n"); + FAILED(cmp_u8(bbuf, 18, buf + 1, sizeof(sljit_sw)) != 1, "test61 case 24 failed\n"); + FAILED(cmp_u8(bbuf, 18 + sizeof(sljit_sw), buf + 2, sizeof(sljit_sw)) != 1, "test61 case 25 failed\n"); + FAILED(buf[26] != -9035, "test61 case 26 failed\n"); + FAILED(buf[27] != buf[3], "test61 case 27 failed\n"); + FAILED(buf[28] != -9035, "test61 case 28 failed\n"); + FAILED(buf[29] != buf[3], "test61 case 29 failed\n"); + FAILED(buf[30] != -5836, "test61 case 30 failed\n"); + FAILED(buf[31] != 3724, "test61 case 31 failed\n"); + FAILED(cmp_u8(bbuf, 50, buf + 3, sizeof(sljit_sw)) != 1, "test61 case 32 failed\n"); + FAILED(cmp_u8(bbuf, 50 + sizeof(sljit_sw), buf + 2, sizeof(sljit_sw)) != 1, "test61 case 33 failed\n"); + FAILED(buf[32] != -1, "test61 case 34 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test80(void) +static void test62(void) { /* Test masked shift. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - sljit_sw buf[8]; + sljit_sw buf[9]; sljit_s32 ibuf[8]; sljit_s32 i; if (verbose) - printf("Run test80\n"); + printf("Run test62\n"); FAILED(!compiler, "cannot create compiler\n"); - for (i = 0; i < 8; i++) + for (i = 0; i < 9; i++) buf[i] = -1; for (i = 0; i < 8; i++) ibuf[i] = -1; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + buf[7] = 3; + ibuf[6] = 4; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x1234); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 8 * sizeof(sljit_sw) + 4); @@ -9781,17 +6572,22 @@ static void test80(void) /* buf[6] */ sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_NOT_ZERO); + /* buf[7] */ + sljit_emit_op2(compiler, SLJIT_MSHL, SLJIT_MEM0(), (sljit_sw)&buf[7], SLJIT_IMM, 0xa, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw)); + /* ibuf[6] */ + sljit_emit_op2(compiler, SLJIT_MLSHR32, SLJIT_MEM0(), (sljit_sw)&ibuf[6], SLJIT_IMM, 0xa5f, SLJIT_MEM0(), (sljit_sw)&ibuf[6]); + #if (defined SLJIT_MASKED_SHIFT && SLJIT_MASKED_SHIFT) sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 12344321); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (8 * sizeof(sljit_sw)) + 1); - /* buf[7] */ - sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_R2, 0); + /* buf[8] */ + sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_R2, 0); #endif /* SLJIT_MASKED_SHIFT */ #if (defined SLJIT_MASKED_SHIFT32 && SLJIT_MASKED_SHIFT32) sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 24688643); sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, (8 * sizeof(sljit_s32)) + 1); - /* ibuf[6] */ - sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_s32), SLJIT_R1, 0, SLJIT_R2, 0); + /* ibuf[7] */ + sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_s32), SLJIT_R1, 0, SLJIT_R2, 0); #endif /* SLJIT_MASKED_SHIFT32 */ sljit_emit_return_void(compiler); @@ -9802,432 +6598,33 @@ static void test80(void) code.func2((sljit_sw)buf, (sljit_sw)ibuf); - FAILED(buf[0] != 0x12340, "test80 case 1 failed\n"); - FAILED(buf[1] != 0x1234, "test80 case 2 failed\n"); - FAILED(ibuf[0] != 0x567800, "test80 case 3 failed\n"); - FAILED(ibuf[1] != (sljit_sw)1 << 30, "test80 case 4 failed\n"); - FAILED(buf[2] != 1, "test80 case 5 failed\n"); - FAILED(buf[3] != ((sljit_uw)-1 >> 4), "test80 case 6 failed\n"); - FAILED(buf[4] != 1, "test80 case 7 failed\n"); - FAILED(ibuf[2] != 0x5678, "test80 case 8 failed\n"); - FAILED(ibuf[3] != 0x34567, "test80 case 9 failed\n"); - FAILED(buf[5] != -0x10, "test80 case 10 failed\n"); - FAILED(ibuf[4] != -0x80, "test80 case 11 failed\n"); - FAILED(ibuf[5] != 0, "test80 case 12 failed\n"); - FAILED(buf[6] != 0, "test80 case 13 failed\n"); + FAILED(buf[0] != 0x12340, "test62 case 1 failed\n"); + FAILED(buf[1] != 0x1234, "test62 case 2 failed\n"); + FAILED(ibuf[0] != 0x567800, "test62 case 3 failed\n"); + FAILED(ibuf[1] != (sljit_sw)1 << 30, "test62 case 4 failed\n"); + FAILED(buf[2] != 1, "test62 case 5 failed\n"); + FAILED(buf[3] != ((sljit_uw)-1 >> 4), "test62 case 6 failed\n"); + FAILED(buf[4] != 1, "test62 case 7 failed\n"); + FAILED(ibuf[2] != 0x5678, "test62 case 8 failed\n"); + FAILED(ibuf[3] != 0x34567, "test62 case 9 failed\n"); + FAILED(buf[5] != -0x10, "test62 case 10 failed\n"); + FAILED(ibuf[4] != -0x80, "test62 case 11 failed\n"); + FAILED(ibuf[5] != 0, "test62 case 12 failed\n"); + FAILED(buf[6] != 0, "test62 case 13 failed\n"); + FAILED(buf[7] != 0x50, "test62 case 14 failed\n"); + FAILED(ibuf[6] != 0xa5, "test62 case 15 failed\n"); #if (defined SLJIT_MASKED_SHIFT && SLJIT_MASKED_SHIFT) - FAILED(buf[7] != 24688642, "test80 case 14 failed\n"); + FAILED(buf[8] != 24688642, "test62 case 16 failed\n"); #endif /* SLJIT_MASKED_SHIFT */ #if (defined SLJIT_MASKED_SHIFT32 && SLJIT_MASKED_SHIFT32) - FAILED(ibuf[6] != 12344321, "test80 case 15 failed\n"); + FAILED(ibuf[7] != 12344321, "test62 case 17 failed\n"); #endif /* SLJIT_MASKED_SHIFT32 */ sljit_free_code(code.code, NULL); successful_tests++; } -static void test81(void) -{ - /* Test return with floating point value. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump* jump; - sljit_f64 dbuf[2]; - sljit_f32 sbuf[2]; - - if (verbose) - printf("Run test81\n"); - - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test81 skipped\n"); - successful_tests++; - return; - } - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F64, W), 0, 1, 3, 0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - dbuf[0] = 35.125; - FAILED(code.test81_f2((sljit_sw)dbuf) != 35.125, "test81 case 1 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F32, W), 0, 1, 1, 0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - sbuf[0] = -9027.5; - FAILED(code.test81_f1((sljit_sw)sbuf) != -9027.5, "test81 case 2 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F32, W), 0, 1, 1, 0, sizeof(sljit_f32)); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - sbuf[0] = -6.75; - FAILED(code.test81_f1((sljit_sw)sbuf) != -6.75, "test81 case 3 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F64, W), 0, 1, 1, 0, 2 * sizeof(sljit_f64)); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64)); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - dbuf[0] = 45.125; - FAILED(code.test81_f2((sljit_sw)dbuf) != 45.125, "test81 case 4 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 1, 0, 1, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)dbuf - 33); - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(F64, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)dbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_RETURN_FREG, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS1(F64, W_R), 1, 0, 1, 0, 0); - sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 33); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - dbuf[0] = 2571.75; - dbuf[1] = 0; - code.func0(); - FAILED(dbuf[1] != 2571.75, "test81 case 5 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 1, 0, 1, 0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(F32)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)sbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_RETURN_FREG, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS0(F32), 0, 0, 1, 0, 0); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0, SLJIT_MEM0(), (sljit_sw)sbuf); - sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - sbuf[0] = 6310.25; - sbuf[1] = 0; - code.func0(); - FAILED(sbuf[1] != 6310.25, "test81 case 6 failed\n"); - - sljit_free_code(code.code, NULL); - - successful_tests++; -} - -static void test82(void) -{ - /* Test return_to operation. */ - executable_code code, code2; - struct sljit_compiler* compiler; - struct sljit_jump* jump; - struct sljit_label* label; - sljit_s32 i; - sljit_sw buf[3]; - - if (verbose) - printf("Run test82\n"); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 2, 1, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -7602); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - label = sljit_emit_label(compiler); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); - sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W_R, W_R), 2, 0, 0, 0, 256); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 256 - sizeof(sljit_sw), SLJIT_IMM, -1); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 8945); - sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_R1), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - buf[0] = (sljit_sw)sljit_get_label_addr(label); - buf[1] = 0; - - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - FAILED(buf[0] != 8945, "test82 case 1 failed\n"); - FAILED(buf[1] != -7602, "test82 case 2 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - for (i = 0; i < 3; i++) { - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 2, 1, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 6032); - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(W, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - label = sljit_emit_label(compiler); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_RETURN_REG, 0); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S0, 0); - sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS1(VOID, W_R), 2, i == 1 ? 2 : 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_R0, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw)); - if (i == 2) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0); - else - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), SLJIT_MAX_LOCAL_SIZE - sizeof(sljit_sw), SLJIT_IMM, -1); - if (i != 0) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -3890); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 7145); - if (i == 2) - sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_sw)); - else - sljit_emit_return_to(compiler, SLJIT_S(i), 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - buf[0] = (sljit_sw)sljit_get_label_addr(label); - buf[1] = 0; - buf[2] = 0; - - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - FAILED(buf[0] != 7145, "test82 case 3 failed\n"); - FAILED(buf[1] != 6032, "test82 case 4 failed\n"); - if (i != 0) - FAILED(buf[2] != -3890, "test82 case 5 failed\n"); - - sljit_free_code(code.code, NULL); - } - - /* Next test. */ - - for (i = 0; i < 3; i++) { - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P_R), 2, 1, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_R0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1(W, W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - label = sljit_emit_label(compiler); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)buf); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); - sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W_R), 2, 1, 0, 0, (i == 0) ? 0 : (i == 1) ? 512 : 32768); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0x1000); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -4502); - sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_R1), -0x1000); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - buf[0] = (sljit_sw)sljit_get_label_addr(label); - buf[1] = 0; - - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - FAILED(buf[0] != -4502, "test82 case 6 failed\n"); - FAILED(buf[1] != (sljit_sw)buf, "test82 case 7 failed\n"); - - sljit_free_code(code.code, NULL); - } - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - -#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - i = SLJIT_S2; -#else - i = SLJIT_S(SLJIT_NUMBER_OF_SAVED_REGISTERS - 1); -#endif - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, P), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, i, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - label = sljit_emit_label(compiler); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_S0, i), 0, SLJIT_RETURN_REG, 0); - sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 16); - for (i = 0; i < SLJIT_NUMBER_OF_SAVED_REGISTERS; i++) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_IMM, -1); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, (sljit_sw)(buf + 3)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -3); - sljit_emit_return_to(compiler, SLJIT_MEM2(SLJIT_RETURN_REG, SLJIT_R1), SLJIT_WORD_SHIFT); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - buf[0] = (sljit_sw)sljit_get_label_addr(label); - buf[1] = 0; - buf[2] = 0; - - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - FAILED(buf[2] != (sljit_sw)(buf + 3), "test82 case 8 failed\n"); - - sljit_free_code(code.code, NULL); - - /* Next test. */ - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, P_R, P), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 586000); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 392); - sljit_emit_icall(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W), SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - label = sljit_emit_label(compiler); - /* buf[0] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_S0, 0, SLJIT_S1, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_RETURN_REG, 0); - sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - - buf[0] = (sljit_sw)sljit_get_label_addr(label); - - sljit_free_compiler(compiler); - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0(VOID), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 16); - for (i = 2; i < SLJIT_NUMBER_OF_SAVED_REGISTERS; i++) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_IMM, -1); - /* buf[2] */ - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM0(), (sljit_sw)(buf + 2), SLJIT_S0, 0, SLJIT_S1, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 416000); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 931); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 2906); - sljit_emit_return_to(compiler, SLJIT_IMM, buf[0]); - - code2.code = sljit_generate_code(compiler); - CHECK(compiler); - sljit_free_compiler(compiler); - - buf[0] = 0; - buf[1] = 0; - buf[2] = 0; - - code.func2(SLJIT_FUNC_ADDR(code2.func0), (sljit_sw)buf); - FAILED(buf[0] != 416931, "test82 case 9 failed\n"); - FAILED(buf[1] != 2906, "test82 case 10 failed\n"); - FAILED(buf[2] != 586392, "test82 case 11 failed\n"); - - sljit_free_code(code.code, NULL); - sljit_free_code(code2.code, NULL); - - successful_tests++; -} - -static void test83(void) +static void test63(void) { /* Test rotate. */ executable_code code; @@ -10242,7 +6639,7 @@ static void test83(void) #endif if (verbose) - printf("Run test83\n"); + printf("Run test63\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -10253,7 +6650,7 @@ static void test83(void) ibuf[0] = 8; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, WCONST(0x1234567812345678, 0x12345678)); sljit_emit_op1(compiler, SLJIT_MOV, shift_reg, 0, SLJIT_IMM, 12); @@ -10363,33 +6760,33 @@ static void test83(void) code.func2((sljit_sw)buf, (sljit_sw)ibuf); - FAILED(buf[0] != WCONST(0x4567812345678123, 0x45678123), "test83 case 1 failed\n"); - FAILED(buf[1] != WCONST(0xfdb974130eca8643, 0xeca8643), "test83 case 2 failed\n"); - FAILED(buf[2] != WCONST(0xfedcba0987654321, 0x87654321), "test83 case 3 failed\n"); - FAILED(buf[3] != WCONST(0xcc3b2a190855e6f7, 0xc3b2a190), "test83 case 4 failed\n"); - FAILED(buf[4] != WCONST(0x9876543210abcdc0, 0x876543e0), "test83 case 5 failed\n"); - FAILED(buf[5] != WCONST(0x8123456781234567, 0x81234567), "test83 case 6 failed\n"); - FAILED(buf[6] != WCONST(0x4567812345678123, 0x45678123), "test83 case 7 failed\n"); - FAILED(buf[7] != WCONST(0x891a2b3c43b2a1a0, 0x8bb2a190), "test83 case 8 failed\n"); - FAILED(buf[8] != WCONST(0xfedcba0987654321, 0x87654321), "test83 case 9 failed\n"); - FAILED(buf[9] != WCONST(0xfedcba0987654321, 0x87654321), "test83 case 10 failed\n"); - FAILED(ibuf[0] != (sljit_s32)0x65432187, "test83 case 11 failed\n"); - FAILED(buf[10] != -7834, "test83 case 12 failed\n"); - FAILED(ibuf[1] != (sljit_s32)0x57913bdf, "test83 case 13 failed\n"); - FAILED(ibuf[2] != (sljit_s32)0xabc89def, "test83 case 14 failed\n"); - FAILED(ibuf[3] != (sljit_s32)0xabc89def, "test83 case 15 failed\n"); - FAILED(buf[11] != -6512, "test83 case 16 failed\n"); - FAILED(ibuf[4] != (sljit_s32)0x1d950c86, "test83 case 17 failed\n"); - FAILED(ibuf[5] != (sljit_s32)0xffedccde, "test83 case 18 failed\n"); - FAILED(ibuf[6] != (sljit_s32)0x89abcdef, "test83 case 19 failed\n"); - FAILED(ibuf[7] != (sljit_s32)0x89abcde0, "test83 case 20 failed\n"); - FAILED(buf[12] != -2647, "test83 case 21 failed\n"); + FAILED(buf[0] != WCONST(0x4567812345678123, 0x45678123), "test63 case 1 failed\n"); + FAILED(buf[1] != WCONST(0xfdb974130eca8643, 0xeca8643), "test63 case 2 failed\n"); + FAILED(buf[2] != WCONST(0xfedcba0987654321, 0x87654321), "test63 case 3 failed\n"); + FAILED(buf[3] != WCONST(0xcc3b2a190855e6f7, 0xc3b2a190), "test63 case 4 failed\n"); + FAILED(buf[4] != WCONST(0x9876543210abcdc0, 0x876543e0), "test63 case 5 failed\n"); + FAILED(buf[5] != WCONST(0x8123456781234567, 0x81234567), "test63 case 6 failed\n"); + FAILED(buf[6] != WCONST(0x4567812345678123, 0x45678123), "test63 case 7 failed\n"); + FAILED(buf[7] != WCONST(0x891a2b3c43b2a1a0, 0x8bb2a190), "test63 case 8 failed\n"); + FAILED(buf[8] != WCONST(0xfedcba0987654321, 0x87654321), "test63 case 9 failed\n"); + FAILED(buf[9] != WCONST(0xfedcba0987654321, 0x87654321), "test63 case 10 failed\n"); + FAILED(ibuf[0] != (sljit_s32)0x65432187, "test63 case 11 failed\n"); + FAILED(buf[10] != -7834, "test63 case 12 failed\n"); + FAILED(ibuf[1] != (sljit_s32)0x57913bdf, "test63 case 13 failed\n"); + FAILED(ibuf[2] != (sljit_s32)0xabc89def, "test63 case 14 failed\n"); + FAILED(ibuf[3] != (sljit_s32)0xabc89def, "test63 case 15 failed\n"); + FAILED(buf[11] != -6512, "test63 case 16 failed\n"); + FAILED(ibuf[4] != (sljit_s32)0x1d950c86, "test63 case 17 failed\n"); + FAILED(ibuf[5] != (sljit_s32)0xffedccde, "test63 case 18 failed\n"); + FAILED(ibuf[6] != (sljit_s32)0x89abcdef, "test63 case 19 failed\n"); + FAILED(ibuf[7] != (sljit_s32)0x89abcde0, "test63 case 20 failed\n"); + FAILED(buf[12] != -2647, "test63 case 21 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test84(void) +static void test64(void) { /* Test "shift into". */ executable_code code; @@ -10404,7 +6801,7 @@ static void test84(void) #endif if (verbose) - printf("Run test84\n"); + printf("Run test64\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -10413,7 +6810,7 @@ static void test84(void) for (i = 0; i < 10; i++) ibuf[i] = -1; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, WCONST(0x1234567812345678, 0x12345678)); sljit_emit_op1(compiler, SLJIT_MOV, shift_reg, 0, SLJIT_IMM, 12); @@ -10589,45 +6986,45 @@ static void test84(void) code.func2((sljit_sw)buf, (sljit_sw)ibuf); - FAILED(buf[0] != WCONST(0x4567812345678123, 0x45678123), "test84 case 1 failed\n"); - FAILED(buf[1] != WCONST(0x4567812345678123, 0x45678123), "test84 case 2 failed\n"); - FAILED(ibuf[0] != 0x109abc32, "test84 case 3 failed\n"); - FAILED(ibuf[1] != 0x13579bdf, "test84 case 4 failed\n"); - FAILED(buf[2] != -8762, "test84 case 5 failed\n"); - FAILED(buf[3] != WCONST(0x4567812345678abc, 0x45678abc), "test84 case 6 failed\n"); - FAILED(buf[4] != WCONST(0xdb975557799bbddf, 0xdb975579), "test84 case 7 failed\n"); - FAILED(buf[5] != WCONST(0xfdb974130eca8642, 0xfdb97412), "test84 case 8 failed\n"); - FAILED(ibuf[2] != (sljit_s32)0xdb97413b, "test84 case 9 failed\n"); - FAILED(ibuf[3] != (sljit_s32)0xcd6543c9, "test84 case 10 failed\n"); - FAILED(ibuf[4] != (sljit_s32)0xaf95b95a, "test84 case 11 failed\n"); - FAILED(buf[6] != -6032, "test84 case 12 failed\n"); - FAILED(buf[7] != -9740, "test84 case 13 failed\n"); - FAILED(buf[8] != -5182, "test84 case 14 failed\n"); - FAILED(ibuf[5] != -4072, "test84 case 15 failed\n"); - FAILED(ibuf[6] != -2813, "test84 case 16 failed\n"); - FAILED(buf[9] != -3278, "test84 case 17 failed\n"); - FAILED(buf[10] != WCONST(0x34567890abcdef12, 0x34567812), "test84 case 18 failed\n"); - FAILED(buf[11] != WCONST(0xefba9876fedcba98, 0x78fedcba), "test84 case 19 failed\n"); - FAILED(buf[12] != WCONST(0x1234567890abcdef, 0x12345678), "test84 case 20 failed\n"); - FAILED(buf[13] != -4986, "test84 case 21 failed\n"); - FAILED(buf[14] != WCONST(0x2468acf1fdb97413, 0x24690ecb), "test84 case 22 failed\n"); - FAILED(buf[15] != WCONST(0x12345678fedcba09, 0x12348765), "test84 case 23 failed\n"); - FAILED(buf[16] != 0x30, "test84 case 24 failed\n"); - FAILED(buf[17] != WCONST(0x8d159e248d159e27, 0x8d159e27), "test84 case 25 failed\n"); - FAILED(ibuf[7] != (sljit_s32)0xbc23456e, "test84 case 26 failed\n"); - FAILED(ibuf[8] != (sljit_s32)0xeabc2345, "test84 case 27 failed\n"); + FAILED(buf[0] != WCONST(0x4567812345678123, 0x45678123), "test64 case 1 failed\n"); + FAILED(buf[1] != WCONST(0x4567812345678123, 0x45678123), "test64 case 2 failed\n"); + FAILED(ibuf[0] != 0x109abc32, "test64 case 3 failed\n"); + FAILED(ibuf[1] != 0x13579bdf, "test64 case 4 failed\n"); + FAILED(buf[2] != -8762, "test64 case 5 failed\n"); + FAILED(buf[3] != WCONST(0x4567812345678abc, 0x45678abc), "test64 case 6 failed\n"); + FAILED(buf[4] != WCONST(0xdb975557799bbddf, 0xdb975579), "test64 case 7 failed\n"); + FAILED(buf[5] != WCONST(0xfdb974130eca8642, 0xfdb97412), "test64 case 8 failed\n"); + FAILED(ibuf[2] != (sljit_s32)0xdb97413b, "test64 case 9 failed\n"); + FAILED(ibuf[3] != (sljit_s32)0xcd6543c9, "test64 case 10 failed\n"); + FAILED(ibuf[4] != (sljit_s32)0xaf95b95a, "test64 case 11 failed\n"); + FAILED(buf[6] != -6032, "test64 case 12 failed\n"); + FAILED(buf[7] != -9740, "test64 case 13 failed\n"); + FAILED(buf[8] != -5182, "test64 case 14 failed\n"); + FAILED(ibuf[5] != -4072, "test64 case 15 failed\n"); + FAILED(ibuf[6] != -2813, "test64 case 16 failed\n"); + FAILED(buf[9] != -3278, "test64 case 17 failed\n"); + FAILED(buf[10] != WCONST(0x34567890abcdef12, 0x34567812), "test64 case 18 failed\n"); + FAILED(buf[11] != WCONST(0xefba9876fedcba98, 0x78fedcba), "test64 case 19 failed\n"); + FAILED(buf[12] != WCONST(0x1234567890abcdef, 0x12345678), "test64 case 20 failed\n"); + FAILED(buf[13] != -4986, "test64 case 21 failed\n"); + FAILED(buf[14] != WCONST(0x2468acf1fdb97413, 0x24690ecb), "test64 case 22 failed\n"); + FAILED(buf[15] != WCONST(0x12345678fedcba09, 0x12348765), "test64 case 23 failed\n"); + FAILED(buf[16] != 0x30, "test64 case 24 failed\n"); + FAILED(buf[17] != WCONST(0x8d159e248d159e27, 0x8d159e27), "test64 case 25 failed\n"); + FAILED(ibuf[7] != (sljit_s32)0xbc23456e, "test64 case 26 failed\n"); + FAILED(ibuf[8] != (sljit_s32)0xeabc2345, "test64 case 27 failed\n"); #if (defined SLJIT_MASKED_SHIFT && SLJIT_MASKED_SHIFT) - FAILED(buf[18] != 24688643, "test84 case 28 failed\n"); + FAILED(buf[18] != 24688643, "test64 case 28 failed\n"); #endif /* SLJIT_MASKED_SHIFT */ #if (defined SLJIT_MASKED_SHIFT32 && SLJIT_MASKED_SHIFT32) - FAILED(ibuf[9] != (sljit_s32)-2135139327, "test84 case 29 failed\n"); + FAILED(ibuf[9] != (sljit_s32)-2135139327, "test64 case 29 failed\n"); #endif /* SLJIT_MASKED_SHIFT32 */ sljit_free_code(code.code, NULL); successful_tests++; } -static void test85(void) +static void test65(void) { /* Test count trailing zeroes. */ executable_code code; @@ -10637,7 +7034,7 @@ static void test85(void) sljit_s32 i; if (verbose) - printf("Run test85\n"); + printf("Run test65\n"); FAILED(!compiler, "cannot create compiler\n"); @@ -10649,7 +7046,7 @@ static void test85(void) buf[2] = 0; ibuf[3] = 1; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x80); /* buf[0] */ @@ -10706,195 +7103,35 @@ static void test85(void) code.func2((sljit_sw)buf, (sljit_sw)ibuf); - FAILED(buf[0] != 7, "test85 case 1 failed\n"); - FAILED(buf[1] != 0, "test85 case 2 failed\n"); - FAILED(buf[2] != WCONST(64, 32), "test85 case 3 failed\n"); - FAILED(buf[3] != WCONST(61, 29), "test85 case 4 failed\n"); - FAILED(buf[4] != 11, "test85 case 5 failed\n"); - FAILED(ibuf[0] != 6, "test85 case 6 failed\n"); - FAILED(ibuf[1] != 32, "test85 case 7 failed\n"); - FAILED(ibuf[2] != 5, "test85 case 8 failed\n"); - FAILED(ibuf[3] != 0, "test85 case 9 failed\n"); + FAILED(buf[0] != 7, "test65 case 1 failed\n"); + FAILED(buf[1] != 0, "test65 case 2 failed\n"); + FAILED(buf[2] != WCONST(64, 32), "test65 case 3 failed\n"); + FAILED(buf[3] != WCONST(61, 29), "test65 case 4 failed\n"); + FAILED(buf[4] != 11, "test65 case 5 failed\n"); + FAILED(ibuf[0] != 6, "test65 case 6 failed\n"); + FAILED(ibuf[1] != 32, "test65 case 7 failed\n"); + FAILED(ibuf[2] != 5, "test65 case 8 failed\n"); + FAILED(ibuf[3] != 0, "test65 case 9 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test86(void) -{ - /* Test get return address. */ - executable_code code; - struct sljit_compiler* compiler; - struct sljit_jump *jump; - struct sljit_label *label; - sljit_uw return_addr = 0; - sljit_uw buf[1]; - - if (verbose) - printf("Run test86\n"); - - /* Next test. */ - - buf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W), 1, 1, 0, 0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); - label = sljit_emit_label(compiler); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 0, 0, 0, 0); - sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_RETURN_REG, 0); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - return_addr = sljit_get_label_addr(label); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - - FAILED(buf[0] != return_addr, "test86 case 1 failed\n"); - sljit_free_code(code.code, NULL); - - /* Next test. */ - - buf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(VOID), 2, 0, 0, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -1); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(VOID, W, W)); - label = sljit_emit_label(compiler); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS - 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); - sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM0(), (sljit_sw)buf); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - return_addr = sljit_get_label_addr(label); - sljit_free_compiler(compiler); - - code.func0(); - - FAILED(buf[0] != return_addr, "test86 case 2 failed\n"); - sljit_free_code(code.code, NULL); - - /* Next test. */ - - buf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W), 1, 3, 0, 0, 0); - sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S2, 0, SLJIT_S0, 0, SLJIT_IMM, 16); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(VOID, W)); - label = sljit_emit_label(compiler); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS1(VOID, W_R), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, SLJIT_MAX_LOCAL_SIZE >> 1); - sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - return_addr = sljit_get_label_addr(label); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - - FAILED(buf[0] != return_addr, "test86 case 3 failed\n"); - sljit_free_code(code.code, NULL); - - /* Next test. */ - - buf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W_R), 1, 0, 0, 0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(VOID, W)); - label = sljit_emit_label(compiler); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS1(VOID, W_R), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS >> 1, 0, 0, 64); - sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM1(SLJIT_SP), 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_MEM1(SLJIT_SP), 0); - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - return_addr = sljit_get_label_addr(label); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - - FAILED(buf[0] != return_addr, "test86 case 4 failed\n"); - sljit_free_code(code.code, NULL); - - if (sljit_has_cpu_feature(SLJIT_HAS_FPU) && SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0) { - /* Next test. */ - - buf[0] = 0; - - compiler = sljit_create_compiler(NULL, NULL); - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1(VOID, W), 1, 1, 0, 0, 0); - jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); - label = sljit_emit_label(compiler); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); - sljit_emit_return_void(compiler); - - sljit_set_label(jump, sljit_emit_label(compiler)); - sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 3, 0, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 64); - sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_RETURN_REG, 0); - sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); - - code.code = sljit_generate_code(compiler); - CHECK(compiler); - return_addr = sljit_get_label_addr(label); - sljit_free_compiler(compiler); - - code.func1((sljit_sw)buf); - - FAILED(buf[0] != return_addr, "test86 case 5 failed\n"); - sljit_free_code(code.code, NULL); - } - - successful_tests++; -} - -static void test87(void) +static void test66(void) { /* Test reverse bytes. */ executable_code code; struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); - sljit_sw buf[5]; + sljit_sw buf[6]; sljit_s32 ibuf[5]; sljit_s32 i; if (verbose) - printf("Run test87\n"); + printf("Run test66\n"); FAILED(!compiler, "cannot create compiler\n"); - for (i = 0; i < 5; i++) + for (i = 0; i < 6; i++) buf[i] = -1; for (i = 0; i < 5; i++) ibuf[i] = -1; @@ -10902,7 +7139,7 @@ static void test87(void) buf[3] = WCONST(0x8070605040302010, 0x40302010); ibuf[1] = (sljit_s32)0xffeeddcc; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, WCONST(0xf1e2d3c4b5a69788, 0xf1e2d3c4)); sljit_emit_op1(compiler, SLJIT_REV, SLJIT_R0, 0, SLJIT_R0, 0); /* buf[0] */ @@ -10926,6 +7163,11 @@ static void test87(void) /* buf[4] */ sljit_emit_op1(compiler, SLJIT_REV, SLJIT_MEM0(), (sljit_sw)&buf[4], SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 5 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, WCONST(0xaabbccddeeff0011, 0xaabbccdd)); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_REV, SLJIT_MEM2(SLJIT_S0, SLJIT_R2), 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, (sljit_s32)0xf1e2d3c4); sljit_emit_op1(compiler, SLJIT_REV32, SLJIT_R1, 0, SLJIT_R0, 0); /* ibuf[0] */ @@ -10958,119 +7200,134 @@ static void test87(void) code.func2((sljit_sw)buf, (sljit_sw)ibuf); - FAILED(buf[0] != WCONST(0x8897a6b5c4d3e2f1, 0xc4d3e2f1), "test87 case 1 failed\n"); - FAILED(buf[1] != WCONST(0x8899aabbccddeeff, 0xccddeeff), "test87 case 2 failed\n"); - FAILED(buf[2] != WCONST(0x0807060504030201, 0x04030201), "test87 case 3 failed\n"); - FAILED(buf[3] != WCONST(0x8070605040302010, 0x40302010), "test87 case 4 failed\n"); - FAILED(buf[4] != WCONST(0x8877665544332211, 0x44332211), "test87 case 5 failed\n"); - FAILED(ibuf[0] != (sljit_s32)0xc4d3e2f1, "test87 case 6 failed\n"); - FAILED(ibuf[1] != (sljit_s32)0xccddeeff, "test87 case 7 failed\n"); - FAILED(ibuf[2] != (sljit_s32)0x04030201, "test87 case 8 failed\n"); - FAILED(ibuf[3] != (sljit_s32)0x44332211, "test87 case 9 failed\n"); - FAILED(ibuf[4] != (sljit_s32)0xcbdcedfe, "test87 case 10 failed\n"); + FAILED(buf[0] != WCONST(0x8897a6b5c4d3e2f1, 0xc4d3e2f1), "test66 case 1 failed\n"); + FAILED(buf[1] != WCONST(0x8899aabbccddeeff, 0xccddeeff), "test66 case 2 failed\n"); + FAILED(buf[2] != WCONST(0x0807060504030201, 0x04030201), "test66 case 3 failed\n"); + FAILED(buf[3] != WCONST(0x8070605040302010, 0x40302010), "test66 case 4 failed\n"); + FAILED(buf[4] != WCONST(0x8877665544332211, 0x44332211), "test66 case 5 failed\n"); + FAILED(buf[5] != WCONST(0x1100ffeeddccbbaa, 0xddccbbaa), "test66 case 6 failed\n"); + FAILED(ibuf[0] != (sljit_s32)0xc4d3e2f1, "test66 case 7 failed\n"); + FAILED(ibuf[1] != (sljit_s32)0xccddeeff, "test66 case 8 failed\n"); + FAILED(ibuf[2] != (sljit_s32)0x04030201, "test66 case 9 failed\n"); + FAILED(ibuf[3] != (sljit_s32)0x44332211, "test66 case 10 failed\n"); + FAILED(ibuf[4] != (sljit_s32)0xcbdcedfe, "test66 case 11 failed\n"); sljit_free_code(code.code, NULL); successful_tests++; } -static void test88(void) +static void test67(void) { - /* Test sljit_emit_fcopy. */ + /* Test reverse two bytes. */ executable_code code; - struct sljit_compiler* compiler; - sljit_f64 dbuf[4]; - sljit_f32 sbuf[2]; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_sw wbuf[2]; - sljit_s32 ibuf[2]; -#else /* !SLJIT_64BIT_ARCHITECTURE */ - sljit_s32 ibuf[7]; -#endif /* SLJIT_64BIT_ARCHITECTURE */ + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + sljit_sw buf[7]; + sljit_s32 ibuf[4]; + sljit_s16 hbuf[11]; + sljit_s32 i; if (verbose) - printf("Run test88\n"); + printf("Run test67\n"); - if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { - if (verbose) - printf("no fpu available, test88 skipped\n"); - successful_tests++; - return; - } - - compiler = sljit_create_compiler(NULL, NULL); FAILED(!compiler, "cannot create compiler\n"); - sbuf[0] = 12345.0; - sbuf[1] = -1.0; - ibuf[0] = -1; - ibuf[1] = (sljit_s32)0xc7543100; - dbuf[0] = 123456789012345.0; - dbuf[1] = -1.0; -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - wbuf[0] = -1; - wbuf[1] = (sljit_sw)0xc2fee0c29f50cb10; -#else /* !SLJIT_64BIT_ARCHITECTURE */ - ibuf[2] = -1; - ibuf[3] = -1; - ibuf[4] = -1; - ibuf[5] = (sljit_sw)0x9f50cb10; - ibuf[6] = (sljit_sw)0xc2fee0c2; -#endif /* SLJIT_64BIT_ARCHITECTURE */ + for (i = 0; i < 7; i++) + buf[i] = -1; + for (i = 0; i < 4; i++) + ibuf[i] = -1; + for (i = 0; i < 11; i++) + hbuf[i] = -1; - sljit_emit_enter(compiler, 0, SLJIT_ARGS2(VOID, W, W), 5, 5, 5, 0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)ibuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 0); - sljit_emit_fcopy(compiler, SLJIT_COPY32_FROM_F32, SLJIT_FR2, SLJIT_R0); + hbuf[0] = (sljit_s16)0x8c9d; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(W, W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xeeabcd); + sljit_emit_op1(compiler, SLJIT_REV_U16, SLJIT_R0, 0, SLJIT_R0, 0); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xeeabcd); + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_R1, 0, SLJIT_R2, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0xeeedcb); + sljit_emit_op1(compiler, SLJIT_REV_U16, SLJIT_R4, 0, SLJIT_R3, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R4, 0); + + /* hbuf[1] */ + sljit_emit_op1(compiler, SLJIT_REV_U16, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_s16), SLJIT_MEM1(SLJIT_S2), 0); + /* hbuf[2] */ + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_s16), SLJIT_MEM1(SLJIT_S2), 0); + + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_IMM, 0xedcb); + sljit_emit_op1(compiler, SLJIT_REV_U16, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw)); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_s16), SLJIT_IMM, 0xedcb); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3); + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), 1); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R2, 0, SLJIT_IMM, 0xd9c8); + /* hbuf[3] */ + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_s16), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R4, 0, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s16), SLJIT_R4, 0); + /* hbuf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_s16), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s16)); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xeeb1c2); + sljit_emit_op1(compiler, SLJIT_REV32_U16, SLJIT_R0, 0, SLJIT_R0, 0); /* ibuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_s32)); - sljit_emit_fcopy(compiler, SLJIT_COPY32_TO_F32, SLJIT_FR4, SLJIT_R3); - /* sbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32), SLJIT_FR4, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0xeeb1c2); + sljit_emit_op1(compiler, SLJIT_REV32_S16, SLJIT_R1, 0, SLJIT_R2, 0); + /* ibuf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_R1, 0); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)wbuf); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_S2); - /* wbuf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_IMM, 0xddbfae); + sljit_emit_op1(compiler, SLJIT_REV32_S16, SLJIT_R4, 0, SLJIT_R3, 0); + /* ibuf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_s32), SLJIT_R4, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)); - sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR0, SLJIT_R3); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32_U16, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_IMM, 0xbfae); + sljit_emit_op1(compiler, SLJIT_REV32_U16, SLJIT_R1, 0, SLJIT_MEM0(), (sljit_sw)(ibuf + 3)); + /* ibuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); - sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_R2); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR3, 0); -#else /* !SLJIT_64BIT_ARCHITECTURE */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); - sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_REG_PAIR(SLJIT_S3, SLJIT_S2)); - /* ibuf[2-3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S2, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S3, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x880102); + sljit_emit_op1(compiler, SLJIT_REV32_U16, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), SLJIT_R1, 0); + /* hbuf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_s16), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32)); - sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_R2); - /* ibuf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 4 * sizeof(sljit_sw), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_IMM, 0x880102); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 6 * sizeof(sljit_s16)); + /* hbuf[6] */ + sljit_emit_op1(compiler, SLJIT_REV32_S16, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), 0, SLJIT_R3, 0); + /* hbuf[7] */ + hbuf[7] = -367; - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), 5 * sizeof(sljit_sw)); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R1), 6 * sizeof(sljit_sw)); - sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR0, SLJIT_REG_PAIR(SLJIT_R0, SLJIT_R3)); - /* dbuf[1] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); - sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_REG_PAIR(SLJIT_R2, SLJIT_R2)); - /* dbuf[2] */ - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR3, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)0xc00c0000); - sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_R2); - sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR3, 0); -#endif /* SLJIT_64BIT_ARCHITECTURE */ +#if IS_64BIT + /* SLJIT_REV truncates memory store, source not sign extended 64bit */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0xdeadbeef4444aa55); + sljit_emit_op1(compiler, SLJIT_REV_U16, SLJIT_R1, 0, SLJIT_R0, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R1, 0); + /* hbuf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_S2), 8 * sizeof(sljit_u16), SLJIT_R1, 0); + /* hbuf[9] */ + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_MEM1(SLJIT_S2), 9 * sizeof(sljit_u16), SLJIT_R0, 0); + /* hbuf[10] */ + hbuf[10] = -42; + sljit_emit_op1(compiler, SLJIT_REV_S16, SLJIT_R0, 0, SLJIT_R0, 0); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R0, 0); +#endif /* IS_64BIT */ sljit_emit_return_void(compiler); @@ -11078,27 +7335,677 @@ static void test88(void) CHECK(compiler); sljit_free_compiler(compiler); - code.func2((sljit_sw)dbuf, (sljit_sw)sbuf); + code.func3((sljit_sw)buf, (sljit_sw)ibuf, (sljit_sw)hbuf); - FAILED(ibuf[0] != (sljit_s32)0x4640e400, "test88 case 1 failed\n"); - FAILED(sbuf[1] != -54321.0, "test88 case 2 failed\n"); -#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) - FAILED(wbuf[0] != (sljit_sw)0x42dc12218377de40, "test88 case 3 failed\n"); - FAILED(dbuf[1] != -543210987654321.0, "test88 case 4 failed\n"); - FAILED(dbuf[2] != 0.0, "test88 case 5 failed\n"); -#else /* !SLJIT_64BIT_ARCHITECTURE */ - FAILED(ibuf[2] != (sljit_sw)0x8377de40, "test88 case 3 failed\n"); - FAILED(ibuf[3] != (sljit_sw)0x42dc1221, "test88 case 4 failed\n"); - FAILED(ibuf[4] != (sljit_sw)0x42dc1221, "test88 case 5 failed\n"); - FAILED(dbuf[1] != -543210987654321.0, "test88 case 6 failed\n"); - FAILED(dbuf[2] != 0.0, "test88 case 7 failed\n"); - FAILED(dbuf[3] != -3.5, "test88 case 8 failed\n"); -#endif /* SLJIT_64BIT_ARCHITECTURE */ + FAILED(buf[0] != 0xcdab, "test67 case 1 failed\n"); + FAILED(buf[1] != -0x3255, "test67 case 2 failed\n"); + FAILED(buf[2] != 0xcbed, "test67 case 3 failed\n"); + FAILED(hbuf[1] != (sljit_s16)0x9d8c, "test67 case 4 failed\n"); + FAILED(hbuf[2] != (sljit_s16)0x9d8c, "test67 case 5 failed\n"); + FAILED(buf[3] != 0xcbed, "test67 case 6 failed\n"); + FAILED(buf[4] != -0x3413, "test67 case 7 failed\n"); + FAILED(hbuf[3] != (sljit_s16)0xc8d9, "test67 case 8 failed\n"); + FAILED(hbuf[4] != (sljit_s16)0xc8d9, "test67 case 9 failed\n"); + FAILED(ibuf[0] != 0xc2b1, "test67 case 10 failed\n"); + FAILED(ibuf[1] != -0x3d4f, "test67 case 11 failed\n"); + FAILED(ibuf[2] != -0x5141, "test67 case 12 failed\n"); + FAILED(ibuf[3] != 0xaebf, "test67 case 13 failed\n"); + FAILED(hbuf[5] != (sljit_s16)0x0201, "test67 case 14 failed\n"); + FAILED(hbuf[6] != (sljit_s16)0x0201, "test67 case 15 failed\n"); + FAILED(hbuf[7] != -367, "test67 case 16 failed\n"); +#if IS_64BIT + FAILED(hbuf[8] != 0x55aa, "test67 case 17 failed\n"); + FAILED(buf[5] != hbuf[8], "test67 case 18 failed\n"); + FAILED(hbuf[9] != hbuf[8], "test67 case 19 failed\n"); + FAILED(hbuf[10] != -42, "test67 case 20 failed\n"); + FAILED(buf[6] != hbuf[9], "test67 case 21 failed\n"); +#endif /* IS_64BIT */ sljit_free_code(code.code, NULL); successful_tests++; } +static void test68(void) +{ + /* Test reverse four bytes. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + sljit_sw buf[7]; + sljit_s32 ibuf[6]; + sljit_s32 i; + + if (verbose) + printf("Run test68\n"); + + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 7; i++) + buf[i] = -1; + for (i = 0; i < 6; i++) + ibuf[i] = -1; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, WCONST(0xffffa1b2c3d4, 0xa1b2c3d4)); + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_R0, 0, SLJIT_R0, 0); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); + + /* Sign extend negative integer. */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, WCONST(0xffffa1b2c3d4, 0xa1b2c3d4)); + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_R1, 0, SLJIT_R2, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R1, 0); + + /* Sign extend positive integer. */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, WCONST(0xffff1a2b3c4d,0x1a2b3c4d)); + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_R1, 0, SLJIT_R2, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_IMM, (sljit_s32)0xf9e8d7c6); + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32)); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_s32)); + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_S2, 0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 0); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_S2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_IMM, (sljit_s32)0xaabbccdd); + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw)); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_IMM, (sljit_s32)0xaabbccdd); + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_R4, 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw)); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R4, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, WCONST(0xffff01020304, 0x01020304)); + /* ibuf[0] */ + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 1); + /* ibuf[1] */ + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_MEM2(SLJIT_S1, SLJIT_S2), 2, SLJIT_S4, 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_IMM, (sljit_s32)0xf0e0d0c0); + /* ibuf[2] */ + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_MEM0(), (sljit_sw)(ibuf + 2), SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32)); + + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S2, 0, SLJIT_S1, 0, SLJIT_IMM, WCONST(0x1234567890ab, 0x12345678) - 3 * sizeof(sljit_s32)); + sljit_emit_op1(compiler, SLJIT_REV_U32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S2), WCONST(0x1234567890ab, 0x12345678)); + /* ibuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32)); + + /* SLJIT_REV memory store truncates and does not overflow */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, WCONST(0xffff8192a3b4, 0x8192a3b4)); + /* ibuf[4] */ + sljit_emit_op1(compiler, SLJIT_REV_S32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32), SLJIT_R4, 0); + /* ibuf[5] */ + ibuf[5] = 0x55555555; + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)buf, (sljit_sw)ibuf); + + FAILED(buf[0] != WCONST(0xd4c3b2a1, 0xd4c3b2a1), "test68 case 1 failed\n"); + FAILED(buf[1] != WCONST(-0x2b3c4d5f, 0xd4c3b2a1), "test68 case 2 failed\n"); + FAILED(buf[2] != 0x4d3c2b1a, "test68 case 3 failed\n"); + FAILED(buf[3] != WCONST(0xc6d7e8f9, 0xc6d7e8f9), "test68 case 4 failed\n"); + FAILED(buf[4] != WCONST(-0x39281707, 0xc6d7e8f9), "test68 case 5 failed\n"); + FAILED(buf[5] != WCONST(0xddccbbaa, 0xddccbbaa), "test68 case 6 failed\n"); + FAILED(buf[6] != WCONST(-0x22334456, 0xddccbbaa), "test68 case 7 failed\n"); + FAILED(ibuf[0] != 0x04030201, "test68 case 8 failed\n"); + FAILED(ibuf[1] != 0x04030201, "test68 case 9 failed\n"); + FAILED(ibuf[2] != (sljit_s32)0xc0d0e0f0, "test68 case 10 failed\n"); + FAILED(ibuf[3] != (sljit_s32)0xc0d0e0f0, "test68 case 11 failed\n"); + FAILED(ibuf[4] != (sljit_s32)0xb4a39281, "test68 case 12 failed\n"); + FAILED(ibuf[5] != 0x55555555, "test68 case 13 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test69(void) +{ + /* Test atomic load and store. */ + executable_code code; + struct sljit_compiler *compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *label; + struct sljit_jump *jump; + sljit_sw buf[45]; + sljit_s32 i; + + if (verbose) + printf("Run test69\n"); + + if (!sljit_has_cpu_feature(SLJIT_HAS_ATOMIC)) { + if (verbose) + printf("no fine-grained atomic available, test69 skipped\n"); + successful_tests++; + return; + } + + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 1; i < 45; i++) + buf[i] = WCONST(0x5555555555555555, 0x55555555); + + buf[0] = 4678; + *(sljit_u8*)(buf + 2) = 78; + *(sljit_u8*)(buf + 5) = 211; + *(sljit_u16*)(buf + 9) = 17897; + *(sljit_u16*)(buf + 12) = 57812; + *(sljit_u32*)(buf + 15) = 1234567890; + *(sljit_u32*)(buf + 17) = 987609876; + buf[20] = (sljit_sw)buf; + *(sljit_u8*)(buf + 22) = 192; + *(sljit_u16*)(buf + 25) = 6359; + ((sljit_u8*)(buf + 28))[1] = 105; + ((sljit_u8*)(buf + 30))[2] = 13; + ((sljit_u16*)(buf + 33))[1] = 14876; +#if IS_64BIT + ((sljit_u8*)(buf + 35))[7] = 0x88; + ((sljit_u16*)(buf + 37))[3] = 0x1337; + ((sljit_s32*)(buf + 39))[1] = -1; +#endif /* IS_64BIT */ + buf[44] = WCONST(0x1122334444332211, 0x11222211); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 0, 0, 2 * sizeof(sljit_sw)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, -9856); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV, SLJIT_R1, SLJIT_S0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)); + /* buf[0] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV | SLJIT_SET_ATOMIC_STORED, SLJIT_R1, SLJIT_S0, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_IMM, 203); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R2, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw)); + /* buf[2] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_R0, SLJIT_R1, SLJIT_R2); + jump = sljit_emit_jump(compiler, SLJIT_ATOMIC_STORED); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_JUMP), label); + sljit_set_label(jump, sljit_emit_label(compiler)); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_S2, 0); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0); + + label = sljit_emit_label(compiler); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 5 * sizeof(sljit_sw)); + sljit_emit_atomic_load(compiler, SLJIT_MOV32_U8, SLJIT_R0, SLJIT_R0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 5 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 97); + /* buf[5] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV32_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_S1, SLJIT_R0, SLJIT_S2); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R1, 0); + /* buf[7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R0, 0); + /* buf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_S1, 0); + + label = sljit_emit_label(compiler); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 9 * sizeof(sljit_sw)); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U16, SLJIT_S2, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S2, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 9 * sizeof(sljit_sw)); + /* buf[9] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U16 | SLJIT_SET_ATOMIC_STORED, SLJIT_R0, SLJIT_R0, SLJIT_R1); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[10] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R2, 0); + /* buf[11] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 12 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_IMM, 41306); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV32_U16, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), (sljit_sw)(buf + 13)); + /* buf[12] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV32_U16 | SLJIT_SET_ATOMIC_STORED, SLJIT_R0, SLJIT_R1, SLJIT_R3); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[13] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_R2, 0); + /* buf[14] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S0, 0, SLJIT_IMM, 15 * sizeof(sljit_sw)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U32, SLJIT_R2, SLJIT_S2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 987654321); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S1, 0, SLJIT_S0, 0, SLJIT_IMM, 15 * sizeof(sljit_sw)); + /* buf[15] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U32 | SLJIT_SET_ATOMIC_STORED, SLJIT_R1, SLJIT_S1, SLJIT_S3); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[16] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 17 * sizeof(sljit_sw)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV32, SLJIT_R0, SLJIT_R2); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -573621); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 678906789); + /* buf[17] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV32 | SLJIT_SET_ATOMIC_STORED, SLJIT_R1, SLJIT_R2, SLJIT_S2); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[18] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 18 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[19] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 19 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 20 * sizeof(sljit_sw)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_P, SLJIT_R0, SLJIT_R2); + sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_R1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_R0, 0, SLJIT_R2, 0); + /* buf[20] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_P | SLJIT_SET_ATOMIC_STORED, SLJIT_R0, SLJIT_R2, SLJIT_R1); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[21] */ + sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM1(SLJIT_S0), 21 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 22 * sizeof(sljit_sw)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R3, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 240); + /* buf[22] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_R3, SLJIT_R1, SLJIT_R4); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[23] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_R2, 0); + /* buf[24] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 24 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 25 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 25 * sizeof(sljit_sw), SLJIT_IMM, 6359); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV, SLJIT_S3, SLJIT_R0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_S3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, 4059); + /* buf[25] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV | SLJIT_SET_ATOMIC_STORED, SLJIT_S3, SLJIT_R0, SLJIT_S4); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[26] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_R1, 0); + /* buf[27] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 27 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 28 * sizeof(sljit_sw) + 1); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 204); + /* buf[28] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + jump = sljit_emit_jump(compiler, SLJIT_ATOMIC_STORED); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_JUMP), label); + sljit_set_label(jump, sljit_emit_label(compiler)); + /* buf[29] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 29 * sizeof(sljit_sw), SLJIT_S2, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 30 * sizeof(sljit_sw) + 2); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 240); + /* buf[30] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[31] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 31 * sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_ATOMIC_NOT_STORED); + /* buf[32] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 32 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 33 * sizeof(sljit_sw) + 2); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U16, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 51403); + /* buf[33] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U16 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[34] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 34 * sizeof(sljit_sw), SLJIT_S1, 0); + +#if IS_64BIT + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 35 * sizeof(sljit_sw) + 7 * sizeof(sljit_u8)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xffa5a5a542); + /* buf[35] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[36] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 36 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 37 * sizeof(sljit_sw) + 3 * sizeof(sljit_u16)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U16, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xffa5a56942); + /* buf[37] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U16 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[38] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 38 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 39 * sizeof(sljit_sw) + sizeof(sljit_u32)); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U32, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_S1, 0, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xffffdeadbeef); + /* buf[39] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U32 | SLJIT_SET_ATOMIC_STORED, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_set_label(sljit_emit_jump(compiler, SLJIT_ATOMIC_NOT_STORED), label); + /* buf[40] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 40 * sizeof(sljit_sw), SLJIT_S1, 0); +#endif /* IS_64BIT */ + + /* buf[41] */ + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 41 * sizeof(sljit_sw), SLJIT_ATOMIC_STORED); + + /* abandoned atomic load (byte) */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 8); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 44 * sizeof(sljit_sw)); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R0, SLJIT_R1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + label = sljit_emit_label(compiler); + sljit_emit_atomic_load(compiler, SLJIT_MOV_U8, SLJIT_R0, SLJIT_R1); + sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_R3, 0, SLJIT_R3, 0, SLJIT_IMM, 1); + jump = sljit_emit_jump(compiler, SLJIT_ZERO); + /* buf[44] */ + sljit_emit_atomic_store(compiler, SLJIT_MOV_U8, SLJIT_R2, SLJIT_R1, SLJIT_R0); + sljit_emit_mem(compiler, SLJIT_MOV_U8 | SLJIT_MEM_UNALIGNED, SLJIT_R4, SLJIT_MEM1(SLJIT_R1), 0); + sljit_set_label(sljit_emit_cmp(compiler, SLJIT_NOT_EQUAL, SLJIT_R4, 0, SLJIT_R2, 0), label); + /* buf[43] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 43 * sizeof(sljit_sw), SLJIT_R2, 0); + /* buf[42] */ + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 42 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + + FAILED(buf[0] != -9856, "test69 case 1 failed\n"); + FAILED(buf[1] != 4678, "test69 case 2 failed\n"); + FAILED(*(sljit_u8*)(buf + 2) != 203, "test69 case 3 failed\n"); + FAILED(((sljit_u8*)(buf + 2))[1] != 0x55, "test69 case 4 failed\n"); + FAILED(buf[3] != 78, "test69 case 5 failed\n"); + FAILED(buf[4] != 203, "test69 case 6 failed\n"); + FAILED(*(sljit_u8*)(buf + 5) != 97, "test69 case 7 failed\n"); + FAILED(((sljit_u8*)(buf + 5))[1] != 0x55, "test69 case 8 failed\n"); + FAILED(*(sljit_u32*)(buf + 6) != 211, "test69 case 9 failed\n"); + FAILED(buf[7] != (sljit_sw)(buf + 5), "test69 case 10 failed\n"); + FAILED(buf[8] != 97, "test69 case 11 failed\n"); + FAILED(*(sljit_u16*)(buf + 9) != (sljit_u16)(sljit_sw)(buf + 9), "test69 case 12 failed\n"); + FAILED(((sljit_u8*)(buf + 9))[2] != 0x55, "test69 case 13 failed\n"); + FAILED(buf[10] != 17897, "test69 case 14 failed\n"); + FAILED(buf[11] != (sljit_sw)(buf + 9), "test69 case 15 failed\n"); + FAILED(*(sljit_u16*)(buf + 12) != 41306, "test69 case 16 failed\n"); + FAILED(((sljit_u8*)(buf + 12))[2] != 0x55, "test69 case 17 failed\n"); + FAILED(*(sljit_u32*)(buf + 13) != 57812, "test69 case 18 failed\n"); + FAILED(buf[14] != 41306, "test69 case 19 failed\n"); + FAILED(*(sljit_u32*)(buf + 15) != 987654321, "test69 case 20 failed\n"); +#if IS_64BIT + FAILED(((sljit_u8*)(buf + 15))[4] != 0x55, "test69 case 21 failed\n"); +#endif /* IS_64BIT */ + FAILED(buf[16] != 1234567890, "test69 case 22 failed\n"); + FAILED(*(sljit_u32*)(buf + 17) != 678906789, "test69 case 23 failed\n"); +#if IS_64BIT + FAILED(((sljit_u8*)(buf + 17))[4] != 0x55, "test69 case 24 failed\n"); +#endif /* IS_64BIT */ + FAILED(*(sljit_u32*)(buf + 18) != 987609876, "test69 case 25 failed\n"); +#if IS_64BIT + FAILED(((sljit_u8*)(buf + 18))[4] != 0x55, "test69 case 26 failed\n"); +#endif /* IS_64BIT */ + FAILED(buf[19] != -573621, "test69 case 27 failed\n"); + FAILED(buf[20] != (sljit_sw)(buf + 20), "test 92 case 28 failed\n"); + FAILED(buf[21] != (sljit_sw)buf, "test 92 case 29 failed\n"); + FAILED(*(sljit_u8*)(buf + 22) != 240, "test69 case 30 failed\n"); + FAILED(((sljit_u8*)(buf + 22))[1] != 0x55, "test69 case 31 failed\n"); + FAILED(buf[23] != 192, "test69 case 32 failed\n"); + FAILED(buf[24] != 240, "test69 case 33 failed\n"); + FAILED(buf[25] != 4059, "test69 case 34 failed\n"); + FAILED(buf[26] != 6359, "test69 case 35 failed\n"); + FAILED(buf[27] != (sljit_sw)(buf + 25), "test69 case 36 failed\n"); + FAILED(((sljit_u8*)(buf + 28))[0] != 0x55, "test69 case 37 failed\n"); + FAILED(((sljit_u8*)(buf + 28))[1] != 204, "test69 case 38 failed\n"); + FAILED(((sljit_u8*)(buf + 28))[2] != 0x55, "test69 case 39 failed\n"); + FAILED(buf[29] != 105, "test69 case 40 failed\n"); + FAILED(((sljit_u8*)(buf + 30))[1] != 0x55, "test69 case 41 failed\n"); + FAILED(((sljit_u8*)(buf + 30))[2] != 240, "test69 case 42 failed\n"); + FAILED(((sljit_u8*)(buf + 30))[3] != 0x55, "test69 case 43 failed\n"); + FAILED(buf[31] != 13, "test69 case 44 failed\n"); + FAILED(buf[32] != 0, "test69 case 45 failed\n"); + FAILED(((sljit_u16*)(buf + 33))[0] != 0x5555, "test69 case 46 failed\n"); + FAILED(((sljit_u16*)(buf + 33))[1] != 51403, "test69 case 47 failed\n"); + FAILED(buf[34] != 14876, "test69 case 48 failed\n"); +#if IS_64BIT + FAILED(((sljit_u8*)(buf + 35))[7] != 0x42, "test69 case 49 failed\n"); + FAILED(buf[36] != 0x88, "test69 case 50 failed\n"); + FAILED(((sljit_u16*)(buf + 37))[3] != 0x6942, "test69 case 51 failed\n"); + FAILED(buf[38] != 0x1337, "test69 case 52 failed\n"); + FAILED(((sljit_u32*)(buf + 39))[0] != 0x55555555, "test69 case 53 failed\n"); + FAILED(((sljit_u32*)(buf + 39))[1] != 0xdeadbeef, "test69 case 54 failed\n"); + FAILED(buf[40] != 0xffffffff, "test69 case 55 failed\n"); +#endif /* IS_64BIT */ + FAILED(buf[41] != 1, "test69 case 56 failed\n"); + FAILED(!buf[42], "test69 case 57 failed\n"); + FAILED(buf[43] != 0x11, "test69 case 58 failed\n"); + FAILED(((sljit_u8*)(buf + 44))[1] != buf[43], "test69 case 59 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test70(void) +{ + /* Test accessing temporary registers. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_sw buf[SLJIT_NUMBER_OF_TEMPORARY_REGISTERS + SLJIT_NUMBER_OF_REGISTERS - 1]; + sljit_f64 fbuf[2 * (SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS + SLJIT_NUMBER_OF_FLOAT_REGISTERS)]; + sljit_s32 i, ctr; + + if (verbose) + printf("Run test70\n"); + + for (i = 0; i < SLJIT_NUMBER_OF_TEMPORARY_REGISTERS; i++) + buf[i] = -1; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), SLJIT_NUMBER_OF_REGISTERS - 1, 1, 0, 0, 0); + + ctr = 123; + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TMP_R0, 0, SLJIT_IMM, ctr); + + /* Set registers, also works for virtual registers. */ + for (i = 1; i < SLJIT_NUMBER_OF_TEMPORARY_REGISTERS; i++) { + SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, SLJIT_TMP_R(i)) >= 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TMP_R(i), 0, SLJIT_IMM, ++ctr); + } + + for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 1; i++) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, ++ctr); + + /* Save registers, temporaries first to avoid issues when virtual registers are copied. */ + ctr = 0; + for (i = 0; i < SLJIT_NUMBER_OF_TEMPORARY_REGISTERS; i++, ctr += (sljit_s32)sizeof(sljit_sw)) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), ctr, SLJIT_TMP_R(i), 0); + + for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 1; i++, ctr += (sljit_s32)sizeof(sljit_sw)) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), ctr, SLJIT_R(i), 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + for (i = 0; i < (SLJIT_NUMBER_OF_TEMPORARY_REGISTERS + SLJIT_NUMBER_OF_REGISTERS - 1); i++) { + FAILED(buf[i] != (123 + i), "test70 case 1 failed\n"); + } + + if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + successful_tests++; + return; + } + + ctr = SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS + SLJIT_NUMBER_OF_FLOAT_REGISTERS; + for (i = 0; i < ctr; i++) { + fbuf[i] = 123.0 + i; + fbuf[ctr + i] = -1.0; + } + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_TMP_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + ctr = sizeof(sljit_f64); + for (i = 1; i < SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS; i++, ctr += (sljit_s32)(sizeof(sljit_f64))) { + SLJIT_ASSERT(sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_TMP_FR(i)) >= 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_TMP_FR(i), 0, SLJIT_MEM1(SLJIT_S0), ctr); + } + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++, ctr += (sljit_s32)(sizeof(sljit_f64))) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), ctr); + + for (i = 0; i < SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS; i++, ctr += (sljit_s32)(sizeof(sljit_f64))) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), ctr, SLJIT_TMP_FR(i), 0); + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++, ctr += (sljit_s32)(sizeof(sljit_f64))) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), ctr, SLJIT_FR(i), 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)fbuf); + sljit_free_code(code.code, NULL); + + ctr = SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS + SLJIT_NUMBER_OF_FLOAT_REGISTERS; + for (i = 0; i < ctr; i++) { + FAILED(fbuf[ctr + i] != (123.0 + i), "test70 case 2 failed\n"); + } + + if (sljit_has_cpu_feature(SLJIT_HAS_F64_AS_F32_PAIR)) { + fbuf[0] = 123456789012.0; + fbuf[1] = -1.0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_TMP_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_TMP_FR0), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); +#else /* !SLJIT_LITTLE_ENDIAN */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_TMP_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_TMP_FR0), 0, SLJIT_MEM1(SLJIT_S0), 0); +#endif /* SLJIT_LITTLE_ENDIAN */ + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_TMP_FR0, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)fbuf); + sljit_free_code(code.code, NULL); + + FAILED(fbuf[1] != 123456789012.0, "test70 case 3 failed\n"); + } + + if (sljit_has_cpu_feature(SLJIT_HAS_SIMD)) { + fbuf[0] = 123456789012.0; + fbuf[1] = 456789012345.0; + fbuf[2] = -1.0; + fbuf[3] = -1.0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + + i = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_MEM_ALIGNED_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | i, SLJIT_TMP_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | i, SLJIT_TMP_FR0, SLJIT_MEM1(SLJIT_S0), 16); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)fbuf); + sljit_free_code(code.code, NULL); + + FAILED(fbuf[2] != 123456789012.0, "test70 case 4 failed\n"); + FAILED(fbuf[3] != 456789012345.0, "test70 case 5 failed\n"); + } + + successful_tests++; +} + +#include "sljitTestCall.h" +#include "sljitTestFloat.h" +#include "sljitTestSimd.h" +#include "sljitTestSerialize.h" + int sljit_test(int argc, char* argv[]) { sljit_s32 has_arg = (argc >= 2 && argv[1][0] == '-' && argv[1][2] == '\0'); @@ -11111,6 +8018,7 @@ int sljit_test(int argc, char* argv[]) #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) test_exec_allocator(); #endif + test_macros(); test1(); test2(); test3(); @@ -11181,37 +8089,90 @@ int sljit_test(int argc, char* argv[]) test68(); test69(); test70(); - test71(); - test72(); - test73(); - test74(); - test75(); - test76(); - test77(); - test78(); - test79(); - test80(); - test81(); - test82(); - test83(); - test84(); - test85(); - test86(); - test87(); - test88(); + + if (verbose) + printf("---- Call tests ----\n"); + + test_call1(); + test_call2(); + test_call3(); + test_call4(); + test_call5(); + test_call6(); + test_call7(); + test_call8(); + test_call9(); + test_call10(); + test_call11(); + test_call12(); + + if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + if (verbose) + printf("---- Float tests ----\n"); + test_float1(); + test_float2(); + test_float3(); + test_float4(); + test_float5(); + test_float6(); + test_float7(); + test_float8(); + test_float9(); + test_float10(); + test_float11(); + test_float12(); + test_float13(); + test_float14(); + test_float15(); + test_float16(); + test_float17(); + test_float18(); + test_float19(); + test_float20(); + test_float21(); + test_float22(); + } else { + if (verbose) + printf("no fpu available, fpu tests are skipped\n"); + successful_tests += 22; + } + + if (sljit_has_cpu_feature(SLJIT_HAS_SIMD)) { + if (verbose) + printf("---- SIMD tests ----\n"); + test_simd1(); + test_simd2(); + test_simd3(); + test_simd4(); + test_simd5(); + test_simd6(); + test_simd7(); + test_simd8(); + } else { + if (verbose) + printf("no simd available, simd tests are skipped\n"); + successful_tests += 8; + } + + if (verbose) + printf("---- Serialize tests ----\n"); + + test_serialize1(); + test_serialize2(); + test_serialize3(); #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) sljit_free_unused_memory_exec(); #endif -# define TEST_COUNT 88 +# define TEST_COUNT 115 printf("SLJIT tests: "); if (successful_tests == TEST_COUNT) - printf("all tests are " COLOR_GREEN "PASSED" COLOR_DEFAULT " "); + printf("all tests " COLOR_GREEN "PASSED" COLOR_DEFAULT " "); else - printf(COLOR_RED "%d" COLOR_DEFAULT " (" COLOR_RED "%d%%" COLOR_DEFAULT ") tests are " COLOR_RED "FAILED" COLOR_DEFAULT " ", TEST_COUNT - successful_tests, (TEST_COUNT - successful_tests) * 100 / TEST_COUNT); - printf("on " COLOR_ARCH "%s" COLOR_DEFAULT "%s\n", sljit_get_platform_name(), sljit_has_cpu_feature(SLJIT_HAS_FPU) ? " (with fpu)" : " (without fpu)"); + printf(COLOR_RED "%d" COLOR_DEFAULT " (" COLOR_RED "%d%%" COLOR_DEFAULT ") tests " COLOR_RED "FAILED" COLOR_DEFAULT " ", TEST_COUNT - successful_tests, (TEST_COUNT - successful_tests) * 100 / TEST_COUNT); + printf("on " COLOR_ARCH "%s" COLOR_DEFAULT " (%s)\n", sljit_get_platform_name(), sljit_has_cpu_feature(SLJIT_HAS_SIMD) ? "with simd" : (sljit_has_cpu_feature(SLJIT_HAS_FPU) ? "with fpu" : "basic")); return TEST_COUNT - successful_tests; diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestCall.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestCall.h new file mode 100755 index 0000000000..891284d53d --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestCall.h @@ -0,0 +1,2031 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static sljit_sw func(sljit_sw a, sljit_sw b, sljit_sw c) +{ + return a + b + c + 5; +} + +static sljit_sw func4(sljit_sw a, sljit_sw b, sljit_sw c, sljit_sw d) +{ + return func(a, b, c) + d; +} + +static void test_call1(void) +{ + /* Test function call. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_jump* jump = NULL; + sljit_sw buf[9]; + sljit_sw res; + + if (verbose) + printf("Run test_call1\n"); + + FAILED(!compiler, "cannot create compiler\n"); + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + buf[4] = 0; + buf[5] = 0; + buf[6] = 0; + buf[7] = 0; + buf[8] = SLJIT_FUNC_ADDR(func); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 4, 2, 0, 0, 0); + + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); + + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -10); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); + jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_REWRITABLE_JUMP, SLJIT_ARGS3(W, W, W, W)); + sljit_set_target(jump, (sljit_uw)-1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 40); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -60); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -30); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 10); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 110); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 120); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_R3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 3); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 3); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -6); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(func4)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W), SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + /* buf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -10); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 6); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(W, W, W, W), SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_set_jump_addr(sljit_get_jump_addr(jump), SLJIT_FUNC_UADDR(func), sljit_get_executable_offset(compiler)); + sljit_free_compiler(compiler); + + res = code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(res != -15, "test_call1 case 1 failed\n"); + FAILED(buf[0] != 14, "test_call1 case 2 failed\n"); + FAILED(buf[1] != -8, "test_call1 case 3 failed\n"); + FAILED(buf[2] != SLJIT_FUNC_ADDR(func) + 42, "test_call1 case 4 failed\n"); + FAILED(buf[3] != SLJIT_FUNC_ADDR(func) - 85, "test_call1 case 5 failed\n"); + FAILED(buf[4] != SLJIT_FUNC_ADDR(func) + 31, "test_call1 case 6 failed\n"); + FAILED(buf[5] != 335, "test_call1 case 7 failed\n"); + FAILED(buf[6] != 11, "test_call1 case 8 failed\n"); + FAILED(buf[7] != 5, "test_call1 case 9 failed\n"); + FAILED(buf[8] != -15, "test_call1 case 10 failed\n"); + + successful_tests++; +} + +static void test_call2(void) +{ + /* Ackermann benchmark. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *entry; + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_jump *jump1; + struct sljit_jump *jump2; + sljit_sw res; + + if (verbose) + printf("Run test_call2\n"); + + FAILED(!compiler, "cannot create compiler\n"); + + entry = sljit_emit_label(compiler); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2(W, W, W), 3, 2, 0, 0, 0); + /* If x == 0. */ + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_S0, 0, SLJIT_IMM, 0); + jump1 = sljit_emit_jump(compiler, SLJIT_EQUAL); + /* If y == 0. */ + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_S1, 0, SLJIT_IMM, 0); + jump2 = sljit_emit_jump(compiler, SLJIT_EQUAL); + + /* Ack(x,y-1). */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 1); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); + sljit_set_label(jump, entry); + + /* Returns with Ack(x-1, Ack(x,y-1)). */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_RETURN_REG, 0); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); + sljit_set_label(jump, entry); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + /* Returns with y+1. */ + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1, SLJIT_S1, 0); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + /* Returns with Ack(x-1,1) */ + label = sljit_emit_label(compiler); + sljit_set_label(jump2, label); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); + sljit_set_label(jump, entry); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + /* For benchmarking. */ + /* FAILED(code.func2(3, 11) != 16381, "test_call2 case 1 failed\n"); */ + + res = code.func2(3, 3); + sljit_free_code(code.code, NULL); + + FAILED(res != 61, "test_call2 case 1 failed\n"); + + successful_tests++; +} + +static sljit_f64 test_call3_f1(sljit_f32 a, sljit_f32 b, sljit_f64 c) +{ + return (sljit_f64)a + (sljit_f64)b + c; +} + +static sljit_f32 test_call3_f2(sljit_sw a, sljit_f64 b, sljit_f32 c) +{ + return (sljit_f32)((sljit_f64)a + b + (sljit_f64)c); +} + +static sljit_f64 test_call3_f3(sljit_sw a, sljit_f32 b, sljit_sw c) +{ + return (sljit_f64)a + (sljit_f64)b + (sljit_f64)c; +} + +static sljit_f64 test_call3_f4(sljit_f32 a, sljit_sw b) +{ + return (sljit_f64)a + (sljit_f64)b; +} + +static sljit_f32 test_call3_f5(sljit_f32 a, sljit_f64 b, sljit_s32 c) +{ + return (sljit_f32)((sljit_f64)a + b + (sljit_f64)c); +} + +static sljit_sw test_call3_f6(sljit_f64 a, sljit_sw b) +{ + return (sljit_sw)(a + (sljit_f64)b); +} + +static void test_call3(void) +{ + /* Check function calls with floating point arguments. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump = NULL; + sljit_f64 dbuf[7]; + sljit_f32 sbuf[7]; + sljit_sw wbuf[2]; + + if (verbose) + printf("Run test_call3\n"); + + if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + if (verbose) + printf("no fpu available, test_call3 skipped\n"); + successful_tests++; + return; + } + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + dbuf[0] = 5.25; + dbuf[1] = 0.0; + dbuf[2] = 2.5; + dbuf[3] = 0.0; + dbuf[4] = 0.0; + dbuf[5] = 0.0; + dbuf[6] = -18.0; + + sbuf[0] = 6.75f; + sbuf[1] = -3.5f; + sbuf[2] = 1.5f; + sbuf[3] = 0.0f; + sbuf[4] = 0.0f; + + wbuf[0] = 0; + wbuf[1] = 0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 3, 3, 4, 0, sizeof(sljit_sw)); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, F32, F32, F64), SLJIT_IMM, SLJIT_FUNC_ADDR(test_call3_f1)); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, F32, F32, F64)); + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call3_f1)); + /* dbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call3_f2)); + sljit_get_local_base(compiler, SLJIT_R1, 0, -16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F32, W, F64, F32), SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); + /* sbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f32), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -4); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 9); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3(F64, W, F32, W)); + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call3_f3)); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -6); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(F64, F32, W)); + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call3_f4)); + /* dbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call3_f5)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS3(F32, F32, F64, 32), SLJIT_MEM1(SLJIT_SP), 0); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call3_f6)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, F64, W), SLJIT_R0, 0); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_R0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 319); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call3_f6)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, F64, W), SLJIT_R1, 0); + /* wbuf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&dbuf, (sljit_sw)&sbuf, (sljit_sw)&wbuf); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[1] != 8.5, "test_call3 case 1 failed\n"); + FAILED(dbuf[3] != 0.5, "test_call3 case 2 failed\n"); + FAILED(sbuf[3] != 17.75, "test_call3 case 3 failed\n"); + FAILED(dbuf[4] != 11.75, "test_call3 case 4 failed\n"); + FAILED(dbuf[5] != -9.5, "test_call3 case 5 failed\n"); + FAILED(sbuf[4] != 12, "test_call3 case 6 failed\n"); + FAILED(wbuf[0] != SLJIT_FUNC_ADDR(test_call3_f6) - 18, "test_call3 case 7 failed\n"); + FAILED(wbuf[1] != 301, "test_call3 case 8 failed\n"); + + successful_tests++; +} + +static sljit_sw test_call4_f1(sljit_sw a, sljit_s32 b, sljit_sw c, sljit_sw d) +{ + return (sljit_sw)(a + b + c + d - SLJIT_FUNC_ADDR(test_call4_f1)); +} + +static sljit_s32 test_call4_f2(sljit_f64 a, sljit_f32 b, sljit_f64 c, sljit_sw d) +{ + return (sljit_s32)(a + b + c + (sljit_f64)d); +} + +static sljit_f32 test_call4_f3(sljit_f32 a, sljit_s32 b, sljit_f64 c, sljit_sw d) +{ + return (sljit_f32)(a + (sljit_f64)b + c + (sljit_f64)d); +} + +static sljit_f32 test_call4_f4(sljit_f32 a, sljit_f64 b, sljit_f32 c, sljit_f64 d) +{ + return (sljit_f32)(a + b + c + (sljit_f64)d); +} + +static void test_call4(void) +{ + /* Check function calls with four arguments. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_jump* jump = NULL; + sljit_sw wbuf[5]; + sljit_f64 dbuf[3]; + sljit_f32 sbuf[4]; + + if (verbose) + printf("Run test_call4\n"); + + wbuf[0] = 0; + wbuf[1] = 0; + wbuf[2] = SLJIT_FUNC_ADDR(test_call4_f1); + wbuf[3] = 0; + wbuf[4] = 0; + + if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + dbuf[0] = 5.125; + dbuf[1] = 6.125; + dbuf[2] = 4.25; + + sbuf[0] = 0.75; + sbuf[1] = -1.5; + sbuf[2] = 0.0; + sbuf[3] = 0.0; + } + + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 33); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, -20); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call4_f1)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -40); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_R2, 0); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call4_f1)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, -25); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 100); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -10); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_R0, 0); + /* wbuf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 231); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call4_f1) - 100); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, 32, W, W), SLJIT_MEM2(SLJIT_R0, SLJIT_R2), SLJIT_WORD_SHIFT); + /* wbuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); + + if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -100); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(32, F64, F32, F64, W), SLJIT_IMM, SLJIT_FUNC_ADDR(test_call4_f2)); + sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0); + /* wbuf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 36); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 41); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS4(F32, F32, 32, F64, W)); + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call4_f3)); + /* sbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call4_f4)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(F32, F32, F64, F32, F64), SLJIT_R0, 0); + /* sbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_f32), SLJIT_FR0, 0); + } + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&wbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != -27, "test_call4 case 1 failed\n"); + FAILED(wbuf[1] != 65, "test_call4 case 2 failed\n"); + FAILED(wbuf[3] != (sljit_sw)wbuf + 133, "test_call4 case 3 failed\n"); + + if (sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + FAILED(wbuf[4] != -88, "test_call4 case 4 failed\n"); + FAILED(sbuf[2] != 79.75f, "test_call4 case 5 failed\n"); + FAILED(sbuf[3] != 8.625f, "test_call4 case 6 failed\n"); + } + + successful_tests++; +} + +static sljit_sw test_call5_f1(sljit_sw a) +{ + return a + 10000; +} + +static sljit_sw test_call5_f2(sljit_sw a, sljit_s32 b, sljit_s32 c, sljit_sw d) +{ + return a | b | c | d; +} + +static sljit_sw test_call5_f3(sljit_sw a, sljit_s32 b, sljit_s32 c, sljit_sw d) +{ + SLJIT_UNUSED_ARG(a); + return b | c | d; +} + +static sljit_sw test_call5_f4(void) +{ + return 7461932; +} + +static void test_call5(void) +{ + /* Test tail calls. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump *jump; + sljit_uw jump_addr; + sljit_sw executable_offset; + sljit_sw res; + + if (verbose) + printf("Run test_call5\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 4, 4, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS1(W, W), SLJIT_IMM, SLJIT_FUNC_ADDR(test_call5_f1)); + /* Should crash. */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.func1(7987); + sljit_free_code(code.code, NULL); + + FAILED(res != 17987, "test_call5 case 1 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 1, 4, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1); + jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_REWRITABLE_JUMP | SLJIT_CALL_RETURN, SLJIT_ARGS1(W, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_target(jump, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + executable_offset = sljit_get_executable_offset(compiler); + jump_addr = sljit_get_jump_addr(jump); + sljit_free_compiler(compiler); + + sljit_set_jump_addr(jump_addr, SLJIT_FUNC_UADDR(test_call5_f1), executable_offset); + + res = code.func1(3903); + sljit_free_code(code.code, NULL); + + FAILED(res != 13903, "test_call5 case 2 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call5_f2)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x28000000); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x00140000); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x00002800); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x00000041); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(res != 0x28142841, "test_call5 case 3 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 4, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call5_f2)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0x81000000); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x00480000); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x00002100); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x00000014); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_S3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(res != (sljit_sw)0x81482114, "test_call5 case 4 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 4, 0, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_ADDR(test_call5_f3)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x342); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_IMM, 0x451000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x21000000); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, 32, 32, W), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(res != 0x21451342, "test_call5 case 5 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 0, 0, 0, 9); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS0(W), SLJIT_IMM, SLJIT_FUNC_ADDR(test_call5_f4)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(res != 7461932, "test_call5 case 6 failed\n"); + + successful_tests++; +} + +static sljit_sw test_call6_f5(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_f64 d) +{ + if (a == 1345.5 && b == -8724.25 && c == 9034.75 && d == 6307.5) + return 8920567; + return 0; +} + +static sljit_sw test_call6_f6(sljit_f64 a, sljit_f64 b, sljit_f64 c, sljit_sw d) +{ + if (a == 4061.25 && b == -3291.75 && c == 8703.5 && d == 1706) + return 5074526; + return 0; +} + +static void test_call6(void) +{ + /* Test tail calls. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump *jump; + sljit_sw res; + sljit_sw wbuf[1]; + sljit_f64 dbuf[4]; + + if (verbose) + printf("Run test_call6\n"); + + if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + if (verbose) + printf("no fpu available, test_call6 skipped\n"); + successful_tests++; + return; + } + + /* Next test. */ + + dbuf[0] = 9034.75; + dbuf[1] = 6307.5; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2(W, F32, F64), 1, 1, 4, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR0, 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64)); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, F64), SLJIT_IMM, SLJIT_FUNC_ADDR(test_call6_f5)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.test_call6_f1(1345.5f, -8724.25); + sljit_free_code(code.code, NULL); + + FAILED(res != 8920567, "test_call6 case 1 failed\n"); + + /* Next test. */ + + wbuf[0] = SLJIT_FUNC_ADDR(test_call6_f5); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4(W, F64, F64, F64, F64), 1, 0, 4, 0, 0); + sljit_emit_icall(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, F64), SLJIT_MEM0(), (sljit_sw)wbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.test_call6_f2(1345.5, -8724.25, 9034.75, 6307.5); + sljit_free_code(code.code, NULL); + + FAILED(res != 8920567, "test_call6 case 2 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), 1, 0, 4, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); + jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call6_f6)); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.test_call6_f3(4061.25, -3291.75, 8703.5); + sljit_free_code(code.code, NULL); + + FAILED(res != 5074526, "test_call6 case 3 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 1, 0, 4, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); + jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call6_f6)); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.test_call6_f3(4061.25, -3291.75, 8703.5); + sljit_free_code(code.code, NULL); + + FAILED(res != 5074526, "test_call6 case 4 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3(W, F64, F64, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 1, 1, 3, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); + jump = sljit_emit_call(compiler, SLJIT_CALL | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_call6_f6)); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res = code.test_call6_f3(4061.25, -3291.75, 8703.5); + sljit_free_code(code.code, NULL); + + FAILED(res != 5074526, "test_call6 case 5 failed\n"); + + successful_tests++; +} + +static void test_call7(void) +{ + /* Test register argument and keep saved registers. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + sljit_sw buf[9]; + sljit_s32 i; + + if (verbose) + printf("Run test_call7\n"); + + for (i = 0; i < 9; i++) + buf[i] = -1; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 4, 2, 0, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 7945); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -9267); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 4309); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -8321); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6803); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -5497); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, W, W, W, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 2, 0, 0, 32); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[3-6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 6028); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4982); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1289); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 6028, "test_call7 case 1 failed\n"); + FAILED(buf[1] != 6803, "test_call7 case 2 failed\n"); + FAILED(buf[2] != -5497, "test_call7 case 3 failed\n"); + FAILED(buf[3] != 7945, "test_call7 case 4 failed\n"); + FAILED(buf[4] != -9267, "test_call7 case 5 failed\n"); + FAILED(buf[5] != 4309, "test_call7 case 6 failed\n"); + FAILED(buf[6] != -8321, "test_call7 case 7 failed\n"); + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 4, 2, 0, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -2608); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4751); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 5740); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -9704); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -8749); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 9213); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, W, W, W, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 6, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_set_context(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 6, 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[3-7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_sw), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -7351); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 3628); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != -7351, "test_call7 case 8 failed\n"); + FAILED(buf[1] != 3628, "test_call7 case 9 failed\n"); + FAILED(buf[2] != 9213, "test_call7 case 10 failed\n"); + FAILED(buf[3] != -8749, "test_call7 case 11 failed\n"); + FAILED(buf[4] != -2608, "test_call7 case 12 failed\n"); + FAILED(buf[5] != 4751, "test_call7 case 13 failed\n"); + FAILED(buf[6] != 5740, "test_call7 case 14 failed\n"); + FAILED(buf[7] != -9704, "test_call7 case 15 failed\n"); + FAILED(buf[8] != -1, "test_call7 case 16 failed\n"); + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 4, 2, 0, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8653); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7245); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3610); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 4591); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -2865); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 2510); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4V(W, W, W, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[2-7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_sw), SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 6 * sizeof(sljit_sw), SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 7 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 5789); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -9214); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 5789, "test_call7 case 17 failed\n"); + FAILED(buf[1] != -9214, "test_call7 case 18 failed\n"); + FAILED(buf[2] != -2865, "test_call7 case 19 failed\n"); + FAILED(buf[3] != 2510, "test_call7 case 20 failed\n"); + FAILED(buf[4] != 8653, "test_call7 case 21 failed\n"); + FAILED(buf[5] != 7245, "test_call7 case 22 failed\n"); + FAILED(buf[6] != -3610, "test_call7 case 23 failed\n"); + FAILED(buf[7] != 4591, "test_call7 case 24 failed\n"); + FAILED(buf[8] != -1, "test_call7 case 25 failed\n"); + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 2, 3, 0, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6071); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -3817); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 9250); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0(W), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -6278); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1467); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 7150 - 1467); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 8413); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4892); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -7513); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, W, W, W, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, W_R, W_R, W_R, W_R), 4, 2, 0, 0, 256); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_R1, 0); + /* buf[7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R2, 0); + /* buf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 6923); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 6923, "test_call7 case 26 failed\n"); + FAILED(buf[1] != 4892, "test_call7 case 27 failed\n"); + FAILED(buf[2] != -7513, "test_call7 case 28 failed\n"); + FAILED(buf[3] != 9250, "test_call7 case 29 failed\n"); + FAILED(buf[4] != 6071, "test_call7 case 30 failed\n"); + FAILED(buf[5] != -3817, "test_call7 case 31 failed\n"); + FAILED(buf[6] != -6278, "test_call7 case 32 failed\n"); + FAILED(buf[7] != 7150, "test_call7 case 33 failed\n"); + FAILED(buf[8] != 8413, "test_call7 case 34 failed\n"); + + successful_tests++; +} + +static void test_call8(void) +{ + /* Test register argument and keep saved registers. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + sljit_sw buf[9]; + sljit_f64 dbuf[3]; + sljit_s32 i; + + if (verbose) + printf("Run test_call8\n"); + + for (i = 0; i < 8; i++) + buf[i] = -1; + + if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + if (verbose) + printf("no fpu available, test_call8 skipped\n"); + successful_tests++; + return; + } + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + dbuf[0] = 4061.25; + dbuf[1] = -3291.75; + dbuf[2] = 8703.5; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 2, 3, 3, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&dbuf); + /* dbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R1), 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f64)); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_f64)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -8956); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 4381); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -5314); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4(W, F64, F64, F64, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS4(W, F64, F64, F64, W_R), 1, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&dbuf); + /* dbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_FR2, 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64), SLJIT_FR1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2784); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 1503); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 2784, "test_call8 case 1 failed\n"); + FAILED(buf[1] != 1503, "test_call8 case 2 failed\n"); + FAILED(buf[2] != 4381, "test_call8 case 3 failed\n"); + FAILED(buf[3] != -5314, "test_call8 case 4 failed\n"); + FAILED(buf[4] != -8956, "test_call8 case 5 failed\n"); + FAILED(buf[5] != 1706, "test_call8 case 6 failed\n"); + FAILED(buf[6] != -1, "test_call8 case 7 failed\n"); + FAILED(dbuf[0] != 8703.5, "test_call8 case 8 failed\n"); + FAILED(dbuf[1] != 4061.25, "test_call8 case 9 failed\n"); + FAILED(dbuf[2] != -3291.75, "test_call8 case 10 failed\n"); + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + dbuf[0] = 4061.25; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 3, 3, 1, 0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM0(), (sljit_sw)&dbuf); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8793); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -4027); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2910); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4619); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1502); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 5316); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4V(F64, W, W, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_sw), SLJIT_S2, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS4V(F64, W_R, W_R, W_R), 3, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_sw), SLJIT_R0, 0); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 6 * sizeof(sljit_sw), SLJIT_R1, 0); + /* buf[7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 7 * sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 7839); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -9215); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 7839, "test_call8 case 11 failed\n"); + FAILED(buf[1] != -9215, "test_call8 case 12 failed\n"); + FAILED(buf[2] != 5316, "test_call8 case 13 failed\n"); + FAILED(buf[3] != 4619, "test_call8 case 14 failed\n"); + FAILED(buf[4] != -1502, "test_call8 case 15 failed\n"); + FAILED(buf[5] != 8793, "test_call8 case 16 failed\n"); + FAILED(buf[6] != -4027, "test_call8 case 17 failed\n"); + FAILED(buf[7] != 2910, "test_call8 case 18 failed\n"); + FAILED(buf[8] != -1, "test_call8 case 19 failed\n"); + FAILED(dbuf[0] != -4061.25, "test_call8 case 20 failed\n"); + + /* Next test. */ + + for (i = 0; i < 9; i++) + buf[i] = -1; + + dbuf[0] = 4061.25; + dbuf[1] = -3291.75; + dbuf[2] = 8703.5; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 2, 3, 0, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 7869); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -5406); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 4951); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S2, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0(W), 1, 3, 3, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + /* dbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R0), 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64)); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1706); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 4713); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -2078); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS4(W, F64, F64, F64, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS4(W, F64, F64, F64, W_R), 1, 0, 3, 0, 256); + + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&buf[6], SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + /* dbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR2, 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR0, 0); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR1, 0); + + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5074); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 5074, "test_call8 case 20 failed\n"); + FAILED(buf[1] != 4713, "test_call8 case 22 failed\n"); + FAILED(buf[2] != -2078, "test_call8 case 23 failed\n"); + FAILED(buf[3] != 4951, "test_call8 case 24 failed\n"); + FAILED(buf[4] != 7869, "test_call8 case 25 failed\n"); + FAILED(buf[5] != -5406, "test_call8 case 26 failed\n"); + FAILED(buf[6] != 1706, "test_call8 case 27 failed\n"); + FAILED(buf[7] != -1, "test_call8 case 28 failed\n"); + FAILED(dbuf[0] != 8703.5, "test_call8 case 29 failed\n"); + FAILED(dbuf[1] != 4061.25, "test_call8 case 30 failed\n"); + FAILED(dbuf[2] != -3291.75, "test_call8 case 31 failed\n"); + + successful_tests++; +} + +static void test_call9(void) +{ + /* Test register register preservation in keep saveds mode. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + sljit_sw buf[6 + SLJIT_NUMBER_OF_REGISTERS]; + struct sljit_jump* jump; + sljit_s32 i; + + if (verbose) + printf("Run test_call9\n"); + + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), SLJIT_NUMBER_OF_REGISTERS - 3, 3, 0, 0, 0); + + for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 8469 + 1805 * i); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 3671); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 2418); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 1597); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS4V(W, W, W, W)); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 6), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf); + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 3 * sizeof(sljit_sw), SLJIT_S0, 0); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_sw), SLJIT_S1, 0); + /* buf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 5 * sizeof(sljit_sw), SLJIT_S2, 0); + + for (i = 1; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), (6 + i) * (sljit_sw)sizeof(sljit_sw), SLJIT_R(i), 0); + + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS4V(W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_set_context(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS4V(W_R, W_R, W_R, W_R), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE); + + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 0), SLJIT_S0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 1), SLJIT_S1, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)(buf + 2), SLJIT_S2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 6501); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 7149); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 5732); + + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG | SLJIT_CALL_RETURN, SLJIT_ARGS0V()); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM0(), 0); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS0V(), 4, 3, 0, 0, SLJIT_MAX_LOCAL_SIZE / 2); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 3671, "test_call9 case 1 failed\n"); + FAILED(buf[1] != 2418, "test_call9 case 2 failed\n"); + FAILED(buf[2] != 1597, "test_call9 case 3 failed\n"); + FAILED(buf[3] != 6501, "test_call9 case 4 failed\n"); + FAILED(buf[4] != 7149, "test_call9 case 5 failed\n"); + FAILED(buf[5] != 5732, "test_call9 case 6 failed\n"); + + for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS - 3; i++) { + FAILED(buf[6 + i] != 8469 + 1805 * i, "test_call9 case 7 failed\n"); + } + + successful_tests++; +} + +static void test_call10(void) +{ + /* Test return with floating point value. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + sljit_f64 dbuf[2]; + sljit_f32 sbuf[2]; + + if (verbose) + printf("Run test_call10\n"); + + if (!sljit_has_cpu_feature(SLJIT_HAS_FPU)) { + if (verbose) + printf("no fpu available, test_call10 skipped\n"); + successful_tests++; + return; + } + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F64, W), 0, 1, 3, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + dbuf[0] = 35.125; + dbuf[0] = code.test_call10_f2((sljit_sw)dbuf); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[0] != 35.125, "test_call10 case 1 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F32, W), 0, 1, 1, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + sbuf[0] = -9027.5; + sbuf[0] = code.test_call10_f1((sljit_sw)sbuf); + sljit_free_code(code.code, NULL); + + FAILED(sbuf[0] != -9027.5, "test_call10 case 2 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F32, W), 0, 1, 1, 0, sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + sbuf[0] = -6.75; + sbuf[0] = code.test_call10_f1((sljit_sw)sbuf); + sljit_free_code(code.code, NULL); + + FAILED(sbuf[0] != -6.75, "test_call10 case 3 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(F64, W), 0, 1, 1, 0, 2 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64)); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + dbuf[0] = 45.125; + dbuf[0] = code.test_call10_f2((sljit_sw)dbuf); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[0] != 45.125, "test_call10 case 4 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 1, 0, 1, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)dbuf - 33); + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(F64, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_RETURN_FREG, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS1(F64, W_R), 1, 0, 1, 0, 0); + sljit_emit_return(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 33); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + dbuf[0] = 2571.75; + dbuf[1] = 0; + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[1] != 2571.75, "test_call10 case 5 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 1, 0, 1, 0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(F32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)sbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_RETURN_FREG, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS0(F32), 0, 0, 1, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0, SLJIT_MEM0(), (sljit_sw)sbuf); + sljit_emit_return(compiler, SLJIT_MOV_F32, SLJIT_RETURN_FREG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + sbuf[0] = 6310.25; + sbuf[1] = 0; + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(sbuf[1] != 6310.25, "test_call10 case 6 failed\n"); + + successful_tests++; +} + +static void test_call11(void) +{ + /* Test return_to operation. */ + executable_code code, code2; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + struct sljit_label* label; + sljit_s32 i; + sljit_sw buf[3]; + + if (verbose) + printf("Run test_call11\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 2, 1, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -7602); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + label = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); + sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W_R, W_R), 2, 0, 0, 0, 256); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 256 - sizeof(sljit_sw), SLJIT_IMM, -1); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 8945); + sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_R1), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + buf[0] = (sljit_sw)sljit_get_label_addr(label); + buf[1] = 0; + + sljit_free_compiler(compiler); + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 8945, "test_call11 case 1 failed\n"); + FAILED(buf[1] != -7602, "test_call11 case 2 failed\n"); + + /* Next test. */ + + for (i = 0; i < 3; i++) { + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 2, 1, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 6032); + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1(W, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + label = sljit_emit_label(compiler); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_RETURN_REG, 0); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S0, 0); + sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(1), SLJIT_ARGS1V(W_R), 2, i == 1 ? 2 : 1, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_R0, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw)); + if (i == 2) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0); + else + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), SLJIT_MAX_LOCAL_SIZE - sizeof(sljit_sw), SLJIT_IMM, -1); + if (i != 0) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -3890); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 7145); + if (i == 2) + sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_sw)); + else + sljit_emit_return_to(compiler, SLJIT_S(i), 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + buf[0] = (sljit_sw)sljit_get_label_addr(label); + buf[1] = 0; + buf[2] = 0; + + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != 7145, "test_call11 case 3 failed\n"); + FAILED(buf[1] != 6032, "test_call11 case 4 failed\n"); + if (i != 0) + FAILED(buf[2] != -3890, "test_call11 case 5 failed\n"); + } + + /* Next test. */ + + for (i = 0; i < 3; i++) { + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P_R), 2, 1, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_R0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1(W, W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + label = sljit_emit_label(compiler); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)buf); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); + sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W_R), 2, 1, 0, 0, (i == 0) ? 0 : (i == 1) ? 512 : 32768); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, -1); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0x1000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -4502); + sljit_emit_return_to(compiler, SLJIT_MEM1(SLJIT_R1), -0x1000); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + buf[0] = (sljit_sw)sljit_get_label_addr(label); + buf[1] = 0; + + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != -4502, "test_call11 case 6 failed\n"); + FAILED(buf[1] != (sljit_sw)buf, "test_call11 case 7 failed\n"); + } + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + i = SLJIT_S2; +#else + i = SLJIT_S(SLJIT_NUMBER_OF_SAVED_REGISTERS - 1); +#endif + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, i, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + label = sljit_emit_label(compiler); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_S0, i), 0, SLJIT_RETURN_REG, 0); + sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 16); + for (i = 0; i < SLJIT_NUMBER_OF_SAVED_REGISTERS; i++) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_IMM, -1); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, (sljit_sw)(buf + 3)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -3); + sljit_emit_return_to(compiler, SLJIT_MEM2(SLJIT_RETURN_REG, SLJIT_R1), SLJIT_WORD_SHIFT); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + buf[0] = (sljit_sw)sljit_get_label_addr(label); + buf[1] = 0; + buf[2] = 0; + + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != (sljit_sw)(buf + 3), "test_call11 case 8 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P_R, P), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 586000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 392); + sljit_emit_icall(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS0(W), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + label = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_S0, 0, SLJIT_S1, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_RETURN_REG, 0); + sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + + buf[0] = (sljit_sw)sljit_get_label_addr(label); + + sljit_free_compiler(compiler); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(2), SLJIT_ARGS0V(), 2, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 16); + for (i = 2; i < SLJIT_NUMBER_OF_SAVED_REGISTERS; i++) + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_IMM, -1); + /* buf[2] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM0(), (sljit_sw)(buf + 2), SLJIT_S0, 0, SLJIT_S1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 416000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 931); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 2906); + sljit_emit_return_to(compiler, SLJIT_IMM, buf[0]); + + code2.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + + code.func2(SLJIT_FUNC_ADDR(code2.func0), (sljit_sw)buf); + sljit_free_code(code.code, NULL); + sljit_free_code(code2.code, NULL); + + FAILED(buf[0] != 416931, "test_call11 case 9 failed\n"); + FAILED(buf[1] != 2906, "test_call11 case 10 failed\n"); + FAILED(buf[2] != 586392, "test_call11 case 11 failed\n"); + + successful_tests++; +} + +static void test_call12(void) +{ + /* Test get return address. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump *jump; + struct sljit_label *label; + sljit_uw return_addr = 0; + sljit_uw buf[1]; + + if (verbose) + printf("Run test_call12\n"); + + /* Next test. */ + + buf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W), 1, 1, 0, 0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); + label = sljit_emit_label(compiler); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 0, 0, 0, 0); + sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_RETURN_REG, 0); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + return_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != return_addr, "test_call12 case 1 failed\n"); + + /* Next test. */ + + buf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 2, 0, 0, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -1); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS2V(W, W)); + label = sljit_emit_label(compiler); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS - 2, 0, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM0(), (sljit_sw)buf); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + return_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != return_addr, "test_call12 case 2 failed\n"); + + /* Next test. */ + + buf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W), 1, 3, 0, 0, 0); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S2, 0, SLJIT_S0, 0, SLJIT_IMM, 16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1V(W)); + label = sljit_emit_label(compiler); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG | SLJIT_ENTER_KEEP(3), SLJIT_ARGS1V(W_R), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, SLJIT_MAX_LOCAL_SIZE >> 1); + sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 1); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + return_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != return_addr, "test_call12 case 3 failed\n"); + + /* Next test. */ + + buf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W_R), 1, 0, 0, 0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL_REG_ARG, SLJIT_ARGS1V(W)); + label = sljit_emit_label(compiler); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, SLJIT_ENTER_REG_ARG, SLJIT_ARGS1V(W_R), 1, SLJIT_NUMBER_OF_SAVED_REGISTERS >> 1, 0, 0, 64); + sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + return_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != return_addr, "test_call12 case 4 failed\n"); + + if (sljit_has_cpu_feature(SLJIT_HAS_FPU) && SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0) { + /* Next test. */ + + buf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(W), 1, 1, 0, 0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0(W)); + label = sljit_emit_label(compiler); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0); + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0(W), 1, 3, 0, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 64); + sljit_emit_op_dst(compiler, SLJIT_GET_RETURN_ADDRESS, SLJIT_RETURN_REG, 0); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + return_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[0] != return_addr, "test_call12 case 5 failed\n"); + } + + successful_tests++; +} diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestFloat.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestFloat.h new file mode 100755 index 0000000000..24093b840d --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestFloat.h @@ -0,0 +1,2877 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static void test_float1(void) +{ + /* Test fpu monadic functions. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 buf[7]; + sljit_sw buf2[6]; + + if (verbose) + printf("Run test_float1\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf[0] = 7.75; + buf[1] = -4.5; + buf[2] = 0.0; + buf[3] = 0.0; + buf[4] = 0.0; + buf[5] = 0.0; + buf[6] = 0.0; + + buf2[0] = 10; + buf2[1] = 10; + buf2[2] = 10; + buf2[3] = 10; + buf2[4] = 10; + buf2[5] = 10; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 3, 2, 6, 0, 0); + /* buf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1]); + /* buf[3] */ + sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + /* buf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM0(), (sljit_sw)&buf[0]); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0); + sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR2, 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_FR2, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[4], SLJIT_FR3, 0); + /* buf[5] */ + sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_FR4, 0, SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR4, 0); + /* buf[6] */ + sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR4, 0); + + /* buf2[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_F_GREATER); + /* buf2[1] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR5, 0); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_F_GREATER); + /* buf2[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_FR5, 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR1, 0); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_F_EQUAL); + /* buf2[3] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR1, 0); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_F_LESS); + /* buf2[4] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_F_EQUAL); + /* buf2[5] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_F_NOT_EQUAL); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&buf, (sljit_sw)&buf2); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != -4.5, "test_float1 case 1 failed\n"); + FAILED(buf[3] != 4.5, "test_float1 case 2 failed\n"); + FAILED(buf[4] != -7.75, "test_float1 case 3 failed\n"); + FAILED(buf[5] != 4.5, "test_float1 case 4 failed\n"); + FAILED(buf[6] != -4.5, "test_float1 case 5 failed\n"); + + FAILED(buf2[0] != 1, "test_float1 case 6 failed\n"); + FAILED(buf2[1] != 0, "test_float1 case 7 failed\n"); + FAILED(buf2[2] != 1, "test_float1 case 8 failed\n"); + FAILED(buf2[3] != 0, "test_float1 case 9 failed\n"); + FAILED(buf2[4] != 0, "test_float1 case 10 failed\n"); + FAILED(buf2[5] != 1, "test_float1 case 11 failed\n"); + + successful_tests++; +} + +static void test_float2(void) +{ + /* Test fpu diadic functions. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 buf[15]; + + if (verbose) + printf("Run test_float2\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf[0] = 7.25; + buf[1] = 3.5; + buf[2] = 1.75; + buf[3] = 0.0; + buf[4] = 0.0; + buf[5] = 0.0; + buf[6] = 0.0; + buf[7] = 0.0; + buf[8] = 0.0; + buf[9] = 0.0; + buf[10] = 0.0; + buf[11] = 0.0; + buf[12] = 8.0; + buf[13] = 4.0; + buf[14] = 0.0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 1, 6, 0, 0); + + /* ADD */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); + /* buf[3] */ + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 3, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR1, 0); + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR1, 0, SLJIT_FR0, 0, SLJIT_FR1, 0); + /* buf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 4, SLJIT_FR0, 0); + /* buf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 5, SLJIT_FR1, 0); + + /* SUB */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); + /* buf[6] */ + sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 6, SLJIT_FR3, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT); + sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR2, 0, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2); + sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR3, 0, SLJIT_FR2, 0, SLJIT_FR3, 0); + /* buf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 7, SLJIT_FR2, 0); + /* buf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 8, SLJIT_FR3, 0); + + /* MUL */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1); + /* buf[9] */ + sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 9, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT, SLJIT_FR1, 0); + sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR1, 0, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2, SLJIT_FR2, 0); + /* buf[10] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 10, SLJIT_FR1, 0); + /* buf[11] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 11, SLJIT_FR5, 0); + + /* DIV */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_FR5, 0); + /* buf[12] */ + sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_FR1, 0); + sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR5, 0, SLJIT_FR5, 0, SLJIT_FR1, 0); + sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR4, 0, SLJIT_FR1, 0, SLJIT_FR4, 0); + /* buf[13] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13, SLJIT_FR5, 0); + /* buf[14] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 14, SLJIT_FR4, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[3] != 10.75, "test_float2 case 1 failed\n"); + FAILED(buf[4] != 5.25, "test_float2 case 2 failed\n"); + FAILED(buf[5] != 7.0, "test_float2 case 3 failed\n"); + FAILED(buf[6] != 0.0, "test_float2 case 4 failed\n"); + FAILED(buf[7] != 5.5, "test_float2 case 5 failed\n"); + FAILED(buf[8] != 3.75, "test_float2 case 6 failed\n"); + FAILED(buf[9] != 24.5, "test_float2 case 7 failed\n"); + FAILED(buf[10] != 38.5, "test_float2 case 8 failed\n"); + FAILED(buf[11] != 9.625, "test_float2 case 9 failed\n"); + FAILED(buf[12] != 2.0, "test_float2 case 10 failed\n"); + FAILED(buf[13] != 2.0, "test_float2 case 11 failed\n"); + FAILED(buf[14] != 0.5, "test_float2 case 12 failed\n"); + + successful_tests++; +} + +static void test_float3(void) +{ + /* Floating point set flags. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i; + + sljit_sw buf[16]; + union { + sljit_f64 value; + struct { + sljit_s32 value1; + sljit_s32 value2; + } u; + } dbuf[4]; + + if (verbose) + printf("Run test_float3\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 16; i++) + buf[i] = 5; + + /* Two NaNs */ + dbuf[0].u.value1 = 0x7fffffff; + dbuf[0].u.value2 = 0x7fffffff; + dbuf[1].u.value1 = 0x7fffffff; + dbuf[1].u.value2 = 0x7fffffff; + dbuf[2].value = -13.0; + dbuf[3].value = 27.0; + + SLJIT_ASSERT(sizeof(sljit_f64) == 8 && sizeof(sljit_s32) == 4 && sizeof(dbuf[0]) == 8); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 1, 2, 4, 0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); + /* buf[0] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_UNORDERED); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); + /* buf[1] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_ORDERED); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[2] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_UNORDERED); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[3] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_ORDERED); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[4] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_F_LESS); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[5] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_F_GREATER_EQUAL); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[6] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_F_GREATER); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_LESS_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[7] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_F_LESS_EQUAL); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[8] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_F_EQUAL); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_NOT_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + /* buf[9] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_F_NOT_EQUAL); + + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR3, 0, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); + /* buf[10] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_UNORDERED); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_EQUAL, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64)); + /* buf[11] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_F_EQUAL); + + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_ORDERED, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); + /* buf[12] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_ORDERED); + + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR3, 0, SLJIT_FR2, 0); + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), 0); + /* buf[13] */ + cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_UNORDERED); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&buf, (sljit_sw)&dbuf); + + FAILED(buf[0] != 1, "test_float3 case 1 failed\n"); + FAILED(buf[1] != 2, "test_float3 case 2 failed\n"); + FAILED(buf[2] != 2, "test_float3 case 3 failed\n"); + FAILED(buf[3] != 1, "test_float3 case 4 failed\n"); + FAILED(buf[4] != 1, "test_float3 case 5 failed\n"); + FAILED(buf[5] != 2, "test_float3 case 6 failed\n"); + FAILED(buf[6] != 2, "test_float3 case 7 failed\n"); + FAILED(buf[7] != 1, "test_float3 case 8 failed\n"); + FAILED(buf[8] != 2, "test_float3 case 9 failed\n"); + FAILED(buf[9] != 1, "test_float3 case 10 failed\n"); + FAILED(buf[10] != 2, "test_float3 case 11 failed\n"); + FAILED(buf[11] != 1, "test_float3 case 12 failed\n"); + FAILED(buf[12] != 2, "test_float3 case 13 failed\n"); + FAILED(buf[13] != 1, "test_float3 case 14 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_float4(void) +{ + /* Test inline assembly. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + sljit_f64 buf[3]; +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + sljit_u8 inst[16]; +#else + sljit_u32 inst; +#endif + + if (verbose) + printf("Run test_float4\n"); + + buf[0] = 13.5; + buf[1] = -2.25; + buf[2] = 0.0; + + compiler = sljit_create_compiler(NULL, NULL); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, 2, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + /* addsd x, xm */ + inst[0] = 0xf2; + inst[1] = 0x0f; + inst[2] = 0x58; + inst[3] = (sljit_u8)(0xc0 | (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 3) + | sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1)); + sljit_emit_op_custom(compiler, inst, 4); +#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + /* addsd x, xm */ + if (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) > 7 || sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) > 7) { + inst[0] = 0; + if (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) > 7) + inst[0] |= 0x04; /* REX_R */ + if (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) > 7) + inst[0] |= 0x01; /* REX_B */ + inst[1] = 0xf2; + inst[2] = 0x0f; + inst[3] = 0x58; + inst[4] = (sljit_u8)(0xc0 | ((sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) & 0x7) << 3) + | (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) & 0x7)); + sljit_emit_op_custom(compiler, inst, 5); + } else { + inst[0] = 0xf2; + inst[1] = 0x0f; + inst[2] = 0x58; + inst[3] = (sljit_u8)(0xc0 | (sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 3) + | sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1)); + sljit_emit_op_custom(compiler, inst, 4); + } +#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) + /* vadd.f64 dd, dn, dm */ + inst = 0xee300b00 | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 12) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 16) + | (sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + /* fadd rd, rn, rm */ + inst = 0x1e602800 | (sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 5) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) << 16); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + /* fadd frD, frA, frB */ + inst = (63u << 26) | (21u << 1) | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 21) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 16) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) << 11); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + /* add.d fd, fs, ft */ + inst = (17u << 26) | (17u << 21) | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 6) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 11) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) << 16); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) + /* fadd.d rd, rs1, rs2 */ + inst = (0x1u << 25) | (0x7u << 12) | (0x53u) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 7) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 15) + | (sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) << 20; + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + /* adbr r1, r2 */ + inst = 0xb31a0000 + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 4) + | (sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1); + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) + /* fadd.d rd, rs1, rs2 */ + inst = (0x202u << 15) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0)) + | ((sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0) << 5) + | (sljit_u32)sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1) << 10; + sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32)); +#endif + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != 11.25, "test_float4 case 1 failed\n"); + + successful_tests++; +} + +static void test_float5(void) +{ + /* Test floating point compare. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + sljit_sw res[4]; + + union { + sljit_f64 value; + struct { + sljit_u32 value1; + sljit_u32 value2; + } u; + } dbuf[4]; + + if (verbose) + printf("Run test_float5\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + dbuf[0].value = 12.125; + /* a NaN */ + dbuf[1].u.value1 = 0x7fffffff; + dbuf[1].u.value2 = 0x7fffffff; + dbuf[2].value = -13.5; + dbuf[3].value = 12.125; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, P), 1, 1, 3, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); + /* dbuf[0] < dbuf[2] -> -2 */ + jump = sljit_emit_fcmp(compiler, SLJIT_F_GREATER_EQUAL, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, -2); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + /* dbuf[0] and dbuf[1] is not NaN -> 5 */ + jump = sljit_emit_fcmp(compiler, SLJIT_UNORDERED, SLJIT_MEM0(), (sljit_sw)&dbuf[1], SLJIT_FR1, 0); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11); + /* dbuf[0] == dbuf[3] -> 11 */ + jump = sljit_emit_fcmp(compiler, SLJIT_F_EQUAL, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0); + + /* else -> -17 */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -17); + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + res[0] = code.func1((sljit_sw)&dbuf); + dbuf[3].value = 12; + res[1] = code.func1((sljit_sw)&dbuf); + dbuf[1].value = 0; + res[2] = code.func1((sljit_sw)&dbuf); + dbuf[2].value = 20; + res[3] = code.func1((sljit_sw)&dbuf); + + sljit_free_code(code.code, NULL); + + FAILED(res[0] != 11, "test_float5 case 1 failed\n"); + FAILED(res[1] != -17, "test_float5 case 2 failed\n"); + FAILED(res[2] != 5, "test_float5 case 3 failed\n"); + FAILED(res[3] != -2, "test_float5 case 4 failed\n"); + + successful_tests++; +} + +static void test_float6(void) +{ + /* Test single precision floating point. */ + + executable_code code; + struct sljit_compiler* compiler; + sljit_f32 buf[12]; + sljit_sw buf2[6]; + struct sljit_jump* jump; + + if (verbose) + printf("Run test_float6\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf[0] = 5.5; + buf[1] = -7.25; + buf[2] = 0; + buf[3] = 0; + buf[4] = 0; + buf[5] = 0; + buf[6] = 0; + buf[7] = 8.75; + buf[8] = 0; + buf[9] = 16.5; + buf[10] = 0; + buf[11] = 0; + + buf2[0] = -1; + buf2[1] = -1; + buf2[2] = -1; + buf2[3] = -1; + buf2[4] = -1; + buf2[5] = -1; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 3, 2, 6, 0, 0); + + /* buf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32), SLJIT_FR0, 0); + /* buf[3] */ + sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_FR1, 0, SLJIT_FR5, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_FR1, 0); + /* buf[4] */ + sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_FR5, 0); + /* buf[5] */ + sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_FR4, 0); + + /* buf[6] */ + sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR0, 0); + /* buf[7] */ + sljit_emit_fop2(compiler, SLJIT_SUB_F32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_FR5, 0); + /* buf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop2(compiler, SLJIT_MUL_F32, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f32), SLJIT_FR0, 0, SLJIT_FR0, 0); + /* buf[9] */ + sljit_emit_fop2(compiler, SLJIT_DIV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR2, 0); + /* buf[10] */ + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac); + sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), 0x3d0ac); + /* buf[11] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac + sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), -0x3d0ac); + + /* buf2[0] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_F_EQUAL); + /* buf2[1] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_LESS, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + cond_set(compiler, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_F_LESS); + /* buf2[2] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_F_EQUAL); + /* buf2[3] */ + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_F_GREATER_EQUAL, SLJIT_FR1, 0, SLJIT_FR2, 0); + cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_F_GREATER_EQUAL); + + /* buf2[4] */ + jump = sljit_emit_fcmp(compiler, SLJIT_F_LESS_EQUAL | SLJIT_32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_IMM, 7); + sljit_set_label(jump, sljit_emit_label(compiler)); + + /* buf2[5] */ + jump = sljit_emit_fcmp(compiler, SLJIT_F_GREATER | SLJIT_32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_IMM, 6); + sljit_set_label(jump, sljit_emit_label(compiler)); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&buf, (sljit_sw)&buf2); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != -5.5, "test_float6 case 1 failed\n"); + FAILED(buf[3] != 7.25, "test_float6 case 2 failed\n"); + FAILED(buf[4] != 7.25, "test_float6 case 3 failed\n"); + FAILED(buf[5] != -5.5, "test_float6 case 4 failed\n"); + FAILED(buf[6] != -1.75, "test_float6 case 5 failed\n"); + FAILED(buf[7] != 16.0, "test_float6 case 6 failed\n"); + FAILED(buf[8] != 30.25, "test_float6 case 7 failed\n"); + FAILED(buf[9] != 3, "test_float6 case 8 failed\n"); + FAILED(buf[10] != -5.5, "test_float6 case 9 failed\n"); + FAILED(buf[11] != 7.25, "test_float6 case 10 failed\n"); + FAILED(buf2[0] != 1, "test_float6 case 11 failed\n"); + FAILED(buf2[1] != 2, "test_float6 case 12 failed\n"); + FAILED(buf2[2] != 2, "test_float6 case 13 failed\n"); + FAILED(buf2[3] != 1, "test_float6 case 14 failed\n"); + FAILED(buf2[4] != 7, "test_float6 case 15 failed\n"); + FAILED(buf2[5] != -1, "test_float6 case 16 failed\n"); + + successful_tests++; +} + +static void test_float7(void) +{ + /* Test floating point conversions. */ + executable_code code; + struct sljit_compiler* compiler; + int i; + sljit_f64 dbuf[10]; + sljit_f32 sbuf[10]; + sljit_sw wbuf[10]; + sljit_s32 ibuf[10]; + + if (verbose) + printf("Run test_float7\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 10; i++) { + dbuf[i] = 0.0; + sbuf[i] = 0.0; + wbuf[i] = 0; + ibuf[i] = 0; + } + + dbuf[0] = 123.5; + dbuf[1] = -367; + dbuf[2] = 917.75; + + sbuf[0] = 476.25; + sbuf[1] = -1689.75; + + wbuf[0] = 2345; + + ibuf[0] = 312; + ibuf[1] = -9324; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 3, 3, 6, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf); + + /* sbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3); + /* sbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_FR5, 0); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 0); + /* dbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR4, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR2, 0, SLJIT_FR3, 0); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR2, 0); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR3, 0); + + /* wbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2); + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT); + /* wbuf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S1), 0); + /* wbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_FR5, 0); + sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR0, 0, SLJIT_FR5, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4); + /* wbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); + /* ibuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_FR4, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_R0, 0, SLJIT_FR1, 0); + /* ibuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 3 * sizeof(sljit_s32), SLJIT_R0, 0); + + /* dbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_FR2, 0, SLJIT_IMM, -6213); + /* dbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR2, 0); + /* dbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_MEM0(), (sljit_sw)&ibuf[0]); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32)); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_FR1, 0, SLJIT_R0, 0); + /* dbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_FR1, 0); + /* dbuf[9] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM0(), (sljit_sw)(dbuf + 9), SLJIT_IMM, -77); + /* sbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_IMM, -123); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 7190); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_FR3, 0, SLJIT_R0, 0); + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_FR3, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 123); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_R2, 0, SLJIT_IMM, 123 * sizeof(sljit_s32)); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 2); + /* sbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_FR1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 3812); + /* sbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_R1, 0); + /* sbuf[9] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM0(), (sljit_sw)(sbuf + 9), SLJIT_IMM, -79); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[3] != 476.25, "test_float7 case 1 failed\n"); + FAILED(dbuf[4] != 476.25, "test_float7 case 2 failed\n"); + FAILED(dbuf[5] != 2345.0, "test_float7 case 3 failed\n"); + FAILED(dbuf[6] != -6213.0, "test_float7 case 4 failed\n"); + FAILED(dbuf[7] != 312.0, "test_float7 case 5 failed\n"); + FAILED(dbuf[8] != -9324.0, "test_float7 case 6 failed\n"); + FAILED(dbuf[9] != -77.0, "test_float7 case 7 failed\n"); + + FAILED(sbuf[2] != 123.5, "test_float7 case 8 failed\n"); + FAILED(sbuf[3] != 123.5, "test_float7 case 9 failed\n"); + FAILED(sbuf[4] != 476.25, "test_float7 case 10 failed\n"); + FAILED(sbuf[5] != -123, "test_float7 case 11 failed\n"); + FAILED(sbuf[6] != 7190, "test_float7 case 12 failed\n"); + FAILED(sbuf[7] != 312, "test_float7 case 13 failed\n"); + FAILED(sbuf[8] != 3812, "test_float7 case 14 failed\n"); + FAILED(sbuf[9] != -79.0, "test_float7 case 15 failed\n"); + + FAILED(wbuf[1] != -367, "test_float7 case 16 failed\n"); + FAILED(wbuf[2] != 917, "test_float7 case 17 failed\n"); + FAILED(wbuf[3] != 476, "test_float7 case 18 failed\n"); + FAILED(wbuf[4] != -476, "test_float7 case 19 failed\n"); + + FAILED(ibuf[2] != -917, "test_float7 case 20 failed\n"); + FAILED(ibuf[3] != -1689, "test_float7 case 21 failed\n"); + + successful_tests++; +} + +static void test_float8(void) +{ + /* Test floating point conversions. */ + executable_code code; + struct sljit_compiler* compiler; + int i; + sljit_f64 dbuf[10]; + sljit_f32 sbuf[9]; + sljit_sw wbuf[9]; + sljit_s32 ibuf[9]; + sljit_s32* dbuf_ptr = (sljit_s32*)dbuf; + sljit_s32* sbuf_ptr = (sljit_s32*)sbuf; + + if (verbose) + printf("Run test_float8\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 9; i++) { + dbuf_ptr[i << 1] = -1; + dbuf_ptr[(i << 1) + 1] = -1; + sbuf_ptr[i] = -1; + wbuf[i] = -1; + ibuf[i] = -1; + } + +#if IS_64BIT + dbuf[9] = (sljit_f64)SLJIT_W(0x1122334455); +#endif + dbuf[0] = 673.75; + sbuf[0] = -879.75; + wbuf[0] = 345; + ibuf[0] = -249; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 3, 3, 3, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf); + + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S1), 0); + /* sbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0); + /* wbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0); + /* wbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S1), 0); + /* ibuf[2] */ + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 0); + /* ibuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_MEM1(SLJIT_R2), 4 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S1), 0); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S2), 0); + /* dbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_R2), 0); + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R2), 0); + +#if IS_64BIT + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64)); + /* wbuf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 8 * sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_R0, 0, SLJIT_FR2, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_AND32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffff); + /* ibuf[8] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), 8 * sizeof(sljit_s32), SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x4455667788)); + /* dbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_R0, 0); + /* dbuf[9] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64), SLJIT_IMM, SLJIT_W(0x7766554433)); +#endif /* IS_64BIT */ + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func0(); + sljit_free_code(code.code, NULL); + + FAILED(dbuf_ptr[(1 * 2) + 0] != -1, "test_float8 case 1 failed\n"); + FAILED(dbuf_ptr[(1 * 2) + 1] != -1, "test_float8 case 2 failed\n"); + FAILED(dbuf[2] != -879.75, "test_float8 case 3 failed\n"); + FAILED(dbuf_ptr[(3 * 2) + 0] != -1, "test_float8 case 4 failed\n"); + FAILED(dbuf_ptr[(3 * 2) + 1] != -1, "test_float8 case 5 failed\n"); + FAILED(dbuf[4] != 345, "test_float8 case 6 failed\n"); + FAILED(dbuf_ptr[(5 * 2) + 0] != -1, "test_float8 case 7 failed\n"); + FAILED(dbuf_ptr[(5 * 2) + 1] != -1, "test_float8 case 8 failed\n"); + FAILED(dbuf[6] != -249, "test_float8 case 9 failed\n"); + FAILED(dbuf_ptr[(7 * 2) + 0] != -1, "test_float8 case 10 failed\n"); + FAILED(dbuf_ptr[(7 * 2) + 1] != -1, "test_float8 case 11 failed\n"); + + FAILED(sbuf_ptr[1] != -1, "test_float8 case 12 failed\n"); + FAILED(sbuf[2] != 673.75, "test_float8 case 13 failed\n"); + FAILED(sbuf_ptr[3] != -1, "test_float8 case 14 failed\n"); + FAILED(sbuf[4] != 345, "test_float8 case 15 failed\n"); + FAILED(sbuf_ptr[5] != -1, "test_float8 case 16 failed\n"); + FAILED(sbuf[6] != -249, "test_float8 case 17 failed\n"); + FAILED(sbuf_ptr[7] != -1, "test_float8 case 18 failed\n"); + + FAILED(wbuf[1] != -1, "test_float8 case 19 failed\n"); + FAILED(wbuf[2] != 673, "test_float8 case 20 failed\n"); + FAILED(wbuf[3] != -1, "test_float8 case 21 failed\n"); + FAILED(wbuf[4] != -879, "test_float8 case 22 failed\n"); + FAILED(wbuf[5] != -1, "test_float8 case 23 failed\n"); + + FAILED(ibuf[1] != -1, "test_float8 case 24 failed\n"); + FAILED(ibuf[2] != 673, "test_float8 case 25 failed\n"); + FAILED(ibuf[3] != -1, "test_float8 case 26 failed\n"); + FAILED(ibuf[4] != -879, "test_float8 case 27 failed\n"); + FAILED(ibuf[5] != -1, "test_float8 case 28 failed\n"); + +#if IS_64BIT + FAILED(dbuf[8] != (sljit_f64)SLJIT_W(0x4455667788), "test_float8 case 29 failed\n"); + FAILED(dbuf[9] != (sljit_f64)SLJIT_W(0x66554433), "test_float8 case 30 failed\n"); + FAILED(wbuf[8] != SLJIT_W(0x1122334455), "test_float8 case 31 failed\n"); + FAILED(ibuf[8] == 0x4455, "test_float8 case 32 failed\n"); +#endif /* IS_64BIT */ + + successful_tests++; +} + +static void test_float9(void) +{ + /* Test stack and floating point operations. */ + executable_code code; + struct sljit_compiler* compiler; +#if !IS_X86 + sljit_uw size1, size2, size3; + int result; +#endif + sljit_f32 sbuf[7]; + + if (verbose) + printf("Run test_float9\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sbuf[0] = 245.5; + sbuf[1] = -100.25; + sbuf[2] = 713.75; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 3, 6, 0, 8 * sizeof(sljit_f32)); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0); + /* sbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32)); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_IMM, 5934); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32)); + /* sbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32)); + +#if !IS_X86 + size1 = compiler->size; +#endif + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32)); +#if !IS_X86 + size2 = compiler->size; +#endif + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_FR2, 0); +#if !IS_X86 + size3 = compiler->size; +#endif + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR5, 0); +#if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) + result = (compiler->size - size3) == 2 && (size3 - size2) == 1 && (size2 - size1) == 2; +#elif !IS_X86 + result = (compiler->size - size3) == (size3 - size2) && (size3 - size2) == (size2 - size1); +#endif + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + FAILED(sbuf[3] != 245.5, "test_float9 case 1 failed\n"); + FAILED(sbuf[4] != 145.25, "test_float9 case 2 failed\n"); + FAILED(sbuf[5] != 5934, "test_float9 case 3 failed\n"); + FAILED(sbuf[6] != 713.75, "test_float9 case 4 failed\n"); +#if !IS_X86 + FAILED(!result, "test_float9 case 5 failed\n"); +#endif + + successful_tests++; +} + +static void test_float10(void) +{ + /* Test all registers provided by the CPU. */ + executable_code code; + struct sljit_compiler* compiler; + struct sljit_jump* jump; + sljit_f64 buf[3]; + sljit_s32 i; + + if (verbose) + printf("Run test_float10\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + buf[0] = 6.25; + buf[1] = 17.75; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0); + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0); + + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0V()); + /* SLJIT_FR0 contains the first value. */ + for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 1, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]); + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_R0), 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * 17.75 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * 6.25), "test_float10 case 1 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + buf[0] = -32.5; + buf[1] = -11.25; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0); + + for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0); + for (i = 0; i < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FS(i), 0, SLJIT_MEM1(SLJIT_S0), 0); + + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS0V()); + /* SLJIT_FR0 contains the first value. */ + for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_return_void(compiler); + + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS0V(), 1, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]); + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_R0), 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * -11.25 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * -32.5), "test_float10 case 2 failed\n"); + + successful_tests++; +} + +static void test_float11(void) +{ + /* Test float memory accesses with pre/post updates. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_u32 i; + sljit_s32 supported[6]; + sljit_sw wbuf[6]; + sljit_f64 dbuf[4]; + sljit_f32 sbuf[4]; +#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + static sljit_u8 expected[6] = { 1, 1, 1, 1, 0, 0 }; +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + static sljit_u8 expected[6] = { 1, 0, 1, 0, 1, 1 }; +#else + static sljit_u8 expected[6] = { 0, 0, 0, 0, 0, 0 }; +#endif + + if (verbose) + printf("Run test_float11\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 6; i++) + wbuf[i] = 0; + + dbuf[0] = 66.725; + dbuf[1] = 0.0; + dbuf[2] = 0.0; + dbuf[3] = 0.0; + + sbuf[0] = 0.0; + sbuf[1] = -22.125; + sbuf[2] = 0.0; + sbuf[3] = 0.0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 4, 3, 4, 0, sizeof(sljit_sw)); + + supported[0] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_f64)); + if (supported[0] == SLJIT_SUCCESS) { + /* dbuf[1] */ + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 4 * sizeof(sljit_f64)); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F64, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 4 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); + } + + supported[1] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), -(sljit_sw)sizeof(sljit_f64)); + if (supported[1] == SLJIT_SUCCESS) { + /* dbuf[2] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), -(sljit_sw)sizeof(sljit_f64)); + /* wbuf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); + } + + supported[2] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE, SLJIT_FR1, SLJIT_MEM1(SLJIT_R2), -4 * (sljit_sw)sizeof(sljit_f32)); + if (supported[2] == SLJIT_SUCCESS) { + /* sbuf[0] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S2, 0, SLJIT_IMM, 4 * sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE, SLJIT_FR1, SLJIT_MEM1(SLJIT_R2), -4 * (sljit_sw)sizeof(sljit_f32)); + /* wbuf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R2, 0); + } + + supported[3] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR1, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f32)); + if (supported[3] == SLJIT_SUCCESS) { + /* sbuf[2] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S2, 0, SLJIT_IMM, sizeof(sljit_f32)); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_POST, SLJIT_FR1, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32), SLJIT_FR1, 0); + /* wbuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R1, 0); + } + + supported[4] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); + if (supported[4] == SLJIT_SUCCESS) { + /* dbuf[3] */ + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 8 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -8 * (sljit_sw)sizeof(sljit_f64)); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F64, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0); + /* wbuf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0); + } + + supported[5] = sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE, SLJIT_FR2, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 0); + if (supported[5] == SLJIT_SUCCESS) { + /* sbuf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3 * sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_STORE, SLJIT_FR2, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 0); + /* wbuf[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R2, 0); + } + + SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), 0) == SLJIT_ERR_UNSUPPORTED); + SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F32 | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), 0) == SLJIT_ERR_UNSUPPORTED); + +#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + /* TODO: at least for ARM (both V5 and V7) the range below needs further fixing */ + SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 256) == SLJIT_ERR_UNSUPPORTED); + SLJIT_ASSERT(sljit_emit_fmem_update(compiler, SLJIT_MOV_F64 | SLJIT_MEM_SUPP | SLJIT_MEM_POST, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -257) == SLJIT_ERR_UNSUPPORTED); +#endif + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&wbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + FAILED(sizeof(expected) != sizeof(supported) / sizeof(sljit_s32), "test_float11 case 1 failed\n"); + + for (i = 0; i < sizeof(expected); i++) { + if (expected[i]) { + if (supported[i] != SLJIT_SUCCESS) { + printf("test_float11 case %d should be supported\n", i + 1); + return; + } + } else { + if (supported[i] == SLJIT_SUCCESS) { + printf("test_float11 case %d should not be supported\n", i + 1); + return; + } + } + } + + FAILED(supported[0] == SLJIT_SUCCESS && dbuf[1] != 66.725, "test_float11 case 2 failed\n"); + FAILED(supported[0] == SLJIT_SUCCESS && wbuf[0] != (sljit_sw)(dbuf), "test_float11 case 3 failed\n"); + FAILED(supported[1] == SLJIT_SUCCESS && dbuf[2] != 66.725, "test_float11 case 4 failed\n"); + FAILED(supported[1] == SLJIT_SUCCESS && wbuf[1] != (sljit_sw)(dbuf + 1), "test_float11 case 5 failed\n"); + FAILED(supported[2] == SLJIT_SUCCESS && sbuf[0] != -22.125, "test_float11 case 6 failed\n"); + FAILED(supported[2] == SLJIT_SUCCESS && wbuf[2] != (sljit_sw)(sbuf), "test_float11 case 7 failed\n"); + FAILED(supported[3] == SLJIT_SUCCESS && sbuf[2] != -22.125, "test_float11 case 8 failed\n"); + FAILED(supported[3] == SLJIT_SUCCESS && wbuf[3] != (sljit_sw)(sbuf + 2), "test_float11 case 9 failed\n"); + FAILED(supported[4] == SLJIT_SUCCESS && dbuf[3] != 66.725, "test_float11 case 10 failed\n"); + FAILED(supported[4] == SLJIT_SUCCESS && wbuf[4] != (sljit_sw)(dbuf), "test_float11 case 11 failed\n"); + FAILED(supported[5] == SLJIT_SUCCESS && sbuf[3] != -22.125, "test_float11 case 12 failed\n"); + FAILED(supported[5] == SLJIT_SUCCESS && wbuf[5] != (sljit_sw)(sbuf + 3), "test_float11 case 13 failed\n"); + + successful_tests++; +} + +static void test_float12(void) +{ + /* Test floating point argument passing to sljit_emit_enter. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + sljit_sw wbuf[2]; + sljit_s32 ibuf[2]; + sljit_f64 dbuf[3]; + sljit_f32 fbuf[2]; + + if (verbose) + printf("Run test_float12\n"); + + wbuf[0] = 0; + ibuf[0] = 0; + dbuf[0] = 0; + fbuf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(32, F32, W, F64), 2, 2, 2, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR0, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f1(-6834, 674.5f, 2789, -895.25); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 2789, "test_float12 case 1 failed\n"); + FAILED(ibuf[0] != -6834, "test_float12 case 2 failed\n"); + FAILED(dbuf[0] != -895.25, "test_float12 case 3 failed\n"); + FAILED(fbuf[0] != 674.5f, "test_float12 case 4 failed\n"); + + ibuf[0] = 0; + dbuf[0] = 0; + fbuf[0] = 0; + fbuf[1] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F32, F64, F32, 32), 1, 1, 3, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&fbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_FR2, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f2(-4712.5f, 5342.25, 2904.25f, -4607); + sljit_free_code(code.code, NULL); + + FAILED(ibuf[0] != -4607, "test_float12 case 5 failed\n"); + FAILED(dbuf[0] != 5342.25, "test_float12 case 6 failed\n"); + FAILED(fbuf[0] != -4712.5f, "test_float12 case 7 failed\n"); + FAILED(fbuf[1] != 2904.25f, "test_float12 case 8 failed\n"); + + ibuf[0] = 0; + dbuf[0] = 0; + fbuf[0] = 0; + fbuf[1] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F32, 32, F32), 1, 1, 3, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&dbuf, SLJIT_FR0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&fbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f32), SLJIT_FR2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f3(3578.5, 4619.25f, 6859, -1807.75f); + sljit_free_code(code.code, NULL); + + FAILED(ibuf[0] != 6859, "test_float12 case 9 failed\n"); + FAILED(dbuf[0] != 3578.5, "test_float12 case 10 failed\n"); + FAILED(fbuf[0] != 4619.25f, "test_float12 case 11 failed\n"); + FAILED(fbuf[1] != -1807.75f, "test_float12 case 12 failed\n"); + + ibuf[0] = 0; + dbuf[0] = 0; + dbuf[1] = 0; + fbuf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, 32, F32, F64), SLJIT_NUMBER_OF_SCRATCH_REGISTERS + 2, 1, 3, 0, 33); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR2, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR1, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f4(2740.75, -2651, -7909.25, 3671.5); + sljit_free_code(code.code, NULL); + + FAILED(ibuf[0] != -2651, "test_float12 case 13 failed\n"); + FAILED(dbuf[0] != 2740.75, "test_float12 case 14 failed\n"); + FAILED(dbuf[1] != 3671.5, "test_float12 case 15 failed\n"); + FAILED(fbuf[0] != -7909.25, "test_float12 case 16 failed\n"); + + wbuf[0] = 0; + ibuf[0] = 0; + ibuf[1] = 0; + fbuf[0] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F32, 32, W, 32), 1, 3, 1, 0, 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&ibuf); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_s32), SLJIT_S2, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&fbuf, SLJIT_FR0, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f5(-5219.25f, -4530, 7214, 6741); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 7214, "test_float12 case 17 failed\n"); + FAILED(ibuf[0] != -4530, "test_float12 case 18 failed\n"); + FAILED(ibuf[1] != 6741, "test_float12 case 19 failed\n"); + FAILED(fbuf[0] != -5219.25f, "test_float12 case 20 failed\n"); + + wbuf[0] = 0; + wbuf[1] = 0; + dbuf[0] = 0; + dbuf[1] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F64, W, W), 1, 5, 2, 0, SLJIT_MAX_LOCAL_SIZE - 1); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_S0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), SLJIT_MAX_LOCAL_SIZE - 2 * sizeof(sljit_f64), SLJIT_FR0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f6(-3749.75, 5280.5, 9134, -6506); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 9134, "test_float12 case 21 failed\n"); + FAILED(wbuf[1] != -6506, "test_float12 case 22 failed\n"); + FAILED(dbuf[0] != -3749.75, "test_float12 case 23 failed\n"); + FAILED(dbuf[1] != 5280.5, "test_float12 case 24 failed\n"); + + wbuf[0] = 0; + dbuf[0] = 0; + dbuf[1] = 0; + dbuf[2] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F64, W, F64), 1, 1, 3, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f7(-6049.25, 7301.5, 4610, -4312.75); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 4610, "test_float12 case 25 failed\n"); + FAILED(dbuf[0] != -6049.25, "test_float12 case 26 failed\n"); + FAILED(dbuf[1] != 7301.5, "test_float12 case 27 failed\n"); + FAILED(dbuf[2] != -4312.75, "test_float12 case 28 failed\n"); + + ibuf[0] = 0; + dbuf[0] = 0; + dbuf[1] = 0; + dbuf[2] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F64, F64, 32), 1, 1, 3, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM0(), (sljit_sw)&ibuf, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float12_f8(4810.5, -9148.75, 8601.25, 6703); + sljit_free_code(code.code, NULL); + + FAILED(ibuf[0] != 6703, "test_float12 case 29 failed\n"); + FAILED(dbuf[0] != 4810.5, "test_float12 case 30 failed\n"); + FAILED(dbuf[1] != -9148.75, "test_float12 case 31 failed\n"); + FAILED(dbuf[2] != 8601.25, "test_float12 case 32 failed\n"); + + successful_tests++; +} + +static void test_float13(void) +{ + /* Test using all fpu registers. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS]; + sljit_f64 buf2[2]; + struct sljit_jump *jump; + sljit_s32 i; + + if (verbose) + printf("Run test_float13\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf2[0] = 7.75; + buf2[1] = -8.25; + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + buf[i] = 0.0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 1, 2, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S1, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1V(W)); + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), i * (sljit_sw)sizeof(sljit_f64), SLJIT_FR(i), 0); + sljit_emit_return_void(compiler); + + /* Called function. */ + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); + + sljit_set_context(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)buf, (sljit_sw)buf2); + sljit_free_code(code.code, NULL); + + for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) { + FAILED(buf[i] != -8.25, "test_float13 case 1 failed\n"); + } + + for (i = SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) { + FAILED(buf[i] != 7.75, "test_float13 case 2 failed\n"); + } + + /* Next test. */ + + if (SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS >= 3) { + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf2[0] = -6.25; + buf2[1] = 3.75; + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + buf[i] = 0.0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 1, 2, SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2, 1, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FS0, 0, SLJIT_MEM1(SLJIT_S1), 0); + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FS0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S1, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS1V(W)); + + for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), i * (sljit_sw)sizeof(sljit_f64), SLJIT_FR(i), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1) * (sljit_sw)sizeof(sljit_f64), SLJIT_FS0, 0); + sljit_emit_return_void(compiler); + + /* Called function. */ + sljit_set_label(jump, sljit_emit_label(compiler)); + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, SLJIT_MAX_LOCAL_SIZE); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++) + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_FR0, 0); + + sljit_set_context(compiler, 0, SLJIT_ARGS1V(P), 0, 1, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, SLJIT_MAX_LOCAL_SIZE); + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)buf, (sljit_sw)buf2); + sljit_free_code(code.code, NULL); + + for (i = 0; i < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i++) { + FAILED(buf[i] != 3.75, "test_float13 case 3 failed\n"); + } + + for (i = SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2; i++) { + FAILED(buf[i] != -6.25, "test_float13 case 4 failed\n"); + } + + FAILED(buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2] != 0, "test_float13 case 5 failed\n"); + FAILED(buf[SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1] != -6.25, "test_float13 case 6 failed\n"); + } + + successful_tests++; +} + +static void test_float14(void) +{ + /* Test passing arguments in registers. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_sw wbuf[2]; + sljit_f64 dbuf[3]; + + if (verbose) + printf("Run test_float14\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F64, F64, W_R), 1, 0, 3, 0, SLJIT_MAX_LOCAL_SIZE); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM0(), (sljit_sw)&wbuf, SLJIT_R0, 0); + /* dbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float14_f1(7390.25, -8045.5, 1390.75, 8201); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 8201, "test_float14 case 1 failed\n"); + FAILED(dbuf[0] != 7390.25, "test_float14 case 2 failed\n"); + FAILED(dbuf[1] != -8045.5, "test_float14 case 3 failed\n"); + FAILED(dbuf[2] != 1390.75, "test_float14 case 4 failed\n"); + + /* Next test. */ + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS4V(F64, F64, W, W_R), 2, 1, 2, 0, SLJIT_MAX_LOCAL_SIZE); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&wbuf); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_S0, 0); + /* wbuf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_R1, 0); + /* dbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&dbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_FR0, 0); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_FR1, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.test_float14_f2(4892.75, -3702.5, 4731, 8530); + sljit_free_code(code.code, NULL); + + FAILED(wbuf[0] != 4731, "test_float14 case 5 failed\n"); + FAILED(wbuf[1] != 8530, "test_float14 case 6 failed\n"); + FAILED(dbuf[0] != 4892.75, "test_float14 case 7 failed\n"); + FAILED(dbuf[1] != -3702.5, "test_float14 case 8 failed\n"); + + successful_tests++; +} + +static void test_float15_set(struct sljit_compiler *compiler, sljit_s32 compare, sljit_s32 type, sljit_s32 left_fr, sljit_s32 right_fr) +{ + /* Testing both sljit_emit_op_flags and sljit_emit_jump. */ + struct sljit_jump* jump; + + sljit_emit_fop1(compiler, compare | SLJIT_SET(type & 0xfe), left_fr, 0, right_fr, 0); + sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R0, 0, type); + jump = sljit_emit_jump(compiler, type); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2); + sljit_set_label(jump, sljit_emit_label(compiler)); + + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_s8)); +} + +static void test_float15(void) +{ + /* Test floating point comparison. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s8 bbuf[96]; + sljit_s32 i; + + union { + sljit_f64 value; + struct { + sljit_s32 value1; + sljit_s32 value2; + } u; + } dbuf[3]; + + union { + sljit_f32 value; + sljit_s32 value1; + } sbuf[3]; + + if (verbose) + printf("Run test_float15\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + dbuf[0].u.value1 = 0x7fffffff; + dbuf[0].u.value2 = 0x7fffffff; + dbuf[1].value = -13.0; + dbuf[2].value = 27.0; + + sbuf[0].value1 = 0x7fffffff; + sbuf[1].value = -13.0; + sbuf[2].value = 27.0; + + for (i = 0; i < 96; i++) + bbuf[i] = -3; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 3, 3, 6, 0, 0); + + i = SLJIT_CMP_F64; + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64)); + + while (1) { + /* bbuf[0] and bbuf[48] */ + test_float15_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR2, SLJIT_FR3); + /* bbuf[1] and bbuf[49] */ + test_float15_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[2] and bbuf[50] */ + test_float15_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[3] and bbuf[51] */ + test_float15_set(compiler, i, SLJIT_ORDERED_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[4] and bbuf[52] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR2, SLJIT_FR3); + /* bbuf[5] and bbuf[53] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[6] and bbuf[54] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[7] and bbuf[55] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_NOT_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[8] and bbuf[56] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR2, SLJIT_FR3); + /* bbuf[9] and bbuf[57] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR2, SLJIT_FR4); + /* bbuf[10] and bbuf[58] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR0, SLJIT_FR1); + /* bbuf[11] and bbuf[59] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[12] and bbuf[60] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[13] and bbuf[61] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR4, SLJIT_FR2); + /* bbuf[14] and bbuf[62] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[15] and bbuf[63] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[16] and bbuf[64] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR2, SLJIT_FR4); + /* bbuf[17] and bbuf[65] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR4, SLJIT_FR2); + /* bbuf[18] and bbuf[66] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR0, SLJIT_FR1); + /* bbuf[19] and bbuf[67] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[20] and bbuf[68] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[21] and bbuf[69] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR4, SLJIT_FR2); + /* bbuf[22] and bbuf[70] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[23] and bbuf[71] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[24] and bbuf[72] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[25] and bbuf[73] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR2, SLJIT_FR3); + /* bbuf[26] and bbuf[74] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[27] and bbuf[75] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[28] and bbuf[76] */ + test_float15_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR2, SLJIT_FR3); + /* bbuf[29] and bbuf[77] */ + test_float15_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[30] and bbuf[78] */ + test_float15_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[31] and bbuf[79] */ + test_float15_set(compiler, i, SLJIT_ORDERED_NOT_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[32] and bbuf[80] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR2, SLJIT_FR4); + /* bbuf[33] and bbuf[81] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR2, SLJIT_FR3); + /* bbuf[34] and bbuf[82] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR0, SLJIT_FR1); + /* bbuf[35] and bbuf[83] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_LESS, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[36] and bbuf[84] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR2, SLJIT_FR4); + /* bbuf[37] and bbuf[85] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR4, SLJIT_FR2); + /* bbuf[38] and bbuf[86] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[39] and bbuf[87] */ + test_float15_set(compiler, i, SLJIT_ORDERED_GREATER_EQUAL, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[40] and bbuf[88] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR2, SLJIT_FR4); + /* bbuf[41] and bbuf[89] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR4, SLJIT_FR2); + /* bbuf[42] and bbuf[90] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR0, SLJIT_FR1); + /* bbuf[43] and bbuf[91] */ + test_float15_set(compiler, i, SLJIT_UNORDERED_OR_GREATER, SLJIT_FR0, SLJIT_FR2); + + /* bbuf[44] and bbuf[92] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR2, SLJIT_FR3); + /* bbuf[45] and bbuf[93] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR4, SLJIT_FR2); + /* bbuf[46] and bbuf[94] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR0, SLJIT_FR1); + /* bbuf[47] and bbuf[95] */ + test_float15_set(compiler, i, SLJIT_ORDERED_LESS_EQUAL, SLJIT_FR0, SLJIT_FR2); + + if (i == SLJIT_CMP_F32) + break; + + i = SLJIT_CMP_F32; + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S2), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S2), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_f32)); + } + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&bbuf, (sljit_sw)&dbuf, (sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + /* SLJIT_CMP_F64 */ + FAILED(bbuf[0] != 1, "test_float15 case 1 failed\n"); + FAILED(bbuf[1] != 2, "test_float15 case 2 failed\n"); + FAILED(bbuf[2] != 2, "test_float15 case 3 failed\n"); + FAILED(bbuf[3] != 2, "test_float15 case 4 failed\n"); + + FAILED(bbuf[4] != 2, "test_float15 case 5 failed\n"); + FAILED(bbuf[5] != 1, "test_float15 case 6 failed\n"); + FAILED(bbuf[6] != 1, "test_float15 case 7 failed\n"); + FAILED(bbuf[7] != 1, "test_float15 case 8 failed\n"); + + FAILED(bbuf[8] != 2, "test_float15 case 9 failed\n"); + FAILED(bbuf[9] != 1, "test_float15 case 10 failed\n"); + FAILED(bbuf[10] != 2, "test_float15 case 11 failed\n"); + FAILED(bbuf[11] != 2, "test_float15 case 12 failed\n"); + + FAILED(bbuf[12] != 2, "test_float15 case 13 failed\n"); + FAILED(bbuf[13] != 1, "test_float15 case 14 failed\n"); + FAILED(bbuf[14] != 1, "test_float15 case 15 failed\n"); + FAILED(bbuf[15] != 1, "test_float15 case 16 failed\n"); + + FAILED(bbuf[16] != 2, "test_float15 case 17 failed\n"); + FAILED(bbuf[17] != 1, "test_float15 case 18 failed\n"); + FAILED(bbuf[18] != 2, "test_float15 case 19 failed\n"); + FAILED(bbuf[19] != 2, "test_float15 case 20 failed\n"); + + FAILED(bbuf[20] != 1, "test_float15 case 21 failed\n"); + FAILED(bbuf[21] != 2, "test_float15 case 22 failed\n"); + FAILED(bbuf[22] != 1, "test_float15 case 23 failed\n"); + FAILED(bbuf[23] != 1, "test_float15 case 24 failed\n"); + + FAILED(bbuf[24] != 2, "test_float15 case 25 failed\n"); + FAILED(bbuf[25] != 1, "test_float15 case 26 failed\n"); + FAILED(bbuf[26] != 1, "test_float15 case 27 failed\n"); + FAILED(bbuf[27] != 1, "test_float15 case 28 failed\n"); + + FAILED(bbuf[28] != 2, "test_float15 case 29 failed\n"); + FAILED(bbuf[29] != 1, "test_float15 case 30 failed\n"); + FAILED(bbuf[30] != 2, "test_float15 case 31 failed\n"); + FAILED(bbuf[31] != 2, "test_float15 case 32 failed\n"); + + FAILED(bbuf[32] != 1, "test_float15 case 33 failed\n"); + FAILED(bbuf[33] != 2, "test_float15 case 34 failed\n"); + FAILED(bbuf[34] != 1, "test_float15 case 35 failed\n"); + FAILED(bbuf[35] != 1, "test_float15 case 36 failed\n"); + + FAILED(bbuf[36] != 2, "test_float15 case 37 failed\n"); + FAILED(bbuf[37] != 1, "test_float15 case 38 failed\n"); + FAILED(bbuf[38] != 2, "test_float15 case 39 failed\n"); + FAILED(bbuf[39] != 2, "test_float15 case 40 failed\n"); + + FAILED(bbuf[40] != 2, "test_float15 case 41 failed\n"); + FAILED(bbuf[41] != 1, "test_float15 case 42 failed\n"); + FAILED(bbuf[42] != 1, "test_float15 case 43 failed\n"); + FAILED(bbuf[43] != 1, "test_float15 case 44 failed\n"); + + FAILED(bbuf[44] != 1, "test_float15 case 45 failed\n"); + FAILED(bbuf[45] != 2, "test_float15 case 46 failed\n"); + FAILED(bbuf[46] != 2, "test_float15 case 47 failed\n"); + FAILED(bbuf[47] != 2, "test_float15 case 48 failed\n"); + + /* SLJIT_CMP_F32 */ + FAILED(bbuf[48] != 1, "test_float15 case 49 failed\n"); + FAILED(bbuf[49] != 2, "test_float15 case 50 failed\n"); + FAILED(bbuf[50] != 2, "test_float15 case 51 failed\n"); + FAILED(bbuf[51] != 2, "test_float15 case 52 failed\n"); + + FAILED(bbuf[52] != 2, "test_float15 case 53 failed\n"); + FAILED(bbuf[53] != 1, "test_float15 case 54 failed\n"); + FAILED(bbuf[54] != 1, "test_float15 case 55 failed\n"); + FAILED(bbuf[55] != 1, "test_float15 case 56 failed\n"); + + FAILED(bbuf[56] != 2, "test_float15 case 57 failed\n"); + FAILED(bbuf[57] != 1, "test_float15 case 58 failed\n"); + FAILED(bbuf[58] != 2, "test_float15 case 59 failed\n"); + FAILED(bbuf[59] != 2, "test_float15 case 60 failed\n"); + + FAILED(bbuf[60] != 2, "test_float15 case 61 failed\n"); + FAILED(bbuf[61] != 1, "test_float15 case 62 failed\n"); + FAILED(bbuf[62] != 1, "test_float15 case 63 failed\n"); + FAILED(bbuf[63] != 1, "test_float15 case 64 failed\n"); + + FAILED(bbuf[64] != 2, "test_float15 case 65 failed\n"); + FAILED(bbuf[65] != 1, "test_float15 case 66 failed\n"); + FAILED(bbuf[66] != 2, "test_float15 case 67 failed\n"); + FAILED(bbuf[67] != 2, "test_float15 case 68 failed\n"); + + FAILED(bbuf[68] != 1, "test_float15 case 69 failed\n"); + FAILED(bbuf[69] != 2, "test_float15 case 70 failed\n"); + FAILED(bbuf[70] != 1, "test_float15 case 71 failed\n"); + FAILED(bbuf[71] != 1, "test_float15 case 72 failed\n"); + + FAILED(bbuf[72] != 2, "test_float15 case 73 failed\n"); + FAILED(bbuf[73] != 1, "test_float15 case 74 failed\n"); + FAILED(bbuf[74] != 1, "test_float15 case 75 failed\n"); + FAILED(bbuf[75] != 1, "test_float15 case 76 failed\n"); + + FAILED(bbuf[76] != 2, "test_float15 case 77 failed\n"); + FAILED(bbuf[77] != 1, "test_float15 case 78 failed\n"); + FAILED(bbuf[78] != 2, "test_float15 case 79 failed\n"); + FAILED(bbuf[79] != 2, "test_float15 case 80 failed\n"); + + FAILED(bbuf[80] != 1, "test_float15 case 81 failed\n"); + FAILED(bbuf[81] != 2, "test_float15 case 82 failed\n"); + FAILED(bbuf[82] != 1, "test_float15 case 83 failed\n"); + FAILED(bbuf[83] != 1, "test_float15 case 84 failed\n"); + + FAILED(bbuf[84] != 2, "test_float15 case 85 failed\n"); + FAILED(bbuf[85] != 1, "test_float15 case 86 failed\n"); + FAILED(bbuf[86] != 2, "test_float15 case 87 failed\n"); + FAILED(bbuf[87] != 2, "test_float15 case 88 failed\n"); + + FAILED(bbuf[88] != 2, "test_float15 case 89 failed\n"); + FAILED(bbuf[89] != 1, "test_float15 case 90 failed\n"); + FAILED(bbuf[90] != 1, "test_float15 case 91 failed\n"); + FAILED(bbuf[91] != 1, "test_float15 case 92 failed\n"); + + FAILED(bbuf[92] != 1, "test_float15 case 93 failed\n"); + FAILED(bbuf[93] != 2, "test_float15 case 94 failed\n"); + FAILED(bbuf[94] != 2, "test_float15 case 95 failed\n"); + FAILED(bbuf[95] != 2, "test_float15 case 96 failed\n"); + + successful_tests++; +} + +static void test_float16(void) +{ + /* Test sljit_emit_fcopy. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 dbuf[4]; + sljit_f32 sbuf[2]; +#if IS_64BIT + sljit_sw wbuf[2]; + sljit_s32 ibuf[2]; +#else /* !IS_64BIT */ + sljit_s32 ibuf[7]; +#endif /* IS_64BIT */ + + if (verbose) + printf("Run test_float16\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sbuf[0] = 12345.0; + sbuf[1] = -1.0; + ibuf[0] = -1; + ibuf[1] = (sljit_s32)0xc7543100; + dbuf[0] = 123456789012345.0; + dbuf[1] = -1.0; +#if IS_64BIT + wbuf[0] = -1; + wbuf[1] = (sljit_sw)0xc2fee0c29f50cb10; +#else /* !IS_64BIT */ + ibuf[2] = -1; + ibuf[3] = -1; + ibuf[4] = -1; + ibuf[5] = (sljit_sw)0x9f50cb10; + ibuf[6] = (sljit_sw)0xc2fee0c2; +#endif /* IS_64BIT */ + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 5, 5, 5, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)ibuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fcopy(compiler, SLJIT_COPY32_FROM_F32, SLJIT_FR2, SLJIT_R0); + /* ibuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_s32)); + sljit_emit_fcopy(compiler, SLJIT_COPY32_TO_F32, SLJIT_FR4, SLJIT_R3); + /* sbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32), SLJIT_FR4, 0); + +#if IS_64BIT + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)wbuf); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_S2); + /* wbuf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_S2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)); + sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR0, SLJIT_R3); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); + sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_R2); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR3, 0); +#else /* !IS_64BIT */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_REG_PAIR(SLJIT_S3, SLJIT_S2)); + /* ibuf[2-3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_sw), SLJIT_S2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 3 * sizeof(sljit_sw), SLJIT_S3, 0); + + sljit_emit_fcopy(compiler, SLJIT_COPY_FROM_F64, SLJIT_FR1, SLJIT_R2); + /* ibuf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 4 * sizeof(sljit_sw), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_MEM1(SLJIT_R1), 5 * sizeof(sljit_sw)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R1), 6 * sizeof(sljit_sw)); + sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR0, SLJIT_REG_PAIR(SLJIT_R0, SLJIT_R3)); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0); + sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_REG_PAIR(SLJIT_R2, SLJIT_R2)); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)0xc00c0000); + sljit_emit_fcopy(compiler, SLJIT_COPY_TO_F64, SLJIT_FR3, SLJIT_R2); + /* dbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR3, 0); +#endif /* IS_64BIT */ + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)dbuf, (sljit_sw)sbuf); + sljit_free_code(code.code, NULL); + + FAILED(ibuf[0] != (sljit_s32)0x4640e400, "test_float16 case 1 failed\n"); + FAILED(sbuf[1] != -54321.0, "test_float16 case 2 failed\n"); +#if IS_64BIT + FAILED(wbuf[0] != (sljit_sw)0x42dc12218377de40, "test_float16 case 3 failed\n"); + FAILED(dbuf[1] != -543210987654321.0, "test_float16 case 4 failed\n"); + FAILED(dbuf[2] != 0.0, "test_float16 case 5 failed\n"); +#else /* !IS_64BIT */ + FAILED(ibuf[2] != (sljit_sw)0x8377de40, "test_float16 case 3 failed\n"); + FAILED(ibuf[3] != (sljit_sw)0x42dc1221, "test_float16 case 4 failed\n"); + FAILED(ibuf[4] != (sljit_sw)0x42dc1221, "test_float16 case 5 failed\n"); + FAILED(dbuf[1] != -543210987654321.0, "test_float16 case 6 failed\n"); + FAILED(dbuf[2] != 0.0, "test_float16 case 7 failed\n"); + FAILED(dbuf[3] != -3.5, "test_float16 case 8 failed\n"); +#endif /* IS_64BIT */ + + successful_tests++; +} + +static void test_float17(void) +{ + /* Test fselect operation. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 dbuf[10]; + sljit_f32 sbuf[10]; + sljit_s32 i; + + if (verbose) + printf("Run test_float17\n"); + + for (i = 4; i < 10; i++) + dbuf[i] = -1.0; + for (i = 4; i < 10; i++) + sbuf[i] = -1.0; + + dbuf[0] = 759.25; + dbuf[1] = -316.25; + dbuf[2] = 591.5; + dbuf[3] = -801.75; + + sbuf[0] = 630.5; + sbuf[1] = -912.75; + sbuf[2] = 264.25; + sbuf[3] = -407.5; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(W, W), 3, 3, 4, 0, 2 * sizeof(sljit_f64)); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_op2u(compiler, SLJIT_ADD | SLJIT_SET_CARRY, SLJIT_R0, 0, SLJIT_IMM, 1); + sljit_emit_fselect(compiler, SLJIT_CARRY, SLJIT_FR2, SLJIT_FR3, 0, SLJIT_FR2); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, (sljit_s32)0x80000000); + sljit_emit_op2u(compiler, SLJIT_ADD32 | SLJIT_SET_OVERFLOW, SLJIT_R0, 0, SLJIT_IMM, -1); + sljit_emit_fselect(compiler, SLJIT_OVERFLOW, SLJIT_FR2, SLJIT_FR2, 0, SLJIT_FR3); + /* dbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_UNORDERED, SLJIT_FR2, 0, SLJIT_FR3, 0); + sljit_emit_fselect(compiler, SLJIT_UNORDERED, SLJIT_FR3, SLJIT_MEM0(), (sljit_sw)(dbuf + 2), SLJIT_FR2); + /* dbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR3, 0); + sljit_emit_fselect(compiler, SLJIT_ORDERED, SLJIT_FR2, SLJIT_MEM0(), (sljit_sw)(dbuf + 2), SLJIT_FR2); + /* dbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64)); + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_F_GREATER, SLJIT_FR2, 0, SLJIT_FR2, 0); + sljit_emit_fselect(compiler, SLJIT_F_LESS_EQUAL, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f64), SLJIT_FR0); + /* dbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); + sljit_emit_fselect(compiler, SLJIT_F_LESS_EQUAL, SLJIT_FR1, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 3, SLJIT_FR1); + /* dbuf[9] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64), SLJIT_FR1, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 10); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_Z, SLJIT_R0, 0, SLJIT_IMM, 10); + sljit_emit_fselect(compiler, SLJIT_EQUAL | SLJIT_32, SLJIT_FR0, SLJIT_FR1, 0, SLJIT_FR2); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR0, 0); + sljit_emit_fselect(compiler, SLJIT_NOT_EQUAL | SLJIT_32, SLJIT_FR0, SLJIT_FR1, 0, SLJIT_FR2); + /* sbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_FR0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, WCONST(0x1234000000, 0x123400) + 3 * sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_ORDERED_GREATER, SLJIT_FR1, 0, SLJIT_FR2, 0); + sljit_emit_fselect(compiler, SLJIT_ORDERED_GREATER | SLJIT_32, SLJIT_FR1, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_FR2); + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_FR1, 0); + sljit_emit_fselect(compiler, SLJIT_ORDERED_GREATER | SLJIT_32, SLJIT_FR2, SLJIT_MEM1(SLJIT_R1), WCONST(-0x1234000000, -0x123400), SLJIT_FR2); + /* sbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_FR2, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -100); + sljit_emit_op2u(compiler, SLJIT_SUB | SLJIT_SET_SIG_LESS, SLJIT_R0, 0, SLJIT_IMM, 10); + sljit_emit_fselect(compiler, SLJIT_SIG_LESS | SLJIT_32, SLJIT_FR2, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_FR3); + /* sbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 8 * sizeof(sljit_f32), SLJIT_FR2, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S1, 0, SLJIT_IMM, -0x5678 + 2 * (sljit_s32)sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_ORDERED_EQUAL, SLJIT_FR3, 0, SLJIT_FR3, 0); + sljit_emit_fselect(compiler, SLJIT_ORDERED_EQUAL | SLJIT_32, SLJIT_FR3, SLJIT_MEM1(SLJIT_S2), 0x5678, SLJIT_FR3); + /* sbuf[9] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 9 * sizeof(sljit_f32), SLJIT_FR3, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)dbuf, (sljit_sw)sbuf); + sljit_free_code(code.code, NULL); + + FAILED(dbuf[4] != -316.25, "test_float17 case 1 failed\n"); + FAILED(dbuf[5] != 759.25, "test_float17 case 2 failed\n"); + FAILED(dbuf[6] != 759.25, "test_float17 case 3 failed\n"); + FAILED(dbuf[7] != 591.5, "test_float17 case 4 failed\n"); + FAILED(dbuf[8] != -801.75, "test_float17 case 5 failed\n"); + FAILED(dbuf[9] != -316.25, "test_float17 case 6 failed\n"); + FAILED(sbuf[4] != 630.5, "test_float17 case 7 failed\n"); + FAILED(sbuf[5] != -912.75, "test_float17 case 8 failed\n"); + FAILED(sbuf[6] != 264.25, "test_float17 case 9 failed\n"); + FAILED(sbuf[7] != -407.5, "test_float17 case 10 failed\n"); + FAILED(sbuf[8] != -912.75, "test_float17 case 11 failed\n"); + FAILED(sbuf[9] != 264.25, "test_float17 case 12 failed\n"); + + successful_tests++; +} + +static void test_float18(void) +{ + /* Floating point set immediate. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 dbuf[6]; + sljit_f32 sbuf[5]; + sljit_s32 check_buf[2]; + sljit_s32 i; + + if (verbose) + printf("Run test_float18\n"); + + for (i = 0; i < 6; i++) + dbuf[i] = -1.0; + + for (i = 0; i < 5; i++) + sbuf[i] = -1.0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 2, 2, 4, 0, 0); + + sljit_emit_fset64(compiler, SLJIT_FR0, 0.0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR0, 0); + sljit_emit_fset64(compiler, SLJIT_FR1, -0.0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR1, 0); + sljit_emit_fset64(compiler, SLJIT_FR2, 1.0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR2, 0); + sljit_emit_fset64(compiler, SLJIT_FR2, -31.0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR2, 0); + sljit_emit_fset64(compiler, SLJIT_FR2, 545357837627392.0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR2, 0); + sljit_emit_fset64(compiler, SLJIT_FR0, 983752153845214.5); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fset32(compiler, SLJIT_FR0, 0.0f); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_FR0, 0); + sljit_emit_fset32(compiler, SLJIT_FR1, -0.0f); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32), SLJIT_FR1, 0); + sljit_emit_fset32(compiler, SLJIT_FR2, 1.0f); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_FR2, 0); + sljit_emit_fset32(compiler, SLJIT_FR2, 31.0f); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f32), SLJIT_FR2, 0); + sljit_emit_fset32(compiler, SLJIT_FR2, -811.5f); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&dbuf, (sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + copy_u8(check_buf, 0, dbuf + 0, sizeof(sljit_f64)); + FAILED(check_buf[0] != 0, "test_float18 case 1 failed\n"); + FAILED(check_buf[1] != 0, "test_float18 case 2 failed\n"); + copy_u8(check_buf, 0, dbuf + 1, sizeof(sljit_f64)); +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + FAILED(check_buf[0] != 0, "test_float18 case 3 failed\n"); + FAILED(check_buf[1] != (sljit_s32)0x80000000, "test_float18 case 4 failed\n"); +#else /* !SLJIT_LITTLE_ENDIAN */ + FAILED(check_buf[1] != 0, "test_float18 case 3 failed\n"); + FAILED(check_buf[0] != (sljit_s32)0x80000000, "test_float18 case 4 failed\n"); +#endif /* SLJIT_LITTLE_ENDIAN */ + FAILED(dbuf[2] != 1.0, "test_float18 case 5 failed\n"); + FAILED(dbuf[3] != -31.0, "test_float18 case 6 failed\n"); + FAILED(dbuf[4] != 545357837627392.0, "test_float18 case 7 failed\n"); + FAILED(dbuf[5] != 983752153845214.5, "test_float18 case 8 failed\n"); + + copy_u8(check_buf, 0, sbuf + 0, sizeof(sljit_f32)); + FAILED(check_buf[0] != 0, "test_float18 case 9 failed\n"); + copy_u8(check_buf, 0, sbuf + 1, sizeof(sljit_f32)); + FAILED(check_buf[0] != (sljit_s32)0x80000000, "test_float18 case 10 failed\n"); + FAILED(sbuf[2] != 1.0, "test_float18 case 11 failed\n"); + FAILED(sbuf[3] != 31.0, "test_float18 case 12 failed\n"); + FAILED(sbuf[4] != -811.5, "test_float18 case 13 failed\n"); + + successful_tests++; +} + +static void test_float19(void) +{ + /* Floating point convert from unsigned. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f64 dbuf[9]; + sljit_f32 sbuf[9]; + sljit_s32 i; + sljit_sw value1 = WCONST(0xfffffffffffff800, 0xffffff00); + sljit_sw value2 = WCONST(0x8000000000000801, 0x80000101); + + union { + sljit_f64 value; +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + struct { + sljit_u32 low; + sljit_u32 high; + } bin; +#else /* !SLJIT_LITTLE_ENDIAN */ + struct { + sljit_u32 high; + sljit_u32 low; + } bin; +#endif /* SLJIT_LITTLE_ENDIAN */ + } f64_check; + + union { + sljit_f32 value; + sljit_u32 bin; + } f32_check; + + if (verbose) + printf("Run test_float19\n"); + + for (i = 0; i < 9; i++) + dbuf[i] = -1.0; + + for (i = 0; i < 9; i++) + sbuf[i] = -1.0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 4, 4, 4, 0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x7fffffff); + /* dbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_U32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R1, 0); + /* sbuf[0] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_U32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1); + /* dbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_U32, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 3, SLJIT_IMM, (sljit_sw)0xfff00000); + /* sbuf[1] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_U32, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), 2, SLJIT_IMM, (sljit_sw)0xfff00000); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)0xffffff80); + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_U32, SLJIT_FR1, 0, SLJIT_R0, 0); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_U32, SLJIT_FR3, 0, SLJIT_R0, 0); + /* dbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR1, 0); + /* sbuf[2] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_FR3, 0); + + /* dbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_IMM, (sljit_sw)0xffffff00); + /* sbuf[3] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f32), SLJIT_IMM, (sljit_sw)0xffffff00); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, WCONST(0x7fff000000000000, 0x7fff0000)); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_R3, 0); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_R3, 0); + + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_FR2, 0, SLJIT_MEM0(), (sljit_sw)&value1); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_FR1, 0, SLJIT_MEM0(), (sljit_sw)&value1); + /* dbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR2, 0); + /* sbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_FR1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, WCONST(0xaaaaaaaaaaaaaaaa, 0xaaaaaaaa)); + /* dbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_S3, 0); + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_S3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&value2 + 64); + /* dbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_R2), -64); + /* sbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R2), -64); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, WCONST(0x8000000000000401, 0x80000001)); + /* dbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_UW, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_R2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, WCONST(0x8000008000000001, 0x80000081)); + /* sbuf[8] */ + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_UW, SLJIT_MEM1(SLJIT_S1), 8 * sizeof(sljit_f32), SLJIT_R2, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&dbuf, (sljit_sw)&sbuf); + + f64_check.value = dbuf[0]; /* 0x7fffffff */ + FAILED(f64_check.bin.low != 0xffc00000 || f64_check.bin.high != 0x41dfffff, "test_float19 case 1 failed\n"); + f32_check.value = sbuf[0]; /* 0x7fffffff */ + FAILED(f32_check.bin != 0x4f000000, "test_float19 case 2 failed\n"); + f64_check.value = dbuf[1]; /* 0xfff00000 */ + FAILED(f64_check.bin.low != 0 || f64_check.bin.high != 0x41effe00, "test_float19 case 3 failed\n"); + f32_check.value = sbuf[1]; /* 0xfff00000 */ + FAILED(f32_check.bin != 0x4f7ff000, "test_float19 case 4 failed\n"); + f64_check.value = dbuf[2]; /* 0xffffff80 */ + FAILED(f64_check.bin.low != 0xf0000000 || f64_check.bin.high != 0x41efffff, "test_float19 case 5 failed\n"); + f32_check.value = sbuf[2]; /* 0xffffff80 */ + FAILED(f32_check.bin != 0x4f800000, "test_float19 case 6 failed\n"); + f64_check.value = dbuf[3]; /* 0xffffff00 */ + FAILED(f64_check.bin.low != 0xe0000000 || f64_check.bin.high != 0x41efffff, "test_float19 case 7 failed\n"); + f32_check.value = sbuf[3]; /* 0xffffff00 */ + FAILED(f32_check.bin != 0x4f7fffff, "test_float19 case 8 failed\n"); +#if IS_64BIT + f64_check.value = dbuf[4]; /* 0x7fff000000000000 */ + FAILED(f64_check.bin.low != 0 || f64_check.bin.high != 0x43dfffc0, "test_float19 case 9 failed\n"); + f32_check.value = sbuf[4]; /* 0x7fff000000000000 */ + FAILED(f32_check.bin != 0x5efffe00, "test_float19 case 10 failed\n"); + f64_check.value = dbuf[5]; /* 0xfffffffffffff800 */ + FAILED(f64_check.bin.low != 0xffffffff || f64_check.bin.high != 0x43efffff, "test_float19 case 11 failed\n"); + f32_check.value = sbuf[5]; /* 0xfffffffffffff800 */ + FAILED(f32_check.bin != 0x5f800000, "test_float19 case 12 failed\n"); + f64_check.value = dbuf[6]; /* 0xffff000000000000 */ + FAILED(f64_check.bin.low != 0x55555555 || f64_check.bin.high != 0x43e55555, "test_float19 case 13 failed\n"); + f32_check.value = sbuf[6]; /* 0xffff000000000000 */ + FAILED(f32_check.bin != 0x5f2aaaab, "test_float19 case 14 failed\n"); + f64_check.value = dbuf[7]; /* 0x8000000000000801 */ + FAILED(f64_check.bin.low != 1 || f64_check.bin.high != 0x43e00000, "test_float19 case 15 failed\n"); + f32_check.value = sbuf[7]; /* 0x8000000000000801 */ + FAILED(f32_check.bin != 0x5f000000, "test_float19 case 16 failed\n"); + f64_check.value = dbuf[8]; /* 0x8000000000000401 */ + FAILED(f64_check.bin.low != 1 || f64_check.bin.high != 0x43e00000, "test_float19 case 17 failed\n"); + f32_check.value = sbuf[8]; /* 0x8000008000000001 */ + FAILED(f32_check.bin != 0x5f000001, "test_float19 case 18 failed\n"); +#else /* !IS_64BIT */ + f64_check.value = dbuf[4]; /* 0x7fff0000 */ + FAILED(f64_check.bin.low != 0 || f64_check.bin.high != 0x41dfffc0, "test_float19 case 9 failed\n"); + f32_check.value = sbuf[4]; /* 0x7fff0000 */ + FAILED(f32_check.bin != 0x4efffe00, "test_float19 case 10 failed\n"); + f64_check.value = dbuf[5]; /* 0xffffff00 */ + FAILED(f64_check.bin.low != 0xe0000000 || f64_check.bin.high != 0x41efffff, "test_float19 case 11 failed\n"); + f32_check.value = sbuf[5]; /* 0xffffff00 */ + FAILED(f32_check.bin != 0x4f7fffff, "test_float19 case 12 failed\n"); + f64_check.value = dbuf[6]; /* 0xaaaaaaaa */ + FAILED(f64_check.bin.low != 0x55400000 || f64_check.bin.high != 0x41e55555, "test_float19 case 13 failed\n"); + f32_check.value = sbuf[6]; /* 0xaaaaaaaa */ + FAILED(f32_check.bin != 0x4f2aaaab, "test_float19 case 14 failed\n"); + f64_check.value = dbuf[7]; /* 0x80000101 */ + FAILED(f64_check.bin.low != 0x20200000 || f64_check.bin.high != 0x41e00000, "test_float19 case 15 failed\n"); + f32_check.value = sbuf[7]; /* 0x80000101 */ + FAILED(f32_check.bin != 0x4f000001, "test_float19 case 16 failed\n"); + f64_check.value = dbuf[8]; /* 0x80000001 */ + FAILED(f64_check.bin.low != 0x00200000 || f64_check.bin.high != 0x41e00000, "test_float19 case 17 failed\n"); + f32_check.value = sbuf[8]; /* 0x80000081 */ + FAILED(f32_check.bin != 0x4f000001, "test_float19 case 18 failed\n"); +#endif /* IS_64BIT */ + + successful_tests++; +} + +static void test_float20(void) +{ + /* Test fpu copysign. */ + executable_code code; + struct sljit_compiler* compiler; + int i; + + union { + sljit_f64 value; + struct { +#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN + sljit_u32 lo; + sljit_u32 hi; +#else /* !SLJIT_LITTLE_ENDIAN */ + sljit_u32 hi; + sljit_u32 lo; +#endif /* SLJIT_LITTLE_ENDIAN */ + } bits; + } dbuf[8]; + union { + sljit_f32 value; + sljit_u32 bits; + } sbuf[8]; + + if (verbose) + printf("Run test_float20\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 8; i++) + dbuf[i].value = 123.0; + + for (i = 0; i < 8; i++) + sbuf[i].value = 123.0f; + + dbuf[0].value = 1786.5; + dbuf[1].value = -8403.25; + dbuf[2].bits.lo = 0; + dbuf[2].bits.hi = 0x7fff0000; + dbuf[3].value = 9054; + + sbuf[0].value = 6371.75f; + sbuf[1].value = -2713.5f; + sbuf[2].bits = 0xfff00000; + sbuf[3].value = -5791.25f; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 2, 2, 6, 0, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64)); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F64, SLJIT_FR0, SLJIT_FR0, 0, SLJIT_FR1, 0); + /* dbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F32, SLJIT_FR3, SLJIT_FR4, 0, SLJIT_FR3, 0); + /* sbuf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR3, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 8 * sizeof(sljit_f64)); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F64, SLJIT_FR2, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0, SLJIT_MEM1(SLJIT_R1), -7 * (sljit_sw)sizeof(sljit_f64)); + /* dbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR2, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F32, SLJIT_FR5, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 2, SLJIT_FR4, 0); + /* sbuf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_FR5, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64)); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F64, SLJIT_FR0, SLJIT_FR3, 0, SLJIT_FR2, 0); + /* dbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR0, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f32)); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 0x12345); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F32, SLJIT_FR2, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), -0x12345 + (sljit_sw)sizeof(sljit_f32)); + /* sbuf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_FR2, 0); + + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F64, SLJIT_FR5, SLJIT_MEM0(), (sljit_sw)(dbuf + 1), SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64)); + /* dbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_FR5, 0); + + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F32, SLJIT_FR4, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_MEM0(), (sljit_sw)(sbuf + 2)); + /* sbuf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_FR4, 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&dbuf, (sljit_sw)&sbuf); + FAILED(dbuf[4].value != -1786.5, "test_float20 case 1 failed\n"); + FAILED(sbuf[4].value != 2713.5, "test_float20 case 2 failed\n"); + FAILED(dbuf[5].bits.lo != 0, "test_float20 case 3 failed\n"); + FAILED(dbuf[5].bits.hi != 0xffff0000, "test_float20 case 4 failed\n"); + FAILED(sbuf[5].bits != 0x7ff00000, "test_float20 case 5 failed\n"); + FAILED(dbuf[6].value != 9054, "test_float20 case 6 failed\n"); + FAILED(sbuf[6].value != -5791.25, "test_float20 case 7 failed\n"); + FAILED(dbuf[7].value != 8403.25, "test_float20 case 8 failed\n"); + FAILED(sbuf[7].value != -sbuf[0].value, "test_float20 case 9 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_float21(void) +{ + /* Test f64 as f32 register pair access. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_f32 buf[10]; + sljit_sw num; + sljit_s32 i; + + if (verbose) + printf("Run test_float21\n"); + + if (!sljit_has_cpu_feature(SLJIT_HAS_F64_AS_F32_PAIR)) { + if (verbose) + printf("f32 register pairs are not available, test_float21 skipped\n"); + successful_tests++; + return; + } + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + buf[0] = -45.25; + buf[1] = 33.5; + buf[2] = -104.75; + + for (i = 3; i < 10; i++) + buf[i] = -1.0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 2, 4, 2, 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FR0), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + + sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_F64_SECOND(SLJIT_FR0), 0, SLJIT_F64_SECOND(SLJIT_FR0), 0); + /* buf[3] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FR0), 0); + + sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_F64_SECOND(SLJIT_FR0), 0, SLJIT_FR0, 0); + /* buf[4] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FR0), 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 89); + sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_F64_SECOND(SLJIT_FR1), 0, SLJIT_R0, 0); + /* buf[5] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FR1), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FR1), 0, SLJIT_FR1, 0); + /* num */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM0(), (sljit_sw)&num, SLJIT_F64_SECOND(SLJIT_FR1), 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FS1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FS1), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_F64_SECOND(SLJIT_FS1), 0, SLJIT_FS1, 0, SLJIT_F64_SECOND(SLJIT_FS1), 0); + /* buf[6] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FS1), 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FR1), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop2r(compiler, SLJIT_COPYSIGN_F32, SLJIT_F64_SECOND(SLJIT_FR1), SLJIT_FR1, 0, SLJIT_F64_SECOND(SLJIT_FR1), 0); + /* buf[7] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FR1), 0); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FS0), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fset32(compiler, SLJIT_F64_SECOND(SLJIT_FS0), -78.75f); + /* buf[8] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FS0), 0); + + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_F64_SECOND(SLJIT_FR3), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32)); + sljit_emit_fcopy(compiler, SLJIT_COPY32_TO_F32, SLJIT_F64_SECOND(SLJIT_FR3), SLJIT_S1); + /* buf[9] */ + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_F64_SECOND(SLJIT_FR3), 0); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + sljit_free_code(code.code, NULL); + + FAILED(buf[3] != -33.5, "test_float21 case 1 failed\n"); + FAILED(buf[4] != 45.25, "test_float21 case 2 failed\n"); + FAILED(buf[5] != 89.0, "test_float21 case 3 failed\n"); + FAILED(num != -104, "test_float21 case 4 failed\n"); + FAILED(buf[6] != -11.75, "test_float21 case 5 failed\n"); + FAILED(buf[7] != -33.5, "test_float21 case 6 failed\n"); + FAILED(buf[8] != -78.75, "test_float21 case 7 failed\n"); + FAILED(buf[9] != -45.25, "test_float21 case 8 failed\n"); + + successful_tests++; +} + +static void test_float22(void) +{ + /* Test float to int conversion corner cases. */ + executable_code code; + struct sljit_compiler *compiler; + struct sljit_label *label; + int i; + + union { + sljit_f64 value_f64; + sljit_uw value_uw; + sljit_u32 value_u32; + + struct { +#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN + sljit_u32 lo; + sljit_u32 hi; +#else /* !SLJIT_LITTLE_ENDIAN */ + sljit_u32 hi; + sljit_u32 lo; +#endif /* SLJIT_LITTLE_ENDIAN */ + } bits; + } dbuf[32]; + union { + sljit_f32 value_f32; + sljit_u32 bits; + } sbuf[6]; + + const sljit_uw min_uw = (sljit_uw)1 << ((sizeof(sljit_uw) * 8) - 1); + const sljit_u32 min_u32 = (sljit_u32)1 << 31; + +#if SLJIT_CONV_MAX_FLOAT == SLJIT_CONV_RESULT_MIN_INT + const sljit_uw large_pos_uw = min_uw; + const sljit_u32 large_pos_u32 = min_u32; +#else + const sljit_uw large_pos_uw = min_uw - 1; + const sljit_u32 large_pos_u32 = min_u32 - 1; +#endif + +#if SLJIT_CONV_MIN_FLOAT == SLJIT_CONV_RESULT_MIN_INT + const sljit_uw large_neg_uw = min_uw; + const sljit_u32 large_neg_u32 = min_u32; +#else + const sljit_uw large_neg_uw = min_uw - 1; + const sljit_u32 large_neg_u32 = min_u32 - 1; +#endif + +#if SLJIT_CONV_NAN_FLOAT == SLJIT_CONV_RESULT_MIN_INT + const sljit_uw nan_uw = min_uw; + const sljit_u32 nan_u32 = min_u32; +#elif SLJIT_CONV_NAN_FLOAT == SLJIT_CONV_RESULT_MAX_INT + const sljit_uw nan_uw = min_uw - 1; + const sljit_u32 nan_u32 = min_u32 - 1; +#else + const sljit_uw nan_uw = 0; + const sljit_u32 nan_u32 = 0; +#endif + + if (verbose) + printf("Run test_float22\n"); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + for (i = 0; i < 31; i++) + dbuf[i].value_f64 = 123.0; + + /* Large positive integer */ + dbuf[0].bits.hi = (sljit_u32)0x7fe << 20; + dbuf[0].bits.lo = 0; + /* Large negative integer */ + dbuf[1].bits.hi = (sljit_u32)0xffe << 20; + dbuf[1].bits.lo = 0; + /* Positive infinity */ + dbuf[2].bits.hi = (sljit_u32)0x7ff << 20; + dbuf[2].bits.lo = 0; + /* Negative infinity */ + dbuf[3].bits.hi = (sljit_u32)0xfff << 20; + dbuf[3].bits.lo = 0; + /* Canonical NaN */ + dbuf[4].bits.hi = (sljit_u32)0xfff << 19; + dbuf[4].bits.lo = 0; + /* NaN */ + dbuf[5].bits.hi = (sljit_u32)0xfff << 20; + dbuf[5].bits.lo = 1; + + /* Large positive integer */ + sbuf[0].bits = (sljit_u32)0x7f000000; + /* Large negative integer */ + sbuf[1].bits = (sljit_u32)0xff000000; + /* Positive infinity */ + sbuf[2].bits = (sljit_u32)0x7f800000; + /* Negative infinity */ + sbuf[3].bits = (sljit_u32)0xff800000; + /* Canonical NaN */ + sbuf[4].bits = (sljit_u32)0x7fc00000; + /* NaN */ + sbuf[5].bits = (sljit_u32)0x7f800001; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, P), 2, 2, 2, 0, 0); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 6 * sizeof(sljit_f64)); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_R0, 0); + + label = sljit_emit_label(compiler); + /* dbuf[6 - 17] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_f64)); + sljit_set_label(sljit_emit_cmp(compiler, SLJIT_LESS, SLJIT_S0, 0, SLJIT_R1, 0), label); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 6 * sizeof(sljit_f32)); + + label = sljit_emit_label(compiler); + /* dbuf[18 - 29] */ + sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S1), 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64)); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, sizeof(sljit_f32)); + sljit_set_label(sljit_emit_cmp(compiler, SLJIT_LESS, SLJIT_S1, 0, SLJIT_R1, 0), label); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&dbuf, (sljit_sw)&sbuf); + sljit_free_code(code.code, NULL); + + /* Large integer */ + FAILED(dbuf[6].value_uw != large_pos_uw, "test_float22 case 1 failed\n"); + FAILED(dbuf[7].value_u32 != large_pos_u32, "test_float22 case 2 failed\n"); + FAILED(dbuf[8].value_uw != large_neg_uw, "test_float22 case 3 failed\n"); + FAILED(dbuf[9].value_u32 != large_neg_u32, "test_float22 case 4 failed\n"); + /* Infinity */ + FAILED(dbuf[10].value_uw != large_pos_uw, "test_float22 case 5 failed\n"); + FAILED(dbuf[11].value_u32 != large_pos_u32, "test_float22 case 6 failed\n"); + FAILED(dbuf[12].value_uw != large_neg_uw, "test_float22 case 7 failed\n"); + FAILED(dbuf[13].value_u32 != large_neg_u32, "test_float22 case 8 failed\n"); + /* NaN */ + FAILED(dbuf[14].value_uw != nan_uw, "test_float22 case 9 failed\n"); + FAILED(dbuf[15].value_u32 != nan_u32, "test_float22 case 10 failed\n"); + FAILED(dbuf[16].value_uw != nan_uw, "test_float22 case 11 failed\n"); + FAILED(dbuf[17].value_u32 != nan_u32, "test_float22 case 12 failed\n"); + + /* Large integer */ + FAILED(dbuf[18].value_uw != large_pos_uw, "test_float22 case 13 failed\n"); + FAILED(dbuf[19].value_u32 != large_pos_u32, "test_float22 case 14 failed\n"); + FAILED(dbuf[20].value_uw != large_neg_uw, "test_float22 case 15 failed\n"); + FAILED(dbuf[21].value_u32 != large_neg_u32, "test_float22 case 16 failed\n"); + /* Infinity */ + FAILED(dbuf[22].value_uw != large_pos_uw, "test_float22 case 17 failed\n"); + FAILED(dbuf[23].value_u32 != large_pos_u32, "test_float22 case 18 failed\n"); + FAILED(dbuf[24].value_uw != large_neg_uw, "test_float22 case 19 failed\n"); + FAILED(dbuf[25].value_u32 != large_neg_u32, "test_float22 case 20 failed\n"); + /* NaN */ + FAILED(dbuf[26].value_uw != nan_uw, "test_float22 case 21 failed\n"); + FAILED(dbuf[27].value_u32 != nan_u32, "test_float22 case 22 failed\n"); + FAILED(dbuf[28].value_uw != nan_uw, "test_float22 case 23 failed\n"); + FAILED(dbuf[29].value_u32 != nan_u32, "test_float22 case 24 failed\n"); + + FAILED(dbuf[30].value_f64 != 123.0, "test_float22 case 25 failed\n"); + + successful_tests++; +} diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSerialize.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSerialize.h new file mode 100755 index 0000000000..522e91c5be --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSerialize.h @@ -0,0 +1,361 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static void test_serialize1(void) +{ + /* Test serializing large code. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *label; + struct sljit_jump *jump1; + struct sljit_jump *jump2; + struct sljit_jump *mov_addr; + sljit_sw executable_offset; + sljit_uw const_addr; + sljit_uw jump_addr; + sljit_uw label_addr; + sljit_sw buf[3]; + sljit_uw* serialized_buffer; + sljit_uw serialized_size; + sljit_s32 i; + + if (verbose) + printf("Run test_serialize1\n"); + + FAILED(!compiler, "cannot create compiler\n"); + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 2, 0, 0, 0); + + jump1 = sljit_emit_jump(compiler, SLJIT_JUMP); + label = sljit_emit_label(compiler); + jump2 = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump2, label); + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); + + mov_addr = sljit_emit_mov_addr(compiler, SLJIT_R2, 0); + /* buf[0] */ + sljit_emit_const(compiler, SLJIT_MEM1(SLJIT_S0), 0, -1234); + + sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_R2, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, -1234); + + label = sljit_emit_label(compiler); + sljit_set_label(mov_addr, label); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7); + for (i = 0; i < 4096; i++) + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 3); + + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R1, 0); + + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_IMM, -56789); + jump1 = sljit_emit_jump(compiler, SLJIT_JUMP | SLJIT_REWRITABLE_JUMP); + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_IMM, 0); + label = sljit_emit_label(compiler); + + serialized_buffer = sljit_serialize_compiler(compiler, 0, &serialized_size); + FAILED(!serialized_buffer, "cannot serialize compiler\n"); + sljit_free_compiler(compiler); + + /* Continue code generation. */ + compiler = sljit_deserialize_compiler(serialized_buffer, serialized_size, 0, NULL, NULL); + SLJIT_FREE(serialized_buffer, NULL); + FAILED(!compiler, "cannot deserialize compiler\n"); + + jump1 = sljit_emit_jump(compiler, SLJIT_JUMP); + label = sljit_emit_label(compiler); + jump2 = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump2, label); + label = sljit_emit_label(compiler); + sljit_set_label(jump1, label); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + executable_offset = sljit_get_executable_offset(compiler); + const_addr = sljit_get_const_addr(sljit_get_first_const(compiler)); + jump1 = sljit_get_next_jump(sljit_get_next_jump(sljit_get_next_jump(sljit_get_first_jump(compiler)))); + SLJIT_ASSERT(!sljit_jump_is_mov_addr(jump1)); + jump_addr = sljit_get_jump_addr(jump1); + label = sljit_get_next_label(sljit_get_next_label(sljit_get_next_label(sljit_get_next_label(sljit_get_first_label(compiler))))); + label_addr = sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + sljit_set_const(const_addr, 87654, executable_offset); + sljit_set_jump_addr(jump_addr, label_addr, executable_offset); + + code.func1((sljit_sw)&buf); + FAILED(buf[0] != 87654, "test_serialize1 case 1 failed\n"); + FAILED(buf[1] != 7 + 4096 * 3, "test_serialize1 case 2 failed\n"); + FAILED(buf[2] != -56789, "test_serialize1 case 3 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_serialize2(void) +{ + /* Test serializing jumps/labels. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *label; + struct sljit_jump *jump; + sljit_uw* serialized_buffer; + sljit_uw serialized_size; + sljit_sw buf[3]; + + if (verbose) + printf("Run test_serialize2\n"); + + FAILED(!compiler, "cannot create compiler\n"); + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS2V(P, W), 3, 3, 0, 0, 32); + sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_S1, 0, SLJIT_IMM, 37); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 0); + + sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, -5678); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 16, SLJIT_IMM, -8765); + + sljit_emit_mov_addr(compiler, SLJIT_S2, 0); + sljit_emit_cmp(compiler, SLJIT_NOT_EQUAL, SLJIT_S2, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 0); + + serialized_buffer = sljit_serialize_compiler(compiler, 0, &serialized_size); + FAILED(!serialized_buffer, "cannot serialize compiler\n"); + sljit_free_compiler(compiler); + + /* Continue code generation. */ + compiler = sljit_deserialize_compiler(serialized_buffer, serialized_size, 0, NULL, NULL); + SLJIT_FREE(serialized_buffer, NULL); + FAILED(!compiler, "cannot deserialize compiler\n"); + + label = sljit_emit_label(compiler); + SLJIT_ASSERT(sljit_get_label_index(label) == 1); + jump = sljit_get_first_jump(compiler); + SLJIT_ASSERT(!sljit_jump_is_mov_addr(jump)); + SLJIT_ASSERT(!sljit_jump_has_label(jump) && !sljit_jump_has_target(jump)); + sljit_set_label(jump, label); + + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 3456); + + label = sljit_get_first_label(compiler); + SLJIT_ASSERT(sljit_get_label_index(label) == 0); + jump = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump, label); + + sljit_emit_label(compiler); + + serialized_buffer = sljit_serialize_compiler(compiler, 0, &serialized_size); + FAILED(!serialized_buffer, "cannot serialize compiler\n"); + sljit_free_compiler(compiler); + + /* Continue code generation. */ + compiler = sljit_deserialize_compiler(serialized_buffer, serialized_size, 0, NULL, NULL); + SLJIT_FREE(serialized_buffer, NULL); + FAILED(!compiler, "cannot deserialize compiler\n"); + + sljit_emit_return_void(compiler); + + jump = sljit_get_first_jump(compiler); + SLJIT_ASSERT(sljit_jump_has_label(jump) && !sljit_jump_has_target(jump)); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(sljit_jump_is_mov_addr(jump)); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(!sljit_jump_is_mov_addr(jump)); + SLJIT_ASSERT(!sljit_jump_has_label(jump) && !sljit_jump_has_target(jump)); + + label = sljit_emit_label(compiler); + sljit_set_label(jump, label); + + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SP), 16); + sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_S2, 0); + + label = sljit_get_first_label(compiler); + SLJIT_ASSERT(sljit_get_label_index(label) == 0); + label = sljit_get_next_label(label); + SLJIT_ASSERT(sljit_get_label_index(label) == 1); + label = sljit_get_next_label(label); + SLJIT_ASSERT(sljit_get_label_index(label) == 2); + jump = sljit_get_next_jump(sljit_get_first_jump(compiler)); + SLJIT_ASSERT(sljit_jump_is_mov_addr(jump)); + sljit_set_label(jump, label); + label = sljit_get_next_label(label); + SLJIT_ASSERT(sljit_get_label_index(label) == 3); + SLJIT_ASSERT(sljit_get_next_label(label) == NULL); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func2((sljit_sw)&buf, 37); + FAILED(buf[0] != -5678, "test_serialize2 case 1 failed\n"); + FAILED(buf[1] != 3456, "test_serialize2 case 2 failed\n"); + FAILED(buf[2] != -8765, "test_serialize2 case 3 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_serialize3_f1(sljit_sw a, sljit_sw b, sljit_sw c) +{ + sljit_sw* ptr = (sljit_sw*)c; + ptr[0] = a; + ptr[1] = b; +} + +static void test_serialize3(void) +{ + /* Test serializing consts/calls. */ + executable_code code; + struct sljit_compiler* compiler = sljit_create_compiler(NULL, NULL); + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + sljit_sw executable_offset; + sljit_uw* serialized_buffer; + sljit_uw serialized_size; + sljit_sw buf[6]; + sljit_sw label_addr; + sljit_s32 i; + + if (verbose) + printf("Run test_serialize3\n"); + + FAILED(!compiler, "cannot create compiler\n"); + for (i = 0; i < 6 ; i++) + buf[i] = 0; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 3, 3, 0, 0, 32); + + sljit_emit_mov_addr(compiler, SLJIT_R0, 0); + sljit_emit_const(compiler, SLJIT_R1, 0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S0, 0); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3V(W, W, W)); + /* buf[0], buf[1] */ + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_serialize3_f1)); + + serialized_buffer = sljit_serialize_compiler(compiler, 0, &serialized_size); + FAILED(!serialized_buffer, "cannot serialize compiler\n"); + sljit_free_compiler(compiler); + + /* Continue code generation. */ + compiler = sljit_deserialize_compiler(serialized_buffer, serialized_size, 0, NULL, NULL); + SLJIT_FREE(serialized_buffer, NULL); + FAILED(!compiler, "cannot deserialize compiler\n"); + + sljit_emit_mov_addr(compiler, SLJIT_R0, 0); + sljit_emit_const(compiler, SLJIT_R1, 0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3V(W, W, W)); + /* buf[2], buf[3] */ + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_serialize3_f1)); + + serialized_buffer = sljit_serialize_compiler(compiler, 0, &serialized_size); + FAILED(!serialized_buffer, "cannot serialize compiler\n"); + sljit_free_compiler(compiler); + + /* Continue code generation. */ + compiler = sljit_deserialize_compiler(serialized_buffer, serialized_size, 0, NULL, NULL); + SLJIT_FREE(serialized_buffer, NULL); + FAILED(!compiler, "cannot deserialize compiler\n"); + + sljit_emit_mov_addr(compiler, SLJIT_R0, 0); + sljit_emit_const(compiler, SLJIT_R1, 0, 0); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 4 * sizeof(sljit_sw)); + jump = sljit_emit_call(compiler, SLJIT_CALL, SLJIT_ARGS3V(W, W, W)); + /* buf[4], buf[5] */ + sljit_set_target(jump, SLJIT_FUNC_UADDR(test_serialize3_f1)); + + sljit_emit_return_void(compiler); + SLJIT_ASSERT(sljit_get_first_label(compiler) == NULL); + label = sljit_emit_label(compiler); + SLJIT_ASSERT(sljit_get_label_index(label) == 0); + + jump = sljit_get_first_jump(compiler); + SLJIT_ASSERT(sljit_jump_is_mov_addr(jump)); + sljit_set_label(jump, label); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(!sljit_jump_is_mov_addr(jump)); + SLJIT_ASSERT(sljit_jump_has_target(jump) && sljit_jump_get_target(jump) == SLJIT_FUNC_UADDR(test_serialize3_f1)); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(sljit_jump_is_mov_addr(jump)); + sljit_set_label(jump, label); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(!sljit_jump_is_mov_addr(jump)); + SLJIT_ASSERT(sljit_jump_has_target(jump) && sljit_jump_get_target(jump) == SLJIT_FUNC_UADDR(test_serialize3_f1)); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(sljit_jump_is_mov_addr(jump)); + sljit_set_label(jump, label); + jump = sljit_get_next_jump(jump); + SLJIT_ASSERT(sljit_jump_has_target(jump) && sljit_jump_get_target(jump) == SLJIT_FUNC_UADDR(test_serialize3_f1)); + SLJIT_ASSERT(sljit_get_next_jump(jump) == NULL); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + executable_offset = sljit_get_executable_offset(compiler); + + const_ = sljit_get_first_const(compiler); + sljit_set_const(sljit_get_const_addr(const_), 0x5678, executable_offset); + const_ = sljit_get_next_const(const_); + sljit_set_const(sljit_get_const_addr(const_), -0x9876, executable_offset); + const_ = sljit_get_next_const(const_); + sljit_set_const(sljit_get_const_addr(const_), 0x2345, executable_offset); + SLJIT_ASSERT(sljit_get_next_const(const_) == NULL); + + label_addr = (sljit_sw)sljit_get_label_addr(label); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + FAILED(buf[0] != label_addr, "test_serialize3 case 1 failed\n"); + FAILED(buf[1] != 0x5678, "test_serialize3 case 2 failed\n"); + FAILED(buf[2] != label_addr, "test_serialize3 case 3 failed\n"); + FAILED(buf[3] != -0x9876, "test_serialize3 case 4 failed\n"); + FAILED(buf[4] != label_addr, "test_serialize3 case 5 failed\n"); + FAILED(buf[5] != 0x2345, "test_serialize3 case 6 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} diff --git a/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSimd.h b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSimd.h new file mode 100755 index 0000000000..d71f15066d --- /dev/null +++ b/waterbox/ares64/ares/thirdparty/sljit/test_src/sljitTestSimd.h @@ -0,0 +1,2333 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static void simd_set(sljit_u8* buf, sljit_u8 start, sljit_s32 length) +{ + do { + *buf++ = start; + start = (sljit_u8)(start + 103); + + if (start == 0xaa) + start = 0xab; + } while (--length != 0); +} + +static sljit_s32 check_simd_mov(sljit_u8* buf, sljit_u8 start, sljit_s32 length) +{ + if (buf[-1] != 0xaa || buf[length] != 0xaa) + return 0; + + do { + if (*buf++ != start) + return 0; + + start = (sljit_u8)(start + 103); + + if (start == 0xaa) + start = 0xab; + } while (--length != 0); + + return 1; +} + +static void test_simd1(void) +{ + /* Test simd data transfer. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 880]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd1\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 880; i++) + buf[i] = 0xaa; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + simd_set(buf + 0, 81, 16); + simd_set(buf + 65, 213, 16); + simd_set(buf + 104, 33, 16); + simd_set(buf + 160, 140, 16); + simd_set(buf + 210, 7, 16); + simd_set(buf + 256, 239, 16); + simd_set(buf + 312, 176, 16); + simd_set(buf + 368, 88, 8); + simd_set(buf + 393, 197, 8); + simd_set(buf + 416, 58, 16); + simd_set(buf + 432, 203, 16); + simd_set(buf + 496, 105, 16); + simd_set(buf + 560, 19, 16); + simd_set(buf + 616, 202, 8); + simd_set(buf + 648, 123, 8); + simd_set(buf + 704, 85, 32); + simd_set(buf + 801, 215, 32); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 2, 2, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 64); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_MEM_ALIGNED_128; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + /* buf[32] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 65); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 82 >> 1); + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_MEM_UNALIGNED; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0); + /* buf[82] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), 1); + + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 70001); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 70001); + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_MEM_ALIGNED_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_R0), 70001 + 104); + /* buf[136] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_R1), 136 - 70001); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_MEM_ALIGNED_128; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 160)); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 192)); + + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1001); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 1001); + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_MEM_ALIGNED_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), 1001 + 210); + /* buf[230] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_R1), 230 - 1001); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 256 >> 3); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 288 >> 3); + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_MEM_ALIGNED_128; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 3); + /* buf[288] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), 3); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_MEM_ALIGNED_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 312); + /* buf[344] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 344); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_MEM_ALIGNED_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 368); + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 384); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 393); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 402); + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_MEM_UNALIGNED; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0); + /* buf[402] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), 0); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_MEM_ALIGNED_128; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 416); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 432); + /* buf[464] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 464); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 496); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 480); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_FR3, 0); + /* buf[528] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 528); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 560); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 544); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_FR0, 0); + /* buf[592] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 592); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 616); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 608); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_FR5, 0); + /* buf[632] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 632); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 648); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 640); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, fs0, 0); + /* buf[664] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 664); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_MEM_ALIGNED_256; + supported[0] = sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 704) != SLJIT_ERR_UNSUPPORTED; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32, SLJIT_FR2, fs0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 384); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM2(SLJIT_R1, SLJIT_S1), 1); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 801 - 32); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), 32); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), 0); + sljit_get_local_base(compiler, SLJIT_R1, 0, 128); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_R1), -128); + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_MEM_ALIGNED_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM0(), (sljit_sw)(buf + 834)); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_mov(buf + 32, 81, 16), "test_simd1 case 1 failed\n"); + FAILED(!check_simd_mov(buf + 82, 213, 16), "test_simd1 case 2 failed\n"); + FAILED(!check_simd_mov(buf + 136, 33, 16), "test_simd1 case 3 failed\n"); + FAILED(!check_simd_mov(buf + 192, 140, 16), "test_simd1 case 4 failed\n"); + FAILED(!check_simd_mov(buf + 230, 7, 16), "test_simd1 case 5 failed\n"); + FAILED(!check_simd_mov(buf + 288, 239, 16), "test_simd1 case 6 failed\n"); + FAILED(!check_simd_mov(buf + 344, 176, 16), "test_simd1 case 7 failed\n"); +#if IS_ARM + FAILED(!check_simd_mov(buf + 384, 88, 8), "test_simd1 case 8 failed\n"); + FAILED(!check_simd_mov(buf + 402, 197, 8), "test_simd1 case 9 failed\n"); +#endif /* IS_ARM */ + FAILED(!check_simd_mov(buf + 464, sljit_has_cpu_feature(SLJIT_SIMD_REGS_ARE_PAIRS) ? 203 : 58, 16), "test_simd1 case 10 failed\n"); + FAILED(!check_simd_mov(buf + 528, 105, 16), "test_simd1 case 11 failed\n"); + FAILED(!check_simd_mov(buf + 592, 19, 16), "test_simd1 case 12 failed\n"); +#if IS_ARM + FAILED(!check_simd_mov(buf + 632, 202, 8), "test_simd1 case 13 failed\n"); + FAILED(!check_simd_mov(buf + 664, 123, 8), "test_simd1 case 14 failed\n"); +#endif /* IS_ARM */ + + if (supported[0]) { + FAILED(!check_simd_mov(buf + 768, 85, 32), "test_simd1 case 15 failed\n"); + FAILED(!check_simd_mov(buf + 834, 215, 32), "test_simd1 case 16 failed\n"); + } + + successful_tests++; +} + +static sljit_s32 check_simd_lane_mov(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_s32 is_odd) +{ + sljit_s32 count = (length / elem_size) >> 1; + sljit_s32 value = 180 + length - elem_size; + sljit_s32 i; + + if (!is_odd) + value -= elem_size; + + do { + if (is_odd) { + for (i = 0; i < elem_size; i++) + if (*buf++ != 0xaa) + return 0; + } + + for (i = 0; i < elem_size; i++) + if (*buf++ != value++) + return 0; + + if (!is_odd) { + for (i = 0; i < elem_size; i++) + if (*buf++ != 0xaa) + return 0; + } + + value -= 3 * elem_size; + } while (--count != 0); + + return 1; +} + +static void test_simd2(void) +{ + /* Test simd lane data transfer. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 576]; + sljit_f64 tmp[1]; + sljit_u32 f32_result = 0; + sljit_sw result[6]; + sljit_s32 result32[5]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd2\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 64; i++) + buf[i] = (sljit_u8)(180 + i); + + for (i = 64; i < 576; i++) + buf[i] = 0xaa; + + for (i = 0; i < 6; i++) + result[i] = 0; + + for (i = 0; i < 5; i++) + result32[i] = 0; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)tmp - 100000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)tmp + 1000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 100000 / 2); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 14, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 0, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 12, SLJIT_MEM1(SLJIT_SP), 0); + sljit_get_local_base(compiler, SLJIT_R2, 0, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 2, SLJIT_MEM1(SLJIT_R2), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 10, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 4, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 8, SLJIT_R3, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 6, SLJIT_R3, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 6, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 8, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 4, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 10, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 2, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 12, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 0, SLJIT_S2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 14, SLJIT_S2, 0); + /* buf[128] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 128); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 1, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, 15, SLJIT_IMM, 181 + 0xffff00); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 183 + 0xffff00); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, 13, SLJIT_R2, 0); + for (i = 5; i < 16; i += 2) { + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | SLJIT_32 | type, SLJIT_FR0, i, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | SLJIT_32 | type, SLJIT_FR5, 16 - i, SLJIT_R2, 0); + } + /* buf[144] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 144); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 6, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 0, SLJIT_R2, 0); + sljit_get_local_base(compiler, SLJIT_R2, 0, 4); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 4, SLJIT_MEM1(SLJIT_R2), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 2, SLJIT_MEM1(SLJIT_SP), 4); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 2, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 4, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 0, SLJIT_S3, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 6, SLJIT_S3, 0); + /* buf[160] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 160); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 7, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 1, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 5, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 3, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 3, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 5, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 1, SLJIT_S2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 7, SLJIT_S2, 0); + /* buf[176] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 176); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 2, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 0, SLJIT_R2, 0); + sljit_get_local_base(compiler, SLJIT_R2, 0, 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_R2), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 2, SLJIT_MEM1(SLJIT_SP), 8); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 192); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 3, SLJIT_S3, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, 1, SLJIT_S3, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 1, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, 3, SLJIT_MEM1(SLJIT_R1), -1000); + /* buf[208] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 208); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 0, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, 0, SLJIT_R2, 0); + /* buf[224] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 224); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 1, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 1, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + /* buf[240] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 240); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 2, SLJIT_FR1, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, 0, SLJIT_FR1, 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM0(), (sljit_sw)&f32_result, SLJIT_FR1, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 0, SLJIT_FR0, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, 2, SLJIT_FR0, 0); + /* buf[256] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 256); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 3, SLJIT_FR2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 1, SLJIT_FR2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 1, SLJIT_FR4, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 3, SLJIT_FR4, 0); + /* buf[272] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 272); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 2, SLJIT_MEM1(SLJIT_SP), 4); + sljit_get_local_base(compiler, SLJIT_R2, 0, 4); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R2), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 2, SLJIT_MEM1(SLJIT_R1), -1000); + /* buf[288] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 288); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 3, SLJIT_MEM1(SLJIT_R1), -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 1, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 1, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 3, SLJIT_MEM0(), (sljit_sw)tmp); + /* buf[304] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 304); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 0, SLJIT_FR4, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 0, SLJIT_FR4, 0); + /* buf[320] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 320); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 1, SLJIT_FR2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, 1, SLJIT_FR2, 0); + /* buf[336] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 336); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 64); + sljit_get_local_base(compiler, SLJIT_R2, 0, 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_R2), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_SP), 8); + /* buf[352] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 352); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 1, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 1, SLJIT_MEM1(SLJIT_R1), -1000); + /* buf[368] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 368); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)result); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | SLJIT_SIMD_REG_128, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_lane_mov(compiler, type, SLJIT_FR1, 6, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1); + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 13, SLJIT_S3, 0); + /* result[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_R0, 0); + /* result[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_sw), SLJIT_S3, 0); + + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -1); + sljit_emit_simd_lane_mov(compiler, type, SLJIT_FR1, 5, SLJIT_R3, 0); + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 7, SLJIT_R1, 0); + /* result[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_sw) * 2, SLJIT_R3, 0); + /* result[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_sw) * 3, SLJIT_R1, 0); + + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_lane_mov(compiler, type, SLJIT_FR1, 2, SLJIT_S3, 0); + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 3, SLJIT_R0, 0); + /* result[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_sw) * 4, SLJIT_S3, 0); + /* result[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_sw) * 5, SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)result32); + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_32; + sljit_emit_simd_lane_mov(compiler, type, SLJIT_FR1, 0, SLJIT_R3, 0); + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 3, SLJIT_S2, 0); + /* result32[0] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_R3, 0); + /* result32[1] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32), SLJIT_S2, 0); + + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16 | SLJIT_32; + sljit_emit_simd_lane_mov(compiler, type, SLJIT_FR1, 0, SLJIT_R1, 0); + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 3, SLJIT_S3, 0); + /* result32[2] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32) * 2, SLJIT_R1, 0); + /* result32[3] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32) * 3, SLJIT_S3, 0); + + type = SLJIT_SIMD_STORE | SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_32; + sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_LANE_SIGNED, SLJIT_FR1, 0, SLJIT_R0, 0); + /* result32[4] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32) * 4, SLJIT_R0, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)tmp - 100000); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)tmp + 1000); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 64); + supported[0] = sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 30, SLJIT_MEM1(SLJIT_R1), -1000) != SLJIT_ERR_UNSUPPORTED; + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_R1), -1000); + + for (i = 2; i < 32; i += 2) { + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 30 - i, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, i, SLJIT_R2, 0); + } + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 384); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, 1, SLJIT_MEM1(SLJIT_SP), 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 15, SLJIT_MEM1(SLJIT_SP), 8); + + for (i = 3; i < 16; i += 2) { + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, i, SLJIT_R2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, 16 - i, SLJIT_R2, 0); + } + /* buf[416] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 416); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 6, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, 0, SLJIT_MEM0(), (sljit_sw)tmp); + + for (i = 2; i < 8; i += 2) { + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, 6 - i, SLJIT_S1, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, i, SLJIT_S1, 0); + } + /* buf[448] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 448); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, -1000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 1, SLJIT_MEM1(SLJIT_R0), 100000); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, 3, SLJIT_MEM2(SLJIT_R1, SLJIT_S1), 0); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, 3, SLJIT_S1, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, 1, SLJIT_S1, 0); + /* buf[480] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 480); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, 1, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, 7, SLJIT_MEM1(SLJIT_SP), 0); + + for (i = 3; i < 8; i += 2) { + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, i, SLJIT_FR2, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, 8 - i, SLJIT_FR2, 0); + } + /* buf[512] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 512); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 2, SLJIT_MEM0(), (sljit_sw)tmp); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_R0), 100000); + + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, 0, SLJIT_FR0, 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, 2, SLJIT_FR0, 0); + /* buf[544] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 544); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_lane_mov(buf + 128, 16, 1, 0), "test_simd2 case 1 failed\n"); + FAILED(!check_simd_lane_mov(buf + 144, 16, 1, 1), "test_simd2 case 2 failed\n"); + FAILED(!check_simd_lane_mov(buf + 160, 16, 2, 0), "test_simd2 case 3 failed\n"); + FAILED(!check_simd_lane_mov(buf + 176, 16, 2, 1), "test_simd2 case 4 failed\n"); + FAILED(!check_simd_lane_mov(buf + 192, 16, 4, 0), "test_simd2 case 5 failed\n"); + FAILED(!check_simd_lane_mov(buf + 208, 16, 4, 1), "test_simd2 case 6 failed\n"); +#if IS_64BIT + FAILED(!check_simd_lane_mov(buf + 224, 16, 8, 0), "test_simd2 case 7 failed\n"); + FAILED(!check_simd_lane_mov(buf + 240, 16, 8, 1), "test_simd2 case 8 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_lane_mov(buf + 256, 16, 4, 0), "test_simd2 case 9 failed\n"); + FAILED(!check_simd_lane_mov(buf + 272, 16, 4, 1), "test_simd2 case 10 failed\n"); + FAILED(!check_simd_lane_mov(buf + 288, 16, 4, 0), "test_simd2 case 11 failed\n"); + FAILED(!check_simd_lane_mov(buf + 304, 16, 4, 1), "test_simd2 case 12 failed\n"); + FAILED(f32_result != LITTLE_BIG(0xbfbebdbc, 0xbcbdbebf), "test_simd2 case 13 failed\n"); + FAILED(!check_simd_lane_mov(buf + 320, 16, 8, 0), "test_simd2 case 14 failed\n"); + FAILED(!check_simd_lane_mov(buf + 336, 16, 8, 1), "test_simd2 case 15 failed\n"); + FAILED(!check_simd_lane_mov(buf + 352, 16, 8, 0), "test_simd2 case 16 failed\n"); + FAILED(!check_simd_lane_mov(buf + 368, 16, 8, 1), "test_simd2 case 17 failed\n"); + FAILED(result[0] != 186, "test_simd2 case 18 failed\n"); + FAILED(result[1] != -63, "test_simd2 case 19 failed\n"); + FAILED(result[2] != LITTLE_BIG(49086, 48831), "test_simd2 case 20 failed\n"); + FAILED(result[3] != LITTLE_BIG(-15422, -15677), "test_simd2 case 21 failed\n"); + FAILED(result[4] != LITTLE_BIG(WCONST(3216948668, -1078018628), WCONST(3166551743, -1128415553)), "test_simd2 case 22 failed\n"); + FAILED(result[5] != LITTLE_BIG(-1010646592, -1061043517), "test_simd2 case 23 failed\n"); + FAILED(result32[0] != 180, "test_simd2 case 24 failed\n"); + FAILED(result32[1] != -73, "test_simd2 case 25 failed\n"); + FAILED(result32[2] != LITTLE_BIG(46516, 46261), "test_simd2 case 26 failed\n"); + FAILED(result32[3] != LITTLE_BIG(-17478, -17733), "test_simd2 case 27 failed\n"); + FAILED(result32[4] != LITTLE_BIG(-1212762700, -1263159625), "test_simd2 case 28 failed\n"); + + if (supported[0]) { + FAILED(!check_simd_lane_mov(buf + 384, 32, 1, 0), "test_simd2 case 29 failed\n"); + FAILED(!check_simd_lane_mov(buf + 416, 32, 2, 1), "test_simd2 case 30 failed\n"); + FAILED(!check_simd_lane_mov(buf + 448, 32, 4, 0), "test_simd2 case 31 failed\n"); +#if IS_64BIT + FAILED(!check_simd_lane_mov(buf + 480, 32, 8, 1), "test_simd2 case 32 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_lane_mov(buf + 512, 32, 4, 1), "test_simd2 case 33 failed\n"); + FAILED(!check_simd_lane_mov(buf + 544, 32, 8, 0), "test_simd2 case 34 failed\n"); + } + + successful_tests++; +} + +static sljit_s32 check_simd_replicate(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_s32 value) +{ + sljit_s32 count = length / elem_size; + sljit_s32 i; + + do { + for (i = 0; i < elem_size; i++) + if (*buf++ != value++) + return 0; + + value -= elem_size; + } while (--count != 0); + + return 1; +} + +static sljit_s32 check_simd_replicate_u32(sljit_u8* buf, sljit_s32 length, sljit_u32 value) +{ + sljit_s32 count = length / 4; + sljit_u32 start_value = value; + sljit_s32 i; + + do { + for (i = 0; i < 4; i++) { + if (*buf++ != (value & 0xff)) + return 0; + value >>= 8; + } + + value = start_value; + } while (--count != 0); + + return 1; +} + +static void test_simd3(void) +{ + /* Test simd replicate scalar to all lanes. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 768]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd3\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 32; i++) + buf[i] = (sljit_u8)(200 + i); + + for (i = 32; i < 768; i++) + buf[i] = 0xaa; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xffff00 + 78); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_R2, 0); + /* buf[48] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 48); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR3, SLJIT_IMM, 0xffff00 + 253); + /* buf[64] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_SP), 3, SLJIT_IMM, 42); + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_MEM1(SLJIT_SP), 3); + /* buf[80] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 80); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 15); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0); + /* buf[96] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 96); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 24); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR3, SLJIT_R1, 0); + /* buf[112] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 112); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 10)); + /* buf[128] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 128); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 10000 + 20); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_MEM1(SLJIT_R0), -10000); + /* buf[144] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 144); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_S3, 0, SLJIT_MEM1(SLJIT_S0), 28); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_S3, 0); + /* buf[160] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 160); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_MEM1(SLJIT_SP), 4, SLJIT_MEM1(SLJIT_S0), 12); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_MEM1(SLJIT_SP), 4); + /* buf[176] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 176); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 100000 - 24); + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_MEM1(SLJIT_R2), 100000); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 192); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 8); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR2, SLJIT_S1, 0); + /* buf[208] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 208); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 3); + /* buf[224] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 224); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_MEM0(), (sljit_sw)buf); + /* buf[240] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 240); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 4); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_FR2, 0); + /* buf[256] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 256); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 20); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR4, SLJIT_FR4, 0); + /* buf[272] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 272); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), 4, SLJIT_MEM1(SLJIT_S0), 12); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), 4); + /* buf[288] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 288); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_FR0, 0); + /* buf[304] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 304); + + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_FR5, 0); + /* buf[320] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 320); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 10000 + 8); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_MEM1(SLJIT_R2), -10000); + /* buf[336] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 336); + + /* Test constant values. */ + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_IMM, WCONST(0xff00123456, 0x123456)); + /* buf[352] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 352); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_IMM, 0xff0000); + /* buf[368] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 368); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR2, SLJIT_IMM, 0x1ffff); + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 384); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_replicate(compiler, type, SLJIT_FR3, SLJIT_IMM, 0); + /* buf[400] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 400); + + /* Test ARM constant values. */ + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_IMM, 0xff0034); + /* buf[416] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 416); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_IMM, 0xff45ff); + /* buf[432] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 432); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_IMM, 0xb3); + /* buf[448] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 448); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_IMM, (sljit_sw)0xffff46ff); + /* buf[464] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 464); + + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_IMM, 0x4c0000); + /* buf[480] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 480); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR3, SLJIT_IMM, 0x71ffffff); + /* buf[496] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 496); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR4, SLJIT_IMM, 0x9eff); + /* buf[512] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 512); + + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_IMM, (sljit_sw)0xff070000); + /* buf[528] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 528); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + supported[0] = sljit_emit_simd_replicate(compiler, type, SLJIT_FR2, SLJIT_IMM, 0xffff00 + 181) != SLJIT_ERR_UNSUPPORTED; + /* buf[544] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 544); + + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_IMM, 0xffff00); + /* buf[576] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 576); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 30); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_R1, 0); + /* buf[608] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 608); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_replicate(compiler, type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 4); + /* buf[640] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 640); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64; + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 4); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_S1), 2); + /* buf[672] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 672); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 20); + sljit_emit_simd_replicate(compiler, type, SLJIT_FR1, SLJIT_FR2, 0); + /* buf[704] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 704); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_replicate(compiler, type, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 8)); + /* buf[736] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 736); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_replicate(buf + 48, 16, 1, 78), "test_simd3 case 1 failed\n"); + FAILED(!check_simd_replicate(buf + 64, 16, 1, 253), "test_simd3 case 2 failed\n"); + FAILED(!check_simd_replicate(buf + 80, 16, 1, 42), "test_simd3 case 3 failed\n"); + FAILED(!check_simd_replicate(buf + 96, 16, 1, 215), "test_simd3 case 4 failed\n"); + FAILED(!check_simd_replicate(buf + 112, 16, 2, 224), "test_simd3 case 5 failed\n"); + FAILED(!check_simd_replicate(buf + 128, 16, 2, 210), "test_simd3 case 6 failed\n"); + FAILED(!check_simd_replicate(buf + 144, 16, 2, 220), "test_simd3 case 7 failed\n"); + FAILED(!check_simd_replicate(buf + 160, 16, 4, 228), "test_simd3 case 8 failed\n"); + FAILED(!check_simd_replicate(buf + 176, 16, 4, 212), "test_simd3 case 9 failed\n"); + FAILED(!check_simd_replicate(buf + 192, 16, 4, 224), "test_simd3 case 10 failed\n"); +#if IS_64BIT + FAILED(!check_simd_replicate(buf + 208, 16, 8, 208), "test_simd3 case 11 failed\n"); + FAILED(!check_simd_replicate(buf + 224, 16, 8, 224), "test_simd3 case 12 failed\n"); + FAILED(!check_simd_replicate(buf + 240, 16, 8, 200), "test_simd3 case 13 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_replicate(buf + 256, 16, 4, 204), "test_simd3 case 14 failed\n"); + FAILED(!check_simd_replicate(buf + 272, 16, 4, 220), "test_simd3 case 15 failed\n"); + FAILED(!check_simd_replicate(buf + 288, 16, 4, 212), "test_simd3 case 16 failed\n"); + FAILED(!check_simd_replicate(buf + 304, 16, 8, 216), "test_simd3 case 17 failed\n"); + FAILED(!check_simd_replicate(buf + 320, 16, 8, 200), "test_simd3 case 18 failed\n"); + FAILED(!check_simd_replicate(buf + 336, 16, 8, 208), "test_simd3 case 19 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 352, 16, LITTLE_BIG(0x123456, 0x56341200)), "test_simd3 case 20 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 368, 16, 0), "test_simd3 case 21 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 384, 16, 0xffffffff), "test_simd3 case 22 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 400, 16, 0), "test_simd3 case 23 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 416, 16, LITTLE_BIG(0x340034, 0x34003400)), "test_simd3 case 24 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 432, 16, LITTLE_BIG(0x45ff45ff, 0xff45ff45)), "test_simd3 case 25 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 448, 16, LITTLE_BIG(0xb3, 0xb3000000)), "test_simd3 case 26 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 464, 16, LITTLE_BIG(0xffff46ff, 0xff46ffff)), "test_simd3 case 27 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 480, 16, LITTLE_BIG(0x4c0000, 0x4c00)), "test_simd3 case 28 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 496, 16, LITTLE_BIG(0x71ffffff, 0xffffff71)), "test_simd3 case 29 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 512, 16, LITTLE_BIG(0x9eff, 0xff9e0000)), "test_simd3 case 30 failed\n"); + FAILED(!check_simd_replicate_u32(buf + 528, 16, LITTLE_BIG(0xff070000, 0x07ff)), "test_simd3 case 31 failed\n"); + + if (supported[0]) { + FAILED(!check_simd_replicate(buf + 544, 32, 1, 181), "test_simd3 case 32 failed\n"); + FAILED(!check_simd_replicate(buf + 576, 32, 1, 0), "test_simd3 case 33 failed\n"); + FAILED(!check_simd_replicate(buf + 608, 32, 2, 230), "test_simd3 case 34 failed\n"); + FAILED(!check_simd_replicate(buf + 640, 32, 4, 204), "test_simd3 case 35 failed\n"); +#if IS_64BIT + FAILED(!check_simd_replicate(buf + 672, 32, 8, 216), "test_simd3 case 36 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_replicate(buf + 704, 32, 4, 220), "test_simd3 case 37 failed\n"); + FAILED(!check_simd_replicate(buf + 736, 32, 8, 208), "test_simd3 case 38 failed\n"); + } + + successful_tests++; +} + +static void test_simd4(void) +{ + /* Test simd replicate lane to all lanes. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 992]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd4\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 32; i++) + buf[i] = (sljit_u8)(100 + i); + + for (i = 32; i < 992; i++) + buf[i] = 0xaa; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR0, 0); + /* buf[48] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 48); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR2, SLJIT_FR1, 12); + /* buf[64] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR3, SLJIT_FR5, 6); + /* buf[80] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 80); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR3, SLJIT_FR3, 9); + /* buf[96] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 96); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, fs0, SLJIT_FR0, 10); + /* buf[112] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 112); + /* buf[128] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 128); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR0, 0); + /* buf[144] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 144); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 3); + /* buf[160] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 160); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR4, 5); + /* buf[176] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 176); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 192); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR3, SLJIT_FR3, 0); + /* buf[208] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 208); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 2); + /* buf[224] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 224); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR5, SLJIT_FR2, 3); + /* buf[240] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 240); + /* buf[256] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 256); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 0); + /* buf[272] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 272); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR0, 1); + /* buf[288] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 288); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, fs0, SLJIT_FR3, 1); + /* buf[304] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 304); + /* buf[320] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 320); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR2, SLJIT_FR2, 0); + /* buf[336] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 336); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR0, 3); + /* buf[352] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 352); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR5, SLJIT_FR0, 1); + /* buf[368] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 368); + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 384); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR4, SLJIT_FR4, 0); + /* buf[400] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 400); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 1); + /* buf[416] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 416); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 16); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR2, 1); + /* buf[432] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 432); + /* buf[448] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 448); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + supported[0] = sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR2, SLJIT_FR2, 0) != SLJIT_ERR_UNSUPPORTED; + /* buf[480] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 480); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR4, 13); + /* buf[512] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 512); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR4, 6); + /* buf[544] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 544); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR4, SLJIT_FR4, 28); + /* buf[576] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 576); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR2, SLJIT_FR1, 0); + /* buf[608] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 608); + + sljit_emit_simd_lane_replicate(compiler, type, fs0, SLJIT_FR1, 2); + /* buf[640] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 640); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 13); + /* buf[672] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 672); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR5, 0); + /* buf[704] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 704); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR5, SLJIT_FR5, 5); + /* buf[736] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 736); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, fs0, SLJIT_FR0, 0); + /* buf[768] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 768); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR0, SLJIT_FR0, 1); + /* buf[800] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 800); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR2, SLJIT_FR1, 0); + /* buf[832] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 832); + + sljit_emit_simd_lane_replicate(compiler, type, fs0, SLJIT_FR1, 1); + /* buf[864] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 864); + + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, SLJIT_FR1, 4); + /* buf[896] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 896); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_replicate(compiler, type, SLJIT_FR1, fs0, 0); + /* buf[928] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 928); + + sljit_emit_simd_lane_replicate(compiler, type, fs0, fs0, 2); + /* buf[960] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 960); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_replicate(buf + 48, 16, 1, 100), "test_simd4 case 1 failed\n"); + FAILED(!check_simd_replicate(buf + 64, 16, 1, 128), "test_simd4 case 2 failed\n"); + FAILED(!check_simd_replicate(buf + 80, 16, 1, 106), "test_simd4 case 3 failed\n"); + FAILED(!check_simd_replicate(buf + 96, 16, 1, 125), "test_simd4 case 4 failed\n"); + FAILED(!check_simd_replicate(buf + 112, 16, 1, 110), "test_simd4 case 5 failed\n"); + FAILED(!check_simd_replicate(buf + 128, 16, 16, 100), "test_simd4 case 6 failed\n"); + FAILED(!check_simd_replicate(buf + 144, 16, 2, 100), "test_simd4 case 7 failed\n"); + FAILED(!check_simd_replicate(buf + 160, 16, 2, 122), "test_simd4 case 8 failed\n"); + FAILED(!check_simd_replicate(buf + 176, 16, 2, 126), "test_simd4 case 9 failed\n"); + FAILED(!check_simd_replicate(buf + 192, 16, 16, 116), "test_simd4 case 10 failed\n"); + FAILED(!check_simd_replicate(buf + 208, 16, 4, 100), "test_simd4 case 11 failed\n"); + FAILED(!check_simd_replicate(buf + 224, 16, 4, 124), "test_simd4 case 12 failed\n"); + FAILED(!check_simd_replicate(buf + 240, 16, 4, 112), "test_simd4 case 13 failed\n"); + FAILED(!check_simd_replicate(buf + 256, 16, 16, 100), "test_simd4 case 14 failed\n"); + FAILED(!check_simd_replicate(buf + 272, 16, 8, 116), "test_simd4 case 15 failed\n"); + FAILED(!check_simd_replicate(buf + 288, 16, 8, 108), "test_simd4 case 16 failed\n"); + FAILED(!check_simd_replicate(buf + 304, 16, 8, 124), "test_simd4 case 17 failed\n"); + FAILED(!check_simd_replicate(buf + 320, 16, 16, 116), "test_simd4 case 18 failed\n"); + FAILED(!check_simd_replicate(buf + 336, 16, 4, 100), "test_simd4 case 19 failed\n"); + FAILED(!check_simd_replicate(buf + 352, 16, 4, 128), "test_simd4 case 20 failed\n"); + FAILED(!check_simd_replicate(buf + 368, 16, 4, 104), "test_simd4 case 21 failed\n"); + FAILED(!check_simd_replicate(buf + 384, 16, 16, 100), "test_simd4 case 22 failed\n"); + FAILED(!check_simd_replicate(buf + 400, 16, 8, 116), "test_simd4 case 23 failed\n"); + FAILED(!check_simd_replicate(buf + 416, 16, 8, 108), "test_simd4 case 24 failed\n"); + FAILED(!check_simd_replicate(buf + 432, 16, 8, 124), "test_simd4 case 25 failed\n"); + FAILED(!check_simd_replicate(buf + 448, 16, 16, 116), "test_simd4 case 26 failed\n"); + + if (supported[0]) { + FAILED(!check_simd_replicate(buf + 480, 32, 1, 100), "test_simd4 case 27 failed\n"); + FAILED(!check_simd_replicate(buf + 512, 32, 1, 113), "test_simd4 case 28 failed\n"); + FAILED(!check_simd_replicate(buf + 544, 32, 1, 106), "test_simd4 case 29 failed\n"); + FAILED(!check_simd_replicate(buf + 576, 32, 1, 128), "test_simd4 case 30 failed\n"); + FAILED(!check_simd_replicate(buf + 608, 32, 2, 100), "test_simd4 case 31 failed\n"); + FAILED(!check_simd_replicate(buf + 640, 32, 2, 104), "test_simd4 case 32 failed\n"); + FAILED(!check_simd_replicate(buf + 672, 32, 2, 126), "test_simd4 case 33 failed\n"); + FAILED(!check_simd_replicate(buf + 704, 32, 4, 100), "test_simd4 case 34 failed\n"); + FAILED(!check_simd_replicate(buf + 736, 32, 4, 120), "test_simd4 case 35 failed\n"); + FAILED(!check_simd_replicate(buf + 768, 32, 8, 100), "test_simd4 case 36 failed\n"); + FAILED(!check_simd_replicate(buf + 800, 32, 8, 108), "test_simd4 case 37 failed\n"); + FAILED(!check_simd_replicate(buf + 832, 32, 4, 100), "test_simd4 case 38 failed\n"); + FAILED(!check_simd_replicate(buf + 864, 32, 4, 104), "test_simd4 case 39 failed\n"); + FAILED(!check_simd_replicate(buf + 896, 32, 4, 116), "test_simd4 case 40 failed\n"); + FAILED(!check_simd_replicate(buf + 928, 32, 8, 100), "test_simd4 case 41 failed\n"); + FAILED(!check_simd_replicate(buf + 960, 32, 8, 116), "test_simd4 case 42 failed\n"); + } + + successful_tests++; +} + +static sljit_s32 check_simd_lane_mov_zero(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_s32 start, sljit_s32 value) +{ + sljit_s32 i; + + for (i = 0; i < start; i++) + if (*buf++ != 0) + return 0; + + for (i = 0; i < elem_size; i++) + if (*buf++ != value++) + return 0; + + for (i = start + elem_size; i < length; i++) + if (*buf++ != 0) + return 0; + + return 1; +} + +static void test_simd5(void) +{ + /* Test simd zero register before move to lane. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 672]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd5\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 64; i++) + buf[i] = (sljit_u8)(100 + i); + + for (i = 64; i < 672; i++) + buf[i] = 0xaa; + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 100000); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 10000); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xffff00 + 85); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR0, 0, SLJIT_R2, 0); + /* buf[64] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, fs0, 0, SLJIT_IMM, 0xffff00 + 18); + /* buf[80] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 80); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_SP), 10, SLJIT_IMM, 170); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | SLJIT_32 | type, SLJIT_FR5, 5, SLJIT_MEM1(SLJIT_SP), 10); + /* buf[96] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 96); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, LITTLE_BIG(0x789a6d6c, 0x789a6c6d)); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR1, 0, SLJIT_S2, 0); + /* buf[112] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 112); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | SLJIT_32 | type, SLJIT_FR4, 0, SLJIT_IMM, LITTLE_BIG(0xff8382, 0xff8283)); + /* buf[128] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 128); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, fs0, 3, SLJIT_MEM1(SLJIT_R0), 100004); + /* buf[144] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 144); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_S0), 4); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | SLJIT_32 | type, SLJIT_FR2, 0, SLJIT_R2, 0); + /* buf[160] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 160); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR5, 0, SLJIT_IMM, LITTLE_BIG(0x29282726, 0x26272829)); + /* buf[176] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 176); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 3); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | SLJIT_32 | type, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R2), 2); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 192); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR3, 3, SLJIT_MEM1(SLJIT_R1), -10000 + 8); + /* buf[208] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 208); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, fs0, 0, SLJIT_S2, 0); + /* buf[224] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 224); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR4, 0, + SLJIT_IMM, LITTLE_BIG(WCONST(0xe3e2e1e0dfdedddc, 0), WCONST(0xdcdddedfe0e1e2e3, 0))); + /* buf[240] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 240); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR3, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R2), 0); + /* buf[256] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 256); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR1, 1, SLJIT_MEM1(SLJIT_R0), 100000); + /* buf[272] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 272); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 12); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR0, 0, SLJIT_FR0, 0); + /* buf[288] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 288); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 4); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR2, 0, SLJIT_FR5, 0); + /* buf[304] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 304); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 1); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R2), 3); + /* buf[320] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 320); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR4, 1, SLJIT_FR4, 0); + /* buf[336] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 336); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR2, 0, SLJIT_FR2, 0); + /* buf[352] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 352); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR3, 0, SLJIT_FR4, 0); + /* buf[368] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 368); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR1, 0, SLJIT_MEM0(), (sljit_sw)(buf + 8)); + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 384); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR2, 1, SLJIT_FR2, 0); + /* buf[400] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 400); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 215); + supported[0] = sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR0, 0, SLJIT_R2, 0) != SLJIT_ERR_UNSUPPORTED; + /* buf[416] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 416); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, fs0, 17, SLJIT_IMM, 78); + /* buf[448] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 448); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0xff3433); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR1, 4, SLJIT_S1, 0); + /* buf[480] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 480); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR5, 5, SLJIT_MEM1(SLJIT_S0), 60); + /* buf[512] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 512); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR4, 3, SLJIT_MEM0(), (sljit_sw)buf + 32); + /* buf[544] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 544); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 48); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR2, 3, SLJIT_FR2, 0); + /* buf[576] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 576); + + sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), 8); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR3, 6, SLJIT_FR3, 0); + /* buf[608] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 608); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_SP), 8, SLJIT_MEM1(SLJIT_S0), 40); + sljit_emit_simd_lane_mov(compiler, SLJIT_SIMD_LANE_ZERO | type, SLJIT_FR0, 3, SLJIT_MEM1(SLJIT_SP), 8); + /* buf[640] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 640); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_lane_mov_zero(buf + 64, 16, 1, 0, 85), "test_simd5 case 1 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 80, 16, 1, 0, 18), "test_simd5 case 2 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 96, 16, 1, 5, 170), "test_simd5 case 3 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 112, 16, 2, 0, 108), "test_simd5 case 4 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 128, 16, 2, 0, 130), "test_simd5 case 5 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 144, 16, 2, 6, 104), "test_simd5 case 6 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 160, 16, 4, 0, 104), "test_simd5 case 7 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 176, 16, 4, 0, 38), "test_simd5 case 8 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 192, 16, 4, 0, 112), "test_simd5 case 9 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 208, 16, 4, 12, 108), "test_simd5 case 10 failed\n"); +#if IS_64BIT + FAILED(!check_simd_lane_mov_zero(buf + 224, 16, 8, 0, 100), "test_simd5 case 11 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 240, 16, 8, 0, 220), "test_simd5 case 12 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 256, 16, 8, 0, 108), "test_simd5 case 13 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 272, 16, 8, 8, 100), "test_simd5 case 14 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_lane_mov_zero(buf + 288, 16, 4, 0, 112), "test_simd5 case 15 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 304, 16, 4, 0, 104), "test_simd5 case 16 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 320, 16, 4, 0, 108), "test_simd5 case 17 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 336, 16, 4, 4, 100), "test_simd5 case 18 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 352, 16, 8, 0, 108), "test_simd5 case 19 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 368, 16, 8, 0, 100), "test_simd5 case 20 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 384, 16, 8, 0, 108), "test_simd5 case 21 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 400, 16, 8, 8, 100), "test_simd5 case 22 failed\n"); + + if (supported[0]) { + FAILED(!check_simd_lane_mov_zero(buf + 416, 32, 1, 0, 215), "test_simd5 case 23 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 448, 32, 1, 17, 78), "test_simd5 case 24 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 480, 32, 2, 8, 51), "test_simd5 case 25 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 512, 32, 4, 20, 160), "test_simd5 case 26 failed\n"); +#if IS_64BIT + FAILED(!check_simd_lane_mov_zero(buf + 544, 32, 8, 24, 132), "test_simd5 case 27 failed\n"); +#endif /* IS_64BIT */ + FAILED(!check_simd_lane_mov_zero(buf + 576, 32, 4, 12, 148), "test_simd5 case 28 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 608, 32, 4, 24, 108), "test_simd5 case 29 failed\n"); + FAILED(!check_simd_lane_mov_zero(buf + 640, 32, 8, 24, 140), "test_simd5 case 30 failed\n"); + } + + successful_tests++; +} + +static void init_simd_extend(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_s32 is_float, sljit_s32 data) +{ + sljit_u8* end = buf + length; + + do { + if (elem_size == 1) + *buf = (sljit_u8)data; + else if (elem_size == 2) + *(sljit_u16*)buf = (sljit_u16)data; + else if (!is_float) + *(sljit_u32*)buf = (sljit_u32)data; + else + *(sljit_f32*)buf = (sljit_f32)data; + + buf += elem_size; + data++; + } while (buf < end); +} + +static sljit_s32 check_simd_extend_unsigned(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_u32 mask) +{ + sljit_s32 data; + sljit_u8* end = buf + length; + + if (elem_size == 2) + data = -(length >> 2); + else if (elem_size == 4) + data = -(length >> 3); + else + data = -(length >> 4); + + do { + if (elem_size == 2) { + if (*(sljit_u16*)buf != ((sljit_u16)data & mask)) + return 0; + } else if (elem_size == 4) { + if (*(sljit_u32*)buf != ((sljit_u32)data & mask)) + return 0; + } else { +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + if (*(sljit_u32*)buf != ((sljit_u32)data & mask) || *(sljit_u32*)(buf + 4) != 0) + return 0; +#else /* !SLJIT_LITTLE_ENDIAN */ + if (*(sljit_u32*)(buf + 4) != ((sljit_u32)data & mask) || *(sljit_u32*)buf != 0) + return 0; +#endif /* SLJIT_LITTLE_ENDIAN */ + } + + buf += elem_size; + data++; + } while (buf < end); + + return 1; +} + +static sljit_s32 check_simd_extend_signed(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_s32 is_float) +{ + sljit_s32 data; + sljit_u8* end = buf + length; + + if (elem_size == 2) + data = -(length >> 2); + else if (elem_size == 4) + data = -(length >> 3); + else if (!is_float) + data = -(length >> 4); + else + data = 1000; + + do { + if (elem_size == 2) { + if (*(sljit_s16*)buf != data) + return 0; + } else if (elem_size == 4) { + if (*(sljit_s32*)buf != data) + return 0; + } else if (!is_float) { +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + if (*(sljit_s32*)buf != data) + return 0; + if (*(sljit_s32*)(buf + 4) != (data >> 31)) + return 0; +#else /* !SLJIT_LITTLE_ENDIAN */ + if (*(sljit_s32*)(buf + 4) != data) + return 0; + if (*(sljit_s32*)buf != (data >> 31)) + return 0; +#endif /* SLJIT_LITTLE_ENDIAN */ + } else { + if (*(sljit_f64*)buf != (sljit_f64)data) + return 0; + } + + buf += elem_size; + data++; + } while (buf < end); + + return 1; +} + +static void test_simd6(void) +{ + /* Test simd extension operation. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 1088]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd6\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 1088; i++) + buf[i] = 0xaa; + + init_simd_extend(buf + 0, 16, 1, 0, -8); + init_simd_extend(buf + 32, 16, 2, 0, -4); + init_simd_extend(buf + 64, 16, 4, 0, -2); + init_simd_extend(buf + 96, 16, 4, 1, 1000); + init_simd_extend(buf + 128, 8, 1, 0, -4); + init_simd_extend(buf + 160, 8, 2, 0, -2); + init_simd_extend(buf + 192, 8, 4, 0, -1); + init_simd_extend(buf + 224, 8, 4, 1, 1000); + init_simd_extend(buf + 256, 4, 1, 0, -2); + init_simd_extend(buf + 288, 4, 2, 0, -1); + init_simd_extend(buf + 320, 2, 1, 0, -1); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 32); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 128); + sljit_emit_simd_extend(compiler, type, SLJIT_FR2, SLJIT_FR0, 0); + /* buf[352] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 352); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR1, SLJIT_FR0, 0); + /* buf[368] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 368); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 128); + sljit_emit_simd_extend(compiler, type, SLJIT_FR0, SLJIT_MEM1(SLJIT_R1), 0); + /* buf[384] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 384); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 128); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, fs0, SLJIT_MEM1(SLJIT_SP), 0); + /* buf[400] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 400); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_EXTEND_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 160); + sljit_emit_simd_extend(compiler, type, SLJIT_FR4, SLJIT_FR4, 0); + /* buf[416] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 416); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 160); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR0, SLJIT_FR4, 0); + /* buf[432] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 432); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 40); + sljit_emit_simd_extend(compiler, type, SLJIT_FR1, SLJIT_MEM2(SLJIT_S0, SLJIT_R2), 2); + /* buf[448] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 448); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 160)); + /* buf[464] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 464); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 192); + sljit_emit_simd_extend(compiler, type, SLJIT_FR0, SLJIT_FR2, 0); + /* buf[480] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 480); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR3, SLJIT_FR2, 0); + /* buf[496] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 496); + + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 10000 - 192); + sljit_emit_simd_extend(compiler, type, SLJIT_FR2, SLJIT_MEM1(SLJIT_R0), 10000); + /* buf[512] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 512); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 100000 + 192); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, fs0, SLJIT_MEM1(SLJIT_R0), -100000); + /* buf[528] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 528); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 224); + sljit_emit_simd_extend(compiler, type, fs0, fs0, 0); + /* buf[544] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 544); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 224); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_SP), 0); + sljit_emit_simd_extend(compiler, type, SLJIT_FR3, SLJIT_MEM1(SLJIT_SP), 0); + /* buf[560] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 560); + + sljit_emit_simd_extend(compiler, type, SLJIT_FR5, SLJIT_FR1, 0); + /* buf[576] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR5, SLJIT_MEM1(SLJIT_S0), 576); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 256); + sljit_emit_simd_extend(compiler, type, SLJIT_FR0, SLJIT_FR2, 0); + /* buf[592] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 592); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR2, SLJIT_FR2, 0); + /* buf[608] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 608); + + sljit_emit_simd_extend(compiler, type, fs0, SLJIT_MEM1(SLJIT_S0), 256); + /* buf[624] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 624); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR4, SLJIT_MEM0(), (sljit_sw)(buf + 256)); + /* buf[640] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 640); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 320); + sljit_emit_simd_extend(compiler, type, SLJIT_FR0, fs0, 0); + /* buf[656] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 656); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR0, fs0, 0); + /* buf[672] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 672); + + sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 320); + sljit_emit_simd_extend(compiler, type, SLJIT_FR3, SLJIT_MEM1(SLJIT_SP), 0); + /* buf[688] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 688); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 320); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR3, SLJIT_MEM2(SLJIT_S0, SLJIT_S2), 0); + /* buf[704] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 704); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 288); + sljit_emit_simd_extend(compiler, type, SLJIT_FR2, SLJIT_FR0, 0); + /* buf[720] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 720); + + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR0, SLJIT_FR0, 0); + /* buf[736] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 736); + + sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 100000 - 288); + sljit_emit_simd_extend(compiler, type, fs0, SLJIT_MEM1(SLJIT_R2), 100000); + /* buf[752] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 752); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S0, 0, SLJIT_IMM, 10000 + 288); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR1, SLJIT_MEM1(SLJIT_S2), -10000); + /* buf[768] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 768); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 256); + sljit_emit_simd_extend(compiler, type, fs0, SLJIT_FR1, 0); + /* buf[784] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 784); + + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S0, 0, SLJIT_IMM, 256); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR2, SLJIT_MEM1(SLJIT_R2), 0); + /* buf[792] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 792); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_32; + sljit_emit_simd_extend(compiler, type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 320); + /* buf[800] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 800); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 320); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR2, fs0, 0); + /* buf[808] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 808); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_EXTEND_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 288); + sljit_emit_simd_extend(compiler, type, SLJIT_FR2, SLJIT_FR1, 0); + /* buf[816] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 816); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 288); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, fs0, SLJIT_MEM2(SLJIT_S1, SLJIT_S0), 0); + /* buf[824] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 824); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + supported[0] = sljit_emit_simd_extend(compiler, type, SLJIT_FR4, SLJIT_FR1, 0) != SLJIT_ERR_UNSUPPORTED; + /* buf[832] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 832); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_32; + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 128); + /* buf[864] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 864); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8 | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_extend(compiler, type, fs0, SLJIT_MEM0(), (sljit_sw)(buf + 256)); + /* buf[896] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 896); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_EXTEND_32; + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 16); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR0, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), 1); + /* buf[928] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 928); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16 | SLJIT_SIMD_EXTEND_64; + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S1, 0, SLJIT_S0, 0, SLJIT_IMM, 100000 + 160); + sljit_emit_simd_extend(compiler, type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S1), -100000); + /* buf[960] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 960); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_EXTEND_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_EXTEND_SIGNED, SLJIT_FR0, fs0, 0); + /* buf[992] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 992); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_EXTEND_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 96); + sljit_emit_simd_extend(compiler, type, SLJIT_FR2, SLJIT_FR2, 0); + /* buf[1024] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 1024); + + sljit_emit_simd_extend(compiler, type, SLJIT_FR4, SLJIT_MEM0(), (sljit_sw)(buf + 96)); + /* buf[1056] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 1056); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_extend_unsigned(buf + 352, 16, 2, 0xff), "test_simd6 case 1 failed\n"); + FAILED(!check_simd_extend_signed(buf + 368, 16, 2, 0), "test_simd6 case 2 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 384, 16, 2, 0xff), "test_simd6 case 3 failed\n"); + FAILED(!check_simd_extend_signed(buf + 400, 16, 2, 0), "test_simd6 case 4 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 416, 16, 4, 0xffff), "test_simd6 case 5 failed\n"); + FAILED(!check_simd_extend_signed(buf + 432, 16, 4, 0), "test_simd6 case 6 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 448, 16, 4, 0xffff), "test_simd6 case 7 failed\n"); + FAILED(!check_simd_extend_signed(buf + 464, 16, 4, 0), "test_simd6 case 8 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 480, 16, 8, 0xffffffff), "test_simd6 case 9 failed\n"); + FAILED(!check_simd_extend_signed(buf + 496, 16, 8, 0), "test_simd6 case 10 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 512, 16, 8, 0xffffffff), "test_simd6 case 11 failed\n"); + FAILED(!check_simd_extend_signed(buf + 528, 16, 8, 0), "test_simd6 case 12 failed\n"); + FAILED(!check_simd_extend_signed(buf + 544, 16, 8, 1), "test_simd6 case 13 failed\n"); + FAILED(!check_simd_extend_signed(buf + 560, 16, 8, 1), "test_simd6 case 14 failed\n"); + FAILED(!check_simd_extend_signed(buf + 576, 16, 8, 1), "test_simd6 case 15 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 592, 16, 4, 0xff), "test_simd6 case 16 failed\n"); + FAILED(!check_simd_extend_signed(buf + 608, 16, 4, 0), "test_simd6 case 17 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 624, 16, 4, 0xff), "test_simd6 case 18 failed\n"); + FAILED(!check_simd_extend_signed(buf + 640, 16, 4, 0), "test_simd6 case 19 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 656, 16, 8, 0xff), "test_simd6 case 20 failed\n"); + FAILED(!check_simd_extend_signed(buf + 672, 16, 8, 0), "test_simd6 case 21 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 688, 16, 8, 0xff), "test_simd6 case 22 failed\n"); + FAILED(!check_simd_extend_signed(buf + 704, 16, 8, 0), "test_simd6 case 23 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 720, 16, 8, 0xffff), "test_simd6 case 24 failed\n"); + FAILED(!check_simd_extend_signed(buf + 736, 16, 8, 0), "test_simd6 case 25 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 752, 16, 8, 0xffff), "test_simd6 case 26 failed\n"); + FAILED(!check_simd_extend_signed(buf + 768, 16, 8, 0), "test_simd6 case 27 failed\n"); + +#if IS_ARM + FAILED(!check_simd_extend_unsigned(buf + 784, 8, 2, 0xff), "test_simd6 case 28 failed\n"); + FAILED(!check_simd_extend_signed(buf + 792, 8, 2, 0), "test_simd6 case 29 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 800, 8, 4, 0xff), "test_simd6 case 30 failed\n"); + FAILED(!check_simd_extend_signed(buf + 808, 8, 4, 0), "test_simd6 case 31 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 816, 8, 4, 0xffff), "test_simd6 case 32 failed\n"); + FAILED(!check_simd_extend_signed(buf + 824, 8, 4, 0), "test_simd6 case 33 failed\n"); +#endif /* IS_ARM */ + + if (supported[0]) { + FAILED(!check_simd_extend_unsigned(buf + 832, 32, 2, 0xff), "test_simd6 case 34 failed\n"); + FAILED(!check_simd_extend_signed(buf + 864, 32, 4, 0), "test_simd6 case 35 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 896, 32, 8, 0xff), "test_simd6 case 36 failed\n"); + FAILED(!check_simd_extend_signed(buf + 928, 32, 4, 0), "test_simd6 case 37 failed\n"); + FAILED(!check_simd_extend_unsigned(buf + 960, 32, 8, 0xffff), "test_simd6 case 38 failed\n"); + FAILED(!check_simd_extend_signed(buf + 992, 32, 8, 0), "test_simd6 case 39 failed\n"); + FAILED(!check_simd_extend_signed(buf + 1024, 32, 8, 1), "test_simd6 case 40 failed\n"); + FAILED(!check_simd_extend_signed(buf + 1056, 32, 8, 1), "test_simd6 case 41 failed\n"); + } + + successful_tests++; +} + +static void init_simd_sign(sljit_u8* buf, sljit_s32 length, sljit_s32 elem_size, sljit_u32 data) +{ +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) + sljit_u8* end = buf + length; + + do { + if (elem_size == 1) + *buf = (sljit_u8)(((data & 0x1) << 7) + 0x7f); + else if (elem_size == 2) + *(sljit_u16*)buf = (sljit_u16)(((data & 0x1) << 15) + 0x7fff); + else if (elem_size == 4) + *(sljit_u32*)buf = (sljit_u32)(((data & 0x1) << 31) + 0x7fffffff); + else { + *(sljit_u32*)buf = 0xffffffff; + *(sljit_u32*)(buf + 4) = (sljit_u32)(((data & 0x1) << 31) + 0x7fffffff); + } + + data >>= 1; + buf += elem_size; + } while (buf < end); +#else /* !SLJIT_LITTLE_ENDIAN */ + sljit_u8* current = buf + length - elem_size; + + do { + if (elem_size == 1) + *current = (sljit_u8)(((data & 0x1) << 7) + 0x7f); + else if (elem_size == 2) + *(sljit_u16*)current = (sljit_u16)(((data & 0x1) << 15) + 0x7fff); + else if (elem_size == 4) + *(sljit_u32*)current = (sljit_u32)(((data & 0x1) << 31) + 0x7fffffff); + else { + *(sljit_u32*)(current + 4) = 0xffffffff; + *(sljit_u32*)current = (sljit_u32)(((data & 0x1) << 31) + 0x7fffffff); + } + + data >>= 1; + current -= elem_size; + } while (current >= buf); +#endif /* SLJIT_LITTLE_ENDIAN */ +} + +static void test_simd7(void) +{ + /* Test simd sign extraction operation. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 288]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS0 : SLJIT_FR5; + sljit_uw resw[9]; + sljit_u32 res32[7]; + + if (verbose) + printf("Run test_simd7\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 9; i++) + resw[i] = (sljit_uw)-1; + for (i = 0; i < 7; i++) + res32[i] = (sljit_u32)-1; + + init_simd_sign(buf + 0, 16, 1, 0x8fa3); + init_simd_sign(buf + 16, 16, 1, 0x34d5); + init_simd_sign(buf + 32, 16, 2, 0xa6); + init_simd_sign(buf + 48, 16, 2, 0x5e); + init_simd_sign(buf + 64, 16, 4, 0xd); + init_simd_sign(buf + 80, 16, 4, 0x5); + init_simd_sign(buf + 96, 16, 8, 0x2); + init_simd_sign(buf + 112, 16, 8, 0x1); + + init_simd_sign(buf + 128, 8, 1, 0x45); + init_simd_sign(buf + 136, 8, 2, 0x9); + init_simd_sign(buf + 144, 8, 4, 0x1); + + init_simd_sign(buf + 160, 32, 1, 0x51e83b71); + init_simd_sign(buf + 192, 32, 2, 0xc90d); + init_simd_sign(buf + 224, 32, 4, 0xa5); + init_simd_sign(buf + 256, 32, 8, 0x9); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_R0, 0); + /* resw[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R0, 0); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 16); + /* resw[1] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_uw)); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_R2, 0); + /* resw[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_uw), SLJIT_R2, 0); + + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 48); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, SLJIT_FR4, SLJIT_MEM1(SLJIT_SP), 4); + /* res32[0] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_MEM1(SLJIT_SP), 4); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 64); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, fs0, SLJIT_R1, 0); + /* res32[1] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_u32), SLJIT_R1, 0); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 80); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4); + /* res32[2] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, SLJIT_FR1, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), 1); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 96); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_S3, 0); + /* resw[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_uw), SLJIT_S3, 0); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 112); + /* resw[4] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM0(), (sljit_sw)(resw + 4)); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 128); + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_R0, 0); + /* resw[5] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_uw), SLJIT_R0, 0); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 136); + /* res32[4] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, SLJIT_FR0, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_u32)); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 144); + /* resw[6] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_uw)); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + supported[0] = sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 160) != SLJIT_ERR_UNSUPPORTED; + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, SLJIT_FR2, SLJIT_R2, 0); + /* res32[5] */ + sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S2), 5 * sizeof(sljit_u32), SLJIT_R2, 0); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 192); + /* resw[7] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_uw)); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32; + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S1, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_uw)); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 224); + /* resw[8] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 3); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 256); + /* res32[6] */ + sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | type | SLJIT_32, SLJIT_FR0, SLJIT_MEM0(), (sljit_sw)(res32 + 6)); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func3((sljit_sw)buf, (sljit_sw)resw, (sljit_sw)res32); + sljit_free_code(code.code, NULL); + + FAILED(resw[0] != 0x8fa3, "test_simd7 case 1 failed\n"); + FAILED(resw[1] != 0x34d5, "test_simd7 case 2 failed\n"); + FAILED(resw[2] != 0xa6, "test_simd7 case 3 failed\n"); + FAILED(res32[0] != 0x5e, "test_simd7 case 4 failed\n"); + FAILED(res32[1] != 0xd, "test_simd7 case 5 failed\n"); + FAILED(res32[2] != 0x5, "test_simd7 case 6 failed\n"); + FAILED(res32[3] != (sljit_u32)-1, "test_simd7 case 7 failed\n"); + FAILED(resw[3] != 0x2, "test_simd7 case 8 failed\n"); + FAILED(resw[4] != 0x1, "test_simd7 case 9 failed\n"); +#if IS_ARM + FAILED(resw[5] != 0x45, "test_simd7 case 10 failed\n"); + FAILED(res32[4] != 0x9, "test_simd7 case 11 failed\n"); + FAILED(resw[6] != 0x1, "test_simd7 case 12 failed\n"); +#endif /* IS_ARM */ + + if (supported[0]) { + FAILED(res32[5] != 0x51e83b71, "test_simd7 case 13 failed\n"); + FAILED(resw[7] != 0xc90d, "test_simd7 case 14 failed\n"); + FAILED(resw[8] != 0xa5, "test_simd7 case 15 failed\n"); + FAILED(res32[6] != 0x9, "test_simd7 case 16 failed\n"); + } + + successful_tests++; +} + +static void init_simd_u32(sljit_u8* buf, sljit_s32 length, sljit_u32 data) +{ + sljit_u32* current = (sljit_u32*)buf; + sljit_u32* end = (sljit_u32*)(buf + length); + + while (current < end) + *current++ = data; +} + +static sljit_s32 check_simd_u32(sljit_u8* buf, sljit_s32 length, sljit_u32 data) +{ + sljit_u32* current = (sljit_u32*)buf; + sljit_u32* end = (sljit_u32*)(buf + length); + + while (current < end) { + if (*current++ != data) + return 0; + } + + return 1; +} + +static void test_simd8(void) +{ + /* Test simd binary logical operation. */ + executable_code code; + struct sljit_compiler* compiler; + sljit_s32 i, type; + sljit_u8 supported[1]; + sljit_u8* buf; + sljit_u8 data[63 + 1024]; + sljit_s32 fs0 = SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? SLJIT_FS1 : SLJIT_FR5; + + if (verbose) + printf("Run test_simd8\n"); + + /* Buffer is 64 byte aligned. */ + buf = (sljit_u8*)(((sljit_sw)data + (sljit_sw)63) & ~(sljit_sw)63); + + for (i = 0; i < 1024; i++) + buf[i] = 0xaa; + + init_simd_u32(buf, 32, 0x00ff00ff); + init_simd_u32(buf + 32, 32, 0x0000ffff); + + compiler = sljit_create_compiler(NULL, NULL); + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 4, 4, 6, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS > 0 ? 2 : 0, 16); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_8; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | type, SLJIT_FR0, SLJIT_FR0, SLJIT_FR2); + /* buf[64] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 64); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_OR | type, SLJIT_FR2, SLJIT_FR0, SLJIT_FR2); + /* buf[80] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 80); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_16; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_XOR | type, SLJIT_FR4, fs0, SLJIT_FR2); + /* buf[96] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 96); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | type, SLJIT_FR1, SLJIT_FR2, SLJIT_FR0); + /* buf[112] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 112); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_128; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_OR | type, fs0, SLJIT_FR0, fs0); + /* buf[128] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 128); + + type = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_XOR | type, SLJIT_FR2, SLJIT_FR4, SLJIT_FR0); + /* buf[144] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 144); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_32; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | type, SLJIT_FR4, SLJIT_FR0, SLJIT_FR4); + /* buf[160] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR4, SLJIT_MEM1(SLJIT_S0), 160); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_64 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, fs0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_OR | type, SLJIT_FR0, SLJIT_FR2, fs0); + /* buf[168] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 168); + + type = SLJIT_SIMD_REG_64 | SLJIT_SIMD_ELEM_64; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_XOR | type, fs0, SLJIT_FR0, SLJIT_FR2); + /* buf[176] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 176); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_8; + supported[0] = sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | type | SLJIT_SIMD_TEST, SLJIT_FR0, SLJIT_FR0, SLJIT_FR2) != SLJIT_ERR_UNSUPPORTED; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | type, SLJIT_FR0, SLJIT_FR0, SLJIT_FR2); + /* buf[192] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 192); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_256; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR0, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR2, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_OR | type, fs0, SLJIT_FR0, SLJIT_FR2); + /* buf[224] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, fs0, SLJIT_MEM1(SLJIT_S0), 224); + + type = SLJIT_SIMD_REG_256 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_FLOAT; + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR1, SLJIT_MEM1(SLJIT_S0), 0); + sljit_emit_simd_mov(compiler, SLJIT_SIMD_LOAD | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 32); + sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_XOR | type, SLJIT_FR3, SLJIT_FR1, SLJIT_FR3); + /* buf[256] */ + sljit_emit_simd_mov(compiler, SLJIT_SIMD_STORE | type, SLJIT_FR3, SLJIT_MEM1(SLJIT_S0), 256); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler); + CHECK(compiler); + sljit_free_compiler(compiler); + + code.func1((sljit_sw)buf); + sljit_free_code(code.code, NULL); + + FAILED(!check_simd_u32(buf + 64, 16, 0x000000ff), "test_simd8 case 1 failed\n"); + FAILED(!check_simd_u32(buf + 80, 16, 0x00ffffff), "test_simd8 case 2 failed\n"); + FAILED(!check_simd_u32(buf + 96, 16, 0x00ffff00), "test_simd8 case 3 failed\n"); + FAILED(!check_simd_u32(buf + 112, 16, 0x000000ff), "test_simd8 case 4 failed\n"); + FAILED(!check_simd_u32(buf + 128, 16, 0x00ffffff), "test_simd8 case 5 failed\n"); + FAILED(!check_simd_u32(buf + 144, 16, 0x00ffff00), "test_simd8 case 6 failed\n"); + +#if IS_ARM + FAILED(!check_simd_u32(buf + 160, 8, 0x000000ff), "test_simd8 case 7 failed\n"); + FAILED(!check_simd_u32(buf + 168, 8, 0x00ffffff), "test_simd8 case 8 failed\n"); + FAILED(!check_simd_u32(buf + 176, 8, 0x00ffff00), "test_simd8 case 9 failed\n"); +#endif /* IS_ARM */ + + if (supported[0]) { + FAILED(!check_simd_u32(buf + 192, 32, 0x000000ff), "test_simd8 case 10 failed\n"); + FAILED(!check_simd_u32(buf + 224, 32, 0x00ffffff), "test_simd8 case 11 failed\n"); + FAILED(!check_simd_u32(buf + 256, 32, 0x00ffff00), "test_simd8 case 12 failed\n"); + } + + successful_tests++; +} diff --git a/waterbox/ares64/ares/thirdparty/sljitAllocator.cpp b/waterbox/ares64/ares/thirdparty/sljitAllocator.cpp old mode 100644 new mode 100755 index 3e5b7e338c..0d8146d6f9 --- a/waterbox/ares64/ares/thirdparty/sljitAllocator.cpp +++ b/waterbox/ares64/ares/thirdparty/sljitAllocator.cpp @@ -5,5 +5,5 @@ auto sljit_nall_malloc_exec(sljit_uw size, void* exec_allocator_data) -> void* { auto allocator = (nall::bump_allocator*)exec_allocator_data; - return allocator->acquire(size); + return allocator->tryAcquire(size, false); } diff --git a/waterbox/ares64/ares/thirdparty/sljitConfigPost.h b/waterbox/ares64/ares/thirdparty/sljitConfigPost.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/sljitConfigPre.h b/waterbox/ares64/ares/thirdparty/sljitConfigPre.h old mode 100644 new mode 100755 diff --git a/waterbox/ares64/ares/thirdparty/xxhash.h b/waterbox/ares64/ares/thirdparty/xxhash.h old mode 100644 new mode 100755
  • 8BG#8Kxw_NQ?1>^;z* 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 z zWT~mgGs0k`eKZ#DqwVR25XpU zN5iyJqSSQ|gcN~mkxe-CT6^5`_BozaN!4O>J9=Ho;<~Of^`!O7l_+;R1lAlLF6if4 zse_|96EK%HZjK;1_47ZeJkStW;MN5dQjD*z106_Jgjiw0y=l*SR3-%vD6fBt3Moek zE_x_{2G?vkyrcdhqPp>ws3sm(94Vwb1;D9m6E|8s$dO`YAt|k1J#xLq4*=o{yVQ79 z%TPdtj){R)5FmAn32K*>h#*uaF_MlIhw4utqZqE4;%xv@%!uCVT#*#kq^}}0ktP$N zeo&Qq0xWq6*Dk_ zgU;lt@^3t>9T=N|G55|Lya>bV_vybSH5DXwZc$fFr2KtO9|$1o;5Qu>Y{!l;`5S{m z2%+k00kCvABe-&C%{V??9AOW?an5jHE(Rc6;rY@6;1!hqy_@B1lE7SK_k>qwEM`pY_4MIt! zvA)3kMlwRAkB)Tcvvx`$0#sQhB2cv<0iYD9q-3z103ZNJIy3kJ0KriXgp#@|0CWz3 z0OVufNEikN!(ib67zhHxzyL5HhybAo2^Iwa5d$y*8|YJz)-W#4CwEPJw_BQh_d~AX z3xg8-U-6NP!|FU=oQ2^8eSv?S$HTimKgln9s5Sg}<|f7CJaT8-!I}x9ul2aR#N8BM zp=U z3>WAR?~r}(w>XyJuX*g^;-sZ^E>GZ}mqewDSbCfX8{oy9w$}WR8u-N@vi!v#mMrEd z#0N+V0+{q~>6`5|ZWr(Z{5$RE8j$Y2H;?ae0YBhRciHC$Ww9SN{JY)o@&c~}*E=9P zujgAvKE3*gF)q^M^-8bh)jApNr+fYI;4&?zLDY}!d2nx!=;8yPz^k364~qQr^$zia z7;<|W{A-7IDKUvi=yH8u&i@Vp;O^wx|N28~Rt~Xy4eqVi_q7cHUV+zs zxM2lqy*zJ^gX?xgz`GxE1z&#Vs{cj!KFj{5dojM|>b!bh1syJNQ!-z){bzrTBl>zs zuJXZ{QUB>2A7LXdhd9RD$N1iUzZZ5S^aF2w0;iCmi7`&kkw4y#aQH@_#`Ap$fT6l1 zFi&`HxO(Gpy9wSIkTLxALv}9TZO1jV=Z_eWpnJ*3R@(Etep#zsb(2(lbb`^sk z-J0jualjw&-v?W{a)9k?cx^u4*Bw#t2Yh+ax51hkje{$%Pd02YN@AVvM}(I?AssIf zzSp_vz9IZh%bzR__;^3`-ywK#qoenS;Oq3qJGL0FS7CEQop<}O%F-OPkIM^q0nfAh z^d4o9{@V0xMUTN*86$`9Bdfzz`y-M4Q$=v81J6pukq|Uxv_vN=;OZbq7puyiL_7Ge{d@X68v?K z&r8|q{ZUVf9J$-a_mK_(^Z|VPK@+Zy5OJ|Pj{cj6 z0Cl*3p-b@Y54MFwDHPAm*>P|4Xg{|f@EJVWN%jF2EWUTQfXl|$*7NcY&a~OV%g(oj zmMa|>ubM@+RD;v}MpHWI!|Vy43>oGhTJggud+~=Yb0Tn%laOU!^f2YSha!KKjhqjx zBbDPFABKIrhDROQ=hw60hCD#L?1>&u*@`(!C#`MkKp9wtyRuwse2MN4&z@CjpqU6q zFPgMHd%Gt`iS%3*L83EQZ*^VCmk}j2&IE`+6Y($yG2EcMsytb?=kC(G;5QEmM9}Gh*%OP{68+6EuTh(j}CjMF(4l%eG<1f z%{U-Z{WvBNUGjUs&hj9IW9g}s->Tm)l znN&9I%i|bS1$K1yUJ)%m?0p3CQGr5CdEM6Ukf(Uap<| zu(2tVcu91^Mh|moJ097II&^G=cK70^1P;RASEnERVoAlW=F}GRR03pi>498U(ll{F zi+QAvKjlh2qsH!HSz@H)7{d-rr{?&5gV-9>Mf@8J$Lzg_1M?69HOh`}2&S$n7DPh~ z;{JWm3GO=>>CM;I5JtfRR`X1}1TYUHe)3iC3aGJ!W@b8h59D##eWikxc+8*Y#cu`@ zBC<_|8B5B11qZhqjWV$J4JE@s!AXS{ZY?zjk@CqsSTK#I4yo34y_`LGO>1|7AzL3drT zFtl}bxyB4QaymzOz`?gJdSzun{te_%@QCV8||R|Xtjz7<>Pq~Q@Yi_4<>;+m0<^Pb}z3c z44e-Z1sB?5-LQxop*e-!jy`~qedC|h4mS(3+JK;0WkPW8PoTrDE z_~TF$7;KT?3^*BADQ*IX(X;VwN>&nPP$Wh#38&rR-!pK7Dy7D90899r2x9yEbXa3s zBo4p*+>|F~@YK;9z@XT|gl$p6=zlpHhR$I#uHx~`8`SD47_8QZqx+$q6B7@sGx8%N z>S5HjZe^4dE{uhw`Ii<#4{|Oo#B|w!$^I zQQ*#*)YM}{TPC3--j0lj2X%Ejf5*ynW&5|J^?T{laLUOIuT8tX@@Q+QEvdhh(TJoP z9_?Urr+w=5F;A@wp}f7|I>(7=vv}Ve^?{L6dyxM|XGxx-_q$Zq=fe6Z4)f3~o^1Tz zn}w(O;F(|_~T*|l!Sp2-_g|Px&q=Wg0_M-9w0tJx0GVC(~7FSQD{wTSN%J=&!*Jz9?8zkbMZ1Hmvi?IC8IUan|; zBL{{b=u(KLE6wSG%1N9I9#A7_h&BZtSJ+!yfjJgEJ5>jqQD}_^I&FH z+bg?g8DD#kmj}9uM<6^Q+~L5)ogFdwAYJzWs+lT z6(SCV@6qiD4(`9kTpqmFC1a7>?|&a;8I>jBN|-#aHHtf;#QFs3PW_Ne{7ZMcn@nuxv|~?9zc|>GHrPhh{id zUqjGQ<~MMrE^K>Z?=O<@0g=U9bsiiR{SuRbLq=e*wy~kJ*HJy4#)VEg`W_oRW;Jk9 zwYH5`v)v@Q5gwQ1RAe~$Ei5X>P_sVZH-{g6v ztlv-Pj1t*ji`K89b0s{kM$6-x06$-sHK#nti4V}l9Vp;MWYy&s)zGo+r$wFrXIr^D zGmq~IPs-$`HJh?Bm!HSz@!Fe%3SDv5shbW&FZZ)cFe%gGC$h*L3rkn87>BD`e7Kbvd8wA9oN8|j#70F zG=HA2fp83Ue*8zNpnP8DOF<4hz7BiEX6&TQufR!$(#H*3o2kUO*mEfMrOV3ZlzSNuF5}Hnv7-H4h?r>q zW|0NY9Q#Ae5*EjGxcx^*$Zj*c1&1cj(S!@%#UnlW9u-3e;Fu#^JrRE{>s1^hK*#;@ zX{Vtq;=-^F{+?pFjbeDhWXWD**GZH5aJeynbc;-LN&wEg*`Ru*`7R8gne-)A-XeW`FW3JXctv1B{a}VyHvW;vQUKKBkQpqBd+ke4hFz0~+03usW1)mL4mXFHn zrp}dZo_)E)G`R<({oLM7#5D`!@X?2<>4757>Ep=Z*qYJGvw3aY3BTPLpIF(C>D?f zT;k(FDK`CfY)#RCao33wgK(@NAeiqTfs_CpIyf**ljj38S-f|_jdo}eFmv7)6y=aH z%D@JySH#Mmwz)!3TvrN9Cr!=`MjRlZ@rSfL1k((3#2w%B0F+aPhD6X2vmbMEVRslu ztJvno?2183j1xR<=ehC1-K%6t_TT7d_hs-PEwcpf$h#_jXG8$gE2D9&^nUPoxE4$Hsgw%|7VvRxfTo$)uK@naslH1?(Mnt6T zj7!>wTd6xoVOEM0!9a4*d2Tat_P`c6f8$$AT6Pc_s)%9kkNz5W>2M!LOWJQm%MHtS zPC0iE-bFI+(kM!$sFn2?Kc+CpU3;3~+7Yx}>rZp))$x%w9@*sAU&MyJ86GgR$kVcfK?9 zL}xNoO|Fk}qXkdM)Bi%pv%mo)qqLb1$%!DF-sL5NvU92vzT4hSc3(~vU8jq8$~wcw$w>X z<#?W+Xetf>yA5-3bI^Lu&i3j9VHw4%79DkTz%W$u!xoQBaR5NHY6lH$9quogLi{i2 zckIhA0yG=&v1eb}J-A!&UJcNom`gW0R9m4XULe;PHYDIjjA}z_T`-W`La5hEIfx#%p?x_T`{KGhATuGiFA*(_ zhd9ns?P9zSV%CNt1Kzto2yv=gbf5@^ZO&RiThT7A9Ftfv<*}B}KNF$&RB&#ug&h=UbVvYwQsNk_%nh{m;8o z*0x|$g7}@A@9cjrHUy`UkM}I`vr7inIgepY>#k}fcg}P{izna99&;xfB^J#q`C7hV z*sw-rX&O#u{@?#Uu(!pU`NKkm1(lWgC~-U}7)wS@GkAK0NH(xxG3rR$$OP0zS;}Jz zb|cXMYGJ@Zm+wWpZ`gY_>PSblbJe*`R7=@Nh--7aaHW!fVo?un;WqiG!*+*wU!^fe z&_IyTa`efEV0_^5P`x+{-qqXkfS{50p>apa+6)6z8WuzQ;TdaN>ymGf^tKxf)es=z z$$a-fTR6eu-<=6q9ET*2@#k!+by>XFlFnXE8HIj+tQ~Mbf&sPEHUEfy@_dr*<6Pa~ z&2L|{m%B!kqsbZeF#x~%mZYQX_QE`3K+>lqB~a|yG6L=Du#HBS#8DVa!+;!5`wIcrdZ+@rRj(VoHu zkHGf|w0i4XUE6#MrJ%DJ5-^i3Q7aN+MZId~WLr7l3&gX>na|O*1XIX4KL4yWXe$8> z#zpbXeQt&`3*bA~|5dV8Mq}$EZhIc6Y=D#=etWbtM<*68JJ%q;2JAew!;mK+k5RNr zh*PC+j1(UdkYPQ%%F*B-ye#-lByi^@(&5quir$lWv^$4rhWOzqflga{cN$iC$zu<_ zFOI>MfS^`B)=&u7O&?+2eQ>mNUXl#R``pb%S^2#2XfbdhVH<-h8uIC>N3ZTNry zK?pgo$K_&WodtR81V6mW!_C-XbdW1OeZ6$Jxj`*_9M1V>yW&x?sd;f)a@`->v;+DF zXPxfY9niobvdSVT5XN?eMH?#P(+!AiR`g(w!&k`kViY%NSw1VOJ*|QLWTOZVjK{{& zj>_e$1~-%pSbGAFht;L<`4{zO3p=u9nAHK)+YdLplIKFCI~a>^Tjd;0b+9MB?rX|} z!^Rsj${ZQ*RdkaaF_>eH=58>1yBI5cp!;VOfdf$GobDb#2e+`o0ZZk_$mJwr$DFhz zU~Z+8t9J;#1(_$!zBX38;qVPqaG;l9I>6P{^-~PC>@o?`rpN~p8f}v!e?H3(z3DH}q z>zE%=jtH@ZDnsSPEM14D6rtho`}s4$gc}3@k!T6~x48wyqE%ywT(bbC7FKggZx=CJ zH|D^xnAxqlaFTh7f_x&87|OSEf*B@|d2U8zHt%`gVO-hwARNQgdri2%5m~N#u0ea@ zJra$JsWUN*pVMKn{kSCcL7tT}`4983(XYC(qB*{Gj3SoXW@BGdmL1l1J7^i+Y9_L1 z&J&g=n)`9pB|G6&&ZDKbW)NJ>?3P3staw56?&C)1!~yYGg3<8O>8KN;t3Yr>u)?4+ zfL3w}h*C+LM$C@5k<$d%z&!W*^gA8zdbb;37%E5c38(HAn=N2;e(IH+!m>67z}zRb zPKK#46(1=W@tETb|)?XwkNcm8Yhrd5?-S4M`);Rx#!%dqH}z(MfI|Oe%uI z@EY#uVlCPSE^l?a4c@QJynK9%mIILogEa)}I$1k>d)7(~BinNpD!Q5`lRLk2-; z%>_iTWtWTzOw|VQFSjH|6T!Gh+=JGtImf^Rre{B2O&FqKdn@lbVJ)BY zWV3Vj+xkvZ5~<+^!IRy+XEVrp(DdpgnecAm;=@pQu}O2R#|8A|+b2*q!bXR8wF@OO z!8r*GUM|V0m$#%?8eP|^fg3l_Iffc?D@b_uVa2sAqGjaphJ7m700+mR_O>BciG{aE zch)uQ{~8G}U(?{ZxXCupt6}yvV}IDw_m4kQ1F-cG121Q2v*e!_^I%I~@cu`%x7V_) zKwJX;i^CnY(QvFXSMa&6FC)u&R>QmO{T_aTB$s*GoQ|5p1_m<-W=SsIVgzXJb+Hvc zYIIBB@WGqn%9;*0z22Zll)TJ6Z^ZXJjtYYr!>*sWMqqEEwsPse8!8i>V55av*S(rXxrcto0vG=Vo*bXvbpm#77T|h(Mik@NZT;x;G1YWualS z=x26O3YhAAbC)}RzQUR9513p=xXf5{|JDH+*s%0ht+i&XJ4vC9i|U^2Zmh9iOjtXX zs0_>i__lF<-QMbNv{;fbRK2d=tPl^A!iTEgkthVP?@!Xy4F6pBKAgR12}`!HTfh$QiEKs zk6O{%($j!+ko*8Ao&2^G*msJ552X!4Pi1VKSCpnIJ@8n1bzO$A!DDPu$~Ya60ZHJ% z+vzNaH;b636-PKE#pqPX`DF+p=cNK!-q2I6KP%xdTPU9&$M+dmbu=@zrtf6id#fjj zkl}lRu=KDjP8hg~UEF7?$&>KXJ-VeeN|N zYf`_jcbcd}ZAzK30@%BL@D{4s0OEU^59D|?tMjv29mBvM2CJsVo5KU{2%s;{o-W3$ z)6()E`NqhGh@5ACu#hQGaIIji@b08KTO{0lymx16zgo|}VucvPnGQ^Ydnw#qIX#@H@OGc$`B7tM8(R-Sg2 z0aG>Wv#pi)QbNf_=EBbXb;EqL;=$uaSawsY?+^6?aFuqbQ&2-Ma91GjK*})fK}0^x5#(vWx(SPS~orNWnOxH1*@Kc8IIKG1t^0Xauze zZv=9!b|dnsB+;BtLZn7z)TGH{MkO|Ydz@atAjnc(bPUEWlmplkxMY@aHBw;c1N&=} z;ZTrf+zg9%^M+$h1%x?Z(^ykNx0tCa!SMq@0viQ|(;)yaR(y?t^+a*b-;3NL0?UWi zs!_%)!Ta$O1DQn+Cvht6^}XqJq?+n3_aGc3jPCu^5M15^nyp)sQjJGBtbi69bsqZz zjln#e>h$q`L`&iA#9RhgE@NG!Ong~UqK`Lg(kgY7<|QgiR^S1?#WORkA5@CMmaICn z=FFA4Oao_4sNbuA{e5J6vK>**eNmZ^!Z_%mr=ZTVa0sVP!IDfVw6tn|&F3n3Hbx!$ zP{P`BE7R1BlHZ<2H0w31S1C8_9dky&@1-4&Z+`tP8?Fe7fS_CL3V_%kP85@;;*rN?H z7wyBay=4Gu-7OcnoI1_j%;RUEdIy8;7+MHvjWPN87x6S3!D7cjEc6ae3UA+Sk6BcX!)ML|5rC7-CVaU0g*Z@E%+`uN zG$?pG@i2$yh}K;th5$A+b|w?JV5{fg1`?)sJ5Edv z@b%SYi4#AsPnX-HcEc}1nFEekg7a2ql1E-Ln{8xatX)O3chTqxgpTl0lmI92z8T1J zMX2V*SSSurwqwL>lGgr0)PAKAo%ymI%JJm6v~=rMmDzvAX!P||CpD_-`lXFT#s292HE(B9K)z)CJ_$E)MJ z^PE@y)X_B3v3AwK^C2jlML^;1+JY|22ce&|U9Yav?9up*@J>l9g`-Vn7Evfb4hL0q z6xv3_hB{9jk%e8KiTs^zO3K!9ss+EMS7#uB#2E+g6!1_TG*(kN00rgrZ;n!?bxhta$ILUC=0<8!>k{B3o8m0QTr(3|5s#STJNYG7CqO2o8Tn zge}hz2-w}W63b+`$zJgn18Ktsv@CqjoYkiVBI4>xcZkjrAjeXTGE(57Nz zT5&Tz5RX&Bj52?c#L|@Q*2;1<%@ejGS>O{Ge`Hvk%m<=#ZRC*S&G;6wRvuD03N!-> zL!_>9O-W;bB(L{m<2z(;zRv^@Ku12t+Y3GOde|MUw46uW2dzYlQbrJ#w=iG}`CKP( zV~)5DpjItg6B~25+GN1}ODtC@nK~1W5JuieDmA=slxWH5HL6*a!Ibp?vuQVKTWz+iO)ETowHv@_eDE+P=b15Y+?DB=lhLdk zR#zey*6@7qw-$Zs_Bpo03@o+WN7Pm+9*)R&jyJS=*&2dJCf{|mNQak6h021E}ekYe`6tAqhk8T5)7 z$lBo?QOosWEy6YpLQm?E`va~5>F{oqHS%)@6uAeiXYyt08WoW03vZqtq-wPj(&!8^7Q06~)v)*E4{p;;+pH}d5o`Y0PI8t;!( zDJ&4Euw!|fDo-RbhfykF$W6#jOdvar$@ONaEM6%kf#nQjoZ;%Y*(JIfT~yymWOrM`2iePktlQ(xjfy{_%bpF(iep2H z84(EvlA@>QGfHNpEyG47E_Xe75r-TPj3h)c(26uA&8Y3t#>!eVcU1jk;fQIfX`IeX z>B=vp8L6ChjJsv`&Kz}UnbB`d&FR@8@qwpWPBPj;V{V4mu4DH%8+f$!7WG8!3Q^vg z-dY1JVK2PZz?C-mn#sJG9!QKuWkr>p40b$5V)MI5`N)I!VHHhKm?xtKqJo}G2N{rE zJUVHTQ{0J)kqixaCdJrj_)w@JLAYNwSS5rjL#K&zDn^cK#Wd);mg8o%?b<{-ZlHal z6SS*aLw_E4=w7tyzpd)2A+pxM*w{5VEhi3P_ABjBHGoKwL4A5Sl?0YJFaw9Pbnc&j5{g*~rYhor;G(!Az2U&Z*xR*bRlw{BTm$(hgB_2tz})ptzz$PYkp}VM4X?|08$c8I?;RnR z-4^4l|2kX@k`(bdCw4OVj?d39AtGA|O(Tv<5ZR`#VEMzvJi!0gfdMn;gu_tMhBSE< zs|TWg9X))ziOdgf`Q1(XVb$plN~S&O42u;&f8I>|Xd-L&fZ1Kg9bhV0`HgBP$7N5i zV1|wlv;xyQ1&zA^TqYd%rJx%l`vz)sa)YyF8{eV7Dw+11G>^N57J1~jLi!($M8+so zZg8-~YuC$_5rKW4`~9{|<8%d`3GjDB$^%7WZgt4sKXZQygh>`8$IS;EH;yEM_3ufR z;Om+gWIcxFPWr!YbbS9agNnYWmLgbu!hjcAb~EP+jP7wn{tE*#cf&+S8iA;->vv>) znrjVR4sv#2i)*IwGmV?BJmFjdkuPHFMYmmnY%EL{ShAm8p*jC%zX>Sn~7>U{`l|AaFqS z$2rkKg~ScSoGI{7YrNkf`QL#*&qi{SJGvI@G{V-%#qk2c){ z!rUf3P~oR6g|T8U=N8(#0MsH}e}n}?l5bIavZvBX@ApEQ{UhLsOZASB@Y8St7I9;d zL6&{f>w*#V3))x_EkfOqYequh$b0|?PaDf?1TpvToEl!d>3zT(93nji~gDAMe5%i z0@lZm)UN262A3tVp)KB_=m~(As`Bcq`8gBn%jC#aXf%z<36iBa_h3*hVH-(Uv~Lw* z+aStZWWdl+Rz2%hYIR7qSZ9hlbf+F6o0vH|5#2L6?a9fBGUIrjRaY3({aIfsB;L1J zcQ1PQYOf6`29D8ZJnD9DXak~!_)SI*G8Fd5{;_bXMn;E%iKIZikuzNRcaeaYwODLG z9;3+rDX!~v3Xi)F2&KhIAZyGsPZRF2qLDfSoGk;+i9~7;KoB5OXE@z^@4d-;zxLjH z@4c7Sd+)u*wcdM8=r}C=8)k0MoZErCK5T&S=QSUPl>r}N-t*9f(NZVV=6tfW+ z5ZDiYNNj6 zCe)~iW=KGE4@d(ZikjOdy^1_uKt`k0l>fxF+L@l8+DCA;u>@4Nx3U1B6SR(wI_Ro^ z5V*=Y2k@-aw=Sy`RtoUtAtn(0+H3o}zTGGb3#%~*h~hKQP6!roNN81KOG}HfhgLRp0lZGa6MA=dCcwDXNc8QQ_!>b0$|x4-=O>+xRXr36 zp6H-P%|Z6|qJ*;t0g5IX<`}{BqWE+s5rbfkH8`ZyfU*-QdaVE#U`{D>pt2dx=z@TS zG;d3pQjLnPHb$}(i_oayDL7H)808XWejLL@pdi?st_xJcuO$X*Vr`n&{pnKvQw4 zm0E)EC|TDH#6c(-Q?PC^4vwv`(pt3aPtIdo19~MW9TMVbx>Mko<1UJYbz?M-(%7IE zpt;C^5X^?ugJEOW2tj~aK&+H zyft@}WgnBX^JFgBM&5EPoF-Oq#aqCQY>v%|TdA zR&tc+*oio`14pQhmK$AEV-BPqM#rq!8RH8xjl)JUN0dhxm^FW6P_9>5fC!}nX{LmW zXxIuZFvDE?yUKm#U73t>UHbgq@TzKA+!JG1u$*633JoI=bEcpImM4LuiYbY0e5@e{ zLXkoN#p)c{^x&MlfE3IbX%aZ6n1iqQs6u+pjGdKLSrREC7?S9oT!_0Oac@NA!tg5C z@pr@=f`Tl7s97ms;VtmN$1@b+<;q`gxkt2+PJiZ-^w@OeZ zScSv0zBQ(;>44&*Mj)p+Hh6_X;KFg`V2;snCV7BOc@O_1yurA{0rw8E0kt*4H|7`M zA|nDJm@J-Gf1ycuof=Nc_nuuPCNc-uyjIzh~g<~ z7-%Iq%{yNpwy&+N?s1m>pq1b_$}xu{3N-=}NdaG!9YCm^lhI#a0Fg28EI%kI7}Z!fwwoRsOy+rYZak!GUocAk-CkU zXx6wYthC9rP?pK*4KAQH<{#4vqlwczD2>5$ICHu|n_0K^GK?x|v@B+8j}O==b1;z> zxIp*u0HmV;?<`pCp)m{gWj5>kXj|e$VvEHaS3WDDURhX<0@}}ks#Jlz5mxOS3FqLO zUtRPGq={Hliz-JTl9hcyf51CA;rK14)CrhN!(E+Y8(@{9WdQT?xJwH}vv5KWLz>*n zYS_M@7@bb|;wl@x6n^y;zy+o2qA=$6T1BJm#m#EmDs0eqQEbHz=|; zD6%yu0@6}Yq0rKx3}`Bo47fdJVZUsDh#;)*Z+~ye^6sp2 zPz~0qEow|^pqHa=X~Jwq3tIg^23~OWVAJlf zEV>b!#(mtz#xUclc%XHiKUJxQ=7&>VF9&eR75l+6ohhT0KNfGh4HU%$(o%t z6_$pXD})kDMN!s`eso&9X)j8=U?OV~EDNTm?!(3~(_&+cu}sLUr37Hr*03!gu?Dnb zW+$3P43@HH0w9N|X=*!J>WDHK(-@(CD{1X58FLl38{i#o%)vPx+=+Rz@A(Fl0%pHPBp zWTv@79bbJ8CRx=nN;;9_J(6W|Tx)AFIDju03G1ViN6y0`jd_1hHVu)Hqa0KtB^ztP z$&4eRJmv_bq8CXXUxRN1Y#Ftwo)$2ZR93Sr8jRXg8z^Fopy4ILtVKUy7FCA5+AV9F zvY~LGjBEx|Ly2bD5oQTAmCOc;5*JXDSEv!my*wzhycY3XyAaio>hcO^V z(7fL0|0ihyqjIi5!Z!207bH3O$4H&S0xG+JqQ{~WePi46-_})h=tyO z;()4X8tml-YQ@IKfC20PC%gc}tz&I;ATY;3s0^qRCE~Eq8qg;V01JgOqe79LfFc`% zqT!;UPy&QON$M+JKfvm|elXnxwjP_MGbn5>8+c?eqPVz(e^WeCPQ172n4^P-C&a0f zTo(onP1i@Jy}}9>ka>J;54o;G@PfovwXRE6savVXOUe2uCCPdiDen*J(G|}TU|csb zB2;7Kk}BfyE&@IxavmC5`zv(CBlNgLs+yoYDdLV7(Ac9N>tP?nKR!@A!)lxwLbV-h zQa#l-58`9>Fpu+(5ULVNK;dBkxA0Q*1SsFk-fyR0U@GtHUYUZuX zm66PtpA~To1!C61LDT*z`rewcw4yQ5b;sf6tz^P ziCH9g5g8v3u|N+E_uj5}gjYVt3RUfetK!sq!y}}kqLZXJUjJ^a;r(#N0jj-8eK7D6K2{Iqpnr&X z*0>&HYK&4G3%u4x0IG*?e`|QuxG^=TRDsv|$m55Me~5U5ae!)9Db($C9}oZV;?$%G zypM-}cyVgd9eMAI;_L#rL=Yq@SmO&(f`St{qGT?+CBXsGXh+#D(~;I##ubI2O>f!` zHaq}_HtptA18rSkQw|uoOB|ajFsGM6EP*+;3?B}tf<>Pda99^RLIxXFzRrSB<1R<^ z%H?(1B_R*&>ju-r+M?ME=%5WmJ~k`ek2Nm02mq%2_T_dmCJ!04}}*2uTy%{Y#@rU)rd$Q{DuCGn z19XuA#6ddf8{Za0IywMA-4a>)2=F*nE{x85XKhs2F*M;Ul|8$bYB47?#8%eaD9>OI=JIG z#@7UpZp;>!8==sxdl7 zx4bD8Z0gMG;@Y6=-zHn_$|r5ket zVCsUQF&78<=-j4YE|`mhd~|M8(5X}lu-AE)2*rr^bOO!kjM?NEsHDavsZrz?*)%=A zsy({WwX`<)=qE?XDV5aL7zvQCEK!X|D$pER9~r^vEn1r|yZUp%yy z=vXHxg%nW$JwU?0F!9fo?hr+kPxa8SO>U8fo)ch(D+<#J@2tfUnsw268ytko5y!+U zI2X8wg&V6|o&W+%xNGwM0QcC?T$z7M0`tRNU>IXu2e1u!iy9pDGEmi^6Q$nuQF`D``k-T)93%(QM_i89_!#-IF><|%+6or| z=@323481)T5+uasmbld=i10AbR~?}0)Q?ts`0|;{Vfcb!5SEz7iibxL?M@bx@Gg)J zW8569s9GX9d5dry^#rMEZm!%mA7qmzr{*e+aR^Y^m}Usg8sDEEn;GZ3>Lt@wI0leT z3{_d*+v69(KD0qzxZJu-b!{O$3jIjDiCAc9Rfk(hVIi(-ZL zM2hJ|F|Y|W?#?fI!*B`LqTQTc5=J#7PS*-JXyi+dNK-n*v9Si{5wgZN*T(ka?G5$H z!4>kT(p8_zEU-St-Sq{2m>|y$Ztu`T(!0DS)y8z*zn_&($9S~T8wfQC9 zu;Q_`q0tz7H!;_&0tsM@8$j@_jK;`YgaN1bf~w}?%RT$x3PZW+RhnY1@x&Tm2}d>( z);IDU@l_}WNGDAz^T7DnVU7de1}?V@eqB)Np#{ad3f1WZt9Q2%u76!8G_Y74Aif!l zOPRO@#e37xu&PX}y}+{7>Kwn}j?&!b&83O&?y@-XVWyaNGCVU-lIhn=!80>RHZA%& zijwe5I80^W&wWhRGvzRu!lTt)zC#(3Au~weUQ?gK=6r*Hkv=>hLHG9f>o-8B9 zflm@jF_(XA0Zu|nI?gfQu~gXZt&b`Twpby|GD)&>KLDMF8v|v}`89MCZb4-u`AM{y z_a2w0{9`n@FD2Ea%J}R@QsE#+PMXT$q?Um%P?3S(8rp*mgN8%ZaUHW`GmpVf2r))+X`I-=w~?aQ>ybv5 ztdvf}NGwu)hScIB%ODYvg4|ewHpI$#Bk4lSO6s1`a&Lt=v81d&+Nu55HXFvf!6?T<-FZ zSb&$2lsCSV;JEIX~E za7#wnCt5R69LMD<{|Gj28IuLPZ6r1Qrx5&YhV9Nisj|R{FR>eT^6tX&9g`BX5I-e0 zbI_l|i4i{`w$q|NMOr!m9tz2olir)&{7H~hQwb#_KM`uBBF7dIKPh(GSO$s-6N5Qa z8YBUHz`G3_D8+73#A%K+gglqI)(HfWm5@0TKa&9JUme%oaXgvuT=bab=r|TdWeNI`YN({RR74gV zNVyF|QJ+9c$=TREqarmz^|rN_%W8eR zX*6&1q?)e^%JRtSLO)qoVU`NA^Um_%BPsqAHMs8#hh;Bb*w50>of?~#g}>5A*Ew?z z*>TQR*lAER>wN-m;2u_I_{xiGh2_UlwT7>{xK&&rP5JTE8Fxz0>ejKV#C2yhh{97# znhmT{S$GPsDdpr-QktZYG@~*wbPi!RPCJAAOa+P%yLB2W@l$J_Ps z$P{?0F;h%k?*3t!uAC~-O(uDjmL`(Ys{*T#R3zQ4tVFexZk490JzT>!c>@ew_Q%iF z{=p3#U2gPG*~%MKYVwl1PO9L3xHl8-J+!R4XVo#Y=Kc;?cAllg3Cqp@M2G2k=A%hV zO3%8oUpig``vk?=zNG_T%to35PvJpsKuiV%(UFof(s9roWh_V6y2Dr|VU635-$TLzHm{OW}$7+mf4*8vgv^$OkDT-zM zSt%@@MTfQF!GvWJUT$G7fi!jDYBKVFQ0944pH#_&sgKFD_rFYZou?hc8X{w_`~&ph zStZW?`%N$;W=c#xbm&jvG7F}X8)tA5m#KUTz&Ai-MVScm7YDMIFKb{rUoe$jjlmrU z1E*m!n7_pg<~wIjmmOenaRmqqFlj)$Al%>ym@@thUo6Ia-%R?)q~8YTVV;BhO-ovz zKf|Gal2ez+zd>GKP^gLFu-!0#?-D0RS9*I%~8s|FN})z#OuaGuTaq zS_@);9sOt=<*X;I@hc2mc4hTs3d{yr60(#5V0qCtftg2?)!7Qu3CBFgbYnecFigJt zG2mb~F0%++F4h-oaNPsaPC%5|*(YF@_)C}}aQ4A0;7=;p4s#pMbF%d}00XxXrq`1# zn4vfubL;~sz;VuqOh)rtFm|rPjNWR{5g=nKRJ_B+5!e8&zB!A6&Z-1F#-4iaG;+sTV=kFT*uj22^EMR zgxM9JMR|DHLR5qHnEU?t6^@EFf z33Ceu-(UuCgY}px@!adgR}WqW;K^0a@qhThY-L_(zz$y2F`u;X+&Pk)<4nkDz;6I^ zVY(^^oNITTAaI7`3UKywL;NAmP!c%LabcYQT(LJefSWMSMegKFR1RPga7hb^r=zX% zQ`tO>%)&zH@OPNNZDb_ya|OUmm<9czuVOE(mnATr7GCfJOcYxfcx-|)1>1*PB}}%? zSvC>0;2)u(rLl_l-t-b26ROYP)f$8xd#2cLEZF`7qVgj z*ObgmQG!CnXbQp#s?c4dWDoQW!F!9~?nJ0eq0;JXvP<&%*idJq!XG%xE73S_JqiS}ZRLqxPH60BO}5jj@?Ulj?h09m*JZNdax zYAnX~F_vecVbfhxmq}D|aEy#}ZOJQT+BRk|hU|r&=Amr`CVB)X&{!3E zaUR_m(GIOqNpx1KxMpiygtj#rBqVbY0*$8-0$V#`9ci+GFt1vLuLZ!gduYui#JxU1 zRWe@TQ8ETOmK-H+j7PQ+Oj=)S6ZWxPKK`IB3A|QshZ|vU&2^3orf-0NSil_Yg}4Ts z_t9q~+BEE(i?jkk-1Ujj3d56+M+b*oB&MNRN!ja_mJfA~ZfqHc#Jd9I-gay;0|Q}i zeaJynHp3^7V#NX}#?CqbwKXgZII0Q)SfF(rUYo^i%6Jz|cfCVS)2lQ`0}4=CuCnA+ z0xzRl`vgNO+5oe%70ueiifuE1+ljJnYzKhhDykVWE8LTk9pVAF1jHqQw6|BXZm-s+ z2tYJC5)!UqS?IcBSsqYj5(fx`sXelvr<~&SNGsAhxO8Nw4V+_HJf|RzV|APyw5=tb)S{8U>|!PltJXP;3e4kzK&XRhdbR8eh`ok^-yK6h@)o z%R{Z}Muliw8`qugGAVDEK;uiwG=T&y)0+papxPqZ+{X(4!T}gHYTf$#^qpSelvitO z(-CZ71G+hm|> z?*T>!3lNH9Y%A1>w$3@*=!@CRc-r7c%jKlmf zF_1>e821+k>>cn7+ui|bGG2^8(PP}e*c{tH%mC0FZGC-;WeuDFBh4!#M6Mu&GAm4W z(K1LK6v$#(WPEz45~v>c>9u}kRw;dOjo~e>c|eH~_J(FxXUH+$%D74$n6>l1texiu zSOLTVX;8JjHafGfUy>^ z&CIIpqtH~DV_DZ=m;@|EIqqcSA>dv$^8|)rT{r-WWmtyI(8Q#R*QV^9yjFu37FXj(a6Q(=El(|qjX`C>#f_TOYD~)QNg34+53ka|D{*hq=1Qwd z(Nn=SrIH;V_Kyw`bocdzbbT{D5HRFG?cK&h(>)eVtP2}Rk&A1ZKJxeO}%R`2#afF*LHAy zStkc1&R@`&Z0U)Yw?=4fu(jN%Q?fFB?Oqi+qUl*h_oj7yX>L<$PBnLsa2h48y6AEy zhPiN^XpS!0#yuz-^biW(8XC0PT{ieSOeR-ioD={b!Y_+Ll?iq|LC!+}Iw#aU#G0%x zNncV}x}?9NJVYF)1jUCKl#-w)f+dzR=?ISxQRs}&<{|XF5wLjKVX2e$s`C(ku)K=A z%LhxJbXN}uNmv@CAsl.Yv7c?d~V56nC`aF1sE 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 Nc*fmT>sPiJTI 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