Skip to content

Commit 905eee2

Browse files
authored
[clang][CGBuiltin] Refactor __readdr
1 parent 99fcd98 commit 905eee2

File tree

1 file changed

+23
-105
lines changed

1 file changed

+23
-105
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

+23-105
Original file line numberDiff line numberDiff line change
@@ -16478,123 +16478,41 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
1647816478
return CI;
1647916479
}
1648016480
case X86::BI__readdr: {
16481-
BasicBlock *BB0 = createBasicBlock("BB0", this->CurFn);
16482-
BasicBlock *BB1 = createBasicBlock("BB1", this->CurFn);
16483-
BasicBlock *BB2 = createBasicBlock("BB2", this->CurFn);
16484-
BasicBlock *BB3 = createBasicBlock("BB3", this->CurFn);
16485-
BasicBlock *BB4 = createBasicBlock("BB4", this->CurFn);
16486-
BasicBlock *BB5 = createBasicBlock("BB5", this->CurFn);
16487-
BasicBlock *BB6 = createBasicBlock("BB6", this->CurFn);
16488-
BasicBlock *BB7 = createBasicBlock("BB7", this->CurFn);
16481+
BasicBlock *BBs[8];
16482+
for (int i = 0; i < 8; ++i) {
16483+
BBs[i] = createBasicBlock("BB" + std::to_string(i), this->CurFn);
16484+
}
1648916485
BasicBlock *BBDest = createBasicBlock("BBDest", this->CurFn);
1649016486
llvm::AllocaInst *AI = Builder.CreateAlloca(SizeTy);
1649116487
CharUnits CU = SizeTy->getBitWidth() == 32 ? CharUnits::fromQuantity(4)
1649216488
: CharUnits::fromQuantity(8);
1649316489
llvm::SwitchInst *SI = Builder.CreateSwitch(Ops[0], BBDest, 8);
16494-
SI->addCase(Builder.getInt32(0), BB0);
16495-
SI->addCase(Builder.getInt32(1), BB1);
16496-
SI->addCase(Builder.getInt32(2), BB2);
16497-
SI->addCase(Builder.getInt32(3), BB3);
16498-
SI->addCase(Builder.getInt32(4), BB4);
16499-
SI->addCase(Builder.getInt32(5), BB5);
16500-
SI->addCase(Builder.getInt32(6), BB6);
16501-
SI->addCase(Builder.getInt32(7), BB7);
16502-
Builder.SetInsertPoint(BB0);
16503-
{
16504-
llvm::StringRef AsmStr =
16505-
SizeTy->getBitWidth() == 32 ? "mov %dr0, $0" : "movq %dr0, ${0:q}";
16506-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16507-
llvm::InlineAsm *IA =
16508-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16509-
/*hasSideEffects=*/true);
16510-
llvm::CallInst *CI = Builder.CreateCall(IA);
16511-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16512-
Builder.CreateBr(BBDest);
16513-
}
16514-
Builder.SetInsertPoint(BB1);
16515-
{
16516-
llvm::StringRef AsmStr =
16517-
SizeTy->getBitWidth() == 32 ? "mov %dr1, $0" : "movq %dr1, ${0:q}";
16518-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16519-
llvm::InlineAsm *IA =
16520-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16521-
/*hasSideEffects=*/true);
16522-
llvm::CallInst *CI = Builder.CreateCall(IA);
16523-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16524-
Builder.CreateBr(BBDest);
16525-
}
16526-
Builder.SetInsertPoint(BB2);
16527-
{
16528-
llvm::StringRef AsmStr =
16529-
SizeTy->getBitWidth() == 32 ? "mov %dr2, $0" : "movq %dr2, ${0:q}";
16530-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16531-
llvm::InlineAsm *IA =
16532-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16533-
/*hasSideEffects=*/true);
16534-
llvm::CallInst *CI = Builder.CreateCall(IA);
16535-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16536-
Builder.CreateBr(BBDest);
16537-
}
16538-
Builder.SetInsertPoint(BB3);
16539-
{
16540-
llvm::StringRef AsmStr =
16541-
SizeTy->getBitWidth() == 32 ? "mov %dr3, $0" : "movq %dr3, ${0:q}";
16542-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16543-
llvm::InlineAsm *IA =
16544-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16545-
/*hasSideEffects=*/true);
16546-
llvm::CallInst *CI = Builder.CreateCall(IA);
16547-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16548-
Builder.CreateBr(BBDest);
16490+
for (int i = 0; i < 8; ++i) {
16491+
SI->addCase(Builder.getInt32(i), BBs[i]);
1654916492
}
16550-
Builder.SetInsertPoint(BB4);
16551-
{
16552-
llvm::StringRef AsmStr =
16553-
SizeTy->getBitWidth() == 32 ? "mov %dr4, $0" : "movq %dr4, ${0:q}";
16554-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16555-
llvm::InlineAsm *IA =
16556-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16557-
/*hasSideEffects=*/true);
16558-
llvm::CallInst *CI = Builder.CreateCall(IA);
16559-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16560-
Builder.CreateBr(BBDest);
16561-
}
16562-
Builder.SetInsertPoint(BB5);
16563-
{
16564-
llvm::StringRef AsmStr =
16565-
SizeTy->getBitWidth() == 32 ? "mov %dr5, $0" : "movq %dr5, ${0:q}";
16566-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16567-
llvm::InlineAsm *IA =
16568-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16569-
/*hasSideEffects=*/true);
16570-
llvm::CallInst *CI = Builder.CreateCall(IA);
16571-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16572-
Builder.CreateBr(BBDest);
16573-
}
16574-
Builder.SetInsertPoint(BB6);
16575-
{
16576-
llvm::StringRef AsmStr =
16577-
SizeTy->getBitWidth() == 32 ? "mov %dr6, $0" : "movq %dr6, ${0:q}";
16578-
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16579-
llvm::InlineAsm *IA =
16580-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16581-
/*hasSideEffects=*/true);
16582-
llvm::CallInst *CI = Builder.CreateCall(IA);
16583-
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16584-
Builder.CreateBr(BBDest);
16493+
16494+
std::vector<std::string> AsmStrs;
16495+
for (int i = 0; i < 8; ++i) {
16496+
AsmStrs.push_back(SizeTy->getBitWidth() == 32
16497+
? "mov %dr" + std::to_string(i) + ", $0"
16498+
: "movq %dr" + std::to_string(i) + ", ${0:q}");
1658516499
}
16586-
Builder.SetInsertPoint(BB7);
16587-
{
16588-
llvm::StringRef AsmStr =
16589-
SizeTy->getBitWidth() == 32 ? "mov %dr7, $0" : "movq %dr7, ${0:q}";
16500+
16501+
auto createInlineAsmAndBranch = [&](int regNum) {
16502+
llvm::StringRef AsmStr = AsmStrs[regNum];
1659016503
llvm::FunctionType *FTy = llvm::FunctionType::get(SizeTy, false);
16591-
llvm::InlineAsm *IA =
16592-
llvm::InlineAsm::get(FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}",
16593-
/*hasSideEffects=*/true);
16504+
llvm::InlineAsm *IA = llvm::InlineAsm::get(
16505+
FTy, AsmStr, "=r,~{dirflag},~{fpsr},~{flags}", true);
1659416506
llvm::CallInst *CI = Builder.CreateCall(IA);
1659516507
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
1659616508
Builder.CreateBr(BBDest);
16509+
};
16510+
16511+
for (int i = 0; i < 8; ++i) {
16512+
Builder.SetInsertPoint(BBs[i]);
16513+
createInlineAsmAndBranch(i);
1659716514
}
16515+
1659816516
Builder.SetInsertPoint(BBDest);
1659916517
return Builder.CreateLoad(Address(AI, AI->getType(), CU));
1660016518
}

0 commit comments

Comments
 (0)