338 // least common multiple
339 size_t lcm(size_t a, size_t b) {
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 }
|
338 // least common multiple
339 size_t lcm(size_t a, size_t b) {
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 // Clamp an address to be within a specific page
360 // 1. If the address is on the page it is returned as is
361 // 2. If the address is above the page_address the start of the *next* page will be returned
362 // 3. If the address is below the page_address the start of the page will be returned
363 static address clamp_address_in_page(address addr, address page_address, intptr_t page_size) {
364 if (align_size_down(intptr_t(addr), page_size) == align_size_down(intptr_t(page_address), page_size)) {
365 // address is in the specified page, just return it as is
366 return addr;
367 } else if (addr > page_address) {
368 // address is on above specified page, return start of next page
369 return (address)align_size_down(intptr_t(page_address), page_size) + page_size;
370 } else {
371 // address is below specified page, return start of page
372 return (address)align_size_down(intptr_t(page_address), page_size);
373 }
374 }
375
376 address clamp_address_in_page(address addr, address page_address) {
377 intptr_t page_size = os::vm_page_size();
378 return clamp_address_in_page(addr, page_address, page_size);
379 }
380
381 #ifndef PRODUCT
382
383 void GlobalDefinitions::test_globals() {
384 intptr_t page_size = 4096;
385 address a_page = (address)(10*page_size);
386
387 // Check that address within page is returned as is
388 assert(clamp_address_in_page(a_page, a_page, 4096) == a_page, "incorrect");
389 assert(clamp_address_in_page(a_page + 128, a_page, 4096) == a_page + 128, "incorrect");
390 assert(clamp_address_in_page(a_page + page_size - 1, a_page, 4096) == a_page + page_size - 1, "incorrect");
391
392 // Check that address above page returns start of next page
393 assert(clamp_address_in_page(a_page + page_size, a_page, 4096) == a_page + page_size, "incorrect");
394 assert(clamp_address_in_page(a_page + page_size + 1, a_page, 4096) == a_page + page_size, "incorrect");
395 assert(clamp_address_in_page(a_page + page_size*5 + 1, a_page, 4096) == a_page + page_size, "incorrect");
396
397 // Check that address below page returns start of page
398 assert(clamp_address_in_page(a_page - 1, a_page, 4096) == a_page, "incorrect");
399 assert(clamp_address_in_page(a_page - 2*page_size - 1, a_page, 4096) == a_page, "incorrect");
400 assert(clamp_address_in_page(a_page - 5*page_size - 1, a_page, 4096) == a_page, "incorrect");
401 }
402
403 #endif // PRODUCT
|