libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

xorshift128plus_test.cc (17936B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #include <stdint.h>
      7 
      8 #include <algorithm>
      9 #include <vector>
     10 
     11 #undef HWY_TARGET_INCLUDE
     12 #define HWY_TARGET_INCLUDE "lib/jxl/xorshift128plus_test.cc"
     13 #include <hwy/foreach_target.h>
     14 #include <hwy/highway.h>
     15 #include <hwy/tests/hwy_gtest.h>
     16 
     17 #include "lib/jxl/base/data_parallel.h"
     18 #include "lib/jxl/test_utils.h"
     19 #include "lib/jxl/testing.h"
     20 #include "lib/jxl/xorshift128plus-inl.h"
     21 
     22 HWY_BEFORE_NAMESPACE();
     23 namespace jxl {
     24 namespace HWY_NAMESPACE {
     25 
     26 // These templates are not found via ADL.
     27 using hwy::HWY_NAMESPACE::Or;
     28 using hwy::HWY_NAMESPACE::ShiftRight;
     29 using hwy::HWY_NAMESPACE::Sub;
     30 
     31 // Define to nonzero in order to print the (new) golden outputs.
     32 #define PRINT_RESULTS 0
     33 
     34 const size_t kVectors = 64;
     35 
     36 #if PRINT_RESULTS
     37 
     38 template <int kNumLanes>
     39 void Print(const uint64_t (&result)[kNumLanes]) {
     40   printf("{ ");
     41   for (int i = 0; i < kNumLanes; ++i) {
     42     if (i != 0) {
     43       printf(", ");
     44     }
     45     printf("0x%016llXull", result[i]);
     46   }
     47   printf("},\n");
     48 }
     49 
     50 #else  // PRINT_RESULTS
     51 
     52 const uint64_t kExpected[kVectors][Xorshift128Plus::N] = {
     53     {0x6E901576D477CBB1ull, 0xE9E53789195DA2A2ull, 0xB681F6DDA5E0AE99ull,
     54      0x8EFD18CE21FD6896ull, 0xA898A80DF75CF532ull, 0x50CEB2C9E2DE7E32ull,
     55      0x3CA7C2FEB25C0DD0ull, 0xA4D0866B80B4D836ull},
     56     {0x8CD6A1E6233D3A26ull, 0x3D4603ADE98B112Dull, 0xDC427AF674019E36ull,
     57      0xE28B4D230705AC53ull, 0x7297E9BBA88783DDull, 0x34D3D23CFCD9B41Aull,
     58      0x5A223615ADBE96B8ull, 0xE5EB529027CFBD01ull},
     59     {0xC1894CF00DFAC6A2ull, 0x18EDF8AE9085E404ull, 0x8E936625296B4CCDull,
     60      0x31971EF3A14A899Bull, 0xBE87535FCE0BF26Aull, 0x576F7A752BC6649Full,
     61      0xA44CBADCE0C6B937ull, 0x3DBA819BB17A353Aull},
     62     {0x27CE38DFCC1C5EB6ull, 0x920BEB5606340256ull, 0x3986CBC40C9AFC2Cull,
     63      0xE22BCB3EEB1E191Eull, 0x6E1FCDD3602A8FBAull, 0x052CB044E5415A29ull,
     64      0x46266646EFB9ECD7ull, 0x8F44914618D29335ull},
     65     {0xDD30AEDF72A362C5ull, 0xBC1D824E16BB98F4ull, 0x9EA6009C2AA3D2F1ull,
     66      0xF65C0FBBE17AF081ull, 0x22424D06A8738991ull, 0x8A62763F2B7611D2ull,
     67      0x2F3E89F722637939ull, 0x84D338BEF50AFD50ull},
     68     {0x00F46494898E2B0Bull, 0x81239DC4FB8E8003ull, 0x414AD93EC5773FE7ull,
     69      0x791473C450E4110Full, 0x87F127BF68C959ACull, 0x6429282D695EF67Bull,
     70      0x661082E11546CBA8ull, 0x5815D53FA5436BFDull},
     71     {0xB3DEADAB9BE6E0F9ull, 0xAA1B7B8F7CED0202ull, 0x4C5ED437699D279Eull,
     72      0xA4471727F1CB39D3ull, 0xE439DA193F802F70ull, 0xF89401BB04FA6493ull,
     73      0x3B08045A4FE898BAull, 0x32137BFE98227950ull},
     74     {0xFBAE4A092897FEF3ull, 0x0639F6CE56E71C8Eull, 0xF0AD6465C07F0C1Eull,
     75      0xFF8E28563361DCE5ull, 0xC2013DB7F86BC6B9ull, 0x8EFCC0503330102Full,
     76      0x3F6B767EA5C4DA40ull, 0xB9864B950B2232E1ull},
     77     {0x76EB58DE8E5EC22Aull, 0x9BBBF49A18B32F4Full, 0xC8405F02B2B2FAB9ull,
     78      0xC3E122A5F146BC34ull, 0xC90BB046660F5765ull, 0xB933981310DBECCFull,
     79      0x5A2A7BFC9126FD1Cull, 0x8BB388C94DF87901ull},
     80     {0x753EB89AD63EF3C3ull, 0xF24AAF40C89D65ADull, 0x23F68931C1A6AA6Dull,
     81      0xF47E79BF702C6DD0ull, 0xA3AD113244EE7EAEull, 0xD42CBEA28F793DC3ull,
     82      0xD896FCF1820F497Cull, 0x042B86D2818948C1ull},
     83     {0x8F2A4FC5A4265763ull, 0xEC499E6F95EAA10Cull, 0xE3786D4ECCD0DEB5ull,
     84      0xC725C53D3AC4CC43ull, 0x065A4ACBBF83610Eull, 0x35C61C9FEF167129ull,
     85      0x7B720AEAA7D70048ull, 0x14206B841377D039ull},
     86     {0xAD27D78BF96055F6ull, 0x5F43B20FF47ADCD4ull, 0xE184C2401E2BF71Eull,
     87      0x30B263D78990045Dull, 0xC22F00EBFF9BA201ull, 0xAE7F86522B53A562ull,
     88      0x2853312BC039F0A4ull, 0x868D619E6549C3C8ull},
     89     {0xFD5493D8AE9A8371ull, 0x773D5E224DF61B3Bull, 0x5377C54FBB1A8280ull,
     90      0xCAD4DE3B8265CAFAull, 0xCDF3F19C91EBD5F6ull, 0xC8EA0F182D73BD78ull,
     91      0x220502D593433FF1ull, 0xB81205E612DC31B1ull},
     92     {0x8F32A39EAEDA4C70ull, 0x1D4B0914AA4DAC7Full, 0x56EF1570F3A8B405ull,
     93      0x29812CB17404A592ull, 0x97A2AAF69CAE90F2ull, 0x12BF5E02778BBFE5ull,
     94      0x9D4B55AD42A05FD2ull, 0x06C2BAB5E6086620ull},
     95     {0x8DB4B9648302B253ull, 0xD756AD9E3AEA12C7ull, 0x68709B7F11D4B188ull,
     96      0x7CC299DDCD707A4Bull, 0x97B860C370A7661Dull, 0xCECD314FC20E64F5ull,
     97      0x55F412CDFB4C7EC3ull, 0x55EE97591193B525ull},
     98     {0xCF70F3ACA96E6254ull, 0x022FEDECA2E09F46ull, 0x686823DB60AE1ECFull,
     99      0xFD36190D3739830Eull, 0x74E1C09027F68120ull, 0xB5883A835C093842ull,
    100      0x93E1EFB927E9E4E3ull, 0xB2721E249D7E5EBEull},
    101     {0x69B6E21C44188CB8ull, 0x5D6CFB853655A7AAull, 0x3E001A0B425A66DCull,
    102      0x8C57451103A5138Full, 0x7BF8B4BE18EAB402ull, 0x494102EB8761A365ull,
    103      0xB33796A9F6A81F0Eull, 0x10005AB3BCCFD960ull},
    104     {0xB2CF25740AE965DCull, 0x6F7C1DF7EF53D670ull, 0x648DD6087AC2251Eull,
    105      0x040955D9851D487Dull, 0xBD550FC7E21A7F66ull, 0x57408F484DEB3AB5ull,
    106      0x481E24C150B506C1ull, 0x72C0C3EAF91A40D6ull},
    107     {0x1997A481858A5D39ull, 0x539718F4BEF50DC1ull, 0x2EC4DC4787E7E368ull,
    108      0xFF1CE78879419845ull, 0xE219A93DD6F6DD30ull, 0x85328618D02FEC1Aull,
    109      0xC86E02D969181B20ull, 0xEBEC8CD8BBA34E6Eull},
    110     {0x28B55088A16CE947ull, 0xDD25AC11E6350195ull, 0xBD1F176694257B1Cull,
    111      0x09459CCF9FCC9402ull, 0xF8047341E386C4E4ull, 0x7E8E9A9AD984C6C0ull,
    112      0xA4661E95062AA092ull, 0x70A9947005ED1152ull},
    113     {0x4C01CF75DBE98CCDull, 0x0BA076CDFC7373B9ull, 0x6C5E7A004B57FB59ull,
    114      0x336B82297FD3BC56ull, 0x7990C0BE74E8D60Full, 0xF0275CC00EC5C8C8ull,
    115      0x6CF29E682DFAD2E9ull, 0xFA4361524BD95D72ull},
    116     {0x631D2A19FF62F018ull, 0x41C43863B985B3FAull, 0xE052B2267038EFD9ull,
    117      0xE2A535FAC575F430ull, 0xE004EEA90B1FF5B8ull, 0x42DFE2CA692A1F26ull,
    118      0x90FB0BFC9A189ECCull, 0x4484102BD3536BD0ull},
    119     {0xD027134E9ACCA5A5ull, 0xBBAB4F966D476A9Bull, 0x713794A96E03D693ull,
    120      0x9F6335E6B94CD44Aull, 0xC5090C80E7471617ull, 0x6D9C1B0C87B58E33ull,
    121      0x1969CE82E31185A5ull, 0x2099B97E87754EBEull},
    122     {0x60EBAF4ED934350Full, 0xC26FBF0BA5E6ECFFull, 0x9E54150F0312EC57ull,
    123      0x0973B48364ED0041ull, 0x800A523241426CFCull, 0x03AB5EC055F75989ull,
    124      0x8CF315935DEEB40Aull, 0x83D3FC0190BD1409ull},
    125     {0x26D35394CF720A51ull, 0xCE9EAA15243CBAFEull, 0xE2B45FBAF21B29E0ull,
    126      0xDB92E98EDE73F9E0ull, 0x79B16F5101C26387ull, 0x1AC15959DE88C86Full,
    127      0x387633AEC6D6A580ull, 0xA6FC05807BFC5EB8ull},
    128     {0x2D26C8E47C6BADA9ull, 0x820E6EC832D52D73ull, 0xB8432C3E0ED0EE5Bull,
    129      0x0F84B3C4063AAA87ull, 0xF393E4366854F651ull, 0x749E1B4D2366A567ull,
    130      0x805EACA43480D004ull, 0x244EBF3AA54400A5ull},
    131     {0xBFDC3763AA79F75Aull, 0x9E3A74CC751F41DBull, 0xF401302A149DBC55ull,
    132      0x6B25F7973D7BF7BCull, 0x13371D34FDBC3DAEull, 0xC5E1998C8F484DCDull,
    133      0x7031B8AE5C364464ull, 0x3847F0C4F3DA2C25ull},
    134     {0x24C6387D2C0F1225ull, 0x77CCE960255C67A4ull, 0x21A0947E497B10EBull,
    135      0xBB5DB73A825A9D7Eull, 0x26294A41999E553Dull, 0x3953E0089F87D925ull,
    136      0x3DAE6E5D4E5EAAFEull, 0x74B545460341A7AAull},
    137     {0x710E5EB08A7DB820ull, 0x7E43C4E77CAEA025ull, 0xD4C91529C8B060C1ull,
    138      0x09AE26D8A7B0CA29ull, 0xAB9F356BB360A772ull, 0xB68834A25F19F6E9ull,
    139      0x79B8D9894C5734E2ull, 0xC6847E7C8FFD265Full},
    140     {0x10C4BCB06A5111E6ull, 0x57CB50955B6A2516ull, 0xEF53C87798B6995Full,
    141      0xAB38E15BBD8D0197ull, 0xA51C6106EFF73C93ull, 0x83D7F0E2270A7134ull,
    142      0x0923FD330397FCE5ull, 0xF9DE54EDFE58FB45ull},
    143     {0x07D44833ACCD1A94ull, 0xAAD3C9E945E2F9F3ull, 0xABF4C879B876AA37ull,
    144      0xF29C69A21B301619ull, 0x2DDCE959111C788Bull, 0x7CEDB48F8AC1729Bull,
    145      0x93F3BA9A02B659BEull, 0xF20A87FF17933CBEull},
    146     {0x8E96EBE93180CFE6ull, 0x94CAA12873937079ull, 0x05F613D9380D4189ull,
    147      0xBCAB40C1DC79F38Aull, 0x0AD8907B7C61D19Eull, 0x88534E189D103910ull,
    148      0x2DB2FAABA160AB8Full, 0xA070E7506B06F15Cull},
    149     {0x6FB1FCDAFFEF87A9ull, 0xE735CF25337A090Dull, 0x172C6EDCEFEF1825ull,
    150      0x76957EA49EF0542Dull, 0x819BF4CD250F7C49ull, 0xD6FF23E4AD00C4D4ull,
    151      0xE79673C1EC358FF0ull, 0xAC9C048144337938ull},
    152     {0x4C5387FF258B3AF4ull, 0xEDB68FAEC2CB1AA3ull, 0x02A624E67B4E1DA4ull,
    153      0x5C44797A38E08AF2ull, 0x36546A70E9411B4Bull, 0x47C17B24D2FD9675ull,
    154      0x101957AAA020CA26ull, 0x47A1619D4779F122ull},
    155     {0xF84B8BCDC92D9A3Cull, 0x951D7D2C74B3066Bull, 0x7AC287C06EDDD9B2ull,
    156      0x4C38FC476608D38Full, 0x224D793B19CB4BCDull, 0x835A255899BF1A41ull,
    157      0x4AD250E9F62DB4ABull, 0xD9B44F4B58781096ull},
    158     {0xABBAF99A8EB5C6B8ull, 0xFB568E900D3A9F56ull, 0x11EDF63D23C5DF11ull,
    159      0xA9C3011D3FA7C5A8ull, 0xAEDD3CF11AFFF725ull, 0xABCA472B5F1EDD6Bull,
    160      0x0600B6BB5D879804ull, 0xDB4DE007F22191A0ull},
    161     {0xD76CC9EFF0CE9392ull, 0xF5E0A772B59BA49Aull, 0x7D1AE1ED0C1261B5ull,
    162      0x79224A33B5EA4F4Aull, 0x6DD825D80C40EA60ull, 0x47FC8E747E51C953ull,
    163      0x695C05F72888BF98ull, 0x1A012428440B9015ull},
    164     {0xD754DD61F9B772BFull, 0xC4A2FCF4C0F9D4EBull, 0x461167CDF67A24A2ull,
    165      0x434748490EBCB9D4ull, 0x274DD9CDCA5781DEull, 0x36BAC63BA9A85209ull,
    166      0x30324DAFDA36B70Full, 0x337570DB4FE6DAB3ull},
    167     {0xF46CBDD57C551546ull, 0x8E02507E676DA3E3ull, 0xD826245A8C15406Dull,
    168      0xDFB38A5B71113B72ull, 0x5EA38454C95B16B5ull, 0x28C054FB87ABF3E1ull,
    169      0xAA2724C0BA1A8096ull, 0xECA83EC980304F2Full},
    170     {0x6AA76EC294EB3303ull, 0x42D4CDB2A8032E3Bull, 0x7999EDF75DCD8735ull,
    171      0xB422BFFE696CCDCCull, 0x8F721461FD7CCDFEull, 0x148E1A5814FDE253ull,
    172      0x4DC941F4375EF8FFull, 0x27B2A9E0EB5B49CFull},
    173     {0xCEA592EF9343EBE1ull, 0xF7D38B5FA7698903ull, 0x6CCBF352203FEAB6ull,
    174      0x830F3095FCCDA9C5ull, 0xDBEEF4B81B81C8F4ull, 0x6D7EB9BCEECA5CF9ull,
    175      0xC58ABB0FBE436C69ull, 0xE4B97E6DB2041A4Bull},
    176     {0x7E40FC772978AF14ull, 0xCDDA4BBAE28354A1ull, 0xE4F993B832C32613ull,
    177      0xD3608093C68A4B35ull, 0x9A3B60E01BEE3699ull, 0x03BEF248F3288713ull,
    178      0x70B9294318F3E9B4ull, 0x8D2ABB913B8610DEull},
    179     {0x37F209128E7D8B2Cull, 0x81D2AB375BD874BCull, 0xA716A1B7373F7408ull,
    180      0x0CEE97BEC4706540ull, 0xA40C5FD9CDBC1512ull, 0x73CAF6C8918409E7ull,
    181      0x45E11BCEDF0BBAA1ull, 0x612C612BFF6E6605ull},
    182     {0xF8ECB14A12D0F649ull, 0xDA683CD7C01BA1ACull, 0xA2203F7510E124C1ull,
    183      0x7F83E52E162F3C78ull, 0x77D2BB73456ACADBull, 0x37FC34FC840BBA6Full,
    184      0x3076BC7D4C6EBC1Full, 0x4F514123632B5FA9ull},
    185     {0x44D789DED935E884ull, 0xF8291591E09FEC9Full, 0xD9CED2CF32A2E4B7ull,
    186      0x95F70E1EB604904Aull, 0xDE438FE43C14F6ABull, 0x4C8D23E4FAFCF8D8ull,
    187      0xC716910A3067EB86ull, 0x3D6B7915315095D3ull},
    188     {0x3170FDBADAB92095ull, 0x8F1963933FC5650Bull, 0x72F94F00ABECFEABull,
    189      0x6E3AE826C6AAB4CEull, 0xA677A2BF31068258ull, 0x9660CDC4F363AF10ull,
    190      0xD81A15A152379EF1ull, 0x5D7D285E1080A3F9ull},
    191     {0xDAD5DDFF9A2249B3ull, 0x6F9721D926103FAEull, 0x1418CBB83FFA349Aull,
    192      0xE71A30AD48C012B2ull, 0xBE76376C63751132ull, 0x3496467ACA713AE6ull,
    193      0x8D7EC01369F991A3ull, 0xD8C73A88B96B154Eull},
    194     {0x8B5D9C74AEB4833Aull, 0xF914FB3F867B912Full, 0xB894EA034936B1DCull,
    195      0x8A16D21BE51C4F5Bull, 0x31FF048ED582D98Eull, 0xB95AB2F4DC65B820ull,
    196      0x04082B9170561AF7ull, 0xA215610A5DC836FAull},
    197     {0xB2ADE592C092FAACull, 0x7A1E683BCBF13294ull, 0xC7A4DBF86858C096ull,
    198      0x3A49940F97BFF316ull, 0xCAE5C06B82C46703ull, 0xC7F413A0F951E2BDull,
    199      0x6665E7BB10EB5916ull, 0x86F84A5A94EDE319ull},
    200     {0x4EA199D8FAA79CA3ull, 0xDFA26E5BF1981704ull, 0x0F5E081D37FA4E01ull,
    201      0x9CB632F89CD675CDull, 0x4A09DB89D48C0304ull, 0x88142742EA3C7672ull,
    202      0xAC4F149E6D2E9BDBull, 0x6D9E1C23F8B1C6C6ull},
    203     {0xD58BE47B92DEC0E9ull, 0x8E57573645E34328ull, 0x4CC094CCB5FB5126ull,
    204      0x5F1D66AF6FB40E3Cull, 0x2BA15509132D3B00ull, 0x0D6545646120E567ull,
    205      0x3CF680C45C223666ull, 0x96B28E32930179DAull},
    206     {0x5900C45853AC7990ull, 0x61881E3E8B7FF169ull, 0x4DE5F835DF2230FFull,
    207      0x4427A9E7932F73FFull, 0x9B641BAD379A8C8Dull, 0xDF271E5BF98F4E5Cull,
    208      0xDFDA16DB830FF5EEull, 0x371C7E7CFB89C0E9ull},
    209     {0x4410A8576247A250ull, 0x6AD2DA12B45AC0D9ull, 0x18DFC72AAC85EECCull,
    210      0x06FC8BB2A0EF25C8ull, 0xEB287619C85E6118ull, 0x19553ECA67F25A2Cull,
    211      0x3B9557F1DCEC5BAAull, 0x7BAD9E8B710D1079ull},
    212     {0x34F365D66BD22B28ull, 0xE6E124B9F10F835Dull, 0x0573C38ABF2B24DCull,
    213      0xD32E6AF10A0125AEull, 0x383590ACEA979519ull, 0x8376ED7A39E28205ull,
    214      0xF0B7F184DCBDA435ull, 0x062A203390E31794ull},
    215     {0xA2AFFD7E41918760ull, 0x7F90FC1BD0819C86ull, 0x5033C08E5A969533ull,
    216      0x2707AF5C6D039590ull, 0x57BBD5980F17DF9Cull, 0xD3FE6E61D763268Aull,
    217      0x9E0A0AE40F335A3Bull, 0x43CF4EB0A99613C5ull},
    218     {0xD4D2A397CE1A7C2Eull, 0x3DF7CE7CC3212DADull, 0x0880F0D5D356C75Aull,
    219      0xA8AFC44DD03B1346ull, 0x79263B46C13A29E0ull, 0x11071B3C0ED58E7Aull,
    220      0xED46DC9F538406BFull, 0x2C94974F2B94843Dull},
    221     {0xE246E13C39AB5D5Eull, 0xAC1018489D955B20ull, 0x8601B558771852B8ull,
    222      0x110BD4C06DB40173ull, 0x738FC8A18CCA0EBBull, 0x6673E09BE0EA76E5ull,
    223      0x024BC7A0C7527877ull, 0x45E6B4652E2EC34Eull},
    224     {0xD1ED26A1A375CDC8ull, 0xAABC4E896A617CB8ull, 0x0A9C9E8E57D753C6ull,
    225      0xA3774A75FEB4C30Eull, 0x30B816C01C93E49Eull, 0xF405BABC06D2408Cull,
    226      0xCC0CE6B4CE788ABCull, 0x75E7922D0447956Cull},
    227     {0xD07C1676A698BC95ull, 0x5F9AEA4840E2D860ull, 0xD5FC10D58BDF6F02ull,
    228      0xF190A2AD4BC2EEA7ull, 0x0C24D11F51726931ull, 0xDB646899A16B6512ull,
    229      0x7BC10670047B1DD8ull, 0x2413A5ABCD45F092ull},
    230     {0x4E66892190CFD923ull, 0xF10162440365EC8Eull, 0x158ACA5A6A2280AEull,
    231      0x0D60ED11C0224166ull, 0x7CD2E9A71B9D7488ull, 0x450D7289706AB2A3ull,
    232      0x88FAE34EC9A0D7DCull, 0x96FF9103575A97DAull},
    233     {0x77990FAC6046C446ull, 0xB174B5FB30C76676ull, 0xE352CE3EB56CF82Aull,
    234      0xC6039B6873A9A082ull, 0xE3F80F3AE333148Aull, 0xB853BA24BA3539B9ull,
    235      0xE8863E52ECCB0C74ull, 0x309B4CC1092CC245ull},
    236     {0xBC2B70BEE8388D9Full, 0xE48D92AE22216DCEull, 0xF15F3BF3E2C15D8Full,
    237      0x1DD964D4812D8B24ull, 0xD56AF02FB4665E4Cull, 0x98002200595BD9A3ull,
    238      0x049246D50BB8FA12ull, 0x1B542DF485B579B9ull},
    239     {0x2347409ADFA8E497ull, 0x36015C2211D62498ull, 0xE9F141F32EB82690ull,
    240      0x1F839912D0449FB9ull, 0x4E4DCFFF2D02D97Cull, 0xF8A03AB4C0F625C9ull,
    241      0x0605F575795DAC5Cull, 0x4746C9BEA0DDA6B1ull},
    242     {0xCA5BB519ECE7481Bull, 0xFD496155E55CA945ull, 0xF753B9DBB1515F81ull,
    243      0x50549E8BAC0F70E7ull, 0x8614FB0271E21C60ull, 0x60C72947EB0F0070ull,
    244      0xA6511C10AEE742B6ull, 0x48FB48F2CACCB43Eull}};
    245 
    246 #endif  // PRINT_RESULTS
    247 
    248 // Ensures Xorshift128+ returns consistent and unchanging values.
    249 void TestGolden() {
    250   HWY_ALIGN Xorshift128Plus rng(12345);
    251   for (uint64_t vector = 0; vector < kVectors; ++vector) {
    252     HWY_ALIGN uint64_t lanes[Xorshift128Plus::N];
    253     rng.Fill(lanes);
    254 #if PRINT_RESULTS
    255     Print(lanes);
    256 #else
    257     for (size_t i = 0; i < Xorshift128Plus::N; ++i) {
    258       ASSERT_EQ(kExpected[vector][i], lanes[i])
    259           << "Where vector=" << vector << " i=" << i;
    260     }
    261 #endif
    262   }
    263 }
    264 
    265 // Output changes when given different seeds
    266 void TestSeedChanges() {
    267   HWY_ALIGN uint64_t lanes[Xorshift128Plus::N];
    268 
    269   std::vector<uint64_t> first;
    270   constexpr size_t kNumSeeds = 16384;
    271   first.reserve(kNumSeeds);
    272 
    273   // All 14-bit seeds
    274   for (size_t seed = 0; seed < kNumSeeds; ++seed) {
    275     HWY_ALIGN Xorshift128Plus rng(seed);
    276 
    277     rng.Fill(lanes);
    278     first.push_back(lanes[0]);
    279   }
    280 
    281   // All outputs are unique
    282   ASSERT_EQ(kNumSeeds, first.size());
    283   std::sort(first.begin(), first.end());
    284   first.erase(std::unique(first.begin(), first.end()), first.end());
    285   EXPECT_EQ(kNumSeeds, first.size());
    286 }
    287 
    288 void TestFloat() {
    289   test::ThreadPoolForTests pool(8);
    290 
    291 #ifdef JXL_DISABLE_SLOW_TESTS
    292   const uint32_t kMaxSeed = 256;
    293 #else   // JXL_DISABLE_SLOW_TESTS
    294   const uint32_t kMaxSeed = 4096;
    295 #endif  // JXL_DISABLE_SLOW_TESTS
    296   EXPECT_TRUE(RunOnPool(
    297       &pool, 0, kMaxSeed, ThreadPool::NoInit,
    298       [](const uint32_t seed, size_t /*thread*/) {
    299         HWY_ALIGN Xorshift128Plus rng(seed);
    300 
    301         const HWY_FULL(uint32_t) du;
    302         const HWY_FULL(float) df;
    303         HWY_ALIGN uint64_t batch[Xorshift128Plus::N];
    304         HWY_ALIGN float lanes[MaxLanes(df)];
    305         double sum = 0.0;
    306         size_t count = 0;
    307         const size_t kReps = 2000;
    308         for (size_t reps = 0; reps < kReps; ++reps) {
    309           rng.Fill(batch);
    310           for (size_t i = 0; i < Xorshift128Plus::N * 2; i += Lanes(df)) {
    311             const auto bits =
    312                 Load(du, reinterpret_cast<const uint32_t*>(batch) + i);
    313             // 1.0 + 23 random mantissa bits = [1, 2)
    314             const auto rand12 =
    315                 BitCast(df, Or(ShiftRight<9>(bits), Set(du, 0x3F800000)));
    316             const auto rand01 = Sub(rand12, Set(df, 1.0f));
    317             Store(rand01, df, lanes);
    318             for (float lane : lanes) {
    319               sum += lane;
    320               count += 1;
    321               EXPECT_LE(lane, 1.0f);
    322               EXPECT_GE(lane, 0.0f);
    323             }
    324           }
    325         }
    326 
    327         // Verify average (uniform distribution)
    328         EXPECT_NEAR(0.5, sum / count, 0.00702);
    329       },
    330       "TestXorShift"));
    331 }
    332 
    333 // Not more than one 64-bit zero
    334 void TestNotZero() {
    335   test::ThreadPoolForTests pool(8);
    336 
    337 #ifdef JXL_DISABLE_SLOW_TESTS
    338   const uint32_t kMaxSeed = 500;
    339 #else   // JXL_DISABLE_SLOW_TESTS
    340   const uint32_t kMaxSeed = 2000;
    341 #endif  // JXL_DISABLE_SLOW_TESTS
    342   EXPECT_TRUE(RunOnPool(
    343       &pool, 0, kMaxSeed, ThreadPool::NoInit,
    344       [](const uint32_t task, size_t /*thread*/) {
    345         HWY_ALIGN uint64_t lanes[Xorshift128Plus::N];
    346 
    347         HWY_ALIGN Xorshift128Plus rng(task);
    348         size_t num_zero = 0;
    349         for (size_t vectors = 0; vectors < 10000; ++vectors) {
    350           rng.Fill(lanes);
    351           for (uint64_t lane : lanes) {
    352             num_zero += static_cast<size_t>(lane == 0);
    353           }
    354         }
    355         EXPECT_LE(num_zero, 1u);
    356       },
    357       "TestNotZero"));
    358 }
    359 
    360 // NOLINTNEXTLINE(google-readability-namespace-comments)
    361 }  // namespace HWY_NAMESPACE
    362 }  // namespace jxl
    363 HWY_AFTER_NAMESPACE();
    364 
    365 #if HWY_ONCE
    366 namespace jxl {
    367 
    368 class Xorshift128Test : public hwy::TestWithParamTarget {};
    369 
    370 HWY_TARGET_INSTANTIATE_TEST_SUITE_P(Xorshift128Test);
    371 
    372 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestNotZero);
    373 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestGolden);
    374 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestSeedChanges);
    375 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestFloat);
    376 
    377 }  // namespace jxl
    378 #endif