(self, start_reg: Value, end_reg: Value, step: int)
| 1117 | """Generate optimized IR for a for loop over an integer range.""" |
| 1118 | |
| 1119 | def init(self, start_reg: Value, end_reg: Value, step: int) -> None: |
| 1120 | builder = self.builder |
| 1121 | self.start_reg = start_reg |
| 1122 | self.end_reg = end_reg |
| 1123 | self.step = step |
| 1124 | self.end_target = builder.maybe_spill(end_reg) |
| 1125 | if is_short_int_rprimitive(start_reg.type) and is_short_int_rprimitive(end_reg.type): |
| 1126 | index_type: RType = short_int_rprimitive |
| 1127 | elif is_fixed_width_rtype(end_reg.type): |
| 1128 | index_type = end_reg.type |
| 1129 | else: |
| 1130 | index_type = int_rprimitive |
| 1131 | index_reg = Register(index_type, line=self.line) |
| 1132 | builder.assign(index_reg, start_reg, self.line) |
| 1133 | self.index_reg = builder.maybe_spill_assignable(index_reg) |
| 1134 | # Initialize loop index to 0. Assert that the index target is assignable. |
| 1135 | self.index_target: Register | AssignmentTarget = builder.get_assignment_target(self.index) |
| 1136 | builder.assign(self.index_target, builder.read(self.index_reg, self.line), self.line) |
| 1137 | |
| 1138 | def gen_condition(self) -> None: |
| 1139 | builder = self.builder |
no test coverage detected