Mercurial > hg > truffle
diff src/cpu/ppc/vm/vm_version_ppc.cpp @ 14445:67fa91961822
8029940: PPC64 (part 122): C2 compiler port
Reviewed-by: kvn
author | goetz |
---|---|
date | Wed, 11 Dec 2013 00:06:11 +0100 |
parents | 41b780b43b74 |
children | e5e8aa897002 |
line wrap: on
line diff
--- a/src/cpu/ppc/vm/vm_version_ppc.cpp Tue Dec 10 14:29:43 2013 +0100 +++ b/src/cpu/ppc/vm/vm_version_ppc.cpp Wed Dec 11 00:06:11 2013 +0100 @@ -89,16 +89,17 @@ } // On Power6 test for section size. - if (PowerArchitecturePPC64 == 6) + if (PowerArchitecturePPC64 == 6) { determine_section_size(); - // TODO: PPC port else + // TODO: PPC port } else { // TODO: PPC port PdScheduling::power6SectorSize = 0x20; + } MaxVectorSize = 8; #endif // Create and print feature-string. - char buf[(num_features+1) * 16]; // max 16 chars per feature + char buf[(num_features+1) * 16]; // Max 16 chars per feature. jio_snprintf(buf, sizeof(buf), "ppc64%s%s%s%s%s%s%s%s", (has_fsqrt() ? " fsqrt" : ""), @@ -127,21 +128,21 @@ if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) AllocatePrefetchStyle = 1; if (AllocatePrefetchStyle == 4) { - AllocatePrefetchStepSize = cache_line_size; // need exact value - if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 12; // use larger blocks by default - if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 2*cache_line_size; // default is not defined ? + AllocatePrefetchStepSize = cache_line_size; // Need exact value. + if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 12; // Use larger blocks by default. + if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 2*cache_line_size; // Default is not defined? } else { if (cache_line_size > AllocatePrefetchStepSize) AllocatePrefetchStepSize = cache_line_size; - if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 3; // Optimistic value - if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 3*cache_line_size; // default is not defined ? + if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 3; // Optimistic value. + if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 3*cache_line_size; // Default is not defined? } assert(AllocatePrefetchLines > 0, "invalid value"); if (AllocatePrefetchLines < 1) // Set valid value in product VM. - AllocatePrefetchLines = 1; // Conservative value + AllocatePrefetchLines = 1; // Conservative value. if (AllocatePrefetchStyle == 3 && AllocatePrefetchDistance < cache_line_size) - AllocatePrefetchStyle = 1; // fall back if inappropriate + AllocatePrefetchStyle = 1; // Fall back if inappropriate. assert(AllocatePrefetchStyle >= 0, "AllocatePrefetchStyle should be positive"); } @@ -160,13 +161,13 @@ const int code_size = (2* unroll * 32 + 100)*BytesPerInstWord; - // Allocate space for the code + // Allocate space for the code. ResourceMark rm; CodeBuffer cb("detect_section_size", code_size, 0); MacroAssembler* a = new MacroAssembler(&cb); uint32_t *code = (uint32_t *)a->pc(); - // emit code. + // Emit code. void (*test1)() = (void(*)())(void *)a->emit_fd(); Label l1; @@ -189,58 +190,58 @@ // ;; 1 a->nop(); // 5 - a->fmr(F6, F6); // 6 - a->fmr(F7, F7); // 7 + a->fmr(F6, F6); // 6 + a->fmr(F7, F7); // 7 a->endgroup(); // 8 // ------- sector 8 ------------ // ;; 2 a->nop(); // 9 a->nop(); // 10 - a->fmr(F8, F8); // 11 - a->fmr(F9, F9); // 12 + a->fmr(F8, F8); // 11 + a->fmr(F9, F9); // 12 // ;; 3 a->nop(); // 13 - a->fmr(F10, F10); // 14 - a->fmr(F11, F11); // 15 + a->fmr(F10, F10); // 14 + a->fmr(F11, F11); // 15 a->endgroup(); // 16 // -------- sector 16 ------------- // ;; 4 a->nop(); // 17 a->nop(); // 18 - a->fmr(F15, F15); // 19 - a->fmr(F16, F16); // 20 + a->fmr(F15, F15); // 19 + a->fmr(F16, F16); // 20 // ;; 5 a->nop(); // 21 - a->fmr(F17, F17); // 22 - a->fmr(F18, F18); // 23 + a->fmr(F17, F17); // 22 + a->fmr(F18, F18); // 23 a->endgroup(); // 24 // ------- sector 24 ------------ // ;; 6 a->nop(); // 25 a->nop(); // 26 - a->fmr(F19, F19); // 27 - a->fmr(F20, F20); // 28 + a->fmr(F19, F19); // 27 + a->fmr(F20, F20); // 28 // ;; 7 a->nop(); // 29 - a->fmr(F21, F21); // 30 - a->fmr(F22, F22); // 31 + a->fmr(F21, F21); // 30 + a->fmr(F22, F22); // 31 a->brnop0(); // 32 // ------- sector 32 ------------ } // ;; 8 - a->cmpdi(CCR0, R4, unroll);// 33 - a->bge(CCR0, l1); // 34 + a->cmpdi(CCR0, R4, unroll); // 33 + a->bge(CCR0, l1); // 34 a->blr(); - // emit code. + // Emit code. void (*test2)() = (void(*)())(void *)a->emit_fd(); // uint32_t *code = (uint32_t *)a->pc(); @@ -382,39 +383,40 @@ #endif // COMPILER2 void VM_Version::determine_features() { - const int code_size = (num_features+1+2*7)*BytesPerInstWord; // 7 InstWords for each call (function descriptor + blr instruction) + // 7 InstWords for each call (function descriptor + blr instruction). + const int code_size = (num_features+1+2*7)*BytesPerInstWord; int features = 0; // create test area - enum { BUFFER_SIZE = 2*4*K }; // needs to be >=2* max cache line size (cache line size can't exceed min page size) + enum { BUFFER_SIZE = 2*4*K }; // Needs to be >=2* max cache line size (cache line size can't exceed min page size). char test_area[BUFFER_SIZE]; char *mid_of_test_area = &test_area[BUFFER_SIZE>>1]; - // Allocate space for the code + // Allocate space for the code. ResourceMark rm; CodeBuffer cb("detect_cpu_features", code_size, 0); MacroAssembler* a = new MacroAssembler(&cb); - // emit code. + // Emit code. void (*test)(address addr, uint64_t offset)=(void(*)(address addr, uint64_t offset))(void *)a->emit_fd(); uint32_t *code = (uint32_t *)a->pc(); // Don't use R0 in ldarx. - // keep R3_ARG1 = R3 unmodified, it contains &field (see below) - // keep R4_ARG2 = R4 unmodified, it contains offset = 0 (see below) - a->fsqrt(F3, F4); // code[0] -> fsqrt_m - a->isel(R7, R5, R6, 0); // code[1] -> isel_m - a->ldarx_unchecked(R7, R3_ARG1, R4_ARG2, 1);// code[2] -> lxarx_m - a->cmpb(R7, R5, R6); // code[3] -> bcmp - //a->mftgpr(R7, F3); // code[4] -> mftgpr - a->popcntb(R7, R5); // code[5] -> popcntb - a->popcntw(R7, R5); // code[6] -> popcntw - a->fcfids(F3, F4); // code[7] -> fcfids - a->vand(VR0, VR0, VR0); // code[8] -> vand + // Keep R3_ARG1 unmodified, it contains &field (see below). + // Keep R4_ARG2 unmodified, it contains offset = 0 (see below). + a->fsqrt(F3, F4); // code[0] -> fsqrt_m + a->isel(R7, R5, R6, 0); // code[1] -> isel_m + a->ldarx_unchecked(R7, R3_ARG1, R4_ARG2, 1); // code[2] -> lxarx_m + a->cmpb(R7, R5, R6); // code[3] -> bcmp + //a->mftgpr(R7, F3); // code[4] -> mftgpr + a->popcntb(R7, R5); // code[5] -> popcntb + a->popcntw(R7, R5); // code[6] -> popcntw + a->fcfids(F3, F4); // code[7] -> fcfids + a->vand(VR0, VR0, VR0); // code[8] -> vand a->blr(); - // Emit function to set one cache line to zero - void (*zero_cacheline_func_ptr)(char*) = (void(*)(char*))(void *)a->emit_fd(); // emit function descriptor and get pointer to it - a->dcbz(R3_ARG1); // R3_ARG1 = R3 = addr + // Emit function to set one cache line to zero. Emit function descriptor and get pointer to it. + void (*zero_cacheline_func_ptr)(char*) = (void(*)(char*))(void *)a->emit_fd(); + a->dcbz(R3_ARG1); // R3_ARG1 = addr a->blr(); uint32_t *code_end = (uint32_t *)a->pc(); @@ -428,8 +430,8 @@ } // Measure cache line size. - memset(test_area, 0xFF, BUFFER_SIZE); // fill test area with 0xFF - (*zero_cacheline_func_ptr)(mid_of_test_area); // call function which executes dcbz to the middle + memset(test_area, 0xFF, BUFFER_SIZE); // Fill test area with 0xFF. + (*zero_cacheline_func_ptr)(mid_of_test_area); // Call function which executes dcbz to the middle. int count = 0; // count zeroed bytes for (int i = 0; i < BUFFER_SIZE; i++) if (test_area[i] == 0) count++; guarantee(is_power_of_2(count), "cache line size needs to be a power of 2");