cjson
fuzzing
inputs
test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9library_config
cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmaketests
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.expectedjson-patch-tests
.editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.jsonunity
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.pydocs
ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txtexamples
unity_config.hcurl
.github
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.yamlworkflows
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.ymlCMake
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.cmakedocs
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.mdexamples
.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.cinternals
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.mdlibcurl
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.incinclude
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.hlib
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.hvauth
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.hvquic
curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.hvtls
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.hm4
.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.m4projects
OS400
.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.hWindows
tmpl
.gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filtersvms
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.hscripts
.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 wcurlsrc
.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.htests
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.prmdata
.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 test999http
testenv
__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.pylibtest
.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.hserver
.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.ctunit
.gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.cunit
.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.cexamples
.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.luainiparser
example
iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.initest
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.hjinjac
libjinjac
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.htest
.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.jinjalibev
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-h1luajit
doc
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.htmldynasm
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.luasrc
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.cjit
.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.luawolfssl
.github
workflows
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.ymlIDE
ARDUINO
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.hECLIPSE
Espressif
ESP-IDF
examples
template
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266wolfssl_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.vgdbprojwolfssl_client
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbprojwolfssl_server
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbprojwolfssl_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.vgdbprojGCC-ARM
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ldIAR-EWARM
embOS
SAMV71_XULT
embOS_SAMV71_XULT_user_settings
user_settings.h user_settings_simple_example.h user_settings_verbose_example.hembOS_wolfcrypt_benchmark_SAMV71_XULT
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewpINTIME-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.vcxprojMQX
Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.hMSVS-2019-AZSPHERE
wolfssl_new_azsphere
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.cNETOS
Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.cPlatformIO
examples
wolfssl_benchmark
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspaceROWLEY-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.hzpRenesas
e2studio
RA6M3
README.md README_APRA6M_en.md README_APRA6M_jp.md include.amRX72N
EnvisionKit
Simple
README_EN.md README_JP.mdwolfssl_demo
key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.cSTM32Cube
README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.hWIN
README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxprojWIN-SRTP-KDF-140-3
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojWIN10
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojXCODE
Benchmark
include.amXilinxSDK
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.capple-universal
wolfssl-multiplatform
iotsafe
Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.hmynewt
README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.shcerts
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.pemcrl
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.pemdilithium
bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.amecc
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.cnfed25519
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.pemed448
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.pemexternal
DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.amintermediate
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.conflms
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.ammldsa
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.derocsp
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.derp521
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.pemrpk
client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.derrsapss
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.pemslhdsa
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.pemsm2
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.pemstatickeys
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.pemtest
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.p7stest-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.shtest-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.pemxmss
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.amcmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.indebian
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.indoc
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.hheader_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.hexamples
async
Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.hconfigs
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.hechoclient
echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quitlinuxkm
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.cm4
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.m4mqx
wolfcrypt_benchmark
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.launchwolfcrypt_test
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.launchwolfssl_client
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.launchscripts
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.shsrc
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.ctests
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.hwolfcrypt
benchmark
README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.amsrc
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.pyRenesas
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.carm
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.ccaam
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.cdevcrypto
README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.criscv
riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.cwolfssl
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.hwolfcrypt
port
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.hcaam
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.hwrapper
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.adbtests
src
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.adbCSharp
wolfSSL-Example-IOCallbacks
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csprojwolfSSL-TLS-ServerThreaded
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csprojrust
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.rstests
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.rszephyr
samples
wolfssl_benchmark
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.confwolfssl_test
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
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