OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 // for facilities. | 131 // for facilities. |
132 #if V8_HOST_ARCH_S390 | 132 #if V8_HOST_ARCH_S390 |
133 if (performSTFLE) { | 133 if (performSTFLE) { |
134 // STFLE D(B) requires: | 134 // STFLE D(B) requires: |
135 // GPR0 to specify # of double words to update minus 1. | 135 // GPR0 to specify # of double words to update minus 1. |
136 // i.e. GPR0 = 0 for 1 doubleword | 136 // i.e. GPR0 = 0 for 1 doubleword |
137 // D(B) to specify to memory location to store the facilities bits | 137 // D(B) to specify to memory location to store the facilities bits |
138 // The facilities we are checking for are: | 138 // The facilities we are checking for are: |
139 // Bit 45 - Distinct Operands for instructions like ARK, SRK, etc. | 139 // Bit 45 - Distinct Operands for instructions like ARK, SRK, etc. |
140 // As such, we require only 1 double word | 140 // As such, we require only 1 double word |
141 int64_t facilities[1]; | 141 int64_t facilities[3] = {0L}; |
142 facilities[0] = 0; | |
143 // LHI sets up GPR0 | 142 // LHI sets up GPR0 |
144 // STFLE is specified as .insn, as opcode is not recognized. | 143 // STFLE is specified as .insn, as opcode is not recognized. |
145 // We register the instructions kill r0 (LHI) and the CC (STFLE). | 144 // We register the instructions kill r0 (LHI) and the CC (STFLE). |
146 asm volatile( | 145 asm volatile( |
147 "lhi 0,0\n" | 146 "lhi 0,2\n" |
148 ".insn s,0xb2b00000,%0\n" | 147 ".insn s,0xb2b00000,%0\n" |
149 : "=Q"(facilities) | 148 : "=Q"(facilities) |
150 : | 149 : |
151 : "cc", "r0"); | 150 : "cc", "r0"); |
152 | 151 |
| 152 uint64_t one = static_cast<uint64_t>(1); |
153 // Test for Distinct Operands Facility - Bit 45 | 153 // Test for Distinct Operands Facility - Bit 45 |
154 if (facilities[0] & (1lu << (63 - 45))) { | 154 if (facilities[0] & (one << (63 - 45))) { |
155 supported_ |= (1u << DISTINCT_OPS); | 155 supported_ |= (1u << DISTINCT_OPS); |
156 } | 156 } |
157 // Test for General Instruction Extension Facility - Bit 34 | 157 // Test for General Instruction Extension Facility - Bit 34 |
158 if (facilities[0] & (1lu << (63 - 34))) { | 158 if (facilities[0] & (one << (63 - 34))) { |
159 supported_ |= (1u << GENERAL_INSTR_EXT); | 159 supported_ |= (1u << GENERAL_INSTR_EXT); |
160 } | 160 } |
161 // Test for Floating Point Extension Facility - Bit 37 | 161 // Test for Floating Point Extension Facility - Bit 37 |
162 if (facilities[0] & (1lu << (63 - 37))) { | 162 if (facilities[0] & (one << (63 - 37))) { |
163 supported_ |= (1u << FLOATING_POINT_EXT); | 163 supported_ |= (1u << FLOATING_POINT_EXT); |
164 } | 164 } |
| 165 // Test for Vector Facility - Bit 129 |
| 166 if (facilities[2] & (one << (63 - (129 - 128)))) { |
| 167 supported_ |= (1u << VECTOR_FACILITY); |
| 168 } |
165 } | 169 } |
166 #else | 170 #else |
167 // All distinct ops instructions can be simulated | 171 // All distinct ops instructions can be simulated |
168 supported_ |= (1u << DISTINCT_OPS); | 172 supported_ |= (1u << DISTINCT_OPS); |
169 // RISBG can be simulated | 173 // RISBG can be simulated |
170 supported_ |= (1u << GENERAL_INSTR_EXT); | 174 supported_ |= (1u << GENERAL_INSTR_EXT); |
171 | 175 |
172 supported_ |= (1u << FLOATING_POINT_EXT); | 176 supported_ |= (1u << FLOATING_POINT_EXT); |
173 USE(performSTFLE); // To avoid assert | 177 USE(performSTFLE); // To avoid assert |
| 178 supported_ |= (1u << VECTOR_FACILITY); |
174 #endif | 179 #endif |
175 supported_ |= (1u << FPU); | 180 supported_ |= (1u << FPU); |
176 } | 181 } |
177 | 182 |
178 void CpuFeatures::PrintTarget() { | 183 void CpuFeatures::PrintTarget() { |
179 const char* s390_arch = NULL; | 184 const char* s390_arch = NULL; |
180 | 185 |
181 #if V8_TARGET_ARCH_S390X | 186 #if V8_TARGET_ARCH_S390X |
182 s390_arch = "s390x"; | 187 s390_arch = "s390x"; |
183 #else | 188 #else |
184 s390_arch = "s390"; | 189 s390_arch = "s390"; |
185 #endif | 190 #endif |
186 | 191 |
187 printf("target %s\n", s390_arch); | 192 printf("target %s\n", s390_arch); |
188 } | 193 } |
189 | 194 |
190 void CpuFeatures::PrintFeatures() { | 195 void CpuFeatures::PrintFeatures() { |
191 printf("FPU=%d\n", CpuFeatures::IsSupported(FPU)); | 196 printf("FPU=%d\n", CpuFeatures::IsSupported(FPU)); |
192 printf("FPU_EXT=%d\n", CpuFeatures::IsSupported(FLOATING_POINT_EXT)); | 197 printf("FPU_EXT=%d\n", CpuFeatures::IsSupported(FLOATING_POINT_EXT)); |
193 printf("GENERAL_INSTR=%d\n", CpuFeatures::IsSupported(GENERAL_INSTR_EXT)); | 198 printf("GENERAL_INSTR=%d\n", CpuFeatures::IsSupported(GENERAL_INSTR_EXT)); |
194 printf("DISTINCT_OPS=%d\n", CpuFeatures::IsSupported(DISTINCT_OPS)); | 199 printf("DISTINCT_OPS=%d\n", CpuFeatures::IsSupported(DISTINCT_OPS)); |
| 200 printf("VECTOR_FACILITY=%d\n", CpuFeatures::IsSupported(VECTOR_FACILITY)); |
195 } | 201 } |
196 | 202 |
197 Register ToRegister(int num) { | 203 Register ToRegister(int num) { |
198 DCHECK(num >= 0 && num < kNumRegisters); | 204 DCHECK(num >= 0 && num < kNumRegisters); |
199 const Register kRegisters[] = {r0, r1, r2, r3, r4, r5, r6, r7, | 205 const Register kRegisters[] = {r0, r1, r2, r3, r4, r5, r6, r7, |
200 r8, r9, r10, fp, ip, r13, r14, sp}; | 206 r8, r9, r10, fp, ip, r13, r14, sp}; |
201 return kRegisters[num]; | 207 return kRegisters[num]; |
202 } | 208 } |
203 | 209 |
204 // ----------------------------------------------------------------------------- | 210 // ----------------------------------------------------------------------------- |
(...skipping 2938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3143 SKIP_ICACHE_FLUSH); | 3149 SKIP_ICACHE_FLUSH); |
3144 } | 3150 } |
3145 | 3151 |
3146 reloc_info_writer.Write(&rinfo); | 3152 reloc_info_writer.Write(&rinfo); |
3147 } | 3153 } |
3148 } | 3154 } |
3149 | 3155 |
3150 } // namespace internal | 3156 } // namespace internal |
3151 } // namespace v8 | 3157 } // namespace v8 |
3152 #endif // V8_TARGET_ARCH_S390 | 3158 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |