Example #1
0
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* ) {}
                   )
               );
    }
}