Add rest of the bitwise operations to library
This commit is contained in:
		
							parent
							
								
									49084ea0af
								
							
						
					
					
						commit
						d06eff9347
					
				| @ -410,6 +410,8 @@ impl Builder { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 Instr::And(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), |                 Instr::And(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||||
|  |                 Instr::Or(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||||
|  |                 Instr::XOr(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||||
|                 Instr::ICmp(_, lhs, rhs) => { |                 Instr::ICmp(_, lhs, rhs) => { | ||||||
|                     let t = match_types(&lhs, &rhs, self)?; |                     let t = match_types(&lhs, &rhs, self)?; | ||||||
|                     if t.category().comparable() || !t.category().integer() { |                     if t.category().comparable() || !t.category().integer() { | ||||||
| @ -528,6 +530,30 @@ impl Builder { | |||||||
|                 Instr::PtrToInt(instr, ty) => instr.cast_to(self, &ty).map(|_| ()), |                 Instr::PtrToInt(instr, ty) => instr.cast_to(self, &ty).map(|_| ()), | ||||||
|                 Instr::IntToPtr(instr, ty) => instr.cast_to(self, &ty).map(|_| ()), |                 Instr::IntToPtr(instr, ty) => instr.cast_to(self, &ty).map(|_| ()), | ||||||
|                 Instr::BitCast(..) => Ok(()), |                 Instr::BitCast(..) => Ok(()), | ||||||
|  |                 Instr::ShiftRightLogical(_, rhs) => { | ||||||
|  |                     let rhs_ty = rhs.get_type(&self)?; | ||||||
|  |                     if rhs_ty.category() == TypeCategory::UnsignedInteger { | ||||||
|  |                         Ok(()) | ||||||
|  |                     } else { | ||||||
|  |                         Err(ErrorKind::Null) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 Instr::ShiftRightArithmetic(_, rhs) => { | ||||||
|  |                     let rhs_ty = rhs.get_type(&self)?; | ||||||
|  |                     if rhs_ty.category() == TypeCategory::UnsignedInteger { | ||||||
|  |                         Ok(()) | ||||||
|  |                     } else { | ||||||
|  |                         Err(ErrorKind::Null) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 Instr::ShiftLeft(_, rhs) => { | ||||||
|  |                     let rhs_ty = rhs.get_type(&self)?; | ||||||
|  |                     if rhs_ty.category() == TypeCategory::UnsignedInteger { | ||||||
|  |                         Ok(()) | ||||||
|  |                     } else { | ||||||
|  |                         Err(ErrorKind::Null) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -614,6 +640,8 @@ impl InstructionValue { | |||||||
|                 SRem(lhs, rhs) => match_types(lhs, rhs, &builder), |                 SRem(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||||
|                 FRem(lhs, rhs) => match_types(lhs, rhs, &builder), |                 FRem(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||||
|                 And(lhs, rhs) => match_types(lhs, rhs, &builder), |                 And(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||||
|  |                 Or(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||||
|  |                 XOr(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||||
|                 ICmp(_, _, _) => Ok(Type::Bool), |                 ICmp(_, _, _) => Ok(Type::Bool), | ||||||
|                 FCmp(_, _, _) => Ok(Type::Bool), |                 FCmp(_, _, _) => Ok(Type::Bool), | ||||||
|                 FunctionCall(function_value, _) => Ok(builder.function_data(function_value).ret), |                 FunctionCall(function_value, _) => Ok(builder.function_data(function_value).ret), | ||||||
| @ -674,6 +702,9 @@ impl InstructionValue { | |||||||
|                 PtrToInt(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()), |                 PtrToInt(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()), | ||||||
|                 IntToPtr(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()), |                 IntToPtr(instr, ty) => instr.cast_to(builder, ty).map(|_| ty.clone()), | ||||||
|                 BitCast(_, ty) => Ok(ty.clone()), |                 BitCast(_, ty) => Ok(ty.clone()), | ||||||
|  |                 ShiftRightLogical(lhs, _) => lhs.get_type(builder), | ||||||
|  |                 ShiftRightArithmetic(lhs, _) => lhs.get_type(builder), | ||||||
|  |                 ShiftLeft(lhs, _) => lhs.get_type(builder), | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -975,6 +975,11 @@ impl InstructionHolder { | |||||||
|                     ty.as_llvm(module.context_ref, &module.types), |                     ty.as_llvm(module.context_ref, &module.types), | ||||||
|                     name.as_ptr(), |                     name.as_ptr(), | ||||||
|                 ), |                 ), | ||||||
|  |                 Or(instruction_value, instruction_value1) => todo!(), | ||||||
|  |                 XOr(instruction_value, instruction_value1) => todo!(), | ||||||
|  |                 ShiftRightLogical(instruction_value, instruction_value1) => todo!(), | ||||||
|  |                 ShiftRightArithmetic(instruction_value, instruction_value1) => todo!(), | ||||||
|  |                 ShiftLeft(instruction_value, instruction_value1) => todo!(), | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|         if let Some(record) = &self.record { |         if let Some(record) = &self.record { | ||||||
|  | |||||||
| @ -9,10 +9,10 @@ use crate::{ | |||||||
|     CmpPredicate, Context, Instr, InstructionData, TerminatorKind, |     CmpPredicate, Context, Instr, InstructionData, TerminatorKind, | ||||||
|     builder::*, |     builder::*, | ||||||
|     debug_information::{ |     debug_information::{ | ||||||
|         DebugArrayType, DebugBasicType, DebugFieldType, DebugInformation, DebugLocalVariable, |         DebugArrayType, DebugBasicType, DebugFieldType, DebugInformation, DebugLocalVariable, DebugLocation, | ||||||
|         DebugLocation, DebugLocationValue, DebugMetadata, DebugMetadataValue, DebugParamVariable, |         DebugLocationValue, DebugMetadata, DebugMetadataValue, DebugParamVariable, DebugPointerType, DebugPosition, | ||||||
|         DebugPointerType, DebugPosition, DebugProgramValue, DebugRecordKind, DebugScopeValue, |         DebugProgramValue, DebugRecordKind, DebugScopeValue, DebugStructType, DebugSubprogramType, DebugTypeData, | ||||||
|         DebugStructType, DebugSubprogramType, DebugTypeData, DebugTypeHolder, DebugTypeValue, |         DebugTypeHolder, DebugTypeValue, | ||||||
|     }, |     }, | ||||||
|     pad_adapter::PadAdapter, |     pad_adapter::PadAdapter, | ||||||
| }; | }; | ||||||
| @ -68,11 +68,7 @@ impl FunctionHolder { | |||||||
|             .map(|p| format!("{:?}", p)) |             .map(|p| format!("{:?}", p)) | ||||||
|             .collect::<Vec<_>>() |             .collect::<Vec<_>>() | ||||||
|             .join(", "); |             .join(", "); | ||||||
|         write!( |         write!(f, "fn {}({}) -> {:?} ", self.data.name, params, self.data.ret)?; | ||||||
|             f, |  | ||||||
|             "fn {}({}) -> {:?} ", |  | ||||||
|             self.data.name, params, self.data.ret |  | ||||||
|         )?; |  | ||||||
| 
 | 
 | ||||||
|         writeln!(f, "{{")?; |         writeln!(f, "{{")?; | ||||||
|         let mut state = Default::default(); |         let mut state = Default::default(); | ||||||
| @ -116,11 +112,7 @@ impl BlockHolder { | |||||||
|             terminator.builder_fmt(&mut inner, builder, debug)?; |             terminator.builder_fmt(&mut inner, builder, debug)?; | ||||||
|         } |         } | ||||||
|         if let Some(location) = self.data.terminator_location { |         if let Some(location) = self.data.terminator_location { | ||||||
|             writeln!( |             writeln!(inner, "  ^  (At {}) ", debug.as_ref().unwrap().get_location(location))?; | ||||||
|                 inner, |  | ||||||
|                 "  ^  (At {}) ", |  | ||||||
|                 debug.as_ref().unwrap().get_location(location) |  | ||||||
|             )?; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Ok(()) |         Ok(()) | ||||||
| @ -148,11 +140,7 @@ impl InstructionHolder { | |||||||
|                 writeln!(f, "  (Debug {} {})", record.variable.hr(debug), kind)?; |                 writeln!(f, "  (Debug {} {})", record.variable.hr(debug), kind)?; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         writeln!( |         writeln!(f, "{:?} ({}) = {:?} ", self.value, self.name, self.data.kind)?; | ||||||
|             f, |  | ||||||
|             "{:?} ({}) = {:?} ", |  | ||||||
|             self.value, self.name, self.data.kind |  | ||||||
|         )?; |  | ||||||
|         if let Some(debug) = debug { |         if let Some(debug) = debug { | ||||||
|             if let Some(location) = self.data.location { |             if let Some(location) = self.data.location { | ||||||
|                 writeln!(f, "  ^  (At {}) ", debug.get_location(location))?; |                 writeln!(f, "  ^  (At {}) ", debug.get_location(location))?; | ||||||
| @ -188,9 +176,9 @@ impl TerminatorKind { | |||||||
| impl DebugMetadataValue { | impl DebugMetadataValue { | ||||||
|     fn hr(&self, debug: &DebugInformation) -> String { |     fn hr(&self, debug: &DebugInformation) -> String { | ||||||
|         let kind = match debug.get_metadata(*self) { |         let kind = match debug.get_metadata(*self) { | ||||||
|             DebugMetadata::ParamVar(DebugParamVariable { |             DebugMetadata::ParamVar(DebugParamVariable { name, arg_idx, ty, .. }) => { | ||||||
|                 name, arg_idx, ty, .. |                 format!("param {} (idx {}) (type {:?}) ", name, arg_idx, ty) | ||||||
|             }) => format!("param {} (idx {}) (type {:?}) ", name, arg_idx, ty), |             } | ||||||
|             DebugMetadata::LocalVar(DebugLocalVariable { name, ty, .. }) => { |             DebugMetadata::LocalVar(DebugLocalVariable { name, ty, .. }) => { | ||||||
|                 format!("var {} (type {:?}) ", name, ty) |                 format!("var {} (type {:?}) ", name, ty) | ||||||
|             } |             } | ||||||
| @ -253,14 +241,11 @@ impl Debug for FunctionHolder { | |||||||
| impl Debug for BlockHolder { | impl Debug for BlockHolder { | ||||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||||
|         let deleted = if self.data.deleted { " (deleted)" } else { "" }; |         let deleted = if self.data.deleted { " (deleted)" } else { "" }; | ||||||
|         f.debug_tuple(&format!( |         f.debug_tuple(&format!("{}[{:?}]{} ", &self.data.name, &self.value, deleted)) | ||||||
|             "{}[{:?}]{} ", |             .field(&self.instructions) | ||||||
|             &self.data.name, &self.value, deleted |             .field(&self.data.terminator) | ||||||
|         )) |             .field(&self.data.terminator_location) | ||||||
|         .field(&self.instructions) |             .finish() | ||||||
|         .field(&self.data.terminator) |  | ||||||
|         .field(&self.data.terminator_location) |  | ||||||
|         .finish() |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -303,11 +288,7 @@ impl Debug for BlockValue { | |||||||
| 
 | 
 | ||||||
| impl Debug for InstructionValue { | impl Debug for InstructionValue { | ||||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||||
|         write!( |         write!(f, "%{}.{}.{}.{}", self.0.0.0.0, self.0.0.1, self.0.1, self.1) | ||||||
|             f, |  | ||||||
|             "%{}.{}.{}.{}", |  | ||||||
|             self.0.0.0.0, self.0.0.1, self.0.1, self.1 |  | ||||||
|         ) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -369,9 +350,7 @@ impl Debug for Instr { | |||||||
|                 fmt_index(f, instruction_value, &index.to_string())?; |                 fmt_index(f, instruction_value, &index.to_string())?; | ||||||
|                 write!(f, ")") |                 write!(f, ")") | ||||||
|             } |             } | ||||||
|             Instr::ExtractValue(instruction_value, index) => { |             Instr::ExtractValue(instruction_value, index) => fmt_index(f, instruction_value, &index.to_string()), | ||||||
|                 fmt_index(f, instruction_value, &index.to_string()) |  | ||||||
|             } |  | ||||||
|             Instr::Trunc(instr_val, ty) => { |             Instr::Trunc(instr_val, ty) => { | ||||||
|                 write!(f, "{:?} to {:?} ({})", instr_val, ty, self.default_name()) |                 write!(f, "{:?} to {:?} ({})", instr_val, ty, self.default_name()) | ||||||
|             } |             } | ||||||
| @ -408,6 +387,11 @@ impl Debug for Instr { | |||||||
|             Instr::BitCast(instr_val, ty) => { |             Instr::BitCast(instr_val, ty) => { | ||||||
|                 write!(f, "{:?} to {:?} ({})", instr_val, ty, self.default_name()) |                 write!(f, "{:?} to {:?} ({})", instr_val, ty, self.default_name()) | ||||||
|             } |             } | ||||||
|  |             Instr::Or(lhs, rhs) => fmt_binop(f, lhs, &"||", rhs), | ||||||
|  |             Instr::XOr(lhs, rhs) => fmt_binop(f, lhs, &"^", rhs), | ||||||
|  |             Instr::ShiftRightLogical(lhs, rhs) => fmt_binop(f, lhs, &">>l", rhs), | ||||||
|  |             Instr::ShiftRightArithmetic(lhs, rhs) => fmt_binop(f, lhs, &">>a", rhs), | ||||||
|  |             Instr::ShiftLeft(lhs, rhs) => fmt_binop(f, lhs, &"<<", rhs), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -579,11 +563,7 @@ impl Debug for DebugScopeValue { | |||||||
|         write!( |         write!( | ||||||
|             f, |             f, | ||||||
|             "Scope[{}]", |             "Scope[{}]", | ||||||
|             self.0 |             self.0.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(", ") | ||||||
|                 .iter() |  | ||||||
|                 .map(|v| v.to_string()) |  | ||||||
|                 .collect::<Vec<_>>() |  | ||||||
|                 .join(", ") |  | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -251,6 +251,11 @@ impl Instr { | |||||||
|             Instr::PtrToInt(_, _) => "ptrtoint", |             Instr::PtrToInt(_, _) => "ptrtoint", | ||||||
|             Instr::IntToPtr(_, _) => "inttoptr", |             Instr::IntToPtr(_, _) => "inttoptr", | ||||||
|             Instr::BitCast(_, _) => "bitcast", |             Instr::BitCast(_, _) => "bitcast", | ||||||
|  |             Instr::Or(..) => "or", | ||||||
|  |             Instr::XOr(..) => "xor", | ||||||
|  |             Instr::ShiftRightLogical(..) => "lshr", | ||||||
|  |             Instr::ShiftRightArithmetic(..) => "ashr", | ||||||
|  |             Instr::ShiftLeft(..) => "shl", | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -369,7 +374,14 @@ pub enum Instr { | |||||||
|     SRem(InstructionValue, InstructionValue), |     SRem(InstructionValue, InstructionValue), | ||||||
|     /// Get the remainder from two floats
 |     /// Get the remainder from two floats
 | ||||||
|     FRem(InstructionValue, InstructionValue), |     FRem(InstructionValue, InstructionValue), | ||||||
|  | 
 | ||||||
|     And(InstructionValue, InstructionValue), |     And(InstructionValue, InstructionValue), | ||||||
|  |     Or(InstructionValue, InstructionValue), | ||||||
|  |     XOr(InstructionValue, InstructionValue), | ||||||
|  |     ShiftRightLogical(InstructionValue, InstructionValue), | ||||||
|  |     ShiftRightArithmetic(InstructionValue, InstructionValue), | ||||||
|  |     ShiftLeft(InstructionValue, InstructionValue), | ||||||
|  | 
 | ||||||
|     Phi(Vec<InstructionValue>), |     Phi(Vec<InstructionValue>), | ||||||
| 
 | 
 | ||||||
|     Alloca(Type), |     Alloca(Type), | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user