| let typeCases = [ |
| "1", |
| "Math.PI", |
| "NaN", |
| "undefined", |
| "null", |
| "true", |
| "false", |
| ]; |
| |
| let operators = ["<", "<=", ">", ">=", "==", "!=", "===", "!=="]; |
| |
| function opaqueSideEffect() |
| { |
| } |
| noInline(opaqueSideEffect); |
| |
| let testCaseIndex = 0; |
| for (let operator of operators) { |
| eval(` |
| function testPolymorphic(a, b) { |
| if (a ${operator} b) { |
| opaqueSideEffect() |
| return true; |
| } |
| return false; |
| } |
| noInline(testPolymorphic)`); |
| |
| for (let left of typeCases) { |
| for (let right of typeCases) { |
| let llintResult = eval(left + operator + right); |
| eval(` |
| function testMonomorphic${testCaseIndex}(a, b) { |
| if (a ${operator} b) { |
| opaqueSideEffect() |
| return true; |
| } |
| return false; |
| } |
| noInline(testMonomorphic${testCaseIndex}); |
| |
| function testMonomorphicLeftConstant${testCaseIndex}(b) { |
| if (${left} ${operator} b) { |
| opaqueSideEffect() |
| return true; |
| } |
| return false; |
| } |
| noInline(testMonomorphicLeftConstant${testCaseIndex}); |
| |
| function testMonomorphicRightConstant${testCaseIndex}(a) { |
| if (a ${operator} ${right}) { |
| opaqueSideEffect() |
| return true; |
| } |
| return false; |
| } |
| noInline(testMonomorphicRightConstant${testCaseIndex}); |
| |
| for (let i = 0; i < 500; ++i) { |
| if (testMonomorphic${testCaseIndex}(${left}, ${right}) != ${llintResult}) |
| throw "Failed testMonomorphic${testCaseIndex}(${left}, ${right})"; |
| if (testMonomorphicLeftConstant${testCaseIndex}(${right}) != ${llintResult}) |
| throw "Failed testMonomorphicLeftConstant${testCaseIndex}(${right})"; |
| if (testMonomorphicRightConstant${testCaseIndex}(${left}) != ${llintResult}) |
| throw "Failed testMonomorphicLeftConstant${testCaseIndex}(${left})"; |
| if (testPolymorphic(${left}, ${right}) !== ${llintResult}) |
| throw "Failed polymorphicVersion(${left})"; |
| } |
| `); |
| ++testCaseIndex; |
| } |
| } |
| } |