Skip to content

Commit 1e1460d

Browse files
[LLVM][X86] Add f80 support for ct.select
Add special handling for x86_fp80 types in CTSELECT lowering by splitting them into three 32-bit chunks, performing constant-time selection on each chunk, and reassembling the result. This fixes crashes when compiling tests with f80 types. Also updated ctselect.ll to match current generic fallback implementation.
1 parent 89203ff commit 1e1460d

File tree

2 files changed

+182
-146
lines changed

2 files changed

+182
-146
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25533,6 +25533,62 @@ SDValue X86TargetLowering::LowerCTSELECT(SDValue Op, SelectionDAG &DAG) const {
2553325533
return DAG.getBitcast(VT, CtSelect);
2553425534
}
2553525535

25536+
// Handle f80 types by splitting into three 32-bit chunks
25537+
if (VT == MVT::f80) {
25538+
SDValue Chain = DAG.getEntryNode();
25539+
25540+
// Create temporary stack slots for input f80 values
25541+
SDValue TrueSlot = DAG.CreateStackTemporary(MVT::f80);
25542+
SDValue FalseSlot = DAG.CreateStackTemporary(MVT::f80);
25543+
25544+
// Store f80 values to memory
25545+
SDValue StoreTrueF80 = DAG.getStore(Chain, DL, TrueOp, TrueSlot,
25546+
MachinePointerInfo());
25547+
SDValue StoreFalseF80 = DAG.getStore(Chain, DL, FalseOp, FalseSlot,
25548+
MachinePointerInfo());
25549+
25550+
// Load i32 parts from memory (3 chunks for 96-bit f80 storage)
25551+
SDValue TruePart0 = DAG.getLoad(MVT::i32, DL, StoreTrueF80, TrueSlot,
25552+
MachinePointerInfo());
25553+
SDValue TruePart1Ptr = DAG.getMemBasePlusOffset(TrueSlot, TypeSize::getFixed(4), DL);
25554+
SDValue TruePart1 = DAG.getLoad(MVT::i32, DL, StoreTrueF80, TruePart1Ptr,
25555+
MachinePointerInfo());
25556+
SDValue TruePart2Ptr = DAG.getMemBasePlusOffset(TrueSlot, TypeSize::getFixed(8), DL);
25557+
SDValue TruePart2 = DAG.getLoad(MVT::i32, DL, StoreTrueF80, TruePart2Ptr,
25558+
MachinePointerInfo());
25559+
25560+
SDValue FalsePart0 = DAG.getLoad(MVT::i32, DL, StoreFalseF80, FalseSlot,
25561+
MachinePointerInfo());
25562+
SDValue FalsePart1Ptr = DAG.getMemBasePlusOffset(FalseSlot, TypeSize::getFixed(4), DL);
25563+
SDValue FalsePart1 = DAG.getLoad(MVT::i32, DL, StoreFalseF80, FalsePart1Ptr,
25564+
MachinePointerInfo());
25565+
SDValue FalsePart2Ptr = DAG.getMemBasePlusOffset(FalseSlot, TypeSize::getFixed(8), DL);
25566+
SDValue FalsePart2 = DAG.getLoad(MVT::i32, DL, StoreFalseF80, FalsePart2Ptr,
25567+
MachinePointerInfo());
25568+
25569+
// Perform CTSELECT on each 32-bit chunk
25570+
SDValue Part0Ops[] = {FalsePart0, TruePart0, CC, ProcessedCond};
25571+
SDValue Part0Select = DAG.getNode(X86ISD::CTSELECT, DL, MVT::i32, Part0Ops);
25572+
SDValue Part1Ops[] = {FalsePart1, TruePart1, CC, ProcessedCond};
25573+
SDValue Part1Select = DAG.getNode(X86ISD::CTSELECT, DL, MVT::i32, Part1Ops);
25574+
SDValue Part2Ops[] = {FalsePart2, TruePart2, CC, ProcessedCond};
25575+
SDValue Part2Select = DAG.getNode(X86ISD::CTSELECT, DL, MVT::i32, Part2Ops);
25576+
25577+
// Create result stack slot and store the selected parts
25578+
SDValue ResultSlot = DAG.CreateStackTemporary(MVT::f80);
25579+
SDValue StorePart0 = DAG.getStore(Chain, DL, Part0Select, ResultSlot,
25580+
MachinePointerInfo());
25581+
SDValue ResPart1Ptr = DAG.getMemBasePlusOffset(ResultSlot, TypeSize::getFixed(4), DL);
25582+
SDValue StorePart1 = DAG.getStore(StorePart0, DL, Part1Select, ResPart1Ptr,
25583+
MachinePointerInfo());
25584+
SDValue ResPart2Ptr = DAG.getMemBasePlusOffset(ResultSlot, TypeSize::getFixed(8), DL);
25585+
SDValue StorePart2 = DAG.getStore(StorePart1, DL, Part2Select, ResPart2Ptr,
25586+
MachinePointerInfo());
25587+
25588+
// Load complete f80 result from memory
25589+
return DAG.getLoad(MVT::f80, DL, StorePart2, ResultSlot, MachinePointerInfo());
25590+
}
25591+
2553625592
// Create final CTSELECT node
2553725593
SDValue Ops[] = {FalseOp, TrueOp, CC, ProcessedCond};
2553825594
return DAG.getNode(X86ISD::CTSELECT, DL, Op.getValueType(), Ops,

llvm/test/CodeGen/X86/ctselect-i386-fp.ll

Lines changed: 126 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -209,94 +209,84 @@ define double @test_ctselect_f64_basic(i1 %cond, double %a, double %b) nounwind
209209
define x86_fp80 @test_ctselect_f80_basic(i1 %cond, x86_fp80 %a, x86_fp80 %b) nounwind {
210210
; I386-NOCMOV-LABEL: test_ctselect_f80_basic:
211211
; I386-NOCMOV: # %bb.0:
212+
; I386-NOCMOV-NEXT: pushl %ebp
213+
; I386-NOCMOV-NEXT: pushl %ebx
212214
; I386-NOCMOV-NEXT: pushl %edi
213215
; I386-NOCMOV-NEXT: pushl %esi
214-
; I386-NOCMOV-NEXT: subl $12, %esp
215-
; I386-NOCMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
216-
; I386-NOCMOV-NEXT: sete %al
217-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
216+
; I386-NOCMOV-NEXT: subl $40, %esp
217+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
218+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
219+
; I386-NOCMOV-NEXT: fstpt {{[0-9]+}}(%esp)
220+
; I386-NOCMOV-NEXT: fstpt {{[0-9]+}}(%esp)
221+
; I386-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
222+
; I386-NOCMOV-NEXT: testb $1, %cl
223+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
224+
; I386-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill
218225
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
219-
; I386-NOCMOV-NEXT: movb %al, %ah
220-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
221-
; I386-NOCMOV-NEXT: negl %edi
222-
; I386-NOCMOV-NEXT: movl %edx, %esi
223-
; I386-NOCMOV-NEXT: andl %edi, %esi
224-
; I386-NOCMOV-NEXT: notl %edi
225-
; I386-NOCMOV-NEXT: andl %ecx, %edi
226-
; I386-NOCMOV-NEXT: orl %edi, %esi
227-
; I386-NOCMOV-NEXT: movl %esi, (%esp)
228-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
226+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %esi
227+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edi
228+
; I386-NOCMOV-NEXT: sete %ch
229+
; I386-NOCMOV-NEXT: movb %ch, %al
230+
; I386-NOCMOV-NEXT: movzbl %al, %ebp
231+
; I386-NOCMOV-NEXT: negl %ebp
232+
; I386-NOCMOV-NEXT: movl %edi, %ebx
233+
; I386-NOCMOV-NEXT: andl %ebp, %ebx
234+
; I386-NOCMOV-NEXT: notl %ebp
235+
; I386-NOCMOV-NEXT: andl %edx, %ebp
236+
; I386-NOCMOV-NEXT: orl %ebp, %ebx
237+
; I386-NOCMOV-NEXT: testb $1, %cl
238+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
229239
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
230-
; I386-NOCMOV-NEXT: movb %al, %ah
231-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
232-
; I386-NOCMOV-NEXT: negl %edi
233-
; I386-NOCMOV-NEXT: movl %edx, %esi
234-
; I386-NOCMOV-NEXT: andl %edi, %esi
235-
; I386-NOCMOV-NEXT: notl %edi
236-
; I386-NOCMOV-NEXT: andl %ecx, %edi
237-
; I386-NOCMOV-NEXT: orl %edi, %esi
238-
; I386-NOCMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
239-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
240-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
241-
; I386-NOCMOV-NEXT: movb %al, %ah
242-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
240+
; I386-NOCMOV-NEXT: sete %ch
241+
; I386-NOCMOV-NEXT: movb %ch, %cl
242+
; I386-NOCMOV-NEXT: movzbl %cl, %ebp
243+
; I386-NOCMOV-NEXT: negl %ebp
244+
; I386-NOCMOV-NEXT: movl %edx, %edi
245+
; I386-NOCMOV-NEXT: andl %ebp, %edi
246+
; I386-NOCMOV-NEXT: notl %ebp
247+
; I386-NOCMOV-NEXT: andl %eax, %ebp
248+
; I386-NOCMOV-NEXT: orl %ebp, %edi
249+
; I386-NOCMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
250+
; I386-NOCMOV-NEXT: movl %edi, {{[0-9]+}}(%esp)
251+
; I386-NOCMOV-NEXT: movl %ebx, {{[0-9]+}}(%esp)
252+
; I386-NOCMOV-NEXT: sete %al
253+
; I386-NOCMOV-NEXT: movl (%esp), %ebx # 4-byte Reload
254+
; I386-NOCMOV-NEXT: movb %al, %dl
255+
; I386-NOCMOV-NEXT: movzbl %dl, %edi
243256
; I386-NOCMOV-NEXT: negl %edi
244-
; I386-NOCMOV-NEXT: movl %edx, %esi
245-
; I386-NOCMOV-NEXT: andl %edi, %esi
257+
; I386-NOCMOV-NEXT: movl %esi, %ecx
258+
; I386-NOCMOV-NEXT: andl %edi, %ecx
246259
; I386-NOCMOV-NEXT: notl %edi
247-
; I386-NOCMOV-NEXT: andl %ecx, %edi
248-
; I386-NOCMOV-NEXT: orl %edi, %esi
249-
; I386-NOCMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
250-
; I386-NOCMOV-NEXT: fldt (%esp)
251-
; I386-NOCMOV-NEXT: addl $12, %esp
260+
; I386-NOCMOV-NEXT: andl %ebx, %edi
261+
; I386-NOCMOV-NEXT: orl %edi, %ecx
262+
; I386-NOCMOV-NEXT: movl %ecx, {{[0-9]+}}(%esp)
263+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
264+
; I386-NOCMOV-NEXT: addl $40, %esp
252265
; I386-NOCMOV-NEXT: popl %esi
253266
; I386-NOCMOV-NEXT: popl %edi
267+
; I386-NOCMOV-NEXT: popl %ebx
268+
; I386-NOCMOV-NEXT: popl %ebp
254269
; I386-NOCMOV-NEXT: retl
255270
;
256271
; I386-CMOV-LABEL: test_ctselect_f80_basic:
257272
; I386-CMOV: # %bb.0:
258-
; I386-CMOV-NEXT: pushl %edi
259-
; I386-CMOV-NEXT: pushl %esi
260-
; I386-CMOV-NEXT: subl $12, %esp
273+
; I386-CMOV-NEXT: subl $36, %esp
274+
; I386-CMOV-NEXT: fldt {{[0-9]+}}(%esp)
275+
; I386-CMOV-NEXT: fldt {{[0-9]+}}(%esp)
276+
; I386-CMOV-NEXT: fstpt {{[0-9]+}}(%esp)
277+
; I386-CMOV-NEXT: fstpt {{[0-9]+}}(%esp)
278+
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
261279
; I386-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
262-
; I386-CMOV-NEXT: sete %al
280+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax
281+
; I386-CMOV-NEXT: movl %eax, {{[0-9]+}}(%esp)
282+
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
263283
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
264-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
265-
; I386-CMOV-NEXT: movb %al, %ah
266-
; I386-CMOV-NEXT: movzbl %ah, %edi
267-
; I386-CMOV-NEXT: negl %edi
268-
; I386-CMOV-NEXT: movl %edx, %esi
269-
; I386-CMOV-NEXT: andl %edi, %esi
270-
; I386-CMOV-NEXT: notl %edi
271-
; I386-CMOV-NEXT: andl %ecx, %edi
272-
; I386-CMOV-NEXT: orl %edi, %esi
273-
; I386-CMOV-NEXT: movl %esi, (%esp)
274-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
275-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
276-
; I386-CMOV-NEXT: movb %al, %ah
277-
; I386-CMOV-NEXT: movzbl %ah, %edi
278-
; I386-CMOV-NEXT: negl %edi
279-
; I386-CMOV-NEXT: movl %edx, %esi
280-
; I386-CMOV-NEXT: andl %edi, %esi
281-
; I386-CMOV-NEXT: notl %edi
282-
; I386-CMOV-NEXT: andl %ecx, %edi
283-
; I386-CMOV-NEXT: orl %edi, %esi
284-
; I386-CMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
285-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
286-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
287-
; I386-CMOV-NEXT: movb %al, %ah
288-
; I386-CMOV-NEXT: movzbl %ah, %edi
289-
; I386-CMOV-NEXT: negl %edi
290-
; I386-CMOV-NEXT: movl %edx, %esi
291-
; I386-CMOV-NEXT: andl %edi, %esi
292-
; I386-CMOV-NEXT: notl %edi
293-
; I386-CMOV-NEXT: andl %ecx, %edi
294-
; I386-CMOV-NEXT: orl %edi, %esi
295-
; I386-CMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
284+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %ecx
285+
; I386-CMOV-NEXT: movl %ecx, {{[0-9]+}}(%esp)
286+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax
287+
; I386-CMOV-NEXT: movl %eax, (%esp)
296288
; I386-CMOV-NEXT: fldt (%esp)
297-
; I386-CMOV-NEXT: addl $12, %esp
298-
; I386-CMOV-NEXT: popl %esi
299-
; I386-CMOV-NEXT: popl %edi
289+
; I386-CMOV-NEXT: addl $36, %esp
300290
; I386-CMOV-NEXT: retl
301291
%result = call x86_fp80 @llvm.ct.select.f80(i1 %cond, x86_fp80 %a, x86_fp80 %b)
302292
ret x86_fp80 %result
@@ -543,94 +533,84 @@ define float @test_ctselect_f32_nan(i1 %cond) nounwind {
543533
define x86_fp80 @test_ctselect_f80_alignment(i1 %cond, x86_fp80 %a, x86_fp80 %b) nounwind {
544534
; I386-NOCMOV-LABEL: test_ctselect_f80_alignment:
545535
; I386-NOCMOV: # %bb.0:
536+
; I386-NOCMOV-NEXT: pushl %ebp
537+
; I386-NOCMOV-NEXT: pushl %ebx
546538
; I386-NOCMOV-NEXT: pushl %edi
547539
; I386-NOCMOV-NEXT: pushl %esi
548-
; I386-NOCMOV-NEXT: subl $12, %esp
549-
; I386-NOCMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
550-
; I386-NOCMOV-NEXT: sete %al
551-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
540+
; I386-NOCMOV-NEXT: subl $40, %esp
541+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
542+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
543+
; I386-NOCMOV-NEXT: fstpt {{[0-9]+}}(%esp)
544+
; I386-NOCMOV-NEXT: fstpt {{[0-9]+}}(%esp)
545+
; I386-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
546+
; I386-NOCMOV-NEXT: testb $1, %cl
547+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
548+
; I386-NOCMOV-NEXT: movl %eax, (%esp) # 4-byte Spill
552549
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
553-
; I386-NOCMOV-NEXT: movb %al, %ah
554-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
555-
; I386-NOCMOV-NEXT: negl %edi
556-
; I386-NOCMOV-NEXT: movl %edx, %esi
557-
; I386-NOCMOV-NEXT: andl %edi, %esi
558-
; I386-NOCMOV-NEXT: notl %edi
559-
; I386-NOCMOV-NEXT: andl %ecx, %edi
560-
; I386-NOCMOV-NEXT: orl %edi, %esi
561-
; I386-NOCMOV-NEXT: movl %esi, (%esp)
562-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
550+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %esi
551+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edi
552+
; I386-NOCMOV-NEXT: sete %ch
553+
; I386-NOCMOV-NEXT: movb %ch, %al
554+
; I386-NOCMOV-NEXT: movzbl %al, %ebp
555+
; I386-NOCMOV-NEXT: negl %ebp
556+
; I386-NOCMOV-NEXT: movl %edi, %ebx
557+
; I386-NOCMOV-NEXT: andl %ebp, %ebx
558+
; I386-NOCMOV-NEXT: notl %ebp
559+
; I386-NOCMOV-NEXT: andl %edx, %ebp
560+
; I386-NOCMOV-NEXT: orl %ebp, %ebx
561+
; I386-NOCMOV-NEXT: testb $1, %cl
562+
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
563563
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
564-
; I386-NOCMOV-NEXT: movb %al, %ah
565-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
566-
; I386-NOCMOV-NEXT: negl %edi
567-
; I386-NOCMOV-NEXT: movl %edx, %esi
568-
; I386-NOCMOV-NEXT: andl %edi, %esi
569-
; I386-NOCMOV-NEXT: notl %edi
570-
; I386-NOCMOV-NEXT: andl %ecx, %edi
571-
; I386-NOCMOV-NEXT: orl %edi, %esi
572-
; I386-NOCMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
573-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
574-
; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
575-
; I386-NOCMOV-NEXT: movb %al, %ah
576-
; I386-NOCMOV-NEXT: movzbl %ah, %edi
564+
; I386-NOCMOV-NEXT: sete %ch
565+
; I386-NOCMOV-NEXT: movb %ch, %cl
566+
; I386-NOCMOV-NEXT: movzbl %cl, %ebp
567+
; I386-NOCMOV-NEXT: negl %ebp
568+
; I386-NOCMOV-NEXT: movl %edx, %edi
569+
; I386-NOCMOV-NEXT: andl %ebp, %edi
570+
; I386-NOCMOV-NEXT: notl %ebp
571+
; I386-NOCMOV-NEXT: andl %eax, %ebp
572+
; I386-NOCMOV-NEXT: orl %ebp, %edi
573+
; I386-NOCMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
574+
; I386-NOCMOV-NEXT: movl %edi, {{[0-9]+}}(%esp)
575+
; I386-NOCMOV-NEXT: movl %ebx, {{[0-9]+}}(%esp)
576+
; I386-NOCMOV-NEXT: sete %al
577+
; I386-NOCMOV-NEXT: movl (%esp), %ebx # 4-byte Reload
578+
; I386-NOCMOV-NEXT: movb %al, %dl
579+
; I386-NOCMOV-NEXT: movzbl %dl, %edi
577580
; I386-NOCMOV-NEXT: negl %edi
578-
; I386-NOCMOV-NEXT: movl %edx, %esi
579-
; I386-NOCMOV-NEXT: andl %edi, %esi
581+
; I386-NOCMOV-NEXT: movl %esi, %ecx
582+
; I386-NOCMOV-NEXT: andl %edi, %ecx
580583
; I386-NOCMOV-NEXT: notl %edi
581-
; I386-NOCMOV-NEXT: andl %ecx, %edi
582-
; I386-NOCMOV-NEXT: orl %edi, %esi
583-
; I386-NOCMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
584-
; I386-NOCMOV-NEXT: fldt (%esp)
585-
; I386-NOCMOV-NEXT: addl $12, %esp
584+
; I386-NOCMOV-NEXT: andl %ebx, %edi
585+
; I386-NOCMOV-NEXT: orl %edi, %ecx
586+
; I386-NOCMOV-NEXT: movl %ecx, {{[0-9]+}}(%esp)
587+
; I386-NOCMOV-NEXT: fldt {{[0-9]+}}(%esp)
588+
; I386-NOCMOV-NEXT: addl $40, %esp
586589
; I386-NOCMOV-NEXT: popl %esi
587590
; I386-NOCMOV-NEXT: popl %edi
591+
; I386-NOCMOV-NEXT: popl %ebx
592+
; I386-NOCMOV-NEXT: popl %ebp
588593
; I386-NOCMOV-NEXT: retl
589594
;
590595
; I386-CMOV-LABEL: test_ctselect_f80_alignment:
591596
; I386-CMOV: # %bb.0:
592-
; I386-CMOV-NEXT: pushl %edi
593-
; I386-CMOV-NEXT: pushl %esi
594-
; I386-CMOV-NEXT: subl $12, %esp
597+
; I386-CMOV-NEXT: subl $36, %esp
598+
; I386-CMOV-NEXT: fldt {{[0-9]+}}(%esp)
599+
; I386-CMOV-NEXT: fldt {{[0-9]+}}(%esp)
600+
; I386-CMOV-NEXT: fstpt {{[0-9]+}}(%esp)
601+
; I386-CMOV-NEXT: fstpt {{[0-9]+}}(%esp)
602+
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
595603
; I386-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
596-
; I386-CMOV-NEXT: sete %al
604+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax
605+
; I386-CMOV-NEXT: movl %eax, {{[0-9]+}}(%esp)
606+
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
597607
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
598-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
599-
; I386-CMOV-NEXT: movb %al, %ah
600-
; I386-CMOV-NEXT: movzbl %ah, %edi
601-
; I386-CMOV-NEXT: negl %edi
602-
; I386-CMOV-NEXT: movl %edx, %esi
603-
; I386-CMOV-NEXT: andl %edi, %esi
604-
; I386-CMOV-NEXT: notl %edi
605-
; I386-CMOV-NEXT: andl %ecx, %edi
606-
; I386-CMOV-NEXT: orl %edi, %esi
607-
; I386-CMOV-NEXT: movl %esi, (%esp)
608-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
609-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
610-
; I386-CMOV-NEXT: movb %al, %ah
611-
; I386-CMOV-NEXT: movzbl %ah, %edi
612-
; I386-CMOV-NEXT: negl %edi
613-
; I386-CMOV-NEXT: movl %edx, %esi
614-
; I386-CMOV-NEXT: andl %edi, %esi
615-
; I386-CMOV-NEXT: notl %edi
616-
; I386-CMOV-NEXT: andl %ecx, %edi
617-
; I386-CMOV-NEXT: orl %edi, %esi
618-
; I386-CMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
619-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx
620-
; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx
621-
; I386-CMOV-NEXT: movb %al, %ah
622-
; I386-CMOV-NEXT: movzbl %ah, %edi
623-
; I386-CMOV-NEXT: negl %edi
624-
; I386-CMOV-NEXT: movl %edx, %esi
625-
; I386-CMOV-NEXT: andl %edi, %esi
626-
; I386-CMOV-NEXT: notl %edi
627-
; I386-CMOV-NEXT: andl %ecx, %edi
628-
; I386-CMOV-NEXT: orl %edi, %esi
629-
; I386-CMOV-NEXT: movl %esi, {{[0-9]+}}(%esp)
608+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %ecx
609+
; I386-CMOV-NEXT: movl %ecx, {{[0-9]+}}(%esp)
610+
; I386-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax
611+
; I386-CMOV-NEXT: movl %eax, (%esp)
630612
; I386-CMOV-NEXT: fldt (%esp)
631-
; I386-CMOV-NEXT: addl $12, %esp
632-
; I386-CMOV-NEXT: popl %esi
633-
; I386-CMOV-NEXT: popl %edi
613+
; I386-CMOV-NEXT: addl $36, %esp
634614
; I386-CMOV-NEXT: retl
635615
%result = call x86_fp80 @llvm.ct.select.f80(i1 %cond, x86_fp80 %a, x86_fp80 %b)
636616
ret x86_fp80 %result

0 commit comments

Comments
 (0)