expression modulus::generate( const expression &left, const expression &right ) const { const std::shared_ptr< llvm::LLVMContext > &context_ = context; if( type_traits::is_floating_point( left.type() ) ) { return expression( left.type(), left.llvm_type(), std::shared_ptr< llvm::Value >( ir_builder->CreateFRem( left.llvm_value().get(), right.llvm_value().get() ), [context_]( llvm::Value* ) {} ) ); } else if( type_traits::is_signed( left.type() ) ) { return expression( left.type(), left.llvm_type(), std::shared_ptr< llvm::Value >( ir_builder->CreateSRem( left.llvm_value().get(), right.llvm_value().get() ), [context_]( llvm::Value* ) {} ) ); } else { return expression( left.type(), left.llvm_type(), std::shared_ptr< llvm::Value >( ir_builder->CreateURem( left.llvm_value().get(), right.llvm_value().get() ), [context_]( llvm::Value* ) {} ) ); } }