Add codegen for div and mod
This commit is contained in:
		
							parent
							
								
									b9459a19bb
								
							
						
					
					
						commit
						3a68154ae5
					
				| @ -659,17 +659,57 @@ impl mir::Expression { | |||||||
|                     (mir::BinaryOperator::And, _, _) => Instr::And(lhs, rhs), |                     (mir::BinaryOperator::And, _, _) => Instr::And(lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Cmp(i), _, false) => Instr::ICmp(i.predicate(), lhs, rhs), |                     (mir::BinaryOperator::Cmp(i), _, false) => Instr::ICmp(i.predicate(), lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Cmp(i), _, true) => Instr::FCmp(i.predicate(), lhs, rhs), |                     (mir::BinaryOperator::Cmp(i), _, true) => Instr::FCmp(i.predicate(), lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Div, true, true) => todo!(), |                     (mir::BinaryOperator::Div, false, false) => Instr::UDiv(lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Div, true, false) => todo!(), |                     (mir::BinaryOperator::Div, true, false) => Instr::SDiv(lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Div, false, true) => todo!(), |                     (mir::BinaryOperator::Div, _, true) => Instr::FDiv(lhs, rhs), | ||||||
|                     (mir::BinaryOperator::Div, false, false) => todo!(), |                     (mir::BinaryOperator::Mod, false, false) => { | ||||||
|                     (mir::BinaryOperator::Mod, true, true) => todo!(), |                         let div = scope | ||||||
|                     (mir::BinaryOperator::Mod, true, false) => todo!(), |                             .block | ||||||
|                     (mir::BinaryOperator::Mod, false, true) => todo!(), |                             .build(Instr::UDiv(lhs, rhs)) | ||||||
|                     (mir::BinaryOperator::Mod, false, false) => todo!(), |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         let mul = scope | ||||||
|  |                             .block | ||||||
|  |                             .build(Instr::Mul(rhs, div)) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         Instr::Sub(lhs, mul) | ||||||
|  |                     } | ||||||
|  |                     (mir::BinaryOperator::Mod, true, false) => { | ||||||
|  |                         let div = scope | ||||||
|  |                             .block | ||||||
|  |                             .build(Instr::SDiv(lhs, rhs)) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         let mul = scope | ||||||
|  |                             .block | ||||||
|  |                             .build(Instr::Mul(rhs, div)) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         Instr::Sub(lhs, mul) | ||||||
|  |                     } | ||||||
|  |                     (mir::BinaryOperator::Mod, _, true) => { | ||||||
|  |                         let div = scope | ||||||
|  |                             .block | ||||||
|  |                             .build(Instr::FDiv(lhs, rhs)) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         let mul = scope | ||||||
|  |                             .block | ||||||
|  |                             .build(Instr::Mul(rhs, div)) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location); | ||||||
|  |                         Instr::Sub(lhs, mul) | ||||||
|  |                     } | ||||||
|                 }; |                 }; | ||||||
|                 Some(StackValue( |                 Some(StackValue( | ||||||
|                     StackValueKind::Immutable(scope.block.build(instr).unwrap()), |                     StackValueKind::Immutable( | ||||||
|  |                         scope | ||||||
|  |                             .block | ||||||
|  |                             .build(instr) | ||||||
|  |                             .unwrap() | ||||||
|  |                             .maybe_location(&mut scope.block, location), | ||||||
|  |                     ), | ||||||
|                     lhs_type, |                     lhs_type, | ||||||
|                 )) |                 )) | ||||||
|             } |             } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user