mirror of https://github.com/openssl/openssl.git
				
				
				
			use '__builtin_expect' to improve EVP_EncryptUpdate performance for gcc/clang.
Signed-off-by: Liu-ErMeng <liuermeng2@huawei.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21425)
This commit is contained in:
		
							parent
							
								
									5be8233d2b
								
							
						
					
					
						commit
						ed6dfd1e36
					
				|  | @ -621,7 +621,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|     size_t soutl, inl_ = (size_t)inl; |     size_t soutl, inl_ = (size_t)inl; | ||||||
|     int blocksize; |     int blocksize; | ||||||
| 
 | 
 | ||||||
|     if (outl != NULL) { |     if (likely(outl != NULL)) { | ||||||
|         *outl = 0; |         *outl = 0; | ||||||
|     } else { |     } else { | ||||||
|         ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); |         ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); | ||||||
|  | @ -629,22 +629,22 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Prevent accidental use of decryption context when encrypting */ |     /* Prevent accidental use of decryption context when encrypting */ | ||||||
|     if (!ctx->encrypt) { |     if (unlikely(!ctx->encrypt)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); |         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (ctx->cipher == NULL) { |     if (unlikely(ctx->cipher == NULL)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); |         ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (ctx->cipher->prov == NULL) |     if (unlikely(ctx->cipher->prov == NULL)) | ||||||
|         goto legacy; |         goto legacy; | ||||||
| 
 | 
 | ||||||
|     blocksize = ctx->cipher->block_size; |     blocksize = ctx->cipher->block_size; | ||||||
| 
 | 
 | ||||||
|     if (ctx->cipher->cupdate == NULL  || blocksize < 1) { |     if (unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); |         ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  | @ -653,7 +653,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|                                inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), |                                inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), | ||||||
|                                in, inl_); |                                in, inl_); | ||||||
| 
 | 
 | ||||||
|     if (ret) { |     if (likely(ret)) { | ||||||
|         if (soutl > INT_MAX) { |         if (soutl > INT_MAX) { | ||||||
|             ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); |             ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); | ||||||
|             return 0; |             return 0; | ||||||
|  | @ -770,7 +770,7 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|     size_t soutl, inl_ = (size_t)inl; |     size_t soutl, inl_ = (size_t)inl; | ||||||
|     int blocksize; |     int blocksize; | ||||||
| 
 | 
 | ||||||
|     if (outl != NULL) { |     if (likely(outl != NULL)) { | ||||||
|         *outl = 0; |         *outl = 0; | ||||||
|     } else { |     } else { | ||||||
|         ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); |         ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); | ||||||
|  | @ -778,21 +778,21 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Prevent accidental use of encryption context when decrypting */ |     /* Prevent accidental use of encryption context when decrypting */ | ||||||
|     if (ctx->encrypt) { |     if (unlikely(ctx->encrypt)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); |         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (ctx->cipher == NULL) { |     if (unlikely(ctx->cipher == NULL)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); |         ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|     if (ctx->cipher->prov == NULL) |     if (unlikely(ctx->cipher->prov == NULL)) | ||||||
|         goto legacy; |         goto legacy; | ||||||
| 
 | 
 | ||||||
|     blocksize = EVP_CIPHER_CTX_get_block_size(ctx); |     blocksize = EVP_CIPHER_CTX_get_block_size(ctx); | ||||||
| 
 | 
 | ||||||
|     if (ctx->cipher->cupdate == NULL || blocksize < 1) { |     if (unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) { | ||||||
|         ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); |         ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  | @ -800,7 +800,7 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, | ||||||
|                                inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), |                                inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), | ||||||
|                                in, inl_); |                                in, inl_); | ||||||
| 
 | 
 | ||||||
|     if (ret) { |     if (likely(ret)) { | ||||||
|         if (soutl > INT_MAX) { |         if (soutl > INT_MAX) { | ||||||
|             ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); |             ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); | ||||||
|             return 0; |             return 0; | ||||||
|  |  | ||||||
|  | @ -18,6 +18,14 @@ | ||||||
| # include "internal/e_os.h" /* ossl_inline in many files */ | # include "internal/e_os.h" /* ossl_inline in many files */ | ||||||
| # include "internal/nelem.h" | # include "internal/nelem.h" | ||||||
| 
 | 
 | ||||||
|  | #if defined(__GNUC__) || defined(__clang__) | ||||||
|  |     #define likely(x) __builtin_expect(!!(x), 1) | ||||||
|  |     #define unlikely(x) __builtin_expect(!!(x), 0) | ||||||
|  | #else | ||||||
|  |     #define likely(x) x | ||||||
|  |     #define unlikely(x) x | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef NDEBUG | #ifdef NDEBUG | ||||||
| # define ossl_assert(x) ((x) != 0) | # define ossl_assert(x) ((x) != 0) | ||||||
| #else | #else | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue