Changeset 112192 in webkit for trunk/Source/JavaScriptCore
- Timestamp:
- Mar 26, 2012, 7:03:47 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r112177 r112192 1 2012-03-26 Thouraya ANDOLSI <[email protected]> 2 3 Unaligned userspace access for SH4 platforms 4 https://bugs.webkit.org/show_bug.cgi?id=79104 5 6 Reviewed by Gavin Barraclough. 7 8 * assembler/AbstractMacroAssembler.h: 9 (Jump): 10 (JSC::AbstractMacroAssembler::Jump::Jump): 11 (JSC::AbstractMacroAssembler::Jump::link): 12 * assembler/MacroAssemblerSH4.h: 13 (JSC::MacroAssemblerSH4::load16Unaligned): 14 (JSC::MacroAssemblerSH4::load32WithUnalignedHalfWords): 15 (JSC::MacroAssemblerSH4::branchDouble): 16 (JSC::MacroAssemblerSH4::branchTrue): 17 (JSC::MacroAssemblerSH4::branchFalse): 18 * assembler/SH4Assembler.h: 19 (JSC::SH4Assembler::extraInstrForBranch): 20 (SH4Assembler): 21 (JSC::SH4Assembler::bra): 22 (JSC::SH4Assembler::linkJump): 23 * jit/JIT.h: 24 (JIT): 25 * yarr/YarrJIT.cpp: 26 (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce): 27 1 28 2012-03-26 Ryosuke Niwa <[email protected]> 2 29 -
trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
r110206 r112192 451 451 { 452 452 } 453 #elif CPU(SH4) 454 Jump(AssemblerLabel jmp, SH4Assembler::JumpType type = SH4Assembler::JumpFar) 455 : m_label(jmp) 456 , m_type(type) 457 { 458 } 453 459 #else 454 460 Jump(AssemblerLabel jmp) … … 462 468 #if CPU(ARM_THUMB2) 463 469 masm->m_assembler.linkJump(m_label, masm->m_assembler.label(), m_type, m_condition); 470 #elif CPU(SH4) 471 masm->m_assembler.linkJump(m_label, masm->m_assembler.label(), m_type); 464 472 #else 465 473 masm->m_assembler.linkJump(m_label, masm->m_assembler.label()); … … 483 491 ARMv7Assembler::JumpType m_type; 484 492 ARMv7Assembler::Condition m_condition; 493 #endif 494 #if CPU(SH4) 495 SH4Assembler::JumpType m_type; 485 496 #endif 486 497 }; -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
r110289 r112192 682 682 add32(TrustedImm32(1), scr); 683 683 load8(scr, dest); 684 move(TrustedImm32(8), scr); 685 m_assembler.shllRegReg(dest, scr); 684 m_assembler.shllImm8r(8, dest); 686 685 or32(scr1, dest); 687 686 … … 943 942 { 944 943 RegisterID scr = claimScratch(); 944 RegisterID scr1 = claimScratch(); 945 Jump m_jump; 946 JumpList end; 947 948 if (dest != SH4Registers::r0) 949 move(SH4Registers::r0, scr1); 945 950 946 951 move(address.index, scr); … … 951 956 add32(TrustedImm32(address.offset), scr); 952 957 953 RegisterID scr1 = claimScratch(); 958 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 68, sizeof(uint32_t)); 959 move(scr, SH4Registers::r0); 960 m_assembler.andlImm8r(0x3, SH4Registers::r0); 961 m_assembler.cmpEqImmR0(0x0, SH4Registers::r0); 962 m_jump = Jump(m_assembler.jne(), SH4Assembler::JumpNear); 963 if (dest != SH4Registers::r0) 964 move(scr1, SH4Registers::r0); 965 966 load32(scr, dest); 967 end.append(Jump(m_assembler.bra(), SH4Assembler::JumpNear)); 968 m_assembler.nop(); 969 m_jump.link(this); 970 m_assembler.andlImm8r(0x1, SH4Registers::r0); 971 m_assembler.cmpEqImmR0(0x0, SH4Registers::r0); 972 973 if (dest != SH4Registers::r0) 974 move(scr1, SH4Registers::r0); 975 976 m_jump = Jump(m_assembler.jne(), SH4Assembler::JumpNear); 954 977 load16(scr, scr1); 955 978 add32(TrustedImm32(2), scr); 956 979 load16(scr, dest); 957 move(TrustedImm32(16), scr); 958 m_assembler.shllRegReg(dest, scr); 980 m_assembler.shllImm8r(16, dest); 959 981 or32(scr1, dest); 982 end.append(Jump(m_assembler.bra(), SH4Assembler::JumpNear)); 983 m_assembler.nop(); 984 m_jump.link(this); 985 load8(scr, scr1); 986 add32(TrustedImm32(1), scr); 987 load16(scr, dest); 988 m_assembler.shllImm8r(8, dest); 989 or32(dest, scr1); 990 add32(TrustedImm32(2), scr); 991 load8(scr, dest); 992 m_assembler.shllImm8r(8, dest); 993 m_assembler.shllImm8r(16, dest); 994 or32(scr1, dest); 995 end.link(this); 960 996 961 997 releaseScratch(scr); … … 1000 1036 if (cond == DoubleNotEqual) { 1001 1037 RegisterID scr = claimScratch(); 1038 JumpList end; 1002 1039 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1003 1040 m_assembler.dcnvds(right); … … 1005 1042 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1006 1043 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1007 m_assembler.branch(BT_OPCODE, 8);1044 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1008 1045 m_assembler.dcnvds(left); 1009 1046 m_assembler.stsfpulReg(scr); 1010 1047 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1011 m_assembler.branch(BT_OPCODE, 4);1048 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1012 1049 m_assembler.dcmppeq(right, left); 1013 1050 releaseScratch(scr); 1014 return branchFalse(); 1051 Jump m_jump = branchFalse(); 1052 end.link(this); 1053 return m_jump; 1015 1054 } 1016 1055 … … 1037 1076 if (cond == DoubleEqualOrUnordered) { 1038 1077 RegisterID scr = claimScratch(); 1078 JumpList end; 1039 1079 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1040 1080 m_assembler.dcnvds(right); … … 1042 1082 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1043 1083 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1044 m_assembler.branch(BT_OPCODE, 5);1084 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1045 1085 m_assembler.dcnvds(left); 1046 1086 m_assembler.stsfpulReg(scr); 1047 1087 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1048 m_assembler.branch(BT_OPCODE, 1);1088 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1049 1089 m_assembler.dcmppeq(left, right); 1090 Jump m_jump = Jump(m_assembler.je()); 1091 end.link(this); 1092 m_assembler.extraInstrForBranch(scr); 1050 1093 releaseScratch(scr); 1051 return branchTrue();1094 return m_jump; 1052 1095 } 1053 1096 1054 1097 if (cond == DoubleGreaterThanOrUnordered) { 1055 1098 RegisterID scr = claimScratch(); 1099 JumpList end; 1056 1100 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1057 1101 m_assembler.dcnvds(right); … … 1059 1103 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1060 1104 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1061 m_assembler.branch(BT_OPCODE, 5);1105 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1062 1106 m_assembler.dcnvds(left); 1063 1107 m_assembler.stsfpulReg(scr); 1064 1108 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1065 m_assembler.branch(BT_OPCODE, 1);1109 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1066 1110 m_assembler.dcmppgt(right, left); 1111 Jump m_jump = Jump(m_assembler.je()); 1112 end.link(this); 1113 m_assembler.extraInstrForBranch(scr); 1067 1114 releaseScratch(scr); 1068 return branchTrue();1115 return m_jump; 1069 1116 } 1070 1117 1071 1118 if (cond == DoubleGreaterThanOrEqualOrUnordered) { 1072 1119 RegisterID scr = claimScratch(); 1120 JumpList end; 1073 1121 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1074 1122 m_assembler.dcnvds(right); … … 1076 1124 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1077 1125 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1078 m_assembler.branch(BT_OPCODE, 5);1126 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1079 1127 m_assembler.dcnvds(left); 1080 1128 m_assembler.stsfpulReg(scr); 1081 1129 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1082 m_assembler.branch(BT_OPCODE, 1);1130 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1083 1131 m_assembler.dcmppgt(left, right); 1132 Jump m_jump = Jump(m_assembler.jne()); 1133 end.link(this); 1134 m_assembler.extraInstrForBranch(scr); 1084 1135 releaseScratch(scr); 1085 return branchFalse();1136 return m_jump; 1086 1137 } 1087 1138 1088 1139 if (cond == DoubleLessThanOrUnordered) { 1089 1140 RegisterID scr = claimScratch(); 1141 JumpList end; 1090 1142 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1091 1143 m_assembler.dcnvds(right); … … 1093 1145 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1094 1146 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1095 m_assembler.branch(BT_OPCODE, 5);1147 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1096 1148 m_assembler.dcnvds(left); 1097 1149 m_assembler.stsfpulReg(scr); 1098 1150 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1099 m_assembler.branch(BT_OPCODE, 1);1151 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1100 1152 m_assembler.dcmppgt(left, right); 1153 Jump m_jump = Jump(m_assembler.je()); 1154 end.link(this); 1155 m_assembler.extraInstrForBranch(scr); 1101 1156 releaseScratch(scr); 1102 return branchTrue();1157 return m_jump; 1103 1158 } 1104 1159 1105 1160 if (cond == DoubleLessThanOrEqualOrUnordered) { 1106 1161 RegisterID scr = claimScratch(); 1162 JumpList end; 1107 1163 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1108 1164 m_assembler.dcnvds(right); … … 1110 1166 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1111 1167 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1112 m_assembler.branch(BT_OPCODE, 5);1168 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1113 1169 m_assembler.dcnvds(left); 1114 1170 m_assembler.stsfpulReg(scr); 1115 1171 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1116 m_assembler.branch(BT_OPCODE, 1);1172 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1117 1173 m_assembler.dcmppgt(right, left); 1174 Jump m_jump = Jump(m_assembler.jne()); 1175 end.link(this); 1176 m_assembler.extraInstrForBranch(scr); 1118 1177 releaseScratch(scr); 1119 return branchFalse();1178 return m_jump; 1120 1179 } 1121 1180 1122 1181 ASSERT(cond == DoubleNotEqualOrUnordered); 1123 1182 RegisterID scr = claimScratch(); 1183 JumpList end; 1124 1184 m_assembler.loadConstant(0x7fbfffff, scratchReg3); 1125 1185 m_assembler.dcnvds(right); … … 1127 1187 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1128 1188 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); 1129 m_assembler.branch(BT_OPCODE, 5);1189 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1130 1190 m_assembler.dcnvds(left); 1131 1191 m_assembler.stsfpulReg(scr); 1132 1192 m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); 1133 m_assembler.branch(BT_OPCODE, 1);1193 end.append(Jump(m_assembler.je(), SH4Assembler::JumpNear)); 1134 1194 m_assembler.dcmppeq(right, left); 1135 releaseScratch(scr); 1136 return branchFalse(); 1195 Jump m_jump = Jump(m_assembler.jne()); 1196 end.link(this); 1197 m_assembler.extraInstrForBranch(scr); 1198 releaseScratch(scr); 1199 return m_jump; 1137 1200 } 1138 1201 … … 1141 1204 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 6, sizeof(uint32_t)); 1142 1205 Jump m_jump = Jump(m_assembler.je()); 1143 m_assembler.loadConstantUnReusable(0x0, scratchReg3); 1144 m_assembler.nop(); 1145 m_assembler.nop(); 1206 m_assembler.extraInstrForBranch(scratchReg3); 1146 1207 return m_jump; 1147 1208 } … … 1151 1212 m_assembler.ensureSpace(m_assembler.maxInstructionSize + 6, sizeof(uint32_t)); 1152 1213 Jump m_jump = Jump(m_assembler.jne()); 1153 m_assembler.loadConstantUnReusable(0x0, scratchReg3); 1154 m_assembler.nop(); 1155 m_assembler.nop(); 1214 m_assembler.extraInstrForBranch(scratchReg3); 1156 1215 return m_jump; 1157 1216 } -
trunk/Source/JavaScriptCore/assembler/SH4Assembler.h
r109307 r112192 327 327 }; 328 328 329 enum JumpType { JumpFar, 330 JumpNear 331 }; 332 329 333 SH4Assembler() 330 334 { … … 1189 1193 } 1190 1194 1195 void extraInstrForBranch(RegisterID dst) 1196 { 1197 loadConstantUnReusable(0x0, dst); 1198 nop(); 1199 nop(); 1200 } 1201 1191 1202 AssemblerLabel jmp(RegisterID dst) 1192 1203 { … … 1213 1224 AssemblerLabel label = m_buffer.label(); 1214 1225 branch(BT_OPCODE, 0); 1226 return label; 1227 } 1228 1229 AssemblerLabel bra() 1230 { 1231 AssemblerLabel label = m_buffer.label(); 1232 branch(BRA_OPCODE, 0); 1215 1233 return label; 1216 1234 } … … 1425 1443 // Linking & patching 1426 1444 1427 void linkJump(AssemblerLabel from, AssemblerLabel to )1445 void linkJump(AssemblerLabel from, AssemblerLabel to, JumpType type = JumpFar) 1428 1446 { 1429 1447 ASSERT(to.isSet()); … … 1433 1451 uint16_t instruction = *instructionPtr; 1434 1452 int offsetBits; 1453 1454 if (type == JumpNear) { 1455 ASSERT((instruction == BT_OPCODE) || (instruction == BF_OPCODE) || (instruction == BRA_OPCODE)); 1456 int offset = (codeSize() - from.m_offset) - 4; 1457 *instructionPtr++ = instruction | (offset >> 1); 1458 printInstr(*instructionPtr, from.m_offset + 2); 1459 return; 1460 } 1435 1461 1436 1462 if (((instruction & 0xff00) == BT_OPCODE) || ((instruction & 0xff00) == BF_OPCODE)) { -
trunk/Source/JavaScriptCore/jit/JIT.h
r112011 r112192 553 553 static const int sequenceGetByIdHotPathConstantSpace = 5; 554 554 // sequenceGetByIdSlowCase 555 static const int sequenceGetByIdSlowCaseInstructionSpace = 3 0;556 static const int sequenceGetByIdSlowCaseConstantSpace = 3;555 static const int sequenceGetByIdSlowCaseInstructionSpace = 38; 556 static const int sequenceGetByIdSlowCaseConstantSpace = 4; 557 557 // sequencePutById 558 558 static const int sequencePutByIdInstructionSpace = 36; … … 568 568 static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE 569 569 #else 570 static const int patchOffsetGetByIdSlowCaseCall = 26;570 static const int patchOffsetGetByIdSlowCaseCall = 34; 571 571 #endif 572 572 static const int patchOffsetOpCallCompareToJump = 4; -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r112143 r112192 730 730 case 2: { 731 731 BaseIndex address(input, index, TimesOne, (startTermPosition - m_checked) * sizeof(LChar)); 732 load16 (address, character);732 load16Unaligned(address, character); 733 733 break; 734 734 } 735 735 case 3: { 736 736 BaseIndex highAddress(input, index, TimesOne, (startTermPosition - m_checked) * sizeof(LChar)); 737 load16 (highAddress, character);737 load16Unaligned(highAddress, character); 738 738 if (ignoreCaseMask) 739 739 or32(Imm32(ignoreCaseMask), character);
Note:
See TracChangeset
for help on using the changeset viewer.