Changeset 217127 in webkit for trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp
- Timestamp:
- May 19, 2017, 8:48:40 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp
r215642 r217127 273 273 { 274 274 Inst result(std::forward<Args>(args)...); 275 result.kind. traps |= m_traps;275 result.kind.effects |= m_traps; 276 276 m_wasWrapped = true; 277 277 return result; … … 569 569 { 570 570 Inst result(std::forward<Args>(args)...); 571 result.kind. traps |= traps;571 result.kind.effects |= traps; 572 572 return result; 573 573 } … … 962 962 return false; 963 963 964 // On x86, all stores have fences, and this isn't reordering the store itself. 965 if (!isX86() && m_value->as<MemoryValue>()->hasFence()) 964 if (m_value->as<MemoryValue>()->hasFence()) 966 965 return false; 967 966 … … 1018 1017 } 1019 1018 1020 Inst createStore(Air:: Opcodemove, Value* value, const Arg& dest)1021 { 1022 if (imm(value) && isValidForm(move , Arg::Imm, dest.kind()))1019 Inst createStore(Air::Kind move, Value* value, const Arg& dest) 1020 { 1021 if (imm(value) && isValidForm(move.opcode, Arg::Imm, dest.kind())) 1023 1022 return Inst(move, m_value, imm(value), dest); 1024 1023 … … 1026 1025 } 1027 1026 1028 Air::Opcode storeOpcode(Width width, Bank bank , bool release)1027 Air::Opcode storeOpcode(Width width, Bank bank) 1029 1028 { 1030 1029 switch (width) { 1031 1030 case Width8: 1032 1031 RELEASE_ASSERT(bank == GP); 1033 return release ? StoreRel8 :Air::Store8;1032 return Air::Store8; 1034 1033 case Width16: 1035 1034 RELEASE_ASSERT(bank == GP); 1036 return release ? StoreRel16 :Air::Store16;1035 return Air::Store16; 1037 1036 case Width32: 1038 1037 switch (bank) { 1039 1038 case GP: 1040 return release ? StoreRel32 :Move32;1039 return Move32; 1041 1040 case FP: 1042 RELEASE_ASSERT(!release);1043 1041 return MoveFloat; 1044 1042 } … … 1048 1046 switch (bank) { 1049 1047 case GP: 1050 return release ? StoreRel64 :Move;1048 return Move; 1051 1049 case FP: 1052 RELEASE_ASSERT(!release);1053 1050 return MoveDouble; 1054 1051 } … … 1058 1055 } 1059 1056 1060 Air::Opcode storeOpcode(Value* value)1057 void appendStore(Value* value, const Arg& dest) 1061 1058 { 1062 1059 MemoryValue* memory = value->as<MemoryValue>(); 1063 1060 RELEASE_ASSERT(memory->isStore()); 1064 return storeOpcode(memory->accessWidth(), memory->accessBank(), memory->hasFence()); 1065 } 1066 1067 Inst createStore(Value* value, const Arg& dest) 1068 { 1069 Air::Opcode moveOpcode = storeOpcode(value); 1070 return createStore(moveOpcode, value->child(0), dest); 1071 } 1072 1073 template<typename... Args> 1074 void appendStore(Args&&... args) 1075 { 1076 append(trappingInst(m_value, createStore(std::forward<Args>(args)...))); 1077 } 1078 1061 1062 Air::Kind kind; 1063 if (memory->hasFence()) { 1064 RELEASE_ASSERT(memory->accessBank() == GP); 1065 1066 if (isX86()) { 1067 kind = OPCODE_FOR_WIDTH(Xchg, memory->accessWidth()); 1068 kind.effects = true; 1069 Tmp swapTmp = m_code.newTmp(GP); 1070 append(relaxedMoveForType(memory->accessType()), tmp(memory->child(0)), swapTmp); 1071 append(kind, swapTmp, dest); 1072 return; 1073 } 1074 1075 kind = OPCODE_FOR_WIDTH(StoreRel, memory->accessWidth()); 1076 } else 1077 kind = storeOpcode(memory->accessWidth(), memory->accessBank()); 1078 1079 kind.effects |= memory->traps(); 1080 1081 append(createStore(kind, memory->child(0), dest)); 1082 } 1083 1079 1084 Air::Opcode moveForType(Type type) 1080 1085 { … … 1152 1157 1153 1158 template<typename... Arguments> 1154 void append(Air:: Opcode opcode, Arguments&&... arguments)1155 { 1156 m_insts.last().append(Inst( opcode, m_value, std::forward<Arguments>(arguments)...));1159 void append(Air::Kind kind, Arguments&&... arguments) 1160 { 1161 m_insts.last().append(Inst(kind, m_value, std::forward<Arguments>(arguments)...)); 1157 1162 } 1158 1163 1159 1164 template<typename... Arguments> 1160 void appendTrapping(Air:: Opcode opcode, Arguments&&... arguments)1161 { 1162 m_insts.last().append(trappingInst(m_value, opcode, m_value, std::forward<Arguments>(arguments)...));1165 void appendTrapping(Air::Kind kind, Arguments&&... arguments) 1166 { 1167 m_insts.last().append(trappingInst(m_value, kind, m_value, std::forward<Arguments>(arguments)...)); 1163 1168 } 1164 1169 … … 1255 1260 case ValueRep::StackArgument: 1256 1261 arg = Arg::callArg(value.rep().offsetFromSP()); 1257 append Store(moveForType(value.value()->type()), value.value(), arg);1262 append(trappingInst(m_value, createStore(moveForType(value.value()->type()), value.value(), arg))); 1258 1263 break; 1259 1264 default: … … 2415 2420 case Load: { 2416 2421 MemoryValue* memory = m_value->as<MemoryValue>(); 2417 Air:: Opcode opcode = Air::Oops;2422 Air::Kind kind = moveForType(memory->type()); 2418 2423 if (memory->hasFence()) { 2419 switch (memory->type()) { 2420 case Int32: 2421 opcode = LoadAcq32; 2422 break; 2423 case Int64: 2424 opcode = LoadAcq64; 2425 break; 2426 default: 2427 RELEASE_ASSERT_NOT_REACHED(); 2428 break; 2429 } 2430 } else 2431 opcode = moveForType(memory->type()); 2432 append(trappingInst(m_value, opcode, m_value, addr(m_value), tmp(m_value))); 2424 if (isX86()) 2425 kind.effects = true; 2426 else { 2427 switch (memory->type()) { 2428 case Int32: 2429 kind = LoadAcq32; 2430 break; 2431 case Int64: 2432 kind = LoadAcq64; 2433 break; 2434 default: 2435 RELEASE_ASSERT_NOT_REACHED(); 2436 break; 2437 } 2438 } 2439 } 2440 append(trappingInst(m_value, kind, m_value, addr(m_value), tmp(m_value))); 2433 2441 return; 2434 2442 } 2435 2443 2436 2444 case Load8S: { 2437 Air::Opcode opcode = m_value->as<MemoryValue>()->hasFence() ? LoadAcq8SignedExtendTo32 : Load8SignedExtendTo32; 2438 append(trappingInst(m_value, opcode, m_value, addr(m_value), tmp(m_value))); 2445 Air::Kind kind = Load8SignedExtendTo32; 2446 if (m_value->as<MemoryValue>()->hasFence()) { 2447 if (isX86()) 2448 kind.effects = true; 2449 else 2450 kind = LoadAcq8SignedExtendTo32; 2451 } 2452 append(trappingInst(m_value, kind, m_value, addr(m_value), tmp(m_value))); 2439 2453 return; 2440 2454 } 2441 2455 2442 2456 case Load8Z: { 2443 Air::Opcode opcode = m_value->as<MemoryValue>()->hasFence() ? LoadAcq8 : Load8; 2444 append(trappingInst(m_value, opcode, m_value, addr(m_value), tmp(m_value))); 2457 Air::Kind kind = Load8; 2458 if (m_value->as<MemoryValue>()->hasFence()) { 2459 if (isX86()) 2460 kind.effects = true; 2461 else 2462 kind = LoadAcq8; 2463 } 2464 append(trappingInst(m_value, kind, m_value, addr(m_value), tmp(m_value))); 2445 2465 return; 2446 2466 } 2447 2467 2448 2468 case Load16S: { 2449 Air::Opcode opcode = m_value->as<MemoryValue>()->hasFence() ? LoadAcq16SignedExtendTo32 : Load16SignedExtendTo32; 2450 append(trappingInst(m_value, opcode, m_value, addr(m_value), tmp(m_value))); 2469 Air::Kind kind = Load16SignedExtendTo32; 2470 if (m_value->as<MemoryValue>()->hasFence()) { 2471 if (isX86()) 2472 kind.effects = true; 2473 else 2474 kind = LoadAcq16SignedExtendTo32; 2475 } 2476 append(trappingInst(m_value, kind, m_value, addr(m_value), tmp(m_value))); 2451 2477 return; 2452 2478 } 2453 2479 2454 2480 case Load16Z: { 2455 Air::Opcode opcode = m_value->as<MemoryValue>()->hasFence() ? LoadAcq16 : Load16; 2456 append(trappingInst(m_value, opcode, m_value, addr(m_value), tmp(m_value))); 2481 Air::Kind kind = Load16; 2482 if (m_value->as<MemoryValue>()->hasFence()) { 2483 if (isX86()) 2484 kind.effects = true; 2485 else 2486 kind = LoadAcq16; 2487 } 2488 append(trappingInst(m_value, kind, m_value, addr(m_value), tmp(m_value))); 2457 2489 return; 2458 2490 }
Note:
See TracChangeset
for help on using the changeset viewer.