340 size_t cur, div, next; 341 342 cur = MAX2(a, b); 343 div = MIN2(a, b); 344 345 assert(div != 0, "lcm requires positive arguments"); 346 347 348 while ((next = cur % div) != 0) { 349 cur = div; div = next; 350 } 351 352 353 julong result = julong(a) * b / div; 354 assert(result <= (size_t)max_uintx, "Integer overflow in lcm"); 355 356 return size_t(result); 357 } 358 359 #ifndef PRODUCT 360 361 void GlobalDefinitions::test_globals() { 362 intptr_t page_sizes[] = { os::vm_page_size(), 4096, 8192, 65536, 2*1024*1024 }; 363 const int num_page_sizes = sizeof(page_sizes) / sizeof(page_sizes[0]); 364 365 for (int i = 0; i < num_page_sizes; i++) { 366 intptr_t page_size = page_sizes[i]; 367 368 address a_page = (address)(10*page_size); 369 370 // Check that address within page is returned as is 371 assert(clamp_address_in_page(a_page, a_page, page_size) == a_page, "incorrect"); 372 assert(clamp_address_in_page(a_page + 128, a_page, page_size) == a_page + 128, "incorrect"); 373 assert(clamp_address_in_page(a_page + page_size - 1, a_page, page_size) == a_page + page_size - 1, "incorrect"); 374 375 // Check that address above page returns start of next page 376 assert(clamp_address_in_page(a_page + page_size, a_page, page_size) == a_page + page_size, "incorrect"); 377 assert(clamp_address_in_page(a_page + page_size + 1, a_page, page_size) == a_page + page_size, "incorrect"); 378 assert(clamp_address_in_page(a_page + page_size*5 + 1, a_page, page_size) == a_page + page_size, "incorrect"); 379 380 // Check that address below page returns start of page 381 assert(clamp_address_in_page(a_page - 1, a_page, page_size) == a_page, "incorrect"); 382 assert(clamp_address_in_page(a_page - 2*page_size - 1, a_page, page_size) == a_page, "incorrect"); 383 assert(clamp_address_in_page(a_page - 5*page_size - 1, a_page, page_size) == a_page, "incorrect"); 384 } 385 } 386 387 #define EXPECT_EQ(expected, actual) \ 388 assert(expected == actual, "Test failed"); 389 #define EXPECT_STREQ(expected, actual) \ 390 assert(strcmp(expected, actual) == 0, "Test failed"); 391 392 void GlobalDefinitions::test_proper_unit() { 393 EXPECT_EQ(0u, byte_size_in_proper_unit(0u)); 394 EXPECT_STREQ("B", proper_unit_for_byte_size(0u)); 395 396 EXPECT_EQ(1u, byte_size_in_proper_unit(1u)); 397 EXPECT_STREQ("B", proper_unit_for_byte_size(1u)); 398 399 EXPECT_EQ(1023u, byte_size_in_proper_unit(K - 1)); 400 EXPECT_STREQ("B", proper_unit_for_byte_size(K - 1)); 401 402 EXPECT_EQ(1024u, byte_size_in_proper_unit(K)); 403 EXPECT_STREQ("B", proper_unit_for_byte_size(K)); 404 | 340 size_t cur, div, next; 341 342 cur = MAX2(a, b); 343 div = MIN2(a, b); 344 345 assert(div != 0, "lcm requires positive arguments"); 346 347 348 while ((next = cur % div) != 0) { 349 cur = div; div = next; 350 } 351 352 353 julong result = julong(a) * b / div; 354 assert(result <= (size_t)max_uintx, "Integer overflow in lcm"); 355 356 return size_t(result); 357 } 358 359 #ifndef PRODUCT 360 struct T { 361 int val; 362 T(int a): val(a){} 363 }; 364 365 int test_swap(){ 366 T a(1), b(2); 367 int ia, ib; 368 369 swap(a, b); 370 assert(a.val == 2 && b.val == 1, "wrong result!"); 371 372 T * pa = &a; 373 T * pb = &b; 374 swap(pa, pb); 375 assert(pa->val == 1 && pa == &b, "wrong result for pointer!"); 376 assert(pb->val == 2 && pb == &a, "wrong result for pointer!"); 377 assert(a.val == 2 && b.val == 1, "objects are corrupted"); 378 379 ia = 1; 380 ib = 2; 381 swap(ia, ib); 382 assert(ia == 2 && ib == 1, "wrong result!"); 383 } 384 385 void GlobalDefinitions::test_globals() { 386 intptr_t page_sizes[] = { os::vm_page_size(), 4096, 8192, 65536, 2*1024*1024 }; 387 const int num_page_sizes = sizeof(page_sizes) / sizeof(page_sizes[0]); 388 389 for (int i = 0; i < num_page_sizes; i++) { 390 intptr_t page_size = page_sizes[i]; 391 392 address a_page = (address)(10*page_size); 393 394 // Check that address within page is returned as is 395 assert(clamp_address_in_page(a_page, a_page, page_size) == a_page, "incorrect"); 396 assert(clamp_address_in_page(a_page + 128, a_page, page_size) == a_page + 128, "incorrect"); 397 assert(clamp_address_in_page(a_page + page_size - 1, a_page, page_size) == a_page + page_size - 1, "incorrect"); 398 399 // Check that address above page returns start of next page 400 assert(clamp_address_in_page(a_page + page_size, a_page, page_size) == a_page + page_size, "incorrect"); 401 assert(clamp_address_in_page(a_page + page_size + 1, a_page, page_size) == a_page + page_size, "incorrect"); 402 assert(clamp_address_in_page(a_page + page_size*5 + 1, a_page, page_size) == a_page + page_size, "incorrect"); 403 404 // Check that address below page returns start of page 405 assert(clamp_address_in_page(a_page - 1, a_page, page_size) == a_page, "incorrect"); 406 assert(clamp_address_in_page(a_page - 2*page_size - 1, a_page, page_size) == a_page, "incorrect"); 407 assert(clamp_address_in_page(a_page - 5*page_size - 1, a_page, page_size) == a_page, "incorrect"); 408 } 409 410 test_swap(); 411 } 412 413 #define EXPECT_EQ(expected, actual) \ 414 assert(expected == actual, "Test failed"); 415 #define EXPECT_STREQ(expected, actual) \ 416 assert(strcmp(expected, actual) == 0, "Test failed"); 417 418 void GlobalDefinitions::test_proper_unit() { 419 EXPECT_EQ(0u, byte_size_in_proper_unit(0u)); 420 EXPECT_STREQ("B", proper_unit_for_byte_size(0u)); 421 422 EXPECT_EQ(1u, byte_size_in_proper_unit(1u)); 423 EXPECT_STREQ("B", proper_unit_for_byte_size(1u)); 424 425 EXPECT_EQ(1023u, byte_size_in_proper_unit(K - 1)); 426 EXPECT_STREQ("B", proper_unit_for_byte_size(K - 1)); 427 428 EXPECT_EQ(1024u, byte_size_in_proper_unit(K)); 429 EXPECT_STREQ("B", proper_unit_for_byte_size(K)); 430 |