@@ -16478,123 +16478,41 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
16478
16478
return CI;
16479
16479
}
16480
16480
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
+ }
16489
16485
BasicBlock *BBDest = createBasicBlock("BBDest", this->CurFn);
16490
16486
llvm::AllocaInst *AI = Builder.CreateAlloca(SizeTy);
16491
16487
CharUnits CU = SizeTy->getBitWidth() == 32 ? CharUnits::fromQuantity(4)
16492
16488
: CharUnits::fromQuantity(8);
16493
16489
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]);
16549
16492
}
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}");
16585
16499
}
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];
16590
16503
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);
16594
16506
llvm::CallInst *CI = Builder.CreateCall(IA);
16595
16507
Builder.CreateStore(CI, Address(AI, AI->getType(), CU));
16596
16508
Builder.CreateBr(BBDest);
16509
+ };
16510
+
16511
+ for (int i = 0; i < 8; ++i) {
16512
+ Builder.SetInsertPoint(BBs[i]);
16513
+ createInlineAsmAndBranch(i);
16597
16514
}
16515
+
16598
16516
Builder.SetInsertPoint(BBDest);
16599
16517
return Builder.CreateLoad(Address(AI, AI->getType(), CU));
16600
16518
}
0 commit comments