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/lj_opt_fold.c
raw
1/*
2** FOLD: Constant Folding, Algebraic Simplifications and Reassociation.
3** ABCelim: Array Bounds Check Elimination.
4** CSE: Common-Subexpression Elimination.
5** Copyright (C) 2005-2026 Mike Pall. See Copyright Notice in luajit.h
6*/
7
8#define lj_opt_fold_c
9#define LUA_CORE
10
11#include <math.h>
12
13#include "lj_obj.h"
14
15#if LJ_HASJIT
16
17#include "lj_buf.h"
18#include "lj_str.h"
19#include "lj_tab.h"
20#include "lj_ir.h"
21#include "lj_jit.h"
22#include "lj_ircall.h"
23#include "lj_iropt.h"
24#include "lj_trace.h"
25#if LJ_HASFFI
26#include "lj_ctype.h"
27#include "lj_carith.h"
28#endif
29#include "lj_vm.h"
30#include "lj_strscan.h"
31#include "lj_strfmt.h"
32
33/* Here's a short description how the FOLD engine processes instructions:
34**
35** The FOLD engine receives a single instruction stored in fins (J->fold.ins).
36** The instruction and its operands are used to select matching fold rules.
37** These are applied iteratively until a fixed point is reached.
38**
39** The 8 bit opcode of the instruction itself plus the opcodes of the
40** two instructions referenced by its operands form a 24 bit key
41** 'ins left right' (unused operands -> 0, literals -> lowest 8 bits).
42**
43** This key is used for partial matching against the fold rules. The
44** left/right operand fields of the key are successively masked with
45** the 'any' wildcard, from most specific to least specific:
46**
47** ins left right
48** ins any right
49** ins left any
50** ins any any
51**
52** The masked key is used to lookup a matching fold rule in a semi-perfect
53** hash table. If a matching rule is found, the related fold function is run.
54** Multiple rules can share the same fold function. A fold rule may return
55** one of several special values:
56**
57** - NEXTFOLD means no folding was applied, because an additional test
58** inside the fold function failed. Matching continues against less
59** specific fold rules. Finally the instruction is passed on to CSE.
60**
61** - RETRYFOLD means the instruction was modified in-place. Folding is
62** retried as if this instruction had just been received.
63**
64** All other return values are terminal actions -- no further folding is
65** applied:
66**
67** - INTFOLD(i) returns a reference to the integer constant i.
68**
69** - LEFTFOLD and RIGHTFOLD return the left/right operand reference
70** without emitting an instruction.
71**
72** - CSEFOLD and EMITFOLD pass the instruction directly to CSE or emit
73** it without passing through any further optimizations.
74**
75** - FAILFOLD, DROPFOLD and CONDFOLD only apply to instructions which have
76** no result (e.g. guarded assertions): FAILFOLD means the guard would
77** always fail, i.e. the current trace is pointless. DROPFOLD means
78** the guard is always true and has been eliminated. CONDFOLD is a
79** shortcut for FAILFOLD + cond (i.e. drop if true, otherwise fail).
80**
81** - Any other return value is interpreted as an IRRef or TRef. This
82** can be a reference to an existing or a newly created instruction.
83** Only the least-significant 16 bits (IRRef1) are used to form a TRef
84** which is finally returned to the caller.
85**
86** The FOLD engine receives instructions both from the trace recorder and
87** substituted instructions from LOOP unrolling. This means all types
88** of instructions may end up here, even though the recorder bypasses
89** FOLD in some cases. Thus all loads, stores and allocations must have
90** an any/any rule to avoid being passed on to CSE.
91**
92** Carefully read the following requirements before adding or modifying
93** any fold rules:
94**
95** Requirement #1: All fold rules must preserve their destination type.
96**
97** Consistently use INTFOLD() (KINT result) or lj_ir_knum() (KNUM result).
98** Never use lj_ir_knumint() which can have either a KINT or KNUM result.
99**
100** Requirement #2: Fold rules should not create *new* instructions which
101** reference operands *across* PHIs.
102**
103** E.g. a RETRYFOLD with 'fins->op1 = fleft->op1' is invalid if the
104** left operand is a PHI. Then fleft->op1 would point across the PHI
105** frontier to an invariant instruction. Adding a PHI for this instruction
106** would be counterproductive. The solution is to add a barrier which
107** prevents folding across PHIs, i.e. 'PHIBARRIER(fleft)' in this case.
108** The only exception is for recurrences with high latencies like
109** repeated int->num->int conversions.
110**
111** One could relax this condition a bit if the referenced instruction is
112** a PHI, too. But this often leads to worse code due to excessive
113** register shuffling.
114**
115** Note: returning *existing* instructions (e.g. LEFTFOLD) is ok, though.
116** Even returning fleft->op1 would be ok, because a new PHI will added,
117** if needed. But again, this leads to excessive register shuffling and
118** should be avoided.
119**
120** Requirement #3: The set of all fold rules must be monotonic to guarantee
121** termination.
122**
123** The goal is optimization, so one primarily wants to add strength-reducing
124** rules. This means eliminating an instruction or replacing an instruction
125** with one or more simpler instructions. Don't add fold rules which point
126** into the other direction.
127**
128** Some rules (like commutativity) do not directly reduce the strength of
129** an instruction, but enable other fold rules (e.g. by moving constants
130** to the right operand). These rules must be made unidirectional to avoid
131** cycles.
132**
133** Rule of thumb: the trace recorder expands the IR and FOLD shrinks it.
134*/
135
136/* Some local macros to save typing. Undef'd at the end. */
137#define IR(ref) (&J->cur.ir[(ref)])
138#define fins (&J->fold.ins)
139#define fleft (J->fold.left)
140#define fright (J->fold.right)
141#define knumleft (ir_knum(fleft)->n)
142#define knumright (ir_knum(fright)->n)
143
144/* Pass IR on to next optimization in chain (FOLD). */
145#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
146
147/* Fold function type. Fastcall on x86 significantly reduces their size. */
148typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);
149
150/* Macros for the fold specs, so buildvm can recognize them. */
151#define LJFOLD(x)
152#define LJFOLDX(x)
153#define LJFOLDF(name) static TRef LJ_FASTCALL fold_##name(jit_State *J)
154/* Note: They must be at the start of a line or buildvm ignores them! */
155
156/* Barrier to prevent using operands across PHIs. */
157#define PHIBARRIER(ir) if (irt_isphi((ir)->t)) return NEXTFOLD
158
159/* Barrier to prevent folding across a GC step.
160** GC steps can only happen at the head of a trace and at LOOP.
161** And the GC is only driven forward if there's at least one allocation.
162*/
163#define gcstep_barrier(J, ref) \
164 ((ref) < J->chain[IR_LOOP] && \
165 (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \
166 J->chain[IR_TNEW] || J->chain[IR_TDUP] || \
167 J->chain[IR_CNEW] || J->chain[IR_CNEWI] || \
168 J->chain[IR_BUFSTR] || J->chain[IR_TOSTR] || J->chain[IR_CALLA]))
169
170/* -- Constant folding for FP numbers ------------------------------------- */
171
172LJFOLD(ADD KNUM KNUM)
173LJFOLD(SUB KNUM KNUM)
174LJFOLD(MUL KNUM KNUM)
175LJFOLD(DIV KNUM KNUM)
176LJFOLD(LDEXP KNUM KNUM)
177LJFOLD(MIN KNUM KNUM)
178LJFOLD(MAX KNUM KNUM)
179LJFOLDF(kfold_numarith)
180{
181 lua_Number a = knumleft;
182 lua_Number b = knumright;
183 lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD);
184 return lj_ir_knum(J, y);
185}
186
187LJFOLD(NEG KNUM FLOAD)
188LJFOLD(ABS KNUM FLOAD)
189LJFOLDF(kfold_numabsneg)
190{
191 lua_Number a = knumleft;
192 lua_Number y = lj_vm_foldarith(a, a, fins->o - IR_ADD);
193 return lj_ir_knum(J, y);
194}
195
196LJFOLD(LDEXP KNUM KINT)
197LJFOLDF(kfold_ldexp)
198{
199#if LJ_TARGET_X86ORX64
200 UNUSED(J);
201 return NEXTFOLD;
202#else
203 return lj_ir_knum(J, ldexp(knumleft, fright->i));
204#endif
205}
206
207LJFOLD(FPMATH KNUM any)
208LJFOLDF(kfold_fpmath)
209{
210 lua_Number a = knumleft;
211 lua_Number y = lj_vm_foldfpm(a, fins->op2);
212 return lj_ir_knum(J, y);
213}
214
215LJFOLD(CALLN KNUM any)
216LJFOLDF(kfold_fpcall1)
217{
218 const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
219 if (CCI_TYPE(ci) == IRT_NUM) {
220 double y = ((double (*)(double))ci->func)(knumleft);
221 return lj_ir_knum(J, y);
222 }
223 return NEXTFOLD;
224}
225
226LJFOLD(CALLN CARG IRCALL_atan2)
227LJFOLDF(kfold_fpcall2)
228{
229 if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) {
230 const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
231 double a = ir_knum(IR(fleft->op1))->n;
232 double b = ir_knum(IR(fleft->op2))->n;
233 double y = ((double (*)(double, double))ci->func)(a, b);
234 return lj_ir_knum(J, y);
235 }
236 return NEXTFOLD;
237}
238
239LJFOLD(POW KNUM KNUM)
240LJFOLDF(kfold_numpow)
241{
242 return lj_ir_knum(J, lj_vm_foldarith(knumleft, knumright, IR_POW - IR_ADD));
243}
244
245/* Must not use kfold_kref for numbers (could be NaN). */
246LJFOLD(EQ KNUM KNUM)
247LJFOLD(NE KNUM KNUM)
248LJFOLD(LT KNUM KNUM)
249LJFOLD(GE KNUM KNUM)
250LJFOLD(LE KNUM KNUM)
251LJFOLD(GT KNUM KNUM)
252LJFOLD(ULT KNUM KNUM)
253LJFOLD(UGE KNUM KNUM)
254LJFOLD(ULE KNUM KNUM)
255LJFOLD(UGT KNUM KNUM)
256LJFOLDF(kfold_numcomp)
257{
258 return CONDFOLD(lj_ir_numcmp(knumleft, knumright, (IROp)fins->o));
259}
260
261/* -- Constant folding for 32 bit integers -------------------------------- */
262
263static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)
264{
265 switch (op) {
266 case IR_ADD: k1 += k2; break;
267 case IR_SUB: k1 -= k2; break;
268 case IR_MUL: k1 *= k2; break;
269 case IR_MOD: k1 = lj_vm_modi(k1, k2); break;
270 case IR_NEG: k1 = (int32_t)(~(uint32_t)k1+1u); break;
271 case IR_BAND: k1 &= k2; break;
272 case IR_BOR: k1 |= k2; break;
273 case IR_BXOR: k1 ^= k2; break;
274 case IR_BSHL: k1 <<= (k2 & 31); break;
275 case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 31)); break;
276 case IR_BSAR: k1 >>= (k2 & 31); break;
277 case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break;
278 case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break;
279 case IR_MIN: k1 = k1 < k2 ? k1 : k2; break;
280 case IR_MAX: k1 = k1 > k2 ? k1 : k2; break;
281 default: lj_assertX(0, "bad IR op %d", op); break;
282 }
283 return k1;
284}
285
286LJFOLD(ADD KINT KINT)
287LJFOLD(SUB KINT KINT)
288LJFOLD(MUL KINT KINT)
289LJFOLD(MOD KINT KINT)
290LJFOLD(NEG KINT KINT)
291LJFOLD(BAND KINT KINT)
292LJFOLD(BOR KINT KINT)
293LJFOLD(BXOR KINT KINT)
294LJFOLD(BSHL KINT KINT)
295LJFOLD(BSHR KINT KINT)
296LJFOLD(BSAR KINT KINT)
297LJFOLD(BROL KINT KINT)
298LJFOLD(BROR KINT KINT)
299LJFOLD(MIN KINT KINT)
300LJFOLD(MAX KINT KINT)
301LJFOLDF(kfold_intarith)
302{
303 return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o));
304}
305
306/* Forward declaration. */
307static uint64_t kfold_int64arith(jit_State *J, uint64_t k1, uint64_t k2,
308 IROp op);
309
310LJFOLD(ADDOV KINT KINT)
311LJFOLD(SUBOV KINT KINT)
312LJFOLD(MULOV KINT KINT)
313LJFOLDF(kfold_intovarith)
314{
315 int64_t k = kfold_int64arith(J, (int64_t)fleft->i, (int64_t)fright->i,
316 (IROp)((int)fins->o - (int)IR_ADDOV + (int)IR_ADD));
317 return checki32(k) ? INTFOLD(k) : FAILFOLD;
318}
319
320LJFOLD(BNOT KINT)
321LJFOLDF(kfold_bnot)
322{
323 return INTFOLD(~fleft->i);
324}
325
326LJFOLD(BSWAP KINT)
327LJFOLDF(kfold_bswap)
328{
329 return INTFOLD((int32_t)lj_bswap((uint32_t)fleft->i));
330}
331
332LJFOLD(LT KINT KINT)
333LJFOLD(GE KINT KINT)
334LJFOLD(LE KINT KINT)
335LJFOLD(GT KINT KINT)
336LJFOLD(ULT KINT KINT)
337LJFOLD(UGE KINT KINT)
338LJFOLD(ULE KINT KINT)
339LJFOLD(UGT KINT KINT)
340LJFOLD(ABC KINT KINT)
341LJFOLDF(kfold_intcomp)
342{
343 int32_t a = fleft->i, b = fright->i;
344 switch ((IROp)fins->o) {
345 case IR_LT: return CONDFOLD(a < b);
346 case IR_GE: return CONDFOLD(a >= b);
347 case IR_LE: return CONDFOLD(a <= b);
348 case IR_GT: return CONDFOLD(a > b);
349 case IR_ULT: return CONDFOLD((uint32_t)a < (uint32_t)b);
350 case IR_UGE: return CONDFOLD((uint32_t)a >= (uint32_t)b);
351 case IR_ULE: return CONDFOLD((uint32_t)a <= (uint32_t)b);
352 case IR_ABC:
353 case IR_UGT: return CONDFOLD((uint32_t)a > (uint32_t)b);
354 default: lj_assertJ(0, "bad IR op %d", fins->o); return FAILFOLD;
355 }
356}
357
358LJFOLD(UGE any KINT)
359LJFOLDF(kfold_intcomp0)
360{
361 if (fright->i == 0)
362 return DROPFOLD;
363 return NEXTFOLD;
364}
365
366/* -- Constant folding for 64 bit integers -------------------------------- */
367
368static uint64_t kfold_int64arith(jit_State *J, uint64_t k1, uint64_t k2,
369 IROp op)
370{
371 UNUSED(J);
372 switch (op) {
373 case IR_ADD: k1 += k2; break;
374 case IR_SUB: k1 -= k2; break;
375 case IR_MUL: k1 *= k2; break;
376#if LJ_HASFFI
377 case IR_BAND: k1 &= k2; break;
378 case IR_BOR: k1 |= k2; break;
379 case IR_BXOR: k1 ^= k2; break;
380 case IR_BSHL: k1 <<= (k2 & 63); break;
381 case IR_BSHR: k1 >>= (k2 & 63); break;
382 case IR_BSAR: k1 = (uint64_t)((int64_t)k1 >> (k2 & 63)); break;
383 case IR_BROL: k1 = lj_rol(k1, (k2 & 63)); break;
384 case IR_BROR: k1 = lj_ror(k1, (k2 & 63)); break;
385 default: lj_assertJ(0, "bad IR op %d", op); break;
386#endif
387 }
388 return k1;
389}
390
391LJFOLD(ADD KINT64 KINT64)
392LJFOLD(SUB KINT64 KINT64)
393LJFOLD(MUL KINT64 KINT64)
394LJFOLD(BAND KINT64 KINT64)
395LJFOLD(BOR KINT64 KINT64)
396LJFOLD(BXOR KINT64 KINT64)
397LJFOLDF(kfold_int64arith)
398{
399 return INT64FOLD(kfold_int64arith(J, ir_k64(fleft)->u64,
400 ir_k64(fright)->u64, (IROp)fins->o));
401}
402
403LJFOLD(DIV KINT64 KINT64)
404LJFOLD(MOD KINT64 KINT64)
405LJFOLD(POW KINT64 KINT64)
406LJFOLDF(kfold_int64arith2)
407{
408#if LJ_HASFFI
409 uint64_t k1 = ir_k64(fleft)->u64, k2 = ir_k64(fright)->u64;
410 if (irt_isi64(fins->t)) {
411 k1 = fins->o == IR_DIV ? lj_carith_divi64((int64_t)k1, (int64_t)k2) :
412 fins->o == IR_MOD ? lj_carith_modi64((int64_t)k1, (int64_t)k2) :
413 lj_carith_powi64((int64_t)k1, (int64_t)k2);
414 } else {
415 k1 = fins->o == IR_DIV ? lj_carith_divu64(k1, k2) :
416 fins->o == IR_MOD ? lj_carith_modu64(k1, k2) :
417 lj_carith_powu64(k1, k2);
418 }
419 return INT64FOLD(k1);
420#else
421 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
422#endif
423}
424
425LJFOLD(BSHL KINT64 KINT)
426LJFOLD(BSHR KINT64 KINT)
427LJFOLD(BSAR KINT64 KINT)
428LJFOLD(BROL KINT64 KINT)
429LJFOLD(BROR KINT64 KINT)
430LJFOLDF(kfold_int64shift)
431{
432#if LJ_HASFFI
433 uint64_t k = ir_k64(fleft)->u64;
434 int32_t sh = (fright->i & 63);
435 return INT64FOLD(lj_carith_shift64(k, sh, fins->o - IR_BSHL));
436#else
437 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
438#endif
439}
440
441LJFOLD(BNOT KINT64)
442LJFOLDF(kfold_bnot64)
443{
444#if LJ_HASFFI
445 return INT64FOLD(~ir_k64(fleft)->u64);
446#else
447 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
448#endif
449}
450
451LJFOLD(BSWAP KINT64)
452LJFOLDF(kfold_bswap64)
453{
454#if LJ_HASFFI
455 return INT64FOLD(lj_bswap64(ir_k64(fleft)->u64));
456#else
457 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
458#endif
459}
460
461LJFOLD(LT KINT64 KINT64)
462LJFOLD(GE KINT64 KINT64)
463LJFOLD(LE KINT64 KINT64)
464LJFOLD(GT KINT64 KINT64)
465LJFOLD(ULT KINT64 KINT64)
466LJFOLD(UGE KINT64 KINT64)
467LJFOLD(ULE KINT64 KINT64)
468LJFOLD(UGT KINT64 KINT64)
469LJFOLDF(kfold_int64comp)
470{
471#if LJ_HASFFI
472 uint64_t a = ir_k64(fleft)->u64, b = ir_k64(fright)->u64;
473 switch ((IROp)fins->o) {
474 case IR_LT: return CONDFOLD((int64_t)a < (int64_t)b);
475 case IR_GE: return CONDFOLD((int64_t)a >= (int64_t)b);
476 case IR_LE: return CONDFOLD((int64_t)a <= (int64_t)b);
477 case IR_GT: return CONDFOLD((int64_t)a > (int64_t)b);
478 case IR_ULT: return CONDFOLD(a < b);
479 case IR_UGE: return CONDFOLD(a >= b);
480 case IR_ULE: return CONDFOLD(a <= b);
481 case IR_UGT: return CONDFOLD(a > b);
482 default: lj_assertJ(0, "bad IR op %d", fins->o); return FAILFOLD;
483 }
484#else
485 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
486#endif
487}
488
489LJFOLD(UGE any KINT64)
490LJFOLDF(kfold_int64comp0)
491{
492#if LJ_HASFFI
493 if (ir_k64(fright)->u64 == 0)
494 return DROPFOLD;
495 return NEXTFOLD;
496#else
497 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
498#endif
499}
500
501/* -- Constant folding for strings ---------------------------------------- */
502
503LJFOLD(SNEW KKPTR KINT)
504LJFOLDF(kfold_snew_kptr)
505{
506 GCstr *s = lj_str_new(J->L, (const char *)ir_kptr(fleft), (size_t)fright->i);
507 return lj_ir_kstr(J, s);
508}
509
510LJFOLD(SNEW any KINT)
511LJFOLD(XSNEW any KINT)
512LJFOLDF(kfold_snew_empty)
513{
514 if (fright->i == 0)
515 return lj_ir_kstr(J, &J2G(J)->strempty);
516 return NEXTFOLD;
517}
518
519LJFOLD(STRREF KGC KINT)
520LJFOLDF(kfold_strref)
521{
522 GCstr *str = ir_kstr(fleft);
523 lj_assertJ((MSize)fright->i <= str->len, "bad string ref");
524 return lj_ir_kkptr(J, (char *)strdata(str) + fright->i);
525}
526
527LJFOLD(STRREF SNEW any)
528LJFOLDF(kfold_strref_snew)
529{
530 PHIBARRIER(fleft);
531 if (irref_isk(fins->op2) && fright->i == 0) {
532 return fleft->op1; /* strref(snew(ptr, len), 0) ==> ptr */
533 } else {
534 /* Reassociate: strref(snew(strref(str, a), len), b) ==> strref(str, a+b) */
535 IRIns *ir = IR(fleft->op1);
536 if (ir->o == IR_STRREF) {
537 IRRef1 str = ir->op1; /* IRIns * is not valid across emitir. */
538 PHIBARRIER(ir);
539 fins->op2 = emitir(IRTI(IR_ADD), ir->op2, fins->op2); /* Clobbers fins! */
540 fins->op1 = str;
541 fins->ot = IRT(IR_STRREF, IRT_PGC);
542 return RETRYFOLD;
543 }
544 }
545 return NEXTFOLD;
546}
547
548LJFOLD(CALLN CARG IRCALL_lj_str_cmp)
549LJFOLDF(kfold_strcmp)
550{
551 if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) {
552 GCstr *a = ir_kstr(IR(fleft->op1));
553 GCstr *b = ir_kstr(IR(fleft->op2));
554 return INTFOLD(lj_str_cmp(a, b));
555 }
556 return NEXTFOLD;
557}
558
559/* -- Constant folding and forwarding for buffers ------------------------- */
560
561/*
562** Buffer ops perform stores, but their effect is limited to the buffer
563** itself. Also, buffer ops are chained: a use of an op implies a use of
564** all other ops up the chain. Conversely, if an op is unused, all ops
565** up the chain can go unsed. This largely eliminates the need to treat
566** them as stores.
567**
568** Alas, treating them as normal (IRM_N) ops doesn't work, because they
569** cannot be CSEd in isolation. CSE for IRM_N is implicitly done in LOOP
570** or if FOLD is disabled.
571**
572** The compromise is to declare them as loads, emit them like stores and
573** CSE whole chains manually when the BUFSTR is to be emitted. Any chain
574** fragments left over from CSE are eliminated by DCE.
575**
576** The string buffer methods emit a USE instead of a BUFSTR to keep the
577** chain alive.
578*/
579
580LJFOLD(BUFHDR any any)
581LJFOLDF(bufhdr_merge)
582{
583 return fins->op2 == IRBUFHDR_WRITE ? CSEFOLD : EMITFOLD;
584}
585
586LJFOLD(BUFPUT any BUFSTR)
587LJFOLDF(bufput_bufstr)
588{
589 if ((J->flags & JIT_F_OPT_FWD)) {
590 IRRef hdr = fright->op2;
591 /* New buffer, no other buffer op inbetween and same buffer? */
592 if (fleft->o == IR_BUFHDR && fleft->op2 == IRBUFHDR_RESET &&
593 fleft->prev == hdr &&
594 fleft->op1 == IR(hdr)->op1 &&
595 !(irt_isphi(fright->t) && IR(hdr)->prev) &&
596 (!LJ_HASBUFFER || J->chain[IR_CALLA] < hdr)) {
597 IRRef ref = fins->op1;
598 IR(ref)->op2 = IRBUFHDR_APPEND; /* Modify BUFHDR. */
599 IR(ref)->op1 = fright->op1;
600 return ref;
601 }
602 /* Replay puts to global temporary buffer. */
603 if (IR(hdr)->op2 == IRBUFHDR_RESET && !irt_isphi(fright->t)) {
604 IRIns *ir = IR(fright->op1);
605 /* For now only handle single string.reverse .lower .upper .rep. */
606 if (ir->o == IR_CALLL &&
607 ir->op2 >= IRCALL_lj_buf_putstr_reverse &&
608 ir->op2 <= IRCALL_lj_buf_putstr_rep) {
609 IRIns *carg1 = IR(ir->op1);
610 if (ir->op2 == IRCALL_lj_buf_putstr_rep) {
611 IRIns *carg2 = IR(carg1->op1);
612 if (carg2->op1 == hdr) {
613 return lj_ir_call(J, ir->op2, fins->op1, carg2->op2, carg1->op2);
614 }
615 } else if (carg1->op1 == hdr) {
616 return lj_ir_call(J, ir->op2, fins->op1, carg1->op2);
617 }
618 }
619 }
620 }
621 return EMITFOLD; /* Always emit, CSE later. */
622}
623
624LJFOLD(BUFPUT any any)
625LJFOLDF(bufput_kgc)
626{
627 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {
628 GCstr *s2 = ir_kstr(fright);
629 if (s2->len == 0) { /* Empty string? */
630 return LEFTFOLD;
631 } else {
632 if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&
633 !irt_isphi(fleft->t)) { /* Join two constant string puts in a row. */
634 GCstr *s1 = ir_kstr(IR(fleft->op2));
635 IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2));
636 /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */
637 IR(fins->op1)->op2 = kref; /* Modify previous BUFPUT. */
638 return fins->op1;
639 }
640 }
641 }
642 return EMITFOLD; /* Always emit, CSE later. */
643}
644
645LJFOLD(BUFSTR any any)
646LJFOLDF(bufstr_kfold_cse)
647{
648 lj_assertJ(fleft->o == IR_BUFHDR || fleft->o == IR_BUFPUT ||
649 fleft->o == IR_CALLL,
650 "bad buffer constructor IR op %d", fleft->o);
651 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
652 if (fleft->o == IR_BUFHDR) { /* No put operations? */
653 if (fleft->op2 == IRBUFHDR_RESET) /* Empty buffer? */
654 return lj_ir_kstr(J, &J2G(J)->strempty);
655 fins->op1 = fleft->op1;
656 fins->op2 = fleft->prev; /* Relies on checks in bufput_append. */
657 return CSEFOLD;
658 } else if (fleft->o == IR_BUFPUT) {
659 IRIns *irb = IR(fleft->op1);
660 if (irb->o == IR_BUFHDR && irb->op2 == IRBUFHDR_RESET)
661 return fleft->op2; /* Shortcut for a single put operation. */
662 }
663 }
664 /* Try to CSE the whole chain. */
665 if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {
666 IRRef ref = J->chain[IR_BUFSTR];
667 while (ref) {
668 IRIns *irs = IR(ref), *ira = fleft, *irb = IR(irs->op1);
669 while (ira->o == irb->o && ira->op2 == irb->op2) {
670 lj_assertJ(ira->o == IR_BUFHDR || ira->o == IR_BUFPUT ||
671 ira->o == IR_CALLL || ira->o == IR_CARG,
672 "bad buffer constructor IR op %d", ira->o);
673 if (ira->o == IR_BUFHDR && ira->op2 == IRBUFHDR_RESET)
674 return ref; /* CSE succeeded. */
675 if (ira->o == IR_CALLL && ira->op2 == IRCALL_lj_buf_puttab)
676 break;
677 ira = IR(ira->op1);
678 irb = IR(irb->op1);
679 }
680 ref = irs->prev;
681 }
682 }
683 return EMITFOLD; /* No CSE possible. */
684}
685
686LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse)
687LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper)
688LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower)
689LJFOLD(CALLL CARG IRCALL_lj_strfmt_putquoted)
690LJFOLDF(bufput_kfold_op)
691{
692 if (irref_isk(fleft->op2)) {
693 const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
694 SBuf *sb = lj_buf_tmp_(J->L);
695 sb = ((SBuf * (LJ_FASTCALL *)(SBuf *, GCstr *))ci->func)(sb,
696 ir_kstr(IR(fleft->op2)));
697 fins->o = IR_BUFPUT;
698 fins->op1 = fleft->op1;
699 fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));
700 return RETRYFOLD;
701 }
702 return EMITFOLD; /* Always emit, CSE later. */
703}
704
705LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_rep)
706LJFOLDF(bufput_kfold_rep)
707{
708 if (irref_isk(fleft->op2)) {
709 IRIns *irc = IR(fleft->op1);
710 if (irref_isk(irc->op2)) {
711 SBuf *sb = lj_buf_tmp_(J->L);
712 sb = lj_buf_putstr_rep(sb, ir_kstr(IR(irc->op2)), IR(fleft->op2)->i);
713 fins->o = IR_BUFPUT;
714 fins->op1 = irc->op1;
715 fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));
716 return RETRYFOLD;
717 }
718 }
719 return EMITFOLD; /* Always emit, CSE later. */
720}
721
722LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfxint)
723LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_int)
724LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_uint)
725LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum)
726LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfstr)
727LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar)
728LJFOLDF(bufput_kfold_fmt)
729{
730 IRIns *irc = IR(fleft->op1);
731 lj_assertJ(irref_isk(irc->op2), "SFormat must be const");
732 if (irref_isk(fleft->op2)) {
733 SFormat sf = (SFormat)IR(irc->op2)->i;
734 IRIns *ira = IR(fleft->op2);
735 SBuf *sb = lj_buf_tmp_(J->L);
736 switch (fins->op2) {
737 case IRCALL_lj_strfmt_putfxint:
738 sb = lj_strfmt_putfxint(sb, sf, ir_k64(ira)->u64);
739 break;
740 case IRCALL_lj_strfmt_putfstr:
741 sb = lj_strfmt_putfstr(sb, sf, ir_kstr(ira));
742 break;
743 case IRCALL_lj_strfmt_putfchar:
744 sb = lj_strfmt_putfchar(sb, sf, ira->i);
745 break;
746 case IRCALL_lj_strfmt_putfnum_int:
747 case IRCALL_lj_strfmt_putfnum_uint:
748 case IRCALL_lj_strfmt_putfnum:
749 default: {
750 const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
751 sb = ((SBuf * (*)(SBuf *, SFormat, lua_Number))ci->func)(sb, sf,
752 ir_knum(ira)->n);
753 break;
754 }
755 }
756 fins->o = IR_BUFPUT;
757 fins->op1 = irc->op1;
758 fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));
759 return RETRYFOLD;
760 }
761 return EMITFOLD; /* Always emit, CSE later. */
762}
763
764/* -- Constant folding of pointer arithmetic ------------------------------ */
765
766LJFOLD(ADD KGC KINT)
767LJFOLD(ADD KGC KINT64)
768LJFOLDF(kfold_add_kgc)
769{
770 GCobj *o = ir_kgc(fleft);
771#if LJ_64
772 ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;
773#else
774 ptrdiff_t ofs = fright->i;
775#endif
776#if LJ_HASFFI
777 if (irt_iscdata(fleft->t)) {
778 CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid);
779 if (ctype_isnum(ct->info) || ctype_isenum(ct->info) ||
780 ctype_isptr(ct->info) || ctype_isfunc(ct->info) ||
781 ctype_iscomplex(ct->info) || ctype_isvector(ct->info))
782 return lj_ir_kkptr(J, (char *)o + ofs);
783 }
784#endif
785 return lj_ir_kptr(J, (char *)o + ofs);
786}
787
788LJFOLD(ADD KPTR KINT)
789LJFOLD(ADD KPTR KINT64)
790LJFOLD(ADD KKPTR KINT)
791LJFOLD(ADD KKPTR KINT64)
792LJFOLDF(kfold_add_kptr)
793{
794 void *p = ir_kptr(fleft);
795#if LJ_64
796 ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;
797#else
798 ptrdiff_t ofs = fright->i;
799#endif
800 return lj_ir_kptr_(J, fleft->o, (char *)p + ofs);
801}
802
803LJFOLD(ADD any KGC)
804LJFOLD(ADD any KPTR)
805LJFOLD(ADD any KKPTR)
806LJFOLDF(kfold_add_kright)
807{
808 if (fleft->o == IR_KINT || fleft->o == IR_KINT64) {
809 IRRef1 tmp = fins->op1; fins->op1 = fins->op2; fins->op2 = tmp;
810 return RETRYFOLD;
811 }
812 return NEXTFOLD;
813}
814
815/* -- Constant folding of conversions ------------------------------------- */
816
817LJFOLD(TOBIT KNUM KNUM)
818LJFOLDF(kfold_tobit)
819{
820 return INTFOLD(lj_num2bit(knumleft));
821}
822
823LJFOLD(CONV KINT IRCONV_NUM_INT)
824LJFOLDF(kfold_conv_kint_num)
825{
826 return lj_ir_knum(J, (lua_Number)fleft->i);
827}
828
829LJFOLD(CONV KINT IRCONV_NUM_U32)
830LJFOLDF(kfold_conv_kintu32_num)
831{
832 return lj_ir_knum(J, (lua_Number)(uint32_t)fleft->i);
833}
834
835LJFOLD(CONV KINT IRCONV_INT_I8)
836LJFOLD(CONV KINT IRCONV_INT_U8)
837LJFOLD(CONV KINT IRCONV_INT_I16)
838LJFOLD(CONV KINT IRCONV_INT_U16)
839LJFOLDF(kfold_conv_kint_ext)
840{
841 int32_t k = fleft->i;
842 if ((fins->op2 & IRCONV_SRCMASK) == IRT_I8) k = (int8_t)k;
843 else if ((fins->op2 & IRCONV_SRCMASK) == IRT_U8) k = (uint8_t)k;
844 else if ((fins->op2 & IRCONV_SRCMASK) == IRT_I16) k = (int16_t)k;
845 else k = (uint16_t)k;
846 return INTFOLD(k);
847}
848
849LJFOLD(CONV KINT IRCONV_I64_INT)
850LJFOLD(CONV KINT IRCONV_U64_INT)
851LJFOLD(CONV KINT IRCONV_I64_U32)
852LJFOLD(CONV KINT IRCONV_U64_U32)
853LJFOLDF(kfold_conv_kint_i64)
854{
855 if ((fins->op2 & IRCONV_SEXT))
856 return INT64FOLD((uint64_t)(int64_t)fleft->i);
857 else
858 return INT64FOLD((uint64_t)(int64_t)(uint32_t)fleft->i);
859}
860
861LJFOLD(CONV KINT64 IRCONV_NUM_I64)
862LJFOLDF(kfold_conv_kint64_num_i64)
863{
864 return lj_ir_knum(J, (lua_Number)(int64_t)ir_kint64(fleft)->u64);
865}
866
867LJFOLD(CONV KINT64 IRCONV_NUM_U64)
868LJFOLDF(kfold_conv_kint64_num_u64)
869{
870 return lj_ir_knum(J, (lua_Number)ir_kint64(fleft)->u64);
871}
872
873LJFOLD(CONV KINT64 IRCONV_INT_I64)
874LJFOLD(CONV KINT64 IRCONV_U32_I64)
875LJFOLDF(kfold_conv_kint64_int_i64)
876{
877 return INTFOLD((int32_t)ir_kint64(fleft)->u64);
878}
879
880LJFOLD(CONV KNUM IRCONV_INT_NUM)
881LJFOLDF(kfold_conv_knum_int_num)
882{
883 lua_Number n = knumleft;
884 if (irt_isguard(fins->t)) {
885 int64_t i64;
886 int32_t k;
887 if (lj_num2int_check(n, i64, k))
888 return INTFOLD(k);
889 /* We're about to create a guard which always fails, like CONV +1.5.
890 ** Some pathological loops cause this during LICM, e.g.:
891 ** local x,k,t = 0,1.5,{1,[1.5]=2}
892 ** for i=1,200 do x = x+ t[k]; k = k == 1 and 1.5 or 1 end
893 ** assert(x == 300)
894 */
895 return FAILFOLD;
896 } else {
897 return INTFOLD(lj_num2int(n));
898 }
899}
900
901LJFOLD(CONV KNUM IRCONV_I64_NUM)
902LJFOLDF(kfold_conv_knum_i64_num)
903{
904 return INT64FOLD((uint64_t)lj_num2i64(knumleft));
905}
906
907LJFOLD(CONV KNUM IRCONV_U64_NUM)
908LJFOLDF(kfold_conv_knum_u64_num)
909{
910 return INT64FOLD(lj_num2u64(knumleft));
911}
912
913LJFOLD(TOSTR KNUM any)
914LJFOLDF(kfold_tostr_knum)
915{
916 return lj_ir_kstr(J, lj_strfmt_num(J->L, ir_knum(fleft)));
917}
918
919LJFOLD(TOSTR KINT any)
920LJFOLDF(kfold_tostr_kint)
921{
922 return lj_ir_kstr(J, fins->op2 == IRTOSTR_INT ?
923 lj_strfmt_int(J->L, fleft->i) :
924 lj_strfmt_char(J->L, fleft->i));
925}
926
927LJFOLD(STRTO KGC)
928LJFOLDF(kfold_strto)
929{
930 TValue n;
931 if (lj_strscan_num(ir_kstr(fleft), &n))
932 return lj_ir_knum(J, numV(&n));
933 return FAILFOLD;
934}
935
936/* -- Constant folding of equality checks --------------------------------- */
937
938/* Don't constant-fold away FLOAD checks against KNULL. */
939LJFOLD(EQ FLOAD KNULL)
940LJFOLD(NE FLOAD KNULL)
941LJFOLDX(lj_opt_cse)
942
943/* But fold all other KNULL compares, since only KNULL is equal to KNULL. */
944LJFOLD(EQ any KNULL)
945LJFOLD(NE any KNULL)
946LJFOLD(EQ KNULL any)
947LJFOLD(NE KNULL any)
948LJFOLD(EQ KINT KINT) /* Constants are unique, so same refs <==> same value. */
949LJFOLD(NE KINT KINT)
950LJFOLD(EQ KINT64 KINT64)
951LJFOLD(NE KINT64 KINT64)
952LJFOLD(EQ KGC KGC)
953LJFOLD(NE KGC KGC)
954LJFOLDF(kfold_kref)
955{
956 return CONDFOLD((fins->op1 == fins->op2) ^ (fins->o == IR_NE));
957}
958
959/* -- Algebraic shortcuts ------------------------------------------------- */
960
961LJFOLD(FPMATH FPMATH IRFPM_FLOOR)
962LJFOLD(FPMATH FPMATH IRFPM_CEIL)
963LJFOLD(FPMATH FPMATH IRFPM_TRUNC)
964LJFOLDF(shortcut_round)
965{
966 IRFPMathOp op = (IRFPMathOp)fleft->op2;
967 if (op == IRFPM_FLOOR || op == IRFPM_CEIL || op == IRFPM_TRUNC)
968 return LEFTFOLD; /* round(round_left(x)) = round_left(x) */
969 return NEXTFOLD;
970}
971
972LJFOLD(ABS ABS FLOAD)
973LJFOLDF(shortcut_left)
974{
975 return LEFTFOLD; /* f(g(x)) ==> g(x) */
976}
977
978LJFOLD(ABS NEG FLOAD)
979LJFOLDF(shortcut_dropleft)
980{
981 PHIBARRIER(fleft);
982 fins->op1 = fleft->op1; /* abs(neg(x)) ==> abs(x) */
983 return RETRYFOLD;
984}
985
986/* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */
987LJFOLD(NEG NEG any)
988LJFOLD(BNOT BNOT)
989LJFOLD(BSWAP BSWAP)
990LJFOLDF(shortcut_leftleft)
991{
992 PHIBARRIER(fleft); /* See above. Fold would be ok, but not beneficial. */
993 return fleft->op1; /* f(g(x)) ==> x */
994}
995
996/* -- FP algebraic simplifications ---------------------------------------- */
997
998/* FP arithmetic is tricky -- there's not much to simplify.
999** Please note the following common pitfalls before sending "improvements":
1000** x+0 ==> x is INVALID for x=-0
1001** 0-x ==> -x is INVALID for x=+0
1002** x*0 ==> 0 is INVALID for x=-0, x=+-Inf or x=NaN
1003*/
1004
1005LJFOLD(ADD NEG any)
1006LJFOLDF(simplify_numadd_negx)
1007{
1008 PHIBARRIER(fleft);
1009 fins->o = IR_SUB; /* (-a) + b ==> b - a */
1010 fins->op1 = fins->op2;
1011 fins->op2 = fleft->op1;
1012 return RETRYFOLD;
1013}
1014
1015LJFOLD(ADD any NEG)
1016LJFOLDF(simplify_numadd_xneg)
1017{
1018 PHIBARRIER(fright);
1019 fins->o = IR_SUB; /* a + (-b) ==> a - b */
1020 fins->op2 = fright->op1;
1021 return RETRYFOLD;
1022}
1023
1024LJFOLD(SUB any KNUM)
1025LJFOLDF(simplify_numsub_k)
1026{
1027 if (ir_knum(fright)->u64 == 0) /* x - (+0) ==> x */
1028 return LEFTFOLD;
1029 return NEXTFOLD;
1030}
1031
1032LJFOLD(SUB NEG KNUM)
1033LJFOLDF(simplify_numsub_negk)
1034{
1035 PHIBARRIER(fleft);
1036 fins->op2 = fleft->op1; /* (-x) - k ==> (-k) - x */
1037 fins->op1 = (IRRef1)lj_ir_knum(J, -knumright);
1038 return RETRYFOLD;
1039}
1040
1041LJFOLD(SUB any NEG)
1042LJFOLDF(simplify_numsub_xneg)
1043{
1044 PHIBARRIER(fright);
1045 fins->o = IR_ADD; /* a - (-b) ==> a + b */
1046 fins->op2 = fright->op1;
1047 return RETRYFOLD;
1048}
1049
1050LJFOLD(MUL any KNUM)
1051LJFOLD(DIV any KNUM)
1052LJFOLDF(simplify_nummuldiv_k)
1053{
1054 lua_Number n = knumright;
1055 if (n == 1.0) { /* x o 1 ==> x */
1056 return LEFTFOLD;
1057 } else if (n == -1.0) { /* x o -1 ==> -x */
1058 IRRef op1 = fins->op1;
1059 fins->op2 = (IRRef1)lj_ir_ksimd(J, LJ_KSIMD_NEG); /* Modifies fins. */
1060 fins->op1 = op1;
1061 fins->o = IR_NEG;
1062 return RETRYFOLD;
1063 } else if (fins->o == IR_MUL && n == 2.0) { /* x * 2 ==> x + x */
1064 fins->o = IR_ADD;
1065 fins->op2 = fins->op1;
1066 return RETRYFOLD;
1067 } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */
1068 uint64_t u = ir_knum(fright)->u64;
1069 uint32_t ex = ((uint32_t)(u >> 52) & 0x7ff);
1070 if ((u & U64x(000fffff,ffffffff)) == 0 && ex - 1 < 0x7fd) {
1071 u = (u & ((uint64_t)1 << 63)) | ((uint64_t)(0x7fe - ex) << 52);
1072 fins->o = IR_MUL; /* Multiply by exact reciprocal. */
1073 fins->op2 = lj_ir_knum_u64(J, u);
1074 return RETRYFOLD;
1075 }
1076 }
1077 return NEXTFOLD;
1078}
1079
1080LJFOLD(MUL NEG KNUM)
1081LJFOLD(DIV NEG KNUM)
1082LJFOLDF(simplify_nummuldiv_negk)
1083{
1084 PHIBARRIER(fleft);
1085 fins->op1 = fleft->op1; /* (-a) o k ==> a o (-k) */
1086 fins->op2 = (IRRef1)lj_ir_knum(J, -knumright);
1087 return RETRYFOLD;
1088}
1089
1090LJFOLD(MUL NEG NEG)
1091LJFOLD(DIV NEG NEG)
1092LJFOLDF(simplify_nummuldiv_negneg)
1093{
1094 PHIBARRIER(fleft);
1095 PHIBARRIER(fright);
1096 fins->op1 = fleft->op1; /* (-a) o (-b) ==> a o b */
1097 fins->op2 = fright->op1;
1098 return RETRYFOLD;
1099}
1100
1101LJFOLD(POW any KNUM)
1102LJFOLDF(simplify_numpow_k)
1103{
1104 if (knumright == 0.0) /* x ^ 0 ==> 1 */
1105 return lj_ir_knum_one(J); /* Result must be a number, not an int. */
1106 else if (knumright == 1.0) /* x ^ 1 ==> x */
1107 return LEFTFOLD;
1108 else if (knumright == 2.0) /* x ^ 2 ==> x * x */
1109 return emitir(IRTN(IR_MUL), fins->op1, fins->op1);
1110 else
1111 return NEXTFOLD;
1112}
1113
1114/* -- Simplify conversions ------------------------------------------------ */
1115
1116LJFOLD(CONV CONV IRCONV_NUM_INT) /* _NUM */
1117LJFOLDF(shortcut_conv_num_int)
1118{
1119 PHIBARRIER(fleft);
1120 /* Only safe with a guarded conversion to int. */
1121 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_NUM && irt_isguard(fleft->t))
1122 return fleft->op1; /* f(g(x)) ==> x */
1123 return NEXTFOLD;
1124}
1125
1126LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */
1127LJFOLDF(simplify_conv_int_num)
1128{
1129 /* Fold even across PHI to avoid expensive num->int conversions in loop. */
1130 if ((fleft->op2 & IRCONV_SRCMASK) ==
1131 ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH))
1132 return fleft->op1;
1133 return NEXTFOLD;
1134}
1135
1136LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32 */
1137LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32 */
1138LJFOLDF(simplify_conv_i64_num)
1139{
1140 PHIBARRIER(fleft);
1141 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {
1142 /* Reduce to a sign-extension. */
1143 fins->op1 = fleft->op1;
1144 fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT);
1145 return RETRYFOLD;
1146 } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {
1147#if LJ_TARGET_X64
1148 return fleft->op1;
1149#else
1150 /* Reduce to a zero-extension. */
1151 fins->op1 = fleft->op1;
1152 fins->op2 = (IRT_I64<<5)|IRT_U32;
1153 return RETRYFOLD;
1154#endif
1155 }
1156 return NEXTFOLD;
1157}
1158
1159LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */
1160LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */
1161LJFOLD(CONV CONV IRCONV_INT_U32) /* _INT or _U32 */
1162LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */
1163LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */
1164LJFOLD(CONV CONV IRCONV_U32_INT) /* _INT or _U32 */
1165LJFOLDF(simplify_conv_int_i64)
1166{
1167 int src;
1168 PHIBARRIER(fleft);
1169 src = (fleft->op2 & IRCONV_SRCMASK);
1170 if (src == IRT_INT || src == IRT_U32) {
1171 if (src == ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) {
1172 return fleft->op1;
1173 } else {
1174 fins->op2 = ((fins->op2 & IRCONV_DSTMASK) | src);
1175 fins->op1 = fleft->op1;
1176 return RETRYFOLD;
1177 }
1178 }
1179 return NEXTFOLD;
1180}
1181
1182LJFOLD(CONV CONV IRCONV_FLOAT_NUM) /* _FLOAT */
1183LJFOLDF(simplify_conv_flt_num)
1184{
1185 PHIBARRIER(fleft);
1186 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_FLOAT)
1187 return fleft->op1;
1188 return NEXTFOLD;
1189}
1190
1191/* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */
1192LJFOLD(TOBIT CONV KNUM)
1193LJFOLDF(simplify_tobit_conv)
1194{
1195 /* Fold even across PHI to avoid expensive num->int conversions in loop. */
1196 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {
1197 lj_assertJ(irt_isnum(fleft->t), "expected TOBIT number arg");
1198 return fleft->op1;
1199 } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {
1200 lj_assertJ(irt_isnum(fleft->t), "expected TOBIT number arg");
1201 fins->o = IR_CONV;
1202 fins->op1 = fleft->op1;
1203 fins->op2 = (IRT_INT<<5)|IRT_U32;
1204 return RETRYFOLD;
1205 }
1206 return NEXTFOLD;
1207}
1208
1209/* Shortcut floor/ceil/trunc + IRT_NUM <- integer conversion. */
1210LJFOLD(FPMATH CONV IRFPM_FLOOR)
1211LJFOLD(FPMATH CONV IRFPM_CEIL)
1212LJFOLD(FPMATH CONV IRFPM_TRUNC)
1213LJFOLDF(simplify_floor_conv)
1214{
1215 if ((uint32_t)(fleft->op2 & IRCONV_SRCMASK) - (uint32_t)IRT_I8 <= (uint32_t)(IRT_U64 - IRT_U8))
1216 return LEFTFOLD;
1217 return NEXTFOLD;
1218}
1219
1220/* Strength reduction of widening. */
1221LJFOLD(CONV any IRCONV_I64_INT)
1222LJFOLD(CONV any IRCONV_U64_INT)
1223LJFOLDF(simplify_conv_sext)
1224{
1225 IRRef ref = fins->op1;
1226 int64_t ofs = 0;
1227 if (!(fins->op2 & IRCONV_SEXT))
1228 return NEXTFOLD;
1229 PHIBARRIER(fleft);
1230 if (fleft->o == IR_XLOAD && (irt_isu8(fleft->t) || irt_isu16(fleft->t)))
1231 goto ok_reduce;
1232 if (fleft->o == IR_ADD && irref_isk(fleft->op2)) {
1233 ofs = (int64_t)IR(fleft->op2)->i;
1234 ref = fleft->op1;
1235 }
1236 /* Use scalar evolution analysis results to strength-reduce sign-extension. */
1237 if (ref == J->scev.idx) {
1238 IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop;
1239 lj_assertJ(irt_isint(J->scev.t), "only int SCEV supported");
1240 if (lo && IR(lo)->o == IR_KINT && IR(lo)->i + ofs >= 0) {
1241 ok_reduce:
1242#if LJ_TARGET_X64
1243 /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */
1244 return LEFTFOLD;
1245#else
1246 /* Reduce to a (cheaper) zero-extension. */
1247 fins->op2 &= ~IRCONV_SEXT;
1248 return RETRYFOLD;
1249#endif
1250 }
1251 }
1252 return NEXTFOLD;
1253}
1254
1255/* Strength reduction of narrowing. */
1256LJFOLD(CONV ADD IRCONV_INT_I64)
1257LJFOLD(CONV SUB IRCONV_INT_I64)
1258LJFOLD(CONV MUL IRCONV_INT_I64)
1259LJFOLD(CONV ADD IRCONV_INT_U64)
1260LJFOLD(CONV SUB IRCONV_INT_U64)
1261LJFOLD(CONV MUL IRCONV_INT_U64)
1262LJFOLD(CONV ADD IRCONV_U32_I64)
1263LJFOLD(CONV SUB IRCONV_U32_I64)
1264LJFOLD(CONV MUL IRCONV_U32_I64)
1265LJFOLD(CONV ADD IRCONV_U32_U64)
1266LJFOLD(CONV SUB IRCONV_U32_U64)
1267LJFOLD(CONV MUL IRCONV_U32_U64)
1268LJFOLDF(simplify_conv_narrow)
1269{
1270#if LJ_64
1271 UNUSED(J);
1272 return NEXTFOLD;
1273#else
1274 IROp op = (IROp)fleft->o;
1275 IRType t = irt_type(fins->t);
1276 IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2;
1277 PHIBARRIER(fleft);
1278 op1 = emitir(IRT(IR_CONV, t), op1, mode);
1279 op2 = emitir(IRT(IR_CONV, t), op2, mode);
1280 fins->ot = IRT(op, t);
1281 fins->op1 = op1;
1282 fins->op2 = op2;
1283 return RETRYFOLD;
1284#endif
1285}
1286
1287/* Special CSE rule for CONV. */
1288LJFOLD(CONV any any)
1289LJFOLDF(cse_conv)
1290{
1291 if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {
1292 IRRef op1 = fins->op1, op2 = (fins->op2 & IRCONV_MODEMASK);
1293 uint8_t guard = irt_isguard(fins->t);
1294 IRRef ref = J->chain[IR_CONV];
1295 while (ref > op1) {
1296 IRIns *ir = IR(ref);
1297 /* Commoning with stronger checks is ok. */
1298 if (ir->op1 == op1 && (ir->op2 & IRCONV_MODEMASK) == op2 &&
1299 irt_isguard(ir->t) >= guard)
1300 return ref;
1301 ref = ir->prev;
1302 }
1303 }
1304 return EMITFOLD; /* No fallthrough to regular CSE. */
1305}
1306
1307/* FP conversion narrowing. */
1308LJFOLD(TOBIT ADD KNUM)
1309LJFOLD(TOBIT SUB KNUM)
1310LJFOLD(CONV ADD IRCONV_INT_NUM)
1311LJFOLD(CONV SUB IRCONV_INT_NUM)
1312LJFOLD(CONV ADD IRCONV_I64_NUM)
1313LJFOLD(CONV SUB IRCONV_I64_NUM)
1314LJFOLDF(narrow_convert)
1315{
1316 PHIBARRIER(fleft);
1317 /* Narrowing ignores PHIs and repeating it inside the loop is not useful. */
1318 if (J->chain[IR_LOOP])
1319 return NEXTFOLD;
1320 lj_assertJ(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT,
1321 "unexpected CONV TOBIT");
1322 return lj_opt_narrow_convert(J);
1323}
1324
1325LJFOLD(XSTORE any CONV)
1326LJFOLDF(xstore_conv)
1327{
1328#if LJ_64
1329 PHIBARRIER(fright);
1330 if (!irt_is64(fins->t) &&
1331 irt_type(fins->t) == (IRType)((fright->op2&IRCONV_DSTMASK)>>IRCONV_DSH) &&
1332 ((fright->op2&IRCONV_SRCMASK) == IRT_I64 ||
1333 (fright->op2&IRCONV_SRCMASK) == IRT_U64)) {
1334 fins->op2 = fright->op1;
1335 return RETRYFOLD;
1336 }
1337#else
1338 UNUSED(J);
1339#endif
1340 return NEXTFOLD;
1341}
1342
1343/* -- Integer algebraic simplifications ----------------------------------- */
1344
1345LJFOLD(ADD any KINT)
1346LJFOLD(ADDOV any KINT)
1347LJFOLD(SUBOV any KINT)
1348LJFOLDF(simplify_intadd_k)
1349{
1350 if (fright->i == 0) /* i o 0 ==> i */
1351 return LEFTFOLD;
1352 return NEXTFOLD;
1353}
1354
1355LJFOLD(MULOV any KINT)
1356LJFOLDF(simplify_intmul_k)
1357{
1358 if (fright->i == 0) /* i * 0 ==> 0 */
1359 return RIGHTFOLD;
1360 if (fright->i == 1) /* i * 1 ==> i */
1361 return LEFTFOLD;
1362 if (fright->i == 2) { /* i * 2 ==> i + i */
1363 fins->o = IR_ADDOV;
1364 fins->op2 = fins->op1;
1365 return RETRYFOLD;
1366 }
1367 return NEXTFOLD;
1368}
1369
1370LJFOLD(SUB any KINT)
1371LJFOLDF(simplify_intsub_k)
1372{
1373 if (fright->i == 0) /* i - 0 ==> i */
1374 return LEFTFOLD;
1375 fins->o = IR_ADD; /* i - k ==> i + (-k) */
1376 fins->op2 = (IRRef1)lj_ir_kint(J, (int32_t)(~(uint32_t)fright->i+1u)); /* Overflow for -2^31 ok. */
1377 return RETRYFOLD;
1378}
1379
1380LJFOLD(SUB KINT any)
1381LJFOLD(SUB KINT64 any)
1382LJFOLDF(simplify_intsub_kleft)
1383{
1384 if (fleft->o == IR_KINT ? (fleft->i == 0) : (ir_kint64(fleft)->u64 == 0)) {
1385 fins->o = IR_NEG; /* 0 - i ==> -i */
1386 fins->op1 = fins->op2;
1387 return RETRYFOLD;
1388 }
1389 return NEXTFOLD;
1390}
1391
1392LJFOLD(ADD any KINT64)
1393LJFOLDF(simplify_intadd_k64)
1394{
1395 if (ir_kint64(fright)->u64 == 0) /* i + 0 ==> i */
1396 return LEFTFOLD;
1397 return NEXTFOLD;
1398}
1399
1400LJFOLD(SUB any KINT64)
1401LJFOLDF(simplify_intsub_k64)
1402{
1403 uint64_t k = ir_kint64(fright)->u64;
1404 if (k == 0) /* i - 0 ==> i */
1405 return LEFTFOLD;
1406 fins->o = IR_ADD; /* i - k ==> i + (-k) */
1407 fins->op2 = (IRRef1)lj_ir_kint64(J, ~k+1u);
1408 return RETRYFOLD;
1409}
1410
1411static TRef simplify_intmul_k(jit_State *J, int32_t k)
1412{
1413 /* Note: many more simplifications are possible, e.g. 2^k1 +- 2^k2.
1414 ** But this is mainly intended for simple address arithmetic.
1415 ** Also it's easier for the backend to optimize the original multiplies.
1416 */
1417 if (k == 0) { /* i * 0 ==> 0 */
1418 return RIGHTFOLD;
1419 } else if (k == 1) { /* i * 1 ==> i */
1420 return LEFTFOLD;
1421 } else if ((k & (k-1)) == 0) { /* i * 2^k ==> i << k */
1422 fins->o = IR_BSHL;
1423 fins->op2 = lj_ir_kint(J, lj_fls((uint32_t)k));
1424 return RETRYFOLD;
1425 }
1426 return NEXTFOLD;
1427}
1428
1429LJFOLD(MUL any KINT)
1430LJFOLDF(simplify_intmul_k32)
1431{
1432 if (fright->i >= 0)
1433 return simplify_intmul_k(J, fright->i);
1434 return NEXTFOLD;
1435}
1436
1437LJFOLD(MUL any KINT64)
1438LJFOLDF(simplify_intmul_k64)
1439{
1440#if LJ_HASFFI
1441 if (ir_kint64(fright)->u64 < 0x80000000u)
1442 return simplify_intmul_k(J, (int32_t)ir_kint64(fright)->u64);
1443 return NEXTFOLD;
1444#else
1445 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
1446#endif
1447}
1448
1449LJFOLD(MOD any KINT)
1450LJFOLDF(simplify_intmod_k)
1451{
1452 int32_t k = fright->i;
1453 lj_assertJ(k != 0, "integer mod 0");
1454 if (k > 0 && (k & (k-1)) == 0) { /* i % (2^k) ==> i & (2^k-1) */
1455 fins->o = IR_BAND;
1456 fins->op2 = lj_ir_kint(J, k-1);
1457 return RETRYFOLD;
1458 }
1459 return NEXTFOLD;
1460}
1461
1462LJFOLD(MOD KINT any)
1463LJFOLDF(simplify_intmod_kleft)
1464{
1465 if (fleft->i == 0)
1466 return INTFOLD(0);
1467 return NEXTFOLD;
1468}
1469
1470LJFOLD(SUB any any)
1471LJFOLD(SUBOV any any)
1472LJFOLDF(simplify_intsub)
1473{
1474 if (fins->op1 == fins->op2 && !irt_isnum(fins->t)) /* i - i ==> 0 */
1475 return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);
1476 return NEXTFOLD;
1477}
1478
1479LJFOLD(SUB ADD any)
1480LJFOLDF(simplify_intsubadd_leftcancel)
1481{
1482 if (!irt_isnum(fins->t)) {
1483 PHIBARRIER(fleft);
1484 if (fins->op2 == fleft->op1) /* (i + j) - i ==> j */
1485 return fleft->op2;
1486 if (fins->op2 == fleft->op2) /* (i + j) - j ==> i */
1487 return fleft->op1;
1488 }
1489 return NEXTFOLD;
1490}
1491
1492LJFOLD(SUB SUB any)
1493LJFOLDF(simplify_intsubsub_leftcancel)
1494{
1495 if (!irt_isnum(fins->t)) {
1496 PHIBARRIER(fleft);
1497 if (fins->op2 == fleft->op1) { /* (i - j) - i ==> 0 - j */
1498 fins->op1 = (IRRef1)lj_ir_kint(J, 0);
1499 fins->op2 = fleft->op2;
1500 return RETRYFOLD;
1501 }
1502 }
1503 return NEXTFOLD;
1504}
1505
1506LJFOLD(SUB any SUB)
1507LJFOLDF(simplify_intsubsub_rightcancel)
1508{
1509 if (!irt_isnum(fins->t)) {
1510 PHIBARRIER(fright);
1511 if (fins->op1 == fright->op1) /* i - (i - j) ==> j */
1512 return fright->op2;
1513 }
1514 return NEXTFOLD;
1515}
1516
1517LJFOLD(SUB any ADD)
1518LJFOLDF(simplify_intsubadd_rightcancel)
1519{
1520 if (!irt_isnum(fins->t)) {
1521 PHIBARRIER(fright);
1522 if (fins->op1 == fright->op1) { /* i - (i + j) ==> 0 - j */
1523 fins->op2 = fright->op2;
1524 fins->op1 = (IRRef1)lj_ir_kint(J, 0);
1525 return RETRYFOLD;
1526 }
1527 if (fins->op1 == fright->op2) { /* i - (j + i) ==> 0 - j */
1528 fins->op2 = fright->op1;
1529 fins->op1 = (IRRef1)lj_ir_kint(J, 0);
1530 return RETRYFOLD;
1531 }
1532 }
1533 return NEXTFOLD;
1534}
1535
1536LJFOLD(SUB ADD ADD)
1537LJFOLDF(simplify_intsubaddadd_cancel)
1538{
1539 if (!irt_isnum(fins->t)) {
1540 PHIBARRIER(fleft);
1541 PHIBARRIER(fright);
1542 if (fleft->op1 == fright->op1) { /* (i + j1) - (i + j2) ==> j1 - j2 */
1543 fins->op1 = fleft->op2;
1544 fins->op2 = fright->op2;
1545 return RETRYFOLD;
1546 }
1547 if (fleft->op1 == fright->op2) { /* (i + j1) - (j2 + i) ==> j1 - j2 */
1548 fins->op1 = fleft->op2;
1549 fins->op2 = fright->op1;
1550 return RETRYFOLD;
1551 }
1552 if (fleft->op2 == fright->op1) { /* (j1 + i) - (i + j2) ==> j1 - j2 */
1553 fins->op1 = fleft->op1;
1554 fins->op2 = fright->op2;
1555 return RETRYFOLD;
1556 }
1557 if (fleft->op2 == fright->op2) { /* (j1 + i) - (j2 + i) ==> j1 - j2 */
1558 fins->op1 = fleft->op1;
1559 fins->op2 = fright->op1;
1560 return RETRYFOLD;
1561 }
1562 }
1563 return NEXTFOLD;
1564}
1565
1566LJFOLD(BAND any KINT)
1567LJFOLD(BAND any KINT64)
1568LJFOLDF(simplify_band_k)
1569{
1570 int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :
1571 (int64_t)ir_k64(fright)->u64;
1572 if (k == 0) /* i & 0 ==> 0 */
1573 return RIGHTFOLD;
1574 if (k == -1) /* i & -1 ==> i */
1575 return LEFTFOLD;
1576 return NEXTFOLD;
1577}
1578
1579LJFOLD(BOR any KINT)
1580LJFOLD(BOR any KINT64)
1581LJFOLDF(simplify_bor_k)
1582{
1583 int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :
1584 (int64_t)ir_k64(fright)->u64;
1585 if (k == 0) /* i | 0 ==> i */
1586 return LEFTFOLD;
1587 if (k == -1) /* i | -1 ==> -1 */
1588 return RIGHTFOLD;
1589 return NEXTFOLD;
1590}
1591
1592LJFOLD(BXOR any KINT)
1593LJFOLD(BXOR any KINT64)
1594LJFOLDF(simplify_bxor_k)
1595{
1596 int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :
1597 (int64_t)ir_k64(fright)->u64;
1598 if (k == 0) /* i xor 0 ==> i */
1599 return LEFTFOLD;
1600 if (k == -1) { /* i xor -1 ==> ~i */
1601 fins->o = IR_BNOT;
1602 fins->op2 = 0;
1603 return RETRYFOLD;
1604 }
1605 return NEXTFOLD;
1606}
1607
1608LJFOLD(BSHL any KINT)
1609LJFOLD(BSHR any KINT)
1610LJFOLD(BSAR any KINT)
1611LJFOLD(BROL any KINT)
1612LJFOLD(BROR any KINT)
1613LJFOLDF(simplify_shift_ik)
1614{
1615 int32_t mask = irt_is64(fins->t) ? 63 : 31;
1616 int32_t k = (fright->i & mask);
1617 if (k == 0) /* i o 0 ==> i */
1618 return LEFTFOLD;
1619 if (k == 1 && fins->o == IR_BSHL) { /* i << 1 ==> i + i */
1620 fins->o = IR_ADD;
1621 fins->op2 = fins->op1;
1622 return RETRYFOLD;
1623 }
1624 if (k != fright->i) { /* i o k ==> i o (k & mask) */
1625 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1626 return RETRYFOLD;
1627 }
1628#ifndef LJ_TARGET_UNIFYROT
1629 if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */
1630 fins->o = IR_BROL;
1631 fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask);
1632 return RETRYFOLD;
1633 }
1634#endif
1635 return NEXTFOLD;
1636}
1637
1638LJFOLD(BSHL any BAND)
1639LJFOLD(BSHR any BAND)
1640LJFOLD(BSAR any BAND)
1641LJFOLD(BROL any BAND)
1642LJFOLD(BROR any BAND)
1643LJFOLDF(simplify_shift_andk)
1644{
1645 IRIns *irk = IR(fright->op2);
1646 PHIBARRIER(fright);
1647 if ((fins->o < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&
1648 irk->o == IR_KINT) { /* i o (j & mask) ==> i o j */
1649 int32_t mask = irt_is64(fins->t) ? 63 : 31;
1650 int32_t k = irk->i & mask;
1651 if (k == mask) {
1652 fins->op2 = fright->op1;
1653 return RETRYFOLD;
1654 }
1655 }
1656 return NEXTFOLD;
1657}
1658
1659LJFOLD(BSHL KINT any)
1660LJFOLD(BSHR KINT any)
1661LJFOLD(BSHL KINT64 any)
1662LJFOLD(BSHR KINT64 any)
1663LJFOLDF(simplify_shift1_ki)
1664{
1665 int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :
1666 (int64_t)ir_k64(fleft)->u64;
1667 if (k == 0) /* 0 o i ==> 0 */
1668 return LEFTFOLD;
1669 return NEXTFOLD;
1670}
1671
1672LJFOLD(BSAR KINT any)
1673LJFOLD(BROL KINT any)
1674LJFOLD(BROR KINT any)
1675LJFOLD(BSAR KINT64 any)
1676LJFOLD(BROL KINT64 any)
1677LJFOLD(BROR KINT64 any)
1678LJFOLDF(simplify_shift2_ki)
1679{
1680 int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :
1681 (int64_t)ir_k64(fleft)->u64;
1682 if (k == 0 || k == -1) /* 0 o i ==> 0; -1 o i ==> -1 */
1683 return LEFTFOLD;
1684 return NEXTFOLD;
1685}
1686
1687LJFOLD(BSHL BAND KINT)
1688LJFOLD(BSHR BAND KINT)
1689LJFOLD(BROL BAND KINT)
1690LJFOLD(BROR BAND KINT)
1691LJFOLDF(simplify_shiftk_andk)
1692{
1693 IRIns *irk = IR(fleft->op2);
1694 PHIBARRIER(fleft);
1695 if (irk->o == IR_KINT) { /* (i & k1) o k2 ==> (i o k2) & (k1 o k2) */
1696 int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);
1697 fins->op1 = fleft->op1;
1698 fins->op1 = (IRRef1)lj_opt_fold(J);
1699 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1700 fins->ot = IRTI(IR_BAND);
1701 return RETRYFOLD;
1702 } else if (irk->o == IR_KINT64) {
1703 uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, fright->i,
1704 (IROp)fins->o);
1705 IROpT ot = fleft->ot;
1706 fins->op1 = fleft->op1;
1707 fins->op1 = (IRRef1)lj_opt_fold(J);
1708 fins->op2 = (IRRef1)lj_ir_kint64(J, k);
1709 fins->ot = ot;
1710 return RETRYFOLD;
1711 }
1712 return NEXTFOLD;
1713}
1714
1715LJFOLD(BAND BSHL KINT)
1716LJFOLD(BAND BSHR KINT)
1717LJFOLDF(simplify_andk_shiftk)
1718{
1719 IRIns *irk = IR(fleft->op2);
1720 if (irk->o == IR_KINT &&
1721 kfold_intop(-1, irk->i, (IROp)fleft->o) == fright->i)
1722 return LEFTFOLD; /* (i o k1) & k2 ==> i, if (-1 o k1) == k2 */
1723 return NEXTFOLD;
1724}
1725
1726LJFOLD(BAND BOR KINT)
1727LJFOLD(BOR BAND KINT)
1728LJFOLDF(simplify_andor_k)
1729{
1730 IRIns *irk = IR(fleft->op2);
1731 PHIBARRIER(fleft);
1732 if (irk->o == IR_KINT) {
1733 int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);
1734 /* (i | k1) & k2 ==> i & k2, if (k1 & k2) == 0. */
1735 /* (i & k1) | k2 ==> i | k2, if (k1 | k2) == -1. */
1736 if (k == (fins->o == IR_BAND ? 0 : -1)) {
1737 fins->op1 = fleft->op1;
1738 return RETRYFOLD;
1739 }
1740 }
1741 return NEXTFOLD;
1742}
1743
1744LJFOLD(BAND BOR KINT64)
1745LJFOLD(BOR BAND KINT64)
1746LJFOLDF(simplify_andor_k64)
1747{
1748#if LJ_HASFFI
1749 IRIns *irk = IR(fleft->op2);
1750 PHIBARRIER(fleft);
1751 if (irk->o == IR_KINT64) {
1752 uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, ir_k64(fright)->u64,
1753 (IROp)fins->o);
1754 /* (i | k1) & k2 ==> i & k2, if (k1 & k2) == 0. */
1755 /* (i & k1) | k2 ==> i | k2, if (k1 | k2) == -1. */
1756 if (k == (fins->o == IR_BAND ? (uint64_t)0 : ~(uint64_t)0)) {
1757 fins->op1 = fleft->op1;
1758 return RETRYFOLD;
1759 }
1760 }
1761 return NEXTFOLD;
1762#else
1763 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
1764#endif
1765}
1766
1767/* -- Reassociation ------------------------------------------------------- */
1768
1769LJFOLD(ADD ADD KINT)
1770LJFOLD(MUL MUL KINT)
1771LJFOLD(BAND BAND KINT)
1772LJFOLD(BOR BOR KINT)
1773LJFOLD(BXOR BXOR KINT)
1774LJFOLDF(reassoc_intarith_k)
1775{
1776 IRIns *irk = IR(fleft->op2);
1777 if (irk->o == IR_KINT) {
1778 int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);
1779 if (k == irk->i) /* (i o k1) o k2 ==> i o k1, if (k1 o k2) == k1. */
1780 return LEFTFOLD;
1781 PHIBARRIER(fleft);
1782 fins->op1 = fleft->op1;
1783 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1784 return RETRYFOLD; /* (i o k1) o k2 ==> i o (k1 o k2) */
1785 }
1786 return NEXTFOLD;
1787}
1788
1789LJFOLD(ADD ADD KINT64)
1790LJFOLD(MUL MUL KINT64)
1791LJFOLD(BAND BAND KINT64)
1792LJFOLD(BOR BOR KINT64)
1793LJFOLD(BXOR BXOR KINT64)
1794LJFOLDF(reassoc_intarith_k64)
1795{
1796#if LJ_HASFFI
1797 IRIns *irk = IR(fleft->op2);
1798 if (irk->o == IR_KINT64) {
1799 uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, ir_k64(fright)->u64,
1800 (IROp)fins->o);
1801 PHIBARRIER(fleft);
1802 fins->op1 = fleft->op1;
1803 fins->op2 = (IRRef1)lj_ir_kint64(J, k);
1804 return RETRYFOLD; /* (i o k1) o k2 ==> i o (k1 o k2) */
1805 }
1806 return NEXTFOLD;
1807#else
1808 UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
1809#endif
1810}
1811
1812LJFOLD(BAND BAND any)
1813LJFOLD(BOR BOR any)
1814LJFOLDF(reassoc_dup)
1815{
1816 if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)
1817 return LEFTFOLD; /* (a o b) o a ==> a o b; (a o b) o b ==> a o b */
1818 return NEXTFOLD;
1819}
1820
1821LJFOLD(MIN MIN any)
1822LJFOLD(MAX MAX any)
1823LJFOLDF(reassoc_dup_minmax)
1824{
1825 if (fins->op2 == fleft->op2)
1826 return LEFTFOLD; /* (a o b) o b ==> a o b */
1827 return NEXTFOLD;
1828}
1829
1830LJFOLD(BXOR BXOR any)
1831LJFOLDF(reassoc_bxor)
1832{
1833 PHIBARRIER(fleft);
1834 if (fins->op2 == fleft->op1) /* (a xor b) xor a ==> b */
1835 return fleft->op2;
1836 if (fins->op2 == fleft->op2) /* (a xor b) xor b ==> a */
1837 return fleft->op1;
1838 return NEXTFOLD;
1839}
1840
1841LJFOLD(BSHL BSHL KINT)
1842LJFOLD(BSHR BSHR KINT)
1843LJFOLD(BSAR BSAR KINT)
1844LJFOLD(BROL BROL KINT)
1845LJFOLD(BROR BROR KINT)
1846LJFOLDF(reassoc_shift)
1847{
1848 IRIns *irk = IR(fleft->op2);
1849 PHIBARRIER(fleft); /* The (shift any KINT) rule covers k2 == 0 and more. */
1850 if (irk->o == IR_KINT) { /* (i o k1) o k2 ==> i o (k1 + k2) */
1851 int32_t mask = irt_is64(fins->t) ? 63 : 31;
1852 int32_t k = (irk->i & mask) + (fright->i & mask);
1853 if (k > mask) { /* Combined shift too wide? */
1854 if (fins->o == IR_BSHL || fins->o == IR_BSHR)
1855 return mask == 31 ? INTFOLD(0) : INT64FOLD(0);
1856 else if (fins->o == IR_BSAR)
1857 k = mask;
1858 else
1859 k &= mask;
1860 }
1861 fins->op1 = fleft->op1;
1862 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1863 return RETRYFOLD;
1864 }
1865 return NEXTFOLD;
1866}
1867
1868LJFOLD(MIN MIN KINT)
1869LJFOLD(MAX MAX KINT)
1870LJFOLDF(reassoc_minmax_k)
1871{
1872 IRIns *irk = IR(fleft->op2);
1873 if (irk->o == IR_KINT) {
1874 int32_t a = irk->i;
1875 int32_t y = kfold_intop(a, fright->i, fins->o);
1876 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
1877 return LEFTFOLD;
1878 PHIBARRIER(fleft);
1879 fins->op1 = fleft->op1;
1880 fins->op2 = (IRRef1)lj_ir_kint(J, y);
1881 return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
1882 }
1883 return NEXTFOLD;
1884}
1885
1886/* -- Array bounds check elimination -------------------------------------- */
1887
1888/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.
1889** ABC(asize, (i+k)+(-k)) ==> ABC(asize, i), but only if it already exists.
1890** Could be generalized to (i+k1)+k2 ==> i+(k1+k2), but needs better disambig.
1891*/
1892LJFOLD(ABC any ADD)
1893LJFOLDF(abc_fwd)
1894{
1895 if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {
1896 if (irref_isk(fright->op2)) {
1897 IRIns *add2 = IR(fright->op1);
1898 if (add2->o == IR_ADD && irref_isk(add2->op2) &&
1899 IR(fright->op2)->i == -IR(add2->op2)->i) {
1900 IRRef ref = J->chain[IR_ABC];
1901 IRRef lim = add2->op1;
1902 if (fins->op1 > lim) lim = fins->op1;
1903 while (ref > lim) {
1904 IRIns *ir = IR(ref);
1905 if (ir->op1 == fins->op1 && ir->op2 == add2->op1)
1906 return DROPFOLD;
1907 ref = ir->prev;
1908 }
1909 }
1910 }
1911 }
1912 return NEXTFOLD;
1913}
1914
1915/* Eliminate ABC for constants.
1916** ABC(asize, k1), ABC(asize k2) ==> ABC(asize, max(k1, k2))
1917** Drop second ABC if k2 is lower. Otherwise patch first ABC with k2.
1918*/
1919LJFOLD(ABC any KINT)
1920LJFOLDF(abc_k)
1921{
1922 PHIBARRIER(fleft);
1923 if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {
1924 IRRef ref = J->chain[IR_ABC];
1925 IRRef asize = fins->op1;
1926 while (ref > asize) {
1927 IRIns *ir = IR(ref);
1928 if (ir->op1 == asize && irref_isk(ir->op2)) {
1929 uint32_t k = (uint32_t)IR(ir->op2)->i;
1930 if ((uint32_t)fright->i > k)
1931 ir->op2 = fins->op2;
1932 return DROPFOLD;
1933 }
1934 ref = ir->prev;
1935 }
1936 return EMITFOLD; /* Already performed CSE. */
1937 }
1938 return NEXTFOLD;
1939}
1940
1941/* Eliminate invariant ABC inside loop. */
1942LJFOLD(ABC any any)
1943LJFOLDF(abc_invar)
1944{
1945 /* Invariant ABC marked as P32 or U32. Drop if op1 is invariant too. */
1946 if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] &&
1947 (irt_isu32(fins->t) ||
1948 (!irref_isk(fins->op1) && !irt_isphi(IR(fins->op1)->t))))
1949 return DROPFOLD;
1950 return NEXTFOLD;
1951}
1952
1953/* -- Commutativity ------------------------------------------------------- */
1954
1955/* The refs of commutative ops are canonicalized. Lower refs go to the right.
1956** Rationale behind this:
1957** - It (also) moves constants to the right.
1958** - It reduces the number of FOLD rules (e.g. (BOR any KINT) suffices).
1959** - It helps CSE to find more matches.
1960** - The assembler generates better code with constants at the right.
1961*/
1962
1963LJFOLD(ADD any any)
1964LJFOLD(MUL any any)
1965LJFOLD(ADDOV any any)
1966LJFOLD(MULOV any any)
1967LJFOLDF(comm_swap)
1968{
1969 if (fins->op1 < fins->op2) { /* Move lower ref to the right. */
1970 IRRef1 tmp = fins->op1;
1971 fins->op1 = fins->op2;
1972 fins->op2 = tmp;
1973 return RETRYFOLD;
1974 }
1975 return NEXTFOLD;
1976}
1977
1978LJFOLD(EQ any any)
1979LJFOLD(NE any any)
1980LJFOLDF(comm_equal)
1981{
1982 /* For non-numbers only: x == x ==> drop; x ~= x ==> fail */
1983 if (fins->op1 == fins->op2 &&
1984 (!irt_isnum(fins->t) ||
1985 (fleft->o == IR_CONV && /* Converted integers cannot be NaN. */
1986 (uint32_t)(fleft->op2 & IRCONV_SRCMASK) - (uint32_t)IRT_I8 <= (uint32_t)(IRT_U64 - IRT_U8))))
1987 return CONDFOLD(fins->o == IR_EQ);
1988 return fold_comm_swap(J);
1989}
1990
1991LJFOLD(LT any any)
1992LJFOLD(GE any any)
1993LJFOLD(LE any any)
1994LJFOLD(GT any any)
1995LJFOLD(ULT any any)
1996LJFOLD(UGE any any)
1997LJFOLD(ULE any any)
1998LJFOLD(UGT any any)
1999LJFOLDF(comm_comp)
2000{
2001 /* For non-numbers only: x <=> x ==> drop; x <> x ==> fail */
2002 if (fins->op1 == fins->op2 && !irt_isnum(fins->t))
2003 return CONDFOLD((fins->o ^ (fins->o >> 1)) & 1);
2004 if (fins->op1 < fins->op2) { /* Move lower ref to the right. */
2005 IRRef1 tmp = fins->op1;
2006 fins->op1 = fins->op2;
2007 fins->op2 = tmp;
2008 fins->o ^= 3; /* GT <-> LT, GE <-> LE, does not affect U */
2009 return RETRYFOLD;
2010 }
2011 return NEXTFOLD;
2012}
2013
2014LJFOLD(BAND any any)
2015LJFOLD(BOR any any)
2016LJFOLDF(comm_dup)
2017{
2018 if (fins->op1 == fins->op2) /* x o x ==> x */
2019 return LEFTFOLD;
2020 return fold_comm_swap(J);
2021}
2022
2023LJFOLD(MIN any any)
2024LJFOLD(MAX any any)
2025LJFOLDF(comm_dup_minmax)
2026{
2027 if (fins->op1 == fins->op2) /* x o x ==> x */
2028 return LEFTFOLD;
2029 return NEXTFOLD;
2030}
2031
2032LJFOLD(BXOR any any)
2033LJFOLDF(comm_bxor)
2034{
2035 if (fins->op1 == fins->op2) /* i xor i ==> 0 */
2036 return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);
2037 return fold_comm_swap(J);
2038}
2039
2040/* -- Simplification of compound expressions ------------------------------ */
2041
2042static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p)
2043{
2044 int32_t k;
2045 switch (irt_type(ir->t)) {
2046 case IRT_NUM: return lj_ir_knum_u64(J, *(uint64_t *)p);
2047 case IRT_I8: k = (int32_t)*(int8_t *)p; break;
2048 case IRT_U8: k = (int32_t)*(uint8_t *)p; break;
2049 case IRT_I16: k = (int32_t)(int16_t)lj_getu16(p); break;
2050 case IRT_U16: k = (int32_t)(uint16_t)lj_getu16(p); break;
2051 case IRT_INT: case IRT_U32: k = (int32_t)lj_getu32(p); break;
2052 case IRT_I64: case IRT_U64: return lj_ir_kint64(J, *(uint64_t *)p);
2053 default: return 0;
2054 }
2055 return lj_ir_kint(J, k);
2056}
2057
2058/* Turn: string.sub(str, a, b) == kstr
2059** into: string.byte(str, a) == string.byte(kstr, 1) etc.
2060** Note: this creates unaligned XLOADs on x86/x64.
2061*/
2062LJFOLD(EQ SNEW KGC)
2063LJFOLD(NE SNEW KGC)
2064LJFOLDF(merge_eqne_snew_kgc)
2065{
2066 GCstr *kstr = ir_kstr(fright);
2067 int32_t len = (int32_t)kstr->len;
2068 lj_assertJ(irt_isstr(fins->t), "bad equality IR type");
2069
2070#if LJ_TARGET_UNALIGNED
2071#define FOLD_SNEW_MAX_LEN 4 /* Handle string lengths 0, 1, 2, 3, 4. */
2072#define FOLD_SNEW_TYPE8 IRT_I8 /* Creates shorter immediates. */
2073#else
2074#define FOLD_SNEW_MAX_LEN 1 /* Handle string lengths 0 or 1. */
2075#define FOLD_SNEW_TYPE8 IRT_U8 /* Prefer unsigned loads. */
2076#endif
2077
2078 PHIBARRIER(fleft);
2079 if (len <= FOLD_SNEW_MAX_LEN) {
2080 IROp op = (IROp)fins->o;
2081 IRRef strref = fleft->op1;
2082 if (IR(strref)->o != IR_STRREF)
2083 return NEXTFOLD;
2084 if (op == IR_EQ) {
2085 emitir(IRTGI(IR_EQ), fleft->op2, lj_ir_kint(J, len));
2086 /* Caveat: fins/fleft/fright is no longer valid after emitir. */
2087 } else {
2088 /* NE is not expanded since this would need an OR of two conds. */
2089 if (!irref_isk(fleft->op2)) /* Only handle the constant length case. */
2090 return NEXTFOLD;
2091 if (IR(fleft->op2)->i != len)
2092 return DROPFOLD;
2093 }
2094 if (len > 0) {
2095 /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */
2096 uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, FOLD_SNEW_TYPE8) :
2097 len == 2 ? IRT(IR_XLOAD, IRT_U16) :
2098 IRTI(IR_XLOAD));
2099 TRef tmp = emitir(ot, strref,
2100 IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0));
2101 TRef val = kfold_xload(J, IR(tref_ref(tmp)), strdata(kstr));
2102 if (len == 3)
2103 tmp = emitir(IRTI(IR_BAND), tmp,
2104 lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00)));
2105 fins->op1 = (IRRef1)tmp;
2106 fins->op2 = (IRRef1)val;
2107 fins->ot = (IROpT)IRTGI(op);
2108 return RETRYFOLD;
2109 } else {
2110 return DROPFOLD;
2111 }
2112 }
2113 return NEXTFOLD;
2114}
2115
2116/* -- Loads --------------------------------------------------------------- */
2117
2118/* Loads cannot be folded or passed on to CSE in general.
2119** Alias analysis is needed to check for forwarding opportunities.
2120**
2121** Caveat: *all* loads must be listed here or they end up at CSE!
2122*/
2123
2124LJFOLD(ALOAD any)
2125LJFOLDX(lj_opt_fwd_aload)
2126
2127/* From HREF fwd (see below). Must eliminate, not supported by fwd/backend. */
2128LJFOLD(HLOAD KKPTR)
2129LJFOLDF(kfold_hload_kkptr)
2130{
2131 UNUSED(J);
2132 lj_assertJ(ir_kptr(fleft) == niltvg(J2G(J)), "expected niltv");
2133 return TREF_NIL;
2134}
2135
2136LJFOLD(HLOAD any)
2137LJFOLDX(lj_opt_fwd_hload)
2138
2139LJFOLD(ULOAD any)
2140LJFOLDX(lj_opt_fwd_uload)
2141
2142LJFOLD(ALEN any any)
2143LJFOLDX(lj_opt_fwd_alen)
2144
2145/* Try to merge UREFO/UREFC into referenced instruction. */
2146static TRef merge_uref(jit_State *J, IRRef ref, IRIns* ir)
2147{
2148 if (ir->o == IR_UREFO && irt_isguard(ir->t)) {
2149 /* Might be pointing to some other coroutine's stack.
2150 ** And GC might shrink said stack, thereby repointing the upvalue.
2151 ** GC might even collect said coroutine, thereby closing the upvalue.
2152 */
2153 if (gcstep_barrier(J, ref))
2154 return EMITFOLD; /* So cannot merge. */
2155 /* Current fins wants a check, but ir doesn't have one. */
2156 if ((irt_t(fins->t) & (IRT_GUARD|IRT_TYPE)) == (IRT_GUARD|IRT_PGC) &&
2157 irt_type(ir->t) == IRT_IGC)
2158 ir->t.irt += IRT_PGC-IRT_IGC; /* So install a check. */
2159 }
2160 return ref; /* Not a TRef, but the caller doesn't care. */
2161}
2162
2163/* Upvalue refs are really loads, but there are no corresponding stores.
2164** So CSE is ok for them, except for guarded UREFO across a GC step.
2165** If the referenced function is const, its upvalue addresses are const, too.
2166** This can be used to improve CSE by looking for the same address,
2167** even if the upvalues originate from a different function.
2168*/
2169LJFOLD(UREFO KGC any)
2170LJFOLD(UREFC KGC any)
2171LJFOLDF(cse_uref)
2172{
2173 if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {
2174 IRRef ref = J->chain[fins->o];
2175 GCfunc *fn = ir_kfunc(fleft);
2176 GCupval *uv = gco2uv(gcref(fn->l.uvptr[(fins->op2 >> 8)]));
2177 while (ref > 0) {
2178 IRIns *ir = IR(ref);
2179 if (irref_isk(ir->op1)) {
2180 GCfunc *fn2 = ir_kfunc(IR(ir->op1));
2181 if (gco2uv(gcref(fn2->l.uvptr[(ir->op2 >> 8)])) == uv) {
2182 return merge_uref(J, ref, ir);
2183 }
2184 }
2185 ref = ir->prev;
2186 }
2187 }
2188 return EMITFOLD;
2189}
2190
2191/* Custom CSE for UREFO. */
2192LJFOLD(UREFO any any)
2193LJFOLDF(cse_urefo)
2194{
2195 if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {
2196 IRRef ref = J->chain[IR_UREFO];
2197 IRRef lim = fins->op1;
2198 IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);
2199 while (ref > lim) {
2200 IRIns *ir = IR(ref);
2201 if (ir->op12 == op12)
2202 return merge_uref(J, ref, ir);
2203 ref = ir->prev;
2204 }
2205 }
2206 return EMITFOLD;
2207}
2208
2209LJFOLD(HREFK any any)
2210LJFOLDX(lj_opt_fwd_hrefk)
2211
2212LJFOLD(HREF TNEW any)
2213LJFOLDF(fwd_href_tnew)
2214{
2215 if (lj_opt_fwd_href_nokey(J))
2216 return lj_ir_kkptr(J, niltvg(J2G(J)));
2217 return NEXTFOLD;
2218}
2219
2220LJFOLD(HREF TDUP KPRI)
2221LJFOLD(HREF TDUP KGC)
2222LJFOLD(HREF TDUP KNUM)
2223LJFOLDF(fwd_href_tdup)
2224{
2225 TValue keyv;
2226 cTValue *val;
2227 lj_ir_kvalue(J->L, &keyv, fright);
2228 val = lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv);
2229 /* Check for either nil or the nil value marker in the template table. */
2230 if ((tvisnil(val) || tvistab(val)) && lj_opt_fwd_href_nokey(J))
2231 return lj_ir_kkptr(J, niltvg(J2G(J)));
2232 return NEXTFOLD;
2233}
2234
2235/* We can safely FOLD/CSE array/hash refs and field loads, since there
2236** are no corresponding stores. But we need to check for any NEWREF with
2237** an aliased table, as it may invalidate all of the pointers and fields.
2238** Only HREF needs the NEWREF check -- AREF and HREFK already depend on
2239** FLOADs. And NEWREF itself is treated like a store (see below).
2240** LREF is constant (per trace) since coroutine switches are not inlined.
2241*/
2242LJFOLD(FLOAD TNEW IRFL_TAB_ASIZE)
2243LJFOLDF(fload_tab_tnew_asize)
2244{
2245 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))
2246 return INTFOLD(fleft->op1);
2247 return NEXTFOLD;
2248}
2249
2250LJFOLD(FLOAD TNEW IRFL_TAB_HMASK)
2251LJFOLDF(fload_tab_tnew_hmask)
2252{
2253 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))
2254 return INTFOLD((1 << fleft->op2)-1);
2255 return NEXTFOLD;
2256}
2257
2258LJFOLD(FLOAD TDUP IRFL_TAB_ASIZE)
2259LJFOLDF(fload_tab_tdup_asize)
2260{
2261 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))
2262 return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->asize);
2263 return NEXTFOLD;
2264}
2265
2266LJFOLD(FLOAD TDUP IRFL_TAB_HMASK)
2267LJFOLDF(fload_tab_tdup_hmask)
2268{
2269 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))
2270 return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->hmask);
2271 return NEXTFOLD;
2272}
2273
2274LJFOLD(HREF any any)
2275LJFOLD(FLOAD any IRFL_TAB_ARRAY)
2276LJFOLD(FLOAD any IRFL_TAB_NODE)
2277LJFOLD(FLOAD any IRFL_TAB_ASIZE)
2278LJFOLD(FLOAD any IRFL_TAB_HMASK)
2279LJFOLDF(fload_tab_ah)
2280{
2281 TRef tr = lj_opt_cse(J);
2282 return lj_opt_fwd_tptr(J, tref_ref(tr)) ? tr : EMITFOLD;
2283}
2284
2285/* Strings are immutable, so we can safely FOLD/CSE the related FLOAD. */
2286LJFOLD(FLOAD KGC IRFL_STR_LEN)
2287LJFOLDF(fload_str_len_kgc)
2288{
2289 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
2290 return INTFOLD((int32_t)ir_kstr(fleft)->len);
2291 return NEXTFOLD;
2292}
2293
2294LJFOLD(FLOAD SNEW IRFL_STR_LEN)
2295LJFOLDF(fload_str_len_snew)
2296{
2297 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
2298 PHIBARRIER(fleft);
2299 return fleft->op2;
2300 }
2301 return NEXTFOLD;
2302}
2303
2304LJFOLD(FLOAD TOSTR IRFL_STR_LEN)
2305LJFOLDF(fload_str_len_tostr)
2306{
2307 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR)
2308 return INTFOLD(1);
2309 return NEXTFOLD;
2310}
2311
2312LJFOLD(FLOAD any IRFL_SBUF_W)
2313LJFOLD(FLOAD any IRFL_SBUF_E)
2314LJFOLD(FLOAD any IRFL_SBUF_B)
2315LJFOLD(FLOAD any IRFL_SBUF_L)
2316LJFOLD(FLOAD any IRFL_SBUF_REF)
2317LJFOLD(FLOAD any IRFL_SBUF_R)
2318LJFOLDF(fload_sbuf)
2319{
2320 TRef tr = lj_opt_fwd_fload(J);
2321 return lj_opt_fwd_sbuf(J, tref_ref(tr)) ? tr : EMITFOLD;
2322}
2323
2324/* The fast function ID of function objects is immutable. */
2325LJFOLD(FLOAD KGC IRFL_FUNC_FFID)
2326LJFOLDF(fload_func_ffid_kgc)
2327{
2328 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
2329 return INTFOLD((int32_t)ir_kfunc(fleft)->c.ffid);
2330 return NEXTFOLD;
2331}
2332
2333/* The C type ID of cdata objects is immutable. */
2334LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID)
2335LJFOLDF(fload_cdata_typeid_kgc)
2336{
2337 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
2338 return INTFOLD((int32_t)ir_kcdata(fleft)->ctypeid);
2339 return NEXTFOLD;
2340}
2341
2342/* Get the contents of immutable cdata objects. */
2343LJFOLD(FLOAD KGC IRFL_CDATA_PTR)
2344LJFOLD(FLOAD KGC IRFL_CDATA_INT)
2345LJFOLD(FLOAD KGC IRFL_CDATA_INT64)
2346LJFOLDF(fload_cdata_int64_kgc)
2347{
2348 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
2349 void *p = cdataptr(ir_kcdata(fleft));
2350 if (irt_is64(fins->t))
2351 return INT64FOLD(*(uint64_t *)p);
2352 else
2353 return INTFOLD(*(int32_t *)p);
2354 }
2355 return NEXTFOLD;
2356}
2357
2358LJFOLD(FLOAD CNEW IRFL_CDATA_CTYPEID)
2359LJFOLD(FLOAD CNEWI IRFL_CDATA_CTYPEID)
2360LJFOLDF(fload_cdata_typeid_cnew)
2361{
2362 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
2363 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWI op1 is const. */
2364 return NEXTFOLD;
2365}
2366
2367/* Pointer, int and int64 cdata objects are immutable. */
2368LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR)
2369LJFOLD(FLOAD CNEWI IRFL_CDATA_INT)
2370LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64)
2371LJFOLDF(fload_cdata_ptr_int64_cnew)
2372{
2373 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
2374 return fleft->op2; /* Fold even across PHI to avoid allocations. */
2375 return NEXTFOLD;
2376}
2377
2378LJFOLD(FLOAD any IRFL_STR_LEN)
2379LJFOLD(FLOAD any IRFL_FUNC_ENV)
2380LJFOLD(FLOAD any IRFL_THREAD_ENV)
2381LJFOLD(FLOAD any IRFL_CDATA_CTYPEID)
2382LJFOLD(FLOAD any IRFL_CDATA_PTR)
2383LJFOLD(FLOAD any IRFL_CDATA_INT)
2384LJFOLD(FLOAD any IRFL_CDATA_INT64)
2385LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */
2386LJFOLDX(lj_opt_cse)
2387
2388/* All other field loads need alias analysis. */
2389LJFOLD(FLOAD any any)
2390LJFOLDX(lj_opt_fwd_fload)
2391
2392/* This is for LOOP only. Recording handles SLOADs internally. */
2393LJFOLD(SLOAD any any)
2394LJFOLDF(fwd_sload)
2395{
2396 if ((fins->op2 & IRSLOAD_FRAME)) {
2397 TRef tr = lj_opt_cse(J);
2398 return tref_ref(tr) < J->chain[IR_RETF] ? EMITFOLD : tr;
2399 } else {
2400 lj_assertJ(J->slot[fins->op1] != 0, "uninitialized slot accessed");
2401 return J->slot[fins->op1];
2402 }
2403}
2404
2405/* Only fold for KKPTR. The pointer _and_ the contents must be const. */
2406LJFOLD(XLOAD KKPTR any)
2407LJFOLDF(xload_kptr)
2408{
2409 TRef tr = kfold_xload(J, fins, ir_kptr(fleft));
2410 return tr ? tr : NEXTFOLD;
2411}
2412
2413LJFOLD(XLOAD any any)
2414LJFOLDX(lj_opt_fwd_xload)
2415
2416/* -- Frame handling ------------------------------------------------------ */
2417
2418/* Prevent CSE of a REF_BASE operand across IR_RETF. */
2419LJFOLD(SUB any BASE)
2420LJFOLD(SUB BASE any)
2421LJFOLD(EQ any BASE)
2422LJFOLDF(fold_base)
2423{
2424 return lj_opt_cselim(J, J->chain[IR_RETF]);
2425}
2426
2427/* -- Write barriers ------------------------------------------------------ */
2428
2429/* Write barriers are amenable to CSE, but not across any incremental
2430** GC steps.
2431*/
2432LJFOLD(TBAR any)
2433LJFOLD(OBAR any any)
2434LJFOLDF(barrier_tab)
2435{
2436 TRef tr = lj_opt_cse(J);
2437 if (gcstep_barrier(J, tref_ref(tr))) /* CSE across GC step? */
2438 return EMITFOLD; /* Raw emit. Assumes fins is left intact by CSE. */
2439 return tr;
2440}
2441
2442LJFOLD(TBAR TNEW)
2443LJFOLD(TBAR TDUP)
2444LJFOLDF(barrier_tnew_tdup)
2445{
2446 /* New tables are always white and never need a barrier. */
2447 if (fins->op1 < J->chain[IR_LOOP]) /* Except across a GC step. */
2448 return NEXTFOLD;
2449 return DROPFOLD;
2450}
2451
2452/* -- Profiling ----------------------------------------------------------- */
2453
2454LJFOLD(PROF any any)
2455LJFOLDF(prof)
2456{
2457 IRRef ref = J->chain[IR_PROF];
2458 if (ref+1 == J->cur.nins) /* Drop neighbouring IR_PROF. */
2459 return ref;
2460 return EMITFOLD;
2461}
2462
2463/* -- Stores and allocations ---------------------------------------------- */
2464
2465/* Stores and allocations cannot be folded or passed on to CSE in general.
2466** But some stores can be eliminated with dead-store elimination (DSE).
2467**
2468** Caveat: *all* stores and allocs must be listed here or they end up at CSE!
2469*/
2470
2471LJFOLD(ASTORE any any)
2472LJFOLD(HSTORE any any)
2473LJFOLDX(lj_opt_dse_ahstore)
2474
2475LJFOLD(USTORE any any)
2476LJFOLDX(lj_opt_dse_ustore)
2477
2478LJFOLD(FSTORE any any)
2479LJFOLDX(lj_opt_dse_fstore)
2480
2481LJFOLD(XSTORE any any)
2482LJFOLDX(lj_opt_dse_xstore)
2483
2484LJFOLD(NEWREF any any) /* Treated like a store. */
2485LJFOLD(TMPREF any any)
2486LJFOLD(CALLA any any)
2487LJFOLD(CALLL any any) /* Safeguard fallback. */
2488LJFOLD(CALLS any any)
2489LJFOLD(CALLXS any any)
2490LJFOLD(XBAR)
2491LJFOLD(RETF any any) /* Modifies BASE. */
2492LJFOLD(TNEW any any)
2493LJFOLD(TDUP any)
2494LJFOLD(CNEW any any)
2495LJFOLD(XSNEW any any)
2496LJFOLDX(lj_ir_emit)
2497
2498/* -- Miscellaneous ------------------------------------------------------- */
2499
2500LJFOLD(CARG any any)
2501LJFOLDF(cse_carg)
2502{
2503 TRef tr = lj_opt_cse(J);
2504 if (tref_ref(tr) < J->chain[IR_LOOP]) /* CSE across loop? */
2505 return EMITFOLD; /* Raw emit. Assumes fins is left intact by CSE. */
2506 return tr;
2507}
2508
2509/* ------------------------------------------------------------------------ */
2510
2511/* Every entry in the generated hash table is a 32 bit pattern:
2512**
2513** xxxxxxxx iiiiiii lllllll rrrrrrrrrr
2514**
2515** xxxxxxxx = 8 bit index into fold function table
2516** iiiiiii = 7 bit folded instruction opcode
2517** lllllll = 7 bit left instruction opcode
2518** rrrrrrrrrr = 8 bit right instruction opcode or 10 bits from literal field
2519*/
2520
2521#include "lj_folddef.h"
2522
2523/* ------------------------------------------------------------------------ */
2524
2525/* Fold IR instruction. */
2526TRef LJ_FASTCALL lj_opt_fold(jit_State *J)
2527{
2528 uint32_t key, any;
2529 IRRef ref;
2530
2531 if (LJ_UNLIKELY((J->flags & JIT_F_OPT_MASK) != JIT_F_OPT_DEFAULT)) {
2532 lj_assertJ(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) |
2533 JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT,
2534 "bad JIT_F_OPT_DEFAULT");
2535 /* Folding disabled? Chain to CSE, but not for loads/stores/allocs. */
2536 if (!(J->flags & JIT_F_OPT_FOLD) && irm_kind(lj_ir_mode[fins->o]) == IRM_N)
2537 return lj_opt_cse(J);
2538
2539 /* No FOLD, forwarding or CSE? Emit raw IR for loads, except for SLOAD. */
2540 if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE)) !=
2541 (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE) &&
2542 irm_kind(lj_ir_mode[fins->o]) == IRM_L && fins->o != IR_SLOAD)
2543 return lj_ir_emit(J);
2544
2545 /* No FOLD or DSE? Emit raw IR for stores. */
2546 if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_DSE)) !=
2547 (JIT_F_OPT_FOLD|JIT_F_OPT_DSE) &&
2548 irm_kind(lj_ir_mode[fins->o]) == IRM_S)
2549 return lj_ir_emit(J);
2550 }
2551
2552 /* Fold engine start/retry point. */
2553retry:
2554 /* Construct key from opcode and operand opcodes (unless literal/none). */
2555 key = ((uint32_t)fins->o << 17);
2556 if (fins->op1 >= J->cur.nk) {
2557 key += (uint32_t)IR(fins->op1)->o << 10;
2558 *fleft = *IR(fins->op1);
2559 if (fins->op1 < REF_TRUE)
2560 fleft[1] = IR(fins->op1)[1];
2561 }
2562 if (fins->op2 >= J->cur.nk) {
2563 key += (uint32_t)IR(fins->op2)->o;
2564 *fright = *IR(fins->op2);
2565 if (fins->op2 < REF_TRUE)
2566 fright[1] = IR(fins->op2)[1];
2567 } else {
2568 key += (fins->op2 & 0x3ffu); /* Literal mask. Must include IRCONV_*MASK. */
2569 }
2570
2571 /* Check for a match in order from most specific to least specific. */
2572 any = 0;
2573 for (;;) {
2574 uint32_t k = key | (any & 0x1ffff);
2575 uint32_t h = fold_hashkey(k);
2576 uint32_t fh = fold_hash[h]; /* Lookup key in semi-perfect hash table. */
2577 if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) {
2578 ref = (IRRef)tref_ref(fold_func[fh >> 24](J));
2579 if (ref != NEXTFOLD)
2580 break;
2581 }
2582 if (any == 0xfffff) /* Exhausted folding. Pass on to CSE. */
2583 return lj_opt_cse(J);
2584 any = (any | (any >> 10)) ^ 0xffc00;
2585 }
2586
2587 /* Return value processing, ordered by frequency. */
2588 if (LJ_LIKELY(ref >= MAX_FOLD))
2589 return TREF(ref, irt_t(IR(ref)->t));
2590 if (ref == RETRYFOLD)
2591 goto retry;
2592 if (ref == KINTFOLD)
2593 return lj_ir_kint(J, fins->i);
2594 if (ref == FAILFOLD)
2595 lj_trace_err(J, LJ_TRERR_GFAIL);
2596 lj_assertJ(ref == DROPFOLD, "bad fold result");
2597 return REF_DROP;
2598}
2599
2600/* -- Common-Subexpression Elimination ------------------------------------ */
2601
2602/* CSE an IR instruction. This is very fast due to the skip-list chains. */
2603TRef LJ_FASTCALL lj_opt_cse(jit_State *J)
2604{
2605 /* Avoid narrow to wide store-to-load forwarding stall */
2606 IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);
2607 IROp op = fins->o;
2608 if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {
2609 /* Limited search for same operands in per-opcode chain. */
2610 IRRef ref = J->chain[op];
2611 IRRef lim = fins->op1;
2612 if (fins->op2 > lim) lim = fins->op2; /* Relies on lit < REF_BIAS. */
2613 while (ref > lim) {
2614 if (IR(ref)->op12 == op12)
2615 return TREF(ref, irt_t(IR(ref)->t)); /* Common subexpression found. */
2616 ref = IR(ref)->prev;
2617 }
2618 }
2619 /* Otherwise emit IR (inlined for speed). */
2620 {
2621 IRRef ref = lj_ir_nextins(J);
2622 IRIns *ir = IR(ref);
2623 ir->prev = J->chain[op];
2624 ir->op12 = op12;
2625 J->chain[op] = (IRRef1)ref;
2626 ir->o = fins->o;
2627 J->guardemit.irt |= fins->t.irt;
2628 return TREF(ref, irt_t((ir->t = fins->t)));
2629 }
2630}
2631
2632/* CSE with explicit search limit. */
2633TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim)
2634{
2635 IRRef ref = J->chain[fins->o];
2636 IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);
2637 while (ref > lim) {
2638 if (IR(ref)->op12 == op12)
2639 return ref;
2640 ref = IR(ref)->prev;
2641 }
2642 return lj_ir_emit(J);
2643}
2644
2645/* ------------------------------------------------------------------------ */
2646
2647#undef IR
2648#undef fins
2649#undef fleft
2650#undef fright
2651#undef knumleft
2652#undef knumright
2653#undef emitir
2654
2655#endif