cjson
.github
workflows CI.yml ci-fuzz.yml
CONTRIBUTING.md
fuzzing
inputs test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9
.gitignore CMakeLists.txt afl-prepare-linux.sh afl.c afl.sh cjson_read_fuzzer.c fuzz_main.c json.dict ossfuzz.sh
library_config cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmake
tests
inputs test1 test1.expected test10 test10.expected test11 test11.expected test2 test2.expected test3 test3.expected test4 test4.expected test5 test5.expected test6 test7 test7.expected test8 test8.expected test9 test9.expected
json-patch-tests .editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.json
unity
auto colour_prompt.rb colour_reporter.rb generate_config.yml generate_module.rb generate_test_runner.rb parse_output.rb stylize_as_junit.rb test_file_filter.rb type_sanitizer.rb unity_test_summary.py unity_test_summary.rb unity_to_junit.py
docs ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txt
examples
example_1
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_2
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_3
helper UnityHelper.c UnityHelper.h
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
rakefile.rb rakefile_helper.rb readme.txt target_gcc_32.yml
unity_config.h
extras
eclipse error_parsers.txt
fixture
src unity_fixture.c unity_fixture.h unity_fixture_internals.h unity_fixture_malloc_overrides.h
rakefile.rb rakefile_helper.rb readme.txt
release build.info version.info
src unity.c unity.h unity_internals.h
.gitattributes .gitignore .travis.yml README.md
CMakeLists.txt cjson_add.c common.h compare_tests.c json_patch_tests.c minify_tests.c misc_tests.c misc_utils_tests.c old_utils_tests.c parse_array.c parse_examples.c parse_hex4.c parse_number.c parse_object.c parse_string.c parse_value.c parse_with_opts.c print_array.c print_number.c print_object.c print_string.c print_value.c readme_examples.c unity_setup.c
.editorconfig .gitattributes .gitignore .travis.yml CHANGELOG.md CMakeLists.txt CONTRIBUTORS.md LICENSE Makefile README.md SECURITY.md appveyor.yml cJSON.c cJSON.h cJSON_Utils.c cJSON_Utils.h test.c valgrind.supp
curl
.circleci config.yml
.github
ISSUE_TEMPLATE bug_report.yml config.yml docs.yml
scripts cleancmd.pl cmp-config.pl cmp-pkg-config.sh codespell-ignore.words codespell.sh distfiles.sh pyspelling.words pyspelling.yaml randcurl.pl requirements-docs.txt requirements-proselint.txt requirements.txt shellcheck-ci.sh shellcheck.sh spellcheck.curl trimmarkdownheader.pl typos.sh typos.toml verify-examples.pl verify-synopsis.pl yamlcheck.sh yamlcheck.yaml
workflows appveyor-status.yml checkdocs.yml checksrc.yml checkurls.yml codeql.yml configure-vs-cmake.yml curl-for-win.yml distcheck.yml fuzz.yml http3-linux.yml label.yml linux-old.yml linux.yml macos.yml non-native.yml windows.yml
CODEOWNERS CONTRIBUTING.md FUNDING.yml dependabot.yml labeler.yml lock.yml stale.yml
CMake CurlSymbolHiding.cmake CurlTests.c FindBrotli.cmake FindCares.cmake FindGSS.cmake FindGnuTLS.cmake FindLDAP.cmake FindLibbacktrace.cmake FindLibgsasl.cmake FindLibidn2.cmake FindLibpsl.cmake FindLibssh.cmake FindLibssh2.cmake FindLibuv.cmake FindMbedTLS.cmake FindNGHTTP2.cmake FindNGHTTP3.cmake FindNGTCP2.cmake FindNettle.cmake FindQuiche.cmake FindRustls.cmake FindWolfSSL.cmake FindZstd.cmake Macros.cmake OtherTests.cmake PickyWarnings.cmake Utilities.cmake cmake_uninstall.in.cmake curl-config.in.cmake unix-cache.cmake win32-cache.cmake
LICENSES BSD-4-Clause-UC.txt ISC.txt curl.txt
docs
cmdline-opts .gitignore CMakeLists.txt MANPAGE.md Makefile.am Makefile.inc _AUTHORS.md _BUGS.md _DESCRIPTION.md _ENVIRONMENT.md _EXITCODES.md _FILES.md _GLOBBING.md _NAME.md _OPTIONS.md _OUTPUT.md _PROGRESS.md _PROTOCOLS.md _PROXYPREFIX.md _SEEALSO.md _SYNOPSIS.md _URL.md _VARIABLES.md _VERSION.md _WWW.md abstract-unix-socket.md alt-svc.md anyauth.md append.md aws-sigv4.md basic.md ca-native.md cacert.md capath.md cert-status.md cert-type.md cert.md ciphers.md compressed-ssh.md compressed.md config.md connect-timeout.md connect-to.md continue-at.md cookie-jar.md cookie.md create-dirs.md create-file-mode.md crlf.md crlfile.md curves.md data-ascii.md data-binary.md data-raw.md data-urlencode.md data.md delegation.md digest.md disable-eprt.md disable-epsv.md disable.md disallow-username-in-url.md dns-interface.md dns-ipv4-addr.md dns-ipv6-addr.md dns-servers.md doh-cert-status.md doh-insecure.md doh-url.md dump-ca-embed.md dump-header.md ech.md egd-file.md engine.md etag-compare.md etag-save.md expect100-timeout.md fail-early.md fail-with-body.md fail.md false-start.md follow.md form-escape.md form-string.md form.md ftp-account.md ftp-alternative-to-user.md ftp-create-dirs.md ftp-method.md ftp-pasv.md ftp-port.md ftp-pret.md ftp-skip-pasv-ip.md ftp-ssl-ccc-mode.md ftp-ssl-ccc.md ftp-ssl-control.md get.md globoff.md happy-eyeballs-timeout-ms.md haproxy-clientip.md haproxy-protocol.md head.md header.md help.md hostpubmd5.md hostpubsha256.md hsts.md http0.9.md http1.0.md http1.1.md http2-prior-knowledge.md http2.md http3-only.md http3.md ignore-content-length.md insecure.md interface.md ip-tos.md ipfs-gateway.md ipv4.md ipv6.md json.md junk-session-cookies.md keepalive-cnt.md keepalive-time.md key-type.md key.md knownhosts.md krb.md libcurl.md limit-rate.md list-only.md local-port.md location-trusted.md location.md login-options.md mail-auth.md mail-from.md mail-rcpt-allowfails.md mail-rcpt.md mainpage.idx manual.md max-filesize.md max-redirs.md max-time.md metalink.md mptcp.md negotiate.md netrc-file.md netrc-optional.md netrc.md next.md no-alpn.md no-buffer.md no-clobber.md no-keepalive.md no-npn.md no-progress-meter.md no-sessionid.md noproxy.md ntlm-wb.md ntlm.md oauth2-bearer.md out-null.md output-dir.md output.md parallel-immediate.md parallel-max-host.md parallel-max.md parallel.md pass.md path-as-is.md pinnedpubkey.md post301.md post302.md post303.md preproxy.md progress-bar.md proto-default.md proto-redir.md proto.md proxy-anyauth.md proxy-basic.md proxy-ca-native.md proxy-cacert.md proxy-capath.md proxy-cert-type.md proxy-cert.md proxy-ciphers.md proxy-crlfile.md proxy-digest.md proxy-header.md proxy-http2.md proxy-insecure.md proxy-key-type.md proxy-key.md proxy-negotiate.md proxy-ntlm.md proxy-pass.md proxy-pinnedpubkey.md proxy-service-name.md proxy-ssl-allow-beast.md proxy-ssl-auto-client-cert.md proxy-tls13-ciphers.md proxy-tlsauthtype.md proxy-tlspassword.md proxy-tlsuser.md proxy-tlsv1.md proxy-user.md proxy.md proxy1.0.md proxytunnel.md pubkey.md quote.md random-file.md range.md rate.md raw.md referer.md remote-header-name.md remote-name-all.md remote-name.md remote-time.md remove-on-error.md request-target.md request.md resolve.md retry-all-errors.md retry-connrefused.md retry-delay.md retry-max-time.md retry.md sasl-authzid.md sasl-ir.md service-name.md show-error.md show-headers.md sigalgs.md silent.md skip-existing.md socks4.md socks4a.md socks5-basic.md socks5-gssapi-nec.md socks5-gssapi-service.md socks5-gssapi.md socks5-hostname.md socks5.md speed-limit.md speed-time.md ssl-allow-beast.md ssl-auto-client-cert.md ssl-no-revoke.md ssl-reqd.md ssl-revoke-best-effort.md ssl-sessions.md ssl.md sslv2.md sslv3.md stderr.md styled-output.md suppress-connect-headers.md tcp-fastopen.md tcp-nodelay.md telnet-option.md tftp-blksize.md tftp-no-options.md time-cond.md tls-earlydata.md tls-max.md tls13-ciphers.md tlsauthtype.md tlspassword.md tlsuser.md tlsv1.0.md tlsv1.1.md tlsv1.2.md tlsv1.3.md tlsv1.md tr-encoding.md trace-ascii.md trace-config.md trace-ids.md trace-time.md trace.md unix-socket.md upload-file.md upload-flags.md url-query.md url.md use-ascii.md user-agent.md user.md variable.md verbose.md version.md vlan-priority.md write-out.md xattr.md
examples .checksrc .gitignore 10-at-a-time.c CMakeLists.txt Makefile.am Makefile.example Makefile.inc README.md adddocsref.pl address-scope.c altsvc.c anyauthput.c block_ip.c cacertinmem.c certinfo.c chkspeed.c connect-to.c cookie_interface.c crawler.c debug.c default-scheme.c ephiperfifo.c evhiperfifo.c externalsocket.c fileupload.c ftp-delete.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c getinfo.c getinmemory.c getredirect.c getreferrer.c ghiper.c headerapi.c hiperfifo.c hsts-preload.c htmltidy.c htmltitle.cpp http-options.c http-post.c http2-download.c http2-pushinmemory.c http2-serverpush.c http2-upload.c http3-present.c http3.c httpcustomheader.c httpput-postfields.c httpput.c https.c imap-append.c imap-authzid.c imap-copy.c imap-create.c imap-delete.c imap-examine.c imap-fetch.c imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c imap-tls.c interface.c ipv6.c keepalive.c localport.c log_failed_transfers.c maxconnects.c multi-app.c multi-debugcallback.c multi-double.c multi-event.c multi-formadd.c multi-legacy.c multi-post.c multi-single.c multi-uv.c netrc.c parseurl.c persistent.c pop3-authzid.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c postinmemory.c postit2-formadd.c postit2.c progressfunc.c protofeats.c range.c resolve.c rtsp-options.c sendrecv.c sepheaders.c sessioninfo.c sftpget.c sftpuploadresume.c shared-connection-cache.c simple.c simplepost.c simplessl.c smooth-gtk-thread.c smtp-authzid.c smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c smtp-vrfy.c sslbackend.c synctime.c threaded.c unixsocket.c url2file.c urlapi.c usercertinmem.c version-check.pl websocket-cb.c websocket-updown.c websocket.c xmlstream.c
internals BUFQ.md BUFREF.md CHECKSRC.md CLIENT-READERS.md CLIENT-WRITERS.md CODE_STYLE.md CONNECTION-FILTERS.md CREDENTIALS.md CURLX.md DYNBUF.md HASH.md LLIST.md MID.md MQTT.md MULTI-EV.md NEW-PROTOCOL.md PEERS.md PORTING.md RATELIMITS.md README.md SCORECARD.md SPLAY.md STRPARSE.md THRDPOOL-AND-QUEUE.md TIME-KEEPING.md TLS-SESSIONS.md UINT_SETS.md WEBSOCKET.md
libcurl
opts CMakeLists.txt CURLINFO_ACTIVESOCKET.md CURLINFO_APPCONNECT_TIME.md CURLINFO_APPCONNECT_TIME_T.md CURLINFO_CAINFO.md CURLINFO_CAPATH.md CURLINFO_CERTINFO.md CURLINFO_CONDITION_UNMET.md CURLINFO_CONNECT_TIME.md CURLINFO_CONNECT_TIME_T.md CURLINFO_CONN_ID.md CURLINFO_CONTENT_LENGTH_DOWNLOAD.md CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.md CURLINFO_CONTENT_LENGTH_UPLOAD.md CURLINFO_CONTENT_LENGTH_UPLOAD_T.md CURLINFO_CONTENT_TYPE.md CURLINFO_COOKIELIST.md CURLINFO_EARLYDATA_SENT_T.md CURLINFO_EFFECTIVE_METHOD.md CURLINFO_EFFECTIVE_URL.md CURLINFO_FILETIME.md CURLINFO_FILETIME_T.md CURLINFO_FTP_ENTRY_PATH.md CURLINFO_HEADER_SIZE.md CURLINFO_HTTPAUTH_AVAIL.md CURLINFO_HTTPAUTH_USED.md CURLINFO_HTTP_CONNECTCODE.md CURLINFO_HTTP_VERSION.md CURLINFO_LASTSOCKET.md CURLINFO_LOCAL_IP.md CURLINFO_LOCAL_PORT.md CURLINFO_NAMELOOKUP_TIME.md CURLINFO_NAMELOOKUP_TIME_T.md CURLINFO_NUM_CONNECTS.md CURLINFO_OS_ERRNO.md CURLINFO_POSTTRANSFER_TIME_T.md CURLINFO_PRETRANSFER_TIME.md CURLINFO_PRETRANSFER_TIME_T.md CURLINFO_PRIMARY_IP.md CURLINFO_PRIMARY_PORT.md CURLINFO_PRIVATE.md CURLINFO_PROTOCOL.md CURLINFO_PROXYAUTH_AVAIL.md CURLINFO_PROXYAUTH_USED.md CURLINFO_PROXY_ERROR.md CURLINFO_PROXY_SSL_VERIFYRESULT.md CURLINFO_QUEUE_TIME_T.md CURLINFO_REDIRECT_COUNT.md CURLINFO_REDIRECT_TIME.md CURLINFO_REDIRECT_TIME_T.md CURLINFO_REDIRECT_URL.md CURLINFO_REFERER.md CURLINFO_REQUEST_SIZE.md CURLINFO_RESPONSE_CODE.md CURLINFO_RETRY_AFTER.md CURLINFO_RTSP_CLIENT_CSEQ.md CURLINFO_RTSP_CSEQ_RECV.md CURLINFO_RTSP_SERVER_CSEQ.md CURLINFO_RTSP_SESSION_ID.md CURLINFO_SCHEME.md CURLINFO_SIZE_DELIVERED.md CURLINFO_SIZE_DOWNLOAD.md CURLINFO_SIZE_DOWNLOAD_T.md CURLINFO_SIZE_UPLOAD.md CURLINFO_SIZE_UPLOAD_T.md CURLINFO_SPEED_DOWNLOAD.md CURLINFO_SPEED_DOWNLOAD_T.md CURLINFO_SPEED_UPLOAD.md CURLINFO_SPEED_UPLOAD_T.md CURLINFO_SSL_ENGINES.md CURLINFO_SSL_VERIFYRESULT.md CURLINFO_STARTTRANSFER_TIME.md CURLINFO_STARTTRANSFER_TIME_T.md CURLINFO_TLS_SESSION.md CURLINFO_TLS_SSL_PTR.md CURLINFO_TOTAL_TIME.md CURLINFO_TOTAL_TIME_T.md CURLINFO_USED_PROXY.md CURLINFO_XFER_ID.md CURLMINFO_XFERS_ADDED.md CURLMINFO_XFERS_CURRENT.md CURLMINFO_XFERS_DONE.md CURLMINFO_XFERS_PENDING.md CURLMINFO_XFERS_RUNNING.md CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.md CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.md CURLMOPT_MAXCONNECTS.md CURLMOPT_MAX_CONCURRENT_STREAMS.md CURLMOPT_MAX_HOST_CONNECTIONS.md CURLMOPT_MAX_PIPELINE_LENGTH.md CURLMOPT_MAX_TOTAL_CONNECTIONS.md CURLMOPT_NETWORK_CHANGED.md CURLMOPT_NOTIFYDATA.md CURLMOPT_NOTIFYFUNCTION.md CURLMOPT_PIPELINING.md CURLMOPT_PIPELINING_SERVER_BL.md CURLMOPT_PIPELINING_SITE_BL.md CURLMOPT_PUSHDATA.md CURLMOPT_PUSHFUNCTION.md CURLMOPT_QUICK_EXIT.md CURLMOPT_RESOLVE_THREADS_MAX.md CURLMOPT_SOCKETDATA.md CURLMOPT_SOCKETFUNCTION.md CURLMOPT_TIMERDATA.md CURLMOPT_TIMERFUNCTION.md CURLOPT_ABSTRACT_UNIX_SOCKET.md CURLOPT_ACCEPTTIMEOUT_MS.md CURLOPT_ACCEPT_ENCODING.md CURLOPT_ADDRESS_SCOPE.md CURLOPT_ALTSVC.md CURLOPT_ALTSVC_CTRL.md CURLOPT_APPEND.md CURLOPT_AUTOREFERER.md CURLOPT_AWS_SIGV4.md CURLOPT_BUFFERSIZE.md CURLOPT_CAINFO.md CURLOPT_CAINFO_BLOB.md CURLOPT_CAPATH.md CURLOPT_CA_CACHE_TIMEOUT.md CURLOPT_CERTINFO.md CURLOPT_CHUNK_BGN_FUNCTION.md CURLOPT_CHUNK_DATA.md CURLOPT_CHUNK_END_FUNCTION.md CURLOPT_CLOSESOCKETDATA.md CURLOPT_CLOSESOCKETFUNCTION.md CURLOPT_CONNECTTIMEOUT.md CURLOPT_CONNECTTIMEOUT_MS.md CURLOPT_CONNECT_ONLY.md CURLOPT_CONNECT_TO.md CURLOPT_CONV_FROM_NETWORK_FUNCTION.md CURLOPT_CONV_FROM_UTF8_FUNCTION.md CURLOPT_CONV_TO_NETWORK_FUNCTION.md CURLOPT_COOKIE.md CURLOPT_COOKIEFILE.md CURLOPT_COOKIEJAR.md CURLOPT_COOKIELIST.md CURLOPT_COOKIESESSION.md CURLOPT_COPYPOSTFIELDS.md CURLOPT_CRLF.md CURLOPT_CRLFILE.md CURLOPT_CURLU.md CURLOPT_CUSTOMREQUEST.md CURLOPT_DEBUGDATA.md CURLOPT_DEBUGFUNCTION.md CURLOPT_DEFAULT_PROTOCOL.md CURLOPT_DIRLISTONLY.md CURLOPT_DISALLOW_USERNAME_IN_URL.md CURLOPT_DNS_CACHE_TIMEOUT.md CURLOPT_DNS_INTERFACE.md CURLOPT_DNS_LOCAL_IP4.md CURLOPT_DNS_LOCAL_IP6.md CURLOPT_DNS_SERVERS.md CURLOPT_DNS_SHUFFLE_ADDRESSES.md CURLOPT_DNS_USE_GLOBAL_CACHE.md CURLOPT_DOH_SSL_VERIFYHOST.md CURLOPT_DOH_SSL_VERIFYPEER.md CURLOPT_DOH_SSL_VERIFYSTATUS.md CURLOPT_DOH_URL.md CURLOPT_ECH.md CURLOPT_EGDSOCKET.md CURLOPT_ERRORBUFFER.md CURLOPT_EXPECT_100_TIMEOUT_MS.md CURLOPT_FAILONERROR.md CURLOPT_FILETIME.md CURLOPT_FNMATCH_DATA.md CURLOPT_FNMATCH_FUNCTION.md CURLOPT_FOLLOWLOCATION.md CURLOPT_FORBID_REUSE.md CURLOPT_FRESH_CONNECT.md CURLOPT_FTPPORT.md CURLOPT_FTPSSLAUTH.md CURLOPT_FTP_ACCOUNT.md CURLOPT_FTP_ALTERNATIVE_TO_USER.md CURLOPT_FTP_CREATE_MISSING_DIRS.md CURLOPT_FTP_FILEMETHOD.md CURLOPT_FTP_SKIP_PASV_IP.md CURLOPT_FTP_SSL_CCC.md CURLOPT_FTP_USE_EPRT.md CURLOPT_FTP_USE_EPSV.md CURLOPT_FTP_USE_PRET.md CURLOPT_GSSAPI_DELEGATION.md CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.md CURLOPT_HAPROXYPROTOCOL.md CURLOPT_HAPROXY_CLIENT_IP.md CURLOPT_HEADER.md CURLOPT_HEADERDATA.md CURLOPT_HEADERFUNCTION.md CURLOPT_HEADEROPT.md CURLOPT_HSTS.md CURLOPT_HSTSREADDATA.md CURLOPT_HSTSREADFUNCTION.md CURLOPT_HSTSWRITEDATA.md CURLOPT_HSTSWRITEFUNCTION.md CURLOPT_HSTS_CTRL.md CURLOPT_HTTP09_ALLOWED.md CURLOPT_HTTP200ALIASES.md CURLOPT_HTTPAUTH.md CURLOPT_HTTPGET.md CURLOPT_HTTPHEADER.md CURLOPT_HTTPPOST.md CURLOPT_HTTPPROXYTUNNEL.md CURLOPT_HTTP_CONTENT_DECODING.md CURLOPT_HTTP_TRANSFER_DECODING.md CURLOPT_HTTP_VERSION.md CURLOPT_IGNORE_CONTENT_LENGTH.md CURLOPT_INFILESIZE.md CURLOPT_INFILESIZE_LARGE.md CURLOPT_INTERFACE.md CURLOPT_INTERLEAVEDATA.md CURLOPT_INTERLEAVEFUNCTION.md CURLOPT_IOCTLDATA.md CURLOPT_IOCTLFUNCTION.md CURLOPT_IPRESOLVE.md CURLOPT_ISSUERCERT.md CURLOPT_ISSUERCERT_BLOB.md CURLOPT_KEEP_SENDING_ON_ERROR.md CURLOPT_KEYPASSWD.md CURLOPT_KRBLEVEL.md CURLOPT_LOCALPORT.md CURLOPT_LOCALPORTRANGE.md CURLOPT_LOGIN_OPTIONS.md CURLOPT_LOW_SPEED_LIMIT.md CURLOPT_LOW_SPEED_TIME.md CURLOPT_MAIL_AUTH.md CURLOPT_MAIL_FROM.md CURLOPT_MAIL_RCPT.md CURLOPT_MAIL_RCPT_ALLOWFAILS.md CURLOPT_MAXAGE_CONN.md CURLOPT_MAXCONNECTS.md CURLOPT_MAXFILESIZE.md CURLOPT_MAXFILESIZE_LARGE.md CURLOPT_MAXLIFETIME_CONN.md CURLOPT_MAXREDIRS.md CURLOPT_MAX_RECV_SPEED_LARGE.md CURLOPT_MAX_SEND_SPEED_LARGE.md CURLOPT_MIMEPOST.md CURLOPT_MIME_OPTIONS.md CURLOPT_NETRC.md CURLOPT_NETRC_FILE.md CURLOPT_NEW_DIRECTORY_PERMS.md CURLOPT_NEW_FILE_PERMS.md CURLOPT_NOBODY.md CURLOPT_NOPROGRESS.md CURLOPT_NOPROXY.md CURLOPT_NOSIGNAL.md CURLOPT_OPENSOCKETDATA.md CURLOPT_OPENSOCKETFUNCTION.md CURLOPT_PASSWORD.md CURLOPT_PATH_AS_IS.md CURLOPT_PINNEDPUBLICKEY.md CURLOPT_PIPEWAIT.md CURLOPT_PORT.md CURLOPT_POST.md CURLOPT_POSTFIELDS.md CURLOPT_POSTFIELDSIZE.md CURLOPT_POSTFIELDSIZE_LARGE.md CURLOPT_POSTQUOTE.md CURLOPT_POSTREDIR.md CURLOPT_PREQUOTE.md CURLOPT_PREREQDATA.md CURLOPT_PREREQFUNCTION.md CURLOPT_PRE_PROXY.md CURLOPT_PRIVATE.md CURLOPT_PROGRESSDATA.md CURLOPT_PROGRESSFUNCTION.md CURLOPT_PROTOCOLS.md CURLOPT_PROTOCOLS_STR.md CURLOPT_PROXY.md CURLOPT_PROXYAUTH.md CURLOPT_PROXYHEADER.md CURLOPT_PROXYPASSWORD.md CURLOPT_PROXYPORT.md CURLOPT_PROXYTYPE.md CURLOPT_PROXYUSERNAME.md CURLOPT_PROXYUSERPWD.md CURLOPT_PROXY_CAINFO.md CURLOPT_PROXY_CAINFO_BLOB.md CURLOPT_PROXY_CAPATH.md CURLOPT_PROXY_CRLFILE.md CURLOPT_PROXY_ISSUERCERT.md CURLOPT_PROXY_ISSUERCERT_BLOB.md CURLOPT_PROXY_KEYPASSWD.md CURLOPT_PROXY_PINNEDPUBLICKEY.md CURLOPT_PROXY_SERVICE_NAME.md CURLOPT_PROXY_SSLCERT.md CURLOPT_PROXY_SSLCERTTYPE.md CURLOPT_PROXY_SSLCERT_BLOB.md CURLOPT_PROXY_SSLKEY.md CURLOPT_PROXY_SSLKEYTYPE.md CURLOPT_PROXY_SSLKEY_BLOB.md CURLOPT_PROXY_SSLVERSION.md CURLOPT_PROXY_SSL_CIPHER_LIST.md CURLOPT_PROXY_SSL_OPTIONS.md CURLOPT_PROXY_SSL_VERIFYHOST.md CURLOPT_PROXY_SSL_VERIFYPEER.md CURLOPT_PROXY_TLS13_CIPHERS.md CURLOPT_PROXY_TLSAUTH_PASSWORD.md CURLOPT_PROXY_TLSAUTH_TYPE.md CURLOPT_PROXY_TLSAUTH_USERNAME.md CURLOPT_PROXY_TRANSFER_MODE.md CURLOPT_PUT.md CURLOPT_QUICK_EXIT.md CURLOPT_QUOTE.md CURLOPT_RANDOM_FILE.md CURLOPT_RANGE.md CURLOPT_READDATA.md CURLOPT_READFUNCTION.md CURLOPT_REDIR_PROTOCOLS.md CURLOPT_REDIR_PROTOCOLS_STR.md CURLOPT_REFERER.md CURLOPT_REQUEST_TARGET.md CURLOPT_RESOLVE.md CURLOPT_RESOLVER_START_DATA.md CURLOPT_RESOLVER_START_FUNCTION.md CURLOPT_RESUME_FROM.md CURLOPT_RESUME_FROM_LARGE.md CURLOPT_RTSP_CLIENT_CSEQ.md CURLOPT_RTSP_REQUEST.md CURLOPT_RTSP_SERVER_CSEQ.md CURLOPT_RTSP_SESSION_ID.md CURLOPT_RTSP_STREAM_URI.md CURLOPT_RTSP_TRANSPORT.md CURLOPT_SASL_AUTHZID.md CURLOPT_SASL_IR.md CURLOPT_SEEKDATA.md CURLOPT_SEEKFUNCTION.md CURLOPT_SERVER_RESPONSE_TIMEOUT.md CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.md CURLOPT_SERVICE_NAME.md CURLOPT_SHARE.md CURLOPT_SOCKOPTDATA.md CURLOPT_SOCKOPTFUNCTION.md CURLOPT_SOCKS5_AUTH.md CURLOPT_SOCKS5_GSSAPI_NEC.md CURLOPT_SOCKS5_GSSAPI_SERVICE.md CURLOPT_SSH_AUTH_TYPES.md CURLOPT_SSH_COMPRESSION.md CURLOPT_SSH_HOSTKEYDATA.md CURLOPT_SSH_HOSTKEYFUNCTION.md CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.md CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256.md CURLOPT_SSH_KEYDATA.md CURLOPT_SSH_KEYFUNCTION.md CURLOPT_SSH_KNOWNHOSTS.md CURLOPT_SSH_PRIVATE_KEYFILE.md CURLOPT_SSH_PUBLIC_KEYFILE.md CURLOPT_SSLCERT.md CURLOPT_SSLCERTTYPE.md CURLOPT_SSLCERT_BLOB.md CURLOPT_SSLENGINE.md CURLOPT_SSLENGINE_DEFAULT.md CURLOPT_SSLKEY.md CURLOPT_SSLKEYTYPE.md CURLOPT_SSLKEY_BLOB.md CURLOPT_SSLVERSION.md CURLOPT_SSL_CIPHER_LIST.md CURLOPT_SSL_CTX_DATA.md CURLOPT_SSL_CTX_FUNCTION.md CURLOPT_SSL_EC_CURVES.md CURLOPT_SSL_ENABLE_ALPN.md CURLOPT_SSL_ENABLE_NPN.md CURLOPT_SSL_FALSESTART.md CURLOPT_SSL_OPTIONS.md CURLOPT_SSL_SESSIONID_CACHE.md CURLOPT_SSL_SIGNATURE_ALGORITHMS.md CURLOPT_SSL_VERIFYHOST.md CURLOPT_SSL_VERIFYPEER.md CURLOPT_SSL_VERIFYSTATUS.md CURLOPT_STDERR.md CURLOPT_STREAM_DEPENDS.md CURLOPT_STREAM_DEPENDS_E.md CURLOPT_STREAM_WEIGHT.md CURLOPT_SUPPRESS_CONNECT_HEADERS.md CURLOPT_TCP_FASTOPEN.md CURLOPT_TCP_KEEPALIVE.md CURLOPT_TCP_KEEPCNT.md CURLOPT_TCP_KEEPIDLE.md CURLOPT_TCP_KEEPINTVL.md CURLOPT_TCP_NODELAY.md CURLOPT_TELNETOPTIONS.md CURLOPT_TFTP_BLKSIZE.md CURLOPT_TFTP_NO_OPTIONS.md CURLOPT_TIMECONDITION.md CURLOPT_TIMEOUT.md CURLOPT_TIMEOUT_MS.md CURLOPT_TIMEVALUE.md CURLOPT_TIMEVALUE_LARGE.md CURLOPT_TLS13_CIPHERS.md CURLOPT_TLSAUTH_PASSWORD.md CURLOPT_TLSAUTH_TYPE.md CURLOPT_TLSAUTH_USERNAME.md CURLOPT_TRAILERDATA.md CURLOPT_TRAILERFUNCTION.md CURLOPT_TRANSFERTEXT.md CURLOPT_TRANSFER_ENCODING.md CURLOPT_UNIX_SOCKET_PATH.md CURLOPT_UNRESTRICTED_AUTH.md CURLOPT_UPKEEP_INTERVAL_MS.md CURLOPT_UPLOAD.md CURLOPT_UPLOAD_BUFFERSIZE.md CURLOPT_UPLOAD_FLAGS.md CURLOPT_URL.md CURLOPT_USERAGENT.md CURLOPT_USERNAME.md CURLOPT_USERPWD.md CURLOPT_USE_SSL.md CURLOPT_VERBOSE.md CURLOPT_WILDCARDMATCH.md CURLOPT_WRITEDATA.md CURLOPT_WRITEFUNCTION.md CURLOPT_WS_OPTIONS.md CURLOPT_XFERINFODATA.md CURLOPT_XFERINFOFUNCTION.md CURLOPT_XOAUTH2_BEARER.md CURLSHOPT_LOCKFUNC.md CURLSHOPT_SHARE.md CURLSHOPT_UNLOCKFUNC.md CURLSHOPT_UNSHARE.md CURLSHOPT_USERDATA.md Makefile.am Makefile.inc
.gitignore ABI.md CMakeLists.txt Makefile.am Makefile.inc curl_easy_cleanup.md curl_easy_duphandle.md curl_easy_escape.md curl_easy_getinfo.md curl_easy_header.md curl_easy_init.md curl_easy_nextheader.md curl_easy_option_by_id.md curl_easy_option_by_name.md curl_easy_option_next.md curl_easy_pause.md curl_easy_perform.md curl_easy_recv.md curl_easy_reset.md curl_easy_send.md curl_easy_setopt.md curl_easy_ssls_export.md curl_easy_ssls_import.md curl_easy_strerror.md curl_easy_unescape.md curl_easy_upkeep.md curl_escape.md curl_formadd.md curl_formfree.md curl_formget.md curl_free.md curl_getdate.md curl_getenv.md curl_global_cleanup.md curl_global_init.md curl_global_init_mem.md curl_global_sslset.md curl_global_trace.md curl_mime_addpart.md curl_mime_data.md curl_mime_data_cb.md curl_mime_encoder.md curl_mime_filedata.md curl_mime_filename.md curl_mime_free.md curl_mime_headers.md curl_mime_init.md curl_mime_name.md curl_mime_subparts.md curl_mime_type.md curl_mprintf.md curl_multi_add_handle.md curl_multi_assign.md curl_multi_cleanup.md curl_multi_fdset.md curl_multi_get_handles.md curl_multi_get_offt.md curl_multi_info_read.md curl_multi_init.md curl_multi_notify_disable.md curl_multi_notify_enable.md curl_multi_perform.md curl_multi_poll.md curl_multi_remove_handle.md curl_multi_setopt.md curl_multi_socket.md curl_multi_socket_action.md curl_multi_socket_all.md curl_multi_strerror.md curl_multi_timeout.md curl_multi_wait.md curl_multi_waitfds.md curl_multi_wakeup.md curl_pushheader_byname.md curl_pushheader_bynum.md curl_share_cleanup.md curl_share_init.md curl_share_setopt.md curl_share_strerror.md curl_slist_append.md curl_slist_free_all.md curl_strequal.md curl_strnequal.md curl_unescape.md curl_url.md curl_url_cleanup.md curl_url_dup.md curl_url_get.md curl_url_set.md curl_url_strerror.md curl_version.md curl_version_info.md curl_ws_meta.md curl_ws_recv.md curl_ws_send.md curl_ws_start_frame.md libcurl-easy.md libcurl-env-dbg.md libcurl-env.md libcurl-errors.md libcurl-multi.md libcurl-security.md libcurl-share.md libcurl-thread.md libcurl-tutorial.md libcurl-url.md libcurl-ws.md libcurl.m4 libcurl.md mksymbolsmanpage.pl symbols-in-versions symbols.pl
tests CI.md FILEFORMAT.md HTTP.md TEST-SUITE.md
.gitignore ALTSVC.md BINDINGS.md BUG-BOUNTY.md BUGS.md CIPHERS-TLS12.md CIPHERS.md CMakeLists.txt CODE_OF_CONDUCT.md CODE_REVIEW.md CONTRIBUTE.md CURL-DISABLE.md CURLDOWN.md DEPRECATE.md DISTROS.md EARLY-RELEASE.md ECH.md EXPERIMENTAL.md FAQ.md FEATURES.md GOVERNANCE.md HELP-US.md HISTORY.md HSTS.md HTTP-COOKIES.md HTTP3.md HTTPSRR.md INFRASTRUCTURE.md INSTALL-CMAKE.md INSTALL.md INTERNALS.md IPFS.md KNOWN_BUGS.md KNOWN_RISKS.md MAIL-ETIQUETTE.md MANUAL.md Makefile.am README.md RELEASE-PROCEDURE.md ROADMAP.md RUSTLS.md SECURITY-ADVISORY.md SPONSORS.md SSL-PROBLEMS.md SSLCERTS.md THANKS THANKS-filter TODO.md TheArtOfHttpScripting.md URL-SYNTAX.md VERIFY.md VERSIONS.md VULN-DISCLOSURE-POLICY.md curl-config.md mk-ca-bundle.md options-in-versions runtests.md testcurl.md wcurl.md
include
curl Makefile.am curl.h curlver.h easy.h header.h mprintf.h multi.h options.h stdcheaders.h system.h typecheck-gcc.h urlapi.h websockets.h
Makefile.am README.md
lib
curlx base64.c base64.h basename.c basename.h dynbuf.c dynbuf.h fopen.c fopen.h inet_ntop.c inet_ntop.h inet_pton.c inet_pton.h multibyte.c multibyte.h nonblock.c nonblock.h snprintf.c snprintf.h strcopy.c strcopy.h strdup.c strdup.h strerr.c strerr.h strparse.c strparse.h timediff.c timediff.h timeval.c timeval.h version_win32.c version_win32.h wait.c wait.h warnless.c warnless.h winapi.c winapi.h
vauth cleartext.c cram.c digest.c digest.h digest_sspi.c gsasl.c krb5_gssapi.c krb5_sspi.c ntlm.c ntlm_sspi.c oauth2.c spnego_gssapi.c spnego_sspi.c vauth.c vauth.h
vquic curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.h
vssh libssh.c libssh2.c ssh.h vssh.c vssh.h
vtls apple.c apple.h cipher_suite.c cipher_suite.h gtls.c gtls.h hostcheck.c hostcheck.h keylog.c keylog.h mbedtls.c mbedtls.h openssl.c openssl.h rustls.c rustls.h schannel.c schannel.h schannel_int.h schannel_verify.c vtls.c vtls.h vtls_int.h vtls_scache.c vtls_scache.h vtls_spack.c vtls_spack.h wolfssl.c wolfssl.h x509asn1.c x509asn1.h
.gitignore CMakeLists.txt Makefile.am Makefile.inc Makefile.soname altsvc.c altsvc.h amigaos.c amigaos.h arpa_telnet.h asyn-ares.c asyn-base.c asyn-thrdd.c asyn.h bufq.c bufq.h bufref.c bufref.h cf-dns.c cf-dns.h cf-h1-proxy.c cf-h1-proxy.h cf-h2-proxy.c cf-h2-proxy.h cf-haproxy.c cf-haproxy.h cf-https-connect.c cf-https-connect.h cf-ip-happy.c cf-ip-happy.h cf-socket.c cf-socket.h cfilters.c cfilters.h config-mac.h config-os400.h config-riscos.h config-win32.h conncache.c conncache.h connect.c connect.h content_encoding.c content_encoding.h cookie.c cookie.h creds.c creds.h cshutdn.c cshutdn.h curl_addrinfo.c curl_addrinfo.h curl_config-cmake.h.in curl_ctype.h curl_endian.c curl_endian.h curl_fnmatch.c curl_fnmatch.h curl_fopen.c curl_fopen.h curl_get_line.c curl_get_line.h curl_gethostname.c curl_gethostname.h curl_gssapi.c curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memrchr.c curl_memrchr.h curl_ntlm_core.c curl_ntlm_core.h curl_printf.h curl_range.c curl_range.h curl_sasl.c curl_sasl.h curl_setup.h curl_sha256.h curl_sha512_256.c curl_sha512_256.h curl_share.c curl_share.h curl_sspi.c curl_sspi.h curl_threads.c curl_threads.h curl_trc.c curl_trc.h cw-out.c cw-out.h cw-pause.c cw-pause.h dict.c dict.h dllmain.c dnscache.c dnscache.h doh.c doh.h dynhds.c dynhds.h easy.c easy_lock.h easygetopt.c easyif.h easyoptions.c easyoptions.h escape.c escape.h fake_addrinfo.c fake_addrinfo.h file.c file.h fileinfo.c fileinfo.h formdata.c formdata.h ftp-int.h ftp.c ftp.h ftplistparser.c ftplistparser.h functypes.h getenv.c getinfo.c getinfo.h gopher.c gopher.h hash.c hash.h headers.c headers.h hmac.c hostip.c hostip.h hostip4.c hostip6.c hsts.c hsts.h http.c http.h http1.c http1.h http2.c http2.h http_aws_sigv4.c http_aws_sigv4.h http_chunks.c http_chunks.h http_digest.c http_digest.h http_negotiate.c http_negotiate.h http_ntlm.c http_ntlm.h http_proxy.c http_proxy.h httpsrr.c httpsrr.h idn.c idn.h if2ip.c if2ip.h imap.c imap.h ldap.c libcurl.def libcurl.rc libcurl.vers.in llist.c llist.h macos.c macos.h md4.c md5.c memdebug.c mime.c mime.h mprintf.c mqtt.c mqtt.h multi.c multi_ev.c multi_ev.h multi_ntfy.c multi_ntfy.h multihandle.h multiif.h netrc.c netrc.h noproxy.c noproxy.h openldap.c optiontable.pl parsedate.c parsedate.h peer.c peer.h pingpong.c pingpong.h pop3.c pop3.h progress.c progress.h protocol.c protocol.h psl.c psl.h rand.c rand.h ratelimit.c ratelimit.h request.c request.h rtsp.c rtsp.h select.c select.h sendf.c sendf.h setopt.c setopt.h setup-os400.h setup-vms.h setup-win32.h sha256.c sigpipe.h slist.c slist.h smb.c smb.h smtp.c smtp.h sockaddr.h socketpair.c socketpair.h socks.c socks.h socks_gssapi.c socks_sspi.c splay.c splay.h strcase.c strcase.h strequal.c strerror.c strerror.h system_win32.c system_win32.h telnet.c telnet.h tftp.c tftp.h thrdpool.c thrdpool.h thrdqueue.c thrdqueue.h transfer.c transfer.h uint-bset.c uint-bset.h uint-hash.c uint-hash.h uint-spbset.c uint-spbset.h uint-table.c uint-table.h url.c url.h urlapi-int.h urlapi.c urldata.h version.c ws.c ws.h
m4 .gitignore curl-amissl.m4 curl-apple-sectrust.m4 curl-compilers.m4 curl-confopts.m4 curl-functions.m4 curl-gnutls.m4 curl-mbedtls.m4 curl-openssl.m4 curl-override.m4 curl-reentrant.m4 curl-rustls.m4 curl-schannel.m4 curl-sysconfig.m4 curl-wolfssl.m4 xc-am-iface.m4 xc-cc-check.m4 xc-lt-iface.m4 xc-val-flgs.m4 zz40-xc-ovr.m4 zz50-xc-ovr.m4
projects
OS400
rpg-examples HEADERAPI HTTPPOST INMEMORY SIMPLE1 SIMPLE2 SMTPSRCMBR
.checksrc README.OS400 ccsidcurl.c ccsidcurl.h config400.default curl.cmd curl.inc.in curlcl.c curlmain.c initscript.sh make-docs.sh make-include.sh make-lib.sh make-src.sh make-tests.sh makefile.sh os400sys.c os400sys.h
Windows
tmpl .gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filters
.gitignore README.md generate.bat
vms Makefile.am backup_gnv_curl_src.com build_curl-config_script.com build_gnv_curl.com build_gnv_curl_pcsi_desc.com build_gnv_curl_pcsi_text.com build_gnv_curl_release_notes.com build_libcurl_pc.com build_vms.com clean_gnv_curl.com compare_curl_source.com config_h.com curl_crtl_init.c curl_gnv_build_steps.txt curl_release_note_start.txt curl_startup.com curlmsg.h curlmsg.msg curlmsg.sdl curlmsg_vms.h generate_config_vms_h_curl.com generate_vax_transfer.com gnv_conftest.c_first gnv_curl_configure.sh gnv_libcurl_symbols.opt gnv_link_curl.com macro32_exactcase.patch make_gnv_curl_install.sh make_pcsi_curl_kit_name.com pcsi_gnv_curl_file_list.txt pcsi_product_gnv_curl.com readme report_openssl_version.c setup_gnv_curl_build.com stage_curl_install.com vms_eco_level.h
Makefile.am README.md
scripts .checksrc CMakeLists.txt Makefile.am badwords badwords-all badwords.txt cd2cd cd2nroff cdall checksrc-all.pl checksrc.pl cmakelint.sh completion.pl contributors.sh contrithanks.sh coverage.sh delta dmaketgz extract-unit-protos firefox-db2pem.sh installcheck.sh maketgz managen mdlinkcheck mk-ca-bundle.pl mk-unity.pl nroff2cd perlcheck.sh pythonlint.sh randdisable release-notes.pl release-tools.sh schemetable.c singleuse.pl spacecheck.pl top-complexity top-length verify-release wcurl
src
toolx tool_time.c tool_time.h
.checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc config2setopts.c config2setopts.h curl.rc curlinfo.c mk-file-embed.pl mkhelp.pl slist_wc.c slist_wc.h terminal.c terminal.h tool_cb_dbg.c tool_cb_dbg.h tool_cb_hdr.c tool_cb_hdr.h tool_cb_prg.c tool_cb_prg.h tool_cb_rea.c tool_cb_rea.h tool_cb_see.c tool_cb_see.h tool_cb_soc.c tool_cb_soc.h tool_cb_wrt.c tool_cb_wrt.h tool_cfgable.c tool_cfgable.h tool_dirhie.c tool_dirhie.h tool_doswin.c tool_doswin.h tool_easysrc.c tool_easysrc.h tool_filetime.c tool_filetime.h tool_findfile.c tool_findfile.h tool_formparse.c tool_formparse.h tool_getparam.c tool_getparam.h tool_getpass.c tool_getpass.h tool_help.c tool_help.h tool_helpers.c tool_helpers.h tool_hugehelp.h tool_ipfs.c tool_ipfs.h tool_libinfo.c tool_libinfo.h tool_listhelp.c tool_main.c tool_main.h tool_msgs.c tool_msgs.h tool_operate.c tool_operate.h tool_operhlp.c tool_operhlp.h tool_paramhlp.c tool_paramhlp.h tool_parsecfg.c tool_parsecfg.h tool_progress.c tool_progress.h tool_sdecls.h tool_setopt.c tool_setopt.h tool_setup.h tool_ssls.c tool_ssls.h tool_stderr.c tool_stderr.h tool_urlglob.c tool_urlglob.h tool_util.c tool_util.h tool_version.h tool_vms.c tool_vms.h tool_writeout.c tool_writeout.h tool_writeout_json.c tool_writeout_json.h tool_xattr.c tool_xattr.h var.c var.h
tests
certs .gitignore CMakeLists.txt Makefile.am Makefile.inc genserv.pl srp-verifier-conf srp-verifier-db test-ca.cnf test-ca.prm test-client-cert.prm test-client-eku-only.prm test-localhost-san-first.prm test-localhost-san-last.prm test-localhost.nn.prm test-localhost.prm test-localhost0h.prm
cmake CMakeLists.txt test.c test.cpp test.sh
data .gitignore DISABLED Makefile.am data-xml1 data1400.c data1401.c data1402.c data1403.c data1404.c data1405.c data1406.c data1407.c data1420.c data1461.txt data1463.txt data1465.c data1481.c data1705-1.md data1705-2.md data1705-3.md data1705-4.md data1705-stdout.1 data1706-1.md data1706-2.md data1706-3.md data1706-4.md data1706-stdout.txt data320.html test1 test10 test100 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 test1008 test1009 test101 test1010 test1011 test1012 test1013 test1014 test1015 test1016 test1017 test1018 test1019 test102 test1020 test1021 test1022 test1023 test1024 test1025 test1026 test1027 test1028 test1029 test103 test1030 test1031 test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 test104 test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 test1048 test1049 test105 test1050 test1051 test1052 test1053 test1054 test1055 test1056 test1057 test1058 test1059 test106 test1060 test1061 test1062 test1063 test1064 test1065 test1066 test1067 test1068 test1069 test107 test1070 test1071 test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 test108 test1080 test1081 test1082 test1083 test1084 test1085 test1086 test1087 test1088 test1089 test109 test1090 test1091 test1092 test1093 test1094 test1095 test1096 test1097 test1098 test1099 test11 test110 test1100 test1101 test1102 test1103 test1104 test1105 test1106 test1107 test1108 test1109 test111 test1110 test1111 test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 test112 test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 test1128 test1129 test113 test1130 test1131 test1132 test1133 test1134 test1135 test1136 test1137 test1138 test1139 test114 test1140 test1141 test1142 test1143 test1144 test1145 test1146 test1147 test1148 test1149 test115 test1150 test1151 test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 test116 test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 test1168 test1169 test117 test1170 test1171 test1172 test1173 test1174 test1175 test1176 test1177 test1178 test1179 test118 test1180 test1181 test1182 test1183 test1184 test1185 test1186 test1187 test1188 test1189 test119 test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 test1198 test1199 test12 test120 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 test1208 test1209 test121 test1210 test1211 test1212 test1213 test1214 test1215 test1216 test1217 test1218 test1219 test122 test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 test1228 test1229 test123 test1230 test1231 test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 test124 test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 test1248 test1249 test125 test1250 test1251 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 test126 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 test1268 test1269 test127 test1270 test1271 test1272 test1273 test1274 test1275 test1276 test1277 test1278 test1279 test128 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 test1288 test1289 test129 test1290 test1291 test1292 test1293 test1294 test1295 test1296 test1297 test1298 test1299 test13 test130 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 test1308 test1309 test131 test1310 test1311 test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 test132 test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 test1328 test1329 test133 test1330 test1331 test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 test134 test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 test1348 test1349 test135 test1350 test1351 test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 test136 test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 test1368 test1369 test137 test1370 test1371 test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 test138 test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 test1388 test1389 test139 test1390 test1391 test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 test14 test140 test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 test1408 test1409 test141 test1410 test1411 test1412 test1413 test1414 test1415 test1416 test1417 test1418 test1419 test142 test1420 test1421 test1422 test1423 test1424 test1425 test1426 test1427 test1428 test1429 test143 test1430 test1431 test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 test144 test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 test1448 test1449 test145 test1450 test1451 test1452 test1453 test1454 test1455 test1456 test1457 test1458 test1459 test146 test1460 test1461 test1462 test1463 test1464 test1465 test1466 test1467 test1468 test1469 test147 test1470 test1471 test1472 test1473 test1474 test1475 test1476 test1477 test1478 test1479 test148 test1480 test1481 test1482 test1483 test1484 test1485 test1486 test1487 test1488 test1489 test149 test1490 test1491 test1492 test1493 test1494 test1495 test1496 test1497 test1498 test1499 test15 test150 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 test1508 test1509 test151 test1510 test1511 test1512 test1513 test1514 test1515 test1516 test1517 test1518 test1519 test152 test1520 test1521 test1522 test1523 test1524 test1525 test1526 test1527 test1528 test1529 test153 test1530 test1531 test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 test154 test1540 test1541 test1542 test1543 test1544 test1545 test1546 test1547 test1548 test1549 test155 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 test1558 test1559 test156 test1560 test1561 test1562 test1563 test1564 test1565 test1566 test1567 test1568 test1569 test157 test1570 test1571 test1572 test1573 test1574 test1575 test1576 test1577 test1578 test1579 test158 test1580 test1581 test1582 test1583 test1584 test1585 test1586 test1587 test1588 test1589 test159 test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 test1598 test1599 test16 test160 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 test1608 test1609 test161 test1610 test1611 test1612 test1613 test1614 test1615 test1616 test1617 test1618 test1619 test162 test1620 test1621 test1622 test1623 test1624 test1625 test1626 test1627 test1628 test1629 test163 test1630 test1631 test1632 test1633 test1634 test1635 test1636 test1637 test1638 test1639 test164 test1640 test1641 test1642 test1643 test1644 test1645 test165 test1650 test1651 test1652 test1653 test1654 test1655 test1656 test1657 test1658 test1659 test166 test1660 test1661 test1662 test1663 test1664 test1665 test1666 test1667 test1668 test1669 test167 test1670 test1671 test1672 test1673 test1674 test1675 test1676 test168 test1680 test1681 test1682 test1683 test1684 test1685 test169 test17 test170 test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 test1708 test1709 test171 test1710 test1711 test1712 test1713 test1714 test1715 test172 test1720 test1721 test173 test174 test175 test176 test177 test178 test179 test18 test180 test1800 test1801 test1802 test181 test182 test183 test184 test1847 test1848 test1849 test185 test1850 test1851 test186 test187 test188 test189 test19 test190 test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 test1908 test1909 test191 test1910 test1911 test1912 test1913 test1914 test1915 test1916 test1917 test1918 test1919 test192 test1920 test1921 test193 test1933 test1934 test1935 test1936 test1937 test1938 test1939 test194 test1940 test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 test195 test1955 test1956 test1957 test1958 test1959 test196 test1960 test1964 test1965 test1966 test197 test1970 test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 test1979 test198 test1980 test1981 test1982 test1983 test1984 test199 test2 test20 test200 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 test2008 test2009 test201 test2010 test2011 test2012 test2013 test2014 test202 test2023 test2024 test2025 test2026 test2027 test2028 test2029 test203 test2030 test2031 test2032 test2033 test2034 test2035 test2037 test2038 test2039 test204 test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 test2048 test2049 test205 test2050 test2051 test2052 test2053 test2054 test2055 test2056 test2057 test2058 test2059 test206 test2060 test2061 test2062 test2063 test2064 test2065 test2066 test2067 test2068 test2069 test207 test2070 test2071 test2072 test2073 test2074 test2075 test2076 test2077 test2078 test2079 test208 test2080 test2081 test2082 test2083 test2084 test2085 test2086 test2087 test2088 test2089 test209 test2090 test2091 test2092 test21 test210 test2100 test2101 test2102 test2103 test2104 test211 test212 test213 test214 test215 test216 test217 test218 test219 test22 test220 test2200 test2201 test2202 test2203 test2204 test2205 test2206 test2207 test221 test222 test223 test224 test225 test226 test227 test228 test229 test23 test230 test2300 test2301 test2302 test2303 test2304 test2306 test2307 test2308 test2309 test231 test232 test233 test234 test235 test236 test237 test238 test239 test24 test240 test2400 test2401 test2402 test2403 test2404 test2405 test2406 test2407 test2408 test2409 test241 test2410 test2411 test242 test243 test244 test245 test246 test247 test248 test249 test25 test250 test2500 test2501 test2502 test2503 test2504 test2505 test2506 test251 test252 test253 test254 test255 test256 test257 test258 test259 test26 test260 test2600 test2601 test2602 test2603 test2604 test2605 test261 test262 test263 test264 test265 test266 test267 test268 test269 test27 test270 test2700 test2701 test2702 test2703 test2704 test2705 test2706 test2707 test2708 test2709 test271 test2710 test2711 test2712 test2713 test2714 test2715 test2716 test2717 test2718 test2719 test272 test2720 test2721 test2722 test2723 test273 test274 test275 test276 test277 test278 test279 test28 test280 test281 test282 test283 test284 test285 test286 test287 test288 test289 test29 test290 test291 test292 test293 test294 test295 test296 test297 test298 test299 test3 test30 test300 test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 test3008 test3009 test301 test3010 test3011 test3012 test3013 test3014 test3015 test3016 test3017 test3018 test3019 test302 test3020 test3021 test3022 test3023 test3024 test3025 test3026 test3027 test3028 test3029 test303 test3030 test3031 test3032 test3033 test3034 test3035 test3036 test304 test305 test306 test307 test308 test309 test31 test310 test3100 test3101 test3102 test3103 test3104 test3105 test3106 test311 test312 test313 test314 test315 test316 test317 test318 test319 test32 test320 test3200 test3201 test3202 test3203 test3204 test3205 test3206 test3207 test3208 test3209 test321 test3210 test3211 test3212 test3213 test3214 test3215 test3216 test3217 test3218 test3219 test322 test3220 test323 test324 test325 test326 test327 test328 test329 test33 test330 test3300 test3301 test3302 test331 test332 test333 test334 test335 test336 test337 test338 test339 test34 test340 test341 test342 test343 test344 test345 test346 test347 test348 test349 test35 test350 test351 test352 test353 test354 test355 test356 test357 test358 test359 test36 test360 test361 test362 test363 test364 test365 test366 test367 test368 test369 test37 test370 test371 test372 test373 test374 test375 test376 test378 test379 test38 test380 test381 test383 test384 test385 test386 test387 test388 test389 test39 test390 test391 test392 test393 test394 test395 test396 test397 test398 test399 test4 test40 test400 test4000 test4001 test401 test402 test403 test404 test405 test406 test407 test408 test409 test41 test410 test411 test412 test413 test414 test415 test416 test417 test418 test419 test42 test420 test421 test422 test423 test424 test425 test426 test427 test428 test429 test43 test430 test431 test432 test433 test434 test435 test436 test437 test438 test439 test44 test440 test441 test442 test443 test444 test445 test446 test447 test448 test449 test45 test450 test451 test452 test453 test454 test455 test456 test457 test458 test459 test46 test460 test461 test462 test463 test467 test468 test469 test47 test470 test471 test472 test473 test474 test475 test476 test477 test478 test479 test48 test480 test481 test482 test483 test484 test485 test486 test487 test488 test489 test49 test490 test491 test492 test493 test494 test495 test496 test497 test498 test499 test5 test50 test500 test501 test502 test503 test504 test505 test506 test507 test508 test509 test51 test510 test511 test512 test513 test514 test515 test516 test517 test518 test519 test52 test520 test521 test522 test523 test524 test525 test526 test527 test528 test529 test53 test530 test531 test532 test533 test534 test535 test536 test537 test538 test539 test54 test540 test541 test542 test543 test544 test545 test546 test547 test548 test549 test55 test550 test551 test552 test553 test554 test555 test556 test557 test558 test559 test56 test560 test561 test562 test563 test564 test565 test566 test567 test568 test569 test57 test570 test571 test572 test573 test574 test575 test576 test577 test578 test579 test58 test580 test581 test582 test583 test584 test585 test586 test587 test588 test589 test59 test590 test591 test592 test593 test594 test595 test596 test597 test598 test599 test6 test60 test600 test601 test602 test603 test604 test605 test606 test607 test608 test609 test61 test610 test611 test612 test613 test614 test615 test616 test617 test618 test619 test62 test620 test621 test622 test623 test624 test625 test626 test627 test628 test629 test63 test630 test631 test632 test633 test634 test635 test636 test637 test638 test639 test64 test640 test641 test642 test643 test644 test645 test646 test647 test648 test649 test65 test650 test651 test652 test653 test654 test655 test656 test658 test659 test66 test660 test661 test662 test663 test664 test665 test666 test667 test668 test669 test67 test670 test671 test672 test673 test674 test675 test676 test677 test678 test679 test68 test680 test681 test682 test683 test684 test685 test686 test687 test688 test689 test69 test690 test691 test692 test693 test694 test695 test696 test697 test698 test699 test7 test70 test700 test701 test702 test703 test704 test705 test706 test707 test708 test709 test71 test710 test711 test712 test713 test714 test715 test716 test717 test718 test719 test72 test720 test721 test722 test723 test724 test725 test726 test727 test728 test729 test73 test730 test731 test732 test733 test734 test735 test736 test737 test738 test739 test74 test740 test741 test742 test743 test744 test745 test746 test747 test748 test749 test75 test750 test751 test752 test753 test754 test755 test756 test757 test758 test759 test76 test760 test761 test762 test763 test764 test765 test766 test767 test768 test769 test77 test770 test771 test772 test773 test774 test775 test776 test777 test778 test779 test78 test780 test781 test782 test783 test784 test785 test786 test787 test788 test789 test79 test790 test791 test792 test793 test794 test795 test796 test797 test798 test799 test8 test80 test800 test801 test802 test803 test804 test805 test806 test807 test808 test809 test81 test810 test811 test812 test813 test814 test815 test816 test817 test818 test819 test82 test820 test821 test822 test823 test824 test825 test826 test827 test828 test829 test83 test830 test831 test832 test833 test834 test835 test836 test837 test838 test839 test84 test840 test841 test842 test843 test844 test845 test846 test847 test848 test849 test85 test850 test851 test852 test853 test854 test855 test856 test857 test858 test859 test86 test860 test861 test862 test863 test864 test865 test866 test867 test868 test869 test87 test870 test871 test872 test873 test874 test875 test876 test877 test878 test879 test88 test880 test881 test882 test883 test884 test885 test886 test887 test888 test889 test89 test890 test891 test892 test893 test894 test895 test896 test897 test898 test899 test9 test90 test900 test901 test902 test903 test904 test905 test906 test907 test908 test909 test91 test910 test911 test912 test913 test914 test915 test916 test917 test918 test919 test92 test920 test921 test922 test923 test924 test925 test926 test927 test928 test929 test93 test930 test931 test932 test933 test934 test935 test936 test937 test938 test939 test94 test940 test941 test942 test943 test944 test945 test946 test947 test948 test949 test95 test950 test951 test952 test953 test954 test955 test956 test957 test958 test959 test96 test960 test961 test962 test963 test964 test965 test966 test967 test968 test969 test97 test970 test971 test972 test973 test974 test975 test976 test977 test978 test979 test98 test980 test981 test982 test983 test984 test985 test986 test987 test988 test989 test99 test990 test991 test992 test993 test994 test995 test996 test997 test998 test999
http
testenv
mod_curltest .gitignore mod_curltest.c
__init__.py caddy.py certs.py client.py curl.py dante.py dnsd.py env.py httpd.py nghttpx.py ports.py sshd.py vsftpd.py ws_echo_server.py
.gitignore CMakeLists.txt Makefile.am config.ini.in conftest.py requirements.txt scorecard.py test_01_basic.py test_02_download.py test_03_goaway.py test_04_stuttered.py test_05_errors.py test_06_eyeballs.py test_07_upload.py test_08_caddy.py test_09_push.py test_10_proxy.py test_11_unix.py test_12_reuse.py test_13_proxy_auth.py test_14_auth.py test_15_tracing.py test_16_info.py test_17_ssl_use.py test_18_methods.py test_19_shutdown.py test_20_websockets.py test_21_resolve.py test_22_httpsrr.py test_30_vsftpd.py test_31_vsftpds.py test_32_ftps_vsftpd.py test_40_socks.py test_50_scp.py test_51_sftp.py
libtest .gitignore CMakeLists.txt Makefile.am Makefile.inc cli_ftp_upload.c cli_h2_pausing.c cli_h2_serverpush.c cli_h2_upgrade_extreme.c cli_hx_download.c cli_hx_upload.c cli_tls_session_reuse.c cli_upload_pausing.c cli_ws_data.c cli_ws_pingpong.c first.c first.h lib1156.c lib1301.c lib1308.c lib1485.c lib1500.c lib1501.c lib1502.c lib1506.c lib1507.c lib1508.c lib1509.c lib1510.c lib1511.c lib1512.c lib1513.c lib1514.c lib1515.c lib1517.c lib1518.c lib1520.c lib1522.c lib1523.c lib1525.c lib1526.c lib1527.c lib1528.c lib1529.c lib1530.c lib1531.c lib1532.c lib1533.c lib1534.c lib1535.c lib1536.c lib1537.c lib1538.c lib1540.c lib1541.c lib1542.c lib1545.c lib1549.c lib1550.c lib1551.c lib1552.c lib1553.c lib1554.c lib1555.c lib1556.c lib1557.c lib1558.c lib1559.c lib1560.c lib1564.c lib1565.c lib1567.c lib1568.c lib1569.c lib1571.c lib1576.c lib1582.c lib1587.c lib1588.c lib1589.c lib1591.c lib1592.c lib1593.c lib1594.c lib1597.c lib1598.c lib1599.c lib1662.c lib1900.c lib1901.c lib1902.c lib1903.c lib1905.c lib1906.c lib1907.c lib1908.c lib1910.c lib1911.c lib1912.c lib1913.c lib1915.c lib1916.c lib1918.c lib1919.c lib1920.c lib1921.c lib1933.c lib1934.c lib1935.c lib1936.c lib1937.c lib1938.c lib1939.c lib1940.c lib1945.c lib1947.c lib1948.c lib1955.c lib1956.c lib1957.c lib1958.c lib1959.c lib1960.c lib1964.c lib1965.c lib1970.c lib1971.c lib1972.c lib1973.c lib1974.c lib1975.c lib1977.c lib1978.c lib2023.c lib2032.c lib2082.c lib2301.c lib2302.c lib2304.c lib2306.c lib2308.c lib2309.c lib2402.c lib2404.c lib2405.c lib2502.c lib2504.c lib2505.c lib2506.c lib2700.c lib3010.c lib3025.c lib3026.c lib3027.c lib3033.c lib3034.c lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c lib3207.c lib3208.c lib500.c lib501.c lib502.c lib503.c lib504.c lib505.c lib506.c lib507.c lib508.c lib509.c lib510.c lib511.c lib512.c lib513.c lib514.c lib515.c lib516.c lib517.c lib518.c lib519.c lib520.c lib521.c lib523.c lib524.c lib525.c lib526.c lib530.c lib533.c lib536.c lib537.c lib539.c lib540.c lib541.c lib542.c lib543.c lib544.c lib547.c lib549.c lib552.c lib553.c lib554.c lib555.c lib556.c lib557.c lib558.c lib559.c lib560.c lib562.c lib564.c lib566.c lib567.c lib568.c lib569.c lib570.c lib571.c lib572.c lib573.c lib574.c lib575.c lib576.c lib578.c lib579.c lib582.c lib583.c lib586.c lib589.c lib590.c lib591.c lib597.c lib598.c lib599.c lib643.c lib650.c lib651.c lib652.c lib653.c lib654.c lib655.c lib658.c lib659.c lib661.c lib666.c lib667.c lib668.c lib670.c lib674.c lib676.c lib677.c lib678.c lib694.c lib695.c lib751.c lib753.c lib757.c lib758.c lib766.c memptr.c mk-lib1521.pl test1013.pl test1022.pl test307.pl test610.pl test613.pl testtrace.c testtrace.h testutil.c testutil.h unitcheck.h
server .checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc dnsd.c first.c first.h getpart.c mqttd.c resolve.c rtspd.c sockfilt.c socksd.c sws.c tftpd.c util.c
tunit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.c
unit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md unit1300.c unit1302.c unit1303.c unit1304.c unit1305.c unit1307.c unit1309.c unit1323.c unit1330.c unit1395.c unit1396.c unit1397.c unit1398.c unit1399.c unit1600.c unit1601.c unit1602.c unit1603.c unit1605.c unit1606.c unit1607.c unit1608.c unit1609.c unit1610.c unit1611.c unit1612.c unit1614.c unit1615.c unit1616.c unit1620.c unit1625.c unit1626.c unit1627.c unit1636.c unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c unit1666.c unit1667.c unit1668.c unit1669.c unit1674.c unit1675.c unit1676.c unit1979.c unit1980.c unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c unit3200.c unit3205.c unit3211.c unit3212.c unit3213.c unit3214.c unit3216.c unit3219.c unit3300.c unit3301.c unit3302.c
.gitignore CMakeLists.txt Makefile.am allversions.pm appveyor.pm azure.pm config.in configurehelp.pm.in devtest.pl dictserver.py directories.pm ech_combos.py ech_tests.sh ftpserver.pl getpart.pm globalconfig.pm http-server.pl http2-server.pl http3-server.pl memanalyze.pl memanalyzer.pm negtelnetserver.py nghttpx.conf pathhelp.pm processhelp.pm requirements.txt rtspserver.pl runner.pm runtests.pl secureserver.pl serverhelp.pm servers.pm smbserver.py sshhelp.pm sshserver.pl test1119.pl test1135.pl test1139.pl test1140.pl test1165.pl test1167.pl test1173.pl test1175.pl test1177.pl test1222.pl test1275.pl test1276.pl test1477.pl test1486.pl test1488.pl test1544.pl test1707.pl test745.pl test971.pl testcurl.pl testutil.pm tftpserver.pl util.py valgrind.pm valgrind.supp
.clang-tidy.yml .dir-locals.el .editorconfig .git-blame-ignore-revs .gitattributes .gitignore .mailmap CHANGES.md CMakeLists.txt COPYING Dockerfile GIT-INFO.md Makefile.am README README.md RELEASE-NOTES REUSE.toml SECURITY.md acinclude.m4 appveyor.sh appveyor.yml configure.ac curl-config.in libcurl.pc.in renovate.json
examples .env config.ini crypto_test.lua env_test.lua fs_example.lua http_server.lua https_test.lua ini_example.lua json.lua log.lua path_fs_example.lua process_example.lua request_download.lua request_test.lua run_all.lua sqlite_example.lua sqlite_http_template.lua stash_test.lua template_test.lua timer.lua websocket.lua
iniparser
.github
ISSUE_TEMPLATE config.yml
workflows disable-pull-requests.yml trigger-gitlab-ci.yml
cmake JoinPaths.cmake config.cmake.in pc.in
example iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.ini
src dictionary.c dictionary.h iniparser.c iniparser.h
test
ressources
bad_ini ends_well.ini twisted-errors.ini twisted-ofkey.ini twisted-ofval.ini
good_ini empty.ini spaced.ini spaced2.ini twisted.ini
gruezi.ini old.ini quotes.ini utf8.ini
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.h
.cmake-format.py .gitignore .gitlab-ci.yml .gitmessage .travis.yml AUTHORS CMakeLists.txt FAQ-en.md FAQ-zhcn.md INSTALL LICENSE README.md compile_commands.json
jinjac
example CMakeLists.txt example.c
jinjac_test_app CMakeLists.txt jinjac_test_app.c
libjinjac
include jinjac.h
src CMakeLists.txt ast.c ast.h block_statement.c block_statement.h buffer.c buffer.h buildin.c buildin.h common.h convert.c convert.h flex_decl.h jfunction.c jfunction.h jinja_expression.l jinja_expression.y jinjac_parse.c jinjac_parse.h jinjac_stream.c jinjac_stream.h jlist.c jlist.h jobject.c jobject.h parameter.c parameter.h str_obj.c str_obj.h trace.c trace.h
CMakeLists.txt
test .gitignore CMakeLists.txt autotest.rb test_01.expected test_01.jinja test_01b.expected test_01b.jinja test_01c.expected test_01c.jinja test_01d.expected test_01d.jinja test_02.expected test_02.jinja test_03.expected test_03.jinja test_04.expected test_04.jinja test_05.expected test_05.jinja test_06.expected test_06.jinja test_07.expected test_07.jinja test_08.expected test_08.jinja test_08b.expected test_08b.jinja test_09.expected test_09.jinja test_10.expected test_10.jinja test_11.expected test_11.jinja test_12.expected test_12.jinja test_13.expected test_13.jinja test_14.expected test_14.jinja test_15.expected test_15.jinja test_16.expected test_16.jinja test_17.expected test_17.jinja test_18.expected test_18.jinja test_18b.expected test_18b.jinja test_18c.expected test_18c.jinja test_19.expected test_19.jinja test_19b.expected test_19b.jinja test_19c.expected test_19c.jinja test_19d.expected test_19d.jinja test_19e.expected test_19e.jinja test_19f.expected test_19f.jinja test_20.expected test_20.jinja test_21.expected test_21.jinja test_22.expected test_22.jinja test_22a.expected test_22a.jinja test_22b.expected test_22b.jinja test_23.expected test_23.jinja test_24.expected test_24.jinja
.gitignore CMakeLists.txt LICENSE.txt README.md build_coverage.sh build_debug.sh build_release.sh cppcheck_analysis.sh
libev Changes LICENSE Makefile Makefile.am Makefile.in README Symbols.ev Symbols.event aclocal.m4 autogen.sh compile config.guess config.h config.h.in config.status config.sub configure configure.ac depcomp ev++.h ev.3 ev.c ev.h ev.pod ev_epoll.c ev_kqueue.c ev_poll.c ev_port.c ev_select.c ev_vars.h ev_win32.c ev_wrap.h event.c event.h install-sh libev.m4 libtool ltmain.sh missing mkinstalldirs stamp-h1
luajit
doc
img contact.png
bluequad-print.css bluequad.css contact.html ext_buffer.html ext_c_api.html ext_ffi.html ext_ffi_api.html ext_ffi_semantics.html ext_ffi_tutorial.html ext_jit.html ext_profiler.html extensions.html install.html luajit.html running.html
dynasm dasm_arm.h dasm_arm.lua dasm_arm64.h dasm_arm64.lua dasm_mips.h dasm_mips.lua dasm_mips64.lua dasm_ppc.h dasm_ppc.lua dasm_proto.h dasm_x64.lua dasm_x86.h dasm_x86.lua dynasm.lua
etc luajit.1 luajit.pc
src
host .gitignore README buildvm.c buildvm.h buildvm_asm.c buildvm_fold.c buildvm_lib.c buildvm_libbc.h buildvm_peobj.c genlibbc.lua genminilua.lua genversion.lua minilua.c
jit .gitignore bc.lua bcsave.lua dis_arm.lua dis_arm64.lua dis_arm64be.lua dis_mips.lua dis_mips64.lua dis_mips64el.lua dis_mips64r6.lua dis_mips64r6el.lua dis_mipsel.lua dis_ppc.lua dis_x64.lua dis_x86.lua dump.lua p.lua v.lua zone.lua
.gitignore Makefile Makefile.dep lauxlib.h lib_aux.c lib_base.c lib_bit.c lib_buffer.c lib_debug.c lib_ffi.c lib_init.c lib_io.c lib_jit.c lib_math.c lib_os.c lib_package.c lib_string.c lib_table.c lj_alloc.c lj_alloc.h lj_api.c lj_arch.h lj_asm.c lj_asm.h lj_asm_arm.h lj_asm_arm64.h lj_asm_mips.h lj_asm_ppc.h lj_asm_x86.h lj_assert.c lj_bc.c lj_bc.h lj_bcdump.h lj_bcread.c lj_bcwrite.c lj_buf.c lj_buf.h lj_carith.c lj_carith.h lj_ccall.c lj_ccall.h lj_ccallback.c lj_ccallback.h lj_cconv.c lj_cconv.h lj_cdata.c lj_cdata.h lj_char.c lj_char.h lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h lj_crecord.c lj_crecord.h lj_ctype.c lj_ctype.h lj_debug.c lj_debug.h lj_def.h lj_dispatch.c lj_dispatch.h lj_emit_arm.h lj_emit_arm64.h lj_emit_mips.h lj_emit_ppc.h lj_emit_x86.h lj_err.c lj_err.h lj_errmsg.h lj_ff.h lj_ffrecord.c lj_ffrecord.h lj_frame.h lj_func.c lj_func.h lj_gc.c lj_gc.h lj_gdbjit.c lj_gdbjit.h lj_ir.c lj_ir.h lj_ircall.h lj_iropt.h lj_jit.h lj_lex.c lj_lex.h lj_lib.c lj_lib.h lj_load.c lj_mcode.c lj_mcode.h lj_meta.c lj_meta.h lj_obj.c lj_obj.h lj_opt_dce.c lj_opt_fold.c lj_opt_loop.c lj_opt_mem.c lj_opt_narrow.c lj_opt_sink.c lj_opt_split.c lj_parse.c lj_parse.h lj_prng.c lj_prng.h lj_profile.c lj_profile.h lj_record.c lj_record.h lj_serialize.c lj_serialize.h lj_snap.c lj_snap.h lj_state.c lj_state.h lj_str.c lj_str.h lj_strfmt.c lj_strfmt.h lj_strfmt_num.c lj_strscan.c lj_strscan.h lj_tab.c lj_tab.h lj_target.h lj_target_arm.h lj_target_arm64.h lj_target_mips.h lj_target_ppc.h lj_target_x86.h lj_trace.c lj_trace.h lj_traceerr.h lj_udata.c lj_udata.h lj_vm.h lj_vmevent.c lj_vmevent.h lj_vmmath.c ljamalg.c lua.h lua.hpp luaconf.h luajit.c luajit_rolling.h lualib.h msvcbuild.bat nxbuild.bat ps4build.bat ps5build.bat psvitabuild.bat vm_arm.dasc vm_arm64.dasc vm_mips.dasc vm_mips64.dasc vm_ppc.dasc vm_x64.dasc vm_x86.dasc xb1build.bat xedkbuild.bat
.gitattributes .gitignore .relver COPYRIGHT Makefile README
sqlite shell.c sqlite3.c sqlite3.h sqlite3ext.h
wolfssl
.github
ISSUE_TEMPLATE bug_report.yaml other.yaml
actions
install-apt-deps action.yml
scripts
zephyr-4.x external_libc.conf zephyr-test.sh
openssl-ech.sh tls-anvil-test.sh
workflows
disabled haproxy.yml hitch.yml hostap.yml
hostap-files
configs
07c9f183ea744ac04585fb6dd10220c75a5e2e74 hostapd.config tests wpa_supplicant.config
b607d2723e927a3446d89aed813f1aa6068186bb hostapd.config tests wpa_supplicant.config
hostap_2_10 extra.patch hostapd.config tests wpa_supplicant.config
Makefile README dbus-wpa_supplicant.conf
ada.yml arduino.yml async-examples.yml async.yml atecc608-sim.yml bind.yml cmake-autoconf.yml cmake.yml codespell.yml coverity-scan-fixes.yml cryptocb-only.yml curl.yml cyrus-sasl.yml disable-pk-algs.yml docker-Espressif.yml docker-OpenWrt.yml emnet-nonblock.yml fil-c.yml freertos-mem-track.yml gencertbuf.yml grpc.yml haproxy.yml hostap-vm.yml intelasm-c-fallback.yml ipmitool.yml jwt-cpp.yml krb5.yml libspdm.yml libssh2.yml libvncserver.yml linuxkm.yml macos-apple-native-cert-validation.yml mbedtls.sh mbedtls.yml membrowse-comment.yml membrowse-onboard.yml membrowse-report.yml memcached.sh memcached.yml mono.yml mosquitto.yml msmtp.yml msys2.yml multi-arch.yml multi-compiler.yml net-snmp.yml nginx.yml no-malloc.yml no-tls.yml nss.sh nss.yml ntp.yml ocsp.yml openldap.yml openssh.yml openssl-ech.yml opensslcoexist.yml openvpn.yml os-check.yml packaging.yml pam-ipmi.yml pq-all.yml pr-commit-check.yml psk.yml puf.yml python.yml rng-tools.yml rust-wrapper.yml se050-sim.yml smallStackSize.yml socat.yml softhsm.yml sssd.yml stm32-sim.yml stsafe-a120-sim.yml stunnel.yml symbol-prefixes.yml threadx.yml tls-anvil.yml trackmemory.yml watcomc.yml win-csharp-test.yml wolfCrypt-Wconversion.yml wolfboot-integration.yml wolfsm.yml xcode.yml zephyr-4.x.yml zephyr.yml
PULL_REQUEST_TEMPLATE.md SECURITY.md membrowse-targets.json
Docker
OpenWrt Dockerfile README.md runTests.sh
packaging
debian Dockerfile
fedora Dockerfile
wolfCLU Dockerfile README.md
yocto Dockerfile buildAndPush.sh
Dockerfile Dockerfile.cross-compiler README.md buildAndPush.sh include.am run.sh
IDE
ARDUINO
sketches
wolfssl_client README.md
wolfssl_server README.md
wolfssl_version README.md
README.md
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.h
AURIX Cpu0_Main.c README.md include.am user_settings.h wolf_main.c
Android Android.bp README.md include.am user_settings.h
CRYPTOCELL README.md include.am main.c user_settings.h
CSBENCH include.am user_settings.h
ECLIPSE
DEOS
deos_wolfssl .options
README.md deos_malloc.c include.am tls_wolfssl.c tls_wolfssl.h user_settings.h
MICRIUM README.md client_wolfssl.c client_wolfssl.h include.am server_wolfssl.c server_wolfssl.h user_settings.h wolfsslRunTests.c
RTTHREAD README.md include.am user_settings.h wolfssl_test.c
SIFIVE README.md include.am
Espressif
ESP-IDF
examples
template
VisualGDB wolfssl_template_IDF_v5.1_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_benchmark
VisualGDB wolfssl_benchmark_IDF_v4.4_ESP32.sln wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32.sln wolfssl_benchmark_IDF_v5_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32C3.sln wolfssl_benchmark_IDF_v5_ESP32C3.vgdbproj wolfssl_benchmark_IDF_v5_ESP32S3.sln wolfssl_benchmark_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_client
VisualGDB README.md wolfssl_client_IDF_v5_ESP32.sln wolfssl_client_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include client-tls.h main.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild client-tls.c component.mk main.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbproj
wolfssl_server
VisualGDB README.md wolfssl_server_IDF_v5_ESP32.sln wolfssl_server_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h server-tls.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild component.mk main.c server-tls.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbproj
wolfssl_test
VisualGDB wolfssl_test-IDF_v5_ESP32.sln wolfssl_test-IDF_v5_ESP32.vgdbproj wolfssl_test-IDF_v5_ESP32C3.sln wolfssl_test-IDF_v5_ESP32C3.vgdbproj wolfssl_test-IDF_v5_ESP32C6.sln wolfssl_test-IDF_v5_ESP32C6.vgdbproj wolfssl_test_IDF_v5_ESP32S3.sln wolfssl_test_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32 sdkconfig.defaults.esp32c3 sdkconfig.defaults.esp32c6 sdkconfig.defaults.esp32h2 sdkconfig.defaults.esp32s2 sdkconfig.defaults.esp32s3 sdkconfig.defaults.esp8266 testAll.sh testMonitor.sh wolfssl_test_ESP8266.sln wolfssl_test_ESP8266.vgdbproj
wolfssl_test_idf
VisualGDB VisualGDB_wolfssl_test_idf.sln VisualGDB_wolfssl_test_idf.vgdbproj
main CMakeLists.txt Kconfig.projbuild component.mk main.c main_wip.c.ex time_helper.c time_helper.h
CMakeLists.txt Kconfig.projbuild README.md component.mk sdkconfig.defaults
README.md
libs CMakeLists.txt README.md component.mk tigard.cfg
test CMakeLists.txt README.md component.mk test_wolfssl.c
README.md README_32se.md UPDATE.md compileAllExamples.sh dummy_config_h dummy_test_paths.h setup.sh setup_win.bat user_settings.h
README.md include.am
GCC-ARM
Header user_settings.h
Source armtarget.c benchmark_main.c test_main.c tls_client.c tls_server.c wolf_main.c
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ld
Gaisler-BCC README.md include.am
HEXAGON
DSP Makefile wolfssl_dsp.idl
Makefile README.md build.sh ecc-verify-benchmark.c ecc-verify.c include.am user_settings.h
HEXIWEAR
wolfSSL_HW .cwGeneratedFileSetLog user_settings.h
IAR-EWARM
Projects
benchmark benchmark-main.c current_time.c wolfCrypt-benchmark.ewd wolfCrypt-benchmark.ewp
common minimum-startup.c wolfssl.icf
lib wolfSSL-Lib.ewd wolfSSL-Lib.ewp
test test-main.c wolfCrypt-test.ewd wolfCrypt-test.ewp
user_settings.h wolfssl.eww
embOS
SAMV71_XULT
embOS_SAMV71_XULT_Linker_Script samv71q21_wolfssl.icf
embOS_SAMV71_XULT_user_settings user_settings.h user_settings_simple_example.h user_settings_verbose_example.h
embOS_wolfcrypt_benchmark_SAMV71_XULT
Application runBenchmarks.c
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewp
embOS_wolfcrypt_lib_SAMV71_XULT README_wolfcrypt_lib wolfcrypt_lib.ewd wolfcrypt_lib.ewp
embOS_wolfcrypt_test_SAMV71_XULT
Application runWolfcryptTests.c
README_wolfcrypt_test wolfcrypt_test.ewd wolfcrypt_test.ewp
README_SAMV71
custom_port
custom_port_Linker_Script samv71q21_wolfssl.icf
custom_port_user_settings user_settings.h
wolfcrypt_benchmark_custom_port
Application runBenchmarks.c
wolfcrypt_test_custom_port
Application runWolfcryptTests.c
README_custom_port
extract_trial_here README_extract_trial_here
README
.gitignore README
IAR-MSP430 Makefile README.md include.am main.c user_settings.h
INTIME-RTOS Makefile README.md include.am libwolfssl.c libwolfssl.vcxproj user_settings.h wolfExamples.c wolfExamples.h wolfExamples.sln wolfExamples.vcxproj wolfssl-lib.sln wolfssl-lib.vcxproj
Infineon README.md include.am user_settings.h
KDS
config user_settings.h
include.am
LINUX-SGX README.md build.sh clean.sh include.am sgx_t_static.mk
LPCXPRESSO
lib_wolfssl lpc_18xx_port.c user_settings.h
wolf_example
src lpc_18xx_startup.c wolfssl_example.c
readme.txt
README.md
M68K
benchmark Makefile main.cpp
testwolfcrypt Makefile main.cpp
Makefile README.md include.am user_settings.h
MCUEXPRESSO
RT1170 fsl_caam_c.patch fsl_caam_h.patch user_settings.h
benchmark
source run_benchmark.c
wolfssl liblinks.xml
README.md include.am user_settings.h wolfcrypt_test.c
MDK-ARM
LPC43xx time-LCP43xx.c
MDK-ARM
wolfSSL Retarget.c cert_data.c cert_data.h config-BARE-METAL.h config-FS.h config-RTX-TCP-FS.h config-WOLFLIB.h main.c shell.c time-CortexM3-4.c time-dummy.c wolfssl_MDK_ARM.c wolfssl_MDK_ARM.h
STM32F2xx_StdPeriph_Lib time-STM32F2xx.c
MDK5-ARM
Conf user_settings.h
Inc wolfssl_MDK_ARM.h
Projects
CryptBenchmark Abstract.txt CryptBenchmark.sct CryptBenchmark.uvoptx CryptBenchmark.uvprojx main.c
CryptTest Abstract.txt CryptTest.sct CryptTest.uvoptx CryptTest.uvprojx main.c
EchoClient Abstract.txt EchoClient.uvoptx EchoClient.uvprojx main.c wolfssl-link.sct
EchoServer Abstract.txt EchoServer.uvoptx EchoServer.uvprojx main.c wolfssl-link.sct
SimpleClient Abstract.txt SimpleClient.uvoptx SimpleClient.uvprojx main.c wolfssl-link.sct
SimpleServer Abstract.txt SimpleServer.uvoptx SimpleServer.uvprojx main.c wolfssl-link.sct
wolfSSL-Full Abstract.txt main.c shell.c time-CortexM3-4.c wolfsslFull.uvoptx wolfsslFull.uvprojx
wolfSSL-Lib Abstract.txt wolfSSL-Lib.uvoptx wolfSSL-Lib.uvprojx
Src ssl-dummy.c
README.md include.am
MPLABX16
wolfcrypt_test.X
nbproject
private configurations.xml private.xml
configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
README.md include.am main.c user_settings.h
MQX Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.h
MSVS-2019-AZSPHERE
client client.c client.h
server server.c server.h
shared util.h
wolfssl_new_azsphere
HardwareDefinitions
avnet_mt3620_sk
inc
hw template_appliance.h
template_appliance.json
mt3620_rdb
inc
hw template_appliance.h
template_appliance.json
seeed_mt3620_mdb
inc
hw template_appliance.h
template_appliance.json
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.c
README.md include.am user_settings.h
MYSQL CMakeLists_wolfCrypt.txt CMakeLists_wolfSSL.txt do.sh
NDS README.md
NETOS Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.c
OPENSTM32 README.md
PlatformIO
examples
wolfssl_benchmark
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspace
wolfssl_test
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_test.code-workspace
README.md wolfssl_platformio.code-workspace
README.md include.am
QNX
CAAM-DRIVER Makefile
example-client Makefile client-tls.c
example-cmac Makefile cmac-test.c
example-server Makefile server-tls.c
testwolfcrypt Makefile
wolfssl Makefile user_settings.h
README.md include.am
RISCV
SIFIVE-HIFIVE1 Makefile README.md include.am main.c user_settings.h
SIFIVE-UNLEASHED README.md include.am
include.am
ROWLEY-CROSSWORKS-ARM Kinetis_FlashPlacement.xml README.md arm_startup.c benchmark_main.c hw.h include.am kinetis_hw.c retarget.c test_main.c user_settings.h wolfssl.hzp wolfssl_ltc.hzp
Renesas
cs+
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
t4_demo README_en.txt README_jp.txt t4_demo.mtpj wolf_client.c wolf_demo.h wolf_main.c wolf_server.c
test test.mtpj test_main.c
wolfssl_lib wolfssl_lib.mtpj
README include.am
e2studio
DK-S7G2
benchmark-template
src app_entry.c
example_server-template
src app_entry.c
wolfcrypttest-template
src app_entry.c
wolfssl-template-project configuration.xml
README.md include.am user_settings.h
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
tools generate_rsa_keypair.sh genhexbuf.pl rsa_pss_sign.sh
wolfssl
src .gitkeep
wolfcrypt
src .gitkeep
README include.am
RA6M3
benchmark-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
client-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
common
ra6m3g README.md
src freertos_tcp_port.c
user_settings.h util.h
server-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
test-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl
src .gitkeep
wolfcrypt .gitkeep
README.md README_APRA6M_en.md README_APRA6M_jp.md include.am
RA6M3G README.md
RA6M4
common user_settings.h wolfssl_demo.h
test
key_data key_data.h key_data_sce.c
src
SEGGER_RTT myprint.c
common .gitignore
test_main.c wolf_client.c wolfssl_sce_unit_test.c
test_RA6M4Debug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
README.md include.am
RX65N
GR-ROSE
common strings.h unistd.h user_settings.h wolfssl_dummy.c
smc smc.scfg
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
test.rcpc test_HardwareDebug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
README_EN.md README_JP.md include.am
RSK
resource section.esi
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h
InstructionManualForExample_RSK+RX65N-2MB_EN.pdf InstructionManualForExample_RSK+RX65N-2MB_JP.pdf README_EN.md README_JP.md include.am
RX72N
EnvisionKit
Simple
common sectioninfo.esi wolfssl_dummy.c
test
src
client simple_tcp_client.c simple_tls_tsip_client.c
server simple_tcp_server.c simple_tls_server.c
test_main.c wolfssl_simple_demo.h
test.rcpc test.scfg test_HardwareDebug.launch
wolfssl wolfssl.rcpc
README_EN.md README_JP.md
resource section.esi
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.c
InstructionManualForExample_RX72N_EnvisonKit_EN.pdf InstructionManualForExample_RX72N_EnvisonKit_JP.pdf README_EN.md README_JP.md include.am
RZN2L
common user_settings.h wolfssl_demo.h
test
src
serial_io app_print.c
test wolf_client.c wolf_server.c wolfssl_rsip_unit_test.c
wolfCrypt .gitignore
wolfSSL .gitignore
local_system_init.c rzn2l_tst_thread_entry.c wolfssl_dummy.c
README.md include.am
SK-S7G2
common user_settings.h
wolfssl_lib configuration.xml
.gitignore README.md include.am
STARCORE README.txt include.am starcore_test.c user_settings.h
STM32Cube README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.h
SimplicityStudio README.md include.am test_wolf.c user_settings.h
TRUESTUDIO
wolfssl user_settings.h
README include.am
VS-ARM README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VS-AZURE-SPHERE
client app_manifest.json client.c client.h client.vcxproj
server app_manifest.json server.c server.h server.vcxproj
shared util.h
wolfcrypt_test app_manifest.json wolfcrypt_test.vcxproj
README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VisualDSP include.am user_settings.h wolf_tasks.c
WICED-STUDIO README include.am user_settings.h
WIN README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxproj
WIN-SGX ReadMe.txt include.am wolfSSL_SGX.edl wolfSSL_SGX.sln wolfSSL_SGX.vcxproj
WIN-SRTP-KDF-140-3 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WIN10 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WINCE README.md include.am user_settings.h user_settings.h.140-2-deprecated
WORKBENCH README.md include.am
XCODE
Benchmark
wolfBench
Assets.xcassets
AppIcon.appiconset Contents.json
Base.lproj LaunchScreen.storyboard Main.storyboard
AppDelegate.h AppDelegate.m Info.plist ViewController.h ViewController.m main.m
wolfBench.xcodeproj project.pbxproj
include.am
wolfssl-FIPS.xcodeproj project.pbxproj
wolfssl.xcodeproj project.pbxproj
wolfssl_testsuite.xcodeproj project.pbxproj
README.md build-for-i386.sh include.am user_settings.h
XCODE-FIPSv2
macOS-C++
Intel user_settings.h
M1 user_settings.h
include.am user_settings.h
XCODE-FIPSv5 README include.am user_settings.h
XCODE-FIPSv6 README include.am user_settings.h
XilinxSDK
2018_2 lscript.ld
2019_2
wolfCrypt_example
src lscript.ld
wolfCrypt_example_system wolfCrypt_example_system.sprj
2022_1
wolfCrypt_FreeRTOS_example wolfCrypt_FreeRTOS_example.prj
wolfCrypt_FreeRTOS_example_system wolfCrypt_FreeRTOS_example_system.sprj
wolfCrypt_example wolfCrypt_example.prj
wolfCrypt_example_system wolfCrypt_example_system.sprj
.gitignore
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.c
apple-universal
wolfssl-multiplatform
wolfssl-multiplatform
Assets.xcassets
AccentColor.colorset Contents.json
AppIcon.appiconset Contents.json
Contents.json
ContentView.swift simple_client_example.c simple_client_example.h wolfssl-multiplatform-Bridging-Header.h wolfssl_multiplatform.entitlements wolfssl_multiplatformApp.swift wolfssl_test_driver.c wolfssl_test_driver.h
wolfssl-multiplatform.xcodeproj project.pbxproj
.gitignore README.md build-wolfssl-framework.sh include.am
iotsafe Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.h
iotsafe-raspberrypi Makefile README.md client-tls13.c include.am main.c
mynewt README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.sh
zephyr README.md include.am
include.am
RTOS
nuttx
wolfssl .gitignore Kconfig Make.defs Makefile README.md setup-wolfssl.sh user_settings.h
include.am
bsdkm Makefile README.md bsdkm_wc_port.h include.am wolfkmod.c wolfkmod_aes.c x86_vecreg.c
certs
1024 ca-cert.der ca-cert.pem ca-key.der ca-key.pem client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der dh1024.der dh1024.pem dsa-pub-1024.pem dsa1024.der dsa1024.pem include.am rsa1024.der server-cert.der server-cert.pem server-key.der server-key.pem
3072 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
4096 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
acert
rsa_pss acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem
acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem include.am
aia ca-issuers-cert.pem multi-aia-cert.pem overflow-aia-cert.pem
crl
extra-crls ca-int-cert-revoked.pem claim-root.pem crl_critical_entry.pem crlnum_57oct.pem crlnum_64oct.pem general-server-crl.pem large_crlnum.pem large_crlnum2.pem
hash_der 0fdb2da4.r0
hash_pem 0fdb2da4.r0
bad_time_fmt.pem ca-int-ecc.pem ca-int.pem ca-int2-ecc.pem ca-int2.pem caEcc384Crl.pem caEccCrl.der caEccCrl.pem cliCrl.pem client-int-ecc.pem client-int.pem crl.der crl.pem crl.revoked crl2.der crl2.pem crl_reason.pem crl_rsapss.pem eccCliCRL.pem eccSrvCRL.pem gencrls.sh include.am server-goodaltCrl.pem server-goodaltwildCrl.pem server-goodcnCrl.pem server-goodcnwildCrl.pem server-int-ecc.pem server-int.pem wolfssl.cnf
dilithium bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.am
ecc bp256r1-key.der bp256r1-key.pem ca-secp256k1-cert.pem ca-secp256k1-key.pem client-bp256r1-cert.der client-bp256r1-cert.pem client-secp256k1-cert.der client-secp256k1-cert.pem genecc.sh include.am secp256k1-key.der secp256k1-key.pem secp256k1-param.pem secp256k1-privkey.der secp256k1-privkey.pem server-bp256r1-cert.der server-bp256r1-cert.pem server-secp256k1-cert.der server-secp256k1-cert.pem server2-secp256k1-cert.der server2-secp256k1-cert.pem wolfssl.cnf wolfssl_384.cnf
ed25519 ca-ed25519-key.der ca-ed25519-key.pem ca-ed25519-priv.der ca-ed25519-priv.pem ca-ed25519.der ca-ed25519.pem client-ed25519-key.der client-ed25519-key.pem client-ed25519-priv.der client-ed25519-priv.pem client-ed25519.der client-ed25519.pem eddsa-ed25519.der eddsa-ed25519.pem gen-ed25519-certs.sh gen-ed25519-keys.sh gen-ed25519.sh include.am root-ed25519-key.der root-ed25519-key.pem root-ed25519-priv.der root-ed25519-priv.pem root-ed25519.der root-ed25519.pem server-ed25519-cert.pem server-ed25519-key.der server-ed25519-key.pem server-ed25519-priv.der server-ed25519-priv.pem server-ed25519.der server-ed25519.pem
ed448 ca-ed448-key.der ca-ed448-key.pem ca-ed448-priv.der ca-ed448-priv.pem ca-ed448.der ca-ed448.pem client-ed448-key.der client-ed448-key.pem client-ed448-priv.der client-ed448-priv.pem client-ed448.der client-ed448.pem gen-ed448-certs.sh gen-ed448-keys.sh include.am root-ed448-key.der root-ed448-key.pem root-ed448-priv.der root-ed448-priv.pem root-ed448.der root-ed448.pem server-ed448-cert.pem server-ed448-key.der server-ed448-key.pem server-ed448-priv.der server-ed448-priv.pem server-ed448.der server-ed448.pem
external DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.am
falcon bench_falcon_level1_key.der bench_falcon_level5_key.der include.am
intermediate
ca_false_intermediate gentestcert.sh int_ca.key server.key test_ca.key test_ca.pem test_int_not_cacert.pem test_sign_bynoca_srv.pem wolfssl_base.conf wolfssl_srv.conf
ca-ecc-bad-aki.der ca-ecc-bad-aki.pem ca-int-cert.der ca-int-cert.pem ca-int-ecc-cert.der ca-int-ecc-cert.pem ca-int-ecc-key.der ca-int-ecc-key.pem ca-int-key.der ca-int-key.pem ca-int2-cert.der ca-int2-cert.pem ca-int2-ecc-cert.der ca-int2-ecc-cert.pem ca-int2-ecc-key.der ca-int2-ecc-key.pem ca-int2-key.der ca-int2-key.pem client-chain-alt-ecc.pem client-chain-alt.pem client-chain-ecc.der client-chain-ecc.pem client-chain.der client-chain.pem client-int-cert.der client-int-cert.pem client-int-ecc-cert.der client-int-ecc-cert.pem genintcerts.sh include.am server-chain-alt-ecc.pem server-chain-alt.pem server-chain-ecc.der server-chain-ecc.pem server-chain-short.pem server-chain.der server-chain.pem server-int-cert.der server-int-cert.pem server-int-ecc-cert.der server-int-ecc-cert.pem
lms bc_hss_L2_H5_W8_root.der bc_hss_L3_H5_W4_root.der bc_lms_chain_ca.der bc_lms_chain_leaf.der bc_lms_native_bc_root.der bc_lms_sha256_h10_w8_root.der bc_lms_sha256_h5_w4_root.der include.am
mldsa README.txt include.am mldsa44-cert.der mldsa44-cert.pem mldsa44-key.pem mldsa44_bare-priv.der mldsa44_bare-seed.der mldsa44_oqskeypair.der mldsa44_priv-only.der mldsa44_pub-spki.der mldsa44_seed-only.der mldsa44_seed-priv.der mldsa65-cert.der mldsa65-cert.pem mldsa65-key.pem mldsa65_bare-priv.der mldsa65_bare-seed.der mldsa65_oqskeypair.der mldsa65_priv-only.der mldsa65_pub-spki.der mldsa65_seed-only.der mldsa65_seed-priv.der mldsa87-cert.der mldsa87-cert.pem mldsa87-key.pem mldsa87_bare-priv.der mldsa87_bare-seed.der mldsa87_oqskeypair.der mldsa87_priv-only.der mldsa87_pub-spki.der mldsa87_seed-only.der mldsa87_seed-priv.der
ocsp imposter-root-ca-cert.der imposter-root-ca-cert.pem imposter-root-ca-key.der imposter-root-ca-key.pem include.am index-ca-and-intermediate-cas.txt index-ca-and-intermediate-cas.txt.attr index-intermediate1-ca-issued-certs.txt index-intermediate1-ca-issued-certs.txt.attr index-intermediate2-ca-issued-certs.txt index-intermediate2-ca-issued-certs.txt.attr index-intermediate3-ca-issued-certs.txt index-intermediate3-ca-issued-certs.txt.attr intermediate1-ca-cert.der intermediate1-ca-cert.pem intermediate1-ca-key.der intermediate1-ca-key.pem intermediate2-ca-cert.der intermediate2-ca-cert.pem intermediate2-ca-key.der intermediate2-ca-key.pem intermediate3-ca-cert.der intermediate3-ca-cert.pem intermediate3-ca-key.der intermediate3-ca-key.pem ocsp-responder-cert.der ocsp-responder-cert.pem ocsp-responder-key.der ocsp-responder-key.pem openssl.cnf renewcerts-for-test.sh renewcerts.sh root-ca-cert.der root-ca-cert.pem root-ca-crl.pem root-ca-key.der root-ca-key.pem server1-cert.der server1-cert.pem server1-chain-noroot.pem server1-key.der server1-key.pem server2-cert.der server2-cert.pem server2-key.der server2-key.pem server3-cert.der server3-cert.pem server3-key.der server3-key.pem server4-cert.der server4-cert.pem server4-key.der server4-key.pem server5-cert.der server5-cert.pem server5-key.der server5-key.pem test-leaf-response.der test-multi-response.der test-response-nointern.der test-response-rsapss.der test-response.der
p521 ca-p521-key.der ca-p521-key.pem ca-p521-priv.der ca-p521-priv.pem ca-p521.der ca-p521.pem client-p521-key.der client-p521-key.pem client-p521-priv.der client-p521-priv.pem client-p521.der client-p521.pem gen-p521-certs.sh gen-p521-keys.sh include.am root-p521-key.der root-p521-key.pem root-p521-priv.der root-p521-priv.pem root-p521.der root-p521.pem server-p521-cert.pem server-p521-key.der server-p521-key.pem server-p521-priv.der server-p521-priv.pem server-p521.der server-p521.pem
renewcerts wolfssl.cnf
rpk client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.der
rsapss ca-3072-rsapss-key.der ca-3072-rsapss-key.pem ca-3072-rsapss-priv.der ca-3072-rsapss-priv.pem ca-3072-rsapss.der ca-3072-rsapss.pem ca-rsapss-key.der ca-rsapss-key.pem ca-rsapss-priv.der ca-rsapss-priv.pem ca-rsapss.der ca-rsapss.pem client-3072-rsapss-key.der client-3072-rsapss-key.pem client-3072-rsapss-priv.der client-3072-rsapss-priv.pem client-3072-rsapss.der client-3072-rsapss.pem client-rsapss-key.der client-rsapss-key.pem client-rsapss-priv.der client-rsapss-priv.pem client-rsapss.der client-rsapss.pem gen-rsapss-keys.sh include.am renew-rsapss-certs.sh root-3072-rsapss-key.der root-3072-rsapss-key.pem root-3072-rsapss-priv.der root-3072-rsapss-priv.pem root-3072-rsapss.der root-3072-rsapss.pem root-rsapss-key.der root-rsapss-key.pem root-rsapss-priv.der root-rsapss-priv.pem root-rsapss.der root-rsapss.pem server-3072-rsapss-cert.pem server-3072-rsapss-key.der server-3072-rsapss-key.pem server-3072-rsapss-priv.der server-3072-rsapss-priv.pem server-3072-rsapss.der server-3072-rsapss.pem server-mix-rsapss-cert.pem server-rsapss-cert.pem server-rsapss-key.der server-rsapss-key.pem server-rsapss-priv.der server-rsapss-priv.pem server-rsapss.der server-rsapss.pem
sia timestamping-sia-cert.pem
slhdsa bench_slhdsa_sha2_128f_key.der bench_slhdsa_sha2_128s_key.der bench_slhdsa_sha2_192f_key.der bench_slhdsa_sha2_192s_key.der bench_slhdsa_sha2_256f_key.der bench_slhdsa_sha2_256s_key.der bench_slhdsa_shake128f_key.der bench_slhdsa_shake128s_key.der bench_slhdsa_shake192f_key.der bench_slhdsa_shake192s_key.der bench_slhdsa_shake256f_key.der bench_slhdsa_shake256s_key.der client-mldsa44-priv.pem client-mldsa44-sha2.der client-mldsa44-sha2.pem client-mldsa44-shake.der client-mldsa44-shake.pem gen-slhdsa-mldsa-certs.sh include.am root-slhdsa-sha2-128s-priv.der root-slhdsa-sha2-128s-priv.pem root-slhdsa-sha2-128s.der root-slhdsa-sha2-128s.pem root-slhdsa-shake-128s-priv.der root-slhdsa-shake-128s-priv.pem root-slhdsa-shake-128s.der root-slhdsa-shake-128s.pem server-mldsa44-priv.pem server-mldsa44-sha2.der server-mldsa44-sha2.pem server-mldsa44-shake.der server-mldsa44-shake.pem
sm2 ca-sm2-key.der ca-sm2-key.pem ca-sm2-priv.der ca-sm2-priv.pem ca-sm2.der ca-sm2.pem client-sm2-key.der client-sm2-key.pem client-sm2-priv.der client-sm2-priv.pem client-sm2.der client-sm2.pem fix_sm2_spki.py gen-sm2-certs.sh gen-sm2-keys.sh include.am root-sm2-key.der root-sm2-key.pem root-sm2-priv.der root-sm2-priv.pem root-sm2.der root-sm2.pem self-sm2-cert.pem self-sm2-key.pem self-sm2-priv.pem server-sm2-cert.der server-sm2-cert.pem server-sm2-key.der server-sm2-key.pem server-sm2-priv.der server-sm2-priv.pem server-sm2.der server-sm2.pem
statickeys dh-ffdhe2048-params.pem dh-ffdhe2048-pub.der dh-ffdhe2048-pub.pem dh-ffdhe2048.der dh-ffdhe2048.pem ecc-secp256r1.der ecc-secp256r1.pem gen-static.sh include.am x25519-pub.der x25519-pub.pem x25519.der x25519.pem
test
expired expired-ca.der expired-ca.pem expired-cert.der expired-cert.pem
catalog.txt cert-bad-neg-int.der cert-bad-oid.der cert-bad-utf8.der cert-ext-ia.cfg cert-ext-ia.der cert-ext-ia.pem cert-ext-joi.cfg cert-ext-joi.der cert-ext-joi.pem cert-ext-mnc.der cert-ext-multiple.cfg cert-ext-multiple.der cert-ext-multiple.pem cert-ext-nc-combined.der cert-ext-nc-combined.pem cert-ext-nc.cfg cert-ext-nc.der cert-ext-nc.pem cert-ext-ncdns.der cert-ext-ncdns.pem cert-ext-ncip.der cert-ext-ncip.pem cert-ext-ncmixed.der cert-ext-ncmulti.der cert-ext-ncmulti.pem cert-ext-ncrid.der cert-ext-ncrid.pem cert-ext-nct.cfg cert-ext-nct.der cert-ext-nct.pem cert-ext-ndir-exc.cfg cert-ext-ndir-exc.der cert-ext-ndir-exc.pem cert-ext-ndir.cfg cert-ext-ndir.der cert-ext-ndir.pem cert-ext-ns.der cert-over-max-altnames.cfg cert-over-max-altnames.der cert-over-max-altnames.pem cert-over-max-nc.cfg cert-over-max-nc.der cert-over-max-nc.pem client-ecc-cert-ski.hex cn-ip-literal.der cn-ip-wildcard.der crit-cert.pem crit-key.pem dh1024.der dh1024.pem dh512.der dh512.pem digsigku.pem encrypteddata.msg gen-badsig.sh gen-ext-certs.sh gen-testcerts.sh include.am kari-keyid-cms.msg ktri-keyid-cms.msg ossl-trusted-cert.pem server-badaltname.der server-badaltname.pem server-badaltnull.der server-badaltnull.pem server-badcn.der server-badcn.pem server-badcnnull.der server-badcnnull.pem server-cert-ecc-badsig.der server-cert-ecc-badsig.pem server-cert-rsa-badsig.der server-cert-rsa-badsig.pem server-duplicate-policy.pem server-garbage.der server-garbage.pem server-goodalt.der server-goodalt.pem server-goodaltwild.der server-goodaltwild.pem server-goodcn.der server-goodcn.pem server-goodcnwild.der server-goodcnwild.pem server-localhost.der server-localhost.pem smime-test-canon.p7s smime-test-multipart-badsig.p7s smime-test-multipart.p7s smime-test.p7s
test-pathlen assemble-chains.sh chainA-ICA1-key.pem chainA-ICA1-pathlen0.pem chainA-assembled.pem chainA-entity-key.pem chainA-entity.pem chainB-ICA1-key.pem chainB-ICA1-pathlen0.pem chainB-ICA2-key.pem chainB-ICA2-pathlen1.pem chainB-assembled.pem chainB-entity-key.pem chainB-entity.pem chainC-ICA1-key.pem chainC-ICA1-pathlen1.pem chainC-assembled.pem chainC-entity-key.pem chainC-entity.pem chainD-ICA1-key.pem chainD-ICA1-pathlen127.pem chainD-assembled.pem chainD-entity-key.pem chainD-entity.pem chainE-ICA1-key.pem chainE-ICA1-pathlen128.pem chainE-assembled.pem chainE-entity-key.pem chainE-entity.pem chainF-ICA1-key.pem chainF-ICA1-pathlen1.pem chainF-ICA2-key.pem chainF-ICA2-pathlen0.pem chainF-assembled.pem chainF-entity-key.pem chainF-entity.pem chainG-ICA1-key.pem chainG-ICA1-pathlen0.pem chainG-ICA2-key.pem chainG-ICA2-pathlen1.pem chainG-ICA3-key.pem chainG-ICA3-pathlen99.pem chainG-ICA4-key.pem chainG-ICA4-pathlen5.pem chainG-ICA5-key.pem chainG-ICA5-pathlen20.pem chainG-ICA6-key.pem chainG-ICA6-pathlen10.pem chainG-ICA7-key.pem chainG-ICA7-pathlen100.pem chainG-assembled.pem chainG-entity-key.pem chainG-entity.pem chainH-ICA1-key.pem chainH-ICA1-pathlen0.pem chainH-ICA2-key.pem chainH-ICA2-pathlen2.pem chainH-ICA3-key.pem chainH-ICA3-pathlen2.pem chainH-ICA4-key.pem chainH-ICA4-pathlen2.pem chainH-assembled.pem chainH-entity-key.pem chainH-entity.pem chainI-ICA1-key.pem chainI-ICA1-no_pathlen.pem chainI-ICA2-key.pem chainI-ICA2-no_pathlen.pem chainI-ICA3-key.pem chainI-ICA3-pathlen2.pem chainI-assembled.pem chainI-entity-key.pem chainI-entity.pem chainJ-ICA1-key.pem chainJ-ICA1-no_pathlen.pem chainJ-ICA2-key.pem chainJ-ICA2-no_pathlen.pem chainJ-ICA3-key.pem chainJ-ICA3-no_pathlen.pem chainJ-ICA4-key.pem chainJ-ICA4-pathlen2.pem chainJ-assembled.pem chainJ-entity-key.pem chainJ-entity.pem include.am refreshkeys.sh
test-serial0 ee_normal.pem ee_serial0.pem generate_certs.sh include.am intermediate_serial0.pem root_serial0.pem root_serial0_key.pem selfsigned_nonca_serial0.pem
xmss bc_xmss_chain_ca.der bc_xmss_chain_leaf.der bc_xmss_sha2_10_256_root.der bc_xmss_sha2_16_256_root.der bc_xmssmt_sha2_20_2_256_root.der bc_xmssmt_sha2_20_4_256_root.der bc_xmssmt_sha2_40_8_256_root.der include.am
ca-cert-chain.der ca-cert.der ca-cert.pem ca-ecc-cert.der ca-ecc-cert.pem ca-ecc-key.der ca-ecc-key.pem ca-ecc384-cert.der ca-ecc384-cert.pem ca-ecc384-key.der ca-ecc384-key.pem ca-key-pkcs8-attribute.der ca-key.der ca-key.pem check_dates.sh client-absolute-urn.pem client-ca-cert.der client-ca-cert.pem client-ca.pem client-cert-ext.der client-cert-ext.pem client-cert.der client-cert.pem client-crl-dist.der client-crl-dist.pem client-ecc-ca-cert.der client-ecc-ca-cert.pem client-ecc-cert.der client-ecc-cert.pem client-ecc384-cert.der client-ecc384-cert.pem client-ecc384-key.der client-ecc384-key.pem client-key.der client-key.pem client-keyEnc.pem client-keyPub.der client-keyPub.pem client-relative-uri.pem client-uri-cert.pem csr.attr.der csr.dsa.der csr.dsa.pem csr.ext.der csr.signed.der dh-priv-2048.der dh-priv-2048.pem dh-pub-2048.der dh-pub-2048.pem dh-pubkey-2048.der dh2048.der dh2048.pem dh3072.der dh3072.pem dh4096.der dh4096.pem dsa-pubkey-2048.der dsa2048.der dsa2048.pem dsa3072.der dsaparams.der dsaparams.pem ecc-client-key.der ecc-client-key.pem ecc-client-keyPub.der ecc-client-keyPub.pem ecc-key-comp.pem ecc-keyPkcs8.der ecc-keyPkcs8.pem ecc-keyPkcs8Enc.der ecc-keyPkcs8Enc.pem ecc-keyPub.der ecc-keyPub.pem ecc-params.der ecc-params.pem ecc-privOnlyCert.pem ecc-privOnlyKey.pem ecc-privkey.der ecc-privkey.pem ecc-privkeyPkcs8.der ecc-privkeyPkcs8.pem ecc-rsa-server.p12 empty-issuer-cert.pem entity-no-ca-bool-cert.pem entity-no-ca-bool-key.pem fpki-cert.der fpki-certpol-cert.der gen_revoked.sh include.am renewcerts.sh rid-cert.der rsa-pub-2048.pem rsa2048.der rsa3072.der server-cert-chain.der server-cert.der server-cert.pem server-ecc-comp.der server-ecc-comp.pem server-ecc-rsa.der server-ecc-rsa.pem server-ecc-self.der server-ecc-self.pem server-ecc.der server-ecc.pem server-ecc384-cert.der server-ecc384-cert.pem server-ecc384-key.der server-ecc384-key.pem server-key.der server-key.pem server-keyEnc.pem server-keyPkcs8.der server-keyPkcs8.pem server-keyPkcs8Enc.der server-keyPkcs8Enc.pem server-keyPkcs8Enc12.pem server-keyPkcs8Enc2.pem server-keyPub.der server-keyPub.pem server-revoked-cert.pem server-revoked-key.pem taoCert.txt test-ber-exp02-05-2022.p7b test-degenerate.p7b test-multiple-recipients.p7b test-servercert-rc2.p12 test-servercert.p12 test-stream-dec.p7b test-stream-sign.p7b wolfssl-website-ca.pem x942dh2048.der x942dh2048.pem
cmake
consumer CMakeLists.txt README.md main.c
modules FindARIA.cmake FindOQS.cmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.in
debian
source format
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.in
doc
dox_comments
header_files aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h puf.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wc_she.h wc_slhdsa.h wolfio.h
header_files-ja aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wolfio.h
formats
html
html_changes
search search.css search.js
customdoxygen.css doxygen.css menu.js menudata.js tabs.css
Doxyfile footer.html header.html mainpage.dox
pdf Doxyfile header.tex
images wolfssl_logo.png
QUIC.md README.txt README_DOXYGEN check_api.sh generate_documentation.sh include.am
examples
asn1 asn1.c dumpasn1.cfg gen_oid_names.rb include.am oid_names.h
async Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.h
benchmark include.am tls_bench.c tls_bench.h
client client.c client.h client.sln client.vcproj client.vcxproj include.am
configs README.md include.am user_settings_EBSnet.h user_settings_all.h user_settings_arduino.h user_settings_baremetal.h user_settings_ca.h user_settings_curve25519nonblock.h user_settings_dtls13.h user_settings_eccnonblock.h user_settings_espressif.h user_settings_fipsv2.h user_settings_fipsv5.h user_settings_min_ecc.h user_settings_openssl_compat.h user_settings_pkcs7.h user_settings_platformio.h user_settings_pq.h user_settings_rsa_only.h user_settings_stm32.h user_settings_template.h user_settings_tls12.h user_settings_tls13.h user_settings_wolfboot_keytools.h user_settings_wolfssh.h user_settings_wolftpm.h
crypto_policies
default wolfssl.txt
future wolfssl.txt
legacy wolfssl.txt
echoclient echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quit
echoserver echoserver.c echoserver.h echoserver.sln echoserver.vcproj echoserver.vcxproj include.am
ocsp_responder include.am ocsp_responder.c ocsp_responder.h
pem include.am pem.c
sctp include.am sctp-client-dtls.c sctp-client.c sctp-server-dtls.c sctp-server.c
server include.am server.c server.h server.sln server.vcproj server.vcxproj
README.md include.am
linuxkm
patches
5.10.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v17.patch
5.10.236 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v236.patch
5.14.0-570.58.1.el9_6 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v14-570v58v1-el9_6.patch
5.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v15.patch
5.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17.patch
5.17-ubuntu-jammy-tegra WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17-ubuntu-jammy-tegra.patch
6.1.73 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v1v73.patch
6.12 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v12.patch
6.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v15.patch
7.0 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-7v0.patch
regen-patches.sh
Kbuild Makefile README.md get_thread_size.c include.am linuxkm-fips-hash-wrapper.sh linuxkm-fips-hash.c linuxkm_memory.c linuxkm_memory.h linuxkm_wc_port.h lkcapi_aes_glue.c lkcapi_dh_glue.c lkcapi_ecdh_glue.c lkcapi_ecdsa_glue.c lkcapi_glue.c lkcapi_rsa_glue.c lkcapi_sha_glue.c module_exports.c.template module_hooks.c pie_redirect_table.c wolfcrypt.lds x86_vector_register_glue.c
m4 ax_add_am_macro.m4 ax_am_jobserver.m4 ax_am_macros.m4 ax_append_compile_flags.m4 ax_append_flag.m4 ax_append_link_flags.m4 ax_append_to_file.m4 ax_atomic.m4 ax_bsdkm.m4 ax_check_compile_flag.m4 ax_check_link_flag.m4 ax_compiler_version.m4 ax_count_cpus.m4 ax_create_generic_config.m4 ax_debug.m4 ax_file_escapes.m4 ax_harden_compiler_flags.m4 ax_linuxkm.m4 ax_print_to_file.m4 ax_pthread.m4 ax_require_defined.m4 ax_tls.m4 ax_vcs_checkout.m4 hexversion.m4 lib_socket_nsl.m4 visibility.m4
mcapi
wolfcrypt_mcapi.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
zlib.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README crypto.c crypto.h include.am mcapi_test.c user_settings.h
mplabx
wolfcrypt_benchmark.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README benchmark_main.c include.am test_main.c user_settings.h
mqx
util_lib
Sources include.am util.c util.h
wolfcrypt_benchmark
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfcrypt_test
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfssl include.am
wolfssl_client
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfssl_client_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
README
rpm include.am spec.in
scripts
bench bench_functions.sh
aria-cmake-build-test.sh asn1_oid_sum.pl benchmark.test benchmark_compare.sh cleanup_testfiles.sh crl-gen-openssl.test crl-revoked.test dertoc.pl dtls.test dtlscid.test external.test google.test include.am makedistsmall.sh memtest.sh ocsp-responder-openssl-interop.test ocsp-stapling-with-ca-as-responder.test ocsp-stapling-with-wolfssl-responder.test ocsp-stapling.test ocsp-stapling2.test ocsp-stapling_tls13multi.test ocsp.test openssl.test openssl_srtp.test pem.test ping.test pkcallbacks.test psk.test resume.test rsapss.test sniffer-gen.sh sniffer-ipv6.pcap sniffer-static-rsa.pcap sniffer-testsuite.test sniffer-tls12-keylog.out sniffer-tls12-keylog.pcap sniffer-tls12-keylog.sslkeylog sniffer-tls13-dh-resume.pcap sniffer-tls13-dh.pcap sniffer-tls13-ecc-resume.pcap sniffer-tls13-ecc.pcap sniffer-tls13-hrr.pcap sniffer-tls13-keylog.out sniffer-tls13-keylog.pcap sniffer-tls13-keylog.sslkeylog sniffer-tls13-x25519-resume.pcap sniffer-tls13-x25519.pcap stm32l4-v4_0_1_build.sh tls13.test trusted_peer.test unit.test.in user_settings_asm.sh
src bio.c conf.c crl.c dtls.c dtls13.c include.am internal.c keys.c ocsp.c pk.c pk_ec.c pk_rsa.c quic.c sniffer.c ssl.c ssl_api_cert.c ssl_api_crl_ocsp.c ssl_api_pk.c ssl_asn1.c ssl_bn.c ssl_certman.c ssl_crypto.c ssl_ech.c ssl_load.c ssl_misc.c ssl_p7p12.c ssl_sess.c ssl_sk.c tls.c tls13.c wolfio.c x509.c x509_str.c
sslSniffer
sslSnifferTest README_WIN.md include.am snifftest.c sslSniffTest.vcproj sslSniffTest.vcxproj
README.md sslSniffer.vcproj sslSniffer.vcxproj
support gen-debug-trace-error-codes.sh include.am wolfssl.pc.in
tests
api api.h api_decl.h create_ocsp_test_blobs.py include.am test_aes.c test_aes.h test_arc4.c test_arc4.h test_ascon.c test_ascon.h test_ascon_kats.h test_asn.c test_asn.h test_blake2.c test_blake2.h test_camellia.c test_camellia.h test_certman.c test_certman.h test_chacha.c test_chacha.h test_chacha20_poly1305.c test_chacha20_poly1305.h test_cmac.c test_cmac.h test_curve25519.c test_curve25519.h test_curve448.c test_curve448.h test_des3.c test_des3.h test_dh.c test_dh.h test_digest.h test_dsa.c test_dsa.h test_dtls.c test_dtls.h test_ecc.c test_ecc.h test_ed25519.c test_ed25519.h test_ed448.c test_ed448.h test_evp.c test_evp.h test_evp_cipher.c test_evp_cipher.h test_evp_digest.c test_evp_digest.h test_evp_pkey.c test_evp_pkey.h test_hash.c test_hash.h test_hmac.c test_hmac.h test_md2.c test_md2.h test_md4.c test_md4.h test_md5.c test_md5.h test_mldsa.c test_mldsa.h test_mlkem.c test_mlkem.h test_ocsp.c test_ocsp.h test_ocsp_test_blobs.h test_ossl_asn1.c test_ossl_asn1.h test_ossl_bio.c test_ossl_bio.h test_ossl_bn.c test_ossl_bn.h test_ossl_cipher.c test_ossl_cipher.h test_ossl_dgst.c test_ossl_dgst.h test_ossl_dh.c test_ossl_dh.h test_ossl_dsa.c test_ossl_dsa.h test_ossl_ec.c test_ossl_ec.h test_ossl_ecx.c test_ossl_ecx.h test_ossl_mac.c test_ossl_mac.h test_ossl_obj.c test_ossl_obj.h test_ossl_p7p12.c test_ossl_p7p12.h test_ossl_pem.c test_ossl_pem.h test_ossl_rand.c test_ossl_rand.h test_ossl_rsa.c test_ossl_rsa.h test_ossl_sk.c test_ossl_sk.h test_ossl_x509.c test_ossl_x509.h test_ossl_x509_acert.c test_ossl_x509_acert.h test_ossl_x509_crypto.c test_ossl_x509_crypto.h test_ossl_x509_ext.c test_ossl_x509_ext.h test_ossl_x509_info.c test_ossl_x509_info.h test_ossl_x509_io.c test_ossl_x509_io.h test_ossl_x509_lu.c test_ossl_x509_lu.h test_ossl_x509_name.c test_ossl_x509_name.h test_ossl_x509_pk.c test_ossl_x509_pk.h test_ossl_x509_str.c test_ossl_x509_str.h test_ossl_x509_vp.c test_ossl_x509_vp.h test_pkcs12.c test_pkcs12.h test_pkcs7.c test_pkcs7.h test_poly1305.c test_poly1305.h test_random.c test_random.h test_rc2.c test_rc2.h test_ripemd.c test_ripemd.h test_rsa.c test_rsa.h test_sha.c test_sha.h test_sha256.c test_sha256.h test_sha3.c test_sha3.h test_sha512.c test_sha512.h test_she.c test_she.h test_signature.c test_signature.h test_slhdsa.c test_slhdsa.h test_sm2.c test_sm2.h test_sm3.c test_sm3.h test_sm4.c test_sm4.h test_tls.c test_tls.h test_tls13.c test_tls13.h test_tls_ext.c test_tls_ext.h test_wc_encrypt.c test_wc_encrypt.h test_wolfmath.c test_wolfmath.h test_x509.c test_x509.h
emnet
IP IP.h
Makefile emnet_nonblock_test.c emnet_shim.c
freertos-mem-track-repro FreeRTOS.h repro.c run.sh semphr.h task.h user_settings.h
swdev .gitignore Makefile README.md swdev.c swdev.h swdev_loader.c swdev_loader.h user_settings.h
CONF_FILES_README.md NCONF_test.cnf README TXT_DB.txt api.c include.am quic.c srp.c suites.c test-altchains.conf test-chains.conf test-dhprime.conf test-dtls-downgrade.conf test-dtls-fails-cipher.conf test-dtls-fails.conf test-dtls-group.conf test-dtls-mtu.conf test-dtls-reneg-client.conf test-dtls-reneg-server.conf test-dtls-resume.conf test-dtls-sha2.conf test-dtls-srtp-fails.conf test-dtls-srtp.conf test-dtls.conf test-dtls13-cid.conf test-dtls13-downgrade-fails.conf test-dtls13-downgrade.conf test-dtls13-pq-hybrid-extra-frag.conf test-dtls13-pq-hybrid-extra.conf test-dtls13-pq-hybrid-frag.conf test-dtls13-pq-standalone-frag.conf test-dtls13-pq-standalone.conf test-dtls13-psk.conf test-dtls13.conf test-ecc-cust-curves.conf test-ed25519.conf test-ed448.conf test-enckeys.conf test-fails.conf test-maxfrag-dtls.conf test-maxfrag.conf test-p521.conf test-psk-no-id-sha2.conf test-psk-no-id.conf test-psk.conf test-rsapss.conf test-sctp-sha2.conf test-sctp.conf test-sha2.conf test-sig.conf test-sm2.conf test-tls-downgrade.conf test-tls13-down.conf test-tls13-ecc.conf test-tls13-pq-hybrid-extra.conf test-tls13-pq-hybrid.conf test-tls13-pq-standalone.conf test-tls13-psk-certs.conf test-tls13-psk.conf test-tls13-slhdsa-fail.conf test-tls13-slhdsa-sha2.conf test-tls13-slhdsa-shake.conf test-tls13.conf test-trustpeer.conf test.conf unit.c unit.h utils.c utils.h w64wrapper.c
testsuite include.am testsuite.c testsuite.sln testsuite.vcproj testsuite.vcxproj utils.c utils.h
tirtos
packages
ti
net
wolfssl
tests
EK_TM4C1294XL
wolfcrypt
benchmark TM4C1294NC.icf benchmark.cfg main.c package.bld.hide package.xdc
test TM4C1294NC.icf main.c package.bld.hide package.xdc test.cfg
package.bld package.xdc package.xs
.gitignore README include.am products.mak wolfssl.bld wolfssl.mak
wolfcrypt
benchmark README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.am
src
port
Espressif
esp_crt_bundle README.md cacrt_all.pem cacrt_deprecated.pem cacrt_local.pem esp_crt_bundle.c gen_crt_bundle.py pio_install_cryptography.py
README.md esp32_aes.c esp32_mp.c esp32_sha.c esp32_util.c esp_sdk_mem_lib.c esp_sdk_time_lib.c esp_sdk_wifi_lib.c
Renesas README.md renesas_common.c renesas_fspsm_aes.c renesas_fspsm_rsa.c renesas_fspsm_sha.c renesas_fspsm_util.c renesas_rx64_hw_sha.c renesas_rx64_hw_util.c renesas_tsip_aes.c renesas_tsip_rsa.c renesas_tsip_sha.c renesas_tsip_util.c
af_alg afalg_aes.c afalg_hash.c wc_afalg.c
aria aria-crypt.c aria-cryptocb.c
arm armv8-32-aes-asm.S armv8-32-aes-asm_c.c armv8-32-chacha-asm.S armv8-32-chacha-asm_c.c armv8-32-curve25519.S armv8-32-curve25519_c.c armv8-32-mlkem-asm.S armv8-32-mlkem-asm_c.c armv8-32-poly1305-asm.S armv8-32-poly1305-asm_c.c armv8-32-sha256-asm.S armv8-32-sha256-asm_c.c armv8-32-sha3-asm.S armv8-32-sha3-asm_c.c armv8-32-sha512-asm.S armv8-32-sha512-asm_c.c armv8-aes-asm.S armv8-aes-asm_c.c armv8-aes.c armv8-chacha-asm.S armv8-chacha-asm_c.c armv8-curve25519.S armv8-curve25519_c.c armv8-mlkem-asm.S armv8-mlkem-asm_c.c armv8-poly1305-asm.S armv8-poly1305-asm_c.c armv8-sha256-asm.S armv8-sha256-asm_c.c armv8-sha256.c armv8-sha3-asm.S armv8-sha3-asm_c.c armv8-sha512-asm.S armv8-sha512-asm_c.c armv8-sha512.c cryptoCell.c cryptoCellHash.c thumb2-aes-asm.S thumb2-aes-asm_c.c thumb2-chacha-asm.S thumb2-chacha-asm_c.c thumb2-curve25519.S thumb2-curve25519_c.c thumb2-mlkem-asm.S thumb2-mlkem-asm_c.c thumb2-poly1305-asm.S thumb2-poly1305-asm_c.c thumb2-sha256-asm.S thumb2-sha256-asm_c.c thumb2-sha3-asm.S thumb2-sha3-asm_c.c thumb2-sha512-asm.S thumb2-sha512-asm_c.c
atmel README.md atmel.c
autosar README.md cryif.c crypto.c csm.c include.am test.c
caam README.md caam_aes.c caam_doc.pdf caam_driver.c caam_error.c caam_integrity.c caam_qnx.c caam_sha.c wolfcaam_aes.c wolfcaam_cmac.c wolfcaam_ecdsa.c wolfcaam_fsl_nxp.c wolfcaam_hash.c wolfcaam_hmac.c wolfcaam_init.c wolfcaam_qnx.c wolfcaam_rsa.c wolfcaam_seco.c wolfcaam_x25519.c
cavium README.md README_Octeon.md cavium_nitrox.c cavium_octeon_sync.c
cuda README.md aes-cuda.cu
cypress README.md psoc6_crypto.c
devcrypto README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.c
intel README.md quickassist.c quickassist_mem.c quickassist_sync.c
iotsafe iotsafe.c
kcapi README.md kcapi_aes.c kcapi_dh.c kcapi_ecc.c kcapi_hash.c kcapi_hmac.c kcapi_rsa.c
liboqs liboqs.c
maxim README.md max3266x.c maxq10xx.c
mynewt mynewt_port.c
nxp README.md README_SE050.md casper_port.c dcp_port.c hashcrypt_port.c ksdk_port.c se050_port.c
pic32 pic32mz-crypt.c
ppc32 ppc32-sha256-asm.S ppc32-sha256-asm_c.c ppc32-sha256-asm_cr.c
psa README.md psa.c psa_aes.c psa_hash.c psa_pkcbs.c
riscv riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.c
rpi_pico README.md pico.c
silabs README.md silabs_aes.c silabs_ecc.c silabs_hash.c silabs_random.c
st README.md STM32MP13.md STM32MP25.md stm32.c stsafe.c
ti ti-aes.c ti-ccm.c ti-des3.c ti-hash.c
tropicsquare README.md tropic01.c
xilinx xil-aesgcm.c xil-sha3.c xil-versal-glue.c xil-versal-trng.c
nrf51.c
ASN_TEMPLATE.md aes.c aes_asm.S aes_asm.asm aes_gcm_asm.S aes_gcm_asm.asm aes_gcm_x86_asm.S aes_xts_asm.S aes_xts_asm.asm arc4.c ascon.c asm.c asn.c asn_orig.c async.c blake2b.c blake2s.c camellia.c chacha.c chacha20_poly1305.c chacha_asm.S chacha_asm.asm cmac.c coding.c compress.c cpuid.c cryptocb.c curve25519.c curve448.c des3.c dh.c dilithium.c dsa.c ecc.c ecc_fp.c eccsi.c ed25519.c ed448.c error.c evp.c evp_pk.c falcon.c fe_448.c fe_low_mem.c fe_operations.c fe_x25519_128.h fe_x25519_asm.S fp_mont_small.i fp_mul_comba_12.i fp_mul_comba_17.i fp_mul_comba_20.i fp_mul_comba_24.i fp_mul_comba_28.i fp_mul_comba_3.i fp_mul_comba_32.i fp_mul_comba_4.i fp_mul_comba_48.i fp_mul_comba_6.i fp_mul_comba_64.i fp_mul_comba_7.i fp_mul_comba_8.i fp_mul_comba_9.i fp_mul_comba_small_set.i fp_sqr_comba_12.i fp_sqr_comba_17.i fp_sqr_comba_20.i fp_sqr_comba_24.i fp_sqr_comba_28.i fp_sqr_comba_3.i fp_sqr_comba_32.i fp_sqr_comba_4.i fp_sqr_comba_48.i fp_sqr_comba_6.i fp_sqr_comba_64.i fp_sqr_comba_7.i fp_sqr_comba_8.i fp_sqr_comba_9.i fp_sqr_comba_small_set.i ge_448.c ge_low_mem.c ge_operations.c hash.c hmac.c hpke.c include.am integer.c kdf.c logging.c md2.c md4.c md5.c memory.c misc.c pkcs12.c pkcs7.c poly1305.c poly1305_asm.S poly1305_asm.asm puf.c pwdbased.c random.c rc2.c ripemd.c rng_bank.c rsa.c sakke.c sha.c sha256.c sha256_asm.S sha3.c sha3_asm.S sha512.c sha512_asm.S signature.c siphash.c sm2.c sm3.c sm3_asm.S sm4.c sp_arm32.c sp_arm64.c sp_armthumb.c sp_c32.c sp_c64.c sp_cortexm.c sp_dsp32.c sp_int.c sp_sm2_arm32.c sp_sm2_arm64.c sp_sm2_armthumb.c sp_sm2_c32.c sp_sm2_c64.c sp_sm2_cortexm.c sp_sm2_x86_64.c sp_sm2_x86_64_asm.S sp_x86_64.c sp_x86_64_asm.S sp_x86_64_asm.asm srp.c tfm.c wc_dsp.c wc_encrypt.c wc_lms.c wc_lms_impl.c wc_mldsa_asm.S wc_mlkem.c wc_mlkem_asm.S wc_mlkem_poly.c wc_pkcs11.c wc_port.c wc_she.c wc_slhdsa.c wc_xmss.c wc_xmss_impl.c wolfentropy.c wolfevent.c wolfmath.c
test README.md include.am test-VS2022.sln test-VS2022.vcxproj test-VS2022.vcxproj.user test.c test.h test.sln test.vcproj test_paths.h.in
wolfssl
openssl aes.h asn1.h asn1t.h bio.h bn.h buffer.h camellia.h cmac.h cms.h compat_types.h conf.h crypto.h des.h dh.h dsa.h ec.h ec25519.h ec448.h ecdh.h ecdsa.h ed25519.h ed448.h engine.h err.h evp.h fips_rand.h hmac.h include.am kdf.h lhash.h md4.h md5.h modes.h obj_mac.h objects.h ocsp.h opensslconf.h opensslv.h ossl_typ.h pem.h pkcs12.h pkcs7.h rand.h rc4.h ripemd.h rsa.h safestack.h sha.h sha3.h srp.h ssl.h ssl23.h stack.h tls1.h txt_db.h ui.h x509.h x509_vfy.h x509v3.h
wolfcrypt
port
Espressif esp-sdk-lib.h esp32-crypt.h esp_crt_bundle.h
Renesas renesas-fspsm-crypt.h renesas-fspsm-types.h renesas-rx64-hw-crypt.h renesas-tsip-crypt.h renesas_cmn.h renesas_fspsm_internal.h renesas_sync.h renesas_tsip_internal.h renesas_tsip_types.h
af_alg afalg_hash.h wc_afalg.h
aria aria-crypt.h aria-cryptocb.h
arm cryptoCell.h
atmel atmel.h
autosar CryIf.h Crypto.h Csm.h StandardTypes.h
caam caam_driver.h caam_error.h caam_qnx.h wolfcaam.h wolfcaam_aes.h wolfcaam_cmac.h wolfcaam_ecdsa.h wolfcaam_fsl_nxp.h wolfcaam_hash.h wolfcaam_qnx.h wolfcaam_rsa.h wolfcaam_seco.h wolfcaam_sha.h wolfcaam_x25519.h
cavium cavium_nitrox.h cavium_octeon_sync.h
cypress psoc6_crypto.h
devcrypto wc_devcrypto.h
intel quickassist.h quickassist_mem.h quickassist_sync.h
iotsafe iotsafe.h
kcapi kcapi_dh.h kcapi_ecc.h kcapi_hash.h kcapi_hmac.h kcapi_rsa.h wc_kcapi.h
liboqs liboqs.h
maxim max3266x-cryptocb.h max3266x.h maxq10xx.h
nxp casper_port.h dcp_port.h hashcrypt_port.h ksdk_port.h se050_port.h
pic32 pic32mz-crypt.h
psa psa.h
riscv riscv-64-asm.h
rpi_pico pico.h
silabs silabs_aes.h silabs_ecc.h silabs_hash.h silabs_random.h
st stm32.h stsafe.h
ti ti-ccm.h ti-hash.h
tropicsquare tropic01.h
xilinx xil-sha3.h xil-versal-glue.h xil-versal-trng.h
nrf51.h
aes.h arc4.h ascon.h asn.h asn_public.h async.h blake2-impl.h blake2-int.h blake2.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cpuid.h cryptocb.h curve25519.h curve448.h des3.h dh.h dilithium.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h falcon.h fe_448.h fe_operations.h fips_test.h ge_448.h ge_operations.h hash.h hmac.h hpke.h include.am integer.h kdf.h libwolfssl_sources.h libwolfssl_sources_asm.h logging.h md2.h md4.h md5.h mem_track.h memory.h misc.h mpi_class.h mpi_superclass.h oid_sum.h pkcs11.h pkcs12.h pkcs7.h poly1305.h puf.h pwdbased.h random.h rc2.h ripemd.h rng_bank.h rsa.h sakke.h selftest.h settings.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h sm2.h sm3.h sm4.h sp.h sp_int.h srp.h tfm.h types.h visibility.h wc_encrypt.h wc_lms.h wc_mlkem.h wc_pkcs11.h wc_port.h wc_she.h wc_slhdsa.h wc_xmss.h wolfentropy.h wolfevent.h wolfmath.h
callbacks.h certs_test.h certs_test_sm.h crl.h error-ssl.h include.am internal.h ocsp.h options.h.in quic.h sniffer.h sniffer_error.h sniffer_error.rc ssl.h test.h version.h version.h.in wolfio.h
wrapper
Ada
examples
src aes_verify_main.adb rsa_verify_main.adb sha256_main.adb spark_sockets.adb spark_sockets.ads spark_terminal.adb spark_terminal.ads tls_client.adb tls_client.ads tls_client_main.adb tls_server.adb tls_server.ads tls_server_main.adb
.gitignore alire.toml examples.gpr
tests
src
support test_support.adb test_support.ads tests_root_suite.adb tests_root_suite.ads
aes_bindings_tests.adb aes_bindings_tests.ads rsa_verify_bindings_tests.adb rsa_verify_bindings_tests.ads sha256_bindings_tests.adb sha256_bindings_tests.ads tests.adb
.gitignore README.md alire.toml tests.gpr valgrind.supp
.gitignore README.md ada_binding.c alire.toml default.gpr include.am restricted.adc user_settings.h wolfssl-full_runtime.adb wolfssl-full_runtime.ads wolfssl.adb wolfssl.ads wolfssl.gpr
CSharp
wolfCrypt-Test
Properties AssemblyInfo.cs
App.config wolfCrypt-Test.cs wolfCrypt-Test.csproj
wolfSSL-DTLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-PSK-Server.cs wolfSSL-DTLS-PSK-Server.csproj
wolfSSL-DTLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-Server.cs wolfSSL-DTLS-Server.csproj
wolfSSL-Example-IOCallbacks
Properties AssemblyInfo.cs
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csproj
wolfSSL-TLS-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Client.cs wolfSSL-TLS-Client.csproj
wolfSSL-TLS-PSK-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Client.cs wolfSSL-TLS-PSK-Client.csproj
wolfSSL-TLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Server.cs wolfSSL-TLS-PSK-Server.csproj
wolfSSL-TLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Server.cs wolfSSL-TLS-Server.csproj
wolfSSL-TLS-ServerThreaded
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csproj
wolfSSL_CSharp
Properties AssemblyInfo.cs Resources.Designer.cs Resources.resx
X509.cs wolfCrypt.cs wolfSSL.cs wolfSSL_CSharp.csproj
README.md include.am user_settings.h wolfSSL_CSharp.sln wolfssl.vcxproj
python README.md
rust
wolfssl-wolfcrypt
src aes.rs blake2.rs chacha20_poly1305.rs cmac.rs cmac_mac.rs curve25519.rs dh.rs dilithium.rs ecc.rs ecdsa.rs ed25519.rs ed448.rs fips.rs hkdf.rs hmac.rs hmac_mac.rs kdf.rs lib.rs lms.rs mlkem.rs mlkem_kem.rs pbkdf2_password_hash.rs prf.rs random.rs rsa.rs rsa_pkcs1v15.rs sha.rs sha_digest.rs sys.rs
tests
common mod.rs
test_aes.rs test_blake2.rs test_chacha20_poly1305.rs test_cmac.rs test_cmac_mac.rs test_curve25519.rs test_dh.rs test_dilithium.rs test_ecc.rs test_ecdsa.rs test_ed25519.rs test_ed448.rs test_hkdf.rs test_hmac.rs test_hmac_mac.rs test_kdf.rs test_lms.rs test_mlkem.rs test_mlkem_kem.rs test_pbkdf2_password_hash.rs test_prf.rs test_random.rs test_rsa.rs test_rsa_pkcs1v15.rs test_sha.rs test_sha_digest.rs test_wolfcrypt.rs
CHANGELOG.md Cargo.lock Cargo.toml Makefile README.md build.rs headers.h
Makefile README.md include.am
include.am
zephyr
samples
wolfssl_benchmark
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_test
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_sock
boards native_sim.conf
src tls_sock.c
CMakeLists.txt README install_sample.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_thread
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
src tls_threaded.c
CMakeLists.txt README install_sample.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl options.h
CMakeLists.txt Kconfig Kconfig.tls-generic README.md include.am module.yml user_settings-no-malloc.h user_settings.h zephyr_init.c
.codespellexcludelines .cyignore .editorconfig .gitignore .wolfssl_known_macro_extras AUTHORS CMakeLists.txt CMakePresets.json CMakeSettings.json COPYING ChangeLog.md INSTALL LICENSING LPCExpresso.cproject LPCExpresso.project Makefile.am README README-async.md README.md SCRIPTS-LIST SECURITY-POLICY.md SECURITY-REPORT-TEMPLATE.md Vagrantfile autogen.sh commit-tests.sh configure.ac fips-check.sh fips-hash.sh gencertbuf.pl input pull_to_vagrant.sh quit resource.h stamp-h.in valgrind-bash.supp valgrind-error.sh wnr-example.conf wolfssl-VS2022.vcxproj wolfssl.rc wolfssl.vcproj wolfssl.vcxproj wolfssl64.sln
.clangd .gitignore DOCS.md Makefile README.md assert.c core.c crypto.c env.c fs.c http.c ini.c json.c log.c luna.h main.c makext.mk path.c process.c request.c sqlite.c stash.c template.c util.c
luajit/src/vm_x64.dasc raw
   1|// Low-level VM code for x64 CPUs in LJ_GC64 mode.
   2|// Bytecode interpreter, fast functions and helper functions.
   3|// Copyright (C) 2005-2026 Mike Pall. See Copyright Notice in luajit.h
   4|
   5|.arch x64
   6|.section code_op, code_sub
   7|
   8|.actionlist build_actionlist
   9|.globals GLOB_
  10|.globalnames globnames
  11|.externnames extnames
  12|
  13|//-----------------------------------------------------------------------
  14|
  15|.if WIN
  16|.define X64WIN, 1			// Windows/x64 calling conventions.
  17|.endif
  18|
  19|// Fixed register assignments for the interpreter.
  20|// This is very fragile and has many dependencies. Caveat emptor.
  21|.define BASE,		rdx		// Not C callee-save, refetched anyway.
  22|.if X64WIN
  23|.define KBASE,		rdi		// Must be C callee-save.
  24|.define PC,		rsi		// Must be C callee-save.
  25|.define DISPATCH,	rbx		// Must be C callee-save.
  26|.define KBASEd,	edi
  27|.define PCd,		esi
  28|.define DISPATCHd,	ebx
  29|.else
  30|.define KBASE,		r15		// Must be C callee-save.
  31|.define PC,		rbx		// Must be C callee-save.
  32|.define DISPATCH,	r14		// Must be C callee-save.
  33|.define KBASEd,	r15d
  34|.define PCd,		ebx
  35|.define DISPATCHd,	r14d
  36|.endif
  37|
  38|.define RA,		rcx
  39|.define RAd,		ecx
  40|.define RAH,		ch
  41|.define RAL,		cl
  42|.define RB,		rbp		// Must be rbp (C callee-save).
  43|.define RBd,		ebp
  44|.define RC,		rax		// Must be rax.
  45|.define RCd,		eax
  46|.define RCW,		ax
  47|.define RCH,		ah
  48|.define RCL,		al
  49|.define OP,		RBd
  50|.define RD,		RC
  51|.define RDd,		RCd
  52|.define RDW,		RCW
  53|.define RDL,		RCL
  54|.define TMPR,		r10
  55|.define TMPRd,		r10d
  56|.define ITYPE,		r11
  57|.define ITYPEd,	r11d
  58|
  59|.if X64WIN
  60|.define CARG1,		rcx		// x64/WIN64 C call arguments.
  61|.define CARG2,		rdx
  62|.define CARG3,		r8
  63|.define CARG4,		r9
  64|.define CARG1d,	ecx
  65|.define CARG2d,	edx
  66|.define CARG3d,	r8d
  67|.define CARG4d,	r9d
  68|.else
  69|.define CARG1,		rdi		// x64/POSIX C call arguments.
  70|.define CARG2,		rsi
  71|.define CARG3,		rdx
  72|.define CARG4,		rcx
  73|.define CARG5,		r8
  74|.define CARG6,		r9
  75|.define CARG1d,	edi
  76|.define CARG2d,	esi
  77|.define CARG3d,	edx
  78|.define CARG4d,	ecx
  79|.define CARG5d,	r8d
  80|.define CARG6d,	r9d
  81|.endif
  82|
  83|// Type definitions. Some of these are only used for documentation.
  84|.type L,		lua_State
  85|.type GL,		global_State
  86|.type TVALUE,		TValue
  87|.type GCOBJ,		GCobj
  88|.type STR,		GCstr
  89|.type TAB,		GCtab
  90|.type LFUNC,		GCfuncL
  91|.type CFUNC,		GCfuncC
  92|.type PROTO,		GCproto
  93|.type UPVAL,		GCupval
  94|.type NODE,		Node
  95|.type NARGS,		int
  96|.type TRACE,		GCtrace
  97|.type SBUF,		SBuf
  98|
  99|// Stack layout while in interpreter. Must match with lj_frame.h.
 100|//-----------------------------------------------------------------------
 101|.if X64WIN		// x64/Windows stack layout
 102|
 103|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).
 104|.macro saveregs_
 105|  push rdi; push rsi; push rbx
 106|  sub rsp, CFRAME_SPACE
 107|.endmacro
 108|.macro saveregs
 109|  push rbp; saveregs_
 110|.endmacro
 111|.macro restoreregs
 112|  add rsp, CFRAME_SPACE
 113|  pop rbx; pop rsi; pop rdi; pop rbp
 114|.endmacro
 115|
 116|.define SAVE_CFRAME,	aword [rsp+aword*13]
 117|.define SAVE_PC,	aword [rsp+aword*12]
 118|.define SAVE_L,	aword [rsp+aword*11]
 119|.define SAVE_ERRF,	dword [rsp+dword*21]
 120|.define SAVE_NRES,	dword [rsp+dword*20]
 121|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter
 122|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.
 123|.define SAVE_R4,	aword [rsp+aword*8]
 124|.define SAVE_R3,	aword [rsp+aword*7]
 125|.define SAVE_R2,	aword [rsp+aword*6]
 126|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.
 127|.define ARG5,		aword [rsp+aword*4]
 128|.define CSAVE_4,	aword [rsp+aword*3]
 129|.define CSAVE_3,	aword [rsp+aword*2]
 130|.define CSAVE_2,	aword [rsp+aword*1]
 131|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.
 132|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee
 133|
 134|.define ARG5d,		dword [rsp+dword*8]
 135|.define TMP1,		ARG5			// TMP1 overlaps ARG5
 136|.define TMP1d,		ARG5d
 137|.define TMP1hi,	dword [rsp+dword*9]
 138|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.
 139|
 140|//-----------------------------------------------------------------------
 141|.else			// x64/POSIX stack layout
 142|
 143|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).
 144|.macro saveregs_
 145|  push rbx; push r15; push r14
 146|.if NO_UNWIND
 147|  push r13; push r12
 148|.endif
 149|  sub rsp, CFRAME_SPACE
 150|.endmacro
 151|.macro saveregs
 152|  push rbp; saveregs_
 153|.endmacro
 154|.macro restoreregs
 155|  add rsp, CFRAME_SPACE
 156|.if NO_UNWIND
 157|  pop r12; pop r13
 158|.endif
 159|  pop r14; pop r15; pop rbx; pop rbp
 160|.endmacro
 161|
 162|//----- 16 byte aligned,
 163|.if NO_UNWIND
 164|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.
 165|.define SAVE_R4,	aword [rsp+aword*10]
 166|.define SAVE_R3,	aword [rsp+aword*9]
 167|.define SAVE_R2,	aword [rsp+aword*8]
 168|.define SAVE_R1,	aword [rsp+aword*7]
 169|.define SAVE_RU2,	aword [rsp+aword*6]
 170|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.
 171|.else
 172|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.
 173|.define SAVE_R4,	aword [rsp+aword*8]
 174|.define SAVE_R3,	aword [rsp+aword*7]
 175|.define SAVE_R2,	aword [rsp+aword*6]
 176|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.
 177|.endif
 178|.define SAVE_CFRAME,	aword [rsp+aword*4]
 179|.define SAVE_PC,	aword [rsp+aword*3]
 180|.define SAVE_L,	aword [rsp+aword*2]
 181|.define SAVE_ERRF,	dword [rsp+dword*3]
 182|.define SAVE_NRES,	dword [rsp+dword*2]
 183|.define TMP1,		aword [rsp]		//<-- rsp while in interpreter.
 184|//----- 16 byte aligned
 185|
 186|.define TMP1d,		dword [rsp]
 187|.define TMP1hi,	dword [rsp+dword*1]
 188|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.
 189|
 190|.endif
 191|
 192|//-- Control-Flow Enforcement Technique (CET) ---------------------------
 193|
 194|.if BRANCH_TRACK
 195|.macro endbr; endbr64; .endmacro
 196|.else
 197|.macro endbr; .endmacro
 198|.endif
 199|
 200|//-----------------------------------------------------------------------
 201|
 202|// Instruction headers.
 203|.macro ins_A; .endmacro
 204|.macro ins_AD; .endmacro
 205|.macro ins_AJ; .endmacro
 206|.macro ins_ABC; movzx RBd, RCH; movzx RCd, RCL; .endmacro
 207|.macro ins_AB_; movzx RBd, RCH; .endmacro
 208|.macro ins_A_C; movzx RCd, RCL; .endmacro
 209|.macro ins_AND; not RD; .endmacro
 210|
 211|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).
 212|.macro ins_NEXT
 213|  mov RCd, [PC]
 214|  movzx RAd, RCH
 215|  movzx OP, RCL
 216|  add PC, 4
 217|  shr RCd, 16
 218|  jmp aword [DISPATCH+OP*8]
 219|.endmacro
 220|
 221|// Instruction footer.
 222|.if 1
 223|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.
 224|  .define ins_next, ins_NEXT
 225|  .define ins_next_, ins_NEXT
 226|.else
 227|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.
 228|  // Affects only certain kinds of benchmarks (and only with -j off).
 229|  // Around 10%-30% slower on Core2, a lot more slower on P4.
 230|  .macro ins_next
 231|    jmp ->ins_next
 232|  .endmacro
 233|  .macro ins_next_
 234|  ->ins_next:
 235|    ins_NEXT
 236|  .endmacro
 237|.endif
 238|
 239|// Call decode and dispatch.
 240|.macro ins_callt
 241|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-8] = PC
 242|  mov PC, LFUNC:RB->pc
 243|  mov RAd, [PC]
 244|  movzx OP, RAL
 245|  movzx RAd, RAH
 246|  add PC, 4
 247|  jmp aword [DISPATCH+OP*8]
 248|.endmacro
 249|
 250|.macro ins_call
 251|  // BASE = new base, RB = LFUNC, RD = nargs+1
 252|  mov [BASE-8], PC
 253|  ins_callt
 254|.endmacro
 255|
 256|//-----------------------------------------------------------------------
 257|
 258|// Macros to clear or set tags.
 259|.macro cleartp, reg; shl reg, 17; shr reg, 17; .endmacro
 260|.macro settp, reg, tp
 261|  mov64 ITYPE, ((uint64_t)tp<<47)
 262|  or reg, ITYPE
 263|.endmacro
 264|.macro settp, dst, reg, tp
 265|  mov64 dst, ((uint64_t)tp<<47)
 266|  or dst, reg
 267|.endmacro
 268|.macro setint, reg
 269|  settp reg, LJ_TISNUM
 270|.endmacro
 271|.macro setint, dst, reg
 272|  settp dst, reg, LJ_TISNUM
 273|.endmacro
 274|
 275|// Macros to test operand types.
 276|.macro checktp_nc, reg, tp, target
 277|  mov ITYPE, reg
 278|  sar ITYPE, 47
 279|  cmp ITYPEd, tp
 280|  jne target
 281|.endmacro
 282|.macro checktp, reg, tp, target
 283|  mov ITYPE, reg
 284|  cleartp reg
 285|  sar ITYPE, 47
 286|  cmp ITYPEd, tp
 287|  jne target
 288|.endmacro
 289|.macro checktptp, src, tp, target
 290|  mov ITYPE, src
 291|  sar ITYPE, 47
 292|  cmp ITYPEd, tp
 293|  jne target
 294|.endmacro
 295|.macro checkstr, reg, target; checktp reg, LJ_TSTR, target; .endmacro
 296|.macro checktab, reg, target; checktp reg, LJ_TTAB, target; .endmacro
 297|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC, target; .endmacro
 298|
 299|.macro checknumx, reg, target, jump
 300|  mov ITYPE, reg
 301|  sar ITYPE, 47
 302|  cmp ITYPEd, LJ_TISNUM
 303|  jump target
 304|.endmacro
 305|.macro checkint, reg, target; checknumx reg, target, jne; .endmacro
 306|.macro checkinttp, src, target; checknumx src, target, jne; .endmacro
 307|.macro checknum, reg, target; checknumx reg, target, jae; .endmacro
 308|.macro checknumtp, src, target; checknumx src, target, jae; .endmacro
 309|.macro checknumber, src, target; checknumx src, target, ja; .endmacro
 310|
 311|.macro mov_false, reg; mov64 reg, (int64_t)~((uint64_t)1<<47); .endmacro
 312|.macro mov_true, reg; mov64 reg, (int64_t)~((uint64_t)2<<47); .endmacro
 313|
 314|// These operands must be used with movzx.
 315|.define PC_OP, byte [PC-4]
 316|.define PC_RA, byte [PC-3]
 317|.define PC_RB, byte [PC-1]
 318|.define PC_RC, byte [PC-2]
 319|.define PC_RD, word [PC-2]
 320|
 321|.macro branchPC, reg
 322|  lea PC, [PC+reg*4-BCBIAS_J*4]
 323|.endmacro
 324|
 325|// Assumes DISPATCH is relative to GL.
 326#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))
 327#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))
 328|
 329#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
 330|
 331|// Decrement hashed hotcount and trigger trace recorder if zero.
 332|.macro hotloop, reg
 333|  mov reg, PCd
 334|  shr reg, 1
 335|  and reg, HOTCOUNT_PCMASK
 336|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP
 337|  jb ->vm_hotloop
 338|.endmacro
 339|
 340|.macro hotcall, reg
 341|  mov reg, PCd
 342|  shr reg, 1
 343|  and reg, HOTCOUNT_PCMASK
 344|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL
 345|  jb ->vm_hotcall
 346|.endmacro
 347|
 348|// Set current VM state.
 349|.macro set_vmstate, st
 350|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st
 351|.endmacro
 352|
 353|.macro fpop1; fstp st1; .endmacro
 354|
 355|// Synthesize SSE FP constants.
 356|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.
 357|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp
 358|.endmacro
 359|
 360|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.
 361|  mov64 tmp, U64x(val,00000000); movd reg, tmp
 362|.endmacro
 363|
 364|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.
 365|  sseconst_hi reg, tmp, 80000000
 366|.endmacro
 367|.macro sseconst_1, reg, tmp		// Synthesize 1.0.
 368|  sseconst_hi reg, tmp, 3ff00000
 369|.endmacro
 370|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.
 371|  sseconst_hi reg, tmp, 43300000
 372|.endmacro
 373|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.
 374|  sseconst_hi reg, tmp, 43380000
 375|.endmacro
 376|
 377|// Move table write barrier back. Overwrites reg.
 378|.macro barrierback, tab, reg
 379|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)
 380|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)]
 381|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab
 382|  mov tab->gclist, reg
 383|.endmacro
 384|
 385|//-----------------------------------------------------------------------
 386
 387/* Generate subroutines used by opcodes and other parts of the VM. */
 388/* The .code_sub section should be last to help static branch prediction. */
 389static void build_subroutines(BuildCtx *ctx)
 390{
 391  |.code_sub
 392  |
 393  |//-----------------------------------------------------------------------
 394  |//-- Return handling ----------------------------------------------------
 395  |//-----------------------------------------------------------------------
 396  |
 397  |->vm_returnp:
 398  |  test PCd, FRAME_P
 399  |  jz ->cont_dispatch
 400  |
 401  |  // Return from pcall or xpcall fast func.
 402  |  and PC, -8
 403  |  sub BASE, PC			// Restore caller base.
 404  |  lea RA, [RA+PC-8]			// Rebase RA and prepend one result.
 405  |  mov PC, [BASE-8]			// Fetch PC of previous frame.
 406  |  // Prepending may overwrite the pcall frame, so do it at the end.
 407  |  mov_true ITYPE
 408  |  mov aword [BASE+RA], ITYPE		// Prepend true to results.
 409  |
 410  |->vm_returnc:
 411  |  add RDd, 1				// RD = nresults+1
 412  |  jz ->vm_unwind_yield
 413  |  mov MULTRES, RDd
 414  |  test PC, FRAME_TYPE
 415  |  jz ->BC_RET_Z			// Handle regular return to Lua.
 416  |
 417  |->vm_return:
 418  |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return
 419  |  xor PC, FRAME_C
 420  |  test PCd, FRAME_TYPE
 421  |  jnz ->vm_returnp
 422  |
 423  |  // Return to C.
 424  |  set_vmstate C
 425  |  and PC, -8
 426  |  sub PC, BASE
 427  |  neg PC				// Previous base = BASE - delta.
 428  |
 429  |  sub RDd, 1
 430  |  jz >2
 431  |1:  // Move results down.
 432  |  mov RB, [BASE+RA]
 433  |  mov [BASE-16], RB
 434  |  add BASE, 8
 435  |  sub RDd, 1
 436  |  jnz <1
 437  |2:
 438  |  mov L:RB, SAVE_L
 439  |  mov L:RB->base, PC
 440  |3:
 441  |  mov RDd, MULTRES
 442  |  mov RAd, SAVE_NRES			// RA = wanted nresults+1
 443  |4:
 444  |  cmp RAd, RDd
 445  |  jne >6				// More/less results wanted?
 446  |5:
 447  |  sub BASE, 16
 448  |  mov L:RB->top, BASE
 449  |
 450  |->vm_leave_cp:
 451  |  mov RA, SAVE_CFRAME		// Restore previous C frame.
 452  |  mov L:RB->cframe, RA
 453  |  xor eax, eax			// Ok return status for vm_pcall.
 454  |
 455  |->vm_leave_unw:
 456  |  restoreregs
 457  |  ret
 458  |
 459  |6:
 460  |  jb >7				// Less results wanted?
 461  |  // More results wanted. Check stack size and fill up results with nil.
 462  |  cmp BASE, L:RB->maxstack
 463  |  ja >8
 464  |  mov aword [BASE-16], LJ_TNIL
 465  |  add BASE, 8
 466  |  add RDd, 1
 467  |  jmp <4
 468  |
 469  |7:  // Less results wanted.
 470  |  test RAd, RAd
 471  |  jz <5				// But check for LUA_MULTRET+1.
 472  |  sub RA, RD				// Negative result!
 473  |  lea BASE, [BASE+RA*8]		// Correct top.
 474  |  jmp <5
 475  |
 476  |8:  // Corner case: need to grow stack for filling up results.
 477  |  // This can happen if:
 478  |  // - A C function grows the stack (a lot).
 479  |  // - The GC shrinks the stack in between.
 480  |  // - A return back from a lua_call() with (high) nresults adjustment.
 481  |  mov L:RB->top, BASE		// Save current top held in BASE (yes).
 482  |  mov MULTRES, RDd			// Need to fill only remainder with nil.
 483  |  mov CARG2d, RAd
 484  |  mov CARG1, L:RB
 485  |  call extern lj_state_growstack	// (lua_State *L, int n)
 486  |  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.
 487  |  jmp <3
 488  |
 489  |->vm_unwind_yield:
 490  |  mov al, LUA_YIELD
 491  |  jmp ->vm_unwind_c_eh
 492  |
 493  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.
 494  |  // (void *cframe, int errcode)
 495  |  endbr
 496  |  mov eax, CARG2d			// Error return status for vm_pcall.
 497  |  mov rsp, CARG1
 498  |->vm_unwind_c_eh:			// Landing pad for external unwinder.
 499  |  endbr
 500  |  mov L:RB, SAVE_L
 501  |  mov GL:RB, L:RB->glref
 502  |  mov dword GL:RB->vmstate, ~LJ_VMST_C
 503  |  jmp ->vm_leave_unw
 504  |
 505  |->vm_unwind_rethrow:
 506  |  endbr
 507  |.if not X64WIN
 508  |  mov CARG1, SAVE_L
 509  |  mov CARG2d, eax
 510  |  restoreregs
 511  |  jmp extern lj_err_throw		// (lua_State *L, int errcode)
 512  |.endif
 513  |
 514  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.
 515  |  // (void *cframe)
 516  |  endbr
 517  |  and CARG1, CFRAME_RAWMASK
 518  |  mov rsp, CARG1
 519  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.
 520  |  endbr
 521  |  mov L:RB, SAVE_L
 522  |  mov RDd, 1+1			// Really 1+2 results, incr. later.
 523  |  mov BASE, L:RB->base
 524  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.
 525  |  add DISPATCH, GG_G2DISP
 526  |  mov PC, [BASE-8]			// Fetch PC of previous frame.
 527  |  mov_false RA
 528  |  mov RB, [BASE]
 529  |  mov [BASE-16], RA			// Prepend false to error message.
 530  |  mov [BASE-8], RB
 531  |  mov RA, -16			// Results start at BASE+RA = BASE-16.
 532  |  set_vmstate INTERP
 533  |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.
 534  |
 535  |//-----------------------------------------------------------------------
 536  |//-- Grow stack for calls -----------------------------------------------
 537  |//-----------------------------------------------------------------------
 538  |
 539  |->vm_growstack_c:			// Grow stack for C function.
 540  |  mov CARG2d, LUA_MINSTACK
 541  |  jmp >2
 542  |
 543  |->vm_growstack_v:			// Grow stack for vararg Lua function.
 544  |  sub RD, 16				// LJ_FR2
 545  |  jmp >1
 546  |
 547  |->vm_growstack_f:			// Grow stack for fixarg Lua function.
 548  |  // BASE = new base, RD = nargs+1, RB = L, PC = first PC
 549  |  lea RD, [BASE+NARGS:RD*8-8]
 550  |1:
 551  |  movzx RAd, byte [PC-4+PC2PROTO(framesize)]
 552  |  add PC, 4				// Must point after first instruction.
 553  |  mov L:RB->base, BASE
 554  |  mov L:RB->top, RD
 555  |  mov SAVE_PC, PC
 556  |  mov CARG2, RA
 557  |2:
 558  |  // RB = L, L->base = new base, L->top = top
 559  |  mov CARG1, L:RB
 560  |  call extern lj_state_growstack	// (lua_State *L, int n)
 561  |  mov BASE, L:RB->base
 562  |  mov RD, L:RB->top
 563  |  mov LFUNC:RB, [BASE-16]
 564  |  cleartp LFUNC:RB
 565  |  sub RD, BASE
 566  |  shr RDd, 3
 567  |  add NARGS:RDd, 1
 568  |  // BASE = new base, RB = LFUNC, RD = nargs+1
 569  |  ins_callt				// Just retry the call.
 570  |
 571  |//-----------------------------------------------------------------------
 572  |//-- Entry points into the assembler VM ---------------------------------
 573  |//-----------------------------------------------------------------------
 574  |
 575  |->vm_resume:				// Setup C frame and resume thread.
 576  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)
 577  |  saveregs
 578  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.
 579  |  mov SAVE_L, CARG1
 580  |  mov RA, CARG2
 581  |  mov PCd, FRAME_CP
 582  |  xor RDd, RDd
 583  |  lea KBASE, [esp+CFRAME_RESUME]
 584  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.
 585  |  add DISPATCH, GG_G2DISP
 586  |  mov SAVE_PC, RD			// Any value outside of bytecode is ok.
 587  |  mov SAVE_CFRAME, RD
 588  |  mov SAVE_NRES, RDd
 589  |  mov SAVE_ERRF, RDd
 590  |  mov L:RB->cframe, KBASE
 591  |  cmp byte L:RB->status, RDL
 592  |  je >2				// Initial resume (like a call).
 593  |
 594  |  // Resume after yield (like a return).
 595  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
 596  |  set_vmstate INTERP
 597  |  mov byte L:RB->status, RDL
 598  |  mov BASE, L:RB->base
 599  |  mov RD, L:RB->top
 600  |  sub RD, RA
 601  |  shr RDd, 3
 602  |  add RDd, 1				// RD = nresults+1
 603  |  sub RA, BASE			// RA = resultofs
 604  |  mov PC, [BASE-8]
 605  |  mov MULTRES, RDd
 606  |  test PCd, FRAME_TYPE
 607  |  jz ->BC_RET_Z
 608  |  jmp ->vm_return
 609  |
 610  |->vm_pcall:				// Setup protected C frame and enter VM.
 611  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)
 612  |  saveregs
 613  |  mov PCd, FRAME_CP
 614  |  mov SAVE_ERRF, CARG4d
 615  |  jmp >1
 616  |
 617  |->vm_call:				// Setup C frame and enter VM.
 618  |  // (lua_State *L, TValue *base, int nres1)
 619  |  saveregs
 620  |  mov PCd, FRAME_C
 621  |
 622  |1:  // Entry point for vm_pcall above (PC = ftype).
 623  |  mov SAVE_NRES, CARG3d
 624  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.
 625  |  mov SAVE_L, CARG1
 626  |  mov RA, CARG2
 627  |
 628  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.
 629  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.
 630  |  mov SAVE_CFRAME, KBASE
 631  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.
 632  |  add DISPATCH, GG_G2DISP
 633  |  mov L:RB->cframe, rsp
 634  |
 635  |2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).
 636  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
 637  |  set_vmstate INTERP
 638  |  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).
 639  |  add PC, RA
 640  |  sub PC, BASE			// PC = frame delta + frame type
 641  |
 642  |  mov RD, L:RB->top
 643  |  sub RD, RA
 644  |  shr NARGS:RDd, 3
 645  |  add NARGS:RDd, 1			// RD = nargs+1
 646  |
 647  |->vm_call_dispatch:
 648  |  mov LFUNC:RB, [RA-16]
 649  |  checkfunc LFUNC:RB, ->vmeta_call	// Ensure KBASE defined and != BASE.
 650  |
 651  |->vm_call_dispatch_f:
 652  |  mov BASE, RA
 653  |  ins_call
 654  |  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC
 655  |
 656  |->vm_cpcall:				// Setup protected C frame, call C.
 657  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)
 658  |  saveregs
 659  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.
 660  |  mov SAVE_L, CARG1
 661  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.
 662  |
 663  |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).
 664  |  sub KBASE, L:RB->top
 665  |   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.
 666  |  mov SAVE_ERRF, 0			// No error function.
 667  |  mov SAVE_NRES, KBASEd		// Neg. delta means cframe w/o frame.
 668  |   add DISPATCH, GG_G2DISP
 669  |  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).
 670  |
 671  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.
 672  |  mov SAVE_CFRAME, KBASE
 673  |  mov L:RB->cframe, rsp
 674  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
 675  |
 676  |  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)
 677  |  // TValue * (new base) or NULL returned in eax (RC).
 678  |  test RC, RC
 679  |  jz ->vm_leave_cp			// No base? Just remove C frame.
 680  |  mov RA, RC
 681  |  mov PCd, FRAME_CP
 682  |  jmp <2				// Else continue with the call.
 683  |
 684  |//-----------------------------------------------------------------------
 685  |//-- Metamethod handling ------------------------------------------------
 686  |//-----------------------------------------------------------------------
 687  |
 688  |//-- Continuation dispatch ----------------------------------------------
 689  |
 690  |->cont_dispatch:
 691  |  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)
 692  |  add RA, BASE
 693  |  and PC, -8
 694  |  mov RB, BASE
 695  |  sub BASE, PC			// Restore caller BASE.
 696  |  mov aword [RA+RD*8-8], LJ_TNIL	// Ensure one valid arg.
 697  |  mov RC, RA				// ... in [RC]
 698  |  mov PC, [RB-24]			// Restore PC from [cont|PC].
 699  |  mov RA, qword [RB-32]		// May be negative on WIN64 with debug.
 700  |.if FFI
 701  |  cmp RA, 1
 702  |  jbe >1
 703  |.endif
 704  |  mov LFUNC:KBASE, [BASE-16]
 705  |  cleartp LFUNC:KBASE
 706  |  mov KBASE, LFUNC:KBASE->pc
 707  |  mov KBASE, [KBASE+PC2PROTO(k)]
 708  |  // BASE = base, RC = result, RB = meta base
 709  |  jmp RA				// Jump to continuation.
 710  |
 711  |.if FFI
 712  |1:
 713  |  je ->cont_ffi_callback		// cont = 1: return from FFI callback.
 714  |  // cont = 0: Tail call from C function.
 715  |  sub RB, BASE
 716  |  shr RBd, 3
 717  |  lea RDd, [RBd-3]
 718  |  jmp ->vm_call_tail
 719  |.endif
 720  |
 721  |->cont_cat:				// BASE = base, RC = result, RB = mbase
 722  |  endbr
 723  |  movzx RAd, PC_RB
 724  |  sub RB, 32
 725  |  lea RA, [BASE+RA*8]
 726  |  sub RA, RB
 727  |  je ->cont_ra
 728  |  neg RA
 729  |  shr RAd, 3
 730  |.if X64WIN
 731  |  mov CARG3d, RAd
 732  |  mov L:CARG1, SAVE_L
 733  |  mov L:CARG1->base, BASE
 734  |  mov RC, [RC]
 735  |  mov [RB], RC
 736  |  mov CARG2, RB
 737  |.else
 738  |  mov L:CARG1, SAVE_L
 739  |  mov L:CARG1->base, BASE
 740  |  mov CARG3d, RAd
 741  |  mov RA, [RC]
 742  |  mov [RB], RA
 743  |  mov CARG2, RB
 744  |.endif
 745  |  jmp ->BC_CAT_Z
 746  |
 747  |//-- Table indexing metamethods -----------------------------------------
 748  |
 749  |->vmeta_tgets:
 750  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *
 751  |  mov TMP1, STR:RC
 752  |  lea RC, TMP1
 753  |  cmp PC_OP, BC_GGET
 754  |  jne >1
 755  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *
 756  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.
 757  |  mov [RB], TAB:RA
 758  |  jmp >2
 759  |
 760  |->vmeta_tgetb:
 761  |  movzx RCd, PC_RC
 762  |.if DUALNUM
 763  |  setint RC
 764  |  mov TMP1, RC
 765  |.else
 766  |  cvtsi2sd xmm0, RCd
 767  |  movsd TMP1, xmm0
 768  |.endif
 769  |  lea RC, TMP1
 770  |  jmp >1
 771  |
 772  |->vmeta_tgetv:
 773  |  movzx RCd, PC_RC			// Reload TValue *k from RC.
 774  |  lea RC, [BASE+RC*8]
 775  |1:
 776  |  movzx RBd, PC_RB			// Reload TValue *t from RB.
 777  |  lea RB, [BASE+RB*8]
 778  |2:
 779  |  mov L:CARG1, SAVE_L
 780  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.
 781  |  mov CARG2, RB
 782  |  mov CARG3, RC
 783  |  mov L:RB, L:CARG1
 784  |  mov SAVE_PC, PC
 785  |  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)
 786  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).
 787  |  mov BASE, L:RB->base
 788  |  test RC, RC
 789  |  jz >3
 790  |->cont_ra:				// BASE = base, RC = result
 791  |  endbr
 792  |  movzx RAd, PC_RA
 793  |  mov RB, [RC]
 794  |  mov [BASE+RA*8], RB
 795  |  ins_next
 796  |
 797  |3:  // Call __index metamethod.
 798  |  // BASE = base, L->top = new base, stack = cont/func/t/k
 799  |  mov RA, L:RB->top
 800  |  mov [RA-24], PC			// [cont|PC]
 801  |  lea PC, [RA+FRAME_CONT]
 802  |  sub PC, BASE
 803  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.
 804  |  mov NARGS:RDd, 2+1			// 2 args for func(t, k).
 805  |  cleartp LFUNC:RB
 806  |  jmp ->vm_call_dispatch_f
 807  |
 808  |->vmeta_tgetr:
 809  |  mov CARG1, TAB:RB
 810  |  mov RB, BASE			// Save BASE.
 811  |  mov CARG2d, RCd			// Caveat: CARG2 == BASE
 812  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)
 813  |  // cTValue * or NULL returned in eax (RC).
 814  |  movzx RAd, PC_RA
 815  |  mov BASE, RB			// Restore BASE.
 816  |  test RC, RC
 817  |  jnz ->BC_TGETR_Z
 818  |  mov ITYPE, LJ_TNIL
 819  |  jmp ->BC_TGETR2_Z
 820  |
 821  |//-----------------------------------------------------------------------
 822  |
 823  |->vmeta_tsets:
 824  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *
 825  |  mov TMP1, STR:RC
 826  |  lea RC, TMP1
 827  |  cmp PC_OP, BC_GSET
 828  |  jne >1
 829  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *
 830  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.
 831  |  mov [RB], TAB:RA
 832  |  jmp >2
 833  |
 834  |->vmeta_tsetb:
 835  |  movzx RCd, PC_RC
 836  |.if DUALNUM
 837  |  setint RC
 838  |  mov TMP1, RC
 839  |.else
 840  |  cvtsi2sd xmm0, RCd
 841  |  movsd TMP1, xmm0
 842  |.endif
 843  |  lea RC, TMP1
 844  |  jmp >1
 845  |
 846  |->vmeta_tsetv:
 847  |  movzx RCd, PC_RC			// Reload TValue *k from RC.
 848  |  lea RC, [BASE+RC*8]
 849  |1:
 850  |  movzx RBd, PC_RB			// Reload TValue *t from RB.
 851  |  lea RB, [BASE+RB*8]
 852  |2:
 853  |  mov L:CARG1, SAVE_L
 854  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.
 855  |  mov CARG2, RB
 856  |  mov CARG3, RC
 857  |  mov L:RB, L:CARG1
 858  |  mov SAVE_PC, PC
 859  |  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)
 860  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).
 861  |  mov BASE, L:RB->base
 862  |  test RC, RC
 863  |  jz >3
 864  |  // NOBARRIER: lj_meta_tset ensures the table is not black.
 865  |  movzx RAd, PC_RA
 866  |  mov RB, [BASE+RA*8]
 867  |  mov [RC], RB
 868  |->cont_nop:				// BASE = base, (RC = result)
 869  |  endbr
 870  |  ins_next
 871  |
 872  |3:  // Call __newindex metamethod.
 873  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)
 874  |  mov RA, L:RB->top
 875  |  mov [RA-24], PC			// [cont|PC]
 876  |  movzx RCd, PC_RA
 877  |  // Copy value to third argument.
 878  |  mov RB, [BASE+RC*8]
 879  |  mov [RA+16], RB
 880  |  lea PC, [RA+FRAME_CONT]
 881  |  sub PC, BASE
 882  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.
 883  |  mov NARGS:RDd, 3+1			// 3 args for func(t, k, v).
 884  |  cleartp LFUNC:RB
 885  |  jmp ->vm_call_dispatch_f
 886  |
 887  |->vmeta_tsetr:
 888  |.if X64WIN
 889  |  mov L:CARG1, SAVE_L
 890  |  mov CARG3d, RCd
 891  |  mov L:CARG1->base, BASE
 892  |  xchg CARG2, TAB:RB			// Caveat: CARG2 == BASE.
 893  |.else
 894  |  mov L:CARG1, SAVE_L
 895  |  mov CARG2, TAB:RB
 896  |  mov L:CARG1->base, BASE
 897  |  mov RB, BASE			// Save BASE.
 898  |  mov CARG3d, RCd			// Caveat: CARG3 == BASE.
 899  |.endif
 900  |  mov SAVE_PC, PC
 901  |  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)
 902  |  // TValue * returned in eax (RC).
 903  |  movzx RAd, PC_RA
 904  |  mov BASE, RB			// Restore BASE.
 905  |  jmp ->BC_TSETR_Z
 906  |
 907  |//-- Comparison metamethods ---------------------------------------------
 908  |
 909  |->vmeta_comp:
 910  |  movzx RDd, PC_RD
 911  |  movzx RAd, PC_RA
 912  |  mov L:RB, SAVE_L
 913  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 == BASE.
 914  |.if X64WIN
 915  |  lea CARG3, [BASE+RD*8]
 916  |  lea CARG2, [BASE+RA*8]
 917  |.else
 918  |  lea CARG2, [BASE+RA*8]
 919  |  lea CARG3, [BASE+RD*8]
 920  |.endif
 921  |  mov CARG1, L:RB			// Caveat: CARG1/CARG4 == RA.
 922  |  movzx CARG4d, PC_OP
 923  |  mov SAVE_PC, PC
 924  |  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)
 925  |  // 0/1 or TValue * (metamethod) returned in eax (RC).
 926  |3:
 927  |  mov BASE, L:RB->base
 928  |  cmp RC, 1
 929  |  ja ->vmeta_binop
 930  |4:
 931  |  lea PC, [PC+4]
 932  |  jb >6
 933  |5:
 934  |  movzx RDd, PC_RD
 935  |  branchPC RD
 936  |6:
 937  |  ins_next
 938  |
 939  |->cont_condt:			// BASE = base, RC = result
 940  |  endbr
 941  |  add PC, 4
 942  |  mov ITYPE, [RC]
 943  |  sar ITYPE, 47
 944  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is true.
 945  |  jb <5
 946  |  jmp <6
 947  |
 948  |->cont_condf:			// BASE = base, RC = result
 949  |  endbr
 950  |  mov ITYPE, [RC]
 951  |  sar ITYPE, 47
 952  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is false.
 953  |  jmp <4
 954  |
 955  |->vmeta_equal:
 956  |  cleartp TAB:RD
 957  |  sub PC, 4
 958  |.if X64WIN
 959  |  mov CARG3, RD
 960  |  mov CARG4d, RBd
 961  |  mov L:RB, SAVE_L
 962  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.
 963  |  mov CARG2, RA
 964  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.
 965  |.else
 966  |  mov CARG2, RA
 967  |  mov CARG4d, RBd			// Caveat: CARG4 == RA.
 968  |  mov L:RB, SAVE_L
 969  |  mov L:RB->base, BASE		// Caveat: CARG3 == BASE.
 970  |  mov CARG3, RD
 971  |  mov CARG1, L:RB
 972  |.endif
 973  |  mov SAVE_PC, PC
 974  |  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)
 975  |  // 0/1 or TValue * (metamethod) returned in eax (RC).
 976  |  jmp <3
 977  |
 978  |->vmeta_equal_cd:
 979  |.if FFI
 980  |  sub PC, 4
 981  |  mov L:RB, SAVE_L
 982  |  mov L:RB->base, BASE
 983  |  mov CARG1, L:RB
 984  |  mov CARG2d, dword [PC-4]
 985  |  mov SAVE_PC, PC
 986  |  call extern lj_meta_equal_cd	// (lua_State *L, BCIns ins)
 987  |  // 0/1 or TValue * (metamethod) returned in eax (RC).
 988  |  jmp <3
 989  |.endif
 990  |
 991  |->vmeta_istype:
 992  |  mov L:RB, SAVE_L
 993  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.
 994  |  mov CARG2d, RAd
 995  |  mov CARG3d, RDd
 996  |  mov L:CARG1, L:RB
 997  |  mov SAVE_PC, PC
 998  |  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)
 999  |  mov BASE, L:RB->base
1000  |  jmp <6
1001  |
1002  |//-- Arithmetic metamethods ---------------------------------------------
1003  |
1004  |->vmeta_arith_vno:
1005  |.if DUALNUM
1006  |  movzx RBd, PC_RB
1007  |  movzx RCd, PC_RC
1008  |.endif
1009  |->vmeta_arith_vn:
1010  |  lea RC, [KBASE+RC*8]
1011  |  jmp >1
1012  |
1013  |->vmeta_arith_nvo:
1014  |.if DUALNUM
1015  |  movzx RBd, PC_RB
1016  |  movzx RCd, PC_RC
1017  |.endif
1018  |->vmeta_arith_nv:
1019  |  lea TMPR, [KBASE+RC*8]
1020  |  lea RC, [BASE+RB*8]
1021  |  mov RB, TMPR
1022  |  jmp >2
1023  |
1024  |->vmeta_unm:
1025  |  lea RC, [BASE+RD*8]
1026  |  mov RB, RC
1027  |  jmp >2
1028  |
1029  |->vmeta_arith_vvo:
1030  |.if DUALNUM
1031  |  movzx RBd, PC_RB
1032  |  movzx RCd, PC_RC
1033  |.endif
1034  |->vmeta_arith_vv:
1035  |  lea RC, [BASE+RC*8]
1036  |1:
1037  |  lea RB, [BASE+RB*8]
1038  |2:
1039  |  lea RA, [BASE+RA*8]
1040  |.if X64WIN
1041  |  mov CARG3, RB
1042  |  mov CARG4, RC
1043  |  movzx RCd, PC_OP
1044  |  mov ARG5d, RCd
1045  |  mov L:RB, SAVE_L
1046  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.
1047  |  mov CARG2, RA
1048  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.
1049  |.else
1050  |  movzx CARG5d, PC_OP
1051  |  mov CARG2, RA
1052  |  mov CARG4, RC			// Caveat: CARG4 == RA.
1053  |  mov L:CARG1, SAVE_L
1054  |  mov L:CARG1->base, BASE		// Caveat: CARG3 == BASE.
1055  |  mov CARG3, RB
1056  |  mov L:RB, L:CARG1
1057  |.endif
1058  |  mov SAVE_PC, PC
1059  |  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)
1060  |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).
1061  |  mov BASE, L:RB->base
1062  |  test RC, RC
1063  |  jz ->cont_nop
1064  |
1065  |  // Call metamethod for binary op.
1066  |->vmeta_binop:
1067  |  // BASE = base, RC = new base, stack = cont/func/o1/o2
1068  |  mov RA, RC
1069  |  sub RC, BASE
1070  |  mov [RA-24], PC			// [cont|PC]
1071  |  lea PC, [RC+FRAME_CONT]
1072  |  mov NARGS:RDd, 2+1			// 2 args for func(o1, o2).
1073  |  jmp ->vm_call_dispatch
1074  |
1075  |->vmeta_len:
1076  |  movzx RDd, PC_RD
1077  |  mov L:RB, SAVE_L
1078  |  mov L:RB->base, BASE
1079  |  lea CARG2, [BASE+RD*8]		// Caveat: CARG2 == BASE
1080  |  mov L:CARG1, L:RB
1081  |  mov SAVE_PC, PC
1082  |  call extern lj_meta_len		// (lua_State *L, TValue *o)
1083  |  // NULL (retry) or TValue * (metamethod) returned in eax (RC).
1084  |  mov BASE, L:RB->base
1085#if LJ_52
1086  |  test RC, RC
1087  |  jne ->vmeta_binop			// Binop call for compatibility.
1088  |  movzx RDd, PC_RD
1089  |  mov TAB:CARG1, [BASE+RD*8]
1090  |  cleartp TAB:CARG1
1091  |  jmp ->BC_LEN_Z
1092#else
1093  |  jmp ->vmeta_binop			// Binop call for compatibility.
1094#endif
1095  |
1096  |//-- Call metamethod ----------------------------------------------------
1097  |
1098  |->vmeta_call_ra:
1099  |  lea RA, [BASE+RA*8+16]
1100  |->vmeta_call:			// Resolve and call __call metamethod.
1101  |  // BASE = old base, RA = new base, RC = nargs+1, PC = return
1102  |  mov TMP1d, NARGS:RDd		// Save RA, RC for us.
1103  |  mov RB, RA
1104  |.if X64WIN
1105  |  mov L:TMPR, SAVE_L
1106  |  mov L:TMPR->base, BASE		// Caveat: CARG2 is BASE.
1107  |  lea CARG2, [RA-16]
1108  |  lea CARG3, [RA+NARGS:RD*8-8]
1109  |  mov CARG1, L:TMPR			// Caveat: CARG1 is RA.
1110  |.else
1111  |  mov L:CARG1, SAVE_L
1112  |  mov L:CARG1->base, BASE		// Caveat: CARG3 is BASE.
1113  |  lea CARG2, [RA-16]
1114  |  lea CARG3, [RA+NARGS:RD*8-8]
1115  |.endif
1116  |  mov SAVE_PC, PC
1117  |  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)
1118  |  mov RA, RB
1119  |  mov L:RB, SAVE_L
1120  |  mov BASE, L:RB->base
1121  |  mov NARGS:RDd, TMP1d
1122  |  mov LFUNC:RB, [RA-16]
1123  |  add NARGS:RDd, 1
1124  |  // This is fragile. L->base must not move, KBASE must always be defined.
1125  |  cmp KBASE, BASE			// Continue with CALLT if flag set.
1126  |  je ->BC_CALLT_Z
1127  |  cleartp LFUNC:RB
1128  |  mov BASE, RA
1129  |  ins_call				// Otherwise call resolved metamethod.
1130  |
1131  |//-- Argument coercion for 'for' statement ------------------------------
1132  |
1133  |->vmeta_for:
1134  |  mov L:RB, SAVE_L
1135  |  mov L:RB->base, BASE
1136  |  mov CARG2, RA			// Caveat: CARG2 == BASE
1137  |  mov L:CARG1, L:RB			// Caveat: CARG1 == RA
1138  |  mov SAVE_PC, PC
1139  |  call extern lj_meta_for	// (lua_State *L, TValue *base)
1140  |  mov BASE, L:RB->base
1141  |  mov RCd, [PC-4]
1142  |  movzx RAd, RCH
1143  |  movzx OP, RCL
1144  |  shr RCd, 16
1145  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.
1146  |
1147  |//-----------------------------------------------------------------------
1148  |//-- Fast functions -----------------------------------------------------
1149  |//-----------------------------------------------------------------------
1150  |
1151  |.macro .ffunc, name
1152  |->ff_ .. name:
1153  |  endbr
1154  |.endmacro
1155  |
1156  |.macro .ffunc_1, name
1157  |->ff_ .. name:
1158  |  endbr; cmp NARGS:RDd, 1+1;  jb ->fff_fallback
1159  |.endmacro
1160  |
1161  |.macro .ffunc_2, name
1162  |->ff_ .. name:
1163  |  endbr; cmp NARGS:RDd, 2+1;  jb ->fff_fallback
1164  |.endmacro
1165  |
1166  |.macro .ffunc_n, name, op
1167  |  .ffunc_1 name
1168  |  checknumtp [BASE], ->fff_fallback
1169  |  op xmm0, qword [BASE]
1170  |.endmacro
1171  |
1172  |.macro .ffunc_n, name
1173  |  .ffunc_n name, movsd
1174  |.endmacro
1175  |
1176  |.macro .ffunc_nn, name
1177  |  .ffunc_2 name
1178  |  checknumtp [BASE], ->fff_fallback
1179  |  checknumtp [BASE+8], ->fff_fallback
1180  |  movsd xmm0, qword [BASE]
1181  |  movsd xmm1, qword [BASE+8]
1182  |.endmacro
1183  |
1184  |// Inlined GC threshold check. Caveat: uses label 1.
1185  |.macro ffgccheck
1186  |  mov RB, [DISPATCH+DISPATCH_GL(gc.total)]
1187  |  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)]
1188  |  jb >1
1189  |  call ->fff_gcstep
1190  |1:
1191  |.endmacro
1192  |
1193  |//-- Base library: checks -----------------------------------------------
1194  |
1195  |.ffunc_1 assert
1196  |  mov ITYPE, [BASE]
1197  |  mov RB, ITYPE
1198  |  sar ITYPE, 47
1199  |  cmp ITYPEd, LJ_TISTRUECOND; jae ->fff_fallback
1200  |  mov PC, [BASE-8]
1201  |  mov MULTRES, RDd
1202  |  mov RB, [BASE]
1203  |  mov [BASE-16], RB
1204  |  sub RDd, 2
1205  |  jz >2
1206  |  mov RA, BASE
1207  |1:
1208  |  add RA, 8
1209  |  mov RB, [RA]
1210  |  mov [RA-16], RB
1211  |  sub RDd, 1
1212  |  jnz <1
1213  |2:
1214  |  mov RDd, MULTRES
1215  |  jmp ->fff_res_
1216  |
1217  |.ffunc_1 type
1218  |  mov RC, [BASE]
1219  |  sar RC, 47
1220  |  mov RBd, LJ_TISNUM
1221  |  cmp RCd, RBd
1222  |  cmovb RCd, RBd
1223  |  not RCd
1224  |2:
1225  |  mov CFUNC:RB, [BASE-16]
1226  |  cleartp CFUNC:RB
1227  |  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))]
1228  |  mov PC, [BASE-8]
1229  |  settp STR:RC, LJ_TSTR
1230  |  mov [BASE-16], STR:RC
1231  |  jmp ->fff_res1
1232  |
1233  |//-- Base library: getters and setters ---------------------------------
1234  |
1235  |.ffunc_1 getmetatable
1236  |  mov TAB:RB, [BASE]
1237  |  mov PC, [BASE-8]
1238  |  checktab TAB:RB, >6
1239  |1:  // Field metatable must be at same offset for GCtab and GCudata!
1240  |  mov TAB:RB, TAB:RB->metatable
1241  |2:
1242  |  test TAB:RB, TAB:RB
1243  |  mov aword [BASE-16], LJ_TNIL
1244  |  jz ->fff_res1
1245  |  settp TAB:RC, TAB:RB, LJ_TTAB
1246  |  mov [BASE-16], TAB:RC		// Store metatable as default result.
1247  |  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+8*(GCROOT_MMNAME+MM_metatable)]
1248  |  mov RAd, TAB:RB->hmask
1249  |  and RAd, STR:RC->sid
1250  |  settp STR:RC, LJ_TSTR
1251  |  imul RAd, #NODE
1252  |  add NODE:RA, TAB:RB->node
1253  |3:  // Rearranged logic, because we expect _not_ to find the key.
1254  |  cmp NODE:RA->key, STR:RC
1255  |  je >5
1256  |4:
1257  |  mov NODE:RA, NODE:RA->next
1258  |  test NODE:RA, NODE:RA
1259  |  jnz <3
1260  |  jmp ->fff_res1			// Not found, keep default result.
1261  |5:
1262  |  mov RB, NODE:RA->val
1263  |  cmp RB, LJ_TNIL; je ->fff_res1	// Ditto for nil value.
1264  |  mov [BASE-16], RB			// Return value of mt.__metatable.
1265  |  jmp ->fff_res1
1266  |
1267  |6:
1268  |  cmp ITYPEd, LJ_TUDATA; je <1
1269  |  cmp ITYPEd, LJ_TISNUM; ja >7
1270  |  mov ITYPEd, LJ_TISNUM
1271  |7:
1272  |  not ITYPEd
1273  |  mov TAB:RB, [DISPATCH+ITYPE*8+DISPATCH_GL(gcroot[GCROOT_BASEMT])]
1274  |  jmp <2
1275  |
1276  |.ffunc_2 setmetatable
1277  |  mov TAB:RB, [BASE]
1278  |  mov TAB:TMPR, TAB:RB
1279  |  checktab TAB:RB, ->fff_fallback
1280  |  // Fast path: no mt for table yet and not clearing the mt.
1281  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback
1282  |  mov TAB:RA, [BASE+8]
1283  |  checktab TAB:RA, ->fff_fallback
1284  |  mov TAB:RB->metatable, TAB:RA
1285  |  mov PC, [BASE-8]
1286  |  mov [BASE-16], TAB:TMPR			// Return original table.
1287  |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
1288  |  jz >1
1289  |  // Possible write barrier. Table is black, but skip iswhite(mt) check.
1290  |  barrierback TAB:RB, RC
1291  |1:
1292  |  jmp ->fff_res1
1293  |
1294  |.ffunc_2 rawget
1295  |.if X64WIN
1296  |  mov TAB:RA, [BASE]
1297  |  checktab TAB:RA, ->fff_fallback
1298  |  mov RB, BASE			// Save BASE.
1299  |  lea CARG3, [BASE+8]
1300  |  mov CARG2, TAB:RA			// Caveat: CARG2 == BASE.
1301  |  mov CARG1, SAVE_L
1302  |.else
1303  |  mov TAB:CARG2, [BASE]
1304  |  checktab TAB:CARG2, ->fff_fallback
1305  |  mov RB, BASE			// Save BASE.
1306  |  lea CARG3, [BASE+8]		// Caveat: CARG3 == BASE.
1307  |  mov CARG1, SAVE_L
1308  |.endif
1309  |  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)
1310  |  // cTValue * returned in eax (RD).
1311  |  mov BASE, RB			// Restore BASE.
1312  |  // Copy table slot.
1313  |  mov RB, [RD]
1314  |  mov PC, [BASE-8]
1315  |  mov [BASE-16], RB
1316  |  jmp ->fff_res1
1317  |
1318  |//-- Base library: conversions ------------------------------------------
1319  |
1320  |.ffunc tonumber
1321  |  // Only handles the number case inline (without a base argument).
1322  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// Exactly one argument.
1323  |  mov RB, [BASE]
1324  |  checknumber RB, ->fff_fallback
1325  |  mov PC, [BASE-8]
1326  |  mov [BASE-16], RB
1327  |  jmp ->fff_res1
1328  |
1329  |.ffunc_1 tostring
1330  |  // Only handles the string or number case inline.
1331  |  mov PC, [BASE-8]
1332  |  mov STR:RB, [BASE]
1333  |  checktp_nc STR:RB, LJ_TSTR, >3
1334  |  // A __tostring method in the string base metatable is ignored.
1335  |2:
1336  |  mov [BASE-16], STR:RB
1337  |  jmp ->fff_res1
1338  |3:  // Handle numbers inline, unless a number base metatable is present.
1339  |  cmp ITYPEd, LJ_TISNUM;  ja ->fff_fallback_1
1340  |  cmp aword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0
1341  |  jne ->fff_fallback
1342  |  ffgccheck				// Caveat: uses label 1.
1343  |  mov L:RB, SAVE_L
1344  |  mov L:RB->base, BASE		// Add frame since C call can throw.
1345  |  mov SAVE_PC, PC			// Redundant (but a defined value).
1346  |.if not X64WIN
1347  |  mov CARG2, BASE			// Otherwise: CARG2 == BASE
1348  |.endif
1349  |  mov L:CARG1, L:RB
1350  |.if DUALNUM
1351  |  call extern lj_strfmt_number	// (lua_State *L, cTValue *o)
1352  |.else
1353  |  call extern lj_strfmt_num		// (lua_State *L, lua_Number *np)
1354  |.endif
1355  |  // GCstr returned in eax (RD).
1356  |  mov BASE, L:RB->base
1357  |  settp STR:RB, RD, LJ_TSTR
1358  |  jmp <2
1359  |
1360  |//-- Base library: iterators -------------------------------------------
1361  |
1362  |.ffunc_1 next
1363  |  je >2				// Missing 2nd arg?
1364  |1:
1365  |  mov CARG1, [BASE]
1366  |  mov PC, [BASE-8]
1367  |  checktab CARG1, ->fff_fallback
1368  |  mov RB, BASE			// Save BASE.
1369  |.if X64WIN
1370  |  lea CARG3, [BASE-16]
1371  |  lea CARG2, [BASE+8]		// Caveat: CARG2 == BASE.
1372  |.else
1373  |  lea CARG2, [BASE+8]
1374  |  lea CARG3, [BASE-16]		// Caveat: CARG3 == BASE.
1375  |.endif
1376  |  call extern lj_tab_next		// (GCtab *t, cTValue *key, TValue *o)
1377  |  // 1=found, 0=end, -1=error returned in eax (RD).
1378  |  mov BASE, RB			// Restore BASE.
1379  |  test RDd, RDd;  jg ->fff_res2	// Found key/value.
1380  |  js ->fff_fallback_2		// Invalid key.
1381  |  // End of traversal: return nil.
1382  |  mov aword [BASE-16], LJ_TNIL
1383  |  jmp ->fff_res1
1384  |2:  // Set missing 2nd arg to nil.
1385  |  mov aword [BASE+8], LJ_TNIL
1386  |  jmp <1
1387  |
1388  |.ffunc_1 pairs
1389  |  mov TAB:RB, [BASE]
1390  |  mov TMPR, TAB:RB
1391  |  checktab TAB:RB, ->fff_fallback
1392#if LJ_52
1393  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback
1394#endif
1395  |  mov CFUNC:RD, [BASE-16]
1396  |  cleartp CFUNC:RD
1397  |  mov CFUNC:RD, CFUNC:RD->upvalue[0]
1398  |  settp CFUNC:RD, LJ_TFUNC
1399  |  mov PC, [BASE-8]
1400  |  mov [BASE-16], CFUNC:RD
1401  |  mov [BASE-8], TMPR
1402  |  mov aword [BASE], LJ_TNIL
1403  |  mov RDd, 1+3
1404  |  jmp ->fff_res
1405  |
1406  |.ffunc_2 ipairs_aux
1407  |  mov TAB:RB, [BASE]
1408  |  checktab TAB:RB, ->fff_fallback
1409  |.if DUALNUM
1410  |  mov RA, [BASE+8]
1411  |  checkint RA, ->fff_fallback
1412  |.else
1413  |  checknumtp [BASE+8], ->fff_fallback
1414  |  movsd xmm0, qword [BASE+8]
1415  |.endif
1416  |  mov PC, [BASE-8]
1417  |.if DUALNUM
1418  |  add RAd, 1
1419  |  setint ITYPE, RA
1420  |  mov [BASE-16], ITYPE
1421  |.else
1422  |  sseconst_1 xmm1, TMPR
1423  |  addsd xmm0, xmm1
1424  |  cvttsd2si RAd, xmm0
1425  |  movsd qword [BASE-16], xmm0
1426  |.endif
1427  |  cmp RAd, TAB:RB->asize;  jae >2	// Not in array part?
1428  |  mov RD, TAB:RB->array
1429  |  lea RD, [RD+RA*8]
1430  |1:
1431  |  cmp aword [RD], LJ_TNIL;  je ->fff_res0
1432  |  // Copy array slot.
1433  |  mov RB, [RD]
1434  |  mov [BASE-8], RB
1435  |->fff_res2:
1436  |  mov RDd, 1+2
1437  |  jmp ->fff_res
1438  |2:  // Check for empty hash part first. Otherwise call C function.
1439  |  cmp dword TAB:RB->hmask, 0; je ->fff_res0
1440  |.if X64WIN
1441  |  mov TMPR, BASE
1442  |  mov CARG2d, RAd
1443  |  mov CARG1, TAB:RB
1444  |  mov RB, TMPR
1445  |.else
1446  |  mov CARG1, TAB:RB
1447  |  mov RB, BASE			// Save BASE.
1448  |  mov CARG2d, RAd			// Caveat: CARG2 == BASE
1449  |.endif
1450  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)
1451  |  // cTValue * or NULL returned in eax (RD).
1452  |  mov BASE, RB
1453  |  test RD, RD
1454  |  jnz <1
1455  |->fff_res0:
1456  |  mov RDd, 1+0
1457  |  jmp ->fff_res
1458  |
1459  |.ffunc_1 ipairs
1460  |  mov TAB:RB, [BASE]
1461  |  mov TMPR, TAB:RB
1462  |  checktab TAB:RB, ->fff_fallback
1463#if LJ_52
1464  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback
1465#endif
1466  |  mov CFUNC:RD, [BASE-16]
1467  |  cleartp CFUNC:RD
1468  |  mov CFUNC:RD, CFUNC:RD->upvalue[0]
1469  |  settp CFUNC:RD, LJ_TFUNC
1470  |  mov PC, [BASE-8]
1471  |  mov [BASE-16], CFUNC:RD
1472  |  mov [BASE-8], TMPR
1473  |.if DUALNUM
1474  |  mov64 RD, ((uint64_t)LJ_TISNUM<<47)
1475  |  mov [BASE], RD
1476  |.else
1477  |  mov qword [BASE], 0
1478  |.endif
1479  |  mov RDd, 1+3
1480  |  jmp ->fff_res
1481  |
1482  |//-- Base library: catch errors ----------------------------------------
1483  |
1484  |.ffunc_1 pcall
1485  |  mov L:RB, SAVE_L
1486  |  lea RA, [BASE+NARGS:RD*8]
1487  |  cmp RA, L:RB->maxstack; ja ->fff_fallback
1488  |  lea RA, [BASE+16]
1489  |  sub NARGS:RDd, 1
1490  |  mov PCd, 16+FRAME_PCALL
1491  |1:
1492  |  movzx RBd, byte [DISPATCH+DISPATCH_GL(hookmask)]
1493  |  shr RB, HOOK_ACTIVE_SHIFT
1494  |  and RB, 1
1495  |  add PC, RB				// Remember active hook before pcall.
1496  |  // Note: this does a (harmless) copy of the function to the PC slot, too.
1497  |  mov KBASE, RD
1498  |2:
1499  |  mov RB, [RA+KBASE*8-24]
1500  |  mov [RA+KBASE*8-16], RB
1501  |  sub KBASE, 1
1502  |  ja <2
1503  |  jmp ->vm_call_dispatch
1504  |
1505  |.ffunc_2 xpcall
1506  |  mov L:RB, SAVE_L
1507  |  lea RA, [BASE+NARGS:RD*8]
1508  |  cmp RA, L:RB->maxstack; ja ->fff_fallback
1509  |  mov LFUNC:RA, [BASE+8]
1510  |  checktp_nc LFUNC:RA, LJ_TFUNC, ->fff_fallback
1511  |  mov LFUNC:RB, [BASE]		// Swap function and traceback.
1512  |  mov [BASE], LFUNC:RA
1513  |  mov [BASE+8], LFUNC:RB
1514  |  lea RA, [BASE+24]
1515  |  sub NARGS:RDd, 2
1516  |  mov PCd, 24+FRAME_PCALL
1517  |  jmp <1
1518  |
1519  |//-- Coroutine library --------------------------------------------------
1520  |
1521  |.macro coroutine_resume_wrap, resume
1522  |.if resume
1523  |.ffunc_1 coroutine_resume
1524  |  mov L:RB, [BASE]
1525  |  cleartp L:RB
1526  |.else
1527  |.ffunc coroutine_wrap_aux
1528  |  mov CFUNC:RB, [BASE-16]
1529  |  cleartp CFUNC:RB
1530  |  mov L:RB, CFUNC:RB->upvalue[0].gcr
1531  |  cleartp L:RB
1532  |.endif
1533  |  mov PC, [BASE-8]
1534  |  mov SAVE_PC, PC
1535  |  mov TMP1, L:RB
1536  |.if resume
1537  |  checktptp [BASE], LJ_TTHREAD, ->fff_fallback
1538  |.endif
1539  |  cmp aword L:RB->cframe, 0; jne ->fff_fallback
1540  |  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback
1541  |  mov RA, L:RB->top
1542  |  je >1				// Status != LUA_YIELD (i.e. 0)?
1543  |  cmp RA, L:RB->base			// Check for presence of initial func.
1544  |  je ->fff_fallback
1545  |  mov PC, [RA-8]			// Move initial function up.
1546  |  mov [RA], PC
1547  |  add RA, 8
1548  |1:
1549  |.if resume
1550  |  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).
1551  |.else
1552  |  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).
1553  |.endif
1554  |  cmp PC, L:RB->maxstack; ja ->fff_fallback
1555  |  mov L:RB->top, PC
1556  |
1557  |  mov L:RB, SAVE_L
1558  |  mov L:RB->base, BASE
1559  |.if resume
1560  |  add BASE, 8			// Keep resumed thread in stack for GC.
1561  |.endif
1562  |  mov L:RB->top, BASE
1563  |.if resume
1564  |  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.
1565  |.else
1566  |  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.
1567  |.endif
1568  |  sub RB, PC			// Relative to PC.
1569  |
1570  |  cmp PC, RA
1571  |  je >3
1572  |2:  // Move args to coroutine.
1573  |  mov RC, [PC+RB]
1574  |  mov [PC-8], RC
1575  |  sub PC, 8
1576  |  cmp PC, RA
1577  |  jne <2
1578  |3:
1579  |  mov CARG2, RA
1580  |  mov CARG1, TMP1
1581  |  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)
1582  |
1583  |  mov L:RB, SAVE_L
1584  |  mov L:PC, TMP1
1585  |  mov BASE, L:RB->base
1586  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
1587  |  set_vmstate INTERP
1588  |
1589  |  cmp eax, LUA_YIELD
1590  |  ja >8
1591  |4:
1592  |  mov RA, L:PC->base
1593  |  mov KBASE, L:PC->top
1594  |  mov L:PC->top, RA			// Clear coroutine stack.
1595  |  mov PC, KBASE
1596  |  sub PC, RA
1597  |  je >6				// No results?
1598  |  lea RD, [BASE+PC]
1599  |  shr PCd, 3
1600  |  cmp RD, L:RB->maxstack
1601  |  ja >9				// Need to grow stack?
1602  |
1603  |  mov RB, BASE
1604  |  sub RB, RA
1605  |5:  // Move results from coroutine.
1606  |  mov RD, [RA]
1607  |  mov [RA+RB], RD
1608  |  add RA, 8
1609  |  cmp RA, KBASE
1610  |  jne <5
1611  |6:
1612  |.if resume
1613  |  lea RDd, [PCd+2]			// nresults+1 = 1 + true + results.
1614  |  mov_true ITYPE			// Prepend true to results.
1615  |  mov [BASE-8], ITYPE
1616  |.else
1617  |  lea RDd, [PCd+1]			// nresults+1 = 1 + results.
1618  |.endif
1619  |7:
1620  |  mov PC, SAVE_PC
1621  |  mov MULTRES, RDd
1622  |.if resume
1623  |  mov RA, -8
1624  |.else
1625  |  xor RAd, RAd
1626  |.endif
1627  |  test PCd, FRAME_TYPE
1628  |  jz ->BC_RET_Z
1629  |  jmp ->vm_return
1630  |
1631  |8:  // Coroutine returned with error (at co->top-1).
1632  |.if resume
1633  |  mov_false ITYPE			// Prepend false to results.
1634  |  mov [BASE-8], ITYPE
1635  |  mov RA, L:PC->top
1636  |  sub RA, 8
1637  |  mov L:PC->top, RA			// Clear error from coroutine stack.
1638  |  // Copy error message.
1639  |  mov RD, [RA]
1640  |  mov [BASE], RD
1641  |  mov RDd, 1+2			// nresults+1 = 1 + false + error.
1642  |  jmp <7
1643  |.else
1644  |  mov CARG2, L:PC
1645  |  mov CARG1, L:RB
1646  |  call extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)
1647  |  // Error function does not return.
1648  |.endif
1649  |
1650  |9:  // Handle stack expansion on return from yield.
1651  |  mov L:RA, TMP1
1652  |  mov L:RA->top, KBASE		// Undo coroutine stack clearing.
1653  |  mov CARG2, PC
1654  |  mov CARG1, L:RB
1655  |  call extern lj_state_growstack	// (lua_State *L, int n)
1656  |  mov L:PC, TMP1
1657  |  mov BASE, L:RB->base
1658  |  jmp <4				// Retry the stack move.
1659  |.endmacro
1660  |
1661  |  coroutine_resume_wrap 1		// coroutine.resume
1662  |  coroutine_resume_wrap 0		// coroutine.wrap
1663  |
1664  |.ffunc coroutine_yield
1665  |  mov L:RB, SAVE_L
1666  |  test aword L:RB->cframe, CFRAME_RESUME
1667  |  jz ->fff_fallback
1668  |  mov L:RB->base, BASE
1669  |  lea RD, [BASE+NARGS:RD*8-8]
1670  |  mov L:RB->top, RD
1671  |  xor RDd, RDd
1672  |  mov aword L:RB->cframe, RD
1673  |  mov al, LUA_YIELD
1674  |  mov byte L:RB->status, al
1675  |  jmp ->vm_leave_unw
1676  |
1677  |//-- Math library -------------------------------------------------------
1678  |
1679  |  .ffunc_1 math_abs
1680  |  mov RB, [BASE]
1681  |.if DUALNUM
1682  |  checkint RB, >3
1683  |  cmp RBd, 0; jns ->fff_resi
1684  |  neg RBd; js >2
1685  |->fff_resbit:
1686  |->fff_resi:
1687  |  setint RB
1688  |->fff_resRB:
1689  |  mov PC, [BASE-8]
1690  |  mov [BASE-16], RB
1691  |  jmp ->fff_res1
1692  |2:
1693  |  mov64 RB, U64x(41e00000,00000000)  // 2^31.
1694  |  jmp ->fff_resRB
1695  |3:
1696  |  ja ->fff_fallback
1697  |.else
1698  |  checknum RB, ->fff_fallback
1699  |.endif
1700  |  shl RB, 1
1701  |  shr RB, 1
1702  |  mov PC, [BASE-8]
1703  |  mov [BASE-16], RB
1704  |  jmp ->fff_res1
1705  |
1706  |.ffunc_n math_sqrt, sqrtsd
1707  |->fff_resxmm0:
1708  |  mov PC, [BASE-8]
1709  |  movsd qword [BASE-16], xmm0
1710  |  // fallthrough
1711  |
1712  |->fff_res1:
1713  |  mov RDd, 1+1
1714  |->fff_res:
1715  |  mov MULTRES, RDd
1716  |->fff_res_:
1717  |  test PCd, FRAME_TYPE
1718  |  jnz >7
1719  |5:
1720  |  cmp PC_RB, RDL			// More results expected?
1721  |  ja >6
1722  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.
1723  |  movzx RAd, PC_RA
1724  |  neg RA
1725  |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8
1726  |  ins_next
1727  |
1728  |6:  // Fill up results with nil.
1729  |  mov aword [BASE+RD*8-24], LJ_TNIL
1730  |  add RD, 1
1731  |  jmp <5
1732  |
1733  |7:  // Non-standard return case.
1734  |  mov RA, -16			// Results start at BASE+RA = BASE-16.
1735  |  jmp ->vm_return
1736  |
1737  |.macro math_round, func
1738  |  .ffunc math_ .. func
1739  |.if DUALNUM
1740  |  mov RB, [BASE]
1741  |  checknumx RB, ->fff_resRB, je
1742  |  ja ->fff_fallback
1743  |.else
1744  |  checknumtp [BASE], ->fff_fallback
1745  |.endif
1746  |  movsd xmm0, qword [BASE]
1747  |  call ->vm_ .. func .. _sse
1748  |.if DUALNUM
1749  |  cvttsd2si RBd, xmm0
1750  |  cmp RBd, 0x80000000
1751  |  jne ->fff_resi
1752  |  cvtsi2sd xmm1, RBd
1753  |  ucomisd xmm0, xmm1
1754  |  jp ->fff_resxmm0
1755  |  je ->fff_resi
1756  |.endif
1757  |  jmp ->fff_resxmm0
1758  |.endmacro
1759  |
1760  |  math_round floor
1761  |  math_round ceil
1762  |
1763  |.ffunc math_log
1764  |  cmp NARGS:RDd, 1+1; jne ->fff_fallback	// Exactly one argument.
1765  |  checknumtp [BASE], ->fff_fallback
1766  |  movsd xmm0, qword [BASE]
1767  |  mov RB, BASE
1768  |  call extern log
1769  |  mov BASE, RB
1770  |  jmp ->fff_resxmm0
1771  |
1772  |.macro math_extern, func
1773  |  .ffunc_n math_ .. func
1774  |  mov RB, BASE
1775  |  call extern func
1776  |  mov BASE, RB
1777  |  jmp ->fff_resxmm0
1778  |.endmacro
1779  |
1780  |.macro math_extern2, func
1781  |  .ffunc_nn math_ .. func
1782  |  mov RB, BASE
1783  |  call extern func
1784  |  mov BASE, RB
1785  |  jmp ->fff_resxmm0
1786  |.endmacro
1787  |
1788  |  math_extern log10
1789  |  math_extern exp
1790  |  math_extern sin
1791  |  math_extern cos
1792  |  math_extern tan
1793  |  math_extern asin
1794  |  math_extern acos
1795  |  math_extern atan
1796  |  math_extern sinh
1797  |  math_extern cosh
1798  |  math_extern tanh
1799  |  math_extern2 pow
1800  |  math_extern2 atan2
1801  |  math_extern2 fmod
1802  |
1803  |.ffunc_2 math_ldexp
1804  |  checknumtp [BASE], ->fff_fallback
1805  |  checknumtp [BASE+8], ->fff_fallback
1806  |  fld qword [BASE+8]
1807  |  fld qword [BASE]
1808  |  fscale
1809  |  fpop1
1810  |  mov PC, [BASE-8]
1811  |  fstp qword [BASE-16]
1812  |  jmp ->fff_res1
1813  |
1814  |.ffunc_n math_frexp
1815  |  mov RB, BASE
1816  |.if X64WIN
1817  |  lea CARG2, TMP1		// Caveat: CARG2 == BASE
1818  |.else
1819  |  lea CARG1, TMP1
1820  |.endif
1821  |  call extern frexp
1822  |  mov BASE, RB
1823  |  mov RBd, TMP1d
1824  |  mov PC, [BASE-8]
1825  |  movsd qword [BASE-16], xmm0
1826  |.if DUALNUM
1827  |  setint RB
1828  |  mov [BASE-8], RB
1829  |.else
1830  |  cvtsi2sd xmm1, RBd
1831  |  movsd qword [BASE-8], xmm1
1832  |.endif
1833  |  mov RDd, 1+2
1834  |  jmp ->fff_res
1835  |
1836  |.ffunc_n math_modf
1837  |  mov RB, BASE
1838  |.if X64WIN
1839  |  lea CARG2, [BASE-16]	// Caveat: CARG2 == BASE
1840  |.else
1841  |  lea CARG1, [BASE-16]
1842  |.endif
1843  |  call extern modf
1844  |  mov BASE, RB
1845  |  mov PC, [BASE-8]
1846  |  movsd qword [BASE-8], xmm0
1847  |  mov RDd, 1+2
1848  |  jmp ->fff_res
1849  |
1850  |.macro math_minmax, name, cmovop, sseop
1851  |  .ffunc_1 name
1852  |  mov RAd, 2
1853  |.if DUALNUM
1854  |  mov RB, [BASE]
1855  |  checkint RB, >4
1856  |1:  // Handle integers.
1857  |  cmp RAd, RDd; jae ->fff_resRB
1858  |  mov TMPR, [BASE+RA*8-8]
1859  |  checkint TMPR, >3
1860  |  cmp RBd, TMPRd
1861  |  cmovop RB, TMPR
1862  |  add RAd, 1
1863  |  jmp <1
1864  |3:
1865  |  ja ->fff_fallback
1866  |  // Convert intermediate result to number and continue below.
1867  |  cvtsi2sd xmm0, RBd
1868  |  jmp >6
1869  |4:
1870  |  ja ->fff_fallback
1871  |.else
1872  |  checknumtp [BASE], ->fff_fallback
1873  |.endif
1874  |
1875  |  movsd xmm0, qword [BASE]
1876  |5:  // Handle numbers or integers.
1877  |  cmp RAd, RDd; jae ->fff_resxmm0
1878  |.if DUALNUM
1879  |  mov RB, [BASE+RA*8-8]
1880  |  checknumx RB, >6, jb
1881  |  ja ->fff_fallback
1882  |  cvtsi2sd xmm1, RBd
1883  |  jmp >7
1884  |.else
1885  |  checknumtp [BASE+RA*8-8], ->fff_fallback
1886  |.endif
1887  |6:
1888  |  movsd xmm1, qword [BASE+RA*8-8]
1889  |7:
1890  |  sseop xmm0, xmm1
1891  |  add RAd, 1
1892  |  jmp <5
1893  |.endmacro
1894  |
1895  |  math_minmax math_min, cmovg, minsd
1896  |  math_minmax math_max, cmovl, maxsd
1897  |
1898  |//-- String library -----------------------------------------------------
1899  |
1900  |.ffunc string_byte			// Only handle the 1-arg case here.
1901  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback
1902  |  mov STR:RB, [BASE]
1903  |  checkstr STR:RB, ->fff_fallback
1904  |  mov PC, [BASE-8]
1905  |  cmp dword STR:RB->len, 1
1906  |  jb ->fff_res0			// Return no results for empty string.
1907  |  movzx RBd, byte STR:RB[1]
1908  |.if DUALNUM
1909  |  jmp ->fff_resi
1910  |.else
1911  |  cvtsi2sd xmm0, RBd; jmp ->fff_resxmm0
1912  |.endif
1913  |
1914  |.ffunc string_char			// Only handle the 1-arg case here.
1915  |  ffgccheck
1916  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.
1917  |.if DUALNUM
1918  |  mov RB, [BASE]
1919  |  checkint RB, ->fff_fallback
1920  |.else
1921  |  checknumtp [BASE], ->fff_fallback
1922  |  cvttsd2si RBd, qword [BASE]
1923  |.endif
1924  |  cmp RBd, 255;  ja ->fff_fallback
1925  |  mov TMP1d, RBd
1926  |  mov TMPRd, 1
1927  |  lea RD, TMP1			// Points to stack. Little-endian.
1928  |->fff_newstr:
1929  |  mov L:RB, SAVE_L
1930  |  mov L:RB->base, BASE
1931  |  mov CARG3d, TMPRd			// Zero-extended to size_t.
1932  |  mov CARG2, RD
1933  |  mov CARG1, L:RB
1934  |  mov SAVE_PC, PC
1935  |  call extern lj_str_new		// (lua_State *L, char *str, size_t l)
1936  |->fff_resstr:
1937  |  // GCstr * returned in eax (RD).
1938  |  mov BASE, L:RB->base
1939  |  mov PC, [BASE-8]
1940  |  settp STR:RD, LJ_TSTR
1941  |  mov [BASE-16], STR:RD
1942  |  jmp ->fff_res1
1943  |
1944  |.ffunc string_sub
1945  |  ffgccheck
1946  |  mov TMPRd, -1
1947  |  cmp NARGS:RDd, 1+2;  jb ->fff_fallback
1948  |  jna >1
1949  |.if DUALNUM
1950  |  mov TMPR, [BASE+16]
1951  |  checkint TMPR, ->fff_fallback
1952  |.else
1953  |  checknumtp [BASE+16], ->fff_fallback
1954  |  cvttsd2si TMPRd, qword [BASE+16]
1955  |.endif
1956  |1:
1957  |  mov STR:RB, [BASE]
1958  |  checkstr STR:RB, ->fff_fallback
1959  |.if DUALNUM
1960  |  mov ITYPE, [BASE+8]
1961  |  mov RAd, ITYPEd			// Must clear hiword for lea below.
1962  |  sar ITYPE, 47
1963  |  cmp ITYPEd, LJ_TISNUM
1964  |  jne ->fff_fallback
1965  |.else
1966  |  checknumtp [BASE+8], ->fff_fallback
1967  |  cvttsd2si RAd, qword [BASE+8]
1968  |.endif
1969  |  mov RCd, STR:RB->len
1970  |  cmp RCd, TMPRd			// len < end? (unsigned compare)
1971  |  jb >5
1972  |2:
1973  |  test RAd, RAd			// start <= 0?
1974  |  jle >7
1975  |3:
1976  |  sub TMPRd, RAd			// start > end?
1977  |  jl ->fff_emptystr
1978  |  lea RD, [STR:RB+RAd+#STR-1]
1979  |  add TMPRd, 1
1980  |4:
1981  |  jmp ->fff_newstr
1982  |
1983  |5:  // Negative end or overflow.
1984  |  jl >6
1985  |  lea TMPRd, [TMPRd+RCd+1]		// end = end+(len+1)
1986  |  jmp <2
1987  |6:  // Overflow.
1988  |  mov TMPRd, RCd			// end = len
1989  |  jmp <2
1990  |
1991  |7:  // Negative start or underflow.
1992  |  je >8
1993  |  add RAd, RCd			// start = start+(len+1)
1994  |  add RAd, 1
1995  |  jg <3				// start > 0?
1996  |8:  // Underflow.
1997  |  mov RAd, 1				// start = 1
1998  |  jmp <3
1999  |
2000  |->fff_emptystr:  // Range underflow.
2001  |  xor TMPRd, TMPRd			// Zero length. Any ptr in RD is ok.
2002  |  jmp <4
2003  |
2004  |.macro ffstring_op, name
2005  |  .ffunc_1 string_ .. name
2006  |  ffgccheck
2007  |.if X64WIN
2008  |  mov STR:TMPR, [BASE]
2009  |  checkstr STR:TMPR, ->fff_fallback
2010  |.else
2011  |  mov STR:CARG2, [BASE]
2012  |  checkstr STR:CARG2, ->fff_fallback
2013  |.endif
2014  |  mov L:RB, SAVE_L
2015  |   lea SBUF:CARG1, [DISPATCH+DISPATCH_GL(tmpbuf)]
2016  |  mov L:RB->base, BASE
2017  |.if X64WIN
2018  |  mov STR:CARG2, STR:TMPR		// Caveat: CARG2 == BASE
2019  |.endif
2020  |   mov RC, SBUF:CARG1->b
2021  |   mov SBUF:CARG1->L, L:RB
2022  |   mov SBUF:CARG1->w, RC
2023  |  mov SAVE_PC, PC
2024  |  call extern lj_buf_putstr_ .. name
2025  |  mov CARG1, rax
2026  |  call extern lj_buf_tostr
2027  |  jmp ->fff_resstr
2028  |.endmacro
2029  |
2030  |ffstring_op reverse
2031  |ffstring_op lower
2032  |ffstring_op upper
2033  |
2034  |//-- Bit library --------------------------------------------------------
2035  |
2036  |.macro .ffunc_bit, name, kind, fdef
2037  |  fdef name
2038  |.if kind == 2
2039  |  sseconst_tobit xmm1, RB
2040  |.endif
2041  |.if DUALNUM
2042  |  mov RB, [BASE]
2043  |  checkint RB, >1
2044  |.if kind > 0
2045  |  jmp >2
2046  |.else
2047  |  jmp ->fff_resbit
2048  |.endif
2049  |1:
2050  |  ja ->fff_fallback
2051  |  movd xmm0, RB
2052  |.else
2053  |  checknumtp [BASE], ->fff_fallback
2054  |  movsd xmm0, qword [BASE]
2055  |.endif
2056  |.if kind < 2
2057  |  sseconst_tobit xmm1, RB
2058  |.endif
2059  |  addsd xmm0, xmm1
2060  |  movd RBd, xmm0
2061  |2:
2062  |.endmacro
2063  |
2064  |.macro .ffunc_bit, name, kind
2065  |  .ffunc_bit name, kind, .ffunc_1
2066  |.endmacro
2067  |
2068  |.ffunc_bit bit_tobit, 0
2069  |  jmp ->fff_resbit
2070  |
2071  |.macro .ffunc_bit_op, name, ins
2072  |  .ffunc_bit name, 2
2073  |  mov TMPRd, NARGS:RDd		// Save for fallback.
2074  |  lea RD, [BASE+NARGS:RD*8-16]
2075  |1:
2076  |  cmp RD, BASE
2077  |  jbe ->fff_resbit
2078  |.if DUALNUM
2079  |  mov RA, [RD]
2080  |  checkint RA, >2
2081  |  ins RBd, RAd
2082  |  sub RD, 8
2083  |  jmp <1
2084  |2:
2085  |  ja ->fff_fallback_bit_op
2086  |  movd xmm0, RA
2087  |.else
2088  |  checknumtp [RD], ->fff_fallback_bit_op
2089  |  movsd xmm0, qword [RD]
2090  |.endif
2091  |  addsd xmm0, xmm1
2092  |  movd RAd, xmm0
2093  |  ins RBd, RAd
2094  |  sub RD, 8
2095  |  jmp <1
2096  |.endmacro
2097  |
2098  |.ffunc_bit_op bit_band, and
2099  |.ffunc_bit_op bit_bor, or
2100  |.ffunc_bit_op bit_bxor, xor
2101  |
2102  |.ffunc_bit bit_bswap, 1
2103  |  bswap RBd
2104  |  jmp ->fff_resbit
2105  |
2106  |.ffunc_bit bit_bnot, 1
2107  |  not RBd
2108  |.if DUALNUM
2109  |  jmp ->fff_resbit
2110  |.else
2111  |->fff_resbit:
2112  |  cvtsi2sd xmm0, RBd
2113  |  jmp ->fff_resxmm0
2114  |.endif
2115  |
2116  |->fff_fallback_bit_op:
2117  |  mov NARGS:RDd, TMPRd		// Restore for fallback
2118  |  jmp ->fff_fallback
2119  |
2120  |.macro .ffunc_bit_sh, name, ins
2121  |.if DUALNUM
2122  |  .ffunc_bit name, 1, .ffunc_2
2123  |  // Note: no inline conversion from number for 2nd argument!
2124  |  mov RA, [BASE+8]
2125  |  checkint RA, ->fff_fallback
2126  |.else
2127  |  .ffunc_nn name
2128  |  sseconst_tobit xmm2, RB
2129  |  addsd xmm0, xmm2
2130  |  addsd xmm1, xmm2
2131  |  movd RBd, xmm0
2132  |  movd RAd, xmm1
2133  |.endif
2134  |  ins RBd, cl			// Assumes RA is ecx.
2135  |  jmp ->fff_resbit
2136  |.endmacro
2137  |
2138  |.ffunc_bit_sh bit_lshift, shl
2139  |.ffunc_bit_sh bit_rshift, shr
2140  |.ffunc_bit_sh bit_arshift, sar
2141  |.ffunc_bit_sh bit_rol, rol
2142  |.ffunc_bit_sh bit_ror, ror
2143  |
2144  |//-----------------------------------------------------------------------
2145  |
2146  |->fff_fallback_2:
2147  |  mov NARGS:RDd, 1+2			// Other args are ignored, anyway.
2148  |  jmp ->fff_fallback
2149  |->fff_fallback_1:
2150  |  mov NARGS:RDd, 1+1			// Other args are ignored, anyway.
2151  |->fff_fallback:			// Call fast function fallback handler.
2152  |  // BASE = new base, RD = nargs+1
2153  |  mov L:RB, SAVE_L
2154  |  mov PC, [BASE-8]			// Fallback may overwrite PC.
2155  |  mov SAVE_PC, PC			// Redundant (but a defined value).
2156  |  mov L:RB->base, BASE
2157  |  lea RD, [BASE+NARGS:RD*8-8]
2158  |  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.
2159  |  mov L:RB->top, RD
2160  |  mov CFUNC:RD, [BASE-16]
2161  |  cleartp CFUNC:RD
2162  |  cmp RA, L:RB->maxstack
2163  |  ja >5				// Need to grow stack.
2164  |  mov CARG1, L:RB
2165  |  call aword CFUNC:RD->f		// (lua_State *L)
2166  |  mov BASE, L:RB->base
2167  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.
2168  |  test RDd, RDd; jg ->fff_res	// Returned nresults+1?
2169  |1:
2170  |  mov RA, L:RB->top
2171  |  sub RA, BASE
2172  |  shr RAd, 3
2173  |  test RDd, RDd
2174  |  lea NARGS:RDd, [RAd+1]
2175  |  mov LFUNC:RB, [BASE-16]
2176  |  jne ->vm_call_tail			// Returned -1?
2177  |  cleartp LFUNC:RB
2178  |  ins_callt				// Returned 0: retry fast path.
2179  |
2180  |// Reconstruct previous base for vmeta_call during tailcall.
2181  |->vm_call_tail:
2182  |  mov RA, BASE
2183  |  test PCd, FRAME_TYPE
2184  |  jnz >3
2185  |  movzx RBd, PC_RA
2186  |  neg RB
2187  |  lea BASE, [BASE+RB*8-16]		// base = base - (RB+2)*8
2188  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.
2189  |3:
2190  |  mov RB, PC
2191  |  and RB, -8
2192  |  sub BASE, RB
2193  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.
2194  |
2195  |5:  // Grow stack for fallback handler.
2196  |  mov CARG2d, LUA_MINSTACK
2197  |  mov CARG1, L:RB
2198  |  call extern lj_state_growstack	// (lua_State *L, int n)
2199  |  mov BASE, L:RB->base
2200  |  xor RDd, RDd			// Simulate a return 0.
2201  |  jmp <1				// Dumb retry (goes through ff first).
2202  |
2203  |->fff_gcstep:			// Call GC step function.
2204  |  // BASE = new base, RD = nargs+1
2205  |  pop RB				// Must keep stack at same level.
2206  |  mov TMP1, RB			// Save return address
2207  |  mov L:RB, SAVE_L
2208  |  mov SAVE_PC, PC			// Redundant (but a defined value).
2209  |  mov L:RB->base, BASE
2210  |  lea RD, [BASE+NARGS:RD*8-8]
2211  |  mov CARG1, L:RB
2212  |  mov L:RB->top, RD
2213  |  call extern lj_gc_step		// (lua_State *L)
2214  |  mov BASE, L:RB->base
2215  |  mov RD, L:RB->top
2216  |  sub RD, BASE
2217  |  shr RDd, 3
2218  |  add NARGS:RDd, 1
2219  |  mov RB, TMP1
2220  |  push RB				// Restore return address.
2221  |  ret
2222  |
2223  |//-----------------------------------------------------------------------
2224  |//-- Special dispatch targets -------------------------------------------
2225  |//-----------------------------------------------------------------------
2226  |
2227  |->vm_record:				// Dispatch target for recording phase.
2228  |.if JIT
2229  |  endbr
2230  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)]
2231  |  test RDL, HOOK_VMEVENT		// No recording while in vmevent.
2232  |  jnz >5
2233  |  // Decrement the hookcount for consistency, but always do the call.
2234  |  test RDL, HOOK_ACTIVE
2235  |  jnz >1
2236  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT
2237  |  jz >1
2238  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)]
2239  |  jmp >1
2240  |.endif
2241  |
2242  |->vm_rethook:			// Dispatch target for return hooks.
2243  |  endbr
2244  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)]
2245  |  test RDL, HOOK_ACTIVE		// Hook already active?
2246  |  jnz >5
2247  |  jmp >1
2248  |
2249  |->vm_inshook:			// Dispatch target for instr/line hooks.
2250  |  endbr
2251  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)]
2252  |  test RDL, HOOK_ACTIVE		// Hook already active?
2253  |  jnz >5
2254  |
2255  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT
2256  |  jz >5
2257  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)]
2258  |  jz >1
2259  |  test RDL, LUA_MASKLINE
2260  |  jz >5
2261  |1:
2262  |  mov L:RB, SAVE_L
2263  |  mov L:RB->base, BASE
2264  |  mov CARG2, PC			// Caveat: CARG2 == BASE
2265  |  mov CARG1, L:RB
2266  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.
2267  |  call extern lj_dispatch_ins	// (lua_State *L, const BCIns *pc)
2268  |3:
2269  |  mov BASE, L:RB->base
2270  |4:
2271  |  movzx RAd, PC_RA
2272  |5:
2273  |  movzx OP, PC_OP
2274  |  movzx RDd, PC_RD
2275  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.
2276  |
2277  |->cont_hook:				// Continue from hook yield.
2278  |  endbr
2279  |  add PC, 4
2280  |  mov RA, [RB-40]
2281  |  mov MULTRES, RAd			// Restore MULTRES for *M ins.
2282  |  jmp <4
2283  |
2284  |->vm_hotloop:			// Hot loop counter underflow.
2285  |.if JIT
2286  |  mov LFUNC:RB, [BASE-16]		// Same as curr_topL(L).
2287  |  cleartp LFUNC:RB
2288  |  mov RB, LFUNC:RB->pc
2289  |  movzx RDd, byte [RB+PC2PROTO(framesize)]
2290  |  lea RD, [BASE+RD*8]
2291  |  mov L:RB, SAVE_L
2292  |  mov L:RB->base, BASE
2293  |  mov L:RB->top, RD
2294  |  mov CARG2, PC
2295  |  lea CARG1, [DISPATCH+GG_DISP2J]
2296  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB
2297  |  mov SAVE_PC, PC
2298  |  call extern lj_trace_hot		// (jit_State *J, const BCIns *pc)
2299  |  jmp <3
2300  |.endif
2301  |
2302  |->vm_callhook:			// Dispatch target for call hooks.
2303  |  endbr
2304  |  mov SAVE_PC, PC
2305  |.if JIT
2306  |  jmp >1
2307  |.endif
2308  |
2309  |->vm_hotcall:			// Hot call counter underflow.
2310  |.if JIT
2311  |  mov SAVE_PC, PC
2312  |  or PC, 1				// Marker for hot call.
2313  |1:
2314  |.endif
2315  |  lea RD, [BASE+NARGS:RD*8-8]
2316  |  mov L:RB, SAVE_L
2317  |  mov L:RB->base, BASE
2318  |  mov L:RB->top, RD
2319  |  mov CARG2, PC
2320  |  mov CARG1, L:RB
2321  |  call extern lj_dispatch_call	// (lua_State *L, const BCIns *pc)
2322  |  // ASMFunction returned in eax/rax (RD).
2323  |  mov SAVE_PC, 0			// Invalidate for subsequent line hook.
2324  |.if JIT
2325  |  and PC, -2
2326  |.endif
2327  |  mov BASE, L:RB->base
2328  |  mov RA, RD
2329  |  mov RD, L:RB->top
2330  |  sub RD, BASE
2331  |  mov RB, RA
2332  |  movzx RAd, PC_RA
2333  |  shr RDd, 3
2334  |  add NARGS:RDd, 1
2335  |  jmp RB
2336  |
2337  |->cont_stitch:			// Trace stitching.
2338  |.if JIT
2339  |  // BASE = base, RC = result, RB = mbase
2340  |  endbr
2341  |  mov TRACE:ITYPE, [RB-40]		// Save previous trace.
2342  |  cleartp TRACE:ITYPE
2343  |  mov TMPRd, MULTRES
2344  |  movzx RAd, PC_RA
2345  |  lea RA, [BASE+RA*8]		// Call base.
2346  |  sub TMPRd, 1
2347  |  jz >2
2348  |1:  // Move results down.
2349  |  mov RB, [RC]
2350  |  mov [RA], RB
2351  |  add RC, 8
2352  |  add RA, 8
2353  |  sub TMPRd, 1
2354  |  jnz <1
2355  |2:
2356  |  movzx RCd, PC_RA
2357  |  movzx RBd, PC_RB
2358  |  add RC, RB
2359  |  lea RC, [BASE+RC*8-8]
2360  |3:
2361  |  cmp RC, RA
2362  |  ja >9				// More results wanted?
2363  |
2364  |  test TRACE:ITYPE, TRACE:ITYPE
2365  |  jz ->cont_nop
2366  |  movzx RBd, word TRACE:ITYPE->traceno
2367  |  movzx RDd, word TRACE:ITYPE->link
2368  |  cmp RDd, RBd
2369  |  je ->cont_nop			// Blacklisted.
2370  |  test RDd, RDd
2371  |  jne =>BC_JLOOP			// Jump to stitched trace.
2372  |
2373  |  // Stitch a new trace to the previous trace.
2374  |  mov [DISPATCH+DISPATCH_J(exitno)], RB
2375  |  mov L:RB, SAVE_L
2376  |  mov L:RB->base, BASE
2377  |  mov CARG2, PC
2378  |  lea CARG1, [DISPATCH+GG_DISP2J]
2379  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB
2380  |  call extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)
2381  |  mov BASE, L:RB->base
2382  |  jmp ->cont_nop
2383  |
2384  |9:  // Fill up results with nil.
2385  |  mov aword [RA], LJ_TNIL
2386  |  add RA, 8
2387  |  jmp <3
2388  |.endif
2389  |
2390  |->vm_profhook:			// Dispatch target for profiler hook.
2391#if LJ_HASPROFILE
2392  |  endbr
2393  |  mov L:RB, SAVE_L
2394  |  mov L:RB->base, BASE
2395  |  mov CARG2, PC			// Caveat: CARG2 == BASE
2396  |  mov CARG1, L:RB
2397  |  call extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)
2398  |  mov BASE, L:RB->base
2399  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.
2400  |  sub PC, 4
2401  |  jmp ->cont_nop
2402#endif
2403  |
2404  |//-----------------------------------------------------------------------
2405  |//-- Trace exit handler -------------------------------------------------
2406  |//-----------------------------------------------------------------------
2407  |
2408  |// Called from an exit stub with the exit number on the stack.
2409  |// The 16 bit exit number is stored with two (sign-extended) push imm8.
2410  |->vm_exit_handler:
2411  |.if JIT
2412  |  endbr
2413  |  push r13; push r12
2414  |  push r11; push r10; push r9; push r8
2415  |  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp
2416  |  push rbx; push rdx; push rcx; push rax
2417  |  movzx RCd, byte [rbp-8]		// Reconstruct exit number.
2418  |  mov RCH, byte [rbp-16]
2419  |  mov [rbp-8], r15; mov [rbp-16], r14
2420  |  // DISPATCH is preserved on-trace in LJ_GC64 mode.
2421  |  mov RAd, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.
2422  |  set_vmstate EXIT
2423  |  mov [DISPATCH+DISPATCH_J(exitno)], RCd
2424  |  mov [DISPATCH+DISPATCH_J(parent)], RAd
2425  |.if X64WIN
2426  |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.
2427  |.else
2428  |  sub rsp, 16*8			// Room for SSE regs.
2429  |.endif
2430  |  add rbp, -128
2431  |  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14
2432  |  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12
2433  |  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10
2434  |  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8
2435  |  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6
2436  |  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4
2437  |  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2
2438  |  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0
2439  |  // Caveat: RB is rbp.
2440  |  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)]
2441  |  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)]
2442  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB
2443  |  mov L:RB->base, BASE
2444  |.if X64WIN
2445  |  lea CARG2, [rsp+4*8]
2446  |.else
2447  |  mov CARG2, rsp
2448  |.endif
2449  |  lea CARG1, [DISPATCH+GG_DISP2J]
2450  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
2451  |  call extern lj_trace_exit		// (jit_State *J, ExitState *ex)
2452  |  // MULTRES or negated error code returned in eax (RD).
2453  |  mov RA, L:RB->cframe
2454  |  and RA, CFRAME_RAWMASK
2455  |  mov [RA+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).
2456  |  mov BASE, L:RB->base
2457  |  mov PC, [RA+CFRAME_OFS_PC]	// Get SAVE_PC.
2458  |  jmp >1
2459  |.endif
2460  |->vm_exit_interp:
2461  |  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.
2462  |  endbr
2463  |.if JIT
2464  |  // Restore additional callee-save registers only used in compiled code.
2465  |.if X64WIN
2466  |  lea RA, [rsp+10*16+4*8]
2467  |1:
2468  |  movdqa xmm15, [RA-10*16]
2469  |  movdqa xmm14, [RA-9*16]
2470  |  movdqa xmm13, [RA-8*16]
2471  |  movdqa xmm12, [RA-7*16]
2472  |  movdqa xmm11, [RA-6*16]
2473  |  movdqa xmm10, [RA-5*16]
2474  |  movdqa xmm9, [RA-4*16]
2475  |  movdqa xmm8, [RA-3*16]
2476  |  movdqa xmm7, [RA-2*16]
2477  |  mov rsp, RA			// Reposition stack to C frame.
2478  |  movdqa xmm6, [RA-1*16]
2479  |  mov r15, CSAVE_1
2480  |  mov r14, CSAVE_2
2481  |  mov r13, CSAVE_3
2482  |  mov r12, CSAVE_4
2483  |.else
2484  |  lea RA, [rsp+16]
2485  |1:
2486  |  mov r13, [RA-8]
2487  |  mov r12, [RA]
2488  |  mov rsp, RA			// Reposition stack to C frame.
2489  |.endif
2490  |  cmp RDd, -LUA_ERRERR; jae >9	// Check for error from exit.
2491  |  mov L:RB, SAVE_L
2492  |  mov MULTRES, RDd
2493  |  mov LFUNC:KBASE, [BASE-16]
2494  |  cleartp LFUNC:KBASE
2495  |  mov KBASE, LFUNC:KBASE->pc
2496  |  mov KBASE, [KBASE+PC2PROTO(k)]
2497  |  mov L:RB->base, BASE
2498  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
2499  |  set_vmstate INTERP
2500  |  // Modified copy of ins_next which handles function header dispatch, too.
2501  |  mov RCd, [PC]
2502  |  movzx RAd, RCH
2503  |  movzx OP, RCL
2504  |  add PC, 4
2505  |  shr RCd, 16
2506  |  cmp MULTRES, -17			// Static dispatch?
2507  |  je >5
2508  |  cmp OP, BC_FUNCF			// Function header?
2509  |  jb >3
2510  |  cmp OP, BC_FUNCC+2			// Fast function?
2511  |  jae >4
2512  |2:
2513  |  mov RCd, MULTRES			// RC/RD holds nres+1.
2514  |3:
2515  |  jmp aword [DISPATCH+OP*8]
2516  |
2517  |4:  // Check frame below fast function.
2518  |  mov RC, [BASE-8]
2519  |  test RCd, FRAME_TYPE
2520  |  jnz <2				// Trace stitching continuation?
2521  |  // Otherwise set KBASE for Lua function below fast function.
2522  |  movzx RCd, byte [RC-3]
2523  |  neg RC
2524  |  mov LFUNC:KBASE, [BASE+RC*8-32]
2525  |  cleartp LFUNC:KBASE
2526  |  mov KBASE, LFUNC:KBASE->pc
2527  |  mov KBASE, [KBASE+PC2PROTO(k)]
2528  |  jmp <2
2529  |
2530  |5:  // Dispatch to static entry of original ins replaced by BC_JLOOP.
2531  |  mov RA, [DISPATCH+DISPATCH_J(trace)]
2532  |  mov TRACE:RA, [RA+RD*8]
2533  |  mov RCd, TRACE:RA->startins
2534  |  movzx RAd, RCH
2535  |  movzx OP, RCL
2536  |  shr RCd, 16
2537  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]
2538  |
2539  |9:  // Rethrow error from the right C frame.
2540  |  mov CARG2d, RDd
2541  |  mov CARG1, L:RB
2542  |  neg CARG2d
2543  |  call extern lj_err_trace		// (lua_State *L, int errcode)
2544  |.endif
2545  |
2546  |//-----------------------------------------------------------------------
2547  |//-- Math helper functions ----------------------------------------------
2548  |//-----------------------------------------------------------------------
2549  |
2550  |// FP value rounding. Called by math.floor/math.ceil fast functions
2551  |// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.
2552  |.macro vm_round, name, mode, cond
2553  |->name:
2554  |->name .. _sse:
2555  |  endbr
2556  |  sseconst_abs xmm2, RD
2557  |  sseconst_2p52 xmm3, RD
2558  |  movaps xmm1, xmm0
2559  |  andpd xmm1, xmm2			// |x|
2560  |  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.
2561  |  jbe >1
2562  |  andnpd xmm2, xmm0			// Isolate sign bit.
2563  |.if mode == 2		// trunc(x)?
2564  |  movaps xmm0, xmm1
2565  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52
2566  |  subsd xmm1, xmm3
2567  |  sseconst_1 xmm3, RD
2568  |  cmpsd xmm0, xmm1, 1		// |x| < result?
2569  |  andpd xmm0, xmm3
2570  |  subsd xmm1, xmm0			// If yes, subtract -1.
2571  |  orpd xmm1, xmm2			// Merge sign bit back in.
2572  |.else
2573  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52
2574  |  subsd xmm1, xmm3
2575  |  orpd xmm1, xmm2			// Merge sign bit back in.
2576  |  sseconst_1 xmm3, RD
2577  |  .if mode == 1		// ceil(x)?
2578  |    cmpsd xmm0, xmm1, 6		// x > result?
2579  |    andpd xmm0, xmm3
2580  |    addsd xmm1, xmm0			// If yes, add 1.
2581  |    orpd xmm1, xmm2			// Merge sign bit back in (again).
2582  |  .else			// floor(x)?
2583  |    cmpsd xmm0, xmm1, 1		// x < result?
2584  |    andpd xmm0, xmm3
2585  |    subsd xmm1, xmm0			// If yes, subtract 1.
2586  |  .endif
2587  |.endif
2588  |  movaps xmm0, xmm1
2589  |1:
2590  |  ret
2591  |.endmacro
2592  |
2593  |  vm_round vm_floor, 0, 1
2594  |  vm_round vm_ceil,  1, JIT
2595  |  vm_round vm_trunc, 2, JIT
2596  |
2597  |// FP modulo x%y. Called by BC_MOD* and vm_arith.
2598  |->vm_mod:
2599  |// Args in xmm0/xmm1, return value in xmm0.
2600  |// Caveat: xmm0-xmm5 and RC (eax) modified!
2601  |  movaps xmm5, xmm0
2602  |  divsd xmm0, xmm1
2603  |  sseconst_abs xmm2, RD
2604  |  sseconst_2p52 xmm3, RD
2605  |  movaps xmm4, xmm0
2606  |  andpd xmm4, xmm2			// |x/y|
2607  |  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.
2608  |  jbe >1
2609  |  andnpd xmm2, xmm0			// Isolate sign bit.
2610  |  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52
2611  |  subsd xmm4, xmm3
2612  |  orpd xmm4, xmm2			// Merge sign bit back in.
2613  |  sseconst_1 xmm2, RD
2614  |  cmpsd xmm0, xmm4, 1		// x/y < result?
2615  |  andpd xmm0, xmm2
2616  |  subsd xmm4, xmm0			// If yes, subtract 1.0.
2617  |  movaps xmm0, xmm5
2618  |  mulsd xmm1, xmm4
2619  |  subsd xmm0, xmm1
2620  |  ret
2621  |1:
2622  |  mulsd xmm1, xmm0
2623  |  movaps xmm0, xmm5
2624  |  subsd xmm0, xmm1
2625  |  ret
2626  |
2627  |//-----------------------------------------------------------------------
2628  |//-- Number conversion functions ----------------------------------------
2629  |//-----------------------------------------------------------------------
2630  |
2631  |// int64_t lj_vm_num2int_check(double x)
2632  |->vm_num2int_check:
2633  |  cvttsd2si eax, xmm0
2634  |  xorps xmm1, xmm1
2635  |  cvtsi2sd xmm1, eax
2636  |  ucomisd xmm1, xmm0
2637  |  jp >1
2638  |  jne >1
2639  |  ret
2640  |1:
2641  |  mov64 rax, U64x(80000000,80000000)
2642  |  ret
2643  |
2644  |// int64_t lj_vm_num2i64(double x)
2645  |->vm_num2i64:
2646  |  cvttsd2si rax, xmm0
2647  |  ret
2648  |
2649  |// uint64_t lj_vm_num2u64(double x)
2650  |->vm_num2u64:
2651  |  cvttsd2si rax, xmm0		// Convert [-2^63..2^63) range.
2652  |  cmp rax, 1	// Indefinite result -0x8000000000000000LL - 1 sets overflow.
2653  |  jo >1
2654  |  ret
2655  |1:
2656  |  mov64 rdx, U64x(c3f00000,00000000)	// -0x1p64 (double).
2657  |  movd xmm1, rdx
2658  |  addsd xmm0,  xmm1
2659  |  cvttsd2si rax, xmm0		// Convert [2^63..2^64+2^63) range.
2660  |  // Note that -0x1p63 converts to -0x8000000000000000LL either way.
2661  |  ret
2662  |
2663  |// int32_t lj_vm_tobit(double x)
2664  |->vm_tobit:
2665  |  sseconst_tobit xmm1, RC
2666  |  addsd xmm0, xmm1
2667  |  movd eax, xmm0
2668  |  ret
2669  |
2670  |//-----------------------------------------------------------------------
2671  |//-- Miscellaneous functions --------------------------------------------
2672  |//-----------------------------------------------------------------------
2673  |
2674  |// int lj_vm_cpuid(uint32_t f, uint32_t res[4])
2675  |->vm_cpuid:
2676  |  mov eax, CARG1d
2677  |  .if X64WIN; push rsi; mov rsi, CARG2; .endif
2678  |  push rbx
2679  |  xor ecx, ecx
2680  |  cpuid
2681  |  mov [rsi], eax
2682  |  mov [rsi+4], ebx
2683  |  mov [rsi+8], ecx
2684  |  mov [rsi+12], edx
2685  |  pop rbx
2686  |  .if X64WIN; pop rsi; .endif
2687  |  ret
2688  |
2689  |.define NEXT_TAB,		TAB:CARG1
2690  |.define NEXT_IDX,		CARG2d
2691  |.define NEXT_IDXa,		CARG2
2692  |.define NEXT_PTR,		RC
2693  |.define NEXT_PTRd,		RCd
2694  |.define NEXT_TMP,		CARG3
2695  |.define NEXT_ASIZE,		CARG4d
2696  |.macro NEXT_RES_IDXL, op2;	lea edx, [NEXT_IDX+op2]; .endmacro
2697  |.if X64WIN
2698  |.define NEXT_RES_PTR,	[rsp+aword*5]
2699  |.macro NEXT_RES_IDX, op2;	add NEXT_IDX, op2; .endmacro
2700  |.else
2701  |.define NEXT_RES_PTR,	[rsp+aword*1]
2702  |.macro NEXT_RES_IDX, op2;	lea edx, [NEXT_IDX+op2]; .endmacro
2703  |.endif
2704  |
2705  |// TValue *lj_vm_next(GCtab *t, uint32_t idx)
2706  |// Next idx returned in edx.
2707  |->vm_next:
2708  |.if JIT
2709  |  endbr
2710  |  mov NEXT_ASIZE, NEXT_TAB->asize
2711  |1:  // Traverse array part.
2712  |  cmp NEXT_IDX, NEXT_ASIZE;  jae >5
2713  |  mov NEXT_TMP, NEXT_TAB->array
2714  |  mov NEXT_TMP, qword [NEXT_TMP+NEXT_IDX*8]
2715  |  cmp NEXT_TMP, LJ_TNIL;  je >2
2716  |  lea NEXT_PTR, NEXT_RES_PTR
2717  |  mov qword [NEXT_PTR], NEXT_TMP
2718  |.if DUALNUM
2719  |  setint NEXT_TMP, NEXT_IDXa
2720  |  mov qword [NEXT_PTR+qword*1], NEXT_TMP
2721  |.else
2722  |  cvtsi2sd xmm0, NEXT_IDX
2723  |  movsd qword [NEXT_PTR+qword*1], xmm0
2724  |.endif
2725  |  NEXT_RES_IDX 1
2726  |  ret
2727  |2:  // Skip holes in array part.
2728  |  add NEXT_IDX, 1
2729  |  jmp <1
2730  |
2731  |5:  // Traverse hash part.
2732  |  sub NEXT_IDX, NEXT_ASIZE
2733  |6:
2734  |  cmp NEXT_IDX, NEXT_TAB->hmask; ja >9
2735  |  imul NEXT_PTRd, NEXT_IDX, #NODE
2736  |  add NODE:NEXT_PTR, NEXT_TAB->node
2737  |  cmp qword NODE:NEXT_PTR->val, LJ_TNIL; je >7
2738  |  NEXT_RES_IDXL NEXT_ASIZE+1
2739  |  ret
2740  |7:  // Skip holes in hash part.
2741  |  add NEXT_IDX, 1
2742  |  jmp <6
2743  |
2744  |9:  // End of iteration. Set the key to nil (not the value).
2745  |  NEXT_RES_IDX NEXT_ASIZE
2746  |  lea NEXT_PTR, NEXT_RES_PTR
2747  |  mov qword [NEXT_PTR+qword*1], LJ_TNIL
2748  |  ret
2749  |.endif
2750  |
2751  |//-----------------------------------------------------------------------
2752  |//-- Assertions ---------------------------------------------------------
2753  |//-----------------------------------------------------------------------
2754  |
2755  |->assert_bad_for_arg_type:
2756#ifdef LUA_USE_ASSERT
2757  |  int3
2758#endif
2759  |  int3
2760  |
2761  |//-----------------------------------------------------------------------
2762  |//-- FFI helper functions -----------------------------------------------
2763  |//-----------------------------------------------------------------------
2764  |
2765  |// Handler for callback functions. Callback slot number in ah/al.
2766  |->vm_ffi_callback:
2767  |.if FFI
2768  |.type CTSTATE, CTState, PC
2769  |  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.
2770  |  lea DISPATCH, [ebp+GG_G2DISP]
2771  |  mov CTSTATE, GL:ebp->ctype_state
2772  |  movzx eax, ax
2773  |  mov CTSTATE->cb.slot, eax
2774  |  mov CTSTATE->cb.gpr[0], CARG1
2775  |  mov CTSTATE->cb.gpr[1], CARG2
2776  |  mov CTSTATE->cb.gpr[2], CARG3
2777  |  mov CTSTATE->cb.gpr[3], CARG4
2778  |  movsd qword CTSTATE->cb.fpr[0], xmm0
2779  |  movsd qword CTSTATE->cb.fpr[1], xmm1
2780  |  movsd qword CTSTATE->cb.fpr[2], xmm2
2781  |  movsd qword CTSTATE->cb.fpr[3], xmm3
2782  |.if X64WIN
2783  |  lea rax, [rsp+CFRAME_SIZE+4*8]
2784  |.else
2785  |  lea rax, [rsp+CFRAME_SIZE]
2786  |  mov CTSTATE->cb.gpr[4], CARG5
2787  |  mov CTSTATE->cb.gpr[5], CARG6
2788  |  movsd qword CTSTATE->cb.fpr[4], xmm4
2789  |  movsd qword CTSTATE->cb.fpr[5], xmm5
2790  |  movsd qword CTSTATE->cb.fpr[6], xmm6
2791  |  movsd qword CTSTATE->cb.fpr[7], xmm7
2792  |.endif
2793  |  mov CTSTATE->cb.stack, rax
2794  |  mov CARG2, rsp
2795  |  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.
2796  |  mov CARG1, CTSTATE
2797  |  call extern lj_ccallback_enter	// (CTState *cts, void *cf)
2798  |  // lua_State * returned in eax (RD).
2799  |  set_vmstate INTERP
2800  |  mov BASE, L:RD->base
2801  |  mov RD, L:RD->top
2802  |  sub RD, BASE
2803  |  mov LFUNC:RB, [BASE-16]
2804  |  cleartp LFUNC:RB
2805  |  shr RD, 3
2806  |  add RD, 1
2807  |  ins_callt
2808  |.endif
2809  |
2810  |->cont_ffi_callback:			// Return from FFI callback.
2811  |.if FFI
2812  |  mov L:RA, SAVE_L
2813  |  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)]
2814  |  mov aword CTSTATE->L, L:RA
2815  |  mov L:RA->base, BASE
2816  |  mov L:RA->top, RB
2817  |  mov CARG1, CTSTATE
2818  |  mov CARG2, RC
2819  |  call extern lj_ccallback_leave	// (CTState *cts, TValue *o)
2820  |  mov rax, CTSTATE->cb.gpr[0]
2821  |  movsd xmm0, qword CTSTATE->cb.fpr[0]
2822  |  jmp ->vm_leave_unw
2823  |.endif
2824  |
2825  |->vm_ffi_call:			// Call C function via FFI.
2826  |  // Caveat: needs special frame unwinding, see below.
2827  |.if FFI
2828  |  .type CCSTATE, CCallState, rbx
2829  |  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1
2830  |
2831  |  // Readjust stack.
2832  |  mov eax, CCSTATE->spadj
2833  |  sub rsp, rax
2834  |
2835  |  // Copy stack slots.
2836  |  movzx ecx, byte CCSTATE->nsp
2837  |  sub ecx, 8
2838  |  js >2
2839  |1:
2840  |  mov rax, [CCSTATE+rcx+offsetof(CCallState, stack)]
2841  |  mov [rsp+rcx+CCALL_SPS_EXTRA*8], rax
2842  |  sub ecx, 8
2843  |  jns <1
2844  |2:
2845  |
2846  |  movzx eax, byte CCSTATE->nfpr
2847  |  mov CARG1, CCSTATE->gpr[0]
2848  |  mov CARG2, CCSTATE->gpr[1]
2849  |  mov CARG3, CCSTATE->gpr[2]
2850  |  mov CARG4, CCSTATE->gpr[3]
2851  |.if not X64WIN
2852  |  mov CARG5, CCSTATE->gpr[4]
2853  |  mov CARG6, CCSTATE->gpr[5]
2854  |.endif
2855  |  test eax, eax; jz >5
2856  |  movaps xmm0, CCSTATE->fpr[0]
2857  |  movaps xmm1, CCSTATE->fpr[1]
2858  |  movaps xmm2, CCSTATE->fpr[2]
2859  |  movaps xmm3, CCSTATE->fpr[3]
2860  |.if not X64WIN
2861  |  cmp eax, 4; jbe >5
2862  |  movaps xmm4, CCSTATE->fpr[4]
2863  |  movaps xmm5, CCSTATE->fpr[5]
2864  |  movaps xmm6, CCSTATE->fpr[6]
2865  |  movaps xmm7, CCSTATE->fpr[7]
2866  |.endif
2867  |5:
2868  |
2869  |  call aword CCSTATE->func
2870  |
2871  |  mov CCSTATE->gpr[0], rax
2872  |  movaps CCSTATE->fpr[0], xmm0
2873  |.if not X64WIN
2874  |  mov CCSTATE->gpr[1], rdx
2875  |  movaps CCSTATE->fpr[1], xmm1
2876  |.endif
2877  |
2878  |  mov rbx, [rbp-8]; leave; ret
2879  |.endif
2880  |// Note: vm_ffi_call must be the last function in this object file!
2881  |
2882  |//-----------------------------------------------------------------------
2883}
2884
2885/* Generate the code for a single instruction. */
2886static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2887{
2888  int vk = 0;
2889  |// Note: aligning all instructions does not pay off.
2890  |=>defop:
2891
2892  switch (op) {
2893#if !LJ_HASJIT
2894  case BC_FORL:
2895  case BC_JFORI:
2896  case BC_JFORL:
2897  case BC_ITERL:
2898  case BC_JITERL:
2899  case BC_LOOP:
2900  case BC_JLOOP:
2901  case BC_FUNCF:
2902  case BC_JFUNCF:
2903  case BC_JFUNCV:
2904#endif
2905  case BC_FUNCV:  /* NYI: compiled vararg functions. */
2906    break;  /* Avoid redundant endbr instructions. */
2907  default:
2908    |  endbr
2909    break;
2910  }
2911
2912  switch (op) {
2913
2914  /* -- Comparison ops ---------------------------------------------------- */
2915
2916  /* Remember: all ops branch for a true comparison, fall through otherwise. */
2917
2918  |.macro jmp_comp, lt, ge, le, gt, target
2919  ||switch (op) {
2920  ||case BC_ISLT:
2921  |   lt target
2922  ||break;
2923  ||case BC_ISGE:
2924  |   ge target
2925  ||break;
2926  ||case BC_ISLE:
2927  |   le target
2928  ||break;
2929  ||case BC_ISGT:
2930  |   gt target
2931  ||break;
2932  ||default: break;  /* Shut up GCC. */
2933  ||}
2934  |.endmacro
2935
2936  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
2937    |  // RA = src1, RD = src2, JMP with RD = target
2938    |  ins_AD
2939    |  mov ITYPE, [BASE+RA*8]
2940    |  mov RB, [BASE+RD*8]
2941    |  mov RA, ITYPE
2942    |  mov RD, RB
2943    |  sar ITYPE, 47
2944    |  sar RB, 47
2945    |.if DUALNUM
2946    |  cmp ITYPEd, LJ_TISNUM; jne >7
2947    |  cmp RBd, LJ_TISNUM; jne >8
2948    |  add PC, 4
2949    |  cmp RAd, RDd
2950    |  jmp_comp jge, jl, jg, jle, >9
2951    |6:
2952    |  movzx RDd, PC_RD
2953    |  branchPC RD
2954    |9:
2955    |  ins_next
2956    |
2957    |7:  // RA is not an integer.
2958    |  ja ->vmeta_comp
2959    |  // RA is a number.
2960    |  cmp RBd, LJ_TISNUM; jb >1; jne ->vmeta_comp
2961    |  // RA is a number, RD is an integer.
2962    |  cvtsi2sd xmm0, RDd
2963    |  jmp >2
2964    |
2965    |8:  // RA is an integer, RD is not an integer.
2966    |  ja ->vmeta_comp
2967    |  // RA is an integer, RD is a number.
2968    |  cvtsi2sd xmm1, RAd
2969    |  movd xmm0, RD
2970    |  jmp >3
2971    |.else
2972    |  cmp ITYPEd, LJ_TISNUM; jae ->vmeta_comp
2973    |  cmp RBd, LJ_TISNUM; jae ->vmeta_comp
2974    |.endif
2975    |1:
2976    |  movd xmm0, RD
2977    |2:
2978    |  movd xmm1, RA
2979    |3:
2980    |  add PC, 4
2981    |  ucomisd xmm0, xmm1
2982    |  // Unordered: all of ZF CF PF set, ordered: PF clear.
2983    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.
2984    |.if DUALNUM
2985    |  jmp_comp jbe, ja, jb, jae, <9
2986    |  jmp <6
2987    |.else
2988    |  jmp_comp jbe, ja, jb, jae, >1
2989    |  movzx RDd, PC_RD
2990    |  branchPC RD
2991    |1:
2992    |  ins_next
2993    |.endif
2994    break;
2995
2996  case BC_ISEQV: case BC_ISNEV:
2997    vk = op == BC_ISEQV;
2998    |  ins_AD	// RA = src1, RD = src2, JMP with RD = target
2999    |  mov RB, [BASE+RD*8]
3000    |  mov ITYPE, [BASE+RA*8]
3001    |  add PC, 4
3002    |  mov RD, RB
3003    |  mov RA, ITYPE
3004    |  sar RB, 47
3005    |  sar ITYPE, 47
3006    |.if DUALNUM
3007    |  cmp RBd, LJ_TISNUM; jne >7
3008    |  cmp ITYPEd, LJ_TISNUM; jne >8
3009    |  cmp RDd, RAd
3010    if (vk) {
3011      |  jne >9
3012    } else {
3013      |  je >9
3014    }
3015    |  movzx RDd, PC_RD
3016    |  branchPC RD
3017    |9:
3018    |  ins_next
3019    |
3020    |7:  // RD is not an integer.
3021    |  ja >5
3022    |  // RD is a number.
3023    |  movd xmm1, RD
3024    |  cmp ITYPEd, LJ_TISNUM; jb >1; jne >5
3025    |  // RD is a number, RA is an integer.
3026    |  cvtsi2sd xmm0, RAd
3027    |  jmp >2
3028    |
3029    |8:  // RD is an integer, RA is not an integer.
3030    |  ja >5
3031    |  // RD is an integer, RA is a number.
3032    |  cvtsi2sd xmm1, RDd
3033    |  jmp >1
3034    |
3035    |.else
3036    |  cmp RBd, LJ_TISNUM; jae >5
3037    |  cmp ITYPEd, LJ_TISNUM; jae >5
3038    |  movd xmm1, RD
3039    |.endif
3040    |1:
3041    |  movd xmm0, RA
3042    |2:
3043    |  ucomisd xmm0, xmm1
3044    |4:
3045  iseqne_fp:
3046    if (vk) {
3047      |  jp >2				// Unordered means not equal.
3048      |  jne >2
3049    } else {
3050      |  jp >2				// Unordered means not equal.
3051      |  je >1
3052    }
3053  iseqne_end:
3054    if (vk) {
3055      |1:				// EQ: Branch to the target.
3056      |  movzx RDd, PC_RD
3057      |  branchPC RD
3058      |2:				// NE: Fallthrough to next instruction.
3059      |.if not FFI
3060      |3:
3061      |.endif
3062    } else {
3063      |.if not FFI
3064      |3:
3065      |.endif
3066      |2:				// NE: Branch to the target.
3067      |  movzx RDd, PC_RD
3068      |  branchPC RD
3069      |1:				// EQ: Fallthrough to next instruction.
3070    }
3071    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||
3072		       op == BC_ISEQN || op == BC_ISNEN)) {
3073      |  jmp <9
3074    } else {
3075      |  ins_next
3076    }
3077    |
3078    if (op == BC_ISEQV || op == BC_ISNEV) {
3079      |5:  // Either or both types are not numbers.
3080      |.if FFI
3081      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd
3082      |  cmp ITYPEd, LJ_TCDATA; je ->vmeta_equal_cd
3083      |.endif
3084      |  cmp RA, RD
3085      |  je <1				// Same GCobjs or pvalues?
3086      |  cmp RBd, ITYPEd
3087      |  jne <2				// Not the same type?
3088      |  cmp RBd, LJ_TISTABUD
3089      |  ja <2				// Different objects and not table/ud?
3090      |
3091      |  // Different tables or userdatas. Need to check __eq metamethod.
3092      |  // Field metatable must be at same offset for GCtab and GCudata!
3093      |  cleartp TAB:RA
3094      |  mov TAB:RB, TAB:RA->metatable
3095      |  test TAB:RB, TAB:RB
3096      |  jz <2				// No metatable?
3097      |  test byte TAB:RB->nomm, 1<<MM_eq
3098      |  jnz <2				// Or 'no __eq' flag set?
3099      if (vk) {
3100	|  xor RBd, RBd			// ne = 0
3101      } else {
3102	|  mov RBd, 1			// ne = 1
3103      }
3104      |  jmp ->vmeta_equal		// Handle __eq metamethod.
3105    } else {
3106      |.if FFI
3107      |3:
3108      |  cmp ITYPEd, LJ_TCDATA
3109      if (LJ_DUALNUM && vk) {
3110	|  jne <9
3111      } else {
3112	|  jne <2
3113      }
3114      |  jmp ->vmeta_equal_cd
3115      |.endif
3116    }
3117    break;
3118  case BC_ISEQS: case BC_ISNES:
3119    vk = op == BC_ISEQS;
3120    |  ins_AND	// RA = src, RD = str const, JMP with RD = target
3121    |  mov RB, [BASE+RA*8]
3122    |  add PC, 4
3123    |  checkstr RB, >3
3124    |  cmp RB, [KBASE+RD*8]
3125  iseqne_test:
3126    if (vk) {
3127      |  jne >2
3128    } else {
3129      |  je >1
3130    }
3131    goto iseqne_end;
3132  case BC_ISEQN: case BC_ISNEN:
3133    vk = op == BC_ISEQN;
3134    |  ins_AD	// RA = src, RD = num const, JMP with RD = target
3135    |  mov RB, [BASE+RA*8]
3136    |  add PC, 4
3137    |.if DUALNUM
3138    |  checkint RB, >7
3139    |  mov RD, [KBASE+RD*8]
3140    |  checkint RD, >8
3141    |  cmp RBd, RDd
3142    if (vk) {
3143      |  jne >9
3144    } else {
3145      |  je >9
3146    }
3147    |  movzx RDd, PC_RD
3148    |  branchPC RD
3149    |9:
3150    |  ins_next
3151    |
3152    |7:  // RA is not an integer.
3153    |  ja >3
3154    |  // RA is a number.
3155    |  mov RD, [KBASE+RD*8]
3156    |  checkint RD, >1
3157    |  // RA is a number, RD is an integer.
3158    |  cvtsi2sd xmm0, RDd
3159    |  jmp >2
3160    |
3161    |8:  // RA is an integer, RD is a number.
3162    |  cvtsi2sd xmm0, RBd
3163    |  movd xmm1, RD
3164    |  ucomisd xmm0, xmm1
3165    |  jmp >4
3166    |1:
3167    |  movd xmm0, RD
3168    |.else
3169    |  checknum RB, >3
3170    |1:
3171    |  movsd xmm0, qword [KBASE+RD*8]
3172    |.endif
3173    |2:
3174    |  ucomisd xmm0, qword [BASE+RA*8]
3175    |4:
3176    goto iseqne_fp;
3177  case BC_ISEQP: case BC_ISNEP:
3178    vk = op == BC_ISEQP;
3179    |  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target
3180    |  mov RB, [BASE+RA*8]
3181    |  sar RB, 47
3182    |  add PC, 4
3183    |  cmp RBd, RDd
3184    if (!LJ_HASFFI) goto iseqne_test;
3185    if (vk) {
3186      |  jne >3
3187      |  movzx RDd, PC_RD
3188      |  branchPC RD
3189      |2:
3190      |  ins_next
3191      |3:
3192      |  cmp RBd, LJ_TCDATA; jne <2
3193      |  jmp ->vmeta_equal_cd
3194    } else {
3195      |  je >2
3196      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd
3197      |  movzx RDd, PC_RD
3198      |  branchPC RD
3199      |2:
3200      |  ins_next
3201    }
3202    break;
3203
3204  /* -- Unary test and copy ops ------------------------------------------- */
3205
3206  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
3207    |  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target
3208    |  mov ITYPE, [BASE+RD*8]
3209    |  add PC, 4
3210    if (op == BC_ISTC || op == BC_ISFC) {
3211      |  mov RB, ITYPE
3212    }
3213    |  sar ITYPE, 47
3214    |  cmp ITYPEd, LJ_TISTRUECOND
3215    if (op == BC_IST || op == BC_ISTC) {
3216      |  jae >1
3217    } else {
3218      |  jb >1
3219    }
3220    if (op == BC_ISTC || op == BC_ISFC) {
3221      |  mov [BASE+RA*8], RB
3222    }
3223    |  movzx RDd, PC_RD
3224    |  branchPC RD
3225    |1:					// Fallthrough to the next instruction.
3226    |  ins_next
3227    break;
3228
3229  case BC_ISTYPE:
3230    |  ins_AD	// RA = src, RD = -type
3231    |  mov RB, [BASE+RA*8]
3232    |  sar RB, 47
3233    |  add RBd, RDd
3234    |  jne ->vmeta_istype
3235    |  ins_next
3236    break;
3237  case BC_ISNUM:
3238    |  ins_AD	// RA = src, RD = -(TISNUM-1)
3239    |  checknumtp [BASE+RA*8], ->vmeta_istype
3240    |  ins_next
3241    break;
3242
3243  /* -- Unary ops --------------------------------------------------------- */
3244
3245  case BC_MOV:
3246    |  ins_AD	// RA = dst, RD = src
3247    |  mov RB, [BASE+RD*8]
3248    |  mov [BASE+RA*8], RB
3249    |  ins_next_
3250    break;
3251  case BC_NOT:
3252    |  ins_AD	// RA = dst, RD = src
3253    |  mov RB, [BASE+RD*8]
3254    |  sar RB, 47
3255    |  mov RCd, 2
3256    |  cmp RB, LJ_TISTRUECOND
3257    |  sbb RCd, 0
3258    |  shl RC, 47
3259    |  not RC
3260    |  mov [BASE+RA*8], RC
3261    |  ins_next
3262    break;
3263  case BC_UNM:
3264    |  ins_AD	// RA = dst, RD = src
3265    |  mov RB, [BASE+RD*8]
3266    |.if DUALNUM
3267    |  checkint RB, >5
3268    |  neg RBd
3269    |  jz >3
3270    |  jo >4
3271    |  setint RB
3272    |9:
3273    |  mov [BASE+RA*8], RB
3274    |  ins_next
3275    |3:
3276    |  mov64 RB, U64x(80000000,00000000)  // -0.
3277    |  jmp <9
3278    |4:
3279    |  mov64 RB, U64x(41e00000,00000000)  // 2^31.
3280    |  jmp <9
3281    |5:
3282    |  ja ->vmeta_unm
3283    |.else
3284    |  checknum RB, ->vmeta_unm
3285    |.endif
3286    |  mov64 RD, U64x(80000000,00000000)
3287    |  xor RB, RD
3288    |.if DUALNUM
3289    |  jmp <9
3290    |.else
3291    |  mov [BASE+RA*8], RB
3292    |  ins_next
3293    |.endif
3294    break;
3295  case BC_LEN:
3296    |  ins_AD	// RA = dst, RD = src
3297    |  mov RD, [BASE+RD*8]
3298    |  checkstr RD, >2
3299    |.if DUALNUM
3300    |  mov RDd, dword STR:RD->len
3301    |1:
3302    |  setint RD
3303    |  mov [BASE+RA*8], RD
3304    |.else
3305    |  xorps xmm0, xmm0
3306    |  cvtsi2sd xmm0, dword STR:RD->len
3307    |1:
3308    |  movsd qword [BASE+RA*8], xmm0
3309    |.endif
3310    |  ins_next
3311    |2:
3312    |  cmp ITYPEd, LJ_TTAB; jne ->vmeta_len
3313    |  mov TAB:CARG1, TAB:RD
3314#if LJ_52
3315    |  mov TAB:RB, TAB:RD->metatable
3316    |  cmp TAB:RB, 0
3317    |  jnz >9
3318    |3:
3319#endif
3320    |->BC_LEN_Z:
3321    |  mov RB, BASE			// Save BASE.
3322    |  call extern lj_tab_len		// (GCtab *t)
3323    |  // Length of table returned in eax (RD).
3324    |.if DUALNUM
3325    |  // Nothing to do.
3326    |.else
3327    |  cvtsi2sd xmm0, RDd
3328    |.endif
3329    |  mov BASE, RB			// Restore BASE.
3330    |  movzx RAd, PC_RA
3331    |  jmp <1
3332#if LJ_52
3333    |9:  // Check for __len.
3334    |  test byte TAB:RB->nomm, 1<<MM_len
3335    |  jnz <3
3336    |  jmp ->vmeta_len			// 'no __len' flag NOT set: check.
3337#endif
3338    break;
3339
3340  /* -- Binary ops -------------------------------------------------------- */
3341
3342    |.macro ins_arithpre, sseins, ssereg
3343    |  ins_ABC
3344    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
3345    ||switch (vk) {
3346    ||case 0:
3347    |   checknumtp [BASE+RB*8], ->vmeta_arith_vn
3348    |   .if DUALNUM
3349    |     checknumtp [KBASE+RC*8], ->vmeta_arith_vn
3350    |   .endif
3351    |   movsd xmm0, qword [BASE+RB*8]
3352    |   sseins ssereg, qword [KBASE+RC*8]
3353    ||  break;
3354    ||case 1:
3355    |   checknumtp [BASE+RB*8], ->vmeta_arith_nv
3356    |   .if DUALNUM
3357    |     checknumtp [KBASE+RC*8], ->vmeta_arith_nv
3358    |   .endif
3359    |   movsd xmm0, qword [KBASE+RC*8]
3360    |   sseins ssereg, qword [BASE+RB*8]
3361    ||  break;
3362    ||default:
3363    |   checknumtp [BASE+RB*8], ->vmeta_arith_vv
3364    |   checknumtp [BASE+RC*8], ->vmeta_arith_vv
3365    |   movsd xmm0, qword [BASE+RB*8]
3366    |   sseins ssereg, qword [BASE+RC*8]
3367    ||  break;
3368    ||}
3369    |.endmacro
3370    |
3371    |.macro ins_arithdn, intins
3372    |  ins_ABC
3373    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
3374    ||switch (vk) {
3375    ||case 0:
3376    |   mov RB, [BASE+RB*8]
3377    |   mov RC, [KBASE+RC*8]
3378    |   checkint RB, ->vmeta_arith_vno
3379    |   checkint RC, ->vmeta_arith_vno
3380    |   intins RBd, RCd; jo ->vmeta_arith_vno
3381    ||  break;
3382    ||case 1:
3383    |   mov RB, [BASE+RB*8]
3384    |   mov RC, [KBASE+RC*8]
3385    |   checkint RB, ->vmeta_arith_nvo
3386    |   checkint RC, ->vmeta_arith_nvo
3387    |   intins RCd, RBd; jo ->vmeta_arith_nvo
3388    ||  break;
3389    ||default:
3390    |   mov RB, [BASE+RB*8]
3391    |   mov RC, [BASE+RC*8]
3392    |   checkint RB, ->vmeta_arith_vvo
3393    |   checkint RC, ->vmeta_arith_vvo
3394    |   intins RBd, RCd; jo ->vmeta_arith_vvo
3395    ||  break;
3396    ||}
3397    ||if (vk == 1) {
3398    |   setint RC
3399    |   mov [BASE+RA*8], RC
3400    ||} else {
3401    |   setint RB
3402    |   mov [BASE+RA*8], RB
3403    ||}
3404    |  ins_next
3405    |.endmacro
3406    |
3407    |.macro ins_arithpost
3408    |  movsd qword [BASE+RA*8], xmm0
3409    |.endmacro
3410    |
3411    |.macro ins_arith, sseins
3412    |  ins_arithpre sseins, xmm0
3413    |  ins_arithpost
3414    |  ins_next
3415    |.endmacro
3416    |
3417    |.macro ins_arith, intins, sseins
3418    |.if DUALNUM
3419    |  ins_arithdn intins
3420    |.else
3421    |  ins_arith, sseins
3422    |.endif
3423    |.endmacro
3424
3425    |  // RA = dst, RB = src1 or num const, RC = src2 or num const
3426  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
3427    |  ins_arith add, addsd
3428    break;
3429  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
3430    |  ins_arith sub, subsd
3431    break;
3432  case BC_MULVN: case BC_MULNV: case BC_MULVV:
3433    |  ins_arith imul, mulsd
3434    break;
3435  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
3436    |  ins_arith divsd
3437    break;
3438  case BC_MODVN:
3439    |  ins_arithpre movsd, xmm1
3440    |->BC_MODVN_Z:
3441    |  call ->vm_mod
3442    |  ins_arithpost
3443    |  ins_next
3444    break;
3445  case BC_MODNV: case BC_MODVV:
3446    |  ins_arithpre movsd, xmm1
3447    |  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.
3448    break;
3449  case BC_POW:
3450    |  ins_arithpre movsd, xmm1
3451    |  mov RB, BASE
3452    |  call extern pow
3453    |  movzx RAd, PC_RA
3454    |  mov BASE, RB
3455    |  ins_arithpost
3456    |  ins_next
3457    break;
3458
3459  case BC_CAT:
3460    |  ins_ABC	// RA = dst, RB = src_start, RC = src_end
3461    |  mov L:CARG1, SAVE_L
3462    |  mov L:CARG1->base, BASE
3463    |  lea CARG2, [BASE+RC*8]
3464    |  mov CARG3d, RCd
3465    |  sub CARG3d, RBd
3466    |->BC_CAT_Z:
3467    |  mov L:RB, L:CARG1
3468    |  mov SAVE_PC, PC
3469    |  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)
3470    |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).
3471    |  mov BASE, L:RB->base
3472    |  test RC, RC
3473    |  jnz ->vmeta_binop
3474    |  movzx RBd, PC_RB			// Copy result to Stk[RA] from Stk[RB].
3475    |  movzx RAd, PC_RA
3476    |  mov RC, [BASE+RB*8]
3477    |  mov [BASE+RA*8], RC
3478    |  ins_next
3479    break;
3480
3481  /* -- Constant ops ------------------------------------------------------ */
3482
3483  case BC_KSTR:
3484    |  ins_AND	// RA = dst, RD = str const (~)
3485    |  mov RD, [KBASE+RD*8]
3486    |  settp RD, LJ_TSTR
3487    |  mov [BASE+RA*8], RD
3488    |  ins_next
3489    break;
3490  case BC_KCDATA:
3491    |.if FFI
3492    |  ins_AND	// RA = dst, RD = cdata const (~)
3493    |  mov RD, [KBASE+RD*8]
3494    |  settp RD, LJ_TCDATA
3495    |  mov [BASE+RA*8], RD
3496    |  ins_next
3497    |.endif
3498    break;
3499  case BC_KSHORT:
3500    |  ins_AD	// RA = dst, RD = signed int16 literal
3501    |.if DUALNUM
3502    |  movsx RDd, RDW
3503    |  setint RD
3504    |  mov [BASE+RA*8], RD
3505    |.else
3506    |  movsx RDd, RDW			// Sign-extend literal.
3507    |  cvtsi2sd xmm0, RDd
3508    |  movsd qword [BASE+RA*8], xmm0
3509    |.endif
3510    |  ins_next
3511    break;
3512  case BC_KNUM:
3513    |  ins_AD	// RA = dst, RD = num const
3514    |  movsd xmm0, qword [KBASE+RD*8]
3515    |  movsd qword [BASE+RA*8], xmm0
3516    |  ins_next
3517    break;
3518  case BC_KPRI:
3519    |  ins_AD	// RA = dst, RD = primitive type (~)
3520    |  shl RD, 47
3521    |  not RD
3522    |  mov [BASE+RA*8], RD
3523    |  ins_next
3524    break;
3525  case BC_KNIL:
3526    |  ins_AD	// RA = dst_start, RD = dst_end
3527    |  lea RA, [BASE+RA*8+8]
3528    |  lea RD, [BASE+RD*8]
3529    |  mov RB, LJ_TNIL
3530    |  mov [RA-8], RB			// Sets minimum 2 slots.
3531    |1:
3532    |  mov [RA], RB
3533    |  add RA, 8
3534    |  cmp RA, RD
3535    |  jbe <1
3536    |  ins_next
3537    break;
3538
3539  /* -- Upvalue and function ops ------------------------------------------ */
3540
3541  case BC_UGET:
3542    |  ins_AD	// RA = dst, RD = upvalue #
3543    |  mov LFUNC:RB, [BASE-16]
3544    |  cleartp LFUNC:RB
3545    |  mov UPVAL:RB, [LFUNC:RB+RD*8+offsetof(GCfuncL, uvptr)]
3546    |  mov RB, UPVAL:RB->v
3547    |  mov RD, [RB]
3548    |  mov [BASE+RA*8], RD
3549    |  ins_next
3550    break;
3551  case BC_USETV:
3552#define TV2MARKOFS \
3553 ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))
3554    |  ins_AD	// RA = upvalue #, RD = src
3555    |  mov LFUNC:RB, [BASE-16]
3556    |  cleartp LFUNC:RB
3557    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)]
3558    |  cmp byte UPVAL:RB->closed, 0
3559    |  mov RB, UPVAL:RB->v
3560    |  mov RA, [BASE+RD*8]
3561    |  mov [RB], RA
3562    |  jz >1
3563    |  // Check barrier for closed upvalue.
3564    |  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)
3565    |  jnz >2
3566    |1:
3567    |  ins_next
3568    |
3569    |2:  // Upvalue is black. Check if new value is collectable and white.
3570    |  mov RD, RA
3571    |  sar RD, 47
3572    |  sub RDd, LJ_TISGCV
3573    |  cmp RDd, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)
3574    |  jbe <1
3575    |  cleartp GCOBJ:RA
3576    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)
3577    |  jz <1
3578    |  // Crossed a write barrier. Move the barrier forward.
3579    |.if not X64WIN
3580    |  mov CARG2, RB
3581    |  mov RB, BASE			// Save BASE.
3582    |.else
3583    |  xchg CARG2, RB			// Save BASE (CARG2 == BASE).
3584    |.endif
3585    |  lea GL:CARG1, [DISPATCH+GG_DISP2G]
3586    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)
3587    |  mov BASE, RB			// Restore BASE.
3588    |  jmp <1
3589    break;
3590#undef TV2MARKOFS
3591  case BC_USETS:
3592    |  ins_AND	// RA = upvalue #, RD = str const (~)
3593    |  mov LFUNC:RB, [BASE-16]
3594    |  cleartp LFUNC:RB
3595    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)]
3596    |  mov STR:RA, [KBASE+RD*8]
3597    |  mov RD, UPVAL:RB->v
3598    |  settp STR:ITYPE, STR:RA, LJ_TSTR
3599    |  mov [RD], STR:ITYPE
3600    |  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)
3601    |  jnz >2
3602    |1:
3603    |  ins_next
3604    |
3605    |2:  // Check if string is white and ensure upvalue is closed.
3606    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)
3607    |  jz <1
3608    |  cmp byte UPVAL:RB->closed, 0
3609    |  jz <1
3610    |  // Crossed a write barrier. Move the barrier forward.
3611    |  mov RB, BASE			// Save BASE (CARG2 == BASE).
3612    |  mov CARG2, RD
3613    |  lea GL:CARG1, [DISPATCH+GG_DISP2G]
3614    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)
3615    |  mov BASE, RB			// Restore BASE.
3616    |  jmp <1
3617    break;
3618  case BC_USETN:
3619    |  ins_AD	// RA = upvalue #, RD = num const
3620    |  mov LFUNC:RB, [BASE-16]
3621    |  cleartp LFUNC:RB
3622    |  movsd xmm0, qword [KBASE+RD*8]
3623    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)]
3624    |  mov RA, UPVAL:RB->v
3625    |  movsd qword [RA], xmm0
3626    |  ins_next
3627    break;
3628  case BC_USETP:
3629    |  ins_AD	// RA = upvalue #, RD = primitive type (~)
3630    |  mov LFUNC:RB, [BASE-16]
3631    |  cleartp LFUNC:RB
3632    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)]
3633    |  shl RD, 47
3634    |  not RD
3635    |  mov RA, UPVAL:RB->v
3636    |  mov [RA], RD
3637    |  ins_next
3638    break;
3639  case BC_UCLO:
3640    |  ins_AD	// RA = level, RD = target
3641    |  branchPC RD			// Do this first to free RD.
3642    |  mov L:RB, SAVE_L
3643    |  cmp aword L:RB->openupval, 0
3644    |  je >1
3645    |  mov L:RB->base, BASE
3646    |  lea CARG2, [BASE+RA*8]		// Caveat: CARG2 == BASE
3647    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA
3648    |  call extern lj_func_closeuv	// (lua_State *L, TValue *level)
3649    |  mov BASE, L:RB->base
3650    |1:
3651    |  ins_next
3652    break;
3653
3654  case BC_FNEW:
3655    |  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)
3656    |  mov L:RB, SAVE_L
3657    |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.
3658    |  mov CARG3, [BASE-16]
3659    |  cleartp CARG3
3660    |  mov CARG2, [KBASE+RD*8]		// Fetch GCproto *.
3661    |  mov CARG1, L:RB
3662    |  mov SAVE_PC, PC
3663    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)
3664    |  call extern lj_func_newL_gc
3665    |  // GCfuncL * returned in eax (RC).
3666    |  mov BASE, L:RB->base
3667    |  movzx RAd, PC_RA
3668    |  settp LFUNC:RC, LJ_TFUNC
3669    |  mov [BASE+RA*8], LFUNC:RC
3670    |  ins_next
3671    break;
3672
3673  /* -- Table ops --------------------------------------------------------- */
3674
3675  case BC_TNEW:
3676    |  ins_AD	// RA = dst, RD = hbits|asize
3677    |  mov L:RB, SAVE_L
3678    |  mov L:RB->base, BASE
3679    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)]
3680    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)]
3681    |  mov SAVE_PC, PC
3682    |  jae >5
3683    |1:
3684    |  mov CARG3d, RDd
3685    |  and RDd, 0x7ff
3686    |  shr CARG3d, 11
3687    |  cmp RDd, 0x7ff
3688    |  je >3
3689    |2:
3690    |  mov L:CARG1, L:RB
3691    |  mov CARG2d, RDd
3692    |  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)
3693    |  // Table * returned in eax (RC).
3694    |  mov BASE, L:RB->base
3695    |  movzx RAd, PC_RA
3696    |  settp TAB:RC, LJ_TTAB
3697    |  mov [BASE+RA*8], TAB:RC
3698    |  ins_next
3699    |3:  // Turn 0x7ff into 0x801.
3700    |  mov RDd, 0x801
3701    |  jmp <2
3702    |5:
3703    |  mov L:CARG1, L:RB
3704    |  call extern lj_gc_step_fixtop	// (lua_State *L)
3705    |  movzx RDd, PC_RD
3706    |  jmp <1
3707    break;
3708  case BC_TDUP:
3709    |  ins_AND	// RA = dst, RD = table const (~) (holding template table)
3710    |  mov L:RB, SAVE_L
3711    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)]
3712    |  mov SAVE_PC, PC
3713    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)]
3714    |  mov L:RB->base, BASE
3715    |  jae >3
3716    |2:
3717    |  mov TAB:CARG2, [KBASE+RD*8]	// Caveat: CARG2 == BASE
3718    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA
3719    |  call extern lj_tab_dup		// (lua_State *L, Table *kt)
3720    |  // Table * returned in eax (RC).
3721    |  mov BASE, L:RB->base
3722    |  movzx RAd, PC_RA
3723    |  settp TAB:RC, LJ_TTAB
3724    |  mov [BASE+RA*8], TAB:RC
3725    |  ins_next
3726    |3:
3727    |  mov L:CARG1, L:RB
3728    |  call extern lj_gc_step_fixtop	// (lua_State *L)
3729    |  movzx RDd, PC_RD			// Need to reload RD.
3730    |  not RD
3731    |  jmp <2
3732    break;
3733
3734  case BC_GGET:
3735    |  ins_AND	// RA = dst, RD = str const (~)
3736    |  mov LFUNC:RB, [BASE-16]
3737    |  cleartp LFUNC:RB
3738    |  mov TAB:RB, LFUNC:RB->env
3739    |  mov STR:RC, [KBASE+RD*8]
3740    |  jmp ->BC_TGETS_Z
3741    break;
3742  case BC_GSET:
3743    |  ins_AND	// RA = src, RD = str const (~)
3744    |  mov LFUNC:RB, [BASE-16]
3745    |  cleartp LFUNC:RB
3746    |  mov TAB:RB, LFUNC:RB->env
3747    |  mov STR:RC, [KBASE+RD*8]
3748    |  jmp ->BC_TSETS_Z
3749    break;
3750
3751  case BC_TGETV:
3752    |  ins_ABC	// RA = dst, RB = table, RC = key
3753    |  mov TAB:RB, [BASE+RB*8]
3754    |  mov RC, [BASE+RC*8]
3755    |  checktab TAB:RB, ->vmeta_tgetv
3756    |
3757    |  // Integer key?
3758    |.if DUALNUM
3759    |  checkint RC, >5
3760    |.else
3761    |  // Convert number to int and back and compare.
3762    |  checknum RC, >5
3763    |  movd xmm0, RC
3764    |  cvttsd2si RCd, xmm0
3765    |  cvtsi2sd xmm1, RCd
3766    |  ucomisd xmm0, xmm1
3767    |  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.
3768    |.endif
3769    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.
3770    |  jae ->vmeta_tgetv		// Not in array part? Use fallback.
3771    |  shl RCd, 3
3772    |  add RC, TAB:RB->array
3773    |  // Get array slot.
3774    |  mov ITYPE, [RC]
3775    |  cmp ITYPE, LJ_TNIL		// Avoid overwriting RB in fastpath.
3776    |  je >2
3777    |1:
3778    |  mov [BASE+RA*8], ITYPE
3779    |  ins_next
3780    |
3781    |2:  // Check for __index if table value is nil.
3782    |  mov TAB:TMPR, TAB:RB->metatable
3783    |  test TAB:TMPR, TAB:TMPR
3784    |  jz <1
3785    |  test byte TAB:TMPR->nomm, 1<<MM_index
3786    |  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.
3787    |  jmp <1
3788    |
3789    |5:  // String key?
3790    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tgetv
3791    |  cleartp STR:RC
3792    |  jmp ->BC_TGETS_Z
3793    break;
3794  case BC_TGETS:
3795    |  ins_ABC	// RA = dst, RB = table, RC = str const (~)
3796    |  mov TAB:RB, [BASE+RB*8]
3797    |  not RC
3798    |  mov STR:RC, [KBASE+RC*8]
3799    |  checktab TAB:RB, ->vmeta_tgets
3800    |->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *
3801    |  mov TMPRd, TAB:RB->hmask
3802    |  and TMPRd, STR:RC->sid
3803    |  imul TMPRd, #NODE
3804    |  add NODE:TMPR, TAB:RB->node
3805    |  settp ITYPE, STR:RC, LJ_TSTR
3806    |1:
3807    |  cmp NODE:TMPR->key, ITYPE
3808    |  jne >4
3809    |  // Get node value.
3810    |  mov ITYPE, NODE:TMPR->val
3811    |  cmp ITYPE, LJ_TNIL
3812    |  je >5				// Key found, but nil value?
3813    |2:
3814    |  mov [BASE+RA*8], ITYPE
3815    |  ins_next
3816    |
3817    |4:  // Follow hash chain.
3818    |  mov NODE:TMPR, NODE:TMPR->next
3819    |  test NODE:TMPR, NODE:TMPR
3820    |  jnz <1
3821    |  // End of hash chain: key not found, nil result.
3822    |  mov ITYPE, LJ_TNIL
3823    |
3824    |5:  // Check for __index if table value is nil.
3825    |  mov TAB:TMPR, TAB:RB->metatable
3826    |  test TAB:TMPR, TAB:TMPR
3827    |  jz <2				// No metatable: done.
3828    |  test byte TAB:TMPR->nomm, 1<<MM_index
3829    |  jnz <2				// 'no __index' flag set: done.
3830    |  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.
3831    break;
3832  case BC_TGETB:
3833    |  ins_ABC	// RA = dst, RB = table, RC = byte literal
3834    |  mov TAB:RB, [BASE+RB*8]
3835    |  checktab TAB:RB, ->vmeta_tgetb
3836    |  cmp RCd, TAB:RB->asize
3837    |  jae ->vmeta_tgetb
3838    |  shl RCd, 3
3839    |  add RC, TAB:RB->array
3840    |  // Get array slot.
3841    |  mov ITYPE, [RC]
3842    |  cmp ITYPE, LJ_TNIL
3843    |  je >2
3844    |1:
3845    |  mov [BASE+RA*8], ITYPE
3846    |  ins_next
3847    |
3848    |2:  // Check for __index if table value is nil.
3849    |  mov TAB:TMPR, TAB:RB->metatable
3850    |  test TAB:TMPR, TAB:TMPR
3851    |  jz <1
3852    |  test byte TAB:TMPR->nomm, 1<<MM_index
3853    |  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.
3854    |  jmp <1
3855    break;
3856  case BC_TGETR:
3857    |  ins_ABC	// RA = dst, RB = table, RC = key
3858    |  mov TAB:RB, [BASE+RB*8]
3859    |  cleartp TAB:RB
3860    |.if DUALNUM
3861    |  mov RCd, dword [BASE+RC*8]
3862    |.else
3863    |  cvttsd2si RCd, qword [BASE+RC*8]
3864    |.endif
3865    |  cmp RCd, TAB:RB->asize
3866    |  jae ->vmeta_tgetr		// Not in array part? Use fallback.
3867    |  shl RCd, 3
3868    |  add RC, TAB:RB->array
3869    |  // Get array slot.
3870    |->BC_TGETR_Z:
3871    |  mov ITYPE, [RC]
3872    |->BC_TGETR2_Z:
3873    |  mov [BASE+RA*8], ITYPE
3874    |  ins_next
3875    break;
3876
3877  case BC_TSETV:
3878    |  ins_ABC	// RA = src, RB = table, RC = key
3879    |  mov TAB:RB, [BASE+RB*8]
3880    |  mov RC, [BASE+RC*8]
3881    |  checktab TAB:RB, ->vmeta_tsetv
3882    |
3883    |  // Integer key?
3884    |.if DUALNUM
3885    |  checkint RC, >5
3886    |.else
3887    |  // Convert number to int and back and compare.
3888    |  checknum RC, >5
3889    |  movd xmm0, RC
3890    |  cvttsd2si RCd, xmm0
3891    |  cvtsi2sd xmm1, RCd
3892    |  ucomisd xmm0, xmm1
3893    |  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.
3894    |.endif
3895    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.
3896    |  jae ->vmeta_tsetv
3897    |  shl RCd, 3
3898    |  add RC, TAB:RB->array
3899    |  cmp aword [RC], LJ_TNIL
3900    |  je >3				// Previous value is nil?
3901    |1:
3902    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
3903    |  jnz >7
3904    |2:  // Set array slot.
3905    |  mov RB, [BASE+RA*8]
3906    |  mov [RC], RB
3907    |  ins_next
3908    |
3909    |3:  // Check for __newindex if previous value is nil.
3910    |  mov TAB:TMPR, TAB:RB->metatable
3911    |  test TAB:TMPR, TAB:TMPR
3912    |  jz <1
3913    |  test byte TAB:TMPR->nomm, 1<<MM_newindex
3914    |  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.
3915    |  jmp <1
3916    |
3917    |5:  // String key?
3918    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tsetv
3919    |  cleartp STR:RC
3920    |  jmp ->BC_TSETS_Z
3921    |
3922    |7:  // Possible table write barrier for the value. Skip valiswhite check.
3923    |  barrierback TAB:RB, TMPR
3924    |  jmp <2
3925    break;
3926  case BC_TSETS:
3927    |  ins_ABC	// RA = src, RB = table, RC = str const (~)
3928    |  mov TAB:RB, [BASE+RB*8]
3929    |  not RC
3930    |  mov STR:RC, [KBASE+RC*8]
3931    |  checktab TAB:RB, ->vmeta_tsets
3932    |->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *
3933    |  mov TMPRd, TAB:RB->hmask
3934    |  and TMPRd, STR:RC->sid
3935    |  imul TMPRd, #NODE
3936    |  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.
3937    |  add NODE:TMPR, TAB:RB->node
3938    |  settp ITYPE, STR:RC, LJ_TSTR
3939    |1:
3940    |  cmp NODE:TMPR->key, ITYPE
3941    |  jne >5
3942    |  // Ok, key found. Assumes: offsetof(Node, val) == 0
3943    |  cmp aword [TMPR], LJ_TNIL
3944    |  je >4				// Previous value is nil?
3945    |2:
3946    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
3947    |  jnz >7
3948    |3:  // Set node value.
3949    |  mov ITYPE, [BASE+RA*8]
3950    |  mov [TMPR], ITYPE
3951    |  ins_next
3952    |
3953    |4:  // Check for __newindex if previous value is nil.
3954    |  mov TAB:ITYPE, TAB:RB->metatable
3955    |  test TAB:ITYPE, TAB:ITYPE
3956    |  jz <2
3957    |  test byte TAB:ITYPE->nomm, 1<<MM_newindex
3958    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.
3959    |  jmp <2
3960    |
3961    |5:  // Follow hash chain.
3962    |  mov NODE:TMPR, NODE:TMPR->next
3963    |  test NODE:TMPR, NODE:TMPR
3964    |  jnz <1
3965    |  // End of hash chain: key not found, add a new one.
3966    |
3967    |  // But check for __newindex first.
3968    |  mov TAB:TMPR, TAB:RB->metatable
3969    |  test TAB:TMPR, TAB:TMPR
3970    |  jz >6				// No metatable: continue.
3971    |  test byte TAB:TMPR->nomm, 1<<MM_newindex
3972    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.
3973    |6:
3974    |  mov TMP1, ITYPE
3975    |  mov L:CARG1, SAVE_L
3976    |  mov L:CARG1->base, BASE
3977    |  lea CARG3, TMP1
3978    |  mov CARG2, TAB:RB
3979    |  mov SAVE_PC, PC
3980    |  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)
3981    |  // Handles write barrier for the new key. TValue * returned in eax (RC).
3982    |  mov L:CARG1, SAVE_L
3983    |  mov BASE, L:CARG1->base
3984    |  mov TMPR, rax
3985    |  movzx RAd, PC_RA
3986    |  jmp <2				// Must check write barrier for value.
3987    |
3988    |7:  // Possible table write barrier for the value. Skip valiswhite check.
3989    |  barrierback TAB:RB, ITYPE
3990    |  jmp <3
3991    break;
3992  case BC_TSETB:
3993    |  ins_ABC	// RA = src, RB = table, RC = byte literal
3994    |  mov TAB:RB, [BASE+RB*8]
3995    |  checktab TAB:RB, ->vmeta_tsetb
3996    |  cmp RCd, TAB:RB->asize
3997    |  jae ->vmeta_tsetb
3998    |  shl RCd, 3
3999    |  add RC, TAB:RB->array
4000    |  cmp aword [RC], LJ_TNIL
4001    |  je >3				// Previous value is nil?
4002    |1:
4003    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
4004    |  jnz >7
4005    |2:	 // Set array slot.
4006    |  mov ITYPE, [BASE+RA*8]
4007    |  mov [RC], ITYPE
4008    |  ins_next
4009    |
4010    |3:  // Check for __newindex if previous value is nil.
4011    |  mov TAB:TMPR, TAB:RB->metatable
4012    |  test TAB:TMPR, TAB:TMPR
4013    |  jz <1
4014    |  test byte TAB:TMPR->nomm, 1<<MM_newindex
4015    |  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.
4016    |  jmp <1
4017    |
4018    |7:  // Possible table write barrier for the value. Skip valiswhite check.
4019    |  barrierback TAB:RB, TMPR
4020    |  jmp <2
4021    break;
4022  case BC_TSETR:
4023    |  ins_ABC	// RA = src, RB = table, RC = key
4024    |  mov TAB:RB, [BASE+RB*8]
4025    |  cleartp TAB:RB
4026    |.if DUALNUM
4027    |  mov RC, [BASE+RC*8]
4028    |.else
4029    |  cvttsd2si RCd, qword [BASE+RC*8]
4030    |.endif
4031    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
4032    |  jnz >7
4033    |2:
4034    |  cmp RCd, TAB:RB->asize
4035    |  jae ->vmeta_tsetr
4036    |  shl RCd, 3
4037    |  add RC, TAB:RB->array
4038    |  // Set array slot.
4039    |->BC_TSETR_Z:
4040    |  mov ITYPE, [BASE+RA*8]
4041    |  mov [RC], ITYPE
4042    |  ins_next
4043    |
4044    |7:  // Possible table write barrier for the value. Skip valiswhite check.
4045    |  barrierback TAB:RB, TMPR
4046    |  jmp <2
4047    break;
4048
4049  case BC_TSETM:
4050    |  ins_AD	// RA = base (table at base-1), RD = num const (start index)
4051    |1:
4052    |  mov TMPRd, dword [KBASE+RD*8]	// Integer constant is in lo-word.
4053    |  lea RA, [BASE+RA*8]
4054    |  mov TAB:RB, [RA-8]		// Guaranteed to be a table.
4055    |  cleartp TAB:RB
4056    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)
4057    |  jnz >7
4058    |2:
4059    |  mov RDd, MULTRES
4060    |  sub RDd, 1
4061    |  jz >4				// Nothing to copy?
4062    |  add RDd, TMPRd			// Compute needed size.
4063    |  cmp RDd, TAB:RB->asize
4064    |  ja >5				// Doesn't fit into array part?
4065    |  sub RDd, TMPRd
4066    |  shl TMPRd, 3
4067    |  add TMPR, TAB:RB->array
4068    |3:  // Copy result slots to table.
4069    |  mov RB, [RA]
4070    |  add RA, 8
4071    |  mov [TMPR], RB
4072    |  add TMPR, 8
4073    |  sub RDd, 1
4074    |  jnz <3
4075    |4:
4076    |  ins_next
4077    |
4078    |5:  // Need to resize array part.
4079    |  mov L:CARG1, SAVE_L
4080    |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.
4081    |  mov CARG2, TAB:RB
4082    |  mov CARG3d, RDd
4083    |  mov L:RB, L:CARG1
4084    |  mov SAVE_PC, PC
4085    |  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)
4086    |  mov BASE, L:RB->base
4087    |  movzx RAd, PC_RA			// Restore RA.
4088    |  movzx RDd, PC_RD			// Restore RD.
4089    |  jmp <1				// Retry.
4090    |
4091    |7:  // Possible table write barrier for any value. Skip valiswhite check.
4092    |  barrierback TAB:RB, RD
4093    |  jmp <2
4094    break;
4095
4096  /* -- Calls and vararg handling ----------------------------------------- */
4097
4098  case BC_CALL: case BC_CALLM:
4099    |  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs
4100    if (op == BC_CALLM) {
4101      |  add NARGS:RDd, MULTRES
4102    }
4103    |  mov LFUNC:RB, [BASE+RA*8]
4104    |  checkfunc LFUNC:RB, ->vmeta_call_ra
4105    |  lea BASE, [BASE+RA*8+16]
4106    |  ins_call
4107    break;
4108
4109  case BC_CALLMT:
4110    |  ins_AD	// RA = base, RD = extra_nargs
4111    |  add NARGS:RDd, MULTRES
4112    |  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.
4113    break;
4114  case BC_CALLT:
4115    |  ins_AD	// RA = base, RD = nargs+1
4116    |  lea RA, [BASE+RA*8+16]
4117    |  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.
4118    |  mov LFUNC:RB, [RA-16]
4119    |  checktp_nc LFUNC:RB, LJ_TFUNC, ->vmeta_call
4120    |->BC_CALLT_Z:
4121    |  mov PC, [BASE-8]
4122    |  test PCd, FRAME_TYPE
4123    |  jnz >7
4124    |1:
4125    |  mov [BASE-16], LFUNC:RB		// Copy func+tag down, reloaded below.
4126    |  mov MULTRES, NARGS:RDd
4127    |  sub NARGS:RDd, 1
4128    |  jz >3
4129    |2:  // Move args down.
4130    |  mov RB, [RA]
4131    |  add RA, 8
4132    |  mov [KBASE], RB
4133    |  add KBASE, 8
4134    |  sub NARGS:RDd, 1
4135    |  jnz <2
4136    |
4137    |  mov LFUNC:RB, [BASE-16]
4138    |3:
4139    |  cleartp LFUNC:RB
4140    |  mov NARGS:RDd, MULTRES
4141    |  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?
4142    |  ja >5
4143    |4:
4144    |  ins_callt
4145    |
4146    |5:  // Tailcall to a fast function.
4147    |  test PCd, FRAME_TYPE		// Lua frame below?
4148    |  jnz <4
4149    |  movzx RAd, PC_RA
4150    |  neg RA
4151    |  mov LFUNC:KBASE, [BASE+RA*8-32]	// Need to prepare KBASE.
4152    |  cleartp LFUNC:KBASE
4153    |  mov KBASE, LFUNC:KBASE->pc
4154    |  mov KBASE, [KBASE+PC2PROTO(k)]
4155    |  jmp <4
4156    |
4157    |7:  // Tailcall from a vararg function.
4158    |  sub PC, FRAME_VARG
4159    |  test PCd, FRAME_TYPEP
4160    |  jnz >8				// Vararg frame below?
4161    |  sub BASE, PC			// Need to relocate BASE/KBASE down.
4162    |  mov KBASE, BASE
4163    |  mov PC, [BASE-8]
4164    |  jmp <1
4165    |8:
4166    |  add PCd, FRAME_VARG
4167    |  jmp <1
4168    break;
4169
4170  case BC_ITERC:
4171    |  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)
4172    |  lea RA, [BASE+RA*8+16]		// fb = base+2
4173    |  mov RB, [RA-32]			// Copy state. fb[0] = fb[-4].
4174    |  mov RC, [RA-24]			// Copy control var. fb[1] = fb[-3].
4175    |  mov [RA], RB
4176    |  mov [RA+8], RC
4177    |  mov LFUNC:RB, [RA-40]		// Copy callable. fb[-2] = fb[-5]
4178    |  mov [RA-16], LFUNC:RB
4179    |  mov NARGS:RDd, 2+1		// Handle like a regular 2-arg call.
4180    |  checkfunc LFUNC:RB, ->vmeta_call
4181    |  mov BASE, RA
4182    |  ins_call
4183    break;
4184
4185  case BC_ITERN:
4186    |.if JIT
4187    |  hotloop RBd
4188    |.endif
4189    |->vm_IITERN:
4190    |.if JIT
4191    |  endbr
4192    |.endif
4193    |  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))
4194    |  mov TAB:RB, [BASE+RA*8-16]
4195    |  cleartp TAB:RB
4196    |  mov RCd, [BASE+RA*8-8]		// Get index from control var.
4197    |  mov TMPRd, TAB:RB->asize
4198    |  add PC, 4
4199    |  mov ITYPE, TAB:RB->array
4200    |1:  // Traverse array part.
4201    |  cmp RCd, TMPRd; jae >5		// Index points after array part?
4202    |  cmp aword [ITYPE+RC*8], LJ_TNIL; je >4
4203    |.if not DUALNUM
4204    |  cvtsi2sd xmm0, RCd
4205    |.endif
4206    |  // Copy array slot to returned value.
4207    |  mov RB, [ITYPE+RC*8]
4208    |  mov [BASE+RA*8+8], RB
4209    |  // Return array index as a numeric key.
4210    |.if DUALNUM
4211    |  setint ITYPE, RC
4212    |  mov [BASE+RA*8], ITYPE
4213    |.else
4214    |  movsd qword [BASE+RA*8], xmm0
4215    |.endif
4216    |  add RCd, 1
4217    |  mov [BASE+RA*8-8], RCd		// Update control var.
4218    |2:
4219    |  movzx RDd, PC_RD			// Get target from ITERL.
4220    |  branchPC RD
4221    |3:
4222    |  ins_next
4223    |
4224    |4:  // Skip holes in array part.
4225    |  add RCd, 1
4226    |  jmp <1
4227    |
4228    |5:  // Traverse hash part.
4229    |  sub RCd, TMPRd
4230    |6:
4231    |  cmp RCd, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.
4232    |  imul ITYPEd, RCd, #NODE
4233    |  add NODE:ITYPE, TAB:RB->node
4234    |  cmp aword NODE:ITYPE->val, LJ_TNIL; je >7
4235    |  lea TMPRd, [RCd+TMPRd+1]
4236    |  // Copy key and value from hash slot.
4237    |  mov RB, NODE:ITYPE->key
4238    |  mov RC, NODE:ITYPE->val
4239    |  mov [BASE+RA*8], RB
4240    |  mov [BASE+RA*8+8], RC
4241    |  mov [BASE+RA*8-8], TMPRd
4242    |  jmp <2
4243    |
4244    |7:  // Skip holes in hash part.
4245    |  add RCd, 1
4246    |  jmp <6
4247    break;
4248
4249  case BC_ISNEXT:
4250    |  ins_AD	// RA = base, RD = target (points to ITERN)
4251    |  mov CFUNC:RB, [BASE+RA*8-24]
4252    |  checkfunc CFUNC:RB, >5
4253    |  checktptp [BASE+RA*8-16], LJ_TTAB, >5
4254    |  cmp aword [BASE+RA*8-8], LJ_TNIL; jne >5
4255    |  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5
4256    |  branchPC RD
4257    |  mov64 TMPR, ((uint64_t)LJ_KEYINDEX << 32)
4258    |  mov [BASE+RA*8-8], TMPR		// Initialize control var.
4259    |1:
4260    |  ins_next
4261    |5:  // Despecialize bytecode if any of the checks fail.
4262    |  mov PC_OP, BC_JMP
4263    |  branchPC RD
4264    |.if JIT
4265    |  cmp byte [PC], BC_ITERN
4266    |  jne >6
4267    |.endif
4268    |  mov byte [PC], BC_ITERC
4269    |  jmp <1
4270    |.if JIT
4271    |6:  // Unpatch JLOOP.
4272    |  mov RA, [DISPATCH+DISPATCH_J(trace)]
4273    |  movzx RCd, word [PC+2]
4274    |  mov TRACE:RA, [RA+RC*8]
4275    |  mov eax, TRACE:RA->startins
4276    |  mov al, BC_ITERC
4277    |  mov dword [PC], eax
4278    |  jmp <1
4279    |.endif
4280    break;
4281
4282  case BC_VARG:
4283    |  ins_ABC	// RA = base, RB = nresults+1, RC = numparams
4284    |  lea TMPR, [BASE+RC*8+(16+FRAME_VARG)]
4285    |  lea RA, [BASE+RA*8]
4286    |  sub TMPR, [BASE-8]
4287    |  // Note: TMPR may now be even _above_ BASE if nargs was < numparams.
4288    |  test RB, RB
4289    |  jz >5				// Copy all varargs?
4290    |  lea RB, [RA+RB*8-8]
4291    |  cmp TMPR, BASE			// No vararg slots?
4292    |  jnb >2
4293    |1:  // Copy vararg slots to destination slots.
4294    |  mov RC, [TMPR-16]
4295    |  add TMPR, 8
4296    |  mov [RA], RC
4297    |  add RA, 8
4298    |  cmp RA, RB			// All destination slots filled?
4299    |  jnb >3
4300    |  cmp TMPR, BASE			// No more vararg slots?
4301    |  jb <1
4302    |2:  // Fill up remainder with nil.
4303    |  mov aword [RA], LJ_TNIL
4304    |  add RA, 8
4305    |  cmp RA, RB
4306    |  jb <2
4307    |3:
4308    |  ins_next
4309    |
4310    |5:  // Copy all varargs.
4311    |  mov MULTRES, 1			// MULTRES = 0+1
4312    |  mov RC, BASE
4313    |  sub RC, TMPR
4314    |  jbe <3				// No vararg slots?
4315    |  mov RBd, RCd
4316    |  shr RBd, 3
4317    |  add RBd, 1
4318    |  mov MULTRES, RBd			// MULTRES = #varargs+1
4319    |  mov L:RB, SAVE_L
4320    |  add RC, RA
4321    |  cmp RC, L:RB->maxstack
4322    |  ja >7				// Need to grow stack?
4323    |6:  // Copy all vararg slots.
4324    |  mov RC, [TMPR-16]
4325    |  add TMPR, 8
4326    |  mov [RA], RC
4327    |  add RA, 8
4328    |  cmp TMPR, BASE			// No more vararg slots?
4329    |  jb <6
4330    |  jmp <3
4331    |
4332    |7:  // Grow stack for varargs.
4333    |  mov L:RB->base, BASE
4334    |  mov L:RB->top, RA
4335    |  mov SAVE_PC, PC
4336    |  sub TMPR, BASE			// Need delta, because BASE may change.
4337    |  mov TMP1hi, TMPRd
4338    |  mov CARG2d, MULTRES
4339    |  sub CARG2d, 1
4340    |  mov CARG1, L:RB
4341    |  call extern lj_state_growstack	// (lua_State *L, int n)
4342    |  mov BASE, L:RB->base
4343    |  movsxd TMPR, TMP1hi
4344    |  mov RA, L:RB->top
4345    |  add TMPR, BASE
4346    |  jmp <6
4347    break;
4348
4349  /* -- Returns ----------------------------------------------------------- */
4350
4351  case BC_RETM:
4352    |  ins_AD	// RA = results, RD = extra_nresults
4353    |  add RDd, MULTRES			// MULTRES >=1, so RD >=1.
4354    |  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.
4355    break;
4356
4357  case BC_RET: case BC_RET0: case BC_RET1:
4358    |  ins_AD	// RA = results, RD = nresults+1
4359    if (op != BC_RET0) {
4360      |  shl RAd, 3
4361    }
4362    |1:
4363    |  mov PC, [BASE-8]
4364    |  mov MULTRES, RDd			// Save nresults+1.
4365    |  test PCd, FRAME_TYPE		// Check frame type marker.
4366    |  jnz >7				// Not returning to a fixarg Lua func?
4367    switch (op) {
4368    case BC_RET:
4369      |->BC_RET_Z:
4370      |  mov KBASE, BASE		// Use KBASE for result move.
4371      |  sub RDd, 1
4372      |  jz >3
4373      |2:  // Move results down.
4374      |  mov RB, [KBASE+RA]
4375      |  mov [KBASE-16], RB
4376      |  add KBASE, 8
4377      |  sub RDd, 1
4378      |  jnz <2
4379      |3:
4380      |  mov RDd, MULTRES		// Note: MULTRES may be >255.
4381      |  movzx RBd, PC_RB		// So cannot compare with RDL!
4382      |5:
4383      |  cmp RBd, RDd			// More results expected?
4384      |  ja >6
4385      break;
4386    case BC_RET1:
4387      |  mov RB, [BASE+RA]
4388      |  mov [BASE-16], RB
4389      /* fallthrough */
4390    case BC_RET0:
4391      |5:
4392      |  cmp PC_RB, RDL			// More results expected?
4393      |  ja >6
4394    default:
4395      break;
4396    }
4397    |  movzx RAd, PC_RA
4398    |  neg RA
4399    |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8
4400    |  mov LFUNC:KBASE, [BASE-16]
4401    |  cleartp LFUNC:KBASE
4402    |  mov KBASE, LFUNC:KBASE->pc
4403    |  mov KBASE, [KBASE+PC2PROTO(k)]
4404    |  ins_next
4405    |
4406    |6:  // Fill up results with nil.
4407    if (op == BC_RET) {
4408      |  mov aword [KBASE-16], LJ_TNIL	// Note: relies on shifted base.
4409      |  add KBASE, 8
4410    } else {
4411      |  mov aword [BASE+RD*8-24], LJ_TNIL
4412    }
4413    |  add RD, 1
4414    |  jmp <5
4415    |
4416    |7:  // Non-standard return case.
4417    |  lea RB, [PC-FRAME_VARG]
4418    |  test RBd, FRAME_TYPEP
4419    |  jnz ->vm_return
4420    |  // Return from vararg function: relocate BASE down and RA up.
4421    |  sub BASE, RB
4422    if (op != BC_RET0) {
4423      |  add RA, RB
4424    }
4425    |  jmp <1
4426    break;
4427
4428  /* -- Loops and branches ------------------------------------------------ */
4429
4430  |.define FOR_IDX,  [RA]
4431  |.define FOR_STOP, [RA+8]
4432  |.define FOR_STEP, [RA+16]
4433  |.define FOR_EXT,  [RA+24]
4434
4435  case BC_FORL:
4436    |.if JIT
4437    |  hotloop RBd
4438    |.endif
4439    | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.
4440    break;
4441
4442  case BC_JFORI:
4443  case BC_JFORL:
4444#if !LJ_HASJIT
4445    break;
4446#endif
4447  case BC_FORI:
4448  case BC_IFORL:
4449    vk = (op == BC_IFORL || op == BC_JFORL);
4450    |  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)
4451    |  lea RA, [BASE+RA*8]
4452    if (LJ_DUALNUM) {
4453      |  mov RB, FOR_IDX
4454      |  checkint RB, >9
4455      |  mov TMPR, FOR_STOP
4456      if (!vk) {
4457	|  checkint TMPR, ->vmeta_for
4458	|  mov ITYPE, FOR_STEP
4459	|  test ITYPEd, ITYPEd; js >5
4460	|  sar ITYPE, 47;
4461	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for
4462      } else {
4463#ifdef LUA_USE_ASSERT
4464	|  checkinttp FOR_STOP, ->assert_bad_for_arg_type
4465	|  checkinttp FOR_STEP, ->assert_bad_for_arg_type
4466#endif
4467	|  mov ITYPE, FOR_STEP
4468	|  test ITYPEd, ITYPEd; js >5
4469	|  add RBd, ITYPEd; jo >1
4470	|  setint RB
4471	|  mov FOR_IDX, RB
4472      }
4473      |  cmp RBd, TMPRd
4474      |  mov FOR_EXT, RB
4475      if (op == BC_FORI) {
4476	|  jle >7
4477	|1:
4478	|6:
4479	|  branchPC RD
4480      } else if (op == BC_JFORI) {
4481	|  branchPC RD
4482	|  movzx RDd, PC_RD
4483	|  jle =>BC_JLOOP
4484	|1:
4485	|6:
4486      } else if (op == BC_IFORL) {
4487	|  jg >7
4488	|6:
4489	|  branchPC RD
4490	|1:
4491      } else {
4492	|  jle =>BC_JLOOP
4493	|1:
4494	|6:
4495      }
4496      |7:
4497      |  ins_next
4498      |
4499      |5:  // Invert check for negative step.
4500      if (!vk) {
4501	|  sar ITYPE, 47;
4502	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for
4503      } else {
4504	|  add RBd, ITYPEd; jo <1
4505	|  setint RB
4506	|  mov FOR_IDX, RB
4507      }
4508      |  cmp RBd, TMPRd
4509      |  mov FOR_EXT, RB
4510      if (op == BC_FORI) {
4511	|  jge <7
4512      } else if (op == BC_JFORI) {
4513	|  branchPC RD
4514	|  movzx RDd, PC_RD
4515	|  jge =>BC_JLOOP
4516      } else if (op == BC_IFORL) {
4517	|  jl <7
4518      } else {
4519	|  jge =>BC_JLOOP
4520      }
4521      |  jmp <6
4522      |9:  // Fallback to FP variant.
4523      if (!vk) {
4524	|  jae ->vmeta_for
4525      }
4526    } else if (!vk) {
4527      |  checknumtp FOR_IDX, ->vmeta_for
4528    }
4529    if (!vk) {
4530      |  checknumtp FOR_STOP, ->vmeta_for
4531    } else {
4532#ifdef LUA_USE_ASSERT
4533      |  checknumtp FOR_STOP, ->assert_bad_for_arg_type
4534      |  checknumtp FOR_STEP, ->assert_bad_for_arg_type
4535#endif
4536    }
4537    |  mov RB, FOR_STEP
4538    if (!vk) {
4539      |  checknum RB, ->vmeta_for
4540    }
4541    |  movsd xmm0, qword FOR_IDX
4542    |  movsd xmm1, qword FOR_STOP
4543    if (vk) {
4544      |  addsd xmm0, qword FOR_STEP
4545      |  movsd qword FOR_IDX, xmm0
4546      |  test RB, RB; js >3
4547    } else {
4548      |  jl >3
4549    }
4550    |  ucomisd xmm1, xmm0
4551    |1:
4552    |  movsd qword FOR_EXT, xmm0
4553    if (op == BC_FORI) {
4554      |.if DUALNUM
4555      |  jnb <7
4556      |.else
4557      |  jnb >2
4558      |  branchPC RD
4559      |.endif
4560    } else if (op == BC_JFORI) {
4561      |  branchPC RD
4562      |  movzx RDd, PC_RD
4563      |  jnb =>BC_JLOOP
4564    } else if (op == BC_IFORL) {
4565      |.if DUALNUM
4566      |  jb <7
4567      |.else
4568      |  jb >2
4569      |  branchPC RD
4570      |.endif
4571    } else {
4572      |  jnb =>BC_JLOOP
4573    }
4574    |.if DUALNUM
4575    |  jmp <6
4576    |.else
4577    |2:
4578    |  ins_next
4579    |.endif
4580    |
4581    |3:  // Invert comparison if step is negative.
4582    |  ucomisd xmm0, xmm1
4583    |  jmp <1
4584    break;
4585
4586  case BC_ITERL:
4587    |.if JIT
4588    |  hotloop RBd
4589    |.endif
4590    | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.
4591    break;
4592
4593  case BC_JITERL:
4594#if !LJ_HASJIT
4595    break;
4596#endif
4597  case BC_IITERL:
4598    |  ins_AJ	// RA = base, RD = target
4599    |  lea RA, [BASE+RA*8]
4600    |  mov RB, [RA]
4601    |  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.
4602    if (op == BC_JITERL) {
4603      |  mov [RA-8], RB
4604      |  jmp =>BC_JLOOP
4605    } else {
4606      |  branchPC RD			// Otherwise save control var + branch.
4607      |  mov [RA-8], RB
4608    }
4609    |1:
4610    |  ins_next
4611    break;
4612
4613  case BC_LOOP:
4614    |  ins_A	// RA = base, RD = target (loop extent)
4615    |  // Note: RA/RD is only used by trace recorder to determine scope/extent
4616    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.
4617    |.if JIT
4618    |  hotloop RBd
4619    |.endif
4620    | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.
4621    break;
4622
4623  case BC_ILOOP:
4624    |  ins_A	// RA = base, RD = target (loop extent)
4625    |  ins_next
4626    break;
4627
4628  case BC_JLOOP:
4629    |.if JIT
4630    |  ins_AD	// RA = base (ignored), RD = traceno
4631    |  mov RA, [DISPATCH+DISPATCH_J(trace)]
4632    |  mov TRACE:RD, [RA+RD*8]
4633    |  mov RD, TRACE:RD->mcode
4634    |  mov L:RB, SAVE_L
4635    |  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE
4636    |  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB
4637    |  // Save additional callee-save registers only used in compiled code.
4638    |.if X64WIN
4639    |  mov CSAVE_4, r12
4640    |  mov CSAVE_3, r13
4641    |  mov CSAVE_2, r14
4642    |  mov CSAVE_1, r15
4643    |  mov RA, rsp
4644    |  sub rsp, 10*16+4*8
4645    |  movdqa [RA-1*16], xmm6
4646    |  movdqa [RA-2*16], xmm7
4647    |  movdqa [RA-3*16], xmm8
4648    |  movdqa [RA-4*16], xmm9
4649    |  movdqa [RA-5*16], xmm10
4650    |  movdqa [RA-6*16], xmm11
4651    |  movdqa [RA-7*16], xmm12
4652    |  movdqa [RA-8*16], xmm13
4653    |  movdqa [RA-9*16], xmm14
4654    |  movdqa [RA-10*16], xmm15
4655    |.else
4656    |  sub rsp, 16
4657    |  mov [rsp+16], r12
4658    |  mov [rsp+8], r13
4659    |.endif
4660    |  jmp RD
4661    |.endif
4662    break;
4663
4664  case BC_JMP:
4665    |  ins_AJ	// RA = unused, RD = target
4666    |  branchPC RD
4667    |  ins_next
4668    break;
4669
4670  /* -- Function headers -------------------------------------------------- */
4671
4672   /*
4673   ** Reminder: A function may be called with func/args above L->maxstack,
4674   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,
4675   ** too. This means all FUNC* ops (including fast functions) must check
4676   ** for stack overflow _before_ adding more slots!
4677   */
4678
4679  case BC_FUNCF:
4680    |.if JIT
4681    |  hotcall RBd
4682    |.endif
4683  case BC_FUNCV:  /* NYI: compiled vararg functions. */
4684    | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.
4685    break;
4686
4687  case BC_JFUNCF:
4688#if !LJ_HASJIT
4689    break;
4690#endif
4691  case BC_IFUNCF:
4692    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1
4693    |  mov KBASE, [PC-4+PC2PROTO(k)]
4694    |  mov L:RB, SAVE_L
4695    |  lea RA, [BASE+RA*8]		// Top of frame.
4696    |  cmp RA, L:RB->maxstack
4697    |  ja ->vm_growstack_f
4698    |  movzx RAd, byte [PC-4+PC2PROTO(numparams)]
4699    |  cmp NARGS:RDd, RAd		// Check for missing parameters.
4700    |  jbe >3
4701    |2:
4702    if (op == BC_JFUNCF) {
4703      |  movzx RDd, PC_RD
4704      |  jmp =>BC_JLOOP
4705    } else {
4706      |  ins_next
4707    }
4708    |
4709    |3:  // Clear missing parameters.
4710    |  mov aword [BASE+NARGS:RD*8-8], LJ_TNIL
4711    |  add NARGS:RDd, 1
4712    |  cmp NARGS:RDd, RAd
4713    |  jbe <3
4714    |  jmp <2
4715    break;
4716
4717  case BC_JFUNCV:
4718#if !LJ_HASJIT
4719    break;
4720#endif
4721    | int3  // NYI: compiled vararg functions
4722    break;  /* NYI: compiled vararg functions. */
4723
4724  case BC_IFUNCV:
4725    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1
4726    |  lea RBd, [NARGS:RD*8+FRAME_VARG+8]
4727    |  lea RD, [BASE+NARGS:RD*8+8]
4728    |  mov LFUNC:KBASE, [BASE-16]
4729    |  mov [RD-8], RB			// Store delta + FRAME_VARG.
4730    |  mov [RD-16], LFUNC:KBASE		// Store copy of LFUNC.
4731    |  mov L:RB, SAVE_L
4732    |  lea RA, [RD+RA*8]
4733    |  cmp RA, L:RB->maxstack
4734    |  ja ->vm_growstack_v		// Need to grow stack.
4735    |  mov RA, BASE
4736    |  mov BASE, RD
4737    |  movzx RBd, byte [PC-4+PC2PROTO(numparams)]
4738    |  test RBd, RBd
4739    |  jz >2
4740    |  add RA, 8
4741    |1:  // Copy fixarg slots up to new frame.
4742    |  add RA, 8
4743    |  cmp RA, BASE
4744    |  jnb >3				// Less args than parameters?
4745    |  mov KBASE, [RA-16]
4746    |  mov [RD], KBASE
4747    |  add RD, 8
4748    |  mov aword [RA-16], LJ_TNIL	// Clear old fixarg slot (help the GC).
4749    |  sub RBd, 1
4750    |  jnz <1
4751    |2:
4752    if (op == BC_JFUNCV) {
4753      |  movzx RDd, PC_RD
4754      |  jmp =>BC_JLOOP
4755    } else {
4756      |  mov KBASE, [PC-4+PC2PROTO(k)]
4757      |  ins_next
4758    }
4759    |
4760    |3:  // Clear missing parameters.
4761    |  mov aword [RD], LJ_TNIL
4762    |  add RD, 8
4763    |  sub RBd, 1
4764    |  jnz <3
4765    |  jmp <2
4766    break;
4767
4768  case BC_FUNCC:
4769  case BC_FUNCCW:
4770    |  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1
4771    |  mov CFUNC:RB, [BASE-16]
4772    |  cleartp CFUNC:RB
4773    |  mov KBASE, CFUNC:RB->f
4774    |  mov L:RB, SAVE_L
4775    |  lea RD, [BASE+NARGS:RD*8-8]
4776    |  mov L:RB->base, BASE
4777    |  lea RA, [RD+8*LUA_MINSTACK]
4778    |  cmp RA, L:RB->maxstack
4779    |  mov L:RB->top, RD
4780    if (op == BC_FUNCC) {
4781      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.
4782    } else {
4783      |  mov CARG2, KBASE
4784      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.
4785    }
4786    |  ja ->vm_growstack_c		// Need to grow stack.
4787    |  set_vmstate C
4788    if (op == BC_FUNCC) {
4789      |  call KBASE			// (lua_State *L)
4790    } else {
4791      |  // (lua_State *L, lua_CFunction f)
4792      |  call aword [DISPATCH+DISPATCH_GL(wrapf)]
4793    }
4794    |  // nresults returned in eax (RD).
4795    |  mov BASE, L:RB->base
4796    |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
4797    |  set_vmstate INTERP
4798    |  lea RA, [BASE+RD*8]
4799    |  neg RA
4800    |  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8
4801    |  mov PC, [BASE-8]			// Fetch PC of caller.
4802    |  jmp ->vm_returnc
4803    break;
4804
4805  /* ---------------------------------------------------------------------- */
4806
4807  default:
4808    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);
4809    exit(2);
4810    break;
4811  }
4812}
4813
4814static int build_backend(BuildCtx *ctx)
4815{
4816  int op;
4817  dasm_growpc(Dst, BC__MAX);
4818  build_subroutines(ctx);
4819  |.code_op
4820  for (op = 0; op < BC__MAX; op++)
4821    build_ins(ctx, (BCOp)op, op);
4822  return BC__MAX;
4823}
4824
4825/* Emit pseudo frame-info for all assembler functions. */
4826static void emit_asm_debug(BuildCtx *ctx)
4827{
4828  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
4829  switch (ctx->mode) {
4830  case BUILD_elfasm:
4831    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");
4832    fprintf(ctx->fp,
4833	".Lframe0:\n"
4834	"\t.long .LECIE0-.LSCIE0\n"
4835	".LSCIE0:\n"
4836	"\t.long 0xffffffff\n"
4837	"\t.byte 0x1\n"
4838	"\t.string \"\"\n"
4839	"\t.uleb128 0x1\n"
4840	"\t.sleb128 -8\n"
4841	"\t.byte 0x10\n"
4842	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"
4843	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"
4844	"\t.align 8\n"
4845	".LECIE0:\n\n");
4846    fprintf(ctx->fp,
4847	".LSFDE0:\n"
4848	"\t.long .LEFDE0-.LASFDE0\n"
4849	".LASFDE0:\n"
4850	"\t.long .Lframe0\n"
4851	"\t.quad .Lbegin\n"
4852	"\t.quad %d\n"
4853	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */
4854	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */
4855	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */
4856	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */
4857	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */
4858#if LJ_NO_UNWIND
4859	"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */
4860	"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */
4861#endif
4862	"\t.align 8\n"
4863	".LEFDE0:\n\n", fcofs, CFRAME_SIZE);
4864#if LJ_HASFFI
4865    fprintf(ctx->fp,
4866	".LSFDE1:\n"
4867	"\t.long .LEFDE1-.LASFDE1\n"
4868	".LASFDE1:\n"
4869	"\t.long .Lframe0\n"
4870	"\t.quad lj_vm_ffi_call\n"
4871	"\t.quad %d\n"
4872	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */
4873	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */
4874	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */
4875	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */
4876	"\t.align 8\n"
4877	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
4878#endif
4879#if !LJ_NO_UNWIND
4880#if LJ_TARGET_SOLARIS
4881    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");
4882#else
4883    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
4884#endif
4885    fprintf(ctx->fp,
4886	".Lframe1:\n"
4887	"\t.long .LECIE1-.LSCIE1\n"
4888	".LSCIE1:\n"
4889	"\t.long 0\n"
4890	"\t.byte 0x1\n"
4891	"\t.string \"zPR\"\n"
4892	"\t.uleb128 0x1\n"
4893	"\t.sleb128 -8\n"
4894	"\t.byte 0x10\n"
4895	"\t.uleb128 6\n"			/* augmentation length */
4896	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
4897	"\t.long lj_err_unwind_dwarf-.\n"
4898	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
4899	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"
4900	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"
4901	"\t.align 8\n"
4902	".LECIE1:\n\n");
4903    fprintf(ctx->fp,
4904	".LSFDE2:\n"
4905	"\t.long .LEFDE2-.LASFDE2\n"
4906	".LASFDE2:\n"
4907	"\t.long .LASFDE2-.Lframe1\n"
4908	"\t.long .Lbegin-.\n"
4909	"\t.long %d\n"
4910	"\t.uleb128 0\n"			/* augmentation length */
4911	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */
4912	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */
4913	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */
4914	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */
4915	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */
4916	"\t.align 8\n"
4917	".LEFDE2:\n\n", fcofs, CFRAME_SIZE);
4918#if LJ_HASFFI
4919    fprintf(ctx->fp,
4920	".Lframe2:\n"
4921	"\t.long .LECIE2-.LSCIE2\n"
4922	".LSCIE2:\n"
4923	"\t.long 0\n"
4924	"\t.byte 0x1\n"
4925	"\t.string \"zR\"\n"
4926	"\t.uleb128 0x1\n"
4927	"\t.sleb128 -8\n"
4928	"\t.byte 0x10\n"
4929	"\t.uleb128 1\n"			/* augmentation length */
4930	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
4931	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"
4932	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"
4933	"\t.align 8\n"
4934	".LECIE2:\n\n");
4935    fprintf(ctx->fp,
4936	".LSFDE3:\n"
4937	"\t.long .LEFDE3-.LASFDE3\n"
4938	".LASFDE3:\n"
4939	"\t.long .LASFDE3-.Lframe2\n"
4940	"\t.long lj_vm_ffi_call-.\n"
4941	"\t.long %d\n"
4942	"\t.uleb128 0\n"			/* augmentation length */
4943	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */
4944	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */
4945	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */
4946	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */
4947	"\t.align 8\n"
4948	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
4949#endif
4950#endif
4951#if LJ_TARGET_LINUX && (LJ_ABI_BRANCH_TRACK || LJ_ABI_SHADOW_STACK)
4952    fprintf(ctx->fp,
4953	"\t.section .note.gnu.property,\"a\"\n"
4954	"\t.align 8\n"
4955	"\t.long 4\n"
4956	"\t.long 16\n"
4957	"\t.long 5\n"
4958	"\t.long 0x00554e47\n"
4959	"\t.long 0xc0000002\n"
4960	"\t.long 4\n"
4961	"\t.long %d\n"
4962	"\t.long 0\n",
4963#if LJ_ABI_BRANCH_TRACK
4964	1|
4965#else
4966	0|
4967#endif
4968#if LJ_ABI_SHADOW_STACK
4969	2
4970#else
4971	0
4972#endif
4973	);
4974#endif
4975    break;
4976#if !LJ_NO_UNWIND
4977  /* Mental note: never let Apple design an assembler.
4978  ** Or a linker. Or a plastic case. But I digress.
4979  */
4980  case BUILD_machasm: {
4981#if LJ_HASFFI
4982    int fcsize = 0;
4983#endif
4984    int i;
4985    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");
4986    fprintf(ctx->fp,
4987	"EH_frame1:\n"
4988	"\t.set L$set$x,LECIEX-LSCIEX\n"
4989	"\t.long L$set$x\n"
4990	"LSCIEX:\n"
4991	"\t.long 0\n"
4992	"\t.byte 0x1\n"
4993	"\t.ascii \"zPR\\0\"\n"
4994	"\t.byte 0x1\n"
4995	"\t.byte 128-8\n"
4996	"\t.byte 0x10\n"
4997	"\t.byte 6\n"				/* augmentation length */
4998	"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */
4999	"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"
5000	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
5001	"\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"
5002	"\t.byte 0x80+0x10\n\t.byte 0x1\n"
5003	"\t.align 3\n"
5004	"LECIEX:\n\n");
5005    for (i = 0; i < ctx->nsym; i++) {
5006      const char *name = ctx->sym[i].name;
5007      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;
5008      if (size == 0) continue;
5009#if LJ_HASFFI
5010      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }
5011#endif
5012      fprintf(ctx->fp,
5013	  "%s.eh:\n"
5014	  "LSFDE%d:\n"
5015	  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"
5016	  "\t.long L$set$%d\n"
5017	  "LASFDE%d:\n"
5018	  "\t.long LASFDE%d-EH_frame1\n"
5019	  "\t.long %s-.\n"
5020	  "\t.long %d\n"
5021	  "\t.byte 0\n"				/* augmentation length */
5022	  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */
5023	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */
5024	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */
5025	  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */
5026	  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */
5027	  "\t.align 3\n"
5028	  "LEFDE%d:\n\n",
5029	  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);
5030    }
5031#if LJ_HASFFI
5032    if (fcsize) {
5033      fprintf(ctx->fp,
5034	  "EH_frame2:\n"
5035	  "\t.set L$set$y,LECIEY-LSCIEY\n"
5036	  "\t.long L$set$y\n"
5037	  "LSCIEY:\n"
5038	  "\t.long 0\n"
5039	  "\t.byte 0x1\n"
5040	  "\t.ascii \"zR\\0\"\n"
5041	  "\t.byte 0x1\n"
5042	  "\t.byte 128-8\n"
5043	  "\t.byte 0x10\n"
5044	  "\t.byte 1\n"				/* augmentation length */
5045	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */
5046	  "\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"
5047	  "\t.byte 0x80+0x10\n\t.byte 0x1\n"
5048	  "\t.align 3\n"
5049	  "LECIEY:\n\n");
5050      fprintf(ctx->fp,
5051	  "_lj_vm_ffi_call.eh:\n"
5052	  "LSFDEY:\n"
5053	  "\t.set L$set$yy,LEFDEY-LASFDEY\n"
5054	  "\t.long L$set$yy\n"
5055	  "LASFDEY:\n"
5056	  "\t.long LASFDEY-EH_frame2\n"
5057	  "\t.long _lj_vm_ffi_call-.\n"
5058	  "\t.long %d\n"
5059	  "\t.byte 0\n"				/* augmentation length */
5060	  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */
5061	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */
5062	  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */
5063	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */
5064	  "\t.align 3\n"
5065	  "LEFDEY:\n\n", fcsize);
5066    }
5067#endif
5068    }
5069    break;
5070#endif
5071  default:  /* Difficult for other modes. */
5072    break;
5073  }
5074}
5075